boltdocs 2.9.2 → 3.0.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 (108) hide show
  1. package/bin/boltdocs.js +2 -1
  2. package/dist/{adapters-uGz-UKQa.cjs → adapters-C5AWWGfb.cjs} +1 -1
  3. package/dist/{adapters-HVuXENAe.mjs → adapters-DEXNIv3x.mjs} +1 -1
  4. package/dist/{banner-D2NddBfF.d.ts → banner-CfdalYLL.d.ts} +1 -1
  5. package/dist/{banner-C_xkGxzI.d.cts → banner-DNSkgUsO.d.cts} +1 -1
  6. package/dist/{cache-B19MLTpN.cjs → cache-DETwlACe.cjs} +1 -1
  7. package/dist/{cache-CfhOTR3Q.mjs → cache-SF59enb3.mjs} +1 -1
  8. package/dist/client/index.cjs +260 -147
  9. package/dist/client/index.d.cts +4 -3
  10. package/dist/client/index.d.ts +4 -3
  11. package/dist/client/index.js +259 -147
  12. package/dist/client/mdx.cjs +1 -1
  13. package/dist/client/mdx.js +1 -1
  14. package/dist/client/primitives.cjs +2 -2
  15. package/dist/client/primitives.d.cts +10 -8
  16. package/dist/client/primitives.d.ts +10 -8
  17. package/dist/client/primitives.js +2 -2
  18. package/dist/config-B5uVv5q4.cjs +7 -0
  19. package/dist/config-D3_zDkHh.mjs +7 -0
  20. package/dist/{config-CnmfjOE4.cjs → config-JGkMJoJQ.cjs} +1 -1
  21. package/dist/csp-gaZ51xzq.mjs +6 -0
  22. package/dist/doctor-3MheVMwd.mjs +7 -0
  23. package/dist/{parser-CHsNUEhU.cjs → doctor-BR1B2Mkz.cjs} +1 -1
  24. package/dist/doctor-DQxLM202.cjs +7 -0
  25. package/dist/handler-Btd4t_67.mjs +28 -0
  26. package/dist/{headers-DuCAOgYX.cjs → headers-BXKxiPUv.cjs} +1 -1
  27. package/dist/headers-CXyf0auY.mjs +6 -0
  28. package/dist/{image-BCDyLHyD.js → image-C9md50h2.js} +14 -6
  29. package/dist/{image-DWdmichO.cjs → image-CR6UlaI5.cjs} +14 -6
  30. package/dist/{mdx-9QJoSITt.cjs → mdx-DJBg5DuL.cjs} +10 -23
  31. package/dist/{mdx-DFbspTP9.js → mdx-DhyMkc35.js} +10 -23
  32. package/dist/node/cli-entry.cjs +3 -3
  33. package/dist/node/cli-entry.mjs +3 -3
  34. package/dist/node/index.cjs +1 -1
  35. package/dist/node/index.d.cts +40 -19
  36. package/dist/node/index.d.mts +41 -20
  37. package/dist/node/index.mjs +1 -1
  38. package/dist/node-BUAMwxuS.cjs +105 -0
  39. package/dist/node-Clh72alT.mjs +105 -0
  40. package/dist/{package-D6O7a8qA.mjs → package-1GvyLw7z.mjs} +1 -1
  41. package/dist/{package-CVw_u5VT.cjs → package-3jQEMIvy.cjs} +1 -1
  42. package/dist/pages-external-BYa4JSda.mjs +6 -0
  43. package/dist/pages-external-CX2uyW95.cjs +6 -0
  44. package/dist/parser-CNIPHx4s.cjs +8 -0
  45. package/dist/parser-D0QHIQsi.mjs +8 -0
  46. package/dist/plugin-D9gURy-9.mjs +68 -0
  47. package/dist/plugin-N3zGyZXw.cjs +68 -0
  48. package/dist/rolldown-runtime-fkIsjY3S.mjs +6 -0
  49. package/dist/routes-BajCwrvX.cjs +6 -0
  50. package/dist/routes-CyrnmVuG.mjs +6 -0
  51. package/dist/routes-D6Tuu7Fs.cjs +6 -0
  52. package/dist/{search-dialog-DRNJsxOv.js → search-dialog-CQneRo8T.js} +1 -1
  53. package/dist/{search-dialog-BsAiQgnx.cjs → search-dialog-CwNh8lIN.cjs} +27 -30
  54. package/dist/{search-dialog-BhXg05Ri.cjs → search-dialog-D4rplZMv.cjs} +1 -0
  55. package/dist/{search-dialog-DaR66wl0.js → search-dialog-DaeSPvEo.js} +1 -0
  56. package/dist/{search-dialog-CaOO1Q4i.js → search-dialog-DoGobmuG.js} +28 -31
  57. package/dist/{search-dialog-CzwvKoLW.cjs → search-dialog-cHJoKjts.cjs} +1 -1
  58. package/dist/server/index.cjs +1 -1
  59. package/dist/server/index.d.mts +1 -1
  60. package/dist/server/index.mjs +1 -1
  61. package/dist/{shiki-adapter-BB71nVsG.cjs → shiki-adapter-CGTmrR6S.cjs} +1 -1
  62. package/dist/shiki-adapter-CXEGRnjr.mjs +6 -0
  63. package/dist/{doctor-BL6c8x2Q.cjs → shiki-adapter-Mr8_oT_9.cjs} +1 -1
  64. package/dist/{sidebar-BtJyWHy4.d.cts → sidebar-7gIifpBX.d.cts} +21 -4
  65. package/dist/{sidebar-C4fuRYYS.d.ts → sidebar-BAKgJ-Er.d.ts} +21 -4
  66. package/dist/types-generator-DVOnRVKU.mjs +26 -0
  67. package/dist/{utils-DexBrwiP.mjs → utils-B3xYMrpK.mjs} +1 -1
  68. package/dist/{utils-BWy_8ASj.cjs → utils-Bz1tG9Dg.cjs} +1 -1
  69. package/package.json +2 -1
  70. package/src/shared/types.ts +22 -3
  71. package/dist/config-BCqkPkjC.mjs +0 -7
  72. package/dist/config-BPWGa2W3.mjs +0 -6
  73. package/dist/config-D7ERJhqe.cjs +0 -7
  74. package/dist/csp-CUAEgrxR.mjs +0 -6
  75. package/dist/doctor-A17UhTRn.cjs +0 -7
  76. package/dist/doctor-hKOBLhBF.mjs +0 -7
  77. package/dist/handler-CyIBbZdb.mjs +0 -28
  78. package/dist/handler-eNNcucnf.mjs +0 -6
  79. package/dist/headers-DBzZ9yC6.mjs +0 -6
  80. package/dist/node/routes/worker.cjs +0 -6
  81. package/dist/node/routes/worker.d.cts +0 -2
  82. package/dist/node/routes/worker.d.mts +0 -2
  83. package/dist/node/routes/worker.mjs +0 -6
  84. package/dist/node-B-I15rGR.cjs +0 -105
  85. package/dist/node-FkxzriO7.mjs +0 -105
  86. package/dist/parser-8u0xHVc7.mjs +0 -6
  87. package/dist/parser-CLtGv_XH.cjs +0 -6
  88. package/dist/plugin-CHa0IT49.mjs +0 -61
  89. package/dist/plugin-Dqj9plKB.cjs +0 -61
  90. package/dist/routes-B2joDAlC.cjs +0 -6
  91. package/dist/routes-BTx0ngdX.mjs +0 -6
  92. package/dist/routes-Bm0CQvyL.mjs +0 -6
  93. package/dist/routes-CyKj3dzf.cjs +0 -6
  94. package/dist/shiki-adapter-CL-IQwKI.cjs +0 -6
  95. package/dist/shiki-adapter-CxTLkjew.mjs +0 -6
  96. package/dist/shiki-adapter-rQ087Lx3.mjs +0 -6
  97. package/dist/types-generator-BRyf4o9F.mjs +0 -26
  98. package/dist/types-generator-Cu2jQP-V.mjs +0 -6
  99. package/dist/worker-pool-CgOMozUz.cjs +0 -6
  100. package/dist/worker-pool-v6tW2MDQ.mjs +0 -6
  101. /package/dist/{csp-DbbF3R9Q.cjs → csp-CBysWlAf.cjs} +0 -0
  102. /package/dist/{generator-BaSvGlxR.mjs → generator-CcOBN5vI.mjs} +0 -0
  103. /package/dist/{generator-DsajVrDx.cjs → generator-DtUU3Cfk.cjs} +0 -0
  104. /package/dist/{handler-1LRMYeI4.cjs → handler-Dzf4dSnV.cjs} +0 -0
  105. /package/dist/{index-ZqgZUvwp.d.mts → index-CdJv4ocW.d.mts} +0 -0
  106. /package/dist/{meta-loader-CD3Yptr5.mjs → meta-loader-C4Hu9RN9.mjs} +0 -0
  107. /package/dist/{meta-loader-CjphwtS7.cjs → meta-loader-C9MKjAs0.cjs} +0 -0
  108. /package/dist/{types-generator-BqNKCbrx.cjs → types-generator-CYcHkDzZ.cjs} +0 -0
@@ -4,11 +4,11 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  import { $ as TextAlignStart, C as RoutesProvider, D as Check, E as ArrowLeft, F as FaceBad, I as FaceGood, J as Moon, K as Menu, L as FaceRegular, M as Copy, O as ChevronDown, P as ExternalLink, Q as Sun, S as normalizePath, U as Languages, V as Home, X as Pencil, _ as Link$1, at as useBoltdocsContext, b as useLocalizedTo, et as X, it as BoltdocsProvider, j as CircleHelp, nt as ConfigContext, q as Monitor, rt as useConfig, s as Github, tt as icons_exports, x as useRoutes, y as cn } from "../icons-dev-kJyGWNeg.js";
7
- import { c as ThemeProvider, l as useTheme } from "../image-BCDyLHyD.js";
8
- import { n as useCodeBlock, r as copyToClipboard, t as mdx_components_default } from "../mdx-DFbspTP9.js";
7
+ import { c as ThemeProvider, l as useTheme } from "../image-C9md50h2.js";
8
+ import { n as useCodeBlock, r as copyToClipboard, t as mdx_components_default } from "../mdx-DhyMkc35.js";
9
9
  import { A as useUI, C as useSidebar, D as ButtonGroup, O as Breadcrumbs$2, S as useLocation, T as Menu$1, f as PageNav$1, k as UIProvider, m as OnThisPage$1, n as Sidebar$1, t as DocsLayout$1, w as Tabs$1, x as useSearchHighlight } from "../docs-layout-6FQ8__ok.js";
10
- import { a as Button$1, n as Navbar$1, r as ErrorBoundary$1 } from "../search-dialog-DaR66wl0.js";
11
- import { n as useSearch, r as InternalErrorBoundary, t as SearchDialog } from "../search-dialog-CaOO1Q4i.js";
10
+ import { a as Button$1, n as Navbar$1, r as ErrorBoundary$1 } from "../search-dialog-DaeSPvEo.js";
11
+ import { n as useSearch, r as InternalErrorBoundary, t as SearchDialog } from "../search-dialog-DoGobmuG.js";
12
12
  import { ViteReactSSG } from "@bdocs/ssg";
13
13
  import { Suspense, createContext, isValidElement, lazy, use, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
14
14
  import { Link, Outlet, useLoaderData, useLocation as useLocation$1, useMatches, useNavigate } from "react-router-dom";
@@ -17,6 +17,7 @@ import * as ReactHelmetAsync from "react-helmet-async";
17
17
  import { Button } from "react-aria-components";
18
18
  import virtualCustomComponents from "virtual:boltdocs-mdx-components";
19
19
  import virtualIcons from "virtual:boltdocs-icons";
20
+ import DOMPurify from "isomorphic-dompurify";
20
21
  import UserLayout from "virtual:boltdocs-layout";
21
22
 
22
23
  //#region src/client/app/mdx-components-context.tsx
@@ -154,6 +155,152 @@ const mdxComponentsDefault = {
154
155
  "404": NotFound
155
156
  };
156
157
 
158
+ //#endregion
159
+ //#region src/client/utils/i18n.ts
160
+ /**
161
+ * Retrieves the correct translation from a value that can be either
162
+ * a simple string or a map of locale-specific strings.
163
+ *
164
+ * @param value - The text to translate
165
+ * @param locale - The current active locale (e.g., 'en', 'es')
166
+ * @returns The translated string
167
+ */
168
+ function getTranslated(value, locale) {
169
+ if (!value) return "";
170
+ if (typeof value === "string") return value;
171
+ if (locale && value[locale]) return value[locale];
172
+ return Object.values(value)[0] || "";
173
+ }
174
+
175
+ //#endregion
176
+ //#region src/client/app/head.tsx
177
+ function Head({ siteTitle, siteDescription, routes }) {
178
+ const location = useLocation$1();
179
+ const config = useConfig();
180
+ const { currentLocale, currentRoute } = useRoutes();
181
+ const route = useMemo(() => {
182
+ if (currentRoute) return currentRoute;
183
+ const normalizedPath = location.pathname.endsWith("/") && location.pathname.length > 1 ? location.pathname.slice(0, -1) : location.pathname;
184
+ return routes?.find?.((r) => {
185
+ return (r.path.endsWith("/") && r.path.length > 1 ? r.path.slice(0, -1) : r.path) === normalizedPath;
186
+ });
187
+ }, [
188
+ routes,
189
+ location.pathname,
190
+ currentRoute
191
+ ]);
192
+ const pageTitle = route?.title;
193
+ const translatedSiteDescription = getTranslated(siteDescription, currentLocale);
194
+ const pageDescription = route?.description || translatedSiteDescription || "";
195
+ const translatedSiteTitle = getTranslated(siteTitle, currentLocale);
196
+ const finalTitle = pageTitle ? `${pageTitle} | ${translatedSiteTitle}` : translatedSiteTitle;
197
+ const seo = route?.seo || {};
198
+ const canonicalUrl = seo.canonical || (config?.siteUrl && route?.path ? `${config.siteUrl.replace(/\/$/, "")}${route.path}` : void 0);
199
+ const ogUrl = seo["og:url"] || canonicalUrl || (typeof window !== "undefined" ? window.location.href : void 0);
200
+ const globalMetatags = config?.seo?.metatags || {};
201
+ const defaultOgImage = config?.seo?.thumbnails?.background;
202
+ let ogImage = seo["og:image"] || route?.coverImage || defaultOgImage;
203
+ if (ogImage && config?.siteUrl && !/^https?:\/\/|^\/\//.test(ogImage)) ogImage = `${config.siteUrl.endsWith("/") ? config.siteUrl.slice(0, -1) : config.siteUrl}${ogImage.startsWith("/") ? ogImage : `/${ogImage}`}`;
204
+ return /* @__PURE__ */ jsxs(Helmet, { children: [
205
+ /* @__PURE__ */ jsx("title", { children: finalTitle }),
206
+ /* @__PURE__ */ jsx("meta", {
207
+ name: "description",
208
+ content: pageDescription
209
+ }),
210
+ /* @__PURE__ */ jsx("meta", {
211
+ property: "og:title",
212
+ content: finalTitle
213
+ }),
214
+ /* @__PURE__ */ jsx("meta", {
215
+ property: "og:description",
216
+ content: pageDescription
217
+ }),
218
+ /* @__PURE__ */ jsx("meta", {
219
+ property: "og:type",
220
+ content: "article"
221
+ }),
222
+ canonicalUrl && /* @__PURE__ */ jsx("link", {
223
+ rel: "canonical",
224
+ href: canonicalUrl
225
+ }),
226
+ ogUrl && /* @__PURE__ */ jsx("meta", {
227
+ property: "og:url",
228
+ content: ogUrl
229
+ }),
230
+ /* @__PURE__ */ jsx("meta", {
231
+ name: "twitter:card",
232
+ content: ogImage ? "summary_large_image" : "summary"
233
+ }),
234
+ /* @__PURE__ */ jsx("meta", {
235
+ name: "twitter:title",
236
+ content: finalTitle
237
+ }),
238
+ /* @__PURE__ */ jsx("meta", {
239
+ name: "twitter:description",
240
+ content: pageDescription
241
+ }),
242
+ ogImage && /* @__PURE__ */ jsx("meta", {
243
+ name: "twitter:image",
244
+ content: ogImage
245
+ }),
246
+ ogImage && /* @__PURE__ */ jsx("meta", {
247
+ property: "og:image",
248
+ content: ogImage
249
+ }),
250
+ /* @__PURE__ */ jsx("meta", {
251
+ name: "generator",
252
+ content: "Boltdocs"
253
+ }),
254
+ config?.seo?.verification?.google && /* @__PURE__ */ jsx("meta", {
255
+ name: "google-site-verification",
256
+ content: config.seo.verification.google
257
+ }),
258
+ config?.seo?.verification?.bing && /* @__PURE__ */ jsx("meta", {
259
+ name: "msvalidate.01",
260
+ content: config.seo.verification.bing
261
+ }),
262
+ config?.seo?.verification?.yandex && /* @__PURE__ */ jsx("meta", {
263
+ name: "yandex-verification",
264
+ content: config.seo.verification.yandex
265
+ }),
266
+ config?.seo?.verification?.pinterest && /* @__PURE__ */ jsx("meta", {
267
+ name: "p:domain_verify",
268
+ content: config.seo.verification.pinterest
269
+ }),
270
+ config?.seo?.verification?.facebook && /* @__PURE__ */ jsx("meta", {
271
+ name: "facebook-domain-verification",
272
+ content: config.seo.verification.facebook
273
+ }),
274
+ Object.entries(globalMetatags).map(([key, value]) => {
275
+ return key.startsWith("og:") || key.startsWith("music:") || key.startsWith("video:") || key.startsWith("article:") || key.startsWith("book:") || key.startsWith("profile:") ? /* @__PURE__ */ jsx("meta", {
276
+ property: key,
277
+ content: value
278
+ }, key) : /* @__PURE__ */ jsx("meta", {
279
+ name: key,
280
+ content: value
281
+ }, key);
282
+ }),
283
+ Object.entries(seo).map(([key, value]) => {
284
+ if (key === "noindex" && value === true) return /* @__PURE__ */ jsx("meta", {
285
+ name: "robots",
286
+ content: "noindex"
287
+ }, "noindex");
288
+ if (key === "robots") return /* @__PURE__ */ jsx("meta", {
289
+ name: "robots",
290
+ content: value
291
+ }, "robots");
292
+ if (key === "canonical" || key === "og:url" || key === "og:image" || key === "twitter:image") return null;
293
+ return key.startsWith("og:") || key.startsWith("music:") || key.startsWith("video:") || key.startsWith("article:") || key.startsWith("book:") || key.startsWith("profile:") ? /* @__PURE__ */ jsx("meta", {
294
+ property: key,
295
+ content: value
296
+ }, key) : /* @__PURE__ */ jsx("meta", {
297
+ name: key,
298
+ content: value
299
+ }, key);
300
+ })
301
+ ] });
302
+ }
303
+
157
304
  //#endregion
158
305
  //#region src/client/collections/collections-context.tsx
159
306
  const CollectionsContext = createContext({});
@@ -246,6 +393,11 @@ function BoltdocsShell({ config, routes, components = {}, collectionsData }) {
246
393
  routeMap
247
394
  }),
248
395
  /* @__PURE__ */ jsx(I18nUpdater, { config }),
396
+ /* @__PURE__ */ jsx(Head, {
397
+ siteTitle: config.theme?.title,
398
+ siteDescription: config.theme?.description,
399
+ routes
400
+ }),
249
401
  /* @__PURE__ */ jsx(InternalErrorBoundary, { children: /* @__PURE__ */ jsx(Outlet, {}) })
250
402
  ]
251
403
  })]
@@ -518,23 +670,6 @@ function GithubStars({ repo }) {
518
670
  });
519
671
  }
520
672
 
521
- //#endregion
522
- //#region src/client/utils/i18n.ts
523
- /**
524
- * Retrieves the correct translation from a value that can be either
525
- * a simple string or a map of locale-specific strings.
526
- *
527
- * @param value - The text to translate
528
- * @param locale - The current active locale (e.g., 'en', 'es')
529
- * @returns The translated string
530
- */
531
- function getTranslated(value, locale) {
532
- if (!value) return "";
533
- if (typeof value === "string") return value;
534
- if (locale && value[locale]) return value[locale];
535
- return Object.values(value)[0] || "";
536
- }
537
-
538
673
  //#endregion
539
674
  //#region src/client/hooks/use-navbar.ts
540
675
  function useNavbar() {
@@ -758,7 +893,7 @@ function Tabs({ tabs, routes }) {
758
893
  if (!iconName) return null;
759
894
  if (iconName.trim().startsWith("<svg")) return /* @__PURE__ */ jsx("span", {
760
895
  className: "h-4 w-4",
761
- dangerouslySetInnerHTML: { __html: iconName }
896
+ dangerouslySetInnerHTML: { __html: DOMPurify.sanitize(iconName, { USE_PROFILES: { svg: true } }) }
762
897
  });
763
898
  const icons = {
764
899
  ...icons_exports,
@@ -1021,7 +1156,7 @@ function createGtagAnalytics(config) {
1021
1156
  window.gtag?.("event", "page_view", {
1022
1157
  page_path: path,
1023
1158
  page_title: title || document.title,
1024
- send_to: config?.ga4?.measurementId
1159
+ send_to: config?.analytics?.ga4?.measurementId
1025
1160
  });
1026
1161
  },
1027
1162
  trackEvent: ({ action, category, label, value, params }) => {
@@ -1029,7 +1164,7 @@ function createGtagAnalytics(config) {
1029
1164
  event_category: category,
1030
1165
  event_label: label,
1031
1166
  value,
1032
- send_to: config?.ga4?.measurementId,
1167
+ send_to: config?.analytics?.ga4?.measurementId,
1033
1168
  ...params
1034
1169
  });
1035
1170
  },
@@ -1037,20 +1172,20 @@ function createGtagAnalytics(config) {
1037
1172
  window.gtag?.("event", "search", {
1038
1173
  search_term: query,
1039
1174
  results_count: resultsCount,
1040
- send_to: config?.ga4?.measurementId
1175
+ send_to: config?.analytics?.ga4?.measurementId
1041
1176
  });
1042
1177
  },
1043
1178
  trackDownload: (file, type) => {
1044
1179
  window.gtag?.("event", "file_download", {
1045
1180
  file_name: file,
1046
1181
  file_type: type || file.split(".").pop(),
1047
- send_to: config?.ga4?.measurementId
1182
+ send_to: config?.analytics?.ga4?.measurementId
1048
1183
  });
1049
1184
  },
1050
1185
  trackExternalLink: (url) => {
1051
1186
  window.gtag?.("event", "external_link", {
1052
1187
  link_url: url,
1053
- send_to: config?.ga4?.measurementId
1188
+ send_to: config?.analytics?.ga4?.measurementId
1054
1189
  });
1055
1190
  },
1056
1191
  isEnabled: true
@@ -1063,7 +1198,7 @@ function createDataLayerAnalytics(config) {
1063
1198
  event: "page_view",
1064
1199
  page_path: path,
1065
1200
  page_title: title || document.title,
1066
- send_to: config?.gtm?.tagId
1201
+ send_to: config?.analytics?.gtm?.tagId
1067
1202
  });
1068
1203
  },
1069
1204
  trackEvent: ({ action, category, label, value, params }) => {
@@ -1072,7 +1207,7 @@ function createDataLayerAnalytics(config) {
1072
1207
  event_category: category,
1073
1208
  event_label: label,
1074
1209
  value,
1075
- send_to: config?.gtm?.tagId,
1210
+ send_to: config?.analytics?.gtm?.tagId,
1076
1211
  ...params
1077
1212
  });
1078
1213
  },
@@ -1081,7 +1216,7 @@ function createDataLayerAnalytics(config) {
1081
1216
  event: "search",
1082
1217
  search_term: query,
1083
1218
  results_count: resultsCount,
1084
- send_to: config?.gtm?.tagId
1219
+ send_to: config?.analytics?.gtm?.tagId
1085
1220
  });
1086
1221
  },
1087
1222
  trackDownload: (file, type) => {
@@ -1089,14 +1224,14 @@ function createDataLayerAnalytics(config) {
1089
1224
  event: "file_download",
1090
1225
  file_name: file,
1091
1226
  file_type: type || file.split(".").pop(),
1092
- send_to: config?.gtm?.tagId
1227
+ send_to: config?.analytics?.gtm?.tagId
1093
1228
  });
1094
1229
  },
1095
1230
  trackExternalLink: (url) => {
1096
1231
  window.dataLayer?.push({
1097
1232
  event: "external_link",
1098
1233
  link_url: url,
1099
- send_to: config?.gtm?.tagId
1234
+ send_to: config?.analytics?.gtm?.tagId
1100
1235
  });
1101
1236
  },
1102
1237
  isEnabled: true
@@ -1298,13 +1433,13 @@ function I18nSelector({ className }) {
1298
1433
 
1299
1434
  //#endregion
1300
1435
  //#region src/client/components/ui-base/navbar.tsx
1301
- const SearchDialog$1 = lazy(() => import("../search-dialog-DRNJsxOv.js").then((m) => ({ default: m.SearchDialog })));
1436
+ const SearchDialog$1 = lazy(() => import("../search-dialog-CQneRo8T.js").then((m) => ({ default: m.SearchDialog })));
1302
1437
  function Navbar() {
1303
1438
  const { links, title, logo, logoProps, github, social, config } = useNavbar();
1304
1439
  const { routes, currentRoute, isCollectionPage, currentVersion, currentLocale } = useRoutes();
1305
1440
  const { isSidebarOpen, toggleSidebar } = useUI();
1306
1441
  const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
1307
- const themeConfig = config.theme || {};
1442
+ const themeConfig = config.theme;
1308
1443
  const isDocs = !!currentRoute?.filePath && !isCollectionPage;
1309
1444
  const hasTabs = themeConfig?.tabs && themeConfig.tabs.length > 0;
1310
1445
  return /* @__PURE__ */ jsxs(Navbar$1.Root, {
@@ -1334,15 +1469,18 @@ function Navbar() {
1334
1469
  children: config.versions && currentVersion && /* @__PURE__ */ jsx(VersionSelector, {})
1335
1470
  })
1336
1471
  ] }),
1337
- /* @__PURE__ */ jsx(Navbar$1.Center, { children: /* @__PURE__ */ jsx(Suspense, {
1338
- fallback: /* @__PURE__ */ jsx("div", { className: "h-9 w-32 animate-pulse rounded-md bg-surface" }),
1339
- children: /* @__PURE__ */ jsx(SearchDialog$1, { routes: routes || [] })
1472
+ /* @__PURE__ */ jsx(Navbar$1.Center, { children: /* @__PURE__ */ jsx("div", {
1473
+ className: "flex items-center gap-2",
1474
+ children: /* @__PURE__ */ jsx(Suspense, {
1475
+ fallback: /* @__PURE__ */ jsx("div", { className: "h-9 w-32 animate-pulse rounded-md bg-surface" }),
1476
+ children: /* @__PURE__ */ jsx(SearchDialog$1, { routes: routes || [] })
1477
+ })
1340
1478
  }) }),
1341
1479
  /* @__PURE__ */ jsxs(Navbar$1.Right, { children: [
1342
1480
  /* @__PURE__ */ jsx(Suspense, {
1343
1481
  fallback: null,
1344
1482
  children: /* @__PURE__ */ jsx("div", {
1345
- className: "lg:hidden",
1483
+ className: "lg:hidden flex items-center gap-1",
1346
1484
  children: /* @__PURE__ */ jsx(SearchDialog$1, { routes: routes || [] })
1347
1485
  })
1348
1486
  }),
@@ -1693,6 +1831,69 @@ function Feedback({ className }) {
1693
1831
  });
1694
1832
  }
1695
1833
 
1834
+ //#endregion
1835
+ //#region src/client/components/ui-base/giscus.tsx
1836
+ function Giscus({ className }) {
1837
+ const config = useConfig();
1838
+ const { resolvedTheme } = useTheme();
1839
+ const ref = useRef(null);
1840
+ const initializedRef = useRef(false);
1841
+ const giscusConfig = config.integrations?.feedback?.giscus;
1842
+ useEffect(() => {
1843
+ if (!giscusConfig) return;
1844
+ const theme = giscusConfig.theme || (resolvedTheme === "dark" ? "dark" : "light");
1845
+ const session = {
1846
+ repo: giscusConfig.repo,
1847
+ "repo-id": giscusConfig.repoId,
1848
+ category: giscusConfig.category,
1849
+ "category-id": giscusConfig.categoryId,
1850
+ mapping: giscusConfig.mapping || "pathname",
1851
+ strict: String(giscusConfig.strict ?? "0"),
1852
+ "reactions-enabled": String(giscusConfig.reactionsEnabled ?? "1"),
1853
+ "emit-metadata": String(giscusConfig.emitMetadata ?? "0"),
1854
+ "input-position": giscusConfig.inputPosition || "bottom",
1855
+ lang: giscusConfig.lang || "en",
1856
+ loading: giscusConfig.loading || "lazy"
1857
+ };
1858
+ if (!initializedRef.current) {
1859
+ initializedRef.current = true;
1860
+ const script = document.createElement("script");
1861
+ script.src = "https://giscus.app/client.js";
1862
+ script.setAttribute("data-repo", session.repo);
1863
+ script.setAttribute("data-repo-id", session["repo-id"]);
1864
+ if (session.category) script.setAttribute("data-category", session.category);
1865
+ if (session["category-id"]) script.setAttribute("data-category-id", session["category-id"]);
1866
+ script.setAttribute("data-mapping", session.mapping);
1867
+ script.setAttribute("data-strict", session.strict);
1868
+ script.setAttribute("data-reactions-enabled", session["reactions-enabled"]);
1869
+ script.setAttribute("data-emit-metadata", session["emit-metadata"]);
1870
+ script.setAttribute("data-input-position", session["input-position"]);
1871
+ script.setAttribute("data-lang", session.lang);
1872
+ script.setAttribute("data-loading", session.loading);
1873
+ script.setAttribute("data-theme", theme);
1874
+ script.setAttribute("crossorigin", "anonymous");
1875
+ script.async = true;
1876
+ if (ref.current) ref.current.appendChild(script);
1877
+ return () => {
1878
+ initializedRef.current = false;
1879
+ if (script.parentNode) script.parentNode.removeChild(script);
1880
+ (ref.current?.querySelectorAll("iframe"))?.forEach((iframe) => iframe.remove());
1881
+ };
1882
+ }
1883
+ }, [giscusConfig]);
1884
+ useEffect(() => {
1885
+ if (!giscusConfig || !initializedRef.current) return;
1886
+ const theme = giscusConfig.theme || (resolvedTheme === "dark" ? "dark" : "light");
1887
+ const iframe = ref.current?.querySelector("iframe.giscus-frame");
1888
+ if (iframe) iframe.contentWindow?.postMessage({ giscus: { setConfig: { theme } } }, "https://giscus.app");
1889
+ }, [resolvedTheme, giscusConfig]);
1890
+ if (!giscusConfig) return null;
1891
+ return /* @__PURE__ */ jsx("div", {
1892
+ ref,
1893
+ className: cn("w-full max-w-2xl mt-12 mb-6", className)
1894
+ });
1895
+ }
1896
+
1696
1897
  //#endregion
1697
1898
  //#region src/client/ssg/mdx-elements.tsx
1698
1899
  const Loading = () => /* @__PURE__ */ jsx("div", {
@@ -1731,117 +1932,14 @@ const NotFoundWrapper = () => {
1731
1932
  return /* @__PURE__ */ jsx(components.NotFound || components["404"] || NotFound, {});
1732
1933
  };
1733
1934
 
1734
- //#endregion
1735
- //#region src/client/app/head.tsx
1736
- function Head({ siteTitle, siteDescription, routes }) {
1737
- const location = useLocation$1();
1738
- const config = useConfig();
1739
- const { currentLocale } = useRoutes();
1740
- const currentRoute = useMemo(() => routes?.find?.((r) => r.path === location.pathname), [routes, location.pathname]);
1741
- const pageTitle = currentRoute?.title;
1742
- const translatedSiteDescription = getTranslated(siteDescription, currentLocale);
1743
- const pageDescription = currentRoute?.description || translatedSiteDescription || "";
1744
- const translatedSiteTitle = getTranslated(siteTitle, currentLocale);
1745
- const finalTitle = pageTitle ? `${pageTitle} | ${translatedSiteTitle}` : translatedSiteTitle;
1746
- const seo = currentRoute?.seo || {};
1747
- const canonicalUrl = seo.canonical || (config?.siteUrl && currentRoute?.path ? `${config.siteUrl.replace(/\/$/, "")}${currentRoute.path}` : void 0);
1748
- const ogUrl = seo["og:url"] || canonicalUrl || (typeof window !== "undefined" ? window.location.href : void 0);
1749
- const globalMetatags = config?.seo?.metatags || {};
1750
- const defaultOgImage = config?.seo?.thumbnails?.background;
1751
- const ogImage = seo["og:image"] || defaultOgImage;
1752
- return /* @__PURE__ */ jsxs(Helmet, { children: [
1753
- /* @__PURE__ */ jsx("title", { children: finalTitle }),
1754
- /* @__PURE__ */ jsx("meta", {
1755
- name: "description",
1756
- content: pageDescription
1757
- }),
1758
- /* @__PURE__ */ jsx("meta", {
1759
- property: "og:title",
1760
- content: finalTitle
1761
- }),
1762
- /* @__PURE__ */ jsx("meta", {
1763
- property: "og:description",
1764
- content: pageDescription
1765
- }),
1766
- /* @__PURE__ */ jsx("meta", {
1767
- property: "og:type",
1768
- content: "article"
1769
- }),
1770
- canonicalUrl && /* @__PURE__ */ jsx("link", {
1771
- rel: "canonical",
1772
- href: canonicalUrl
1773
- }),
1774
- ogUrl && /* @__PURE__ */ jsx("meta", {
1775
- property: "og:url",
1776
- content: ogUrl
1777
- }),
1778
- /* @__PURE__ */ jsx("meta", {
1779
- name: "twitter:card",
1780
- content: "summary"
1781
- }),
1782
- /* @__PURE__ */ jsx("meta", {
1783
- name: "twitter:title",
1784
- content: finalTitle
1785
- }),
1786
- /* @__PURE__ */ jsx("meta", {
1787
- name: "twitter:description",
1788
- content: pageDescription
1789
- }),
1790
- ogImage && /* @__PURE__ */ jsx("meta", {
1791
- name: "twitter:image",
1792
- content: ogImage
1793
- }),
1794
- ogImage && /* @__PURE__ */ jsx("meta", {
1795
- property: "og:image",
1796
- content: ogImage
1797
- }),
1798
- /* @__PURE__ */ jsx("meta", {
1799
- name: "generator",
1800
- content: "Boltdocs"
1801
- }),
1802
- Object.entries(globalMetatags).map(([key, value]) => {
1803
- return key.startsWith("og:") || key.startsWith("music:") || key.startsWith("video:") || key.startsWith("article:") || key.startsWith("book:") || key.startsWith("profile:") ? /* @__PURE__ */ jsx("meta", {
1804
- property: key,
1805
- content: value
1806
- }, key) : /* @__PURE__ */ jsx("meta", {
1807
- name: key,
1808
- content: value
1809
- }, key);
1810
- }),
1811
- Object.entries(seo).map(([key, value]) => {
1812
- if (key === "noindex" && value === true) return /* @__PURE__ */ jsx("meta", {
1813
- name: "robots",
1814
- content: "noindex"
1815
- }, "noindex");
1816
- if (key === "robots") return /* @__PURE__ */ jsx("meta", {
1817
- name: "robots",
1818
- content: value
1819
- }, "robots");
1820
- if (key === "canonical" || key === "og:url") return null;
1821
- return key.startsWith("og:") || key.startsWith("music:") || key.startsWith("video:") || key.startsWith("article:") || key.startsWith("book:") || key.startsWith("profile:") ? /* @__PURE__ */ jsx("meta", {
1822
- property: key,
1823
- content: value
1824
- }, key) : /* @__PURE__ */ jsx("meta", {
1825
- name: key,
1826
- content: value
1827
- }, key);
1828
- })
1829
- ] });
1830
- }
1831
-
1832
1935
  //#endregion
1833
1936
  //#region src/client/app/docs-layout.tsx
1834
1937
  function DocsLayout({ collectionsData }) {
1835
- const config = useConfig();
1836
- const { currentRoute, allRoutes } = useRoutes();
1837
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Head, {
1838
- siteTitle: config.theme?.title,
1839
- siteDescription: config.theme?.description,
1840
- routes: allRoutes || []
1841
- }), /* @__PURE__ */ jsx(InternalErrorBoundary, { children: /* @__PURE__ */ jsx(UserLayout, {
1938
+ const { currentRoute } = useRoutes();
1939
+ const content = /* @__PURE__ */ jsx(InternalErrorBoundary, { children: /* @__PURE__ */ jsx(UserLayout, {
1842
1940
  route: currentRoute,
1843
1941
  children: /* @__PURE__ */ jsx(Outlet, {})
1844
- }) })] });
1942
+ }) });
1845
1943
  if (collectionsData) return /* @__PURE__ */ jsx(CollectionsContext.Provider, {
1846
1944
  value: collectionsData,
1847
1945
  children: content
@@ -2318,6 +2416,18 @@ function createRoutes(options) {
2318
2416
  function DocsLayoutComponent({ children }) {
2319
2417
  const { routes: filteredRoutes, currentRoute, isCollectionPage } = useRoutes();
2320
2418
  const config = useConfig();
2419
+ const AskAiDialog = useMergedComponents().AskAiDialog;
2420
+ const [isAskAiOpen, setIsAskAiOpen] = useState(false);
2421
+ useEffect(() => {
2422
+ const handleOpen = () => setIsAskAiOpen(true);
2423
+ const handleClose = () => setIsAskAiOpen(false);
2424
+ window.addEventListener("boltdocs:ask-ai:open", handleOpen);
2425
+ window.addEventListener("boltdocs:ask-ai:close", handleClose);
2426
+ return () => {
2427
+ window.removeEventListener("boltdocs:ask-ai:open", handleOpen);
2428
+ window.removeEventListener("boltdocs:ask-ai:close", handleClose);
2429
+ };
2430
+ }, []);
2321
2431
  return /* @__PURE__ */ jsxs(DocsLayout$1, {
2322
2432
  className: "selection:bg-primary-500/10 selection:text-primary-500",
2323
2433
  children: [/* @__PURE__ */ jsx(Navbar, {}), /* @__PURE__ */ jsxs(DocsLayout$1.Body, {
@@ -2354,15 +2464,17 @@ function DocsLayoutComponent({ children }) {
2354
2464
  children
2355
2465
  }) }),
2356
2466
  !isCollectionPage && /* @__PURE__ */ jsx(Feedback, {}),
2467
+ !isCollectionPage && /* @__PURE__ */ jsx(Giscus, {}),
2357
2468
  /* @__PURE__ */ jsx(DocsLayout$1.Footer, { children: !isCollectionPage && /* @__PURE__ */ jsx(PageNav, {}) })
2358
2469
  ]
2359
2470
  })
2360
2471
  }),
2361
- /* @__PURE__ */ jsx(OnThisPage, {
2472
+ AskAiDialog && /* @__PURE__ */ jsx(AskAiDialog, {}),
2473
+ !isCollectionPage && !isAskAiOpen && /* @__PURE__ */ jsx(OnThisPage, {
2362
2474
  headings: currentRoute?.headings,
2363
- editLink: config.theme?.editLink,
2475
+ filePath: currentRoute?.filePath,
2364
2476
  communityHelp: config.theme?.communityHelp,
2365
- filePath: currentRoute?.filePath
2477
+ editLink: config.theme?.editLink
2366
2478
  })
2367
2479
  ]
2368
2480
  })]
@@ -4,7 +4,7 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
7
- const require_mdx = require('../mdx-9QJoSITt.cjs');
7
+ const require_mdx = require('../mdx-DJBg5DuL.cjs');
8
8
 
9
9
  //#region src/client/mdx.ts
10
10
  const { Card, Cards, Callout, Field, Image } = require_mdx.mdx_components_default;
@@ -3,7 +3,7 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import { t as mdx_components_default } from "../mdx-DFbspTP9.js";
6
+ import { t as mdx_components_default } from "../mdx-DhyMkc35.js";
7
7
 
8
8
  //#region src/client/mdx.ts
9
9
  const { Card, Cards, Callout, Field, Image } = mdx_components_default;
@@ -5,9 +5,9 @@
5
5
  */
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
7
7
  const require_icons_dev = require('../icons-dev-BryEFkJu.cjs');
8
- const require_image = require('../image-DWdmichO.cjs');
8
+ const require_image = require('../image-CR6UlaI5.cjs');
9
9
  const require_docs_layout = require('../docs-layout-3TpAt6MB.cjs');
10
- const require_search_dialog = require('../search-dialog-BhXg05Ri.cjs');
10
+ const require_search_dialog = require('../search-dialog-D4rplZMv.cjs');
11
11
  let react_jsx_runtime = require("react/jsx-runtime");
12
12
 
13
13
  //#region src/client/components/primitives/skeleton.tsx
@@ -1,10 +1,10 @@
1
1
 
2
- import { A as BoltdocsRoutePathWithFallback, a as SidebarItem, c as SidebarItemsProps, d as SidebarMobile, f as SidebarRoot, i as SidebarHeader, l as SidebarLink, m as ComponentBase, n as SidebarContent, o as SidebarItemProps, p as SidebarSubGroup, r as SidebarGroup, s as SidebarItems, t as Sidebar, u as SidebarLinkProps } from "../sidebar-BtJyWHy4.cjs";
2
+ import { A as BoltdocsRoutePathWithFallback, a as SidebarItem, c as SidebarItemsProps, d as SidebarMobile, f as SidebarRoot, i as SidebarHeader, l as SidebarLink, m as ComponentBase, n as SidebarContent, o as SidebarItemProps, p as SidebarSubGroup, r as SidebarGroup, s as SidebarItems, t as Sidebar, u as SidebarLinkProps } from "../sidebar-7gIifpBX.cjs";
3
3
  import * as React$2 from "react";
4
4
  import { Component, ComponentProps, ComponentType, ErrorInfo, ImgHTMLAttributes, ReactNode, RefObject } from "react";
5
5
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
6
6
  import * as RAC from "react-aria-components";
7
- import { LinkProps as LinkProps$1, PopoverProps as PopoverProps$1 } from "react-aria-components";
7
+ import { PopoverProps as PopoverProps$1 } from "react-aria-components";
8
8
 
9
9
  //#region src/client/components/primitives/docs-layout.d.ts
10
10
  /**
@@ -527,7 +527,7 @@ declare function MenuSeparator(props: RAC.SeparatorProps): _$react_jsx_runtime0.
527
527
  //#endregion
528
528
  //#region src/client/components/primitives/page-nav.d.ts
529
529
  interface PageNavProps extends ComponentBase {
530
- to: string;
530
+ to: BoltdocsRoutePathWithFallback;
531
531
  direction: 'prev' | 'next';
532
532
  }
533
533
  declare function PageNav({
@@ -706,8 +706,10 @@ declare function BreadcrumbsLink({
706
706
  href,
707
707
  className,
708
708
  ...props
709
- }: LinkProps$1 & {
709
+ }: {
710
+ href: BoltdocsRoutePathWithFallback;
710
711
  className?: string;
712
+ children?: React.ReactNode;
711
713
  }): _$react_jsx_runtime0.JSX.Element;
712
714
  declare function BreadcrumbsSeparator({
713
715
  className
@@ -716,7 +718,7 @@ declare function BreadcrumbsSeparator({
716
718
  //#region src/client/components/primitives/navbar.d.ts
717
719
  interface NavbarLinkProps extends Omit<ComponentBase, 'children'> {
718
720
  label: ReactNode;
719
- href: string;
721
+ href: BoltdocsRoutePathWithFallback;
720
722
  to?: 'internal' | 'external';
721
723
  }
722
724
  interface NavbarLogoProps extends Omit<ComponentBase, 'children'> {
@@ -724,7 +726,7 @@ interface NavbarLogoProps extends Omit<ComponentBase, 'children'> {
724
726
  alt: string;
725
727
  width?: number;
726
728
  height?: number;
727
- href?: string;
729
+ href?: BoltdocsRoutePathWithFallback;
728
730
  }
729
731
  interface NavbarSearchTriggerProps extends ComponentBase {
730
732
  onPress: () => void;
@@ -796,7 +798,7 @@ declare function NavbarTitle({
796
798
  className,
797
799
  href
798
800
  }: {
799
- href?: string;
801
+ href?: BoltdocsRoutePathWithFallback;
800
802
  } & ComponentBase): _$react_jsx_runtime0.JSX.Element;
801
803
  declare function NavbarLinks({
802
804
  children,
@@ -822,7 +824,7 @@ declare function NavbarDropdownItem({
822
824
  label,
823
825
  className
824
826
  }: {
825
- href: string;
827
+ href: BoltdocsRoutePathWithFallback;
826
828
  label: string;
827
829
  className?: string;
828
830
  }): _$react_jsx_runtime0.JSX.Element;