@assistant-ui/docs-theme 0.0.0 → 0.0.3

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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +225 -0
  3. package/dist/action-icons.d.ts +5 -0
  4. package/dist/action-icons.d.ts.map +1 -0
  5. package/dist/action-icons.js +52 -0
  6. package/dist/action-icons.js.map +1 -0
  7. package/dist/brand.d.ts +7 -0
  8. package/dist/brand.d.ts.map +1 -0
  9. package/dist/brand.js +37 -0
  10. package/dist/brand.js.map +1 -0
  11. package/dist/config.d.ts +3 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +22 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/header.d.ts +12 -0
  16. package/dist/header.d.ts.map +1 -0
  17. package/dist/header.js +73 -0
  18. package/dist/header.js.map +1 -0
  19. package/dist/index.d.ts +8 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +48 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/navigation.d.ts +23 -0
  24. package/dist/navigation.d.ts.map +1 -0
  25. package/dist/navigation.js +41 -0
  26. package/dist/navigation.js.map +1 -0
  27. package/dist/next.d.ts +29 -0
  28. package/dist/next.d.ts.map +1 -0
  29. package/dist/next.js +63 -0
  30. package/dist/next.js.map +1 -0
  31. package/dist/page-content.d.ts +12 -0
  32. package/dist/page-content.d.ts.map +1 -0
  33. package/dist/page-content.js +274 -0
  34. package/dist/page-content.js.map +1 -0
  35. package/dist/provider.d.ts +2 -0
  36. package/dist/provider.d.ts.map +1 -0
  37. package/dist/provider.js +1 -0
  38. package/dist/site/constants.d.ts +2 -0
  39. package/dist/site/constants.d.ts.map +1 -0
  40. package/dist/site/constants.js +5 -0
  41. package/dist/site/constants.js.map +1 -0
  42. package/dist/site/footer.d.ts +13 -0
  43. package/dist/site/footer.d.ts.map +1 -0
  44. package/dist/site/footer.js +35 -0
  45. package/dist/site/footer.js.map +1 -0
  46. package/dist/site/header.d.ts +13 -0
  47. package/dist/site/header.d.ts.map +1 -0
  48. package/dist/site/header.js +81 -0
  49. package/dist/site/header.js.map +1 -0
  50. package/dist/site/layout.d.ts +8 -0
  51. package/dist/site/layout.d.ts.map +1 -0
  52. package/dist/site/layout.js +21 -0
  53. package/dist/site/layout.js.map +1 -0
  54. package/dist/site/page.d.ts +9 -0
  55. package/dist/site/page.d.ts.map +1 -0
  56. package/dist/site/page.js +32 -0
  57. package/dist/site/page.js.map +1 -0
  58. package/dist/site/pager.d.ts +13 -0
  59. package/dist/site/pager.d.ts.map +1 -0
  60. package/dist/site/pager.js +36 -0
  61. package/dist/site/pager.js.map +1 -0
  62. package/dist/site/sidebar-navigation.d.ts +13 -0
  63. package/dist/site/sidebar-navigation.d.ts.map +1 -0
  64. package/dist/site/sidebar-navigation.js +185 -0
  65. package/dist/site/sidebar-navigation.js.map +1 -0
  66. package/dist/site/sidebar.d.ts +16 -0
  67. package/dist/site/sidebar.d.ts.map +1 -0
  68. package/dist/site/sidebar.js +46 -0
  69. package/dist/site/sidebar.js.map +1 -0
  70. package/dist/site/toc.d.ts +12 -0
  71. package/dist/site/toc.d.ts.map +1 -0
  72. package/dist/site/toc.js +92 -0
  73. package/dist/site/toc.js.map +1 -0
  74. package/dist/site/tree.d.ts +24 -0
  75. package/dist/site/tree.d.ts.map +1 -0
  76. package/dist/site/tree.js +14 -0
  77. package/dist/site/tree.js.map +1 -0
  78. package/dist/site/utils.d.ts +2 -0
  79. package/dist/site/utils.d.ts.map +1 -0
  80. package/dist/site/utils.js +5 -0
  81. package/dist/site/utils.js.map +1 -0
  82. package/dist/ui.d.ts +10 -0
  83. package/dist/ui.d.ts.map +1 -0
  84. package/dist/ui.js +9 -0
  85. package/package.json +101 -1
  86. package/src/action-icons.tsx +48 -0
  87. package/src/brand.tsx +36 -0
  88. package/src/config.ts +23 -0
  89. package/src/header.test.tsx +41 -0
  90. package/src/header.tsx +94 -0
  91. package/src/index.test.ts +37 -0
  92. package/src/index.ts +38 -0
  93. package/src/layout-hosts.test.tsx +98 -0
  94. package/src/navigation.test.ts +123 -0
  95. package/src/navigation.ts +61 -0
  96. package/src/next.test.tsx +110 -0
  97. package/src/next.tsx +101 -0
  98. package/src/page-content.test.tsx +87 -0
  99. package/src/page-content.tsx +416 -0
  100. package/src/provider.ts +1 -0
  101. package/src/site/constants.ts +1 -0
  102. package/src/site/footer.tsx +59 -0
  103. package/src/site/header.test.tsx +89 -0
  104. package/src/site/header.tsx +117 -0
  105. package/src/site/layout.tsx +33 -0
  106. package/src/site/page.tsx +38 -0
  107. package/src/site/pager.tsx +54 -0
  108. package/src/site/sidebar-navigation.test.tsx +92 -0
  109. package/src/site/sidebar-navigation.tsx +267 -0
  110. package/src/site/sidebar.tsx +77 -0
  111. package/src/site/toc.test.tsx +187 -0
  112. package/src/site/toc.tsx +118 -0
  113. package/src/site/tree.ts +36 -0
  114. package/src/site/utils.ts +2 -0
  115. package/src/ui.ts +19 -0
  116. package/styles/site.css +223 -0
  117. package/styles/theme.css +858 -0
@@ -0,0 +1,81 @@
1
+ "use client";
2
+ import { cn } from "./utils.js";
3
+ import { DOCS_SIDEBAR_ID, useDocsSidebar } from "./sidebar.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Menu, PanelLeft, X } from "lucide-react";
6
+ import { useId, useRef, useState } from "react";
7
+ // src/site/header.tsx
8
+ function DocsSiteHeader({ brand, mobileControls, condensedNavigation, desktopNavigation, mobileNavigation, navigationRoot: NavigationRoot, scrolled }) {
9
+ const { open: sidebarOpen, setOpen: setSidebarOpen, toggle: toggleSidebar } = useDocsSidebar();
10
+ const [navMenuOpen, setNavMenuOpen] = useState(false);
11
+ const navMenuId = useId();
12
+ const navMenuToggle = useRef(null);
13
+ const closeNavigation = () => {
14
+ setNavMenuOpen(false);
15
+ navMenuToggle.current?.focus();
16
+ };
17
+ const toggleNavigation = () => {
18
+ if (!navMenuOpen) setSidebarOpen(false);
19
+ setNavMenuOpen((open) => !open);
20
+ };
21
+ const toggleMenu = () => {
22
+ if (!sidebarOpen) setNavMenuOpen(false);
23
+ toggleSidebar();
24
+ };
25
+ return /* @__PURE__ */ jsx("header", {
26
+ className: "sticky top-0 z-50",
27
+ children: /* @__PURE__ */ jsxs(NavigationRoot, { children: [/* @__PURE__ */ jsxs("div", {
28
+ className: cn("relative z-10 transition-colors duration-200", scrolled ? "bg-background/80 backdrop-blur-md" : "bg-transparent", "group-data-[menu-open=true]:bg-background", "flex h-12 w-full items-center px-4"),
29
+ children: [
30
+ /* @__PURE__ */ jsx("div", {
31
+ className: "flex min-w-0 flex-1 items-center",
32
+ children: brand
33
+ }),
34
+ /* @__PURE__ */ jsxs("div", {
35
+ className: "ml-auto flex shrink-0 items-center gap-1 md:hidden",
36
+ children: [
37
+ mobileControls,
38
+ /* @__PURE__ */ jsx("button", {
39
+ type: "button",
40
+ ref: navMenuToggle,
41
+ onClick: toggleNavigation,
42
+ className: "text-muted-foreground hover:text-foreground flex size-8 items-center justify-center transition-colors",
43
+ "aria-label": "Site navigation",
44
+ "aria-expanded": navMenuOpen,
45
+ "aria-controls": navMenuId,
46
+ children: navMenuOpen ? /* @__PURE__ */ jsx(X, { className: "size-4" }) : /* @__PURE__ */ jsx(Menu, { className: "size-4" })
47
+ }),
48
+ /* @__PURE__ */ jsx("button", {
49
+ type: "button",
50
+ onClick: toggleMenu,
51
+ className: "text-muted-foreground hover:text-foreground flex size-8 items-center justify-center transition-colors",
52
+ "aria-label": "Toggle sidebar",
53
+ "aria-expanded": sidebarOpen,
54
+ "aria-controls": DOCS_SIDEBAR_ID,
55
+ children: sidebarOpen ? /* @__PURE__ */ jsx(X, { className: "size-4" }) : /* @__PURE__ */ jsx(PanelLeft, { className: "size-4" })
56
+ })
57
+ ]
58
+ }),
59
+ /* @__PURE__ */ jsx("div", {
60
+ className: "ml-auto hidden items-center gap-4 md:flex lg:hidden",
61
+ children: condensedNavigation
62
+ }),
63
+ /* @__PURE__ */ jsx("div", {
64
+ className: "ml-auto hidden items-center gap-4 lg:flex",
65
+ children: desktopNavigation
66
+ })
67
+ ]
68
+ }), /* @__PURE__ */ jsx("div", {
69
+ className: cn("bg-background fixed inset-x-0 top-12 bottom-0 z-40 transition-opacity duration-200 md:hidden", navMenuOpen ? "opacity-100" : "pointer-events-none opacity-0"),
70
+ id: navMenuId,
71
+ inert: !navMenuOpen,
72
+ children: /* @__PURE__ */ jsx("div", {
73
+ className: "flex h-full flex-col gap-1 overflow-y-auto px-4 pt-4",
74
+ children: mobileNavigation(closeNavigation)
75
+ })
76
+ })] })
77
+ });
78
+ }
79
+ export { DocsSiteHeader };
80
+
81
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","names":[],"sources":["../../src/site/header.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useId,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from \"react\";\nimport { Menu, PanelLeft, X } from \"lucide-react\";\nimport { DOCS_SIDEBAR_ID, useDocsSidebar } from \"./sidebar\";\nimport { cn } from \"./utils\";\n\nexport function DocsSiteHeader({\n brand,\n mobileControls,\n condensedNavigation,\n desktopNavigation,\n mobileNavigation,\n navigationRoot: NavigationRoot,\n scrolled,\n}: {\n brand: ReactNode;\n mobileControls: ReactNode;\n condensedNavigation: ReactNode;\n desktopNavigation: ReactNode;\n mobileNavigation: (close: () => void) => ReactNode;\n navigationRoot: ComponentType<{ children: ReactNode }>;\n scrolled: boolean;\n}) {\n const {\n open: sidebarOpen,\n setOpen: setSidebarOpen,\n toggle: toggleSidebar,\n } = useDocsSidebar();\n const [navMenuOpen, setNavMenuOpen] = useState(false);\n const navMenuId = useId();\n const navMenuToggle = useRef<HTMLButtonElement>(null);\n const closeNavigation = () => {\n setNavMenuOpen(false);\n navMenuToggle.current?.focus();\n };\n const toggleNavigation = () => {\n if (!navMenuOpen) setSidebarOpen(false);\n setNavMenuOpen((open) => !open);\n };\n const toggleMenu = () => {\n if (!sidebarOpen) setNavMenuOpen(false);\n toggleSidebar();\n };\n return (\n <header className=\"sticky top-0 z-50\">\n <NavigationRoot>\n <div\n className={cn(\n \"relative z-10 transition-colors duration-200\",\n scrolled ? \"bg-background/80 backdrop-blur-md\" : \"bg-transparent\",\n \"group-data-[menu-open=true]:bg-background\",\n \"flex h-12 w-full items-center px-4\",\n )}\n >\n <div className=\"flex min-w-0 flex-1 items-center\">{brand}</div>\n <div className=\"ml-auto flex shrink-0 items-center gap-1 md:hidden\">\n {mobileControls}\n <button\n type=\"button\"\n ref={navMenuToggle}\n onClick={toggleNavigation}\n className=\"text-muted-foreground hover:text-foreground flex size-8 items-center justify-center transition-colors\"\n aria-label=\"Site navigation\"\n aria-expanded={navMenuOpen}\n aria-controls={navMenuId}\n >\n {navMenuOpen ? (\n <X className=\"size-4\" />\n ) : (\n <Menu className=\"size-4\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={toggleMenu}\n className=\"text-muted-foreground hover:text-foreground flex size-8 items-center justify-center transition-colors\"\n aria-label=\"Toggle sidebar\"\n aria-expanded={sidebarOpen}\n aria-controls={DOCS_SIDEBAR_ID}\n >\n {sidebarOpen ? (\n <X className=\"size-4\" />\n ) : (\n <PanelLeft className=\"size-4\" />\n )}\n </button>\n </div>\n <div className=\"ml-auto hidden items-center gap-4 md:flex lg:hidden\">\n {condensedNavigation}\n </div>\n <div className=\"ml-auto hidden items-center gap-4 lg:flex\">\n {desktopNavigation}\n </div>\n </div>\n <div\n className={cn(\n \"bg-background fixed inset-x-0 top-12 bottom-0 z-40 transition-opacity duration-200 md:hidden\",\n navMenuOpen ? \"opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n id={navMenuId}\n inert={!navMenuOpen}\n >\n <div className=\"flex h-full flex-col gap-1 overflow-y-auto px-4 pt-4\">\n {mobileNavigation(closeNavigation)}\n </div>\n </div>\n </NavigationRoot>\n </header>\n );\n}\n"],"mappings":";;;;;;;AAaA,SAAgB,eAAe,EAC7B,OACA,gBACA,qBACA,mBACA,kBACA,gBAAgB,gBAChB,YASC;CACD,MAAM,EACJ,MAAM,aACN,SAAS,gBACT,QAAQ,kBACN,eAAe;CACnB,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,MAAM,YAAY,MAAM;CACxB,MAAM,gBAAgB,OAA0B,IAAI;CACpD,MAAM,wBAAwB;EAC5B,eAAe,KAAK;EACpB,cAAc,SAAS,MAAM;CAC/B;CACA,MAAM,yBAAyB;EAC7B,IAAI,CAAC,aAAa,eAAe,KAAK;EACtC,gBAAgB,SAAS,CAAC,IAAI;CAChC;CACA,MAAM,mBAAmB;EACvB,IAAI,CAAC,aAAa,eAAe,KAAK;EACtC,cAAc;CAChB;CACA,OACE,oBAAC,UAAD;EAAQ,WAAU;EAChB,UAAA,qBAAC,gBAAD,EAAA,UAAA,CACE,qBAAC,OAAD;GACE,WAAW,GACT,gDACA,WAAW,sCAAsC,kBACjD,6CACA,oCACF;GANF,UAAA;IAQE,oBAAC,OAAD;KAAK,WAAU;KAAoC,UAAA;IAAW,CAAA;IAC9D,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACG;MACD,oBAAC,UAAD;OACE,MAAK;OACL,KAAK;OACL,SAAS;OACT,WAAU;OACV,cAAW;OACX,iBAAe;OACf,iBAAe;OAEd,UAAA,cACC,oBAAC,GAAD,EAAG,WAAU,SAAU,CAAA,IAEvB,oBAAC,MAAD,EAAM,WAAU,SAAU,CAAA;MAEtB,CAAA;MACR,oBAAC,UAAD;OACE,MAAK;OACL,SAAS;OACT,WAAU;OACV,cAAW;OACX,iBAAe;OACf,iBAAe;OAEd,UAAA,cACC,oBAAC,GAAD,EAAG,WAAU,SAAU,CAAA,IAEvB,oBAAC,WAAD,EAAW,WAAU,SAAU,CAAA;MAE3B,CAAA;KACL;;IACL,oBAAC,OAAD;KAAK,WAAU;KACZ,UAAA;IACE,CAAA;IACL,oBAAC,OAAD;KAAK,WAAU;KACZ,UAAA;IACE,CAAA;GACF;EACL,CAAA,GAAA,oBAAC,OAAD;GACE,WAAW,GACT,gGACA,cAAc,gBAAgB,+BAChC;GACA,IAAI;GACJ,OAAO,CAAC;GAER,UAAA,oBAAC,OAAD;IAAK,WAAU;IACZ,UAAA,iBAAiB,eAAe;GAC9B,CAAA;EACF,CAAA,CACS,EAAA,CAAA;CACV,CAAA;AAEZ"}
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function DocsShell({ children }: {
3
+ children: ReactNode;
4
+ }): ReactNode;
5
+ export declare function DocsContent({ children }: {
6
+ children: ReactNode;
7
+ }): ReactNode;
8
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/site/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAa1E;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAc5E"}
@@ -0,0 +1,21 @@
1
+ import "./constants.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ // src/site/layout.tsx
4
+ function DocsShell({ children }) {
5
+ return /* @__PURE__ */ jsx("div", {
6
+ className: "docs-shell",
7
+ style: { "--sidebar-width": `260px` },
8
+ children
9
+ });
10
+ }
11
+ function DocsContent({ children }) {
12
+ return /* @__PURE__ */ jsx("div", {
13
+ "data-docs-content": "",
14
+ className: "@container md:ml-(--sidebar-width)",
15
+ style: { "--sidebar-width": `260px` },
16
+ children
17
+ });
18
+ }
19
+ export { DocsContent, DocsShell };
20
+
21
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","names":[],"sources":["../../src/site/layout.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { DOCS_SIDEBAR_WIDTH } from \"./constants\";\n\nexport function DocsShell({ children }: { children: ReactNode }): ReactNode {\n return (\n <div\n className=\"docs-shell\"\n style={\n {\n \"--sidebar-width\": `${DOCS_SIDEBAR_WIDTH}px`,\n } as React.CSSProperties\n }\n >\n {children}\n </div>\n );\n}\n\nexport function DocsContent({ children }: { children: ReactNode }): ReactNode {\n return (\n <div\n data-docs-content=\"\"\n className=\"@container md:ml-(--sidebar-width)\"\n style={\n {\n \"--sidebar-width\": `${DOCS_SIDEBAR_WIDTH}px`,\n } as React.CSSProperties\n }\n >\n {children}\n </div>\n );\n}\n"],"mappings":";;;AAGA,SAAgB,UAAU,EAAE,YAAgD;CAC1E,OACE,oBAAC,OAAD;EACE,WAAU;EACV,OACE,EACE,mBAAmB,QACrB;EAGD;CACE,CAAA;AAET;AAEA,SAAgB,YAAY,EAAE,YAAgD;CAC5E,OACE,oBAAC,OAAD;EACE,qBAAkB;EAClB,WAAU;EACV,OACE,EACE,mBAAmB,QACrB;EAGD;CACE,CAAA;AAET"}
@@ -0,0 +1,9 @@
1
+ import type { ComponentProps, ReactNode } from "react";
2
+ export declare function DocsPageShell({ toc, footer, children, mainProps, }: {
3
+ toc?: ReactNode;
4
+ footer?: ReactNode;
5
+ children: ReactNode;
6
+ mainProps?: Omit<ComponentProps<"main">, "children">;
7
+ }): import("react").JSX.Element;
8
+ export declare function DocsBody({ className, ...props }: ComponentProps<"article">): import("react").JSX.Element;
9
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/site/page.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,wBAAgB,aAAa,CAAC,EAC5B,GAAG,EACH,MAAM,EACN,QAAQ,EACR,SAAS,GACV,EAAE;IACD,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;CACtD,+BAoBA;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,SAAS,CAAC,+BAE1E"}
@@ -0,0 +1,32 @@
1
+ import { cn } from "./utils.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ // src/site/page.tsx
4
+ function DocsPageShell({ toc, footer, children, mainProps }) {
5
+ return /* @__PURE__ */ jsxs("div", {
6
+ className: "docs-layout",
7
+ children: [
8
+ /* @__PURE__ */ jsx("main", {
9
+ ...mainProps,
10
+ className: cn("mx-auto w-full max-w-(--docs-article-width) justify-self-center px-4 pt-4 pb-10 md:px-6", mainProps?.className),
11
+ children
12
+ }),
13
+ toc,
14
+ footer && /* @__PURE__ */ jsx("footer", {
15
+ className: "mx-auto w-full max-w-(--docs-article-width) justify-self-center px-4 pb-10 md:px-6",
16
+ children: /* @__PURE__ */ jsx("div", {
17
+ className: "border-t pt-6",
18
+ children: footer
19
+ })
20
+ })
21
+ ]
22
+ });
23
+ }
24
+ function DocsBody({ className, ...props }) {
25
+ return /* @__PURE__ */ jsx("article", {
26
+ ...props,
27
+ className: cn("docs-prose prose", className)
28
+ });
29
+ }
30
+ export { DocsBody, DocsPageShell };
31
+
32
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","names":[],"sources":["../../src/site/page.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\nexport function DocsPageShell({\n toc,\n footer,\n children,\n mainProps,\n}: {\n toc?: ReactNode;\n footer?: ReactNode;\n children: ReactNode;\n mainProps?: Omit<ComponentProps<\"main\">, \"children\">;\n}) {\n return (\n <div className=\"docs-layout\">\n <main\n {...mainProps}\n className={cn(\n \"mx-auto w-full max-w-(--docs-article-width) justify-self-center px-4 pt-4 pb-10 md:px-6\",\n mainProps?.className,\n )}\n >\n {children}\n </main>\n {toc}\n {footer && (\n <footer className=\"mx-auto w-full max-w-(--docs-article-width) justify-self-center px-4 pb-10 md:px-6\">\n <div className=\"border-t pt-6\">{footer}</div>\n </footer>\n )}\n </div>\n );\n}\n\nexport function DocsBody({ className, ...props }: ComponentProps<\"article\">) {\n return <article {...props} className={cn(\"docs-prose prose\", className)} />;\n}\n"],"mappings":";;;AAGA,SAAgB,cAAc,EAC5B,KACA,QACA,UACA,aAMC;CACD,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,oBAAC,QAAD;IACE,GAAI;IACJ,WAAW,GACT,2FACA,WAAW,SACb;IAEC;GACG,CAAA;GACL;GACA,UACC,oBAAC,UAAD;IAAQ,WAAU;IAChB,UAAA,oBAAC,OAAD;KAAK,WAAU;KAAiB,UAAA;IAAY,CAAA;GACtC,CAAA;EAEP;;AAET;AAEA,SAAgB,SAAS,EAAE,WAAW,GAAG,SAAoC;CAC3E,OAAO,oBAAC,WAAD;EAAS,GAAI;EAAO,WAAW,GAAG,oBAAoB,SAAS;CAAI,CAAA;AAC5E"}
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function DocsPagerNavigation({ previous, next, children, }: {
3
+ previous?: {
4
+ url: string;
5
+ name?: ReactNode;
6
+ } | undefined;
7
+ next?: {
8
+ url: string;
9
+ name?: ReactNode;
10
+ } | undefined;
11
+ children?: ReactNode;
12
+ }): import("react").JSX.Element;
13
+ //# sourceMappingURL=pager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pager.d.ts","sourceRoot":"","sources":["../../src/site/pager.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IACzD,IAAI,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,+BAoCA"}
@@ -0,0 +1,36 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import Link from "next/link";
3
+ import { ChevronLeft, ChevronRight } from "lucide-react";
4
+ // src/site/pager.tsx
5
+ const pagerLabel = (direction, name) => typeof name === "string" && name !== "" ? `${direction}: ${name}` : `${direction} page`;
6
+ function DocsPagerNavigation({ previous, next, children }) {
7
+ const buttonClass = "flex size-7 items-center justify-center rounded-md bg-muted/50 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground sm:size-8";
8
+ const disabledClass = "flex size-7 items-center justify-center rounded-md bg-muted/30 text-muted-foreground/40 cursor-not-allowed sm:size-8";
9
+ return /* @__PURE__ */ jsxs("div", {
10
+ className: "flex items-center gap-1",
11
+ children: [
12
+ previous ? /* @__PURE__ */ jsx(Link, {
13
+ href: previous.url,
14
+ className: buttonClass,
15
+ "aria-label": pagerLabel("Previous", previous.name),
16
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-4" })
17
+ }) : /* @__PURE__ */ jsx("div", {
18
+ className: disabledClass,
19
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-4" })
20
+ }),
21
+ next ? /* @__PURE__ */ jsx(Link, {
22
+ href: next.url,
23
+ className: buttonClass,
24
+ "aria-label": pagerLabel("Next", next.name),
25
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-4" })
26
+ }) : /* @__PURE__ */ jsx("div", {
27
+ className: disabledClass,
28
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-4" })
29
+ }),
30
+ children
31
+ ]
32
+ });
33
+ }
34
+ export { DocsPagerNavigation };
35
+
36
+ //# sourceMappingURL=pager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pager.js","names":[],"sources":["../../src/site/pager.tsx"],"sourcesContent":["import Link from \"next/link\";\nimport type { ReactNode } from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nconst pagerLabel = (direction: \"Previous\" | \"Next\", name: ReactNode) =>\n typeof name === \"string\" && name !== \"\"\n ? `${direction}: ${name}`\n : `${direction} page`;\n\nexport function DocsPagerNavigation({\n previous,\n next,\n children,\n}: {\n previous?: { url: string; name?: ReactNode } | undefined;\n next?: { url: string; name?: ReactNode } | undefined;\n children?: ReactNode;\n}) {\n const buttonClass =\n \"flex size-7 items-center justify-center rounded-md bg-muted/50 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground sm:size-8\";\n const disabledClass =\n \"flex size-7 items-center justify-center rounded-md bg-muted/30 text-muted-foreground/40 cursor-not-allowed sm:size-8\";\n return (\n <div className=\"flex items-center gap-1\">\n {previous ? (\n <Link\n href={previous.url}\n className={buttonClass}\n aria-label={pagerLabel(\"Previous\", previous.name)}\n >\n <ChevronLeft className=\"size-4\" />\n </Link>\n ) : (\n <div className={disabledClass}>\n <ChevronLeft className=\"size-4\" />\n </div>\n )}\n {next ? (\n <Link\n href={next.url}\n className={buttonClass}\n aria-label={pagerLabel(\"Next\", next.name)}\n >\n <ChevronRight className=\"size-4\" />\n </Link>\n ) : (\n <div className={disabledClass}>\n <ChevronRight className=\"size-4\" />\n </div>\n )}\n {children}\n </div>\n );\n}\n"],"mappings":";;;;AAIA,MAAM,cAAc,WAAgC,SAClD,OAAO,SAAS,YAAY,SAAS,KACjC,GAAG,UAAU,IAAI,SACjB,GAAG,UAAU;AAEnB,SAAgB,oBAAoB,EAClC,UACA,MACA,YAKC;CACD,MAAM,cACJ;CACF,MAAM,gBACJ;CACF,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACG,WACC,oBAAC,MAAD;IACE,MAAM,SAAS;IACf,WAAW;IACX,cAAY,WAAW,YAAY,SAAS,IAAI;IAEhD,UAAA,oBAAC,aAAD,EAAa,WAAU,SAAU,CAAA;GAC7B,CAAA,IAEN,oBAAC,OAAD;IAAK,WAAW;IACd,UAAA,oBAAC,aAAD,EAAa,WAAU,SAAU,CAAA;GAC9B,CAAA;GAEN,OACC,oBAAC,MAAD;IACE,MAAM,KAAK;IACX,WAAW;IACX,cAAY,WAAW,QAAQ,KAAK,IAAI;IAExC,UAAA,oBAAC,cAAD,EAAc,WAAU,SAAU,CAAA;GAC9B,CAAA,IAEN,oBAAC,OAAD;IAAK,WAAW;IACd,UAAA,oBAAC,cAAD,EAAc,WAAU,SAAU,CAAA;GAC/B,CAAA;GAEN;EACE;;AAET"}
@@ -0,0 +1,13 @@
1
+ import { type ReactNode } from "react";
2
+ import type { DocsNode, DocsFolder } from "./tree.js";
3
+ export declare function DocsSidebarNavigation({ sections, pathname, activeSectionId, isVisible, onNavigate, banner, footer, platform, }: {
4
+ sections: readonly DocsFolder[];
5
+ pathname: string;
6
+ activeSectionId: string | null;
7
+ isVisible?: (node: DocsNode) => boolean;
8
+ onNavigate: () => void;
9
+ banner?: ReactNode;
10
+ footer?: ReactNode;
11
+ platform?: string;
12
+ }): import("react").JSX.Element;
13
+ //# sourceMappingURL=sidebar-navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-navigation.d.ts","sourceRoot":"","sources":["../../src/site/sidebar-navigation.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAe;AAwKnD,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,SAAmB,EACnB,UAAU,EACV,MAAM,EACN,MAAM,EACN,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;IACxC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,+BA4EA"}
@@ -0,0 +1,185 @@
1
+ "use client";
2
+ import { cn } from "./utils.js";
3
+ import { findActivePath } from "./tree.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import Link from "next/link";
6
+ import { ChevronDown } from "lucide-react";
7
+ import { useEffect, useMemo, useRef, useState } from "react";
8
+ import { AnimatePresence, LazyMotion, domAnimation } from "motion/react";
9
+ import * as m from "motion/react-m";
10
+ // src/site/sidebar-navigation.tsx
11
+ function SectionItem({ item, onNavigate, pathname, activePath, isVisible }) {
12
+ if (!isVisible(item)) return null;
13
+ if (item.type === "separator") return /* @__PURE__ */ jsx("p", {
14
+ className: "text-muted-foreground mt-4 mb-1 px-2 text-xs font-medium first:mt-1",
15
+ children: item.name
16
+ });
17
+ if (item.type === "folder") {
18
+ const isActive = item.index && pathname === item.index.url;
19
+ const containsActive = activePath.has(item);
20
+ const hasChildren = item.children.length > 0;
21
+ return /* @__PURE__ */ jsxs("div", { children: [item.index ? /* @__PURE__ */ jsxs(Link, {
22
+ href: item.index.url,
23
+ onClick: onNavigate,
24
+ "data-active": isActive ? "true" : "false",
25
+ className: cn("flex items-center gap-2 rounded-md px-2 py-1.5 text-[13px] transition-colors duration-150", isActive ? "bg-accent/20 text-foreground dark:bg-accent/50 font-medium" : "text-muted-foreground hover:bg-accent/30 hover:text-foreground/90 dark:hover:bg-accent/40"),
26
+ children: [item.icon, /* @__PURE__ */ jsx("span", {
27
+ className: "truncate",
28
+ children: item.name
29
+ })]
30
+ }) : /* @__PURE__ */ jsxs("p", {
31
+ className: "text-muted-foreground mt-3 mb-1 flex items-center gap-2 px-2 text-xs font-medium first:mt-1",
32
+ children: [item.icon, item.name]
33
+ }), hasChildren && (containsActive || !item.index) && /* @__PURE__ */ jsx("div", {
34
+ className: "border-border/50 ml-2 flex flex-col gap-0.5 border-l pl-2",
35
+ children: item.children.map((child) => /* @__PURE__ */ jsx(SectionItem, {
36
+ item: child,
37
+ onNavigate,
38
+ pathname,
39
+ activePath,
40
+ isVisible
41
+ }, child.$id))
42
+ })] });
43
+ }
44
+ const isActive = pathname === item.url;
45
+ return /* @__PURE__ */ jsxs(Link, {
46
+ href: item.url,
47
+ onClick: onNavigate,
48
+ "data-active": isActive ? "true" : "false",
49
+ className: cn("flex items-center gap-2 rounded-md px-2 py-1.5 text-[13px] transition-colors duration-150", isActive ? "bg-accent/20 text-foreground dark:bg-accent/50 font-medium" : "text-muted-foreground hover:bg-accent/30 hover:text-foreground/90 dark:hover:bg-accent/40"),
50
+ children: [item.icon, /* @__PURE__ */ jsx("span", {
51
+ className: "truncate",
52
+ children: item.name
53
+ })]
54
+ });
55
+ }
56
+ function SidebarSection({ folder, isOpen, onToggle, onNavigate, pathname, activePath, isVisible }) {
57
+ const isActive = folder.index && pathname === folder.index.url;
58
+ return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("button", {
59
+ type: "button",
60
+ onClick: onToggle,
61
+ "aria-expanded": isOpen,
62
+ className: cn("hover:bg-accent/30 dark:hover:bg-accent/40 flex w-full items-center gap-2 rounded-md px-2 py-2 text-left text-[13px] transition-colors duration-150", isActive || isOpen ? "text-foreground font-medium" : "text-muted-foreground/90"),
63
+ children: [
64
+ /* @__PURE__ */ jsx("span", {
65
+ className: "text-muted-foreground flex size-4 shrink-0 items-center justify-center",
66
+ children: folder.icon
67
+ }),
68
+ /* @__PURE__ */ jsx("span", {
69
+ className: "flex-1 truncate",
70
+ children: folder.name
71
+ }),
72
+ /* @__PURE__ */ jsx(ChevronDown, { className: cn("text-muted-foreground/60 size-3.5 shrink-0 transition-transform duration-200", !isOpen && "-rotate-90") })
73
+ ]
74
+ }), /* @__PURE__ */ jsx(AnimatePresence, {
75
+ initial: false,
76
+ children: isOpen && /* @__PURE__ */ jsx(m.div, {
77
+ initial: {
78
+ height: 0,
79
+ opacity: 0
80
+ },
81
+ animate: {
82
+ height: "auto",
83
+ opacity: 1
84
+ },
85
+ exit: {
86
+ height: 0,
87
+ opacity: 0
88
+ },
89
+ transition: {
90
+ duration: .22,
91
+ ease: [
92
+ .16,
93
+ 1,
94
+ .3,
95
+ 1
96
+ ]
97
+ },
98
+ className: "overflow-hidden",
99
+ children: /* @__PURE__ */ jsx("div", {
100
+ className: "border-border/50 mt-0.5 mb-1 ml-4 flex flex-col gap-0.5 border-l pl-2",
101
+ children: folder.children.map((child) => /* @__PURE__ */ jsx(SectionItem, {
102
+ item: child,
103
+ onNavigate,
104
+ pathname,
105
+ activePath,
106
+ isVisible
107
+ }, child.$id))
108
+ })
109
+ })
110
+ })] });
111
+ }
112
+ const visible = () => true;
113
+ function DocsSidebarNavigation({ sections, pathname, activeSectionId, isVisible = visible, onNavigate, banner, footer, platform }) {
114
+ const navRef = useRef(null);
115
+ const activePath = useMemo(() => new Set(findActivePath(sections, pathname)), [sections, pathname]);
116
+ const [openSectionId, setOpenSectionId] = useState(activeSectionId);
117
+ const [sectionScope, setSectionScope] = useState({
118
+ activeSectionId,
119
+ pathname
120
+ });
121
+ if (sectionScope.activeSectionId !== activeSectionId || sectionScope.pathname !== pathname) {
122
+ setSectionScope({
123
+ activeSectionId,
124
+ pathname
125
+ });
126
+ if (activeSectionId) setOpenSectionId(activeSectionId);
127
+ }
128
+ useEffect(() => {
129
+ if (openSectionId !== activeSectionId) return;
130
+ const timer = setTimeout(() => {
131
+ const nav = navRef.current;
132
+ if (!nav) return;
133
+ const active = nav.querySelector("[data-active='true']");
134
+ if (!active) return;
135
+ const navRect = nav.getBoundingClientRect();
136
+ const elRect = active.getBoundingClientRect();
137
+ if (elRect.top < navRect.top || elRect.bottom > navRect.bottom) active.scrollIntoView({
138
+ block: "center",
139
+ behavior: "smooth"
140
+ });
141
+ }, 260);
142
+ return () => clearTimeout(timer);
143
+ }, [
144
+ pathname,
145
+ openSectionId,
146
+ activeSectionId
147
+ ]);
148
+ return /* @__PURE__ */ jsxs("div", {
149
+ className: "flex h-full flex-col",
150
+ children: [
151
+ banner && /* @__PURE__ */ jsx("div", {
152
+ className: "shrink-0 px-3 pt-4 lg:hidden",
153
+ children: banner
154
+ }),
155
+ /* @__PURE__ */ jsx("nav", {
156
+ "aria-label": "Docs",
157
+ ref: navRef,
158
+ "data-docs-platform": platform,
159
+ className: cn("sidebar-tree-content flex min-h-0 flex-1 flex-col gap-0.5 overflow-x-hidden overflow-y-auto px-3 pt-2 pb-4 lg:pt-4"),
160
+ children: /* @__PURE__ */ jsx(LazyMotion, {
161
+ features: domAnimation,
162
+ children: sections.map((section) => /* @__PURE__ */ jsx(SidebarSection, {
163
+ folder: section,
164
+ isOpen: openSectionId === section.$id,
165
+ onToggle: () => {
166
+ const id = section.$id ?? null;
167
+ setOpenSectionId(openSectionId !== id ? id : null);
168
+ },
169
+ onNavigate,
170
+ pathname,
171
+ activePath,
172
+ isVisible
173
+ }, section.$id))
174
+ })
175
+ }),
176
+ footer && /* @__PURE__ */ jsx("div", {
177
+ className: "border-border/50 flex shrink-0 items-center gap-1 border-t px-3 py-2",
178
+ children: footer
179
+ })
180
+ ]
181
+ });
182
+ }
183
+ export { DocsSidebarNavigation };
184
+
185
+ //# sourceMappingURL=sidebar-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-navigation.js","names":[],"sources":["../../src/site/sidebar-navigation.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport Link from \"next/link\";\nimport type { DocsNode, DocsFolder } from \"./tree\";\nimport { findActivePath } from \"./tree\";\nimport { ChevronDown } from \"lucide-react\";\nimport { AnimatePresence, domAnimation, LazyMotion } from \"motion/react\";\nimport * as m from \"motion/react-m\";\nimport { cn } from \"./utils\";\n\nfunction SectionItem({\n item,\n onNavigate,\n pathname,\n activePath,\n isVisible,\n}: {\n item: DocsNode;\n onNavigate: () => void;\n pathname: string;\n activePath: ReadonlySet<DocsNode>;\n isVisible: (node: DocsNode) => boolean;\n}) {\n if (!isVisible(item)) return null;\n\n if (item.type === \"separator\") {\n return (\n <p className=\"text-muted-foreground mt-4 mb-1 px-2 text-xs font-medium first:mt-1\">\n {item.name}\n </p>\n );\n }\n\n if (item.type === \"folder\") {\n const isActive = item.index && pathname === item.index.url;\n const containsActive = activePath.has(item);\n const hasChildren = item.children.length > 0;\n\n return (\n <div>\n {item.index ? (\n <Link\n href={item.index.url}\n onClick={onNavigate}\n data-active={isActive ? \"true\" : \"false\"}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2 py-1.5 text-[13px] transition-colors duration-150\",\n isActive\n ? \"bg-accent/20 text-foreground dark:bg-accent/50 font-medium\"\n : \"text-muted-foreground hover:bg-accent/30 hover:text-foreground/90 dark:hover:bg-accent/40\",\n )}\n >\n {item.icon}\n <span className=\"truncate\">{item.name}</span>\n </Link>\n ) : (\n <p className=\"text-muted-foreground mt-3 mb-1 flex items-center gap-2 px-2 text-xs font-medium first:mt-1\">\n {item.icon}\n {item.name}\n </p>\n )}\n {hasChildren && (containsActive || !item.index) && (\n <div className=\"border-border/50 ml-2 flex flex-col gap-0.5 border-l pl-2\">\n {item.children.map((child) => (\n <SectionItem\n key={child.$id}\n item={child}\n onNavigate={onNavigate}\n pathname={pathname}\n activePath={activePath}\n isVisible={isVisible}\n />\n ))}\n </div>\n )}\n </div>\n );\n }\n\n const isActive = pathname === item.url;\n return (\n <Link\n href={item.url}\n onClick={onNavigate}\n data-active={isActive ? \"true\" : \"false\"}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2 py-1.5 text-[13px] transition-colors duration-150\",\n isActive\n ? \"bg-accent/20 text-foreground dark:bg-accent/50 font-medium\"\n : \"text-muted-foreground hover:bg-accent/30 hover:text-foreground/90 dark:hover:bg-accent/40\",\n )}\n >\n {item.icon}\n <span className=\"truncate\">{item.name}</span>\n </Link>\n );\n}\n\nfunction SidebarSection({\n folder,\n isOpen,\n onToggle,\n onNavigate,\n pathname,\n activePath,\n isVisible,\n}: {\n folder: DocsFolder;\n isOpen: boolean;\n onToggle: () => void;\n onNavigate: () => void;\n pathname: string;\n activePath: ReadonlySet<DocsNode>;\n isVisible: (node: DocsNode) => boolean;\n}) {\n const isActive = folder.index && pathname === folder.index.url;\n\n return (\n <div>\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={isOpen}\n className={cn(\n \"hover:bg-accent/30 dark:hover:bg-accent/40 flex w-full items-center gap-2 rounded-md px-2 py-2 text-left text-[13px] transition-colors duration-150\",\n isActive || isOpen\n ? \"text-foreground font-medium\"\n : \"text-muted-foreground/90\",\n )}\n >\n <span className=\"text-muted-foreground flex size-4 shrink-0 items-center justify-center\">\n {folder.icon}\n </span>\n <span className=\"flex-1 truncate\">{folder.name}</span>\n <ChevronDown\n className={cn(\n \"text-muted-foreground/60 size-3.5 shrink-0 transition-transform duration-200\",\n !isOpen && \"-rotate-90\",\n )}\n />\n </button>\n <AnimatePresence initial={false}>\n {isOpen && (\n <m.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.22, ease: [0.16, 1, 0.3, 1] }}\n className=\"overflow-hidden\"\n >\n <div className=\"border-border/50 mt-0.5 mb-1 ml-4 flex flex-col gap-0.5 border-l pl-2\">\n {folder.children.map((child) => (\n <SectionItem\n key={child.$id}\n item={child}\n onNavigate={onNavigate}\n pathname={pathname}\n activePath={activePath}\n isVisible={isVisible}\n />\n ))}\n </div>\n </m.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nconst visible = () => true;\n\nexport function DocsSidebarNavigation({\n sections,\n pathname,\n activeSectionId,\n isVisible = visible,\n onNavigate,\n banner,\n footer,\n platform,\n}: {\n sections: readonly DocsFolder[];\n pathname: string;\n activeSectionId: string | null;\n isVisible?: (node: DocsNode) => boolean;\n onNavigate: () => void;\n banner?: ReactNode;\n footer?: ReactNode;\n platform?: string;\n}) {\n const navRef = useRef<HTMLElement>(null);\n const activePath = useMemo(\n () => new Set(findActivePath(sections, pathname)),\n [sections, pathname],\n );\n\n const [openSectionId, setOpenSectionId] = useState<string | null>(\n activeSectionId,\n );\n\n const [sectionScope, setSectionScope] = useState({\n activeSectionId,\n pathname,\n });\n\n if (\n sectionScope.activeSectionId !== activeSectionId ||\n sectionScope.pathname !== pathname\n ) {\n setSectionScope({ activeSectionId, pathname });\n if (activeSectionId) setOpenSectionId(activeSectionId);\n }\n\n useEffect(() => {\n if (openSectionId !== activeSectionId) return;\n const timer = setTimeout(() => {\n const nav = navRef.current;\n if (!nav) return;\n const active = nav.querySelector<HTMLElement>(\"[data-active='true']\");\n if (!active) return;\n const navRect = nav.getBoundingClientRect();\n const elRect = active.getBoundingClientRect();\n if (elRect.top < navRect.top || elRect.bottom > navRect.bottom) {\n active.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n }\n }, 260);\n return () => clearTimeout(timer);\n }, [pathname, openSectionId, activeSectionId]);\n\n return (\n <div className=\"flex h-full flex-col\">\n {banner && <div className=\"shrink-0 px-3 pt-4 lg:hidden\">{banner}</div>}\n <nav\n aria-label=\"Docs\"\n ref={navRef}\n data-docs-platform={platform}\n className={cn(\n \"sidebar-tree-content flex min-h-0 flex-1 flex-col gap-0.5 overflow-x-hidden overflow-y-auto px-3 pt-2 pb-4 lg:pt-4\",\n )}\n >\n <LazyMotion features={domAnimation}>\n {sections.map((section) => (\n <SidebarSection\n key={section.$id}\n folder={section}\n isOpen={openSectionId === section.$id}\n onToggle={() => {\n const id = section.$id ?? null;\n setOpenSectionId(openSectionId !== id ? id : null);\n }}\n onNavigate={onNavigate}\n pathname={pathname}\n activePath={activePath}\n isVisible={isVisible}\n />\n ))}\n </LazyMotion>\n </nav>\n {footer && (\n <div className=\"border-border/50 flex shrink-0 items-center gap-1 border-t px-3 py-2\">\n {footer}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from "react";
2
+ export declare const DOCS_SIDEBAR_ID = "docs-sidebar";
3
+ interface DocsSidebarContextValue {
4
+ open: boolean;
5
+ setOpen: (open: boolean) => void;
6
+ toggle: () => void;
7
+ }
8
+ export declare function useDocsSidebar(): DocsSidebarContextValue;
9
+ export declare function DocsSidebarProvider({ children }: {
10
+ children: ReactNode;
11
+ }): import("react").JSX.Element;
12
+ export declare function DocsSidebar({ children }: {
13
+ children: ReactNode;
14
+ }): import("react").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/site/sidebar.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAU9C,UAAU,uBAAuB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAID,wBAAgB,cAAc,4BAM7B;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BASxE;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BA0BhE"}
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import "./constants.js";
3
+ import { cn } from "./utils.js";
4
+ import { jsx } from "react/jsx-runtime";
5
+ import { createContext, useCallback, useContext, useState, useSyncExternalStore } from "react";
6
+ // src/site/sidebar.tsx
7
+ const DOCS_SIDEBAR_ID = "docs-sidebar";
8
+ const subscribeToViewport = (onChange) => {
9
+ const viewport = window.matchMedia("(max-width: 767px)");
10
+ viewport.addEventListener("change", onChange);
11
+ return () => viewport.removeEventListener("change", onChange);
12
+ };
13
+ const isMobileViewport = () => window.innerWidth < 768;
14
+ const serverViewport = () => false;
15
+ const DocsSidebarContext = createContext(null);
16
+ function useDocsSidebar() {
17
+ const ctx = useContext(DocsSidebarContext);
18
+ if (!ctx) throw new Error("useDocsSidebar must be used within DocsSidebarProvider");
19
+ return ctx;
20
+ }
21
+ function DocsSidebarProvider({ children }) {
22
+ const [open, setOpen] = useState(false);
23
+ const toggle = useCallback(() => setOpen((prev) => !prev), []);
24
+ return /* @__PURE__ */ jsx(DocsSidebarContext.Provider, {
25
+ value: {
26
+ open,
27
+ setOpen,
28
+ toggle
29
+ },
30
+ children
31
+ });
32
+ }
33
+ function DocsSidebar({ children }) {
34
+ const { open } = useDocsSidebar();
35
+ const isMobile = useSyncExternalStore(subscribeToViewport, isMobileViewport, serverViewport);
36
+ return /* @__PURE__ */ jsx("aside", {
37
+ id: DOCS_SIDEBAR_ID,
38
+ inert: !open && isMobile,
39
+ className: cn("bg-background fixed inset-x-0 top-12 bottom-0 z-40 transition-[opacity,visibility] duration-200", open ? "opacity-100" : "pointer-events-none opacity-0 max-md:invisible", "md:pointer-events-auto md:visible md:right-auto md:left-0 md:z-30 md:w-(--sidebar-width) md:opacity-100"),
40
+ style: { "--sidebar-width": `260px` },
41
+ children
42
+ });
43
+ }
44
+ export { DOCS_SIDEBAR_ID, DocsSidebar, DocsSidebarProvider, useDocsSidebar };
45
+
46
+ //# sourceMappingURL=sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.js","names":[],"sources":["../../src/site/sidebar.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"./utils\";\nimport { DOCS_SIDEBAR_WIDTH } from \"./constants\";\n\nexport const DOCS_SIDEBAR_ID = \"docs-sidebar\";\n\nconst subscribeToViewport = (onChange: () => void) => {\n const viewport = window.matchMedia(\"(max-width: 767px)\");\n viewport.addEventListener(\"change\", onChange);\n return () => viewport.removeEventListener(\"change\", onChange);\n};\nconst isMobileViewport = () => window.innerWidth < 768;\nconst serverViewport = () => false;\n\ninterface DocsSidebarContextValue {\n open: boolean;\n setOpen: (open: boolean) => void;\n toggle: () => void;\n}\n\nconst DocsSidebarContext = createContext<DocsSidebarContextValue | null>(null);\n\nexport function useDocsSidebar() {\n const ctx = useContext(DocsSidebarContext);\n if (!ctx) {\n throw new Error(\"useDocsSidebar must be used within DocsSidebarProvider\");\n }\n return ctx;\n}\n\nexport function DocsSidebarProvider({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false);\n const toggle = useCallback(() => setOpen((prev) => !prev), []);\n\n return (\n <DocsSidebarContext.Provider value={{ open, setOpen, toggle }}>\n {children}\n </DocsSidebarContext.Provider>\n );\n}\n\nexport function DocsSidebar({ children }: { children: ReactNode }) {\n const { open } = useDocsSidebar();\n const isMobile = useSyncExternalStore(\n subscribeToViewport,\n isMobileViewport,\n serverViewport,\n );\n\n return (\n <aside\n id={DOCS_SIDEBAR_ID}\n inert={!open && isMobile}\n className={cn(\n \"bg-background fixed inset-x-0 top-12 bottom-0 z-40 transition-[opacity,visibility] duration-200\",\n open ? \"opacity-100\" : \"pointer-events-none opacity-0 max-md:invisible\",\n \"md:pointer-events-auto md:visible md:right-auto md:left-0 md:z-30 md:w-(--sidebar-width) md:opacity-100\",\n )}\n style={\n {\n \"--sidebar-width\": `${DOCS_SIDEBAR_WIDTH}px`,\n } as React.CSSProperties\n }\n >\n {children}\n </aside>\n );\n}\n"],"mappings":";;;;;;AAaA,MAAa,kBAAkB;AAE/B,MAAM,uBAAuB,aAAyB;CACpD,MAAM,WAAW,OAAO,WAAW,oBAAoB;CACvD,SAAS,iBAAiB,UAAU,QAAQ;CAC5C,aAAa,SAAS,oBAAoB,UAAU,QAAQ;AAC9D;AACA,MAAM,yBAAyB,OAAO,aAAa;AACnD,MAAM,uBAAuB;AAQ7B,MAAM,qBAAqB,cAA8C,IAAI;AAE7E,SAAgB,iBAAiB;CAC/B,MAAM,MAAM,WAAW,kBAAkB;CACzC,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,wDAAwD;CAE1E,OAAO;AACT;AAEA,SAAgB,oBAAoB,EAAE,YAAqC;CACzE,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,SAAS,kBAAkB,SAAS,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;CAE7D,OACE,oBAAC,mBAAmB,UAApB;EAA6B,OAAO;GAAE;GAAM;GAAS;EAAO;EACzD;CAC0B,CAAA;AAEjC;AAEA,SAAgB,YAAY,EAAE,YAAqC;CACjE,MAAM,EAAE,SAAS,eAAe;CAChC,MAAM,WAAW,qBACf,qBACA,kBACA,cACF;CAEA,OACE,oBAAC,SAAD;EACE,IAAI;EACJ,OAAO,CAAC,QAAQ;EAChB,WAAW,GACT,mGACA,OAAO,gBAAgB,kDACvB,yGACF;EACA,OACE,EACE,mBAAmB,QACrB;EAGD;CACI,CAAA;AAEX"}
@@ -0,0 +1,12 @@
1
+ import { type ReactNode } from "react";
2
+ type TOCItem = {
3
+ title: ReactNode;
4
+ url: string;
5
+ depth: number;
6
+ };
7
+ export declare function DocsTableOfContents({ items, children, }: {
8
+ items: TOCItem[];
9
+ children?: ReactNode;
10
+ }): import("react").JSX.Element | null;
11
+ export {};
12
+ //# sourceMappingURL=toc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toc.d.ts","sourceRoot":"","sources":["../../src/site/toc.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGpE,KAAK,OAAO,GAAG;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAWF,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,sCA2FA"}