boltdocs 2.7.11 → 2.8.1

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 (85) hide show
  1. package/README.md +2 -54
  2. package/dist/banner-3N4Jd_L9.d.ts +100 -0
  3. package/dist/banner-MynZD_Ox.d.cts +100 -0
  4. package/dist/cache-BMUyNiiA.mjs +6 -0
  5. package/dist/cache-CKm45d2w.cjs +6 -0
  6. package/dist/client/index.cjs +782 -443
  7. package/dist/client/index.d.cts +86 -110
  8. package/dist/client/index.d.ts +87 -111
  9. package/dist/client/index.js +773 -439
  10. package/dist/client/mdx.cjs +8 -3
  11. package/dist/client/mdx.d.cts +39 -93
  12. package/dist/client/mdx.d.ts +38 -93
  13. package/dist/client/mdx.js +3 -3
  14. package/dist/client/primitives.cjs +7 -7
  15. package/dist/client/primitives.d.cts +411 -347
  16. package/dist/client/primitives.d.ts +411 -347
  17. package/dist/client/primitives.js +4 -4
  18. package/dist/client/theme/neutral.css +1 -1
  19. package/dist/{docs-layout-BXHV0xw_.cjs → docs-layout-CwCq42Zt.cjs} +95 -178
  20. package/dist/{docs-layout-DwFndmj5.js → docs-layout-Dn6S5g59.js} +99 -163
  21. package/dist/doctor-BArviV8X.cjs +28 -0
  22. package/dist/doctor-CgLA7_Uv.mjs +28 -0
  23. package/dist/{doctor-CrytFkqW.cjs → doctor-DyNUVe96.cjs} +1 -1
  24. package/dist/{routes-DP1vmWRj.cjs → doctor-aN_leTbh.mjs} +1 -1
  25. package/dist/{generator-ClVanhvi.mjs → generator-BHCrLU6h.mjs} +2 -2
  26. package/dist/{generator-CHqxiQhF.cjs → generator-CC2yHzhZ.cjs} +2 -2
  27. package/dist/{icons-dev-3cZMyt8r.cjs → icons-dev-DvJ-hh9x.cjs} +116 -111
  28. package/dist/{icons-dev-Df8OQ481.js → icons-dev-Oju24Wjp.js} +120 -114
  29. package/dist/{image-DtrI2cw3.cjs → image-Ch4-GxdO.cjs} +13 -13
  30. package/dist/{image-jxPb-2iV.js → image-Do8V9PCW.js} +13 -13
  31. package/dist/{mdx-UTTLFWJq.js → mdx-5oeCOFhH.js} +111 -81
  32. package/dist/{mdx-BdWkJTeB.cjs → mdx-BGM7LjW5.cjs} +109 -97
  33. package/dist/node/cli-entry.cjs +3 -1
  34. package/dist/node/cli-entry.mjs +3 -1
  35. package/dist/node/index.cjs +1 -1
  36. package/dist/node/index.d.cts +258 -152
  37. package/dist/node/index.d.mts +258 -150
  38. package/dist/node/index.mjs +1 -1
  39. package/dist/node/routes/worker.cjs +1 -1
  40. package/dist/node/routes/worker.mjs +1 -1
  41. package/dist/node-CefnjllX.cjs +159 -0
  42. package/dist/node-DruKROCt.mjs +159 -0
  43. package/dist/package-CmP_9rJ8.cjs +6 -0
  44. package/dist/{package-K0zsjGIz.mjs → package-DpbnBMR1.mjs} +1 -1
  45. package/dist/parser-B0YtJPDz.mjs +6 -0
  46. package/dist/parser-B7-6PyQz.cjs +6 -0
  47. package/dist/{parser-Aq8LoH-0.cjs → parser-BzB-zCkF.cjs} +1 -1
  48. package/dist/routes-ChS-zgzh.mjs +6 -0
  49. package/dist/routes-DJNJ-rTt.cjs +6 -0
  50. package/dist/routes-DiYC4nD2.cjs +6 -0
  51. package/dist/routes-rKlxFkqq.mjs +6 -0
  52. package/dist/{search-dialog-C7xuvyNk.cjs → search-dialog-BXVoecTx.cjs} +175 -78
  53. package/dist/{search-dialog-BwkDuI9R.cjs → search-dialog-BYhOov4S.cjs} +118 -7
  54. package/dist/{search-dialog-D-DDN7zJ.js → search-dialog-C09riYmx.js} +113 -8
  55. package/dist/{search-dialog-CIQg6k8c.cjs → search-dialog-CUeAfy-8.cjs} +1 -1
  56. package/dist/{search-dialog-BNF10tDl.js → search-dialog-D8gLkhUV.js} +158 -80
  57. package/dist/{search-dialog-BHuIiUC6.js → search-dialog-DHc_8FFX.js} +1 -1
  58. package/dist/{sidebar-CyZS9YOm.d.ts → sidebar-DNq4_ZAa.d.ts} +117 -51
  59. package/dist/{sidebar-CcBkrm06.d.cts → sidebar-Dlkgbxs6.d.cts} +117 -51
  60. package/dist/utils-BYITg7T5.mjs +7 -0
  61. package/dist/utils-Cjmx1hhk.cjs +7 -0
  62. package/dist/worker-pool-CtqklOXq.cjs +6 -0
  63. package/dist/worker-pool-k0DY6k8T.mjs +6 -0
  64. package/package.json +3 -3
  65. package/src/shared/config-utils.ts +4 -0
  66. package/src/shared/types.ts +52 -6
  67. package/dist/cache-Ba-DZQNH.cjs +0 -6
  68. package/dist/cache-BuMZ58L5.mjs +0 -6
  69. package/dist/cards-BakZPTz9.d.ts +0 -30
  70. package/dist/cards-CQn9mXZS.d.cts +0 -30
  71. package/dist/doctor-Be7Ly1oM.mjs +0 -21
  72. package/dist/doctor-jMxWZyLJ.cjs +0 -21
  73. package/dist/node-BSM4qcDK.cjs +0 -111
  74. package/dist/node-BspZN3R2.mjs +0 -111
  75. package/dist/package-DIIrjuWI.cjs +0 -6
  76. package/dist/parser-CdNbqN5y.cjs +0 -6
  77. package/dist/parser-nE792MLO.mjs +0 -6
  78. package/dist/rolldown-runtime-fkIsjY3S.mjs +0 -6
  79. package/dist/routes-2k3tbUmC.cjs +0 -6
  80. package/dist/routes-CpxZIsMM.mjs +0 -6
  81. package/dist/utils-CG65J0Sc.mjs +0 -7
  82. package/dist/utils-CKunkU96.cjs +0 -7
  83. package/dist/worker-pool-CGn7DrLb.mjs +0 -6
  84. package/dist/worker-pool-Crbqgw5R.cjs +0 -6
  85. /package/dist/{meta-loader-CWg2gnbY.mjs → meta-loader-DzwDFtdT.mjs} +0 -0
@@ -3,58 +3,82 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import { D as ChevronRight, E as ChevronLeft, Y as icons_exports, Z as normalizePath, _ as Link, b as useLocalizedTo, nt as useConfig, w as Check, y as cn } from "./icons-dev-Df8OQ481.js";
6
+ import { A as ChevronRight, D as Check, Q as icons_exports, S as normalizePath, _ as Link$1, b as useLocalizedTo, et as useConfig, k as ChevronLeft, y as cn } from "./icons-dev-Oju24Wjp.js";
7
+ import { Children, createContext, use, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
7
8
  import { useLocation } from "react-router-dom";
8
- import { Children, Component, createContext, use, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
9
9
  import { Fragment, 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
12
  import virtualIcons from "virtual:boltdocs-icons";
13
13
  import scrollIntoView from "scroll-into-view-if-needed";
14
14
 
15
+ //#region src/client/app/ui-context.tsx
16
+ const UIContext = createContext(void 0);
17
+ function UIProvider({ children }) {
18
+ const [isSidebarOpen, setIsSidebarOpen] = useState(false);
19
+ const location = useLocation();
20
+ const toggleSidebar = () => setIsSidebarOpen((prev) => !prev);
21
+ const closeSidebar = () => setIsSidebarOpen(false);
22
+ useEffect(() => {
23
+ setIsSidebarOpen(false);
24
+ }, [location.pathname]);
25
+ return /* @__PURE__ */ jsx(UIContext.Provider, {
26
+ value: {
27
+ isSidebarOpen,
28
+ toggleSidebar,
29
+ closeSidebar
30
+ },
31
+ children
32
+ });
33
+ }
34
+ function useUI() {
35
+ const context = useContext(UIContext);
36
+ if (context === void 0) return {
37
+ isSidebarOpen: false,
38
+ toggleSidebar: () => {},
39
+ closeSidebar: () => {}
40
+ };
41
+ return context;
42
+ }
43
+
44
+ //#endregion
15
45
  //#region src/client/components/primitives/breadcrumbs.tsx
16
- const Breadcrumbs$1 = ({ children, className, ...props }) => {
46
+ function Breadcrumbs$1({ children, className, ...props }) {
17
47
  return /* @__PURE__ */ jsx(Breadcrumbs, {
18
48
  className: cn("flex flex-wrap items-center", className),
19
49
  ...props,
20
50
  children
21
51
  });
22
- };
23
- const BreadcrumbsItem = ({ children, className, ...props }) => {
52
+ }
53
+ function BreadcrumbsItem({ children, className, ...props }) {
24
54
  return /* @__PURE__ */ jsx(Breadcrumb, {
25
55
  className: cn("flex items-center", className),
26
56
  ...props,
27
57
  children
28
58
  });
29
- };
30
- const BreadcrumbsLink = ({ children, href, className, ...props }) => {
31
- return /* @__PURE__ */ jsx(Link, {
59
+ }
60
+ function BreadcrumbsLink({ children, href, className, ...props }) {
61
+ return /* @__PURE__ */ jsx(Link$1, {
32
62
  href,
33
63
  className: cn("cursor-pointer", className),
34
64
  ...props,
35
65
  children
36
66
  });
37
- };
38
- const BreadcrumbsSeparator = ({ className }) => {
67
+ }
68
+ function BreadcrumbsSeparator({ className }) {
39
69
  return /* @__PURE__ */ jsx(ChevronRight, {
40
70
  size: 14,
41
71
  className: cn("shrink-0", className)
42
72
  });
43
- };
73
+ }
44
74
  Breadcrumbs$1.Root = Breadcrumbs$1;
45
75
  Breadcrumbs$1.Item = BreadcrumbsItem;
46
76
  Breadcrumbs$1.Link = BreadcrumbsLink;
47
77
  Breadcrumbs$1.Separator = BreadcrumbsSeparator;
48
78
 
49
- //#endregion
50
- //#region src/client/components/primitives/button.tsx
51
- const Button$1 = ({ ...props }) => {
52
- return /* @__PURE__ */ jsx(RAC.Button, { ...props });
53
- };
54
-
55
79
  //#endregion
56
80
  //#region src/client/components/primitives/button-group.tsx
57
- const ButtonGroup = ({ children, className, vertical = false }) => {
81
+ function ButtonGroup({ children, className, vertical = false }) {
58
82
  return /* @__PURE__ */ jsx("div", {
59
83
  className: cn("inline-flex", vertical ? "flex-col" : "flex-row", !vertical && [
60
84
  "[&>*:not(:first-child)]:-ml-px",
@@ -73,21 +97,21 @@ const ButtonGroup = ({ children, className, vertical = false }) => {
73
97
  ], className),
74
98
  children
75
99
  });
76
- };
100
+ }
77
101
 
78
102
  //#endregion
79
103
  //#region src/client/components/primitives/popover.tsx
80
104
  /**
81
105
  * A reusable Popover primitive with premium glassmorphism styling and smooth animations.
82
106
  */
83
- const Popover$1 = ({ children, className, ...props }) => {
107
+ function Popover$1({ children, className, ...props }) {
84
108
  return /* @__PURE__ */ jsx(Popover, {
85
109
  offset: 8,
86
110
  className: cn("z-50 overflow-auto outline-none transition-none", className),
87
111
  ...props,
88
112
  children
89
113
  });
90
- };
114
+ }
91
115
 
92
116
  //#endregion
93
117
  //#region src/client/components/primitives/menu.tsx
@@ -174,85 +198,23 @@ Menu.SubTrigger = SubmenuTrigger;
174
198
  Menu.Section = MenuSection;
175
199
  Menu.Separator = MenuSeparator;
176
200
 
177
- //#endregion
178
- //#region src/client/components/primitives/error-boundary.tsx
179
- var ErrorBoundary = class extends Component {
180
- state = {
181
- hasError: false,
182
- error: null
183
- };
184
- static getDerivedStateFromError(error) {
185
- return {
186
- hasError: true,
187
- error
188
- };
189
- }
190
- componentDidCatch(error, errorInfo) {
191
- if (this.props.onError) this.props.onError(error, errorInfo);
192
- else console.error("ErrorBoundary caught an unhandled error:", error, errorInfo);
193
- }
194
- resetErrorBoundary = () => {
195
- if (this.props.onReset) this.props.onReset();
196
- this.setState({
197
- hasError: false,
198
- error: null
199
- });
200
- };
201
- render() {
202
- const { hasError, error } = this.state;
203
- const { children, fallback, FallbackComponent } = this.props;
204
- if (hasError && error) {
205
- if (FallbackComponent) return /* @__PURE__ */ jsx(FallbackComponent, {
206
- error,
207
- resetErrorBoundary: this.resetErrorBoundary
208
- });
209
- if (fallback) return fallback;
210
- return /* @__PURE__ */ jsx(ErrorBoundaryFallback, {
211
- error,
212
- resetErrorBoundary: this.resetErrorBoundary
213
- });
214
- }
215
- return children;
216
- }
217
- };
218
- function ErrorBoundaryFallback({ error, resetErrorBoundary }) {
219
- return /* @__PURE__ */ jsxs("div", {
220
- className: "flex flex-col items-center justify-center min-h-[40vh] text-center gap-4 px-6 py-8 border border-subtle bg-surface rounded-2xl max-w-lg mx-auto shadow-xs",
221
- children: [
222
- /* @__PURE__ */ jsx("div", {
223
- className: "text-lg font-bold text-rose-600 dark:text-rose-400",
224
- children: "Something went wrong"
225
- }),
226
- /* @__PURE__ */ jsx("p", {
227
- className: "text-sm text-muted max-w-sm leading-relaxed",
228
- children: error?.message || "An unexpected error occurred while rendering this page."
229
- }),
230
- /* @__PURE__ */ jsx(Button$1, {
231
- className: "rounded-xl border border-subtle bg-main px-6 py-2.5 text-xs font-semibold text-body hover:bg-primary-50/50 hover:border-primary-500/50 transition-all duration-300 cursor-pointer outline-none select-none",
232
- onPress: resetErrorBoundary,
233
- children: "Try again"
234
- })
235
- ]
236
- });
237
- }
238
-
239
201
  //#endregion
240
202
  //#region src/client/components/primitives/tabs.tsx
241
- const Tabs = ({ children, className = "", ...props }) => {
203
+ function Tabs({ children, className = "", ...props }) {
242
204
  return /* @__PURE__ */ jsx("div", {
243
205
  className: cn("w-full", className),
244
206
  ...props,
245
207
  children
246
208
  });
247
- };
248
- const TabsList = ({ children, className = "" }) => {
209
+ }
210
+ function TabsList({ children, className = "" }) {
249
211
  return /* @__PURE__ */ jsx("div", {
250
212
  role: "tablist",
251
- className: cn("relative flex flex-row items-center", className),
213
+ className: cn("relative flex flex-row items-center overflow-x-auto", className),
252
214
  children
253
215
  });
254
- };
255
- const TabsItem = ({ children, id, selected, className = "", ...props }) => {
216
+ }
217
+ function TabsItem({ children, id, selected, className = "", ...props }) {
256
218
  return /* @__PURE__ */ jsx("button", {
257
219
  role: "tab",
258
220
  "aria-selected": selected,
@@ -261,55 +223,25 @@ const TabsItem = ({ children, id, selected, className = "", ...props }) => {
261
223
  ...props,
262
224
  children
263
225
  });
264
- };
265
- const TabsContent = ({ children, className = "" }) => {
226
+ }
227
+ function TabsContent({ children, className = "" }) {
266
228
  return /* @__PURE__ */ jsx("div", {
267
229
  className: cn("outline-none", className),
268
230
  children
269
231
  });
270
- };
271
- const TabsIndicator = ({ className = "", style }) => {
232
+ }
233
+ function TabsIndicator({ className = "", style }) {
272
234
  return /* @__PURE__ */ jsx("div", {
273
235
  className: cn("absolute bottom-0", className),
274
236
  style
275
237
  });
276
- };
238
+ }
277
239
  Tabs.Root = Tabs;
278
240
  Tabs.List = TabsList;
279
241
  Tabs.Item = TabsItem;
280
242
  Tabs.Content = TabsContent;
281
243
  Tabs.Indicator = TabsIndicator;
282
244
 
283
- //#endregion
284
- //#region src/client/app/ui-context.tsx
285
- const UIContext = createContext(void 0);
286
- function UIProvider({ children }) {
287
- const [isSidebarOpen, setIsSidebarOpen] = useState(false);
288
- const location = useLocation();
289
- const toggleSidebar = () => setIsSidebarOpen((prev) => !prev);
290
- const closeSidebar = () => setIsSidebarOpen(false);
291
- useEffect(() => {
292
- setIsSidebarOpen(false);
293
- }, [location.pathname]);
294
- return /* @__PURE__ */ jsx(UIContext.Provider, {
295
- value: {
296
- isSidebarOpen,
297
- toggleSidebar,
298
- closeSidebar
299
- },
300
- children
301
- });
302
- }
303
- function useUI() {
304
- const context = useContext(UIContext);
305
- if (context === void 0) return {
306
- isSidebarOpen: false,
307
- toggleSidebar: () => {},
308
- closeSidebar: () => {}
309
- };
310
- return context;
311
- }
312
-
313
245
  //#endregion
314
246
  //#region src/client/components/primitives/helpers/observer.ts
315
247
  function getItemId(url) {
@@ -320,6 +252,7 @@ var Observer = class {
320
252
  items = [];
321
253
  single = false;
322
254
  observer = null;
255
+ timers = [];
323
256
  onChange;
324
257
  callback(_entries) {
325
258
  for (const item of this.items) {
@@ -383,9 +316,9 @@ var Observer = class {
383
316
  }
384
317
  this.watchItems();
385
318
  if (typeof window !== "undefined") {
386
- setTimeout(() => this.watchItems(), 100);
387
- setTimeout(() => this.watchItems(), 500);
388
- setTimeout(() => this.watchItems(), 1e3);
319
+ this.timers.push(setTimeout(() => this.watchItems(), 100));
320
+ this.timers.push(setTimeout(() => this.watchItems(), 500));
321
+ this.timers.push(setTimeout(() => this.watchItems(), 1e3));
389
322
  }
390
323
  this.onChange?.();
391
324
  }
@@ -403,6 +336,8 @@ var Observer = class {
403
336
  }
404
337
  }
405
338
  unwatch() {
339
+ for (const timer of this.timers) clearTimeout(timer);
340
+ this.timers = [];
406
341
  this.observer?.disconnect();
407
342
  this.observer = null;
408
343
  }
@@ -470,20 +405,20 @@ function AnchorProvider({ toc, single = false, observerOptions, children }) {
470
405
  children
471
406
  });
472
407
  }
473
- const OnThisPage = ({ children, className }) => {
408
+ function OnThisPage({ children, className }) {
474
409
  return /* @__PURE__ */ jsx("nav", {
475
410
  className: cn("sticky top-navbar hidden xl:flex flex-col shrink-0", "w-toc", "py-4 pl-6 pr-4", className),
476
411
  children
477
412
  });
478
- };
479
- const OnThisPageHeader = ({ children, className, ...props }) => {
413
+ }
414
+ function OnThisPageHeader({ children, className, ...props }) {
480
415
  return /* @__PURE__ */ jsx("div", {
481
416
  className: cn("mb-4 text-xs font-bold text-body", className),
482
417
  ...props,
483
418
  children
484
419
  });
485
- };
486
- const OnThisPageContent = ({ children, className, ref, ...props }) => {
420
+ }
421
+ function OnThisPageContent({ children, className, ref, ...props }) {
487
422
  const internalRef = useRef(null);
488
423
  useImperativeHandle(ref, () => internalRef.current);
489
424
  return /* @__PURE__ */ jsx("div", {
@@ -496,21 +431,21 @@ const OnThisPageContent = ({ children, className, ref, ...props }) => {
496
431
  ...props,
497
432
  children
498
433
  });
499
- };
434
+ }
500
435
  OnThisPageContent.displayName = "OnThisPageContent";
501
- const OnThisPageList = ({ children, className }) => {
436
+ function OnThisPageList({ children, className }) {
502
437
  return /* @__PURE__ */ jsx("ul", {
503
438
  className: cn("relative space-y-0.5 text-sm border-l border-subtle", className),
504
439
  children
505
440
  });
506
- };
507
- const OnThisPageItem = ({ level, children, className }) => {
441
+ }
442
+ function OnThisPageItem({ level, children, className }) {
508
443
  return /* @__PURE__ */ jsx("li", {
509
444
  className: cn(level === 3 && "pl-3", className),
510
445
  children
511
446
  });
512
- };
513
- const OnThisPageLink = ({ children, href, active, onClick, className }) => {
447
+ }
448
+ function OnThisPageLink({ children, href, active, onClick, className }) {
514
449
  const items = use(ItemsContext);
515
450
  const containerRef = use(ScrollContext);
516
451
  const id = href ? getItemId(href) : null;
@@ -545,8 +480,8 @@ const OnThisPageLink = ({ children, href, active, onClick, className }) => {
545
480
  className: cn("block py-0.5 pl-4 text-[13px] outline-none transition-colors", computedActive ? "text-primary-500" : "text-muted hover:text-body", className),
546
481
  children
547
482
  });
548
- };
549
- const OnThisPageIndicator = ({ style, className }) => {
483
+ }
484
+ function OnThisPageIndicator({ style, className }) {
550
485
  const containerRef = useRef(null);
551
486
  const [internalStyle, setInternalStyle] = useState({
552
487
  opacity: 0,
@@ -583,7 +518,7 @@ const OnThisPageIndicator = ({ style, className }) => {
583
518
  ...internalStyle
584
519
  }
585
520
  });
586
- };
521
+ }
587
522
  /**
588
523
  * High-level automated list of toc items
589
524
  */
@@ -640,15 +575,15 @@ OnThisPage.Tree = OnThisPageTree;
640
575
 
641
576
  //#endregion
642
577
  //#region src/client/components/primitives/page-nav.tsx
643
- const PageNav = ({ children, className }) => {
578
+ function PageNav({ children, className }) {
644
579
  return /* @__PURE__ */ jsx("nav", {
645
580
  className: cn("grid sm:grid-cols-2 gap-4", className),
646
581
  children
647
582
  });
648
- };
649
- const PageNavLink = ({ children, to, direction, className }) => {
583
+ }
584
+ function PageNavLink({ children, to, direction, className }) {
650
585
  const isNext = direction === "next";
651
- return /* @__PURE__ */ jsxs(Link, {
586
+ return /* @__PURE__ */ jsxs(Link$1, {
652
587
  href: to,
653
588
  className: cn("flex items-center outline-none no-underline", isNext ? "justify-end" : "justify-start", className),
654
589
  children: [
@@ -660,22 +595,22 @@ const PageNavLink = ({ children, to, direction, className }) => {
660
595
  isNext && /* @__PURE__ */ jsx(ChevronRight, { className: "shrink-0" })
661
596
  ]
662
597
  });
663
- };
664
- const PageNavTitle = ({ children, className }) => {
598
+ }
599
+ function PageNavTitle({ children, className }) {
665
600
  return /* @__PURE__ */ jsx("span", {
666
601
  className: cn(className),
667
602
  children
668
603
  });
669
- };
670
- const PageNavDescription = ({ children, className }) => {
604
+ }
605
+ function PageNavDescription({ children, className }) {
671
606
  return /* @__PURE__ */ jsx("span", {
672
607
  className: cn("truncate", className),
673
608
  children
674
609
  });
675
- };
676
- const PageNavIcon = ({ children }) => {
610
+ }
611
+ function PageNavIcon({ children }) {
677
612
  return /* @__PURE__ */ jsx(Fragment, { children });
678
- };
613
+ }
679
614
  PageNav.Root = PageNav;
680
615
  PageNav.Link = PageNavLink;
681
616
  PageNav.Title = PageNavTitle;
@@ -690,7 +625,8 @@ function useSidebar(routes) {
690
625
  return useMemo(() => {
691
626
  const activeRoute = routes.find((r) => normalizePath(r.path) === currentPath);
692
627
  const activeTabId = activeRoute?.tab?.toLowerCase();
693
- const filteredRoutes = activeTabId ? routes.filter((r) => !r.tab || r.tab.toLowerCase() === activeTabId) : routes;
628
+ const noCollection = routes.filter((r) => !r.collection);
629
+ const filteredRoutes = activeTabId ? noCollection.filter((r) => !r.tab || r.tab.toLowerCase() === activeTabId) : noCollection;
694
630
  const directoryMeta = {};
695
631
  if (config.directoryMeta) for (const [key, value] of Object.entries(config.directoryMeta)) {
696
632
  const cleanKey = key.split("/").filter((part) => !part.startsWith("(") || !part.endsWith(")")).map((part) => part.replace(/^\d+-/, "")).join("/");
@@ -815,7 +751,7 @@ function getIcon(iconName) {
815
751
  /**
816
752
  * Internal Badge component for links
817
753
  */
818
- const Badge = ({ badge }) => {
754
+ function Badge({ badge }) {
819
755
  const colors = {
820
756
  new: "bg-primary-500/10 text-primary-500 border border-primary-500/20",
821
757
  updated: "bg-emerald-500/10 text-emerald-500 border border-emerald-500/20",
@@ -827,7 +763,7 @@ const Badge = ({ badge }) => {
827
763
  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),
828
764
  children: text
829
765
  });
830
- };
766
+ }
831
767
  /**
832
768
  * Desktop Sidebar Container
833
769
  */
@@ -894,7 +830,7 @@ function SidebarContent({ children, className }) {
894
830
  /**
895
831
  * Navigation Group
896
832
  */
897
- const SidebarGroup = ({ title, icon: Icon, children, className }) => {
833
+ function SidebarGroup({ title, icon: Icon, children, className }) {
898
834
  return /* @__PURE__ */ jsxs("div", {
899
835
  className,
900
836
  children: [title && /* @__PURE__ */ jsxs("h4", {
@@ -905,9 +841,9 @@ const SidebarGroup = ({ title, icon: Icon, children, className }) => {
905
841
  children
906
842
  })]
907
843
  });
908
- };
909
- const SidebarLink = ({ label, href, active, icon: Icon, badge, className }) => {
910
- return /* @__PURE__ */ jsxs(Link, {
844
+ }
845
+ function SidebarLink({ label, href, active, icon: Icon, badge, className }) {
846
+ return /* @__PURE__ */ jsxs(Link$1, {
911
847
  href,
912
848
  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),
913
849
  children: [
@@ -922,11 +858,11 @@ const SidebarLink = ({ label, href, active, icon: Icon, badge, className }) => {
922
858
  badge && /* @__PURE__ */ jsx(Badge, { badge })
923
859
  ]
924
860
  });
925
- };
861
+ }
926
862
  /**
927
863
  * Nested SubGroup
928
864
  */
929
- const SidebarSubGroup = ({ label, href, active, icon: Icon, badge, isOpen, onToggle, children, className }) => {
865
+ function SidebarSubGroup({ label, href, active, icon: Icon, badge, isOpen, onToggle, children, className }) {
930
866
  return /* @__PURE__ */ jsxs("div", {
931
867
  className: "flex flex-col gap-0.5",
932
868
  children: [/* @__PURE__ */ jsxs("div", {
@@ -955,7 +891,7 @@ const SidebarSubGroup = ({ label, href, active, icon: Icon, badge, isOpen, onTog
955
891
  children
956
892
  })]
957
893
  });
958
- };
894
+ }
959
895
  function SidebarItem({ route, activePath, activeRoute, className }) {
960
896
  const localizedHref = useLocalizedTo(route.path);
961
897
  const isCurrent = activePath === (localizedHref.endsWith("/") ? localizedHref.slice(0, -1) : localizedHref) || !!activeRoute?.filePath && !!route.filePath && activeRoute.filePath === route.filePath;
@@ -1228,4 +1164,4 @@ const DocsLayout = Object.assign(DocsLayoutRoot, {
1228
1164
  });
1229
1165
 
1230
1166
  //#endregion
1231
- export { Popover$1 as A, useItems as C, ErrorBoundary as D, Tabs as E, Button$1 as M, Breadcrumbs$1 as N, ErrorBoundaryFallback as O, useActiveAnchors as S, useUI as T, OnThisPage as _, SidebarContent as a, ScrollProvider as b, SidebarItem as c, SidebarMobile as d, SidebarRoot as f, AnchorProvider as g, PageNav as h, Sidebar as i, ButtonGroup as j, Menu as k, SidebarItems as l, useSidebar as m, useSearchHighlight as n, SidebarGroup as o, SidebarSubGroup as p, useLocation$1 as r, SidebarHeader as s, DocsLayout as t, SidebarLink as u, OnThisPageItems as v, UIProvider as w, useActiveAnchor as x, OnThisPageTree as y };
1167
+ export { useUI as A, useItems as C, ButtonGroup as D, Popover$1 as E, Breadcrumbs$1 as O, useActiveAnchors as S, Menu as T, OnThisPage as _, SidebarContent as a, ScrollProvider as b, SidebarItem as c, SidebarMobile as d, SidebarRoot as f, AnchorProvider as g, PageNav as h, Sidebar as i, UIProvider as k, SidebarItems as l, useSidebar as m, useSearchHighlight as n, SidebarGroup as o, SidebarSubGroup as p, useLocation$1 as r, SidebarHeader as s, DocsLayout as t, SidebarLink as u, OnThisPageItems as v, Tabs as w, useActiveAnchor as x, OnThisPageTree as y };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Boltdocs - https://boltdocs.vercel.app
3
+ * Copyright (c) 2026 Jesus Alcala
4
+ * Licensed under the MIT License.
5
+ */
6
+ const e=require(`./chunk-CU-zTemE.cjs`),t=require(`./utils-Cjmx1hhk.cjs`);let n=require(`vite`),r=require(`node:path`);r=e.t(r);let i=require(`fdir`),a=require(`node:fs`);a=e.t(a);let o=require(`zod`),s=require(`@bdocs/dui`);s=e.t(s);let c=require(`node:module`),l=require(`picomatch`);l=e.t(l);let u=require(`fastest-levenshtein`);const d=o.z.object({icon:o.z.string().max(50),link:o.z.string().url()});o.z.object({text:o.z.string().max(2e3).optional()});const f=o.z.object({name:o.z.string(),enforce:o.z.enum([`pre`,`post`]).optional(),version:o.z.string().optional(),boltdocsVersion:o.z.string().optional(),remarkPlugins:o.z.array(o.z.unknown()).optional(),rehypePlugins:o.z.array(o.z.unknown()).optional(),vitePlugins:o.z.array(o.z.unknown()).optional(),components:o.z.record(o.z.string(),o.z.string()).optional(),hooks:o.z.record(o.z.string(),o.z.unknown()).optional()}),p=o.z.object({title:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]).optional(),description:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]).optional(),logo:o.z.union([o.z.string(),o.z.object({dark:o.z.string(),light:o.z.string(),alt:o.z.string().optional(),width:o.z.number().optional(),height:o.z.number().optional()})]).optional(),navbar:o.z.array(o.z.object({label:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]),href:o.z.string(),items:o.z.array(o.z.object({label:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]),href:o.z.string()})).optional()})).optional(),sidebar:o.z.record(o.z.string(),o.z.array(o.z.object({text:o.z.string(),link:o.z.string()}))).optional(),sidebarGroups:o.z.record(o.z.string(),o.z.object({title:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]).optional(),icon:o.z.string().optional()})).optional(),socialLinks:o.z.array(d).optional(),editLink:o.z.string().refine(e=>!e||e.includes(`:path`),{message:`editLink must contain ':path' placeholder if specified`}).optional(),communityHelp:o.z.string().url().optional(),version:o.z.string().max(50).optional(),githubRepo:o.z.string().max(100).optional(),favicon:o.z.string().optional(),tabs:o.z.array(o.z.object({id:o.z.string(),text:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]),icon:o.z.string().optional()})).optional(),codeTheme:o.z.union([o.z.string(),o.z.object({light:o.z.string(),dark:o.z.string()})]).optional()}),m=o.z.union([o.z.string(),o.z.object({rules:o.z.array(o.z.object({userAgent:o.z.string(),allow:o.z.union([o.z.string(),o.z.array(o.z.string())]).optional(),disallow:o.z.union([o.z.string(),o.z.array(o.z.string())]).optional()})).optional(),sitemaps:o.z.array(o.z.string().url()).optional()})]),h=o.z.object({defaultLocale:o.z.string(),locales:o.z.union([o.z.record(o.z.string(),o.z.string()),o.z.array(o.z.string())]).transform(e=>Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e),localeConfigs:o.z.record(o.z.string(),o.z.object({label:o.z.string().optional(),direction:o.z.enum([`ltr`,`rtl`]).optional(),htmlLang:o.z.string().optional(),calendar:o.z.string().optional()})).optional()}),g=o.z.object({defaultVersion:o.z.string(),prefix:o.z.string().optional(),versions:o.z.array(o.z.object({label:o.z.string(),path:o.z.string()}))}),_=o.z.object({headers:o.z.record(o.z.string(),o.z.string()).optional(),enableCSP:o.z.boolean().optional(),customHeaders:o.z.record(o.z.string(),o.z.string()).optional()}),v=o.z.object({metatags:o.z.record(o.z.string(),o.z.string()).optional(),indexing:o.z.enum([`all`,`public`]).optional(),thumbnails:o.z.object({background:o.z.string().optional()}).optional()}),y=o.z.object({measurementId:o.z.string().min(1,`Measurement ID is required for GA4`),debug:o.z.boolean().optional(),anonymizeIp:o.z.boolean().optional(),sendPageView:o.z.boolean().optional(),cookieFlags:o.z.string().optional(),autoTrack:o.z.object({pageViews:o.z.boolean().optional(),downloads:o.z.boolean().optional(),externalLinks:o.z.boolean().optional(),search:o.z.boolean().optional()}).optional()}),b=o.z.object({tagId:o.z.string().min(1,`Tag ID is required for GTM`),dataLayerName:o.z.string().optional(),preview:o.z.string().optional()}),x=o.z.object({appId:o.z.string().min(1,`Algolia App ID is required`),apiKey:o.z.string().min(1,`Algolia API Key is required`),indexName:o.z.string().min(1,`Algolia Index Name is required`)}),S=o.z.object({ga4:y.optional(),gtm:b.optional(),algolia:x.optional()}),C=o.z.object({siteUrl:o.z.string().url().optional(),docsDir:o.z.string().optional(),base:o.z.string().optional(),theme:p.optional(),i18n:h.optional(),versions:g.optional(),plugins:o.z.array(f).optional(),robots:m.optional(),security:_.optional(),seo:v.optional(),integrations:S.optional(),vite:o.z.record(o.z.string(),o.z.unknown()).optional()});function w(e,t,n=process.cwd(),i){let o=r.default.resolve(n,`.boltdocs`,`generated`);a.default.existsSync(o)||a.default.mkdirSync(o,{recursive:!0});let s=e.i18n?Object.keys(e.i18n.locales):[],c=e.versions?e.versions.versions.map(e=>e.path):[],l=s.length>0?s.map(e=>`'${e}'`).join(` | `):`string`,u=c.length>0?c.map(e=>`'${e}'`).join(` | `):`string`,d=[`tsx`,`ts`,`jsx`,`js`],f=``,p=``;for(let e of d){let i=r.default.resolve(n,t,`mdx-components.${e}`);if(a.default.existsSync(i)){let e=r.default.join(n,t,`mdx-components`),i=r.default.relative(o,e).replace(/\\/g,`/`);f=`import type * as MdxComponentsModule from '${i.startsWith(`.`)?i:`./${i}`}'\n`,p=` MdxComponents: typeof MdxComponentsModule`;break}}let m=i&&i.length>0?`\ndeclare global {
7
+ namespace Boltdocs {
8
+ interface RoutePaths {
9
+ ${i.map(e=>` '${e}': void`).join(`
10
+ `)}
11
+ }
12
+ }
13
+ }`:``,h=`// This file is automatically generated by Boltdocs.
14
+ // Do not edit this file manually.
15
+
16
+ ${f}declare global {
17
+ namespace Boltdocs {
18
+ interface Types {
19
+ Locale: ${l}
20
+ Version: ${u}${p?`\n${p}`:``}
21
+ }
22
+ }
23
+ }${m}
24
+
25
+ export {}
26
+ `;a.default.writeFileSync(r.default.resolve(o,`types.d.ts`),h)}function T(e,t=process.cwd()){let n=r.default.resolve(t,`.boltdocs`,`generated`);a.default.existsSync(n)||a.default.mkdirSync(n,{recursive:!0});let i={routes:Array.from(new Set(e)).sort(),timestamp:Date.now()};a.default.writeFileSync(r.default.resolve(n,`link-tree.json`),JSON.stringify(i,null,2))}function E(e){return e}const D=[`boltdocs.config.js`,`boltdocs.config.mjs`,`boltdocs.config.ts`];async function O(e,i=process.cwd()){let o=i,c={docsDir:r.default.resolve(e),theme:{title:`Boltdocs`,description:`A Vite documentation framework`,navbar:[{label:`Home`,href:`/`},{label:`Documentation`,href:`/docs`}],codeTheme:{light:`github-light`,dark:`github-dark`}}},l={};for(let e of D){let t=r.default.resolve(o,e);if(a.default.existsSync(t))try{let e=await(0,n.loadConfigFromFile)({command:`serve`,mode:`development`},t,o);if(e){l=e.config;break}}catch(t){(0,s.warn)(`Failed to load config from ${e}:`,t)}}let u={title:l.title,description:l.description,logo:l.logo,favicon:l.favicon,navbar:l.navbar,sidebar:l.sidebar,sidebarGroups:l.theme?.sidebarGroups,socialLinks:l.socialLinks,githubRepo:l.githubRepo,tabs:l.tabs,codeTheme:l.codeTheme,communityHelp:l.communityHelp,version:l.version,editLink:l.editLink,...l.theme||{}},d=Object.fromEntries(Object.entries(u).filter(([e,t])=>t!==void 0));d.navbar&&=d.navbar.map(e=>({label:e.label||e.text||``,href:e.href||e.link||e.to||``,items:e.items}));let f={docsDir:r.default.resolve(e),theme:{...c.theme,...d},i18n:l.i18n?{...l.i18n,locales:Array.isArray(l.i18n.locales)?Object.fromEntries(l.i18n.locales.map(e=>[e,e])):l.i18n.locales}:void 0,versions:l.versions,siteUrl:l.siteUrl,base:l.base,seo:l.seo,plugins:l.plugins||[],robots:l.robots,security:l.security,integrations:l.integrations,vite:l.vite},p=C.safeParse(f);if(!p.success)throw new t.v(`Invalid Boltdocs configuration:\n${p.error.issues.map(e=>` - ${e.path.join(`.`)}: ${e.message}`).join(`
27
+ `)}`);return p.data}const k=(0,c.createRequire)(require(`url`).pathToFileURL(__filename).href);let A=0;function j(e,t){let n=e.split(`-`)[0].split(`.`).map(Number),r=t.split(`-`)[0].split(`.`).map(Number);for(let e=0;e<Math.max(n.length,r.length);e++){let t=n[e]??0,i=r[e]??0;if(Number.isNaN(t)||Number.isNaN(i))return!1;if(t!==i)return t>i}return!1}async function M(){try{let e=new AbortController,t=setTimeout(()=>e.abort(),2e3),n=await fetch(`https://registry.npmjs.org/boltdocs/latest`,{signal:e.signal,headers:{Accept:`application/vnd.npm.install-v1+json`}});return clearTimeout(t),n.ok?(await n.json()).version??null:null}catch{return null}}async function N(){try{return k(`boltdocs/package.json`).version}catch{return`0.0.0`}}async function P(){let e=Date.now();if(e-A<864e5)return;A=e;let t=await N();if(t===`0.0.0`)return;let n=await M();n&&j(n,t)&&console.log(s.updateAvailable(t,n))}const F={$schema:`https://boltdocs.vercel.app/schemas/doctor-config.schema.json`,checks:{metadata:{enabled:!0,titleMin:10,titleMax:60,descriptionMin:50,required:[`title`,`description`],optional:[],validateDates:!1},links:{internal:!0,external:!1,timeout:1e4,concurrency:10,ignore:[]},i18n:{enabled:!0},performance:{enabled:!0,budgets:{maxJSBundleSize:`200kb`,maxCSSBundleSize:`30kb`,maxPageHTMLSize:`80kb`,maxImagesKB:500,maxBuildTime:3e4,maxFontCount:3}}},fix:{confirmChanges:!1,backupFiles:!1,backupPath:`.boltdocs/backups`},reporting:{format:`pretty`,outputFile:`.boltdocs/reports/doctor.json`,failOnError:!1,maxWarnings:-1},severity:{missingTranslation:`warning`,brokenLink:`high`,brokenAnchor:`warning`,largeFile:`warning`,orphanedPage:`low`,duplicateTitle:`low`,shortMetadata:`low`,missingMetadata:`warning`,malformedFrontmatter:`high`,invalidFrontmatter:`high`,budgetExceeded:`warning`},exclude:[]};function I(e,t){if(e==null)return t;if(typeof e==`number`)return e;let n=e.toLowerCase().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/);if(!n)return t;let r=Number.parseFloat(n[1]),i=n[2]||`b`;return Math.round(r*({b:1,kb:1024,mb:1024*1024,gb:1024*1024*1024}[i]||1))}function L(e,t,n){return e.doctorConfig.severity[t]||n}async function R(e,t){a.default.existsSync(t)||a.default.mkdirSync(t,{recursive:!0});let n=r.default.basename(e),i=new Date().toISOString().replace(/[:.]/g,`-`),o=r.default.join(t,`${n}.${i}.bak`);a.default.copyFileSync(e,o)}const z=new Map;function B(e){let n=z.get(e);if(n)return n;let r=(async()=>{let n=await t.d(e,!1);return{raw:n.raw,data:n.data,content:n.content}})();return z.set(e,r),r}const V=new Map;function H(e){if(V.has(e))return V.get(e);let t=!1;try{t=a.default.existsSync(e)&&a.default.statSync(e).isFile()}catch{t=!1}return V.set(e,t),t}async function U(e){let t=r.default.resolve(e,`doctor.json`);if(a.default.existsSync(t))try{let e=JSON.parse(a.default.readFileSync(t,`utf-8`));return{...F,...e,checks:{...F.checks,...e.checks,metadata:{...F.checks.metadata,...e.checks?.metadata},links:{...F.checks.links,...e.checks?.links},i18n:{...F.checks.i18n,...e.checks?.i18n},performance:{...F.checks.performance,...e.checks?.performance,budgets:{...F.checks.performance?.budgets,...e.checks?.performance?.budgets}}},fix:{...F.fix,...e.fix},reporting:{...F.reporting,...e.reporting},severity:{...F.severity,...e.severity},exclude:[...F.exclude,...e.exclude||[]]}}catch(e){(0,s.warn)(`Failed to parse doctor.json: ${e}`)}return F}async function W(e,n=process.cwd(),o,s){let c=r.default.resolve(n,`.boltdocs`,`generated`);a.default.existsSync(c)||a.default.mkdirSync(c,{recursive:!0});let l=s;l||=await new i.fdir().withFullPaths().filter(e=>e.endsWith(`.md`)||e.endsWith(`.mdx`)).crawl(e).withPromise();let u=o?.base||`/docs`,d=[];for(let n=0;n<l.length;n+=100){let i=l.slice(n,n+100),a=await Promise.all(i.map(async n=>{let i=r.default.isAbsolute(n)?n:r.default.resolve(e,n),a=r.default.relative(e,i),{data:o}=await B(i),s;return s=o.permalink?o.permalink.startsWith(`/`)?o.permalink:`/${o.permalink}`:t.a(a),u===`/`?s:(u.endsWith(`/`)?u:u+`/`)+(s.startsWith(`/`)?s.substring(1):s)}));d.push(...a)}d.includes(u)||d.push(u);let f={routes:Array.from(new Set(d)).sort(),timestamp:Date.now()};return a.default.writeFileSync(r.default.resolve(c,`link-tree.json`),JSON.stringify(f,null,2)),f}function G(e,t){if(e===t)return 1;if(!e||!t)return 0;let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean),i=n[n.length-1]||``,a=r[r.length-1]||``;if(i===a){let e=0;for(let t of n)r.includes(t)&&e++;return e>=2?.99:.9}if(i.length>3&&a.length>3&&(a.startsWith(i)||i.startsWith(a))&&Math.min(i.length,a.length)/Math.max(i.length,a.length)>.5)return .88;let o=1-(0,u.distance)(i,a)/Math.max(i.length,a.length);return o>.8?o*.95:1-(0,u.distance)(e,t)/Math.max(e.length,t.length)}const K=new Map;function q(e,t){if(K.has(e))return K.get(e);let n=e.length,r=``,i=0;for(let a of t){if(a===e)continue;let t=a.length,o=Math.max(n,t);if(o===0)continue;let s=1-Math.abs(n-t)/o;if(s<=.8&&s<=i)continue;let c=G(e,a);c>i&&(i=c,r=a)}let a={bestMatch:r,similarity:i};return K.set(e,a),a}async function J(e){let n=[];if(!e.doctorConfig.checks.metadata.enabled)return n;let{titleMin:i,titleMax:a,descriptionMin:o}=e.doctorConfig.checks.metadata,s=new Map;for(let c of e.files){let l=t.u(r.default.relative(e.docsDir,c));try{let{raw:r,data:u}=await B(c);if(r.trim().startsWith(`---`)&&r.split(`---`).length>=3&&Object.keys(u).length===0){let t=L(e,`malformedFrontmatter`,`high`);t!==`off`&&n.push({file:l,level:t,message:`Malformed frontmatter (YAML parsing failed).`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}let d=t.y.safeParse(u);if(!d.success){let t=L(e,`invalidFrontmatter`,`high`);if(t!==`off`)for(let e of d.error.issues)n.push({file:l,level:t,message:`Invalid frontmatter field "${e.path.join(`.`)}": ${e.message}`,suggestion:`Ensure the field follows the correct type.`})}let f=Array.from(new Set([`title`,...e.doctorConfig.checks.metadata.required]));for(let t of f)if(u[t]===void 0){let r=L(e,`missingMetadata`,`warning`);r!==`off`&&n.push({file:l,level:r,message:`Missing required frontmatter field: "${t}".`,suggestion:`Add the "${t}" field to your frontmatter.`})}if(e.doctorConfig.checks.metadata.validateDates){let t=[`date`,`lastUpdated`,...e.doctorConfig.checks.metadata.optional.filter(e=>e.toLowerCase().includes(`date`))];for(let r of t)if(u[r]&&Number.isNaN(Date.parse(String(u[r])))){let t=L(e,`invalidFrontmatter`,`high`);t!==`off`&&n.push({file:l,level:t,message:`Invalid date format in field "${r}": "${u[r]}".`,suggestion:`Use a valid ISO date format (e.g., YYYY-MM-DD).`})}}if(u.title){let t=String(u.title);if(t.length<i){let r=L(e,`shortMetadata`,`low`);r!==`off`&&n.push({file:l,level:r,message:`Title is too short (${t.length} chars).`,suggestion:`Titles should be at least ${i} characters for better SEO.`})}else if(t.length>a){let r=L(e,`shortMetadata`,`low`);r!==`off`&&n.push({file:l,level:r,message:`Title is too long (${t.length} chars).`,suggestion:`Titles should be under ${a} characters.`})}let r=s.get(t)||[];r.push(l),s.set(t,r)}if(u.description&&String(u.description).length<o){let t=L(e,`shortMetadata`,`low`);t!==`off`&&n.push({file:l,level:t,message:`Description is very short.`,suggestion:`Descriptions should ideally be at least ${o} characters.`})}}catch(t){if(t instanceof Error){let r=L(e,`malformedFrontmatter`,`high`);r!==`off`&&n.push({file:l,level:r,message:`Malformed frontmatter (YAML error): ${t.message}`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}}}for(let[t,r]of s.entries())if(r.length>1){let i=L(e,`duplicateTitle`,`low`);if(i!==`off`)for(let e of r)n.push({file:e,level:i,message:`Duplicate title found: "${t}"`,suggestion:`Ensure each page has a unique title. Also used in: ${r.filter(t=>t!==e).join(`, `)}`})}return n}async function Y(e){let n=[],{internal:i,external:o,ignore:c,timeout:l,concurrency:u}=e.doctorConfig.checks.links;if(!i&&!o&&!e.options.checkExternal)return n;let d=/(?:\[.*?\]\((.*?)\))|(?:href=["']([^"']+)["'])/g,f=new Set,p=5e5;for(let s of e.files){let l=t.u(r.default.relative(e.docsDir,s)),{content:u}=await B(s),m=[...(u.length>p?u.slice(0,p):u).replace(/```[\s\S]*?```/g,``).replace(/`[^`\n]*`/g,``).matchAll(d)];for(let t of m){let u=t[1]||t[2],d=!!t[1];if(!u||c.some(e=>u.includes(e)))continue;if(/^https?:\/\//i.test(u)){(o||e.options.checkExternal)&&f.add({url:u,file:s});continue}if(!i||/^(mailto|tel|#)/i.test(u))continue;let p;try{p=decodeURIComponent(u.split(`#`)[0].split(`?`)[0])}catch{p=u.split(`#`)[0].split(`?`)[0]}if(!p)continue;let m=!1,h=``;if(p.startsWith(`/`))if(e.routeIndex.has(p)||e.routeIndexWithSlash.has(p)||e.routeIndexWithoutSlash.has(p))m=!0;else{let t=e.basePrefix+(p.startsWith(`/`)?p:`/`+p);if(e.routeIndex.has(t)||e.routeIndexWithSlash.has(t))m=!1,h=t;else{let t=e.config.base!==`/`&&p.startsWith(e.config.base||`/`)?p.substring((e.config.base||`/`).length):p,n=t.startsWith(`/`)?t.substring(1):t;h=r.default.join(e.docsDir,n),m=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`].some(e=>H(h+e))}}else h=r.default.resolve(r.default.dirname(s),p),m=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`].some(e=>H(h+e));if(!m){let{bestMatch:t,similarity:r}=q(p,e.linkTree.routes),i=!1,o=e.basePrefix+(p.startsWith(`/`)?p:`/`+p);(e.routeIndex.has(o)||e.routeIndexWithSlash.has(o))&&(t=o,r=1,i=!0);let c=r>.6||i,f=r>.75&&t!==p||i,m=L(e,`brokenLink`,`high`);m!==`off`&&n.push({file:l,level:m,message:`Broken internal link: "${u}"`,suggestion:c?`Did you mean "${t}"?`:`Ensure the target exists or check for typos.`,fix:f?async()=>{let e=u.includes(`#`)?`#`+u.split(`#`)[1]:``,n=d?`(${u})`:`href="${u}"`,r=d?`(${t}${e})`:`href="${t}${e}"`,i=a.default.readFileSync(s,`utf-8`).replace(n,r);a.default.writeFileSync(s,i),z.delete(s)}:void 0})}}}if(f.size>0){(0,s.info)(s.colors.gray(`Verifying ${f.size} external links...`));let i=new Map;for(let e of f)i.has(e.url)||i.set(e.url,[]),i.get(e.url).push(e.file);let a=async e=>{try{let t=new AbortController,n=setTimeout(()=>t.abort(),l),r=await fetch(e,{method:`HEAD`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}});return clearTimeout(n),!r.ok&&r.status!==404?{url:e,ok:(await fetch(e,{method:`GET`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}})).ok}:{url:e,ok:r.ok}}catch(t){return{url:e,ok:!1,error:t.message}}},o=Array.from(i.keys()),c=[];for(let e=0;e<o.length;e+=u){let t=o.slice(e,e+u),n=await Promise.allSettled(t.map(a));c.push(...n.map(e=>e.status===`fulfilled`?e.value:{url:`unknown`,ok:!1,error:e.reason}))}for(let a of c)if(!a.ok){let o=L(e,`brokenLink`,`warning`);if(o!==`off`){let s=i.get(a.url)||[];for(let i of s)n.push({file:t.u(r.default.relative(e.docsDir,i)),level:o,message:`Broken external link: "${a.url}"`,suggestion:`Verify the URL or update it if it's permanently down. Error: ${a.error||`Status >= 400`}`})}}}return n}async function X(e){let n=[];if(!e.doctorConfig.checks.i18n.enabled||!e.config.i18n)return n;let{defaultLocale:i,locales:o}=e.config.i18n,s=Object.keys(o),c=s.filter(e=>e!==i);for(let o of e.files){let l=t.u(r.default.relative(e.docsDir,o)),u=l.split(`/`),d=u[0];if(d===i){let t=u.slice(1).join(`/`);for(let i of c){let s=r.default.join(e.docsDir,i,t);if(!H(s)){let c=L(e,`missingTranslation`,`warning`);c!==`off`&&n.push({file:l,level:c,message:`Missing translation for locale "${i}"`,suggestion:`Create a version at "${i}/${t}".`,fix:async()=>{let e=r.default.dirname(s);a.default.existsSync(e)||a.default.mkdirSync(e,{recursive:!0}),a.default.copyFileSync(o,s)}})}}}else if(s.includes(d)){let t=u.slice(1).join(`/`);if(!H(r.default.join(e.docsDir,i,t))){let r=L(e,`missingTranslation`,`low`);r!==`off`&&n.push({file:l,level:r,message:`Orphaned translation (source missing in "${i}")`,suggestion:`Remove this file or create the source at "${i}/${t}".`,fix:async()=>{a.default.unlinkSync(o)}})}}}return n}async function Z(e){let t=[];if(!e.config.theme.sidebar)return t;let n=new Set,r=e.config.theme.sidebar;for(let[i,a]of Object.entries(r))for(let r of a){if(!r.text){let n=L(e,`invalidFrontmatter`,`warning`);n!==`off`&&t.push({file:`boltdocs.config.ts`,level:n,message:`Sidebar item in group "${i}" is missing a label.`,suggestion:`Add a "text" property to the sidebar item.`})}if(r.link&&(n.add(r.link),!e.routeIndex.has(r.link))){let{bestMatch:n,similarity:i}=q(r.link,e.linkTree.routes),a=i>.6,o=L(e,`brokenLink`,`high`);o!==`off`&&t.push({file:`boltdocs.config.ts`,level:o,message:`Broken sidebar link: "${r.link}"`,suggestion:a?`Did you mean "${n}"?`:`Ensure the route exists and is correctly formatted.`})}}for(let r of e.linkTree.routes)if(!(r===`/`||r===``)&&!n.has(r)){let n=L(e,`orphanedPage`,`low`);n!==`off`&&t.push({file:`Sidebar`,level:n,message:`Orphaned page found: "${r}" is not linked in the sidebar.`,suggestion:`Consider adding it to the sidebar for better discoverability.`})}return t}async function Q(e){let t=[],n=e.doctorConfig.checks.performance;if(!n?.enabled)return t;let i=r.default.resolve(e.root,`.boltdocs`,`reports`,`performance.json`);if(!a.default.existsSync(i))return t.push({file:`(build)`,level:L(e,`budgetExceeded`,`warning`),message:"Performance metrics not found. Run `boltdocs build` first."}),t;let o;try{o=JSON.parse(a.default.readFileSync(i,`utf-8`))}catch{return t.push({file:`(build)`,level:L(e,`budgetExceeded`,`warning`),message:`Failed to parse performance metrics file.`}),t}let s=n.budgets,c=L(e,`budgetExceeded`,`warning`),l=I(s?.maxJSBundleSize,1/0),u=I(s?.maxCSSBundleSize,1/0),d=I(s?.maxPageHTMLSize,1/0),f=s?.maxImagesKB??1/0,p=s?.maxBuildTime??1/0,m=s?.maxFontCount??1/0;if(l!==1/0&&o.totalJSBundleSize>l){let e=(o.totalJSBundleSize/1024).toFixed(0),n=(l/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`JS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Code-split large dependencies or lazy-load route components.`})}if(u!==1/0&&o.totalCSSBundleSize>u){let e=(o.totalCSSBundleSize/1024).toFixed(0),n=(u/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`CSS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Remove unused styles or split CSS by route.`})}if(d!==1/0){for(let e of o.pages)if(e.htmlSize>d){let n=(e.htmlSize/1024).toFixed(0),r=(d/1024).toFixed(0);t.push({file:e.route,level:c,message:`Page HTML size exceeds budget: ${n}kb > ${r}kb`,suggestion:`Reduce the amount of inline content or split into sub-pages.`})}}let h=f*1024;if(f!==1/0&&o.totalImagesSize>h){let e=(o.totalImagesSize/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`Image assets exceed budget: ${e}kb > ${f}kb`,suggestion:`Optimize images with lossy compression or use next-gen formats (webp/avif).`})}if(p!==1/0&&o.buildTime>p){let e=(o.buildTime/1e3).toFixed(1),n=(p/1e3).toFixed(1);t.push({file:`(build)`,level:c,message:`Build time exceeds budget: ${e}s > ${n}s`,suggestion:"Check for large unoptimized assets or increase `concurrency` in SSG options."})}return m!==1/0&&o.fontCount>m&&t.push({file:`(build)`,level:c,message:`Font files exceed budget: ${o.fontCount} > ${m}`,suggestion:`Reduce the number of font families or use variable fonts.`}),t}async function $(e){let t=r.default.resolve(e,`doctor.json`);if(a.default.existsSync(t)){(0,s.warn)(`"doctor.json" already exists at ${e}.`);return}try{a.default.writeFileSync(t,JSON.stringify(F,null,2)),(0,s.success)(`Created "doctor.json" with default configuration.`)}catch(e){(0,s.error)(`Failed to create "doctor.json": ${e}`)}}async function ee(e=process.cwd(),t={}){if(t.init){await $(e);return}P();try{let n=await U(e),{format:o}=n.reporting,c=performance.now(),u=await O(`docs`,e),d=r.default.resolve(e,`docs`);a.default.existsSync(d)||(o===`pretty`&&(0,s.error)(`Docs dir not found at ${d}`),process.exit(1)),o===`pretty`&&console.log((0,s.double)(`✦ DOCTOR — Documentation Health Check`,[` ${s.colors.dim(`Docs dir:`)} ${d}`,` ${s.colors.dim(`Reports:`)} ${e}/.boltdocs/reports/`])),o===`pretty`&&(0,s.info)(s.colors.dim(`🔍 Discovering files and routes...`));let f=(0,l.default)(n.exclude||[]),p=await new i.fdir().withFullPaths().filter(e=>{if(!(e.endsWith(`.md`)||e.endsWith(`.mdx`)))return!1;let t=r.default.relative(d,e).replace(/\\/g,`/`),n=t.split(`/`).some(e=>e.startsWith(`_`)&&e!==`_index.md`&&e!==`_index.mdx`);return!f(t)&&!n}).crawl(d).withPromise();for(let e of p)V.set(e,!0);let m=await W(d,e,u,p),h=u.base||`/`,g=h===`/`?``:h.endsWith(`/`)?h.slice(0,-1):h,_={root:e,docsDir:d,config:u,doctorConfig:n,linkTree:m,files:p,options:t,routeIndex:new Set(m.routes),routeIndexWithSlash:new Set(m.routes.map(e=>e.endsWith(`/`)?e:e+`/`)),routeIndexWithoutSlash:new Set(m.routes.map(e=>e.endsWith(`/`)?e.slice(0,-1):e)),basePrefix:g};o===`pretty`&&(0,s.info)(s.colors.dim(`🧪 Running diagnostic checks in parallel...`));let v=[J(_),Y(_),X(_),Z(_)];t.budget&&v.push(Q(_));let[y,b,x,S,...C]=await Promise.all(v),w=t.budget?C[0]:[],T=[...y,...b,...x,...S,...w];if(o===`pretty`){let e=[{label:`Metadata checks ${y.length>0?`— ${y.length} issue${y.length===1?``:`s`}`:`— OK`}`,done:y.length===0},{label:`Link checks ${b.length>0?`— ${b.length} issue${b.length===1?``:`s`}`:`— OK`}`,done:b.length===0},{label:`i18n checks ${x.length>0?`— ${x.length} issue${x.length===1?``:`s`}`:`— OK`}`,done:x.length===0},{label:`Sidebar checks ${S.length>0?`— ${S.length} issue${S.length===1?``:`s`}`:`— OK`}`,done:S.length===0}];t.budget&&e.push({label:`Performance budget ${w.length>0?`— ${w.length} issue${w.length===1?``:`s`}`:`— OK`}`,done:w.length===0}),console.log(`\n${(0,s.tasks)(e)}`)}let E=0;if(t.fix){for(let e of T)if(e.fix){if(_.doctorConfig.fix.confirmChanges&&!await(0,s.confirm)(`Fix issue in "${e.file}": ${e.message}?`))continue;if(_.doctorConfig.fix.backupFiles){let t=r.default.resolve(_.docsDir,e.file);a.default.existsSync(t)&&await R(t,r.default.resolve(_.root,_.doctorConfig.fix.backupPath))}await e.fix(),E++}}let D=((performance.now()-c)/1e3).toFixed(2),k=T.filter(e=>e.level===`high`).length,A=T.filter(e=>e.level===`warning`).length,j=T.filter(e=>e.level===`low`).length,M={summary:{total:T.length,high:k,warning:A,low:j,fixed:E,duration:D},issues:T.map(e=>({...e,fix:void 0}))};if(n.reporting.outputFile){let t=r.default.resolve(e,n.reporting.outputFile);a.default.existsSync(r.default.dirname(t))||a.default.mkdirSync(r.default.dirname(t),{recursive:!0}),a.default.writeFileSync(t,JSON.stringify(M,null,2))}if(o===`json`)console.log(JSON.stringify(M,null,2));else if(o===`pretty`){let e=T.reduce((e,t)=>(e[t.file]||(e[t.file]=[]),e[t.file].push(t),e),{});if(T.length>0){(0,s.dividerLog)();for(let[n,r]of Object.entries(e)){let e=[];for(let n of r){let r=n.level===`high`?`❌`:n.level===`warning`?`⚠️`:`ℹ️`,i=n.level===`high`?s.colors.red:n.level===`warning`?s.colors.yellow:s.colors.blue;e.push(`${r} ${i(n.level.toUpperCase())}: ${n.message}`),n.suggestion&&e.push(` ${s.colors.dim(`💡 ${n.suggestion}`)}`),t.fix&&n.fix&&e.push(` ${s.colors.green(`✅ Fixed automatically`)}`)}console.log(`\n${(0,s.single)(`📄 ${n}`,e)}`)}(0,s.dividerLog)()}if(T.length===0)console.log((0,s.round)(`✨ Documentation Health Check`,[` Everything looks perfect!`,` Your documentation is in great shape.`,``,` ${s.colors.dim(`Scanned ${p.length} file${p.length===1?``:`s`} in ${D}s`)}`]));else{let e=[];k>0&&e.push(s.colors.red(`${k} Critical Error${k===1?``:`s`}`)),A>0&&e.push(s.colors.yellow(`${A} Warning${A===1?``:`s`}`)),j>0&&e.push(s.colors.blue(`${j} Improvement${j===1?``:`s`}`));let t=[...(0,s.bullet)(e).split(`
28
+ `).map(e=>e.trimStart()),``,s.colors.dim(`Scanned ${p.length} file${p.length===1?``:`s`} in ${D}s`)];console.log(`\n${(0,s.double)(`Diagnosis Results`,t)}\n`),E>0&&(0,s.success)(`Successfully fixed ${E} issues automatically!`),k>0?(0,s.error)(`Please fix the critical errors before building for production.`):(0,s.success)(`No critical issues found. You are ready to go!`)}}n.reporting.failOnError&&k>0&&process.exit(1),n.reporting.maxWarnings!==-1&&A>n.reporting.maxWarnings&&(o===`pretty`&&(0,s.error)(`Failed: Too many warnings (${A} > ${n.reporting.maxWarnings})`),process.exit(1))}catch(e){(0,s.error)(`Doctor failed: ${e}`),process.exit(1)}}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return F}});