fumadocs-ui
Version:
The Radix UI version of Fumadocs UI
58 lines (56 loc) • 2.09 kB
JavaScript
import { tree_exports } from "../../contexts/tree.js";
import { jsx, jsxs } from "react/jsx-runtime";
import { Fragment as Fragment$1, useMemo } from "react";
//#region src/components/sidebar/page-tree.tsx
function createPageTreeRenderer({ SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarSeparator, SidebarItem }) {
function PageTreeFolder({ item, children }) {
const path = (0, tree_exports.useTreePath)();
return /* @__PURE__ */ jsxs(SidebarFolder, {
collapsible: item.collapsible,
active: path.includes(item),
defaultOpen: item.defaultOpen,
children: [item.index ? /* @__PURE__ */ jsxs(SidebarFolderLink, {
href: item.index.url,
external: item.index.external,
children: [item.icon, item.name]
}) : /* @__PURE__ */ jsxs(SidebarFolderTrigger, { children: [item.icon, item.name] }), /* @__PURE__ */ jsx(SidebarFolderContent, { children })]
});
}
/**
* Render sidebar items from page tree
*/
return function SidebarPageTree(components) {
const { root } = (0, tree_exports.useTreeContext)();
const { Separator, Item, Folder = PageTreeFolder } = components;
return useMemo(() => {
function renderSidebarList(items) {
return items.map((item, i) => {
if (item.type === "separator") {
if (Separator) return /* @__PURE__ */ jsx(Separator, { item }, i);
return /* @__PURE__ */ jsxs(SidebarSeparator, { children: [item.icon, item.name] }, i);
}
if (item.type === "folder") return /* @__PURE__ */ jsx(Folder, {
item,
children: renderSidebarList(item.children)
}, i);
if (Item) return /* @__PURE__ */ jsx(Item, { item }, item.url);
return /* @__PURE__ */ jsx(SidebarItem, {
href: item.url,
external: item.external,
icon: item.icon,
children: item.name
}, item.url);
});
}
return /* @__PURE__ */ jsx(Fragment$1, { children: renderSidebarList(root.children) }, root.$id);
}, [
Folder,
Item,
Separator,
root
]);
};
}
//#endregion
export { createPageTreeRenderer };
//# sourceMappingURL=page-tree.js.map