@fumadocs/base-ui 16.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/css/black.css +1 -0
  4. package/css/catppuccin.css +1 -0
  5. package/css/dusk.css +1 -0
  6. package/css/layouts/docs.css +1 -0
  7. package/css/layouts/home.css +1 -0
  8. package/css/layouts/notebook.css +1 -0
  9. package/css/neutral.css +1 -0
  10. package/css/ocean.css +1 -0
  11. package/css/preset.css +10 -0
  12. package/css/purple.css +1 -0
  13. package/css/shadcn.css +1 -0
  14. package/css/solar.css +1 -0
  15. package/css/style.css +9 -0
  16. package/css/vitepress.css +1 -0
  17. package/dist/components/accordion.d.ts +8 -0
  18. package/dist/components/accordion.d.ts.map +1 -0
  19. package/dist/components/accordion.js +41 -0
  20. package/dist/components/banner.d.ts +24 -0
  21. package/dist/components/banner.d.ts.map +1 -0
  22. package/dist/components/banner.js +54 -0
  23. package/dist/components/callout.d.ts +19 -0
  24. package/dist/components/callout.d.ts.map +1 -0
  25. package/dist/components/callout.js +34 -0
  26. package/dist/components/card.d.ts +11 -0
  27. package/dist/components/card.d.ts.map +1 -0
  28. package/dist/components/card.js +10 -0
  29. package/dist/components/codeblock.d.ts +42 -0
  30. package/dist/components/codeblock.d.ts.map +1 -0
  31. package/dist/components/codeblock.js +68 -0
  32. package/dist/components/dialog/search-algolia.d.ts +25 -0
  33. package/dist/components/dialog/search-algolia.d.ts.map +1 -0
  34. package/dist/components/dialog/search-algolia.js +35 -0
  35. package/dist/components/dialog/search-default.d.ts +29 -0
  36. package/dist/components/dialog/search-default.d.ts.map +1 -0
  37. package/dist/components/dialog/search-default.js +40 -0
  38. package/dist/components/dialog/search-orama.d.ts +30 -0
  39. package/dist/components/dialog/search-orama.d.ts.map +1 -0
  40. package/dist/components/dialog/search-orama.js +40 -0
  41. package/dist/components/dialog/search.d.ts +72 -0
  42. package/dist/components/dialog/search.d.ts.map +1 -0
  43. package/dist/components/dialog/search.js +192 -0
  44. package/dist/components/dynamic-codeblock.d.ts +21 -0
  45. package/dist/components/dynamic-codeblock.d.ts.map +1 -0
  46. package/dist/components/dynamic-codeblock.js +33 -0
  47. package/dist/components/files.d.ts +19 -0
  48. package/dist/components/files.d.ts.map +1 -0
  49. package/dist/components/files.js +18 -0
  50. package/dist/components/github-info.d.ts +8 -0
  51. package/dist/components/github-info.d.ts.map +1 -0
  52. package/dist/components/github-info.js +53 -0
  53. package/dist/components/heading.d.ts +8 -0
  54. package/dist/components/heading.d.ts.map +1 -0
  55. package/dist/components/heading.js +9 -0
  56. package/dist/components/image-zoom.css +77 -0
  57. package/dist/components/image-zoom.d.ts +16 -0
  58. package/dist/components/image-zoom.d.ts.map +1 -0
  59. package/dist/components/image-zoom.js +23 -0
  60. package/dist/components/inline-toc.d.ts +8 -0
  61. package/dist/components/inline-toc.d.ts.map +1 -0
  62. package/dist/components/inline-toc.js +10 -0
  63. package/dist/components/sidebar/base.d.ts +72 -0
  64. package/dist/components/sidebar/base.d.ts.map +1 -0
  65. package/dist/components/sidebar/base.js +197 -0
  66. package/dist/components/sidebar/link-item.d.ts +11 -0
  67. package/dist/components/sidebar/link-item.d.ts.map +1 -0
  68. package/dist/components/sidebar/link-item.js +13 -0
  69. package/dist/components/sidebar/page-tree.d.ts +19 -0
  70. package/dist/components/sidebar/page-tree.d.ts.map +1 -0
  71. package/dist/components/sidebar/page-tree.js +34 -0
  72. package/dist/components/sidebar/tabs/dropdown.d.ts +11 -0
  73. package/dist/components/sidebar/tabs/dropdown.d.ts.map +1 -0
  74. package/dist/components/sidebar/tabs/dropdown.js +34 -0
  75. package/dist/components/sidebar/tabs/index.d.ts +21 -0
  76. package/dist/components/sidebar/tabs/index.d.ts.map +1 -0
  77. package/dist/components/sidebar/tabs/index.js +49 -0
  78. package/dist/components/steps.d.ts +8 -0
  79. package/dist/components/steps.d.ts.map +1 -0
  80. package/dist/components/steps.js +7 -0
  81. package/dist/components/tabs.d.ts +31 -0
  82. package/dist/components/tabs.d.ts.map +1 -0
  83. package/dist/components/tabs.js +64 -0
  84. package/dist/components/toc/clerk.d.ts +2 -0
  85. package/dist/components/toc/clerk.d.ts.map +1 -0
  86. package/dist/components/toc/clerk.js +1 -0
  87. package/dist/components/toc/default.d.ts +2 -0
  88. package/dist/components/toc/default.d.ts.map +1 -0
  89. package/dist/components/toc/default.js +1 -0
  90. package/dist/components/toc/index.d.ts +2 -0
  91. package/dist/components/toc/index.d.ts.map +1 -0
  92. package/dist/components/toc/index.js +1 -0
  93. package/dist/components/type-table.d.ts +32 -0
  94. package/dist/components/type-table.d.ts.map +1 -0
  95. package/dist/components/type-table.js +28 -0
  96. package/dist/components/ui/accordion.d.ts +8 -0
  97. package/dist/components/ui/accordion.d.ts.map +1 -0
  98. package/dist/components/ui/accordion.js +20 -0
  99. package/dist/components/ui/button.d.ts +8 -0
  100. package/dist/components/ui/button.d.ts.map +1 -0
  101. package/dist/components/ui/button.js +20 -0
  102. package/dist/components/ui/collapsible.d.ts +9 -0
  103. package/dist/components/ui/collapsible.d.ts.map +1 -0
  104. package/dist/components/ui/collapsible.js +9 -0
  105. package/dist/components/ui/navigation-menu.d.ts +12 -0
  106. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  107. package/dist/components/ui/navigation-menu.js +15 -0
  108. package/dist/components/ui/popover.d.ts +8 -0
  109. package/dist/components/ui/popover.d.ts.map +1 -0
  110. package/dist/components/ui/popover.js +11 -0
  111. package/dist/components/ui/scroll-area.d.ts +8 -0
  112. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  113. package/dist/components/ui/scroll-area.js +11 -0
  114. package/dist/components/ui/tabs.d.ts +22 -0
  115. package/dist/components/ui/tabs.d.ts.map +1 -0
  116. package/dist/components/ui/tabs.js +79 -0
  117. package/dist/contexts/i18n.d.ts +2 -0
  118. package/dist/contexts/i18n.d.ts.map +1 -0
  119. package/dist/contexts/i18n.js +1 -0
  120. package/dist/contexts/search.d.ts +2 -0
  121. package/dist/contexts/search.d.ts.map +1 -0
  122. package/dist/contexts/search.js +1 -0
  123. package/dist/contexts/tree.d.ts +2 -0
  124. package/dist/contexts/tree.d.ts.map +1 -0
  125. package/dist/contexts/tree.js +1 -0
  126. package/dist/i18n.d.ts +2 -0
  127. package/dist/i18n.d.ts.map +1 -0
  128. package/dist/i18n.js +1 -0
  129. package/dist/layouts/docs/client.d.ts +15 -0
  130. package/dist/layouts/docs/client.d.ts.map +1 -0
  131. package/dist/layouts/docs/client.js +41 -0
  132. package/dist/layouts/docs/index.d.ts +36 -0
  133. package/dist/layouts/docs/index.d.ts.map +1 -0
  134. package/dist/layouts/docs/index.js +66 -0
  135. package/dist/layouts/docs/page/client.d.ts +24 -0
  136. package/dist/layouts/docs/page/client.d.ts.map +1 -0
  137. package/dist/layouts/docs/page/client.js +119 -0
  138. package/dist/layouts/docs/page/index.d.ts +58 -0
  139. package/dist/layouts/docs/page/index.d.ts.map +1 -0
  140. package/dist/layouts/docs/page/index.js +51 -0
  141. package/dist/layouts/docs/sidebar.d.ts +17 -0
  142. package/dist/layouts/docs/sidebar.d.ts.map +1 -0
  143. package/dist/layouts/docs/sidebar.js +94 -0
  144. package/dist/layouts/home/client.d.ts +6 -0
  145. package/dist/layouts/home/client.d.ts.map +1 -0
  146. package/dist/layouts/home/client.js +136 -0
  147. package/dist/layouts/home/index.d.ts +7 -0
  148. package/dist/layouts/home/index.d.ts.map +1 -0
  149. package/dist/layouts/home/index.js +8 -0
  150. package/dist/layouts/home/navbar.d.ts +7 -0
  151. package/dist/layouts/home/navbar.d.ts.map +1 -0
  152. package/dist/layouts/home/navbar.js +16 -0
  153. package/dist/layouts/notebook/client.d.ts +23 -0
  154. package/dist/layouts/notebook/client.d.ts.map +1 -0
  155. package/dist/layouts/notebook/client.js +104 -0
  156. package/dist/layouts/notebook/index.d.ts +34 -0
  157. package/dist/layouts/notebook/index.d.ts.map +1 -0
  158. package/dist/layouts/notebook/index.js +89 -0
  159. package/dist/layouts/notebook/page/client.d.ts +24 -0
  160. package/dist/layouts/notebook/page/client.d.ts.map +1 -0
  161. package/dist/layouts/notebook/page/client.js +119 -0
  162. package/dist/layouts/notebook/page/index.d.ts +58 -0
  163. package/dist/layouts/notebook/page/index.d.ts.map +1 -0
  164. package/dist/layouts/notebook/page/index.js +51 -0
  165. package/dist/layouts/notebook/sidebar.d.ts +17 -0
  166. package/dist/layouts/notebook/sidebar.d.ts.map +1 -0
  167. package/dist/layouts/notebook/sidebar.js +91 -0
  168. package/dist/layouts/shared/index.d.ts +56 -0
  169. package/dist/layouts/shared/index.d.ts.map +1 -0
  170. package/dist/layouts/shared/index.js +17 -0
  171. package/dist/layouts/shared/language-toggle.d.ts +5 -0
  172. package/dist/layouts/shared/language-toggle.d.ts.map +1 -0
  173. package/dist/layouts/shared/language-toggle.js +24 -0
  174. package/dist/layouts/shared/search-toggle.d.ts +11 -0
  175. package/dist/layouts/shared/search-toggle.d.ts.map +1 -0
  176. package/dist/layouts/shared/search-toggle.js +27 -0
  177. package/dist/layouts/shared/theme-toggle.d.ts +5 -0
  178. package/dist/layouts/shared/theme-toggle.d.ts.map +1 -0
  179. package/dist/layouts/shared/theme-toggle.js +38 -0
  180. package/dist/mdx.d.ts +33 -0
  181. package/dist/mdx.d.ts.map +1 -0
  182. package/dist/mdx.js +40 -0
  183. package/dist/mdx.server.d.ts +13 -0
  184. package/dist/mdx.server.d.ts.map +1 -0
  185. package/dist/mdx.server.js +15 -0
  186. package/dist/og.d.ts +2 -0
  187. package/dist/og.d.ts.map +1 -0
  188. package/dist/og.js +1 -0
  189. package/dist/page.d.ts +27 -0
  190. package/dist/page.d.ts.map +1 -0
  191. package/dist/page.js +22 -0
  192. package/dist/provider/base.d.ts +40 -0
  193. package/dist/provider/base.d.ts.map +1 -0
  194. package/dist/provider/base.js +19 -0
  195. package/dist/provider/next.d.ts +14 -0
  196. package/dist/provider/next.d.ts.map +1 -0
  197. package/dist/provider/next.js +7 -0
  198. package/dist/provider/react-router.d.ts +14 -0
  199. package/dist/provider/react-router.d.ts.map +1 -0
  200. package/dist/provider/react-router.js +7 -0
  201. package/dist/provider/tanstack.d.ts +14 -0
  202. package/dist/provider/tanstack.d.ts.map +1 -0
  203. package/dist/provider/tanstack.js +7 -0
  204. package/dist/provider/waku.d.ts +14 -0
  205. package/dist/provider/waku.d.ts.map +1 -0
  206. package/dist/provider/waku.js +7 -0
  207. package/dist/style.css +3159 -0
  208. package/dist/utils/use-copy-button.d.ts +2 -0
  209. package/dist/utils/use-copy-button.d.ts.map +1 -0
  210. package/dist/utils/use-copy-button.js +1 -0
  211. package/dist/utils/use-footer-items.d.ts +2 -0
  212. package/dist/utils/use-footer-items.d.ts.map +1 -0
  213. package/dist/utils/use-footer-items.js +1 -0
  214. package/dist/utils/use-is-scroll-top.d.ts +2 -0
  215. package/dist/utils/use-is-scroll-top.d.ts.map +1 -0
  216. package/dist/utils/use-is-scroll-top.js +1 -0
  217. package/package.json +133 -0
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useMemo, } from 'react';
3
+ import { Languages, Sidebar as SidebarIcon } from '@fumadocs/ui/icons';
4
+ import { cn } from '@fumadocs/ui/cn';
5
+ import { buttonVariants } from '../../components/ui/button.js';
6
+ import { Sidebar, SidebarCollapseTrigger, SidebarContent, SidebarDrawer, SidebarLinkItem, SidebarPageTree, SidebarTrigger, SidebarViewport, } from './sidebar.js';
7
+ import { resolveLinkItems } from '../../layouts/shared/index.js';
8
+ import { LinkItem } from '@fumadocs/ui/link-item';
9
+ import { LanguageToggle, LanguageToggleText, } from '../../layouts/shared/language-toggle.js';
10
+ import { LayoutBody, LayoutContextProvider, LayoutHeader, LayoutTabs, } from './client.js';
11
+ import { TreeContextProvider } from '../../contexts/tree.js';
12
+ import { ThemeToggle } from '../shared/theme-toggle.js';
13
+ import Link from 'fumadocs-core/link';
14
+ import { LargeSearchToggle, SearchToggle, } from '../../layouts/shared/search-toggle.js';
15
+ import { getSidebarTabs, } from '../../components/sidebar/tabs/index.js';
16
+ import { SidebarTabsDropdown, } from '../../components/sidebar/tabs/dropdown.js';
17
+ export function DocsLayout({ nav: { transparentMode, ...nav } = {}, sidebar: { tabs: sidebarTabs, enabled: sidebarEnabled = true, defaultOpenLevel, prefetch, ...sidebarProps } = {}, searchToggle = {}, themeSwitch = {}, tabMode = 'auto', i18n = false, children, tree, ...props }) {
18
+ const tabs = useMemo(() => {
19
+ if (Array.isArray(sidebarTabs)) {
20
+ return sidebarTabs;
21
+ }
22
+ if (typeof sidebarTabs === 'object') {
23
+ return getSidebarTabs(tree, sidebarTabs);
24
+ }
25
+ if (sidebarTabs !== false) {
26
+ return getSidebarTabs(tree);
27
+ }
28
+ return [];
29
+ }, [tree, sidebarTabs]);
30
+ const links = resolveLinkItems(props);
31
+ function sidebar() {
32
+ const { footer, banner, collapsible = true, component, components, ...rest } = sidebarProps;
33
+ if (component)
34
+ return component;
35
+ const iconLinks = links.filter((item) => item.type === 'icon');
36
+ const viewport = (_jsxs(SidebarViewport, { children: [links
37
+ .filter((v) => v.type !== 'icon')
38
+ .map((item, i, list) => (_jsx(SidebarLinkItem, { item: item, className: cn(i === list.length - 1 && 'mb-4') }, i))), _jsx(SidebarPageTree, { ...components })] }));
39
+ return (_jsxs(_Fragment, { children: [_jsxs(SidebarContent, { ...rest, children: [_jsxs("div", { className: "flex flex-col gap-3 p-4 pb-2", children: [_jsxs("div", { className: "flex", children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex text-[0.9375rem] items-center gap-2.5 font-medium me-auto", children: nav.title }), nav.children, collapsible && (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
40
+ color: 'ghost',
41
+ size: 'icon-sm',
42
+ className: 'mb-auto text-fd-muted-foreground',
43
+ })), children: _jsx(SidebarIcon, {}) }))] }), searchToggle.enabled !== false &&
44
+ (searchToggle.components?.lg ?? (_jsx(LargeSearchToggle, { hideIfDisabled: true }))), tabs.length > 0 && tabMode === 'auto' && (_jsx(SidebarTabsDropdown, { options: tabs })), banner] }), viewport, (i18n ||
45
+ iconLinks.length > 0 ||
46
+ themeSwitch?.enabled !== false ||
47
+ footer) && (_jsxs("div", { className: "flex flex-col border-t p-4 pt-2 empty:hidden", children: [_jsxs("div", { className: "flex text-fd-muted-foreground items-center empty:hidden", children: [i18n && (_jsx(LanguageToggle, { children: _jsx(Languages, { className: "size-4.5" }) })), iconLinks.map((item, i) => (_jsx(LinkItem, { item: item, className: cn(buttonVariants({ size: 'icon-sm', color: 'ghost' })), "aria-label": item.label, children: item.icon }, i))), themeSwitch.enabled !== false &&
48
+ (themeSwitch.component ?? (_jsx(ThemeToggle, { className: "ms-auto p-0", mode: themeSwitch.mode })))] }), footer] }))] }), _jsxs(SidebarDrawer, { children: [_jsxs("div", { className: "flex flex-col gap-3 p-4 pb-2", children: [_jsxs("div", { className: "flex text-fd-muted-foreground items-center gap-1.5", children: [_jsx("div", { className: "flex flex-1", children: iconLinks.map((item, i) => (_jsx(LinkItem, { item: item, className: cn(buttonVariants({
49
+ size: 'icon-sm',
50
+ color: 'ghost',
51
+ className: 'p-2',
52
+ })), "aria-label": item.label, children: item.icon }, i))) }), i18n && (_jsxs(LanguageToggle, { children: [_jsx(Languages, { className: "size-4.5" }), _jsx(LanguageToggleText, {})] })), themeSwitch.enabled !== false &&
53
+ (themeSwitch.component ?? (_jsx(ThemeToggle, { className: "p-0", mode: themeSwitch.mode }))), _jsx(SidebarTrigger, { className: cn(buttonVariants({
54
+ color: 'ghost',
55
+ size: 'icon-sm',
56
+ className: 'p-2',
57
+ })), children: _jsx(SidebarIcon, {}) })] }), tabs.length > 0 && _jsx(SidebarTabsDropdown, { options: tabs }), banner] }), viewport, _jsx("div", { className: "flex flex-col border-t p-4 pt-2 empty:hidden", children: footer })] })] }));
58
+ }
59
+ return (_jsx(TreeContextProvider, { tree: tree, children: _jsx(LayoutContextProvider, { navTransparentMode: transparentMode, children: _jsx(Sidebar, { defaultOpenLevel: defaultOpenLevel, prefetch: prefetch, children: _jsxs(LayoutBody, { ...props.containerProps, children: [nav.enabled !== false &&
60
+ (nav.component ?? (_jsxs(LayoutHeader, { id: "nd-subnav", className: "[grid-area:header] sticky top-(--fd-docs-row-1) z-30 flex items-center ps-4 pe-2.5 border-b transition-colors backdrop-blur-sm h-(--fd-header-height) md:hidden max-md:layout:[--fd-header-height:--spacing(14)] data-[transparent=false]:bg-fd-background/80", children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex items-center gap-2.5 font-semibold", children: nav.title }), _jsx("div", { className: "flex-1", children: nav.children }), searchToggle.enabled !== false &&
61
+ (searchToggle.components?.sm ?? (_jsx(SearchToggle, { className: "p-2", hideIfDisabled: true }))), sidebarEnabled && (_jsx(SidebarTrigger, { className: cn(buttonVariants({
62
+ color: 'ghost',
63
+ size: 'icon-sm',
64
+ className: 'p-2',
65
+ })), children: _jsx(SidebarIcon, {}) }))] }))), sidebarEnabled && sidebar(), tabMode === 'top' && tabs.length > 0 && (_jsx(LayoutTabs, { options: tabs, className: "z-10 bg-fd-background border-b px-6 pt-3 xl:px-8 max-md:hidden" })), children] }) }) }) }));
66
+ }
@@ -0,0 +1,24 @@
1
+ import { type ComponentProps } from 'react';
2
+ import type * as PageTree from 'fumadocs-core/page-tree';
3
+ import { type BreadcrumbOptions } from 'fumadocs-core/breadcrumb';
4
+ export declare function PageTOCPopover({ className, children, ...rest }: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
5
+ export declare function PageTOCPopoverTrigger({ className, ...props }: ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
6
+ export declare function PageTOCPopoverContent(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
7
+ export declare function PageLastUpdate({ date: value, ...props }: Omit<ComponentProps<'p'>, 'children'> & {
8
+ date: Date;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ type Item = Pick<PageTree.Item, 'name' | 'description' | 'url'>;
11
+ export interface FooterProps extends ComponentProps<'div'> {
12
+ /**
13
+ * Items including information for the next and previous page
14
+ */
15
+ items?: {
16
+ previous?: Item;
17
+ next?: Item;
18
+ };
19
+ }
20
+ export declare function PageFooter({ items, ...props }: FooterProps): import("react/jsx-runtime").JSX.Element;
21
+ export type BreadcrumbProps = BreadcrumbOptions & ComponentProps<'div'>;
22
+ export declare function PageBreadcrumb({ includeRoot, includeSeparator, includePage, ...props }: BreadcrumbProps): import("react/jsx-runtime").JSX.Element | null;
23
+ export {};
24
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/layouts/docs/page/client.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,cAAc,EASpB,MAAM,OAAO,CAAC;AAMf,OAAO,KAAK,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAiBlC,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,KAAK,CAAC,2CAqDvB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAqD1B;AA8DD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CAUjE;AAED,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EAAE,KAAK,EACX,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,2CAiBxD;AAED,KAAK,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC,CAAC;AAChE,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,KAAK,CAAC;IACxD;;OAEG;IACH,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,IAAI,CAAC;QAChB,IAAI,CAAC,EAAE,IAAI,CAAC;KACb,CAAC;CACH;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,2CA+B1D;AA8BD,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAExE,wBAAgB,cAAc,CAAC,EAC7B,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,GAAG,KAAK,EACT,EAAE,eAAe,kDA6CjB"}
@@ -0,0 +1,119 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { createContext, Fragment, use, useEffect, useEffectEvent, useMemo, useRef, useState, } from 'react';
4
+ import { ChevronDown, ChevronLeft, ChevronRight } from '@fumadocs/ui/icons';
5
+ import Link from 'fumadocs-core/link';
6
+ import { cn } from '@fumadocs/ui/cn';
7
+ import { useI18n } from '../../../contexts/i18n.js';
8
+ import { useTreeContext, useTreePath } from '../../../contexts/tree.js';
9
+ import { usePathname } from 'fumadocs-core/framework';
10
+ import { getBreadcrumbItemsFromPath, } from 'fumadocs-core/breadcrumb';
11
+ import { isActive } from '@fumadocs/ui/urls';
12
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '../../../components/ui/collapsible.js';
13
+ import { useTOCItems } from '../../../components/toc/index.js';
14
+ import { useActiveAnchor } from 'fumadocs-core/toc';
15
+ import { LayoutContext } from '../client.js';
16
+ import { useFooterItems } from '@fumadocs/ui/hooks/use-footer-items';
17
+ const TocPopoverContext = createContext(null);
18
+ export function PageTOCPopover({ className, children, ...rest }) {
19
+ const ref = useRef(null);
20
+ const [open, setOpen] = useState(false);
21
+ const { isNavTransparent } = use(LayoutContext);
22
+ const onClick = useEffectEvent((e) => {
23
+ if (!open)
24
+ return;
25
+ if (ref.current && !ref.current.contains(e.target))
26
+ setOpen(false);
27
+ });
28
+ useEffect(() => {
29
+ window.addEventListener('click', onClick);
30
+ return () => {
31
+ window.removeEventListener('click', onClick);
32
+ };
33
+ }, []);
34
+ return (_jsx(TocPopoverContext, { value: useMemo(() => ({
35
+ open,
36
+ setOpen,
37
+ }), [setOpen, open]), children: _jsx(Collapsible, { open: open, onOpenChange: setOpen, "data-toc-popover": "", className: cn('sticky top-(--fd-docs-row-2) z-10 [grid-area:toc-popover] h-(--fd-toc-popover-height) xl:hidden max-xl:layout:[--fd-toc-popover-height:--spacing(10)]', className), ...rest, children: _jsx("header", { ref: ref, className: cn('border-b backdrop-blur-sm transition-colors', (!isNavTransparent || open) && 'bg-fd-background/80', open && 'shadow-lg'), children: children }) }) }));
38
+ }
39
+ export function PageTOCPopoverTrigger({ className, ...props }) {
40
+ const { text } = useI18n();
41
+ const { open } = use(TocPopoverContext);
42
+ const items = useTOCItems();
43
+ const active = useActiveAnchor();
44
+ const selected = useMemo(() => items.findIndex((item) => active === item.url.slice(1)), [items, active]);
45
+ const path = useTreePath().at(-1);
46
+ const showItem = selected !== -1 && !open;
47
+ return (_jsxs(CollapsibleTrigger, { className: cn('flex w-full h-10 items-center text-sm text-fd-muted-foreground gap-2.5 px-4 py-2.5 text-start focus-visible:outline-none [&_svg]:size-4 md:px-6', className), "data-toc-popover-trigger": "", ...props, children: [_jsx(ProgressCircle, { value: (selected + 1) / Math.max(1, items.length), max: 1, className: cn('shrink-0', open && 'text-fd-primary') }), _jsxs("span", { className: "grid flex-1 *:my-auto *:row-start-1 *:col-start-1", children: [_jsx("span", { className: cn('truncate transition-all', open && 'text-fd-foreground', showItem && 'opacity-0 -translate-y-full pointer-events-none'), children: path?.name ?? text.toc }), _jsx("span", { className: cn('truncate transition-all', !showItem && 'opacity-0 translate-y-full pointer-events-none'), children: items[selected]?.title })] }), _jsx(ChevronDown, { className: cn('shrink-0 transition-transform mx-0.5', open && 'rotate-180') })] }));
48
+ }
49
+ function clamp(input, min, max) {
50
+ if (input < min)
51
+ return min;
52
+ if (input > max)
53
+ return max;
54
+ return input;
55
+ }
56
+ function ProgressCircle({ value, strokeWidth = 2, size = 24, min = 0, max = 100, ...restSvgProps }) {
57
+ const normalizedValue = clamp(value, min, max);
58
+ const radius = (size - strokeWidth) / 2;
59
+ const circumference = 2 * Math.PI * radius;
60
+ const progress = (normalizedValue / max) * circumference;
61
+ const circleProps = {
62
+ cx: size / 2,
63
+ cy: size / 2,
64
+ r: radius,
65
+ fill: 'none',
66
+ strokeWidth,
67
+ };
68
+ return (_jsxs("svg", { role: "progressbar", viewBox: `0 0 ${size} ${size}`, "aria-valuenow": normalizedValue, "aria-valuemin": min, "aria-valuemax": max, ...restSvgProps, children: [_jsx("circle", { ...circleProps, className: "stroke-current/25" }), _jsx("circle", { ...circleProps, stroke: "currentColor", strokeDasharray: circumference, strokeDashoffset: circumference - progress, strokeLinecap: "round", transform: `rotate(-90 ${size / 2} ${size / 2})`, className: "transition-all" })] }));
69
+ }
70
+ export function PageTOCPopoverContent(props) {
71
+ return (_jsx(CollapsibleContent, { "data-toc-popover-content": "", ...props, className: cn('flex flex-col px-4 max-h-[50vh] md:px-6', props.className), children: _jsx("div", { children: props.children }) }));
72
+ }
73
+ export function PageLastUpdate({ date: value, ...props }) {
74
+ const { text } = useI18n();
75
+ const [date, setDate] = useState('');
76
+ useEffect(() => {
77
+ // to the timezone of client
78
+ setDate(value.toLocaleDateString());
79
+ }, [value]);
80
+ return (_jsxs("p", { ...props, className: cn('text-sm text-fd-muted-foreground', props.className), children: [text.lastUpdate, " ", date] }));
81
+ }
82
+ export function PageFooter({ items, ...props }) {
83
+ const footerList = useFooterItems();
84
+ const pathname = usePathname();
85
+ const { previous, next } = useMemo(() => {
86
+ if (items)
87
+ return items;
88
+ const idx = footerList.findIndex((item) => isActive(item.url, pathname, false));
89
+ if (idx === -1)
90
+ return {};
91
+ return {
92
+ previous: footerList[idx - 1],
93
+ next: footerList[idx + 1],
94
+ };
95
+ }, [footerList, items, pathname]);
96
+ return (_jsxs("div", { ...props, className: cn('@container grid gap-4', previous && next ? 'grid-cols-2' : 'grid-cols-1', props.className), children: [previous ? _jsx(FooterItem, { item: previous, index: 0 }) : null, next ? _jsx(FooterItem, { item: next, index: 1 }) : null] }));
97
+ }
98
+ function FooterItem({ item, index }) {
99
+ const { text } = useI18n();
100
+ const Icon = index === 0 ? ChevronLeft : ChevronRight;
101
+ return (_jsxs(Link, { href: item.url, className: cn('flex flex-col gap-2 rounded-lg border p-4 text-sm transition-colors hover:bg-fd-accent/80 hover:text-fd-accent-foreground @max-lg:col-span-full', index === 1 && 'text-end'), children: [_jsxs("div", { className: cn('inline-flex items-center gap-1.5 font-medium', index === 1 && 'flex-row-reverse'), children: [_jsx(Icon, { className: "-mx-1 size-4 shrink-0 rtl:rotate-180" }), _jsx("p", { children: item.name })] }), _jsx("p", { className: "text-fd-muted-foreground truncate", children: item.description ?? (index === 0 ? text.previousPage : text.nextPage) })] }));
102
+ }
103
+ export function PageBreadcrumb({ includeRoot, includeSeparator, includePage, ...props }) {
104
+ const path = useTreePath();
105
+ const { root } = useTreeContext();
106
+ const items = useMemo(() => {
107
+ return getBreadcrumbItemsFromPath(root, path, {
108
+ includePage,
109
+ includeSeparator,
110
+ includeRoot,
111
+ });
112
+ }, [includePage, includeRoot, includeSeparator, path, root]);
113
+ if (items.length === 0)
114
+ return null;
115
+ return (_jsx("div", { ...props, className: cn('flex items-center gap-1.5 text-sm text-fd-muted-foreground', props.className), children: items.map((item, i) => {
116
+ const className = cn('truncate', i === items.length - 1 && 'text-fd-primary font-medium');
117
+ return (_jsxs(Fragment, { children: [i !== 0 && _jsx(ChevronRight, { className: "size-3.5 shrink-0" }), item.url ? (_jsx(Link, { href: item.url, className: cn(className, 'transition-opacity hover:opacity-80'), children: item.name })) : (_jsx("span", { className: className, children: item.name }))] }, i));
118
+ }) }));
119
+ }
@@ -0,0 +1,58 @@
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ import { type BreadcrumbProps, type FooterProps } from './client.js';
3
+ import type { AnchorProviderProps, TOCItemType } from 'fumadocs-core/toc';
4
+ interface BreadcrumbOptions extends BreadcrumbProps {
5
+ enabled: boolean;
6
+ component: ReactNode;
7
+ }
8
+ interface FooterOptions extends FooterProps {
9
+ enabled: boolean;
10
+ component: ReactNode;
11
+ }
12
+ export interface DocsPageProps {
13
+ toc?: TOCItemType[];
14
+ tableOfContent?: Partial<TableOfContentOptions>;
15
+ tableOfContentPopover?: Partial<TableOfContentPopoverOptions>;
16
+ /**
17
+ * Extend the page to fill all available space
18
+ *
19
+ * @defaultValue false
20
+ */
21
+ full?: boolean;
22
+ /**
23
+ * Replace or disable breadcrumb
24
+ */
25
+ breadcrumb?: Partial<BreadcrumbOptions>;
26
+ /**
27
+ * Footer navigation, you can disable it by passing `false`
28
+ */
29
+ footer?: Partial<FooterOptions>;
30
+ children?: ReactNode;
31
+ }
32
+ type TableOfContentOptions = Pick<AnchorProviderProps, 'single'> & {
33
+ /**
34
+ * Custom content in TOC container, before the main TOC
35
+ */
36
+ header?: ReactNode;
37
+ /**
38
+ * Custom content in TOC container, after the main TOC
39
+ */
40
+ footer?: ReactNode;
41
+ enabled: boolean;
42
+ component: ReactNode;
43
+ /**
44
+ * @defaultValue 'normal'
45
+ */
46
+ style?: 'normal' | 'clerk';
47
+ };
48
+ type TableOfContentPopoverOptions = Omit<TableOfContentOptions, 'single'>;
49
+ export declare function DocsPage({ breadcrumb: { enabled: breadcrumbEnabled, component: breadcrumb, ...breadcrumbProps }, footer, full, tableOfContentPopover: { enabled: tocPopoverEnabled, component: tocPopover, ...tocPopoverOptions }, tableOfContent: { enabled: tocEnabled, component: tocReplace, ...tocOptions }, toc, children, }: DocsPageProps): ReactNode;
50
+ export declare function EditOnGitHub(props: ComponentProps<'a'>): import("react/jsx-runtime").JSX.Element;
51
+ /**
52
+ * Add typography styles
53
+ */
54
+ export declare function DocsBody({ children, className, ...props }: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
55
+ export declare function DocsDescription({ children, className, ...props }: ComponentProps<'p'>): import("react/jsx-runtime").JSX.Element | null;
56
+ export declare function DocsTitle({ children, className, ...props }: ComponentProps<'h1'>): import("react/jsx-runtime").JSX.Element;
57
+ export { PageLastUpdate, PageBreadcrumb } from './client.js';
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/layouts/docs/page/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvD,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,WAAW,EAMjB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAK1E,UAAU,iBAAkB,SAAQ,eAAe;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,UAAU,aAAc,SAAQ,WAAW;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAE9D;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAExC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAEhC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,KAAK,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG;IACjE;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC5B,CAAC;AAEF,KAAK,4BAA4B,GAAG,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;AAE1E,wBAAgB,QAAQ,CAAC,EACvB,UAAU,EAAE,EACV,OAAO,EAAE,iBAAwB,EACjC,SAAS,EAAE,UAAU,EACrB,GAAG,eAAe,EACd,EACN,MAAW,EACX,IAAY,EACZ,qBAAqB,EAAE,EACrB,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,UAAU,EACrB,GAAG,iBAAiB,EAChB,EACN,cAAc,EAAE,EACd,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,UAAU,EACrB,GAAG,UAAU,EACT,EACN,GAAQ,EACR,QAAQ,GACT,EAAE,aAAa,aAkFf;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,2CAuBtD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,KAAK,CAAC,2CAMvB;AAED,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,GAAG,CAAC,kDAYrB;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,IAAI,CAAC,2CAMtB;AAED,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { cn } from '@fumadocs/ui/cn';
3
+ import { buttonVariants } from '../../../components/ui/button.js';
4
+ import { Edit, Text } from '@fumadocs/ui/icons';
5
+ import { I18nLabel } from '../../../contexts/i18n.js';
6
+ import { PageBreadcrumb, PageFooter, PageTOCPopover, PageTOCPopoverContent, PageTOCPopoverTrigger, } from './client.js';
7
+ import * as TocDefault from '../../../components/toc/default.js';
8
+ import * as TocClerk from '../../../components/toc/clerk.js';
9
+ import { TOCProvider, TOCScrollArea } from '../../../components/toc/index.js';
10
+ export function DocsPage({ breadcrumb: { enabled: breadcrumbEnabled = true, component: breadcrumb, ...breadcrumbProps } = {}, footer = {}, full = false, tableOfContentPopover: { enabled: tocPopoverEnabled, component: tocPopover, ...tocPopoverOptions } = {}, tableOfContent: { enabled: tocEnabled, component: tocReplace, ...tocOptions } = {}, toc = [], children, }) {
11
+ // disable TOC on full mode, you can still enable it with `enabled` option.
12
+ tocEnabled ?? (tocEnabled = !full &&
13
+ (toc.length > 0 ||
14
+ tocOptions.footer !== undefined ||
15
+ tocOptions.header !== undefined));
16
+ tocPopoverEnabled ?? (tocPopoverEnabled = toc.length > 0 ||
17
+ tocPopoverOptions.header !== undefined ||
18
+ tocPopoverOptions.footer !== undefined);
19
+ let wrapper = (children) => children;
20
+ if (tocEnabled || tocPopoverEnabled) {
21
+ wrapper = (children) => (_jsx(TOCProvider, { single: tocOptions.single, toc: toc, children: children }));
22
+ }
23
+ return wrapper(_jsxs(_Fragment, { children: [tocPopoverEnabled &&
24
+ (tocPopover ?? (_jsxs(PageTOCPopover, { children: [_jsx(PageTOCPopoverTrigger, {}), _jsxs(PageTOCPopoverContent, { children: [tocPopoverOptions.header, _jsx(TOCScrollArea, { children: tocPopoverOptions.style === 'clerk' ? (_jsx(TocClerk.TOCItems, {})) : (_jsx(TocDefault.TOCItems, {})) }), tocPopoverOptions.footer] })] }))), _jsxs("article", { id: "nd-page", "data-full": full, className: cn('flex flex-col w-full max-w-[900px] mx-auto [grid-area:main] px-4 py-6 gap-4 md:px-6 md:pt-8 xl:px-8 xl:pt-14', full ? 'max-w-[1200px]' : 'xl:layout:[--fd-toc-width:268px]'), children: [breadcrumbEnabled &&
25
+ (breadcrumb ?? _jsx(PageBreadcrumb, { ...breadcrumbProps })), children, footer.enabled !== false &&
26
+ (footer.component ?? _jsx(PageFooter, { items: footer.items }))] }), tocEnabled &&
27
+ (tocReplace ?? (_jsxs("div", { id: "nd-toc", className: "sticky top-(--fd-docs-row-1) h-[calc(var(--fd-docs-height)-var(--fd-docs-row-1))] flex flex-col [grid-area:toc] w-(--fd-toc-width) pt-12 pe-4 pb-2 max-xl:hidden", children: [tocOptions.header, _jsxs("h3", { id: "toc-title", className: "inline-flex items-center gap-1.5 text-sm text-fd-muted-foreground", children: [_jsx(Text, { className: "size-4" }), _jsx(I18nLabel, { label: "toc" })] }), _jsx(TOCScrollArea, { children: tocOptions.style === 'clerk' ? (_jsx(TocClerk.TOCItems, {})) : (_jsx(TocDefault.TOCItems, {})) }), tocOptions.footer] })))] }));
28
+ }
29
+ export function EditOnGitHub(props) {
30
+ return (_jsx("a", { target: "_blank", rel: "noreferrer noopener", ...props, className: cn(buttonVariants({
31
+ color: 'secondary',
32
+ size: 'sm',
33
+ className: 'gap-1.5 not-prose',
34
+ }), props.className), children: props.children ?? (_jsxs(_Fragment, { children: [_jsx(Edit, { className: "size-3.5" }), _jsx(I18nLabel, { label: "editOnGithub" })] })) }));
35
+ }
36
+ /**
37
+ * Add typography styles
38
+ */
39
+ export function DocsBody({ children, className, ...props }) {
40
+ return (_jsx("div", { ...props, className: cn('prose flex-1', className), children: children }));
41
+ }
42
+ export function DocsDescription({ children, className, ...props }) {
43
+ // Don't render if no description provided
44
+ if (children === undefined)
45
+ return null;
46
+ return (_jsx("p", { ...props, className: cn('mb-8 text-lg text-fd-muted-foreground', className), children: children }));
47
+ }
48
+ export function DocsTitle({ children, className, ...props }) {
49
+ return (_jsx("h1", { ...props, className: cn('text-[1.75em] font-semibold', className), children: children }));
50
+ }
51
+ export { PageLastUpdate, PageBreadcrumb } from './client.js';
@@ -0,0 +1,17 @@
1
+ import * as Base from '../../components/sidebar/base.js';
2
+ import { type ComponentProps } from 'react';
3
+ export declare const Sidebar: typeof Base.SidebarProvider, SidebarFolder: typeof Base.SidebarFolder, SidebarCollapseTrigger: typeof Base.SidebarCollapseTrigger, SidebarViewport: typeof Base.SidebarViewport, SidebarTrigger: typeof Base.SidebarTrigger;
4
+ export declare function SidebarContent({ ref: refProp, className, children, ...props }: ComponentProps<'aside'>): import("react/jsx-runtime").JSX.Element;
5
+ export declare function SidebarDrawer({ children, className, ...props }: ComponentProps<typeof Base.SidebarDrawerContent>): import("react/jsx-runtime").JSX.Element;
6
+ export declare function SidebarSeparator({ className, style, children, ...props }: ComponentProps<'p'>): import("react/jsx-runtime").JSX.Element;
7
+ export declare function SidebarItem({ className, style, children, ...props }: ComponentProps<typeof Base.SidebarItem>): import("react/jsx-runtime").JSX.Element;
8
+ export declare function SidebarFolderTrigger({ className, style, ...props }: ComponentProps<typeof Base.SidebarFolderTrigger>): import("react/jsx-runtime").JSX.Element;
9
+ export declare function SidebarFolderLink({ className, style, ...props }: ComponentProps<typeof Base.SidebarFolderLink>): import("react/jsx-runtime").JSX.Element;
10
+ export declare function SidebarFolderContent({ className, children, ...props }: ComponentProps<typeof Base.SidebarFolderContent>): import("react/jsx-runtime").JSX.Element;
11
+ export declare const SidebarPageTree: (components: Partial<import("../../components/sidebar/page-tree.js").SidebarPageTreeComponents>) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const SidebarLinkItem: ({ item, ...props }: import("react").HTMLAttributes<HTMLElement> & {
13
+ item: Exclude<import("@fumadocs/ui/link-item").LinkItemType, {
14
+ type: "icon";
15
+ }>;
16
+ }) => import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../../src/layouts/docs/sidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,2BAA2B,CAAC;AAElD,OAAO,EAAE,KAAK,cAAc,EAAU,MAAM,OAAO,CAAC;AA6BpD,eAAO,MACY,OAAO,+BACxB,aAAa,6BACb,sBAAsB,sCACtB,eAAe,+BACf,cAAc,4BACR,CAAC;AAET,wBAAgB,cAAc,CAAC,EAC7B,GAAG,EAAE,OAAO,EACZ,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,CAAC,2CA+DzB;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC,2CAelD;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,GAAG,CAAC,2CAerB;AAED,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,2CAkBzC;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC,2CAqBlD;AAED,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,2CAmB/C;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC,2CAkBlD;AAED,eAAO,MAAM,eAAe,sIAO1B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;6CAM1B,CAAC"}
@@ -0,0 +1,94 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as Base from '../../components/sidebar/base.js';
4
+ import { cn } from '@fumadocs/ui/cn';
5
+ import { useRef } from 'react';
6
+ import { cva } from 'class-variance-authority';
7
+ import { createPageTreeRenderer } from '../../components/sidebar/page-tree.js';
8
+ import { createLinkItemRenderer } from '../../components/sidebar/link-item.js';
9
+ import { buttonVariants } from '../../components/ui/button.js';
10
+ import { SearchToggle } from '../../layouts/shared/search-toggle.js';
11
+ import { Sidebar as SidebarIcon } from '@fumadocs/ui/icons';
12
+ import { mergeRefs } from '@fumadocs/ui/merge-refs';
13
+ const itemVariants = cva('relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0', {
14
+ variants: {
15
+ variant: {
16
+ link: 'transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors',
17
+ button: 'transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none',
18
+ },
19
+ highlight: {
20
+ true: "data-[active=true]:before:content-[''] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5",
21
+ },
22
+ },
23
+ });
24
+ function getItemOffset(depth) {
25
+ return `calc(${2 + 3 * depth} * var(--spacing))`;
26
+ }
27
+ export const { SidebarProvider: Sidebar, SidebarFolder, SidebarCollapseTrigger, SidebarViewport, SidebarTrigger, } = Base;
28
+ export function SidebarContent({ ref: refProp, className, children, ...props }) {
29
+ const ref = useRef(null);
30
+ return (_jsx(Base.SidebarContent, { children: ({ collapsed, hovered, ref: asideRef, ...rest }) => (_jsxs(_Fragment, { children: [_jsxs("div", { "data-sidebar-placeholder": "", className: "sticky top-(--fd-docs-row-1) z-20 [grid-area:sidebar] pointer-events-none *:pointer-events-auto h-[calc(var(--fd-docs-height)-var(--fd-docs-row-1))] md:layout:[--fd-sidebar-width:268px] max-md:hidden", children: [collapsed && (_jsx("div", { className: "absolute start-0 inset-y-0 w-4", ...rest })), _jsx("aside", { id: "nd-sidebar", ref: mergeRefs(ref, refProp, asideRef), "data-collapsed": collapsed, "data-hovered": collapsed && hovered, className: cn('absolute flex flex-col w-full start-0 inset-y-0 items-end bg-fd-card text-sm border-e duration-250 *:w-(--fd-sidebar-width)', collapsed && [
31
+ 'inset-y-2 rounded-xl transition-transform border w-(--fd-sidebar-width)',
32
+ hovered
33
+ ? 'shadow-lg translate-x-2 rtl:-translate-x-2'
34
+ : '-translate-x-(--fd-sidebar-width) rtl:translate-x-full',
35
+ ], ref.current &&
36
+ (ref.current.getAttribute('data-collapsed') === 'true') !==
37
+ collapsed &&
38
+ 'transition-[width,inset-block,translate,background-color]', className), ...props, ...rest, children: children })] }), _jsxs("div", { "data-sidebar-panel": "", className: cn('fixed flex top-[calc(--spacing(4)+var(--fd-docs-row-3))] start-4 shadow-lg transition-opacity rounded-xl p-0.5 border bg-fd-muted text-fd-muted-foreground z-10', (!collapsed || hovered) && 'pointer-events-none opacity-0'), children: [_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
39
+ color: 'ghost',
40
+ size: 'icon-sm',
41
+ className: 'rounded-lg',
42
+ })), children: _jsx(SidebarIcon, {}) }), _jsx(SearchToggle, { className: "rounded-lg", hideIfDisabled: true })] })] })) }));
43
+ }
44
+ export function SidebarDrawer({ children, className, ...props }) {
45
+ return (_jsxs(_Fragment, { children: [_jsx(Base.SidebarDrawerOverlay, { className: "fixed z-40 inset-0 backdrop-blur-xs data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out" }), _jsx(Base.SidebarDrawerContent, { className: cn('fixed text-[0.9375rem] flex flex-col shadow-lg border-s end-0 inset-y-0 w-[85%] max-w-[380px] z-40 bg-fd-background data-[state=open]:animate-fd-sidebar-in data-[state=closed]:animate-fd-sidebar-out', className), ...props, children: children })] }));
46
+ }
47
+ export function SidebarSeparator({ className, style, children, ...props }) {
48
+ const depth = Base.useFolderDepth();
49
+ return (_jsx(Base.SidebarSeparator, { className: cn('[&_svg]:size-4 [&_svg]:shrink-0', className), style: {
50
+ paddingInlineStart: getItemOffset(depth),
51
+ ...style,
52
+ }, ...props, children: children }));
53
+ }
54
+ export function SidebarItem({ className, style, children, ...props }) {
55
+ const depth = Base.useFolderDepth();
56
+ return (_jsx(Base.SidebarItem, { className: cn(itemVariants({ variant: 'link', highlight: depth >= 1 }), className), style: {
57
+ paddingInlineStart: getItemOffset(depth),
58
+ ...style,
59
+ }, ...props, children: children }));
60
+ }
61
+ export function SidebarFolderTrigger({ className, style, ...props }) {
62
+ const { depth, collapsible } = Base.useFolder();
63
+ return (_jsx(Base.SidebarFolderTrigger, { className: (s) => cn(itemVariants({ variant: collapsible ? 'button' : null }), 'w-full', typeof className === 'function' ? className(s) : className), style: {
64
+ paddingInlineStart: getItemOffset(depth - 1),
65
+ ...style,
66
+ }, ...props, children: props.children }));
67
+ }
68
+ export function SidebarFolderLink({ className, style, ...props }) {
69
+ const depth = Base.useFolderDepth();
70
+ return (_jsx(Base.SidebarFolderLink, { className: cn(itemVariants({ variant: 'link', highlight: depth > 1 }), 'w-full', className), style: {
71
+ paddingInlineStart: getItemOffset(depth - 1),
72
+ ...style,
73
+ }, ...props, children: props.children }));
74
+ }
75
+ export function SidebarFolderContent({ className, children, ...props }) {
76
+ const depth = Base.useFolderDepth();
77
+ return (_jsx(Base.SidebarFolderContent, { className: (s) => cn('relative', depth === 1 &&
78
+ "before:content-[''] before:absolute before:w-px before:inset-y-1 before:bg-fd-border before:start-2.5", typeof className === 'function' ? className(s) : className), ...props, children: children }));
79
+ }
80
+ export const SidebarPageTree = createPageTreeRenderer({
81
+ SidebarFolder,
82
+ SidebarFolderContent,
83
+ SidebarFolderLink,
84
+ SidebarFolderTrigger,
85
+ SidebarItem,
86
+ SidebarSeparator,
87
+ });
88
+ export const SidebarLinkItem = createLinkItemRenderer({
89
+ SidebarFolder,
90
+ SidebarFolderContent,
91
+ SidebarFolderLink,
92
+ SidebarFolderTrigger,
93
+ SidebarItem,
94
+ });
@@ -0,0 +1,6 @@
1
+ import type { HomeLayoutProps } from './index.js';
2
+ export declare const navItemVariants: (props?: ({
3
+ variant?: "icon" | "button" | "main" | null | undefined;
4
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
5
+ export declare function Header({ nav, i18n, links, githubUrl, themeSwitch, searchToggle, }: HomeLayoutProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/layouts/home/client.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,GAAG,CAAC;AAwBzC,eAAO,MAAM,eAAe;;8EAiB1B,CAAC;AAEH,wBAAgB,MAAM,CAAC,EACrB,GAAQ,EACR,IAAY,EACZ,KAAK,EACL,SAAS,EACT,WAAgB,EAChB,YAAiB,GAClB,EAAE,eAAe,2CAkJjB"}
@@ -0,0 +1,136 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { createContext, Fragment, use, useEffect, useEffectEvent, useMemo, useState, } from 'react';
4
+ import { cva } from 'class-variance-authority';
5
+ import Link from 'fumadocs-core/link';
6
+ import { cn } from '@fumadocs/ui/cn';
7
+ import { resolveLinkItems, } from '../../layouts/shared/index.js';
8
+ import { LinkItem } from '@fumadocs/ui/link-item';
9
+ import { NavigationMenuRoot, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, } from '../../components/ui/navigation-menu.js';
10
+ import { buttonVariants } from '../../components/ui/button.js';
11
+ import { LargeSearchToggle, SearchToggle, } from '../../layouts/shared/search-toggle.js';
12
+ import { ThemeToggle } from '../../layouts/shared/theme-toggle.js';
13
+ import { LanguageToggle, LanguageToggleText, } from '../../layouts/shared/language-toggle.js';
14
+ import { ChevronDown, Languages } from '@fumadocs/ui/icons';
15
+ import { useIsScrollTop } from '@fumadocs/ui/hooks/use-is-scroll-top';
16
+ import { NavigationMenu } from '@base-ui/react';
17
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '../../components/ui/collapsible.js';
18
+ const MobileMenuContext = createContext(null);
19
+ export const navItemVariants = cva('[&_svg]:size-4', {
20
+ variants: {
21
+ variant: {
22
+ main: 'inline-flex items-center gap-1 p-2 text-fd-muted-foreground transition-colors hover:text-fd-accent-foreground data-[active=true]:text-fd-primary data-[popup-open]:text-fd-primary',
23
+ button: buttonVariants({
24
+ color: 'secondary',
25
+ className: 'gap-1.5',
26
+ }),
27
+ icon: buttonVariants({
28
+ color: 'ghost',
29
+ size: 'icon',
30
+ }),
31
+ },
32
+ },
33
+ defaultVariants: {
34
+ variant: 'main',
35
+ },
36
+ });
37
+ export function Header({ nav = {}, i18n = false, links, githubUrl, themeSwitch = {}, searchToggle = {}, }) {
38
+ const { navItems, menuItems } = useMemo(() => {
39
+ const navItems = [];
40
+ const menuItems = [];
41
+ for (const item of resolveLinkItems({ links, githubUrl })) {
42
+ switch (item.on ?? 'all') {
43
+ case 'menu':
44
+ menuItems.push(item);
45
+ break;
46
+ case 'nav':
47
+ navItems.push(item);
48
+ break;
49
+ default:
50
+ navItems.push(item);
51
+ menuItems.push(item);
52
+ }
53
+ }
54
+ return { navItems, menuItems };
55
+ }, [links, githubUrl]);
56
+ return (_jsx(MobileMenuCollapsible, { render: (_, s) => (_jsxs(HeaderRoot, { transparentMode: nav.transparentMode, className: cn(s.open && 'shadow-lg rounded-b-2xl'), children: [_jsxs(NavigationMenuList, { className: "flex h-14 w-full items-center px-4", children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex items-center gap-2.5 font-semibold", children: nav.title }), nav.children, _jsx("ul", { className: "flex flex-row items-center gap-2 px-6 max-sm:hidden", children: navItems
57
+ .filter((item) => !isSecondary(item))
58
+ .map((item, i) => (_jsx(NavigationMenuLinkItem, { item: item, className: "text-sm" }, i))) }), _jsxs("div", { className: "flex flex-row items-center justify-end gap-1.5 flex-1 max-lg:hidden", children: [searchToggle.enabled !== false &&
59
+ (searchToggle.components?.lg ?? (_jsx(LargeSearchToggle, { className: "w-full rounded-full ps-2.5 max-w-[240px]", hideIfDisabled: true }))), themeSwitch.enabled !== false &&
60
+ (themeSwitch.component ?? (_jsx(ThemeToggle, { mode: themeSwitch?.mode }))), i18n && (_jsx(LanguageToggle, { children: _jsx(Languages, { className: "size-5" }) })), _jsx("ul", { className: "flex flex-row gap-2 items-center empty:hidden", children: navItems.filter(isSecondary).map((item, i) => (_jsx(NavigationMenuLinkItem, { className: cn(item.type === 'icon' && '-mx-1 first:ms-0 last:me-0'), item: item }, i))) })] }), _jsxs("ul", { className: "flex flex-row items-center ms-auto -me-1.5 lg:hidden", children: [searchToggle.enabled !== false &&
61
+ (searchToggle.components?.sm ?? (_jsx(SearchToggle, { className: "p-2", hideIfDisabled: true }))), _jsx(CollapsibleTrigger, { "aria-label": "Toggle Menu", className: cn(buttonVariants({
62
+ size: 'icon',
63
+ color: 'ghost',
64
+ className: 'group [&_svg]:size-5.5',
65
+ })), children: _jsx(ChevronDown, { className: "transition-transform duration-300 group-data-[panel-open]:rotate-180" }) })] })] }), _jsxs(CollapsibleContent, { className: "flex flex-col px-4", children: [menuItems
66
+ .filter((item) => !isSecondary(item))
67
+ .map((item, i) => (_jsx(MobileMenuLinkItem, { item: item, className: "first:mt-4 sm:hidden" }, i))), _jsxs("div", { className: "-ms-1.5 flex flex-row pt-2 pb-4 items-center justify-end gap-2", children: [menuItems.filter(isSecondary).map((item, i) => (_jsx(MobileMenuLinkItem, { item: item, className: cn(item.type === 'icon' && '-mx-1 first:ms-0') }, i))), _jsx("div", { role: "separator", className: "flex-1 sm:hidden" }), i18n && (_jsxs(LanguageToggle, { children: [_jsx(Languages, { className: "size-5" }), _jsx(LanguageToggleText, {}), _jsx(ChevronDown, { className: "size-3 text-fd-muted-foreground" })] })), themeSwitch.enabled !== false &&
68
+ (themeSwitch.component ?? (_jsx(ThemeToggle, { mode: themeSwitch?.mode })))] })] }), _jsx(NavigationMenu.Portal, { children: _jsx(NavigationMenu.Positioner, { sideOffset: 10, className: "z-20 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[left,right] duration-(--duration) ease-(--easing) data-[instant]:transition-none", style: {
69
+ ['--duration']: '0.35s',
70
+ ['--easing']: 'cubic-bezier(0.22, 1, 0.36, 1)',
71
+ }, children: _jsx(NavigationMenu.Popup, { className: "relative w-(--popup-width) h-(--popup-height) max-w-(--fd-layout-width,1400px) origin-(--transform-origin) rounded-xl bg-fd-background/80 border backdrop-blur-lg shadow-lg transition-[opacity,transform,width,height,scale,translate] duration-(--duration) ease-(--easing) data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:scale-90 data-[starting-style]:opacity-0", children: _jsx(NavigationMenu.Viewport, { className: "relative size-full overflow-hidden" }) }) }) })] })) }));
72
+ }
73
+ function MobileMenuCollapsible(props) {
74
+ const [open, setOpen] = useState(false);
75
+ const onClick = useEffectEvent((e) => {
76
+ if (!open)
77
+ return;
78
+ const header = document.getElementById('nd-nav');
79
+ if (header && !header.contains(e.target))
80
+ setOpen(false);
81
+ });
82
+ useEffect(() => {
83
+ window.addEventListener('click', onClick);
84
+ return () => {
85
+ window.removeEventListener('click', onClick);
86
+ };
87
+ }, []);
88
+ return (_jsx(MobileMenuContext, { value: useMemo(() => ({
89
+ open,
90
+ setOpen,
91
+ }), [open]), children: _jsx(Collapsible, { open: open, onOpenChange: setOpen, ...props }) }));
92
+ }
93
+ function isSecondary(item) {
94
+ if ('secondary' in item && item.secondary != null)
95
+ return item.secondary;
96
+ return item.type === 'icon';
97
+ }
98
+ function HeaderRoot({ transparentMode = 'none', children, className, ...props }) {
99
+ const isTop = useIsScrollTop({ enabled: transparentMode === 'top' }) ?? true;
100
+ const isTransparent = transparentMode === 'top' ? isTop : transparentMode === 'always';
101
+ return (_jsx("header", { id: "nd-nav", className: "sticky h-14 top-0 z-40", children: _jsx(NavigationMenuRoot, { render: (_, s) => (_jsx("nav", { className: cn('w-full backdrop-blur-lg border-b transition-colors mx-auto max-w-(--fd-layout-width)', (!isTransparent || s.open) && 'bg-fd-background/80', className), ...props, children: children })) }) }));
102
+ }
103
+ function NavigationMenuLinkItem({ item, ...props }) {
104
+ if (item.type === 'custom')
105
+ return _jsx("div", { ...props, children: item.children });
106
+ if (item.type === 'menu') {
107
+ const children = item.items.map((child, j) => {
108
+ if (child.type === 'custom') {
109
+ return _jsx(Fragment, { children: child.children }, j);
110
+ }
111
+ const { banner = child.icon ? (_jsx("div", { className: "w-fit rounded-md border bg-fd-muted p-1 [&_svg]:size-4", children: child.icon })) : null, ...rest } = child.menu ?? {};
112
+ return (_jsx(NavigationMenuLink, { render: _jsx(Link, { href: child.url, external: child.external, ...rest, className: cn('flex flex-col gap-2 rounded-lg border bg-fd-card p-3 transition-colors hover:bg-fd-accent/80 hover:text-fd-accent-foreground', rest.className), children: rest.children ?? (_jsxs(_Fragment, { children: [banner, _jsx("p", { className: "text-base font-medium", children: child.text }), _jsx("p", { className: "text-sm text-fd-muted-foreground empty:hidden", children: child.description })] })) }) }, `${j}-${child.url}`));
113
+ });
114
+ return (_jsxs(NavigationMenuItem, { ...props, children: [_jsx(NavigationMenuTrigger, { className: cn(navItemVariants(), 'rounded-md'), children: item.url ? (_jsx(Link, { href: item.url, external: item.external, children: item.text })) : (item.text) }), _jsx(NavigationMenuContent, { className: "grid grid-cols-1 gap-2 p-4 md:grid-cols-2 lg:grid-cols-3", children: children })] }));
115
+ }
116
+ return (_jsx(NavigationMenuItem, { ...props, children: _jsx(NavigationMenuLink, { render: _jsx(LinkItem, { item: item, "aria-label": item.type === 'icon' ? item.label : undefined, className: cn(navItemVariants({ variant: item.type })), children: item.type === 'icon' ? item.icon : item.text }) }) }));
117
+ }
118
+ function MobileMenuLinkItem({ item, className, }) {
119
+ if (item.type === 'custom')
120
+ return _jsx("div", { className: cn('grid', className), children: item.children });
121
+ const { setOpen } = use(MobileMenuContext);
122
+ if (item.type === 'menu') {
123
+ const header = (_jsxs(_Fragment, { children: [item.icon, item.text] }));
124
+ return (_jsxs("div", { className: cn('mb-4 flex flex-col', className), children: [_jsx("p", { className: "mb-1 text-sm text-fd-muted-foreground", children: item.url ? (_jsx(Link, { href: item.url, external: item.external, onClick: () => setOpen(false), children: header })) : (header) }), item.items.map((child, i) => (_jsx(MobileMenuLinkItem, { item: child }, i)))] }));
125
+ }
126
+ return (_jsxs(LinkItem, { item: item, className: cn((!item.type || item.type === 'main') &&
127
+ 'inline-flex items-center gap-2 py-1.5 transition-colors hover:text-fd-popover-foreground/50 data-[active=true]:font-medium data-[active=true]:text-fd-primary [&_svg]:size-4', item.type === 'icon' &&
128
+ buttonVariants({
129
+ size: 'icon',
130
+ color: 'ghost',
131
+ }), item.type === 'button' &&
132
+ buttonVariants({
133
+ color: 'secondary',
134
+ className: 'gap-1.5 [&_svg]:size-4',
135
+ }), className), "aria-label": item.type === 'icon' ? item.label : undefined, onClick: () => setOpen(false), children: [item.icon, item.type !== 'icon' && item.text] }));
136
+ }
@@ -0,0 +1,7 @@
1
+ import type { ComponentProps } from 'react';
2
+ import { type BaseLayoutProps, type NavOptions } from '../../layouts/shared/index.js';
3
+ export interface HomeLayoutProps extends BaseLayoutProps {
4
+ nav?: Partial<NavOptions>;
5
+ }
6
+ export declare function HomeLayout(props: HomeLayoutProps & ComponentProps<'main'>): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=index.d.ts.map