Skip to content

Commit e6c3050

Browse files
authoredFeb 9, 2025··
add display: 'normal' | 'hidden' for _meta item type: 'menu' (#4182)
1 parent 9107bff commit e6c3050

File tree

6 files changed

+72
-14
lines changed

6 files changed

+72
-14
lines changed
 

‎.changeset/rotten-candles-hide.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"nextra": patch
3+
---
4+
5+
add `display: 'normal' | 'hidden'` for `_meta` item `type: 'menu'`

‎docs/app/docs/file-conventions/page.mdx

+39-9
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,49 @@ description:
99

1010
import { Cards } from 'nextra/components'
1111
import { FileIcon, FolderIcon, MdxIcon } from 'nextra/icons'
12-
import { MDXRemote } from 'nextra/mdx-remote'
13-
import { createIndexPage, getPageMap } from 'nextra/page-map'
12+
import { getIndexPageMap, getPageMap } from 'nextra/page-map'
13+
import { useMDXComponents } from '../../../mdx-components'
1414

1515
# File Conventions
1616

17-
<MDXRemote
18-
compiledSource={await createIndexPage(
19-
await getPageMap('/docs/file-conventions')
20-
)}
21-
components={{
17+
export async function Page() {
18+
const { h2: H2 } = useMDXComponents()
19+
const currentRoute = metadata.filePath
20+
.replace('app', '')
21+
.replace('/page.mdx', '')
22+
const pageMap = await getPageMap(currentRoute)
23+
const icons = {
2224
Cards,
2325
FileIcon,
2426
FolderIcon,
2527
MdxIcon
26-
}}
27-
/>
28+
}
29+
return getIndexPageMap(pageMap).map(pageItem => {
30+
if (!Array.isArray(pageItem)) {
31+
return <H2>{pageItem.title}</H2>
32+
}
33+
return (
34+
<Cards>
35+
{pageItem.map(item => {
36+
const icon = item.frontMatter?.icon
37+
const Icon = icons[icon]
38+
if (icon && !Icon) {
39+
throw new Error(
40+
"Icon is defined in front matter but isn't provided"
41+
)
42+
}
43+
return (
44+
<Cards.Card
45+
key={item.name}
46+
title={item.title}
47+
href={item.route || item.href}
48+
icon={Icon && <Icon />}
49+
/>
50+
)
51+
})}
52+
</Cards>
53+
)
54+
})
55+
}
56+
57+
<Page />

‎packages/nextra/src/server/page-map/index-page.ts

+23-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { MdxFile, PageMapItem } from '../../types.js'
1+
import type { MdxFile, PageMapItem, SeparatorItem } from '../../types.js'
22
import { compileMdx } from '../compile.js'
33

44
function renderCard(item: MdxFile): string {
@@ -42,3 +42,25 @@ export async function createIndexPage(pageMap: PageMapItem[]): Promise<string> {
4242

4343
return rawJs
4444
}
45+
46+
export function getIndexPageMap(pageMap: PageMapItem[]) {
47+
const result: (SeparatorItem | MdxFile[])[] = []
48+
for (const item of pageMap) {
49+
if ('data' in item) {
50+
continue
51+
}
52+
// @ts-expect-error fixme
53+
if (item.type === 'separator') {
54+
// @ts-expect-error fixme
55+
result.push(item)
56+
} else {
57+
const lastResult = result.at(-1)
58+
if (Array.isArray(lastResult)) {
59+
lastResult.push(item)
60+
} else {
61+
result.push([item])
62+
}
63+
}
64+
}
65+
return result
66+
}

‎packages/nextra/src/server/page-map/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export { normalizePageMap } from './normalize.js'
44
export { convertToPageMap } from './to-page-map.js'
55
export { mergeMetaWithPageMap } from './merge-meta-with-page-map.js'
66
export { getPageMap } from './get.js'
7-
export { createIndexPage } from './index-page.js'
7+
export { createIndexPage, getIndexPageMap } from './index-page.js'
88

99
export function getMetadata(
1010
page:

‎packages/nextra/src/server/schemas.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ export const menuSchema = z.strictObject({
118118
obj[key].title ||= pageTitleFromFilename(key)
119119
}
120120
return obj
121-
})
121+
}),
122+
display: z.enum(['normal', 'hidden']).optional()
122123
})
123124

124125
export const itemSchema = z.strictObject({

‎packages/nextra/styles/cards.css

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
@apply x:select-none;
1111
}
1212

13-
svg {
13+
& > span > svg {
1414
@apply x:w-6 x:h-auto x:transition x:text-black/30 x:dark:text-white/40 x:shrink-0;
1515
}
1616

17-
&:hover svg {
17+
&:hover > span > svg {
1818
@apply x:text-current!;
1919
}
2020

0 commit comments

Comments
 (0)
Please sign in to comment.