UI: Support children prop in custom Folder component

This commit is contained in:
Fuma Nama
2025-01-20 21:57:18 +08:00
parent b52f4d0f60
commit 4f2538a4cd
4 changed files with 43 additions and 29 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'fumadocs-ui': patch
---
Support `children` prop in custom `Folder` component
+2
View File
@@ -55,6 +55,8 @@ export default defineConfig({
return {
rehypeCodeOptions: {
lazy: true,
langs: ['ts', 'js', 'html'],
inline: 'tailing-curly-colon',
themes: {
light: 'catppuccin-latte',
+1 -1
View File
@@ -47,7 +47,7 @@ export interface SidebarOptions extends SidebarProps {
export interface SidebarComponents {
Item: FC<{ item: PageTree.Item }>;
Folder: FC<{ item: PageTree.Folder; level: number }>;
Folder: FC<{ item: PageTree.Folder; level: number; children: ReactNode }>;
Separator: FC<{ item: PageTree.Separator }>;
}
+35 -28
View File
@@ -396,35 +396,42 @@ export function SidebarPageTree(props: {
): ReactNode[] {
return items.map((item, i) => {
const id = `${item.type}_${i.toString()}`;
switch (item.type) {
case 'separator':
if (Separator) return <Separator key={id} item={item} />;
return (
<SidebarSeparator key={id} className={cn(i !== 0 && 'mt-8')}>
{item.name}
</SidebarSeparator>
);
case 'folder':
if (Folder) return <Folder key={id} item={item} level={level} />;
return (
<PageTreeFolder key={id} item={item} level={level}>
{renderSidebarList(item.children, level + 1)}
</PageTreeFolder>
);
default:
if (Item) return <Item key={item.url} item={item} />;
return (
<SidebarItem
key={item.url}
href={item.url}
external={item.external}
icon={item.icon}
>
{item.name}
</SidebarItem>
);
if (item.type === 'separator') {
if (Separator) return <Separator key={id} item={item} />;
return (
<SidebarSeparator key={id} className={cn(i !== 0 && 'mt-8')}>
{item.name}
</SidebarSeparator>
);
}
if (item.type === 'folder') {
const children = renderSidebarList(item.children, level + 1);
if (Folder)
return (
<Folder key={id} item={item} level={level}>
{children}
</Folder>
);
return (
<PageTreeFolder key={id} item={item} level={level}>
{children}
</PageTreeFolder>
);
}
if (Item) return <Item key={item.url} item={item} />;
return (
<SidebarItem
key={item.url}
href={item.url}
external={item.external}
icon={item.icon}
>
{item.name}
</SidebarItem>
);
});
}