boltdocs 3.0.2 → 3.2.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 (123) hide show
  1. package/README.md +2 -18
  2. package/dist/{adapters-DEXNIv3x.mjs → adapters-ByYY44Zy.mjs} +1 -1
  3. package/dist/{adapters-C5AWWGfb.cjs → adapters-DvmtpdSF.cjs} +1 -1
  4. package/dist/{banner-CfdalYLL.d.ts → banner-BMop1KLF.d.ts} +2 -2
  5. package/dist/{banner-DNSkgUsO.d.cts → banner-CVD0GugR.d.cts} +2 -2
  6. package/dist/cache-CO4Dy2uQ.cjs +6 -0
  7. package/dist/cache-Dk53iOo6.mjs +6 -0
  8. package/dist/chunk-BFSpntXv.mjs +6 -0
  9. package/dist/{chunk-Ds5LZdWN.cjs → chunk-D1Md3oWO.cjs} +1 -1
  10. package/dist/client/index.cjs +433 -272
  11. package/dist/client/index.d.cts +129 -18
  12. package/dist/client/index.d.ts +129 -18
  13. package/dist/client/index.js +337 -178
  14. package/dist/client/mdx.cjs +1 -1
  15. package/dist/client/mdx.d.cts +1 -1
  16. package/dist/client/mdx.d.ts +1 -1
  17. package/dist/client/mdx.js +1 -1
  18. package/dist/client/primitives.cjs +7 -7
  19. package/dist/client/primitives.d.cts +5 -22
  20. package/dist/client/primitives.d.ts +5 -22
  21. package/dist/client/primitives.js +4 -4
  22. package/dist/client/theme/neutral.css +1 -3
  23. package/dist/client/theme/reset.css +31 -4
  24. package/dist/config-BpzaPsJj.d.cts +781 -0
  25. package/dist/config-CCXp3aXO.mjs +7 -0
  26. package/dist/{config-JGkMJoJQ.cjs → config-CMd4XoFq.cjs} +1 -1
  27. package/dist/config-DlGoEM9D.cjs +7 -0
  28. package/dist/config-xtS0ZkMm.d.mts +781 -0
  29. package/dist/{csp-CBysWlAf.cjs → csp-CRp_3U7a.cjs} +1 -1
  30. package/dist/csp-oTC2ygvF.mjs +6 -0
  31. package/dist/{docs-layout-6FQ8__ok.js → docs-layout-BdtZ9z6s.js} +9 -28
  32. package/dist/{docs-layout-3TpAt6MB.cjs → docs-layout-CFWI15Id.cjs} +69 -88
  33. package/dist/{doctor-BR1B2Mkz.cjs → doctor-BBtmNJE0.cjs} +1 -1
  34. package/dist/doctor-Bv16QSrI.cjs +7 -0
  35. package/dist/doctor-DOAbSaiL.mjs +7 -0
  36. package/dist/{generator-DtUU3Cfk.cjs → generator-COepVWGi.cjs} +1 -1
  37. package/dist/{handler-Btd4t_67.mjs → handler-DzQae4eA.mjs} +1 -1
  38. package/dist/{handler-Dzf4dSnV.cjs → handler-XX7cLTqe.cjs} +1 -1
  39. package/dist/headers-Ddwek8K7.mjs +6 -0
  40. package/dist/{headers-BXKxiPUv.cjs → headers-dg4SDrjY.cjs} +1 -1
  41. package/dist/{image-C9md50h2.js → image-Bz87fCla.js} +2 -2
  42. package/dist/{image-CR6UlaI5.cjs → image-C4TlpMHn.cjs} +18 -18
  43. package/dist/link-2PzgTnaP.js +673 -0
  44. package/dist/{icons-dev-BryEFkJu.cjs → link-D1Gjkb-2.cjs} +8 -353
  45. package/dist/{mdx-DhyMkc35.js → mdx-BuO6a1f7.js} +199 -40
  46. package/dist/{mdx-DJBg5DuL.cjs → mdx-CD-tSjRG.cjs} +237 -72
  47. package/dist/{meta-loader-C9MKjAs0.cjs → meta-loader-Dq1zcFnh.cjs} +1 -1
  48. package/dist/node/cache.cjs +6 -0
  49. package/dist/node/cache.d.cts +84 -0
  50. package/dist/node/cache.d.mts +84 -0
  51. package/dist/node/cache.mjs +6 -0
  52. package/dist/node/cli-entry.cjs +6 -6
  53. package/dist/node/cli-entry.mjs +9 -9
  54. package/dist/node/index.cjs +1 -1
  55. package/dist/node/index.d.cts +27 -638
  56. package/dist/node/index.d.mts +27 -640
  57. package/dist/node/index.mjs +1 -1
  58. package/dist/node/mdx/shiki-adapter.cjs +6 -0
  59. package/dist/node/mdx/shiki-adapter.d.cts +51 -0
  60. package/dist/node/mdx/shiki-adapter.d.mts +51 -0
  61. package/dist/node/mdx/shiki-adapter.mjs +6 -0
  62. package/dist/node-BXtqM1uH.mjs +6 -0
  63. package/dist/node-BlVk4EVg.cjs +104 -0
  64. package/dist/node-DOf4zhWc.mjs +104 -0
  65. package/dist/node-aD1eisrR.cjs +6 -0
  66. package/dist/{package-CEDhVAfO.cjs → package-BcISI5-P.cjs} +1 -1
  67. package/dist/{package-_dCCKVvG.mjs → package-CCYEAYeA.mjs} +1 -1
  68. package/dist/{pages-external-CX2uyW95.cjs → pages-external-XkYIs-d5.cjs} +1 -1
  69. package/dist/parser-DCiEWkSk.cjs +8 -0
  70. package/dist/parser-qk9FIHJ7.mjs +8 -0
  71. package/dist/plugin-C95kvu6h.mjs +73 -0
  72. package/dist/plugin-DM3u2bVj.cjs +73 -0
  73. package/dist/routes-BW6zsk7Z.mjs +6 -0
  74. package/dist/routes-BgoIB5wb.cjs +6 -0
  75. package/dist/{routes-BajCwrvX.cjs → routes-CORVxc02.cjs} +1 -1
  76. package/dist/{search-dialog-D4rplZMv.cjs → search-dialog-B1NERUNx.cjs} +101 -55
  77. package/dist/{search-dialog-Cx7aGW3U.cjs → search-dialog-BRFno7HD.cjs} +8 -8
  78. package/dist/{search-dialog-DDopgbKM.js → search-dialog-BmxHiKwt.js} +2 -2
  79. package/dist/{search-dialog-BNdRV60O.js → search-dialog-D6TvjcuV.js} +1 -1
  80. package/dist/{search-dialog-DaeSPvEo.js → search-dialog-DFnlx8LO.js} +44 -4
  81. package/dist/{search-dialog-CW1f6dn6.cjs → search-dialog-DHqwjJuG.cjs} +1 -1
  82. package/dist/server/index.cjs +1 -1
  83. package/dist/server/index.d.mts +1 -1
  84. package/dist/server/index.mjs +1 -1
  85. package/dist/shiki-adapter-CoQ6jyJ4.cjs +6 -0
  86. package/dist/shiki-adapter-D-aKw7PP.mjs +6 -0
  87. package/dist/sidebar-COTaMHR-.d.ts +1100 -0
  88. package/dist/sidebar-CrEdJuHX.d.cts +1100 -0
  89. package/dist/{types-generator-CYcHkDzZ.cjs → types-generator-BXhv7Ill.cjs} +1 -1
  90. package/dist/types-generator-bDPvUztF.mjs +26 -0
  91. package/dist/utils-Crm9oPcV.mjs +7 -0
  92. package/dist/utils-D6Xtj0FZ.cjs +7 -0
  93. package/package.json +26 -12
  94. package/src/shared/types.ts +532 -23
  95. package/dist/cache-DETwlACe.cjs +0 -6
  96. package/dist/cache-SF59enb3.mjs +0 -6
  97. package/dist/config-B5uVv5q4.cjs +0 -7
  98. package/dist/config-D3_zDkHh.mjs +0 -7
  99. package/dist/csp-gaZ51xzq.mjs +0 -6
  100. package/dist/doctor-3MheVMwd.mjs +0 -7
  101. package/dist/doctor-DQxLM202.cjs +0 -7
  102. package/dist/headers-CXyf0auY.mjs +0 -6
  103. package/dist/icons-dev-kJyGWNeg.js +0 -916
  104. package/dist/node-B9JSyEIU.mjs +0 -105
  105. package/dist/node-Cedquois.cjs +0 -105
  106. package/dist/parser-CNIPHx4s.cjs +0 -8
  107. package/dist/parser-D0QHIQsi.mjs +0 -8
  108. package/dist/plugin-WYNORxp1.cjs +0 -68
  109. package/dist/plugin-YWNVRpws.mjs +0 -68
  110. package/dist/rolldown-runtime-fkIsjY3S.mjs +0 -6
  111. package/dist/routes-CyrnmVuG.mjs +0 -6
  112. package/dist/routes-D6Tuu7Fs.cjs +0 -6
  113. package/dist/shiki-adapter-CGTmrR6S.cjs +0 -6
  114. package/dist/shiki-adapter-CXEGRnjr.mjs +0 -6
  115. package/dist/shiki-adapter-Mr8_oT_9.cjs +0 -6
  116. package/dist/sidebar-7gIifpBX.d.cts +0 -615
  117. package/dist/sidebar-BAKgJ-Er.d.ts +0 -615
  118. package/dist/types-generator-DVOnRVKU.mjs +0 -26
  119. package/dist/utils-B3xYMrpK.mjs +0 -7
  120. package/dist/utils-Bz1tG9Dg.cjs +0 -7
  121. /package/dist/{errors-C0Hx15Ag.mjs → errors-0zGHRLue.mjs} +0 -0
  122. /package/dist/{errors-Dx6JHoKE.cjs → errors-vKw8CkiX.cjs} +0 -0
  123. /package/dist/{index-CdJv4ocW.d.mts → index-1KsTDq4o.d.mts} +0 -0
@@ -3,10 +3,10 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import { D as Check, H as Info, M as Copy, R as File, T as AlertTriangle, W as Lightbulb, _ as Link, a as Csv, c as JavaScript, d as React$1, f as Rust, g as Yaml, i as Css, l as Json, m as TypeScript, n as BracketsOrange, p as Shell, r as BracketsRed, rt as useConfig, u as Markdown, w as AlertCircle, y as cn } from "./icons-dev-kJyGWNeg.js";
7
- import { a as CodeBlockGroup, i as CodeBlockContent, l as useTheme, n as Tooltip, o as CodeBlockHeader, r as CodeBlock$1, s as Heading$1, t as Image$1 } from "./image-C9md50h2.js";
6
+ import { B as useConfig, D as Lightbulb, T as Info, c as AlertCircle, d as Check, g as Copy, l as AlertTriangle, r as cn, t as Link } from "./link-2PzgTnaP.js";
7
+ import { a as CodeBlockGroup, i as CodeBlockContent, l as useTheme, n as Tooltip, o as CodeBlockHeader, r as CodeBlock$1, s as Heading$1, t as Image$1 } from "./image-Bz87fCla.js";
8
8
  import { useCallback, useEffect, useRef, useState } from "react";
9
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import { Button } from "react-aria-components";
11
11
 
12
12
  //#region src/client/components/mdx/field.tsx
@@ -104,6 +104,10 @@ const Typographics = {
104
104
  className: cn("bg-primary-500/10 text-primary-500 font-semibold px-1.5 py-0.5 rounded-md", className),
105
105
  ...props
106
106
  }),
107
+ code: ({ className, ...props }) => /* @__PURE__ */ jsx("code", {
108
+ className: cn("bg-code-bg text-code-text rounded-md px-1.5 py-0.5 text-[0.875em] font-mono font-medium", className),
109
+ ...props
110
+ }),
107
111
  blockquote: ({ className, ...props }) => /* @__PURE__ */ jsx("blockquote", {
108
112
  className: cn("border-l-4 border-primary-500 bg-soft/30 pl-4 py-2 my-6 italic text-muted rounded-r-lg", className),
109
113
  ...props
@@ -208,7 +212,7 @@ function Callout({ children, className = "", variant = "note", title, ...props }
208
212
  ...props,
209
213
  children: [/* @__PURE__ */ jsx("div", {
210
214
  className: cn("shrink-0 pt-0.5", styles.iconColor),
211
- children: /* @__PURE__ */ jsx(Icon, { className: "w-5 h-5 stroke-[2]" })
215
+ children: /* @__PURE__ */ jsx(Icon, { className: "w-5 h-5 stroke-2" })
212
216
  }), /* @__PURE__ */ jsxs("div", {
213
217
  className: "flex-1 text-[0.875rem] leading-[1.6]",
214
218
  children: [/* @__PURE__ */ jsx("div", {
@@ -248,32 +252,13 @@ const copyToClipboard = async (text) => {
248
252
 
249
253
  //#endregion
250
254
  //#region src/client/components/mdx/use-code-block.ts
251
- const langIconMap = {
252
- ts: TypeScript,
253
- tsx: React$1,
254
- js: JavaScript,
255
- jsx: React$1,
256
- json: Json,
257
- css: Css,
258
- html: BracketsOrange,
259
- md: Markdown,
260
- mdx: Markdown,
261
- bash: Shell,
262
- sh: Shell,
263
- yaml: Yaml,
264
- yml: Yaml,
265
- rs: Rust,
266
- rust: Rust,
267
- toml: BracketsRed,
268
- csv: Csv
269
- };
270
255
  function useCodeBlock(props) {
271
256
  const [copied, setCopied] = useState(false);
272
257
  const [isExpanded, setIsExpanded] = useState(false);
273
258
  const [isExpandable, setIsExpandable] = useState(false);
259
+ const [rated, setRated] = useState(null);
274
260
  const preRef = useRef(null);
275
261
  const timerRef = useRef(null);
276
- const [rated, setRated] = useState(null);
277
262
  const customConfig = useConfig().integrations?.feedback?.custom;
278
263
  const showCodeBlockFeedback = !!(customConfig?.enabled && !props.plain);
279
264
  const lang = props.lang || props["data-lang"] || "";
@@ -326,7 +311,6 @@ function useCodeBlock(props) {
326
311
  const lines = (preRef.current?.textContent ?? "").trim().split("\n").length;
327
312
  setIsExpandable(lines > 6);
328
313
  }, [props.children, props.highlightedHtml]);
329
- const LangIcon = langIconMap[lang] || File;
330
314
  return {
331
315
  copied,
332
316
  isExpanded,
@@ -341,8 +325,7 @@ function useCodeBlock(props) {
341
325
  lang,
342
326
  showCodeBlockFeedback,
343
327
  rated,
344
- handleRate,
345
- LangIcon
328
+ handleRate
346
329
  };
347
330
  }
348
331
 
@@ -365,8 +348,8 @@ const CodeBlockFeedback = ({ rated, onRate }) => {
365
348
  children: [/* @__PURE__ */ jsx(Tooltip, {
366
349
  content: rated === "up" ? "Helpful!" : "This code is helpful",
367
350
  children: /* @__PURE__ */ jsx(Button, {
368
- onPress: () => onRate("up"),
369
- disabled: rated !== null,
351
+ onPress: (() => onRate("up")),
352
+ isDisabled: rated !== null,
370
353
  className: cn("grid place-items-center size-8 bg-transparent outline-none cursor-pointer transition-all duration-200 hover:scale-110 active:scale-95 [&>svg]:size-4 [&>svg]:stroke-2 z-10", rated === "up" ? "text-emerald-500 dark:text-emerald-400" : rated === "down" ? "opacity-30 cursor-not-allowed text-muted" : "text-muted hover:text-body"),
371
354
  "aria-label": "Mark as helpful",
372
355
  children: /* @__PURE__ */ jsx("svg", {
@@ -383,8 +366,8 @@ const CodeBlockFeedback = ({ rated, onRate }) => {
383
366
  }), /* @__PURE__ */ jsx(Tooltip, {
384
367
  content: rated === "down" ? "Unhelpful" : "This code is unhelpful",
385
368
  children: /* @__PURE__ */ jsx(Button, {
386
- onPress: () => onRate("down"),
387
- disabled: rated !== null,
369
+ onPress: (() => onRate("down")),
370
+ isDisabled: rated !== null,
388
371
  className: cn("grid place-items-center size-8 bg-transparent outline-none cursor-pointer transition-all duration-200 hover:scale-110 active:scale-95 [&>svg]:size-4 [&>svg]:stroke-2 z-10", rated === "down" ? "text-rose-500 dark:text-rose-400" : rated === "up" ? "opacity-30 cursor-not-allowed text-muted" : "text-muted hover:text-body"),
389
372
  "aria-label": "Mark as unhelpful",
390
373
  children: /* @__PURE__ */ jsx("svg", {
@@ -404,17 +387,14 @@ const CodeBlockFeedback = ({ rated, onRate }) => {
404
387
  function CodeBlock(props) {
405
388
  const { children, hideCopy = false, highlightedHtml, "data-highlighted-html": dataHighlightedHtml, title, "data-title": dataTitle, "data-lang": dataLang, plain = false, lineNumbers, showLineNumbers, wordWrap, "word-wrap": wordWrapHyphen, metastring, ...rest } = props;
406
389
  const { className: shikiClassName, ...cleanRest } = rest;
407
- const { copied, isExpanded, setIsExpanded, isExpandable, preRef, handleCopy, shouldTruncate, isHighlighted, effectiveHighlightedHtml, effectiveTitle, showCodeBlockFeedback, rated, handleRate, LangIcon } = useCodeBlock(props);
390
+ const { copied, isExpanded, setIsExpanded, isExpandable, preRef, handleCopy, shouldTruncate, isHighlighted, effectiveHighlightedHtml, effectiveTitle, showCodeBlockFeedback, rated, handleRate } = useCodeBlock(props);
408
391
  return /* @__PURE__ */ jsxs(CodeBlock$1, {
409
392
  plain,
410
393
  className: props.className,
411
394
  children: [(effectiveTitle || !hideCopy) && /* @__PURE__ */ jsxs(CodeBlockHeader, {
412
395
  className: cn({ "absolute top-2 left-0 w-full": !effectiveTitle }),
413
- children: [/* @__PURE__ */ jsx(CodeBlockGroup, { children: effectiveTitle && /* @__PURE__ */ jsxs(Fragment, { children: [LangIcon ? /* @__PURE__ */ jsx(LangIcon, { size: 14 }) : /* @__PURE__ */ jsx(File, {
414
- size: 14,
415
- className: "opacity-60"
416
- }), /* @__PURE__ */ jsx("span", { children: effectiveTitle })] }) }), /* @__PURE__ */ jsxs("div", {
417
- className: "flex items-center gap-1",
396
+ children: [/* @__PURE__ */ jsx(CodeBlockGroup, { children: effectiveTitle && /* @__PURE__ */ jsx("span", { children: effectiveTitle }) }), /* @__PURE__ */ jsxs("div", {
397
+ className: "flex items-center gap-1 bg-(--color-code-bg) pl-2 z-10",
418
398
  children: [showCodeBlockFeedback && /* @__PURE__ */ jsx(CodeBlockFeedback, {
419
399
  rated,
420
400
  onRate: handleRate
@@ -522,7 +502,7 @@ function Card({ className, title, icon, href, children, ...props }) {
522
502
  /* @__PURE__ */ jsxs("div", {
523
503
  className: "relative z-10 flex items-center gap-3",
524
504
  children: [icon && /* @__PURE__ */ jsx("div", {
525
- className: cn("shrink-0 transition-transform duration-500 group-hover:rotate-[15deg] group-hover:scale-110 flex items-center justify-center text-muted group-hover:text-primary-500", "[&>svg]:w-6 [&>svg]:h-6 [&>svg]:stroke-[1.5]"),
505
+ className: cn("shrink-0 transition-transform duration-500 group-hover:rotate-15 group-hover:scale-110 flex items-center justify-center text-muted group-hover:text-primary-500", "[&>svg]:w-6 [&>svg]:h-6 [&>svg]:stroke-[1.5]"),
526
506
  children: icon
527
507
  }), title && /* @__PURE__ */ jsx("h3", {
528
508
  className: "font-semibold text-base m-0 leading-none text-body",
@@ -576,6 +556,184 @@ function LastUpdated({ date }) {
576
556
  });
577
557
  }
578
558
 
559
+ //#endregion
560
+ //#region src/client/components/mdx/timeline.tsx
561
+ const VARIANT_PALETTE = {
562
+ primary: {
563
+ ring: "border-primary-500/70",
564
+ fill: "bg-primary-500",
565
+ badgeBg: "bg-primary-500/10",
566
+ badgeText: "text-primary-600 dark:text-primary-400",
567
+ badgeBorder: "border-primary-500/30"
568
+ },
569
+ success: {
570
+ ring: "border-success-500/70",
571
+ fill: "bg-success-500",
572
+ badgeBg: "bg-success-500/10",
573
+ badgeText: "text-success-500",
574
+ badgeBorder: "border-success-500/30"
575
+ },
576
+ info: {
577
+ ring: "border-info-500/70",
578
+ fill: "bg-info-500",
579
+ badgeBg: "bg-info-500/10",
580
+ badgeText: "text-info-500",
581
+ badgeBorder: "border-info-500/30"
582
+ },
583
+ warning: {
584
+ ring: "border-warning-500/70",
585
+ fill: "bg-warning-500",
586
+ badgeBg: "bg-warning-500/10",
587
+ badgeText: "text-warning-500",
588
+ badgeBorder: "border-warning-500/30"
589
+ },
590
+ danger: {
591
+ ring: "border-danger-500/70",
592
+ fill: "bg-danger-500",
593
+ badgeBg: "bg-danger-500/10",
594
+ badgeText: "text-danger-500",
595
+ badgeBorder: "border-danger-500/30"
596
+ },
597
+ major: {
598
+ ring: "",
599
+ fill: "",
600
+ badgeBg: "",
601
+ badgeText: "",
602
+ badgeBorder: ""
603
+ },
604
+ minor: {
605
+ ring: "",
606
+ fill: "",
607
+ badgeBg: "",
608
+ badgeText: "",
609
+ badgeBorder: ""
610
+ },
611
+ patch: {
612
+ ring: "",
613
+ fill: "",
614
+ badgeBg: "",
615
+ badgeText: "",
616
+ badgeBorder: ""
617
+ },
618
+ new: {
619
+ ring: "",
620
+ fill: "",
621
+ badgeBg: "",
622
+ badgeText: "",
623
+ badgeBorder: ""
624
+ },
625
+ deprecated: {
626
+ ring: "",
627
+ fill: "",
628
+ badgeBg: "",
629
+ badgeText: "",
630
+ badgeBorder: ""
631
+ },
632
+ breaking: {
633
+ ring: "",
634
+ fill: "",
635
+ badgeBg: "",
636
+ badgeText: "",
637
+ badgeBorder: ""
638
+ }
639
+ };
640
+ Object.assign(VARIANT_PALETTE, {
641
+ major: VARIANT_PALETTE.primary,
642
+ minor: VARIANT_PALETTE.success,
643
+ patch: VARIANT_PALETTE.info,
644
+ new: VARIANT_PALETTE.primary,
645
+ deprecated: VARIANT_PALETTE.warning,
646
+ breaking: VARIANT_PALETTE.danger
647
+ });
648
+ function normalizeBadge(badge) {
649
+ if (!badge) return null;
650
+ if (typeof badge === "string") return {
651
+ text: badge,
652
+ variant: "primary"
653
+ };
654
+ return {
655
+ text: badge.text,
656
+ variant: badge.variant ?? "primary"
657
+ };
658
+ }
659
+ function formatDate(date, locale) {
660
+ if (date === void 0 || date === null || date === "") return null;
661
+ const d = date instanceof Date ? date : new Date(date);
662
+ if (Number.isNaN(d.getTime())) return null;
663
+ return d.toLocaleDateString(locale ?? "en-US", {
664
+ year: "numeric",
665
+ month: "short",
666
+ day: "numeric"
667
+ });
668
+ }
669
+ const VARIANT_DEFAULT_ICON = {
670
+ success: Check,
671
+ info: Info,
672
+ warning: AlertTriangle,
673
+ danger: AlertCircle
674
+ };
675
+ function TimelineRoot({ children, className, compact = false, ...props }) {
676
+ return /* @__PURE__ */ jsxs("ol", {
677
+ role: "list",
678
+ className: cn("relative my-8 ms-3", compact ? "space-y-3" : "space-y-7", className),
679
+ ...props,
680
+ children: [/* @__PURE__ */ jsx("span", {
681
+ "aria-hidden": "true",
682
+ className: "pointer-events-none absolute top-3 bottom-3 start-[5.5px] w-px bg-subtle"
683
+ }), children]
684
+ });
685
+ }
686
+ function TimelineItem({ date, title, badge, icon, variant = "primary", locale, className, children, ...props }) {
687
+ const palette = VARIANT_PALETTE[variant] ?? VARIANT_PALETTE.primary;
688
+ const formatted = formatDate(date, locale);
689
+ const badgeCfg = normalizeBadge(badge);
690
+ const FallbackIcon = VARIANT_DEFAULT_ICON[variant];
691
+ const dot = icon ?? (FallbackIcon ? /* @__PURE__ */ jsx(FallbackIcon, {
692
+ size: 12,
693
+ className: "text-white",
694
+ "aria-hidden": "true"
695
+ }) : /* @__PURE__ */ jsx("span", {
696
+ "aria-hidden": "true",
697
+ className: cn("w-2 h-2 rounded-full", palette.fill)
698
+ }));
699
+ const ariaLabel = [formatted, typeof title === "string" ? title : null].filter(Boolean).join(" - ") || void 0;
700
+ const a11yProps = ariaLabel ? {
701
+ role: "img",
702
+ "aria-label": ariaLabel
703
+ } : { "aria-hidden": "true" };
704
+ return /* @__PURE__ */ jsxs("li", {
705
+ className: cn("relative ps-8", className),
706
+ ...props,
707
+ children: [
708
+ /* @__PURE__ */ jsx("span", {
709
+ ...a11yProps,
710
+ className: cn("absolute start-0 top-1 flex items-center justify-center w-3 h-3 rounded-full", "bg-surface border-2 shadow-sm", palette.ring),
711
+ children: dot
712
+ }),
713
+ /* @__PURE__ */ jsxs("div", {
714
+ className: "flex items-center gap-2 flex-wrap mb-1",
715
+ children: [formatted && /* @__PURE__ */ jsx("time", {
716
+ dateTime: date instanceof Date ? date.toISOString() : new Date(date).toISOString(),
717
+ className: "text-[11px] uppercase tracking-wider font-mono tabular-nums text-muted select-none",
718
+ children: formatted
719
+ }), badgeCfg && /* @__PURE__ */ jsx("span", {
720
+ className: cn("inline-flex items-center px-2 py-0.5 rounded-full text-[10px] font-bold uppercase tracking-wide border", palette.badgeBg, palette.badgeText, palette.badgeBorder),
721
+ children: badgeCfg.text
722
+ })]
723
+ }),
724
+ /* @__PURE__ */ jsx("h3", {
725
+ className: "text-base font-semibold text-body m-0 leading-snug",
726
+ children: title
727
+ }),
728
+ children && /* @__PURE__ */ jsx("div", {
729
+ className: "mt-2 text-[0.9rem] leading-[1.6] text-paragraph prose prose-neutral dark:prose-invert max-w-none [&>p]:m-0 [&>p+p]:mt-2 [&_a]:text-primary-500 [&_a]:no-underline hover:[&_a]:underline",
730
+ children
731
+ })
732
+ ]
733
+ });
734
+ }
735
+ const Timeline = Object.assign(TimelineRoot, { Item: TimelineItem });
736
+
579
737
  //#endregion
580
738
  //#region src/client/components/mdx/index.ts
581
739
  const mdx_components_default = {
@@ -587,8 +745,9 @@ const mdx_components_default = {
587
745
  Field,
588
746
  Callout,
589
747
  Card,
590
- Cards
748
+ Cards,
749
+ Timeline
591
750
  };
592
751
 
593
752
  //#endregion
594
- export { useCodeBlock as n, copyToClipboard as r, mdx_components_default as t };
753
+ export { copyToClipboard as i, Timeline as n, useCodeBlock as r, mdx_components_default as t };