boltdocs 3.2.2 → 3.3.0

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 (155) hide show
  1. package/bin/boltdocs.js +20 -1
  2. package/bin/preloader.mjs +28 -0
  3. package/dist/{adapters-ByYY44Zy.mjs → adapters-BmB4TKCc.mjs} +1 -1
  4. package/dist/{adapters-DvmtpdSF.cjs → adapters-Cp1Maurn.cjs} +1 -1
  5. package/dist/audit-CLXjMzwQ.mjs +11 -0
  6. package/dist/audit-COgjnQ5n.cjs +11 -0
  7. package/dist/build-BS2hefiL.cjs +6 -0
  8. package/dist/build-C5mNh9D-.mjs +6 -0
  9. package/dist/cache-CJE9nWLE.cjs +6 -0
  10. package/dist/cache-OY4HzIXl.mjs +6 -0
  11. package/dist/callout-oI_LCbxS.d.ts +71 -0
  12. package/dist/callout-plqx9Dw-.d.cts +71 -0
  13. package/dist/client/index.cjs +1265 -569
  14. package/dist/client/index.d.cts +3 -542
  15. package/dist/client/index.d.ts +3 -542
  16. package/dist/client/index.js +1167 -521
  17. package/dist/client/mdx.cjs +1 -1
  18. package/dist/client/mdx.d.cts +24 -2
  19. package/dist/client/mdx.d.ts +24 -2
  20. package/dist/client/mdx.js +1 -1
  21. package/dist/client/primitives.cjs +14 -4
  22. package/dist/client/primitives.d.cts +281 -38
  23. package/dist/client/primitives.d.ts +281 -38
  24. package/dist/client/primitives.js +5 -5
  25. package/dist/client/router.cjs +49 -0
  26. package/dist/client/router.d.cts +3 -0
  27. package/dist/client/router.d.ts +3 -0
  28. package/dist/client/router.js +8 -0
  29. package/dist/client/theme/reset.css +40 -4
  30. package/dist/{config-BpzaPsJj.d.cts → config-BoRlz0Ca.d.mts} +157 -14
  31. package/dist/{config-xtS0ZkMm.d.mts → config-CTsX_tGM.d.cts} +157 -14
  32. package/dist/config-Ceib-AOH.cjs +7 -0
  33. package/dist/config-DGLQsy7y.mjs +7 -0
  34. package/dist/{package-CH2ChQqw.cjs → config-files-BYHDOrKn.mjs} +1 -1
  35. package/dist/config-files-D9cdBMl2.cjs +6 -0
  36. package/dist/config-jJh8WYJI.cjs +6 -0
  37. package/dist/csp-C4LmN1ko.cjs +6 -0
  38. package/dist/csp-D6JEOqKh.mjs +6 -0
  39. package/dist/dev-Ch3hEe5Y.cjs +6 -0
  40. package/dist/dev-QPNxysrd.mjs +6 -0
  41. package/dist/{docs-layout-BdtZ9z6s.js → docs-layout-CbZ7LDRe.js} +504 -249
  42. package/dist/{docs-layout-CFWI15Id.cjs → docs-layout-vzfXed1Q.cjs} +516 -254
  43. package/dist/{doctor-BBtmNJE0.cjs → doctor-B1_YL0Wt.cjs} +1 -1
  44. package/dist/doctor-C7whl4ED.cjs +6 -0
  45. package/dist/doctor-DmQnml2k.mjs +6 -0
  46. package/dist/{generator-COepVWGi.cjs → generator-BlW45ST7.cjs} +5 -3
  47. package/dist/{generator-CcOBN5vI.mjs → generator-BwknNejd.mjs} +5 -3
  48. package/dist/{handler-XX7cLTqe.cjs → handler-CDEoKARD.cjs} +2 -2
  49. package/dist/{handler-DzQae4eA.mjs → handler-D7UyZlPm.mjs} +2 -2
  50. package/dist/{image-Bz87fCla.js → image-B-NDSDuY.js} +129 -11
  51. package/dist/{image-C4TlpMHn.cjs → image-Hnaa2bJd.cjs} +175 -9
  52. package/dist/index-C56bL-A-.d.cts +1344 -0
  53. package/dist/{sidebar-COTaMHR-.d.ts → index-CPUUKzxD.d.cts} +344 -327
  54. package/dist/{sidebar-CrEdJuHX.d.cts → index-Ci4kfOHF.d.ts} +344 -327
  55. package/dist/index-Cu9H6CRa.d.ts +1344 -0
  56. package/dist/link-CgdI6O2o.js +872 -0
  57. package/dist/{link-D1Gjkb-2.cjs → link-vZjmD-es.cjs} +406 -223
  58. package/dist/{mdx-BuO6a1f7.js → mdx-BRT71V5Q.js} +211 -168
  59. package/dist/{mdx-CD-tSjRG.cjs → mdx-D0Absdq5.cjs} +225 -169
  60. package/dist/native-BNCY7PRF.cjs +6 -0
  61. package/dist/native-Di9Fnfrv.mjs +6 -0
  62. package/dist/native-Kre2T5eS.cjs +6 -0
  63. package/dist/node/cache.cjs +1 -1
  64. package/dist/node/cache.d.cts +19 -3
  65. package/dist/node/cache.d.mts +19 -3
  66. package/dist/node/cache.mjs +1 -1
  67. package/dist/node/cli-entry.cjs +1 -9
  68. package/dist/node/cli-entry.mjs +1 -9
  69. package/dist/node/index.cjs +1 -1
  70. package/dist/node/index.d.cts +245 -17
  71. package/dist/node/index.d.mts +246 -18
  72. package/dist/node/index.mjs +1 -1
  73. package/dist/node/mdx/shiki-adapter.cjs +1 -1
  74. package/dist/node/mdx/shiki-adapter.d.cts +24 -3
  75. package/dist/node/mdx/shiki-adapter.d.mts +24 -2
  76. package/dist/node/mdx/shiki-adapter.mjs +1 -1
  77. package/dist/node-Du5UL5wo.mjs +23 -0
  78. package/dist/node-DunuGqyp.cjs +23 -0
  79. package/dist/{package-DSSB8B5L.mjs → package-DA848keM.mjs} +1 -1
  80. package/dist/package-wplzySjz.cjs +6 -0
  81. package/dist/pages-external-BBw8ObVK.mjs +6 -0
  82. package/dist/pages-external-DPiPFxxP.cjs +6 -0
  83. package/dist/parser-BqTOsEUa.cjs +6 -0
  84. package/dist/parser-CGMY2lJ7.mjs +6 -0
  85. package/dist/plugin-BcTzvHAJ.mjs +69 -0
  86. package/dist/plugin-TulVMt1z.cjs +69 -0
  87. package/dist/plugin-context-C-l90hFt.cjs +15 -0
  88. package/dist/plugin-context-wqHNSZum.mjs +15 -0
  89. package/dist/plugin-lifecycle-B1BzSHdn.cjs +6 -0
  90. package/dist/resolve-B7vWOd8R.cjs +6 -0
  91. package/dist/resolve-C2kKnk_5.mjs +6 -0
  92. package/dist/resolve-It1Iug83.cjs +6 -0
  93. package/dist/resolve-YdTrt_FG.mjs +6 -0
  94. package/dist/router-C3kygdRK.cjs +1285 -0
  95. package/dist/router-CZBxMRAH.js +987 -0
  96. package/dist/routes-BL4y79tb.mjs +6 -0
  97. package/dist/routes-C2nPecwu.cjs +6 -0
  98. package/dist/routes-U9L8psZ9.cjs +6 -0
  99. package/dist/{search-dialog-DHqwjJuG.cjs → search-dialog-BCOHQGSt.cjs} +1 -1
  100. package/dist/search-dialog-Bp_P1MPP.js +481 -0
  101. package/dist/{search-dialog-DFnlx8LO.js → search-dialog-BqkzDTq2.js} +107 -57
  102. package/dist/{search-dialog-BRFno7HD.cjs → search-dialog-CIeIUhAn.cjs} +218 -43
  103. package/dist/{search-dialog-D6TvjcuV.js → search-dialog-DtmxmfEu.js} +1 -1
  104. package/dist/{search-dialog-B1NERUNx.cjs → search-dialog-x_qHU8ty.cjs} +107 -58
  105. package/dist/server/index.cjs +1 -1
  106. package/dist/server/index.d.mts +1 -1
  107. package/dist/server/index.mjs +1 -1
  108. package/dist/update-check-BKqmYfwT.cjs +11 -0
  109. package/dist/update-check-QnrVR3q1.mjs +11 -0
  110. package/dist/utils-8lzafE49.mjs +7 -0
  111. package/dist/utils-ej6_SjIZ.cjs +7 -0
  112. package/dist/virtual-modules-Ca5tHk1X.cjs +30 -0
  113. package/dist/virtual-modules-Dlgt1fP0.mjs +30 -0
  114. package/package.json +18 -16
  115. package/src/shared/mdx-path.ts +12 -0
  116. package/src/shared/structured-data.ts +145 -0
  117. package/src/shared/types.ts +220 -16
  118. package/dist/banner-BMop1KLF.d.ts +0 -100
  119. package/dist/banner-CVD0GugR.d.cts +0 -100
  120. package/dist/cache-CO4Dy2uQ.cjs +0 -6
  121. package/dist/cache-Dk53iOo6.mjs +0 -6
  122. package/dist/config-CCXp3aXO.mjs +0 -7
  123. package/dist/config-CMd4XoFq.cjs +0 -6
  124. package/dist/config-DlGoEM9D.cjs +0 -7
  125. package/dist/csp-CRp_3U7a.cjs +0 -6
  126. package/dist/csp-oTC2ygvF.mjs +0 -6
  127. package/dist/doctor-Bv16QSrI.cjs +0 -7
  128. package/dist/doctor-DOAbSaiL.mjs +0 -7
  129. package/dist/headers-Ddwek8K7.mjs +0 -6
  130. package/dist/headers-dg4SDrjY.cjs +0 -6
  131. package/dist/link-2PzgTnaP.js +0 -673
  132. package/dist/meta-loader-C4Hu9RN9.mjs +0 -6
  133. package/dist/meta-loader-Dq1zcFnh.cjs +0 -6
  134. package/dist/node-B5hu_6qj.cjs +0 -104
  135. package/dist/node-BXtqM1uH.mjs +0 -6
  136. package/dist/node-C8725aw7.mjs +0 -104
  137. package/dist/node-aD1eisrR.cjs +0 -6
  138. package/dist/pages-external-BYa4JSda.mjs +0 -6
  139. package/dist/pages-external-XkYIs-d5.cjs +0 -6
  140. package/dist/parser-DCiEWkSk.cjs +0 -8
  141. package/dist/parser-qk9FIHJ7.mjs +0 -8
  142. package/dist/plugin-CX1OZ6jB.cjs +0 -73
  143. package/dist/plugin-CgfiWaFZ.mjs +0 -73
  144. package/dist/routes-BW6zsk7Z.mjs +0 -6
  145. package/dist/routes-BgoIB5wb.cjs +0 -6
  146. package/dist/routes-CORVxc02.cjs +0 -6
  147. package/dist/search-dialog-BmxHiKwt.js +0 -312
  148. package/dist/shiki-adapter-CoQ6jyJ4.cjs +0 -6
  149. package/dist/shiki-adapter-D-aKw7PP.mjs +0 -6
  150. package/dist/utils-Crm9oPcV.mjs +0 -7
  151. package/dist/utils-D6Xtj0FZ.cjs +0 -7
  152. /package/dist/{errors-0zGHRLue.mjs → errors-N-b6Sn2G.mjs} +0 -0
  153. /package/dist/{index-1KsTDq4o.d.mts → index-lFoyzCXy.d.mts} +0 -0
  154. /package/dist/{types-generator-BXhv7Ill.cjs → types-generator-DDSA93P3.cjs} +0 -0
  155. /package/dist/{types-generator-bDPvUztF.mjs → types-generator-DG1GX1EZ.mjs} +0 -0
@@ -3,12 +3,13 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import { B as useConfig, R as icons_exports, d as Check, i as useLocalizedTo, m as ChevronRight, o as normalizePath, p as ChevronLeft, r as cn, t as Link$1 } from "./link-2PzgTnaP.js";
7
- import { Children, createContext, use, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
8
- import { useLocation } from "react-router-dom";
9
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { G as useOptionalConfig, H as icons_exports, W as useConfig, d as resolvePublicAssetUrl, h as Check, l as useRoutesContext, o as cn, s as useLocalizedTo, t as Link, u as normalizePath, v as ChevronRight } from "./link-CgdI6O2o.js";
7
+ import { E as useLocation, L as defaultNavigate, O as useNavigate, m as parseUrlReference } from "./router-CZBxMRAH.js";
8
+ import { Children, Fragment, createContext, use, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
9
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
10
  import * as RAC from "react-aria-components";
11
11
  import { Breadcrumb, Breadcrumbs, Popover } from "react-aria-components";
12
+ import DOMPurify from "isomorphic-dompurify";
12
13
  import virtualIcons from "virtual:boltdocs-icons";
13
14
  import scrollIntoView from "scroll-into-view-if-needed";
14
15
 
@@ -19,9 +20,10 @@ function UIProvider({ children }) {
19
20
  const location = useLocation();
20
21
  const toggleSidebar = () => setIsSidebarOpen((prev) => !prev);
21
22
  const closeSidebar = () => setIsSidebarOpen(false);
23
+ const { pathname } = location;
22
24
  useEffect(() => {
23
- setIsSidebarOpen(false);
24
- }, [location.pathname]);
25
+ if (pathname) setIsSidebarOpen(false);
26
+ }, [pathname]);
25
27
  return /* @__PURE__ */ jsx(UIContext.Provider, {
26
28
  value: {
27
29
  isSidebarOpen,
@@ -33,11 +35,14 @@ function UIProvider({ children }) {
33
35
  }
34
36
  function useUI() {
35
37
  const context = useContext(UIContext);
36
- if (context === void 0) return {
37
- isSidebarOpen: false,
38
- toggleSidebar: () => {},
39
- closeSidebar: () => {}
40
- };
38
+ if (context === void 0) {
39
+ if (typeof window !== "undefined") console.warn("[boltdocs] useUI() was called outside of a <UIProvider>. Make sure Navbar/Sidebar are rendered within BoltdocsShell. The mobile sidebar will not open until the provider is shared.");
40
+ return {
41
+ isSidebarOpen: false,
42
+ toggleSidebar: () => {},
43
+ closeSidebar: () => {}
44
+ };
45
+ }
41
46
  return context;
42
47
  }
43
48
 
@@ -58,17 +63,20 @@ function BreadcrumbsItem({ children, className, ...props }) {
58
63
  });
59
64
  }
60
65
  function BreadcrumbsLink({ children, href, className, ...props }) {
61
- return /* @__PURE__ */ jsx(Link$1, {
66
+ return /* @__PURE__ */ jsx(Link, {
62
67
  href,
63
68
  className: cn("cursor-pointer", className),
64
69
  ...props,
65
70
  children
66
71
  });
67
72
  }
68
- function BreadcrumbsSeparator({ className }) {
69
- return /* @__PURE__ */ jsx(ChevronRight, {
70
- size: 14,
71
- className: cn("shrink-0", className)
73
+ function BreadcrumbsSeparator({ className, separator }) {
74
+ return /* @__PURE__ */ jsx("span", {
75
+ className,
76
+ children: separator ?? /* @__PURE__ */ jsx(ChevronRight, {
77
+ size: 14,
78
+ className: "shrink-0"
79
+ })
72
80
  });
73
81
  }
74
82
  Breadcrumbs$1.Root = Breadcrumbs$1;
@@ -78,22 +86,54 @@ Breadcrumbs$1.Separator = BreadcrumbsSeparator;
78
86
 
79
87
  //#endregion
80
88
  //#region src/client/components/primitives/button-group.tsx
81
- function ButtonGroup({ children, className, vertical = false }) {
89
+ const RADIUS_BY_RADIUS = {
90
+ full: [
91
+ "[&>*:first-child]:rounded-l-full",
92
+ "[&>*:last-child]:rounded-r-full",
93
+ "[&>*:first-child]:rounded-t-full",
94
+ "[&>*:last-child]:rounded-b-full"
95
+ ],
96
+ xl: [
97
+ "[&>*:first-child]:rounded-l-xl",
98
+ "[&>*:last-child]:rounded-r-xl",
99
+ "[&>*:first-child]:rounded-t-xl",
100
+ "[&>*:last-child]:rounded-b-xl"
101
+ ],
102
+ lg: [
103
+ "[&>*:first-child]:rounded-l-lg",
104
+ "[&>*:last-child]:rounded-r-lg",
105
+ "[&>*:first-child]:rounded-t-lg",
106
+ "[&>*:last-child]:rounded-b-lg"
107
+ ],
108
+ md: [
109
+ "[&>*:first-child]:rounded-l-md",
110
+ "[&>*:last-child]:rounded-r-md",
111
+ "[&>*:first-child]:rounded-t-md",
112
+ "[&>*:last-child]:rounded-b-md"
113
+ ],
114
+ none: []
115
+ };
116
+ function inferRadius(className) {
117
+ if (className?.includes("rounded-full")) return "full";
118
+ if (className?.includes("rounded-xl")) return "xl";
119
+ if (className?.includes("rounded-lg")) return "lg";
120
+ return "md";
121
+ }
122
+ function ButtonGroup({ children, className, vertical = false, radius }) {
123
+ const outer = RADIUS_BY_RADIUS[radius ?? inferRadius(className)] ?? [];
82
124
  return /* @__PURE__ */ jsx("div", {
83
125
  className: cn("inline-flex", vertical ? "flex-col" : "flex-row", !vertical && [
84
126
  "[&>*:not(:first-child)]:-ml-px",
85
127
  "[&>*:first-child]:rounded-r-none",
86
128
  "[&>*:last-child]:rounded-l-none",
87
129
  "[&>*:not(:first-child):not(:last-child)]:rounded-none",
88
- className?.includes("rounded-full") && ["[&>*:first-child]:rounded-l-full", "[&>*:last-child]:rounded-r-full"],
89
- className?.includes("rounded-xl") && ["[&>*:first-child]:rounded-l-xl", "[&>*:last-child]:rounded-r-xl"],
90
- className?.includes("rounded-lg") && ["[&>*:first-child]:rounded-l-lg", "[&>*:last-child]:rounded-r-lg"]
130
+ outer.filter((c) => c.includes("rounded-l-") || c.includes("rounded-r-"))
91
131
  ], vertical && [
92
132
  "[&>*:not(:first-child)]:-mt-px",
93
133
  "[&>*:first-child]:rounded-b-none",
94
134
  "[&>*:last-child]:rounded-t-none",
95
135
  "[&>*:not(:first-child):not(:last-child)]:rounded-none",
96
- className?.includes("rounded-full") && ["[&>*:first-child]:rounded-t-full", "[&>*:last-child]:rounded-b-full"]
136
+ outer.filter((c) => c.includes("rounded-t-") || c.includes("rounded-b-"))
97
137
  ], className),
98
138
  children
99
139
  });
@@ -152,29 +192,33 @@ function Menu(props) {
152
192
  */
153
193
  function MenuItem(props) {
154
194
  const textValue = props.textValue || (typeof props.children === "string" ? props.children : void 0);
195
+ const { contentClassName, checkClassName, chevronClassName, check, chevron, ...racProps } = props;
155
196
  return /* @__PURE__ */ jsx(RAC.MenuItem, {
156
- ...props,
197
+ ...racProps,
157
198
  textValue,
158
199
  className: RAC.composeRenderProps(props.className, (className) => cn("group relative flex flex-row items-center cursor-default outline-none", className)),
159
- children: RAC.composeRenderProps(props.children, (children, { selectionMode, isSelected, hasSubmenu }) => /* @__PURE__ */ jsxs(Fragment, { children: [
200
+ children: RAC.composeRenderProps(props.children, (children, { selectionMode, isSelected, hasSubmenu }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
160
201
  selectionMode === "multiple" && /* @__PURE__ */ jsx("span", {
161
- className: "flex items-center shrink-0 justify-center",
162
- children: isSelected && /* @__PURE__ */ jsx(Check, { className: "size-3.5" })
202
+ className: cn("flex items-center shrink-0 justify-center", checkClassName),
203
+ children: check ?? (isSelected ? /* @__PURE__ */ jsx(Check, { className: "size-3.5" }) : null)
163
204
  }),
164
205
  /* @__PURE__ */ jsx("div", {
165
- className: "flex flex-row w-full items-center",
206
+ className: cn("flex flex-row w-full items-center", contentClassName),
166
207
  children
167
208
  }),
168
- hasSubmenu && /* @__PURE__ */ jsx(ChevronRight, { className: "size-4 ml-auto" })
209
+ hasSubmenu && /* @__PURE__ */ jsx("span", {
210
+ className: "ml-auto",
211
+ children: chevron ?? /* @__PURE__ */ jsx(ChevronRight, { className: cn("size-4", chevronClassName) })
212
+ })
169
213
  ] }))
170
214
  });
171
215
  }
172
- function MenuSection({ title, ...props }) {
216
+ function MenuSection({ title, headerClassName, ...props }) {
173
217
  return /* @__PURE__ */ jsxs(RAC.MenuSection, {
174
218
  ...props,
175
219
  className: cn("flex flex-col", props.className),
176
220
  children: [title && /* @__PURE__ */ jsx(RAC.Header, {
177
- className: "select-none",
221
+ className: cn("select-none", headerClassName),
178
222
  children: title
179
223
  }), /* @__PURE__ */ jsx(RAC.Collection, {
180
224
  items: props.items,
@@ -242,33 +286,126 @@ Tabs.Item = TabsItem;
242
286
  Tabs.Content = TabsContent;
243
287
  Tabs.Indicator = TabsIndicator;
244
288
 
289
+ //#endregion
290
+ //#region src/client/components/ui-base/icon-renderer.tsx
291
+ function isRecord(value) {
292
+ return typeof value === "object" && value !== null;
293
+ }
294
+ function normalizeIconExports(value) {
295
+ if (!isRecord(value)) return {};
296
+ const directExports = Object.fromEntries(Object.entries(value).filter(([key]) => key !== "default"));
297
+ const defaultExport = value.default;
298
+ if (!isRecord(defaultExport)) return directExports;
299
+ return {
300
+ ...normalizeIconExports(defaultExport),
301
+ ...directExports
302
+ };
303
+ }
304
+ function getIconRegistry() {
305
+ return {
306
+ ...icons_exports,
307
+ ...normalizeIconExports(virtualIcons)
308
+ };
309
+ }
310
+ function resolveIcon(icon, registry = getIconRegistry()) {
311
+ if (!icon || typeof icon !== "string") return icon;
312
+ if (icon.trim().startsWith("<svg")) return icon;
313
+ if (/^(?:https?:|data:image\/|\/|\.\.?(?:\/|$))/.test(icon) || /\.(?:svg|png|jpe?g|gif|webp|avif)(?:\?.*)?$/i.test(icon)) return icon;
314
+ return registry[icon] || registry[`${icon}Icon`];
315
+ }
316
+ function isImageSource(value) {
317
+ return /^(?:https?:|data:image\/|\/|\.\.?(?:\/|$))/.test(value) || /\.(?:svg|png|jpe?g|gif|webp|avif)(?:\?.*)?$/i.test(value);
318
+ }
319
+ function IconRenderer({ icon, size = 16, className, label }) {
320
+ const config = useOptionalConfig();
321
+ const resolved = resolveIcon(icon);
322
+ if (!resolved) return null;
323
+ if (typeof resolved === "function") return /* @__PURE__ */ jsx(resolved, {
324
+ size,
325
+ width: size,
326
+ height: size,
327
+ className,
328
+ "aria-hidden": label ? void 0 : true,
329
+ "aria-label": label
330
+ });
331
+ if (resolved.trim().startsWith("<svg")) {
332
+ const clean = DOMPurify.sanitize(resolved, { USE_PROFILES: { svg: true } });
333
+ if (label) return /* @__PURE__ */ jsx("span", {
334
+ className,
335
+ role: "img",
336
+ "aria-label": label,
337
+ dangerouslySetInnerHTML: { __html: clean }
338
+ });
339
+ return /* @__PURE__ */ jsx("span", {
340
+ className,
341
+ "aria-hidden": "true",
342
+ dangerouslySetInnerHTML: { __html: clean }
343
+ });
344
+ }
345
+ if (isImageSource(resolved)) return /* @__PURE__ */ jsx("img", {
346
+ src: resolvePublicAssetUrl(resolved, config?.base),
347
+ alt: label || "",
348
+ "aria-hidden": label ? void 0 : true,
349
+ className,
350
+ width: size,
351
+ height: size
352
+ });
353
+ return null;
354
+ }
355
+
245
356
  //#endregion
246
357
  //#region src/client/hooks/use-sidebar.ts
247
358
  const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1).replace(/-/g, " ");
248
- const getCleanDirectoryMeta = (directoryMeta) => {
249
- const meta = {};
250
- if (!directoryMeta) return meta;
359
+ /**
360
+ * Builds a lookup map from meta.json relative-directory keys.
361
+ * Keys keep the locale (`es/...`) and tab (`(guides)/...`) segments so meta
362
+ * resolution can be scoped per tab and per locale; numeric prefixes are
363
+ * stripped and keys are lowercased for stable matching.
364
+ */
365
+ const getDirectoryMetaLookup = (directoryMeta) => {
366
+ const lookup = {};
367
+ if (!directoryMeta) return lookup;
251
368
  for (const [key, value] of Object.entries(directoryMeta)) {
252
- const cleanKey = key.split("/").filter((part) => !part.startsWith("(") || !part.endsWith(")")).map((part) => part.replace(/^\d+-/, "")).join("/");
253
- meta[cleanKey === "" ? "." : cleanKey] = value;
369
+ const normalizedKey = key.split("/").map((part) => part.replace(/^\d+-/, "")).join("/").toLowerCase();
370
+ lookup[normalizedKey] = value;
371
+ }
372
+ return lookup;
373
+ };
374
+ /**
375
+ * Resolves the meta.json entry for a sidebar group by trying increasingly
376
+ * specific directory keys: locale + tab, tab, locale, then the bare path.
377
+ * This keeps groups that share a directory name across tabs or locales
378
+ * (e.g. `(guides)/content` vs `(plugins)/content`) from clobbering each
379
+ * other and lets localized sites resolve their own translated meta.
380
+ */
381
+ const findDirectoryMeta = (lookup, route, relPath) => {
382
+ const locale = route?.locale;
383
+ const tab = route?.tab;
384
+ const candidates = [];
385
+ if (locale && tab) candidates.push(`${locale}/(${tab})/${relPath}`);
386
+ if (tab) candidates.push(`(${tab})/${relPath}`);
387
+ if (locale) candidates.push(`${locale}/${relPath}`);
388
+ candidates.push(relPath);
389
+ for (const candidate of candidates) {
390
+ const meta = lookup[candidate.toLowerCase()];
391
+ if (meta) return meta;
254
392
  }
255
- return meta;
256
393
  };
257
- const getOrCreateNode = (parts, rootMap, directoryMeta) => {
394
+ const getOrCreateNode = (parts, rootMap, directoryMetaLookup, route) => {
258
395
  let currentMap = rootMap;
259
396
  let parentPath = "";
260
397
  let lastNode;
261
398
  for (const segment of parts) {
262
399
  const currentRelPath = parentPath ? `${parentPath}/${segment}` : segment;
263
400
  if (!currentMap.has(segment)) {
264
- const meta = directoryMeta[currentRelPath] || {};
401
+ const meta = findDirectoryMeta(directoryMetaLookup, route, currentRelPath) || {};
265
402
  const newNode = {
266
403
  path: "#",
267
404
  title: meta.title || capitalize(segment),
268
405
  componentPath: "",
269
406
  filePath: "",
270
407
  icon: meta.icon,
271
- groupPosition: typeof meta.order === "number" ? meta.order : 999,
408
+ groupPosition: typeof meta.order === "number" ? meta.order : void 0,
272
409
  collapsible: meta.collapsible,
273
410
  collapsed: meta.collapsed,
274
411
  hasCustomTitle: meta.title !== void 0,
@@ -283,6 +420,20 @@ const getOrCreateNode = (parts, rootMap, directoryMeta) => {
283
420
  }
284
421
  return lastNode;
285
422
  };
423
+ /**
424
+ * Whether a route (or any of its nested children) matches the active path or
425
+ * the active route's file. Used for group-level active detection and for the
426
+ * `isActive` helper exposed by `useSidebar`.
427
+ */
428
+ function isRouteActive(route, activePath, activeRoute) {
429
+ if (!route?.path) return false;
430
+ const normalizedPath = route.path.endsWith("/") ? route.path.slice(0, -1) : route.path;
431
+ if ((activePath.endsWith("/") ? activePath.slice(0, -1) : activePath) === normalizedPath) return true;
432
+ if (activeRoute?.filePath && route.filePath && activeRoute.filePath === route.filePath) return true;
433
+ if (route.routes?.some((r) => isRouteActive(r, activePath, activeRoute))) return true;
434
+ if (route.subRoutes?.some((r) => isRouteActive(r, activePath, activeRoute))) return true;
435
+ return false;
436
+ }
286
437
  const getRoutePosition = (r) => r.sidebarPosition ?? r.order ?? 999;
287
438
  const getNodePosition = (n) => n.sidebarPosition ?? n.groupPosition ?? 999;
288
439
  const finalizeTree = (nodes) => {
@@ -303,12 +454,18 @@ const finalizeTree = (nodes) => {
303
454
  function useSidebar(routes) {
304
455
  const config = useConfig();
305
456
  const { pathname } = useLocation();
306
- return useMemo(() => {
307
- const currentPath = normalizePath(pathname);
308
- const activeRoute = routes.find((r) => normalizePath(r.path) === currentPath);
309
- const activeTabId = activeRoute?.tab?.toLowerCase();
310
- const filteredRoutes = routes.filter((r) => !r.collection && !r.sidebarHidden && !r.fallback).filter((r) => !activeTabId || r.tab?.toLowerCase() === activeTabId).sort((a, b) => getRoutePosition(a) - getRoutePosition(b));
311
- const directoryMeta = getCleanDirectoryMeta(config.directoryMeta);
457
+ const { index } = useRoutesContext();
458
+ const currentPath = normalizePath(pathname);
459
+ const activeRoute = index.byPath.size > 0 ? index.byPath.get(currentPath) : routes.find((route) => normalizePath(route.path) === currentPath);
460
+ const configuredTabs = config.theme?.tabs || [];
461
+ const configuredTabIds = new Set(configuredTabs.map((tab) => tab.id.toLowerCase()));
462
+ const normalizedBase = normalizePath(config.base || "/docs");
463
+ const routeTabId = activeRoute?.tab?.toLowerCase();
464
+ const parsedCurrentRoute = parseUrlReference(currentPath, config, { kind: "doc" });
465
+ const activeTabId = (currentPath === normalizedBase || Boolean(activeRoute?.fallback) && parsedCurrentRoute.routePath === "/" || currentPath.startsWith(`${normalizedBase}/`) && parsedCurrentRoute.routePath === "/" ? configuredTabs[0]?.id.toLowerCase() : routeTabId && configuredTabIds.has(routeTabId) ? routeTabId : void 0) || void 0;
466
+ const sidebar = useMemo(() => {
467
+ const filteredRoutes = routes.filter((r) => !r.collection && !r.sidebarHidden && !r.fallback).filter((r) => !configuredTabs.length || r.tab?.toLowerCase() === activeTabId).sort((a, b) => getRoutePosition(a) - getRoutePosition(b));
468
+ const directoryMeta = getDirectoryMetaLookup(config.directoryMeta);
312
469
  const rootNodesMap = /* @__PURE__ */ new Map();
313
470
  const ungrouped = [];
314
471
  for (const route of filteredRoutes) {
@@ -318,13 +475,13 @@ function useSidebar(routes) {
318
475
  if (route.filePath) ungrouped.push(route);
319
476
  continue;
320
477
  }
321
- const containerNode = getOrCreateNode(parts, rootNodesMap, directoryMeta);
478
+ const containerNode = getOrCreateNode(parts, rootNodesMap, directoryMeta, route);
322
479
  if (isIndex) Object.assign(containerNode, {
323
480
  path: route.path,
324
481
  title: containerNode.hasCustomTitle ? containerNode.title : route.title || containerNode.title,
325
482
  icon: route.icon || containerNode.icon,
326
483
  badge: route.badge,
327
- sidebarPosition: route.sidebarPosition,
484
+ sidebarPosition: containerNode.groupPosition === void 0 ? route.sidebarPosition : void 0,
328
485
  frontmatter: route.frontmatter,
329
486
  filePath: route.filePath
330
487
  });
@@ -332,45 +489,93 @@ function useSidebar(routes) {
332
489
  }
333
490
  const finalizedTopNodes = finalizeTree(Array.from(rootNodesMap.values()));
334
491
  const groups = [];
335
- for (const node of finalizedTopNodes) if (node.subRoutes && node.subRoutes.length > 0) groups.push({
336
- slug: node.title.toLowerCase().replace(/\s+/g, "-"),
337
- title: node.title,
338
- icon: node.icon,
339
- path: node.path,
340
- filePath: node.filePath,
341
- routes: node.subRoutes,
342
- sidebarPosition: node.sidebarPosition ?? node.groupPosition ?? 999,
343
- collapsible: node.collapsible,
344
- collapsed: node.collapsed
345
- });
346
- else ungrouped.push(node);
492
+ for (const node of finalizedTopNodes) if (node.subRoutes && node.subRoutes.length > 0) {
493
+ const nodeWithMeta = node;
494
+ groups.push({
495
+ slug: node.title.toLowerCase().replace(/\s+/g, "-"),
496
+ title: node.title,
497
+ icon: node.icon,
498
+ path: node.path,
499
+ filePath: node.filePath,
500
+ routes: node.subRoutes,
501
+ sidebarPosition: node.sidebarPosition ?? node.groupPosition ?? 999,
502
+ collapsible: nodeWithMeta.collapsible,
503
+ collapsed: nodeWithMeta.collapsed
504
+ });
505
+ } else ungrouped.push(node);
506
+ const finalizedUngrouped = finalizeTree(ungrouped);
347
507
  return {
348
508
  groups,
349
- ungrouped: finalizeTree(ungrouped),
350
- activeRoute,
351
- activePath: currentPath,
352
- config
509
+ ungrouped: finalizedUngrouped,
510
+ merged: [...finalizedUngrouped.map((route) => ({
511
+ type: "link",
512
+ position: route.sidebarPosition ?? 999,
513
+ title: route.title,
514
+ route
515
+ })), ...groups.map((group) => ({
516
+ type: "group",
517
+ position: group.sidebarPosition ?? 999,
518
+ title: group.title,
519
+ group
520
+ }))].sort((a, b) => {
521
+ if (a.position !== b.position) return a.position - b.position;
522
+ if (a.type !== b.type) return a.type === "link" ? -1 : 1;
523
+ return a.title.localeCompare(b.title);
524
+ })
353
525
  };
354
526
  }, [
355
527
  routes,
356
528
  config,
357
- pathname
529
+ activeTabId,
530
+ configuredTabs.length
531
+ ]);
532
+ const isActive = useCallback((route) => isRouteActive(route, currentPath, activeRoute), [currentPath, activeRoute]);
533
+ const isGroupActive = useCallback((group) => group.routes.some((route) => isRouteActive(route, currentPath, activeRoute)), [currentPath, activeRoute]);
534
+ const tree = useMemo(() => {
535
+ const buildNode = (route, depth) => {
536
+ const children = route.routes || route.subRoutes || [];
537
+ return {
538
+ route,
539
+ depth,
540
+ isGroup: false,
541
+ isActive: isRouteActive(route, currentPath, activeRoute),
542
+ hasChildren: children.length > 0,
543
+ children: children.map((child) => buildNode(child, depth + 1))
544
+ };
545
+ };
546
+ const buildGroupNode = (group) => ({
547
+ route: group,
548
+ depth: 0,
549
+ isGroup: true,
550
+ isActive: isGroupActive(group),
551
+ hasChildren: true,
552
+ children: group.routes.map((route) => buildNode(route, 1))
553
+ });
554
+ return sidebar.merged.map((item) => item.type === "group" ? buildGroupNode(item.group) : buildNode(item.route, 0));
555
+ }, [
556
+ sidebar,
557
+ activeRoute,
558
+ currentPath,
559
+ isGroupActive
358
560
  ]);
561
+ return {
562
+ ...sidebar,
563
+ tree,
564
+ isActive,
565
+ isGroupActive,
566
+ activeRoute,
567
+ activePath: currentPath,
568
+ config
569
+ };
359
570
  }
360
571
 
361
- //#endregion
362
- //#region src/client/hooks/use-location.ts
363
- const useLocation$1 = () => {
364
- return useLocation();
365
- };
366
-
367
572
  //#endregion
368
573
  //#region src/client/hooks/use-search-highlight.ts
369
574
  /**
370
575
  * Hook to highlight search terms based on the 'hl' query parameter.
371
576
  */
372
577
  function useSearchHighlight(containerSelector = ".boltdocs-page") {
373
- const { search } = useLocation$1();
578
+ const { search } = useLocation();
374
579
  const query = new URLSearchParams(search).get("hl");
375
580
  useEffect(() => {
376
581
  if (!query) {
@@ -406,11 +611,7 @@ function useSearchHighlight(containerSelector = ".boltdocs-page") {
406
611
  observer.disconnect();
407
612
  clearHighlights(containerSelector);
408
613
  };
409
- }, [
410
- query,
411
- search,
412
- containerSelector
413
- ]);
614
+ }, [query, containerSelector]);
414
615
  }
415
616
  function clearHighlights(selector) {
416
617
  document.querySelectorAll(`${selector} mark[data-search-highlight]`).forEach((mark) => {
@@ -430,8 +631,11 @@ function highlightTerms(container, terms) {
430
631
  return NodeFilter.FILTER_ACCEPT;
431
632
  } });
432
633
  const nodes = [];
433
- let node;
434
- while (node = walker.nextNode()) nodes.push(node);
634
+ let node = walker.nextNode();
635
+ while (node) {
636
+ nodes.push(node);
637
+ node = walker.nextNode();
638
+ }
435
639
  const accentMap = {
436
640
  a: "[aáàäâã]",
437
641
  e: "[eéèëê]",
@@ -628,7 +832,7 @@ function AnchorProvider({ toc, single = false, observerOptions, children }) {
628
832
  return () => {
629
833
  observer.unwatch();
630
834
  };
631
- }, [observer]);
835
+ }, [observer, observerOptions]);
632
836
  return /* @__PURE__ */ jsx(ItemsContext.Provider, {
633
837
  value: items,
634
838
  children
@@ -636,53 +840,64 @@ function AnchorProvider({ toc, single = false, observerOptions, children }) {
636
840
  }
637
841
  function OnThisPage({ children, className }) {
638
842
  return /* @__PURE__ */ jsx("nav", {
639
- className: cn("sticky top-navbar hidden xl:flex flex-col shrink-0", "w-toc", "py-4 pl-6 pr-4", className),
843
+ "data-otp-root": true,
844
+ className,
640
845
  children
641
846
  });
642
847
  }
643
848
  function OnThisPageHeader({ children, className, ...props }) {
644
849
  return /* @__PURE__ */ jsx("div", {
645
- className: cn("mb-4 text-xs font-bold text-body", className),
850
+ className,
646
851
  ...props,
647
852
  children
648
853
  });
649
854
  }
650
- function OnThisPageContent({ children, className, ref, ...props }) {
855
+ function OnThisPageContent({ children, className, ref, fadeClassName, innerClassName, ...props }) {
651
856
  const internalRef = useRef(null);
652
- useImperativeHandle(ref, () => internalRef.current);
653
- return /* @__PURE__ */ jsx("div", {
654
- ref: internalRef,
655
- className: cn("relative overflow-y-auto boltdocs-otp-content pb-12", "max-h-[70%]", className),
656
- style: {
657
- maskImage: "linear-gradient(to bottom, black 90%, transparent 100%)",
658
- WebkitMaskImage: "linear-gradient(to bottom, black 90%, transparent 100%)"
659
- },
857
+ return /* @__PURE__ */ jsxs("div", {
858
+ ref: useCallback((node) => {
859
+ internalRef.current = node;
860
+ if (typeof ref === "function") ref(node);
861
+ else if (ref) ref.current = node;
862
+ }, [ref]),
863
+ "data-otp-content": true,
864
+ className: cn("relative isolate overflow-y-auto", className),
660
865
  ...props,
661
- children
866
+ children: [/* @__PURE__ */ jsx("div", {
867
+ className: cn("relative z-10", innerClassName),
868
+ children
869
+ }), /* @__PURE__ */ jsx("div", {
870
+ "aria-hidden": "true",
871
+ "data-otp-fade": true,
872
+ className: cn("pointer-events-none sticky bottom-0 z-0 -mt-10 h-10 w-full", fadeClassName)
873
+ })]
662
874
  });
663
875
  }
664
876
  OnThisPageContent.displayName = "OnThisPageContent";
665
877
  function OnThisPageList({ children, className }) {
666
878
  return /* @__PURE__ */ jsx("ul", {
667
- className: cn("relative space-y-0.5 text-sm border-l border-subtle", className),
879
+ "data-otp-list": true,
880
+ className: cn("relative", className),
668
881
  children
669
882
  });
670
883
  }
671
884
  function OnThisPageItem({ level, children, className }) {
672
885
  return /* @__PURE__ */ jsx("li", {
673
- className: cn(level === 3 && "pl-3", className),
886
+ "data-level": level || void 0,
887
+ className,
674
888
  children
675
889
  });
676
890
  }
677
891
  function OnThisPageLink({ children, href, active, onClick, className }) {
678
892
  const items = use(ItemsContext);
679
893
  const containerRef = use(ScrollContext);
894
+ const navigate = useNavigate();
680
895
  const id = href ? getItemId(href) : null;
681
896
  const anchorRef = useRef(null);
682
897
  const computedActive = active !== void 0 ? active : id && items ? !!items.find((i) => i.id === id)?.active : false;
683
898
  useEffect(() => {
684
899
  if (computedActive && anchorRef.current && containerRef?.current) scrollIntoView(anchorRef.current, {
685
- behavior: "smooth",
900
+ behavior: "auto",
686
901
  block: "center",
687
902
  inline: "center",
688
903
  scrollMode: "if-needed",
@@ -690,14 +905,14 @@ function OnThisPageLink({ children, href, active, onClick, className }) {
690
905
  });
691
906
  }, [computedActive, containerRef]);
692
907
  const handleClick = (e) => {
693
- if (onClick) onClick(e);
694
- else if (href && href.startsWith("#")) {
695
- e.preventDefault();
696
- const elementId = href.slice(1);
697
- const el = document.getElementById(elementId);
698
- if (el) {
699
- el.scrollIntoView({ behavior: "smooth" });
700
- window.history.pushState(null, "", href);
908
+ if (onClick) {
909
+ onClick(e);
910
+ return;
911
+ }
912
+ if (href) {
913
+ if ((href.includes("#") ? href.split("#")[1] : null) && navigate !== defaultNavigate) {
914
+ e.preventDefault();
915
+ navigate(href);
701
916
  }
702
917
  }
703
918
  };
@@ -705,8 +920,9 @@ function OnThisPageLink({ children, href, active, onClick, className }) {
705
920
  ref: anchorRef,
706
921
  href,
707
922
  onClick: handleClick,
708
- "data-active": computedActive,
709
- className: cn("block py-0.5 pl-4 text-[13px] outline-none transition-colors", computedActive ? "text-primary-500" : "text-muted hover:text-body", className),
923
+ "data-active": computedActive || void 0,
924
+ "aria-current": computedActive ? "true" : void 0,
925
+ className,
710
926
  children
711
927
  });
712
928
  }
@@ -716,7 +932,9 @@ function OnThisPageIndicator({ style, className }) {
716
932
  opacity: 0,
717
933
  ...style
718
934
  });
935
+ const items = useItems();
719
936
  useEffect(() => {
937
+ if (items.length === 0) return;
720
938
  const parent = containerRef.current?.parentElement;
721
939
  if (!parent) return;
722
940
  const activeLinks = parent.querySelectorAll("a[data-active=\"true\"]");
@@ -738,10 +956,11 @@ function OnThisPageIndicator({ style, className }) {
738
956
  opacity: 0,
739
957
  ...style
740
958
  });
741
- }, [useItems(), style]);
959
+ }, [items, style]);
742
960
  return /* @__PURE__ */ jsx("div", {
743
961
  ref: containerRef,
744
- className: cn("absolute -left-px w-0.5 rounded-full bg-primary-500", className),
962
+ "data-otp-indicator": true,
963
+ className: cn("absolute", className),
745
964
  style: {
746
965
  transition: "transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1), height 180ms cubic-bezier(0.2, 0.8, 0.2, 1), opacity 150ms",
747
966
  ...internalStyle
@@ -751,16 +970,18 @@ function OnThisPageIndicator({ style, className }) {
751
970
  /**
752
971
  * High-level automated list of toc items
753
972
  */
754
- function OnThisPageItems({ headings = [], className }) {
973
+ function OnThisPageItems({ headings = [], className, itemClassName, linkClassName, indicatorClassName }) {
755
974
  const activeIds = useActiveAnchors();
756
975
  if (headings.length === 0) return null;
757
976
  return /* @__PURE__ */ jsxs(OnThisPageList, {
758
977
  className,
759
- children: [/* @__PURE__ */ jsx(OnThisPageIndicator, {}), headings.map((h) => /* @__PURE__ */ jsx(OnThisPageItem, {
978
+ children: [/* @__PURE__ */ jsx(OnThisPageIndicator, { className: indicatorClassName }), headings.map((h) => /* @__PURE__ */ jsx(OnThisPageItem, {
760
979
  level: h.level,
980
+ className: itemClassName,
761
981
  children: /* @__PURE__ */ jsx(OnThisPageLink, {
762
982
  href: `#${h.id}`,
763
983
  active: activeIds.includes(h.id),
984
+ className: linkClassName,
764
985
  children: h.text
765
986
  })
766
987
  }, h.id))]
@@ -769,7 +990,7 @@ function OnThisPageItems({ headings = [], className }) {
769
990
  /**
770
991
  * High-level automated Table of Contents tree
771
992
  */
772
- function OnThisPageTree({ headings = [], className }) {
993
+ function OnThisPageTree({ headings = [], className, itemClassName, linkClassName, indicatorClassName, fadeClassName, contentClassName }) {
773
994
  const toc = useMemo(() => headings.map((h) => ({
774
995
  title: h.text,
775
996
  url: `#${h.id}`,
@@ -779,14 +1000,19 @@ function OnThisPageTree({ headings = [], className }) {
779
1000
  if (headings.length === 0) return null;
780
1001
  return /* @__PURE__ */ jsx(AnchorProvider, {
781
1002
  toc,
782
- single: false,
1003
+ single: true,
783
1004
  children: /* @__PURE__ */ jsx(ScrollProvider, {
784
1005
  containerRef: scrollContainerRef,
785
1006
  children: /* @__PURE__ */ jsx(OnThisPageContent, {
786
1007
  ref: scrollContainerRef,
1008
+ fadeClassName,
1009
+ className: contentClassName,
787
1010
  children: /* @__PURE__ */ jsx(OnThisPageItems, {
788
1011
  headings,
789
- className
1012
+ className,
1013
+ itemClassName,
1014
+ linkClassName,
1015
+ indicatorClassName
790
1016
  })
791
1017
  })
792
1018
  })
@@ -811,18 +1037,10 @@ function PageNav({ children, className }) {
811
1037
  });
812
1038
  }
813
1039
  function PageNavLink({ children, to, direction, className }) {
814
- const isNext = direction === "next";
815
- return /* @__PURE__ */ jsxs(Link$1, {
1040
+ return /* @__PURE__ */ jsx(Link, {
816
1041
  href: to,
817
- className: cn("flex items-center outline-none no-underline", isNext ? "justify-end" : "justify-start", className),
818
- children: [
819
- !isNext && /* @__PURE__ */ jsx(ChevronLeft, { className: "shrink-0" }),
820
- /* @__PURE__ */ jsx("div", {
821
- className: "flex flex-col flex-1",
822
- children
823
- }),
824
- isNext && /* @__PURE__ */ jsx(ChevronRight, { className: "shrink-0" })
825
- ]
1042
+ className: cn("flex items-center outline-none no-underline", direction === "next" ? "justify-end" : "justify-start", className),
1043
+ children
826
1044
  });
827
1045
  }
828
1046
  function PageNavTitle({ children, className }) {
@@ -837,8 +1055,11 @@ function PageNavDescription({ children, className }) {
837
1055
  children
838
1056
  });
839
1057
  }
840
- function PageNavIcon({ children }) {
841
- return /* @__PURE__ */ jsx(Fragment, { children });
1058
+ function PageNavIcon({ children, className }) {
1059
+ return /* @__PURE__ */ jsx("span", {
1060
+ className: cn("shrink-0", className),
1061
+ children
1062
+ });
842
1063
  }
843
1064
  PageNav.Root = PageNav;
844
1065
  PageNav.Link = PageNavLink;
@@ -850,27 +1071,20 @@ PageNav.Icon = PageNavIcon;
850
1071
  //#region src/client/components/primitives/sidebar.tsx
851
1072
  let sidebarScrollPos = 0;
852
1073
  function getIcon(iconName) {
853
- if (!iconName) return void 0;
854
- const icons = {
855
- ...icons_exports,
856
- ...virtualIcons
857
- };
858
- return icons[iconName] || icons[iconName + "Icon"] || void 0;
1074
+ return resolveIcon(iconName);
859
1075
  }
860
1076
  /**
861
- * Internal Badge component for links
1077
+ * Internal Badge component for links.
1078
+ *
1079
+ * Carries no colors — the theme styles it via `data-badge`.
862
1080
  */
863
- function Badge({ badge }) {
864
- const colors = {
865
- new: "bg-primary-500/10 text-primary-500 border border-primary-500/20",
866
- updated: "bg-emerald-500/10 text-emerald-500 border border-emerald-500/20",
867
- deprecated: "bg-danger-500/10 text-danger-500 border border-danger-500/20"
868
- };
869
- const text = typeof badge === "string" ? badge : badge?.text;
870
- if (!text) return null;
1081
+ function Badge({ badge, badgeClassName }) {
1082
+ const type = typeof badge === "string" ? badge : badge?.text;
1083
+ if (!type) return null;
871
1084
  return /* @__PURE__ */ jsx("span", {
872
- className: cn("ml-auto flex h-5 items-center rounded-md text-[10px] font-bold px-1.5 py-0.5 uppercase tracking-wider", colors[text] || colors.new),
873
- children: text
1085
+ "data-badge": type,
1086
+ className: cn("ml-auto shrink-0", badgeClassName),
1087
+ children: type
874
1088
  });
875
1089
  }
876
1090
  /**
@@ -878,24 +1092,25 @@ function Badge({ badge }) {
878
1092
  */
879
1093
  function SidebarRoot({ children, className }) {
880
1094
  return /* @__PURE__ */ jsx("aside", {
881
- className: cn("hidden lg:flex flex-col w-sidebar sticky top-navbar h-[calc(100vh-var(--spacing-navbar))] border-r border-subtle bg-main", className),
1095
+ "data-sidebar-root": true,
1096
+ className,
882
1097
  children
883
1098
  });
884
1099
  }
885
1100
  /**
886
1101
  * Mobile Sidebar Modal
887
1102
  */
888
- function SidebarMobile({ children, className }) {
1103
+ function SidebarMobile({ children, className, overlayClassName, dialogClassName }) {
889
1104
  const { isSidebarOpen, closeSidebar } = useUI();
890
1105
  return /* @__PURE__ */ jsx(RAC.ModalOverlay, {
891
1106
  isOpen: isSidebarOpen,
892
1107
  onOpenChange: (open) => !open && closeSidebar(),
893
1108
  isDismissable: true,
894
- className: cn("fixed inset-0 z-50 bg-black/20 backdrop-blur-sm lg:hidden", "entering:animate-in entering:fade-in exiting:animate-out exiting:fade-out duration-300"),
1109
+ className: cn("lg:hidden", overlayClassName),
895
1110
  children: /* @__PURE__ */ jsx(RAC.Modal, {
896
- className: cn("fixed top-0 left-0 bottom-0 w-80 bg-main border-r border-subtle shadow-2xl outline-none", "entering:animate-in entering:slide-in-from-left exiting:animate-out exiting:slide-out-to-left duration-300", className),
1111
+ className: cn("lg:hidden", className),
897
1112
  children: /* @__PURE__ */ jsx(RAC.Dialog, {
898
- className: "h-full focus:outline-none outline-none flex flex-col",
1113
+ className: cn("h-full flex flex-col outline-none focus:outline-none", dialogClassName),
899
1114
  children
900
1115
  })
901
1116
  })
@@ -906,12 +1121,15 @@ function SidebarMobile({ children, className }) {
906
1121
  */
907
1122
  function SidebarHeader({ children, className }) {
908
1123
  return /* @__PURE__ */ jsx("div", {
909
- className: cn("flex items-center justify-between p-4 border-b border-subtle", className),
1124
+ className,
910
1125
  children
911
1126
  });
912
1127
  }
913
1128
  /**
914
1129
  * Scrollable Content Wrapper
1130
+ *
1131
+ * The scroll container doubles as the semantic `<nav>` landmark. State and
1132
+ * scroll-position handling live here; all visuals belong to the theme.
915
1133
  */
916
1134
  function SidebarContent({ children, className }) {
917
1135
  const scrollRef = useRef(null);
@@ -927,107 +1145,143 @@ function SidebarContent({ children, className }) {
927
1145
  el.addEventListener("scroll", handleScroll, { passive: true });
928
1146
  return () => el.removeEventListener("scroll", handleScroll);
929
1147
  }, []);
930
- return /* @__PURE__ */ jsx("div", {
1148
+ return /* @__PURE__ */ jsx("nav", {
931
1149
  ref: scrollRef,
932
- className: cn("flex-1 overflow-y-auto p-4 pb-16 custom-scrollbar", className),
933
- children: /* @__PURE__ */ jsx("nav", {
934
- className: "flex flex-col gap-6",
935
- children
936
- })
1150
+ "data-sidebar-content": true,
1151
+ className,
1152
+ children
937
1153
  });
938
1154
  }
939
1155
  /**
940
1156
  * Navigation Group
941
1157
  */
942
- function SidebarGroup({ title, icon: Icon, children, className, collapsible = false, collapsed = false, active = false }) {
1158
+ function SidebarGroup({ title, icon: Icon, children, className, collapsible = false, collapsed = false, active = false, headerClassName, iconClassName, titleClassName, contentClassName, trailing, trailingClassName, renderTitle }) {
943
1159
  const [isOpen, setIsOpen] = useState(() => active || !collapsed);
944
- const [prevActive, setPrevActive] = useState(active);
945
- if (active !== prevActive) {
946
- setPrevActive(active);
1160
+ useEffect(() => {
947
1161
  if (active) setIsOpen(true);
948
- }
1162
+ }, [active]);
1163
+ const titleContent = title && /* @__PURE__ */ jsxs("span", {
1164
+ className: cn("flex items-center gap-2", titleClassName),
1165
+ children: [Icon && /* @__PURE__ */ jsx(IconRenderer, {
1166
+ icon: Icon,
1167
+ size: 12,
1168
+ className: iconClassName
1169
+ }), title]
1170
+ });
949
1171
  return /* @__PURE__ */ jsxs("div", {
1172
+ "data-group": true,
1173
+ "data-active": active || void 0,
1174
+ "data-collapsible": collapsible || void 0,
950
1175
  className,
951
- children: [title && (collapsible ? /* @__PURE__ */ jsxs("button", {
1176
+ children: [title && (renderTitle ? renderTitle({
1177
+ title,
1178
+ isOpen
1179
+ }) : collapsible ? /* @__PURE__ */ jsxs("button", {
952
1180
  onClick: () => setIsOpen(!isOpen),
953
- className: "w-full text-left px-2 mb-2 flex items-center justify-between text-xs font-regular tracking-widest text-muted/50 hover:text-body transition-colors outline-none cursor-pointer group",
954
- children: [/* @__PURE__ */ jsxs("span", {
955
- className: "flex items-center gap-2",
956
- children: [Icon && /* @__PURE__ */ jsx(Icon, { size: 12 }), title]
957
- }), /* @__PURE__ */ jsx(ChevronRight, {
1181
+ "aria-expanded": isOpen,
1182
+ "data-open": isOpen || void 0,
1183
+ className: cn("group flex w-full cursor-pointer items-center justify-between gap-2 text-left outline-none", headerClassName),
1184
+ children: [titleContent, trailing ?? /* @__PURE__ */ jsx(ChevronRight, {
958
1185
  size: 12,
959
- className: cn("transition-transform duration-200 text-muted/40 group-hover:text-body", isOpen && "rotate-90")
1186
+ "data-open": isOpen || void 0,
1187
+ className: cn("shrink-0 transition-transform duration-200", isOpen && "rotate-90")
960
1188
  })]
961
1189
  }) : /* @__PURE__ */ jsxs("h4", {
962
- className: "px-2 mb-2 flex items-center gap-2 text-[11px] font-bold uppercase tracking-widest text-muted/50",
963
- children: [Icon && /* @__PURE__ */ jsx(Icon, { size: 12 }), title]
1190
+ className: cn("flex items-center gap-2 outline-none", headerClassName),
1191
+ children: [titleContent, trailing && /* @__PURE__ */ jsx("span", {
1192
+ className: cn("ml-auto", trailingClassName),
1193
+ children: trailing
1194
+ })]
964
1195
  })), (!collapsible || isOpen) && /* @__PURE__ */ jsx("div", {
965
- className: "flex flex-col gap-0.5",
1196
+ className: cn("flex flex-col", contentClassName),
966
1197
  children
967
1198
  })]
968
1199
  });
969
1200
  }
970
- function SidebarLink({ label, href, active, icon: Icon, badge, className }) {
971
- return /* @__PURE__ */ jsxs(Link$1, {
1201
+ function SidebarLink({ label, href, active, icon: Icon, badge, className, iconClassName, labelClassName, badgeClassName, children, trailing, depth }) {
1202
+ const linkRef = useRef(null);
1203
+ useEffect(() => {
1204
+ if (active && linkRef.current?.scrollIntoView) linkRef.current.scrollIntoView({ block: "nearest" });
1205
+ }, [active]);
1206
+ return /* @__PURE__ */ jsxs(Link, {
1207
+ ref: linkRef,
972
1208
  href,
973
- className: cn("group flex items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-sm transition-all outline-none", active ? "bg-primary-500/10 text-primary-500 font-medium shadow-sm" : "text-muted hover:bg-surface hover:text-body", className),
1209
+ "data-active": active || void 0,
1210
+ "data-depth": depth !== void 0 ? depth : void 0,
1211
+ "aria-current": active ? "page" : void 0,
1212
+ className: cn("group flex items-center gap-2.5 outline-none", className),
974
1213
  children: [
975
- Icon && /* @__PURE__ */ jsx(Icon, {
1214
+ Icon && /* @__PURE__ */ jsx(IconRenderer, {
1215
+ icon: Icon,
976
1216
  size: 16,
977
- className: cn(active ? "text-primary-500" : "text-muted group-hover:text-body")
1217
+ className: cn("shrink-0", iconClassName)
978
1218
  }),
979
- /* @__PURE__ */ jsx("span", {
980
- className: "truncate",
1219
+ children ?? /* @__PURE__ */ jsx("span", {
1220
+ className: cn("truncate", labelClassName),
981
1221
  children: label
982
1222
  }),
983
- badge && /* @__PURE__ */ jsx(Badge, { badge })
1223
+ badge && /* @__PURE__ */ jsx(Badge, {
1224
+ badge,
1225
+ badgeClassName
1226
+ }),
1227
+ trailing
984
1228
  ]
985
1229
  });
986
1230
  }
987
1231
  /**
988
1232
  * Nested SubGroup
989
1233
  */
990
- function SidebarSubGroup({ label, href, active, icon: Icon, badge, isOpen, onToggle, children, className }) {
1234
+ function SidebarSubGroup({ label, href, active, icon: Icon, badge, isOpen, onToggle, children, className, rootClassName, linkClassName, contentClassName, toggleClassName, wrapperClassName, renderToggle, depth }) {
991
1235
  return /* @__PURE__ */ jsxs("div", {
992
- className: "flex flex-col gap-0.5",
1236
+ className: cn("flex flex-col", rootClassName),
993
1237
  children: [/* @__PURE__ */ jsxs("div", {
994
- className: "group relative flex items-center",
1238
+ className: cn("group relative flex items-center", wrapperClassName),
995
1239
  children: [/* @__PURE__ */ jsx(SidebarLink, {
996
1240
  label,
997
1241
  href,
998
1242
  active,
999
1243
  icon: Icon,
1000
1244
  badge,
1001
- className: cn("flex-1 pr-8", className)
1002
- }), /* @__PURE__ */ jsx("button", {
1245
+ depth,
1246
+ className: cn("flex-1 pr-8", linkClassName, className)
1247
+ }), renderToggle ? renderToggle({ isOpen }) : /* @__PURE__ */ jsx("button", {
1003
1248
  onClick: (e) => {
1004
1249
  e.preventDefault();
1005
1250
  e.stopPropagation();
1006
1251
  onToggle();
1007
1252
  },
1008
- className: "absolute right-1 p-1.5 text-muted hover:text-body transition-colors outline-none cursor-pointer",
1253
+ "aria-expanded": isOpen,
1254
+ "data-open": isOpen || void 0,
1255
+ className: cn("absolute right-1 cursor-pointer outline-none", toggleClassName),
1009
1256
  children: /* @__PURE__ */ jsx(ChevronRight, {
1010
1257
  size: 14,
1258
+ "data-open": isOpen || void 0,
1011
1259
  className: cn("transition-transform duration-200", isOpen && "rotate-90")
1012
1260
  })
1013
1261
  })]
1014
1262
  }), isOpen && /* @__PURE__ */ jsx("div", {
1015
- className: "ml-4 pl-3 border-l border-subtle/50 mt-0.5 flex flex-col gap-0.5",
1263
+ className: cn("flex flex-col", contentClassName),
1016
1264
  children
1017
1265
  })]
1018
1266
  });
1019
1267
  }
1020
- function SidebarItem({ route, activePath, activeRoute, className }) {
1268
+ function SidebarItem({ route, activePath, activeRoute, className, depth = 0, renderItem, classNames }) {
1021
1269
  const localizedHref = useLocalizedTo(route.path);
1022
1270
  const isCurrent = activePath === (localizedHref.endsWith("/") ? localizedHref.slice(0, -1) : localizedHref) || !!activeRoute?.filePath && !!route.filePath && activeRoute.filePath === route.filePath;
1023
1271
  const hasChildren = !!route.routes?.length || !!route.subRoutes?.length;
1024
1272
  const children = route.routes || route.subRoutes;
1025
- const [isOpen, setIsOpen] = useState(() => activePath.startsWith(localizedHref) || !!activeRoute?.filePath && !!route.filePath && activeRoute.filePath === route.filePath);
1026
- const [prevActivePath, setPrevActivePath] = useState(activePath);
1027
- if (activePath !== prevActivePath) {
1028
- setPrevActivePath(activePath);
1029
- if (activePath.startsWith(localizedHref) || !!activeRoute?.filePath && !!route.filePath && activeRoute.filePath === route.filePath) setIsOpen(true);
1030
- }
1273
+ const shouldBeOpen = activePath.startsWith(localizedHref) || !!activeRoute?.filePath && !!route.filePath && activeRoute.filePath === route.filePath;
1274
+ const [isOpen, setIsOpen] = useState(() => shouldBeOpen);
1275
+ useEffect(() => {
1276
+ if (shouldBeOpen) setIsOpen(true);
1277
+ }, [shouldBeOpen]);
1278
+ const renderChild = (subRoute) => /* @__PURE__ */ jsx(Fragment, { children: renderItem ? renderItem(subRoute, depth + 1) : /* @__PURE__ */ jsx(SidebarItem, {
1279
+ route: subRoute,
1280
+ activePath,
1281
+ activeRoute,
1282
+ depth: depth + 1,
1283
+ classNames
1284
+ }) }, subRoute.path);
1031
1285
  if (hasChildren) return /* @__PURE__ */ jsx(SidebarSubGroup, {
1032
1286
  label: route.title,
1033
1287
  href: route.path,
@@ -1036,12 +1290,13 @@ function SidebarItem({ route, activePath, activeRoute, className }) {
1036
1290
  badge: route.badge,
1037
1291
  isOpen,
1038
1292
  onToggle: () => setIsOpen(!isOpen),
1039
- className,
1040
- children: children?.map((subRoute) => /* @__PURE__ */ jsx(SidebarItem, {
1041
- route: subRoute,
1042
- activePath,
1043
- activeRoute
1044
- }, subRoute.path))
1293
+ depth,
1294
+ rootClassName: classNames?.subgroup,
1295
+ linkClassName: cn(classNames?.subgroupLink, className),
1296
+ contentClassName: classNames?.subgroupContent,
1297
+ toggleClassName: classNames?.toggle,
1298
+ wrapperClassName: classNames?.subgroupWrapper,
1299
+ children: children?.map(renderChild)
1045
1300
  });
1046
1301
  return /* @__PURE__ */ jsx(SidebarLink, {
1047
1302
  label: route.title,
@@ -1049,67 +1304,74 @@ function SidebarItem({ route, activePath, activeRoute, className }) {
1049
1304
  active: isCurrent,
1050
1305
  icon: getIcon(route.icon),
1051
1306
  badge: route.badge,
1052
- className
1307
+ depth,
1308
+ className: cn(classNames?.item, className),
1309
+ iconClassName: classNames?.itemIcon,
1310
+ labelClassName: classNames?.itemLabel,
1311
+ badgeClassName: classNames?.itemBadge
1053
1312
  });
1054
1313
  }
1055
- const isRouteActive = (route, activePath, activeRoute) => {
1056
- const normalizedPath = route.path.endsWith("/") ? route.path.slice(0, -1) : route.path;
1057
- if ((activePath.endsWith("/") ? activePath.slice(0, -1) : activePath) === normalizedPath) return true;
1058
- if (activeRoute?.filePath && route.filePath && activeRoute.filePath === route.filePath) return true;
1059
- if (route.routes && route.routes.some((r) => isRouteActive(r, activePath, activeRoute))) return true;
1060
- if (route.subRoutes && route.subRoutes.some((r) => isRouteActive(r, activePath, activeRoute))) return true;
1061
- return false;
1062
- };
1063
- function SidebarItems({ routes, className }) {
1064
- const { groups, ungrouped, activePath, activeRoute } = useSidebar(routes);
1065
- const mergedItems = [...ungrouped.map((route) => ({
1066
- type: "link",
1067
- position: route.sidebarPosition ?? 999,
1068
- title: route.title,
1069
- route
1070
- })), ...groups.map((group) => ({
1071
- type: "group",
1072
- position: group.sidebarPosition ?? 999,
1073
- title: group.title,
1074
- group
1075
- }))].sort((a, b) => {
1076
- if (a.position !== b.position) return a.position - b.position;
1077
- if (a.type !== b.type) return a.type === "link" ? -1 : 1;
1078
- return a.title.localeCompare(b.title);
1079
- });
1314
+ function SidebarItems({ routes, className, classNames, componentItem, componentGroup }) {
1315
+ const { merged, activePath, activeRoute, isGroupActive } = useSidebar(routes);
1316
+ const renderItem = (route, depth) => {
1317
+ if (componentItem) return componentItem({
1318
+ route,
1319
+ activePath,
1320
+ activeRoute,
1321
+ isActive: isRouteActive(route, activePath, activeRoute),
1322
+ depth
1323
+ });
1324
+ return /* @__PURE__ */ jsx(SidebarItem, {
1325
+ route,
1326
+ activePath,
1327
+ activeRoute,
1328
+ depth,
1329
+ renderItem,
1330
+ classNames
1331
+ });
1332
+ };
1080
1333
  const renderedElements = [];
1081
1334
  let currentUngrouped = [];
1082
1335
  const pushUngrouped = () => {
1083
1336
  if (currentUngrouped.length > 0) {
1084
1337
  const routesToRender = [...currentUngrouped];
1085
- renderedElements.push(/* @__PURE__ */ jsx(SidebarGroup, { children: routesToRender.map((route) => /* @__PURE__ */ jsx(SidebarItem, {
1086
- route,
1087
- activePath,
1088
- activeRoute
1089
- }, route.path)) }, `ungrouped-${routesToRender[0].path}`));
1338
+ renderedElements.push(/* @__PURE__ */ jsx(SidebarGroup, {
1339
+ className: classNames?.group,
1340
+ headerClassName: classNames?.groupHeader,
1341
+ iconClassName: classNames?.groupIcon,
1342
+ titleClassName: classNames?.groupTitle,
1343
+ contentClassName: classNames?.groupContent,
1344
+ children: routesToRender.map((route) => /* @__PURE__ */ jsx(Fragment, { children: renderItem(route, 0) }, route.path))
1345
+ }, `ungrouped-${routesToRender[0]?.path || "root"}`));
1090
1346
  currentUngrouped = [];
1091
1347
  }
1092
1348
  };
1093
- for (const item of mergedItems) if (item.type === "link") currentUngrouped.push(item.route);
1349
+ for (const item of merged) if (item.type === "link") currentUngrouped.push(item.route);
1094
1350
  else {
1095
1351
  pushUngrouped();
1096
- const isGroupActive = item.group.routes.some((route) => isRouteActive(route, activePath, activeRoute));
1097
- renderedElements.push(/* @__PURE__ */ jsx(SidebarGroup, {
1352
+ const groupActive = isGroupActive(item.group);
1353
+ const groupChildren = item.group.routes.map((route) => /* @__PURE__ */ jsx(Fragment, { children: renderItem(route, 1) }, route.path));
1354
+ renderedElements.push(componentGroup ? /* @__PURE__ */ jsx(Fragment, { children: componentGroup({
1355
+ group: item.group,
1356
+ isGroupActive: groupActive,
1357
+ children: groupChildren
1358
+ }) }, item.group.title) : /* @__PURE__ */ jsx(SidebarGroup, {
1098
1359
  title: item.group.title,
1099
1360
  icon: getIcon(item.group.icon),
1100
1361
  collapsible: item.group.collapsible,
1101
1362
  collapsed: item.group.collapsed,
1102
- active: isGroupActive,
1103
- children: item.group.routes.map((route) => /* @__PURE__ */ jsx(SidebarItem, {
1104
- route,
1105
- activePath,
1106
- activeRoute
1107
- }, route.path))
1363
+ active: groupActive,
1364
+ className: classNames?.group,
1365
+ headerClassName: classNames?.groupHeader,
1366
+ iconClassName: classNames?.groupIcon,
1367
+ titleClassName: classNames?.groupTitle,
1368
+ contentClassName: classNames?.groupContent,
1369
+ children: groupChildren
1108
1370
  }, item.group.title));
1109
1371
  }
1110
1372
  pushUngrouped();
1111
1373
  return /* @__PURE__ */ jsx("div", {
1112
- className: cn("flex flex-col gap-6", className),
1374
+ className,
1113
1375
  children: renderedElements
1114
1376
  });
1115
1377
  }
@@ -1166,12 +1428,13 @@ function Content({ children, className, style }) {
1166
1428
  children
1167
1429
  });
1168
1430
  }
1169
- function ContentMdx({ children, className, style }) {
1431
+ function ContentMdx({ children, className, style, contentClassName, contentStyle }) {
1170
1432
  return /* @__PURE__ */ jsxs("div", {
1171
- className: cn("boltdocs-page w-full pt-4 pb-20 px-4 sm:px-8", className),
1433
+ className: cn("boltdocs-page w-full", className),
1172
1434
  style,
1173
1435
  children: [/* @__PURE__ */ jsx(SearchHighlight, {}), /* @__PURE__ */ jsx("div", {
1174
- className: "mx-auto w-full max-w-3xl sm:max-w-4xl lg:max-w-5xl",
1436
+ className: cn("mx-auto w-full max-w-3xl sm:max-w-4xl lg:max-w-5xl", contentClassName),
1437
+ style: contentStyle,
1175
1438
  children
1176
1439
  })]
1177
1440
  });
@@ -1183,20 +1446,12 @@ function Header({ children, className, style }) {
1183
1446
  children
1184
1447
  });
1185
1448
  }
1186
- function Footer({ children, className, style }) {
1187
- return /* @__PURE__ */ jsx("div", {
1188
- className: cn("mt-20", className),
1189
- style,
1190
- children
1191
- });
1192
- }
1193
1449
  const DocsLayout = Object.assign(DocsLayoutRoot, {
1194
1450
  Body,
1195
1451
  Content,
1196
1452
  ContentMdx,
1197
- Header,
1198
- Footer
1453
+ Header
1199
1454
  });
1200
1455
 
1201
1456
  //#endregion
1202
- export { useUI as A, useSidebar as C, ButtonGroup as D, Popover$1 as E, Breadcrumbs$1 as O, useLocation$1 as S, Menu as T, ScrollProvider as _, SidebarHeader as a, useItems as b, SidebarLink as c, SidebarSubGroup as d, PageNav as f, OnThisPageTree as g, OnThisPageItems as h, SidebarGroup as i, UIProvider as k, SidebarMobile as l, OnThisPage as m, Sidebar as n, SidebarItem as o, AnchorProvider as p, SidebarContent as r, SidebarItems as s, DocsLayout as t, SidebarRoot as u, useActiveAnchor as v, Tabs as w, useSearchHighlight as x, useActiveAnchors as y };
1457
+ export { UIProvider as A, IconRenderer as C, Popover$1 as D, Menu as E, ButtonGroup as O, useSidebar as S, Tabs as T, ScrollProvider as _, SidebarHeader as a, useItems as b, SidebarLink as c, SidebarSubGroup as d, PageNav as f, OnThisPageTree as g, OnThisPageItems as h, SidebarGroup as i, useUI as j, Breadcrumbs$1 as k, SidebarMobile as l, OnThisPage as m, Sidebar as n, SidebarItem as o, AnchorProvider as p, SidebarContent as r, SidebarItems as s, DocsLayout as t, SidebarRoot as u, useActiveAnchor as v, resolveIcon as w, useSearchHighlight as x, useActiveAnchors as y };