boltdocs 3.2.1 → 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-BcISI5-P.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-CCYEAYeA.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-BXtqM1uH.mjs +0 -6
  135. package/dist/node-BlVk4EVg.cjs +0 -104
  136. package/dist/node-DOf4zhWc.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-C95kvu6h.mjs +0 -73
  143. package/dist/plugin-DM3u2bVj.cjs +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,9 +3,10 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import { C as Hash, F as Sun, L as X, M as MoreVertical, S as FileText, _ as CornerDownLeft, j as Moon, r as cn, t as Link, v as ExternalLink } from "./link-2PzgTnaP.js";
6
+ import { D as Hash, E as FileText, F as Moon, I as MoreVertical, S as ExternalLink, V as X, W as useConfig, d as resolvePublicAssetUrl, o as cn, s as useLocalizedTo, t as Link, x as CornerDownLeft, z as Sun } from "./link-CgdI6O2o.js";
7
+ import { E as useLocation } from "./router-CZBxMRAH.js";
7
8
  import { Component, useEffect, useState } from "react";
8
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
10
  import * as RAC from "react-aria-components";
10
11
  import { Button, Dialog, Modal, ModalOverlay, Separator, ToggleButton } from "react-aria-components";
11
12
 
@@ -55,20 +56,20 @@ var ErrorBoundary = class extends Component {
55
56
  return children;
56
57
  }
57
58
  };
58
- function ErrorBoundaryFallback({ error, resetErrorBoundary }) {
59
+ function ErrorBoundaryFallback({ error, resetErrorBoundary, className, titleClassName, messageClassName, buttonClassName }) {
59
60
  return /* @__PURE__ */ jsxs("div", {
60
- 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",
61
+ className: cn("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", className),
61
62
  children: [
62
63
  /* @__PURE__ */ jsx("div", {
63
- className: "text-lg font-bold text-rose-600 dark:text-rose-400",
64
+ className: cn("text-lg font-bold text-danger-500", titleClassName),
64
65
  children: "Something went wrong"
65
66
  }),
66
67
  /* @__PURE__ */ jsx("p", {
67
- className: "text-sm text-muted max-w-sm leading-relaxed",
68
+ className: cn("text-sm text-muted max-w-sm leading-relaxed", messageClassName),
68
69
  children: error?.message || "An unexpected error occurred while rendering this page."
69
70
  }),
70
71
  /* @__PURE__ */ jsx(Button$1, {
71
- 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",
72
+ className: cn("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", buttonClassName),
72
73
  onPress: resetErrorBoundary,
73
74
  children: "Try again"
74
75
  })
@@ -119,20 +120,20 @@ const Bluesky = (props) => /* @__PURE__ */ jsxs("svg", {
119
120
  //#region src/client/components/primitives/navbar.tsx
120
121
  function Navbar({ children, className, ...props }) {
121
122
  return /* @__PURE__ */ jsx("header", {
122
- className: cn("boltdocs-navbar sticky top-0 z-50 w-full", className),
123
+ className: cn("boltdocs-navbar sticky top-0 z-50", className),
123
124
  ...props,
124
125
  children
125
126
  });
126
127
  }
127
128
  function NavbarContent({ children, className }) {
128
129
  return /* @__PURE__ */ jsx("div", {
129
- className: cn("mx-auto flex lg:h-navbar max-w-(--breakpoint-3xl) items-center justify-between px-4 md:px-6", className),
130
+ className: cn("mx-auto flex lg:h-navbar max-w-(--breakpoint-3xl) items-center px-4 md:px-6", className),
130
131
  children
131
132
  });
132
133
  }
133
134
  function NavbarLeft({ children, className }) {
134
135
  return /* @__PURE__ */ jsx("div", {
135
- className: cn("flex flex-1 items-center justify-start gap-4 min-w-0", className),
136
+ className: cn("flex flex-1 items-center gap-4 min-w-0", className),
136
137
  children
137
138
  });
138
139
  }
@@ -144,27 +145,29 @@ function NavbarRight({ children, className }) {
144
145
  }
145
146
  function NavbarCenter({ children, className }) {
146
147
  return /* @__PURE__ */ jsx("div", {
147
- className: cn("hidden lg:flex flex-1 justify-center items-center gap-4 px-4 min-w-0 w-full", className),
148
+ className: cn("hidden lg:flex flex-1 justify-center items-center gap-4 px-4 min-w-0", className),
148
149
  children
149
150
  });
150
151
  }
151
- function NavbarLogo({ src, alt, width = 24, height = 24, className, href = "/" }) {
152
+ function NavbarLogo({ src, alt, width = 24, height = 24, className, logoClassName, href = "/" }) {
153
+ const config = useConfig();
152
154
  return /* @__PURE__ */ jsx(Link, {
153
155
  href,
154
156
  className: cn("flex items-center gap-2 shrink-0 outline-none", className),
155
157
  children: src ? /* @__PURE__ */ jsx("img", {
156
- src,
158
+ src: resolvePublicAssetUrl(src, config.base),
157
159
  alt,
158
160
  width,
159
161
  height,
160
162
  fetchPriority: "high",
161
- className: "h-6 w-6 object-contain"
163
+ className: cn("h-6 w-6 object-contain", logoClassName)
162
164
  }) : null
163
165
  });
164
166
  }
165
- function NavbarTitle({ children, className, href = "/" }) {
167
+ function NavbarTitle({ children, className, linkClassName, href = "/" }) {
166
168
  return /* @__PURE__ */ jsx(Link, {
167
169
  href,
170
+ className: cn(linkClassName),
168
171
  children: /* @__PURE__ */ jsx("span", {
169
172
  className: cn("text-lg font-bold tracking-tight hidden sm:inline-block", className),
170
173
  children
@@ -177,45 +180,50 @@ function NavbarLinks({ children, className }) {
177
180
  children
178
181
  });
179
182
  }
180
- function NavbarLink({ label, href, to, className }) {
183
+ function NavbarLink({ label, href, to, className, iconClassName }) {
181
184
  return /* @__PURE__ */ jsxs(Link, {
182
185
  href,
183
186
  target: to === "external" ? "_blank" : void 0,
184
187
  className: cn("transition-all outline-none", className),
185
188
  children: [label, to === "external" && /* @__PURE__ */ jsx("span", {
186
- className: "ml-1 inline-block",
189
+ className: cn("ml-1 inline-block", iconClassName),
187
190
  children: /* @__PURE__ */ jsx(ExternalLink, { size: 12 })
188
191
  })]
189
192
  });
190
193
  }
191
- function NavbarDropdown({ label, className, children }) {
192
- const [isOpen, setIsOpen] = useState(false);
194
+ function NavbarDropdown({ label, className, triggerClassName, iconClassName, panelClassName, menuClassName, icon, open, onOpenChange, children }) {
195
+ const [internalOpen, setInternalOpen] = useState(false);
196
+ const isOpen = open ?? internalOpen;
197
+ const setOpen = (next) => {
198
+ setInternalOpen(next);
199
+ onOpenChange?.(next);
200
+ };
193
201
  return /* @__PURE__ */ jsxs("div", {
194
202
  className: cn("relative", className),
195
- onMouseEnter: () => {
196
- setIsOpen(true);
197
- },
198
- onMouseLeave: () => {
199
- setIsOpen(false);
200
- },
203
+ onMouseEnter: () => setOpen(true),
204
+ onMouseLeave: () => setOpen(false),
201
205
  children: [/* @__PURE__ */ jsxs("div", {
202
- className: cn("flex items-center gap-1 outline-none cursor-pointer select-none font-medium text-muted hover:text-body transition-colors"),
203
- children: [label, /* @__PURE__ */ jsx("svg", {
204
- className: cn("w-4 h-4 transition-transform", isOpen && "rotate-180"),
205
- fill: "none",
206
- viewBox: "0 0 24 24",
207
- stroke: "currentColor",
208
- children: /* @__PURE__ */ jsx("path", {
209
- strokeLinecap: "round",
210
- strokeLinejoin: "round",
211
- strokeWidth: 2,
212
- d: "M19 9l-7 7-7-7"
206
+ className: cn("flex items-center gap-1 outline-none select-none cursor-pointer", triggerClassName),
207
+ children: [label, /* @__PURE__ */ jsx("span", {
208
+ className: cn("shrink-0", iconClassName),
209
+ children: icon ?? /* @__PURE__ */ jsx("svg", {
210
+ className: cn("size-6 transition-transform", isOpen && "rotate-180"),
211
+ fill: "none",
212
+ viewBox: "0 0 24 24",
213
+ stroke: "currentColor",
214
+ "aria-hidden": "true",
215
+ children: /* @__PURE__ */ jsx("path", {
216
+ strokeLinecap: "round",
217
+ strokeLinejoin: "round",
218
+ strokeWidth: 2,
219
+ d: "M19 9l-7 7-7-7"
220
+ })
213
221
  })
214
222
  })]
215
223
  }), isOpen && /* @__PURE__ */ jsx("div", {
216
- className: "absolute top-full left-0 pt-1 z-[9999]",
224
+ className: cn("absolute top-full left-0 pt-1 z-9999", panelClassName),
217
225
  children: /* @__PURE__ */ jsx("div", {
218
- className: "min-w-[180px] p-1 bg-surface border border-subtle rounded-md shadow-lg",
226
+ className: cn("min-w-[180px] p-1 bg-surface border border-subtle rounded-md shadow-lg", menuClassName),
219
227
  children
220
228
  })
221
229
  })]
@@ -243,7 +251,7 @@ function NavbarSearchTriggerMobile({ className, onPress, children }) {
243
251
  children
244
252
  });
245
253
  }
246
- function NavbarSearchTriggerKbd({ className }) {
254
+ function NavbarSearchTriggerKbd({ className, kbdClassName }) {
247
255
  const [mounted, setMounted] = useState(false);
248
256
  const isMac = mounted && /Mac|iPod|iPhone|iPad/.test(navigator.platform);
249
257
  useEffect(() => {
@@ -252,10 +260,10 @@ function NavbarSearchTriggerKbd({ className }) {
252
260
  return /* @__PURE__ */ jsxs("div", {
253
261
  className: cn("hidden sm:flex items-center gap-1 pointer-events-none select-none", className),
254
262
  children: [/* @__PURE__ */ jsx("kbd", {
255
- className: "flex items-center justify-center font-mono text-[10px]",
263
+ className: cn("flex items-center justify-center font-mono text-[10px]", kbdClassName),
256
264
  children: isMac ? "⌘" : "Ctrl"
257
265
  }), /* @__PURE__ */ jsx("kbd", {
258
- className: "flex items-center justify-center font-mono text-[10px]",
266
+ className: cn("flex items-center justify-center font-mono text-[10px]", kbdClassName),
259
267
  children: "K"
260
268
  })]
261
269
  });
@@ -303,26 +311,26 @@ function NavbarMore({ onPress, className }) {
303
311
  children: /* @__PURE__ */ jsx(MoreVertical, { size: 20 })
304
312
  });
305
313
  }
306
- function NavbarMobileMenu({ isOpen, onClose, children, className }) {
314
+ function NavbarMobileMenu({ isOpen, onClose, children, className, overlayClassName, modalClassName, dialogClassName, closeRowClassName, closeButtonClassName, navClassName }) {
307
315
  return /* @__PURE__ */ jsx(ModalOverlay, {
308
316
  isOpen,
309
317
  onOpenChange: (open) => !open && onClose(),
310
318
  isDismissable: true,
311
- className: cn("fixed inset-0 z-60 md:hidden transition-all duration-100", className),
319
+ className: cn("fixed inset-0 z-60 md:hidden transition-all duration-100", className, overlayClassName),
312
320
  children: /* @__PURE__ */ jsx(Modal, {
313
- className: "fixed inset-0 outline-none",
321
+ className: cn("fixed inset-0 outline-none", modalClassName),
314
322
  children: /* @__PURE__ */ jsxs(Dialog, {
315
- className: "relative h-full outline-none flex flex-col p-6 pt-[calc(1.5rem+env(safe-area-inset-top,0px))] pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))] px-[calc(1.5rem+env(safe-area-inset-left,0px))]",
323
+ className: cn("relative h-full outline-none flex flex-col p-6 pt-[calc(1.5rem+env(safe-area-inset-top,0px))] pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))] px-[calc(1.5rem+env(safe-area-inset-left,0px))]", dialogClassName),
316
324
  children: [/* @__PURE__ */ jsxs("div", {
317
- className: "flex items-center justify-between mb-6",
325
+ className: cn("flex items-center justify-between mb-6", closeRowClassName),
318
326
  children: [/* @__PURE__ */ jsx("span", {}), /* @__PURE__ */ jsx(Button, {
319
327
  onPress: onClose,
320
- className: "flex items-center justify-center outline-none cursor-pointer text-muted hover:text-body transition-colors",
328
+ className: cn("flex items-center justify-center outline-none cursor-pointer text-muted hover:text-body transition-colors", closeButtonClassName),
321
329
  "aria-label": "Close menu",
322
330
  children: /* @__PURE__ */ jsx(X, { size: 24 })
323
331
  })]
324
332
  }), /* @__PURE__ */ jsx("nav", {
325
- className: "flex-1 overflow-y-auto flex flex-col gap-4",
333
+ className: cn("flex-1 overflow-y-auto flex flex-col gap-4", navClassName),
326
334
  children
327
335
  })]
328
336
  })
@@ -338,6 +346,45 @@ function NavbarMobileLink({ label, href, to, onPress, className }) {
338
346
  children: label
339
347
  });
340
348
  }
349
+ function NavbarMobileLinkItem({ link, onClose, depth = 0, className, groupClassName, labelClassName, listClassName, renderItem }) {
350
+ const localizedHref = useLocalizedTo(link.href || "");
351
+ const { pathname } = useLocation();
352
+ const active = pathname === localizedHref;
353
+ const hasItems = link.items && link.items.length > 0;
354
+ const custom = renderItem?.({
355
+ link,
356
+ active,
357
+ depth,
358
+ localizedHref,
359
+ onClose
360
+ });
361
+ if (custom !== void 0 && custom !== null) return /* @__PURE__ */ jsx(Fragment$1, { children: custom });
362
+ if (hasItems) return /* @__PURE__ */ jsxs("div", {
363
+ className: cn("flex flex-col gap-1", groupClassName, className),
364
+ children: [/* @__PURE__ */ jsx("div", {
365
+ className: cn("px-3 py-2 text-sm transition-all", active ? "text-body" : "text-muted/80 hover:text-body", labelClassName),
366
+ children: link.label
367
+ }), /* @__PURE__ */ jsx("div", {
368
+ className: cn("flex flex-col gap-1 pl-4", listClassName),
369
+ children: link.items?.map((item) => /* @__PURE__ */ jsx(NavbarMobileLinkItem, {
370
+ link: item,
371
+ onClose,
372
+ depth: depth + 1,
373
+ className,
374
+ groupClassName,
375
+ labelClassName,
376
+ listClassName,
377
+ renderItem
378
+ }, item.href))
379
+ })]
380
+ });
381
+ return /* @__PURE__ */ jsx(NavbarMobileLink, {
382
+ label: link.label,
383
+ href: localizedHref,
384
+ onPress: onClose,
385
+ className: cn("transition-all", active ? "text-body" : "text-muted/80 hover:text-body", className)
386
+ });
387
+ }
341
388
  Navbar.Root = Navbar;
342
389
  Navbar.Left = NavbarLeft;
343
390
  Navbar.Right = NavbarRight;
@@ -356,6 +403,7 @@ Navbar.Content = NavbarContent;
356
403
  Navbar.More = NavbarMore;
357
404
  Navbar.MobileMenu = NavbarMobileMenu;
358
405
  Navbar.MobileLink = NavbarMobileLink;
406
+ Navbar.MobileLinkItem = NavbarMobileLinkItem;
359
407
 
360
408
  //#endregion
361
409
  //#region src/client/components/primitives/search-dialog.tsx
@@ -418,14 +466,13 @@ function SearchDialogClearButton({ className, ...props }) {
418
466
  /**
419
467
  * Pure, unstyled Autocomplete container (maps to RAC.Autocomplete)
420
468
  */
421
- function SearchDialogAutocomplete({ children, className, onSelectionChange, ...props }) {
469
+ function SearchDialogAutocomplete({ children, className, innerClassName, ...props }) {
422
470
  const Autocomplete = RAC.Autocomplete;
423
471
  return /* @__PURE__ */ jsx("div", {
424
472
  className: cn("flex-1 min-h-0", className),
425
473
  children: /* @__PURE__ */ jsx(Autocomplete, {
426
474
  ...props,
427
- onSelectionChange,
428
- className: "flex flex-col min-h-0",
475
+ className: cn("flex flex-col min-h-0", innerClassName),
429
476
  children
430
477
  })
431
478
  });
@@ -443,23 +490,26 @@ function SearchDialogList({ children, className, ...props }) {
443
490
  /**
444
491
  * Pure, unstyled List Box Item (maps to RAC.ListBoxItem)
445
492
  */
446
- function SearchDialogItemRoot({ children, className, ...props }) {
493
+ function SearchDialogItemRoot({ children, className, hintClassName, renderHint, ...props }) {
447
494
  return /* @__PURE__ */ jsx(RAC.ListBoxItem, {
448
495
  ...props,
449
496
  className: cn("group flex items-center outline-none cursor-pointer", className),
450
- children: (itemProps) => /* @__PURE__ */ jsxs(Fragment, { children: [children, (itemProps.isFocused || itemProps.isSelected) && /* @__PURE__ */ jsxs("div", {
451
- className: "ml-auto opacity-50 flex items-center gap-1",
497
+ children: (itemProps) => /* @__PURE__ */ jsxs(Fragment$1, { children: [children, renderHint ? renderHint({
498
+ focused: itemProps.isFocused,
499
+ selected: itemProps.isSelected
500
+ }) : itemProps.isFocused || itemProps.isSelected ? /* @__PURE__ */ jsxs("div", {
501
+ className: cn("ml-auto opacity-50 flex items-center gap-1", hintClassName),
452
502
  children: [/* @__PURE__ */ jsx("span", {
453
503
  className: "text-[10px]",
454
504
  children: "Select"
455
505
  }), /* @__PURE__ */ jsx(CornerDownLeft, { size: 10 })]
456
- })] })
506
+ }) : null] })
457
507
  });
458
508
  }
459
- function SearchDialogItemIcon({ isHeading, className }) {
509
+ function SearchDialogItemIcon({ isHeading, className, icon }) {
460
510
  return /* @__PURE__ */ jsx("div", {
461
511
  className: cn("shrink-0", className),
462
- children: isHeading ? /* @__PURE__ */ jsx(Hash, { size: 18 }) : /* @__PURE__ */ jsx(FileText, { size: 18 })
512
+ children: icon ?? (isHeading ? /* @__PURE__ */ jsx(Hash, { size: 18 }) : /* @__PURE__ */ jsx(FileText, { size: 18 }))
463
513
  });
464
514
  }
465
515
  function SearchDialogItemTitle({ children, className }) {