@livemark/markdown 0.0.0-stage → 0.45.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 (184) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +5 -2
  3. package/build/actions/markdown/compile.d.ts +27 -0
  4. package/build/actions/markdown/compile.js +48 -0
  5. package/build/actions/processor/create.d.ts +17 -0
  6. package/build/actions/processor/create.js +212 -0
  7. package/build/components/Abbr.d.ts +5 -0
  8. package/build/components/Abbr.js +7 -0
  9. package/build/components/AnsiCode.d.ts +4 -0
  10. package/build/components/AnsiCode.js +7 -0
  11. package/build/components/Audio.d.ts +4 -0
  12. package/build/components/Audio.js +9 -0
  13. package/build/components/Badge.d.ts +5 -0
  14. package/build/components/Badge.js +7 -0
  15. package/build/components/Button.d.ts +7 -0
  16. package/build/components/Button.js +11 -0
  17. package/build/components/Callout.d.ts +8 -0
  18. package/build/components/Callout.js +41 -0
  19. package/build/components/Card.d.ts +7 -0
  20. package/build/components/Card.js +16 -0
  21. package/build/components/Cards.d.ts +4 -0
  22. package/build/components/Cards.js +6 -0
  23. package/build/components/CodeBlock.d.ts +1 -0
  24. package/build/components/CodeBlock.js +50 -0
  25. package/build/components/CodeTabs.d.ts +6 -0
  26. package/build/components/CodeTabs.js +48 -0
  27. package/build/components/Column.d.ts +4 -0
  28. package/build/components/Column.js +6 -0
  29. package/build/components/Columns.d.ts +5 -0
  30. package/build/components/Columns.js +8 -0
  31. package/build/components/DefinitionList.d.ts +7 -0
  32. package/build/components/DefinitionList.js +14 -0
  33. package/build/components/Details.d.ts +5 -0
  34. package/build/components/Details.js +10 -0
  35. package/build/components/Filetree.d.ts +4 -0
  36. package/build/components/Filetree.js +22 -0
  37. package/build/components/FootnoteRef.d.ts +4 -0
  38. package/build/components/FootnoteRef.js +33 -0
  39. package/build/components/Heading.d.ts +8 -0
  40. package/build/components/Heading.js +18 -0
  41. package/build/components/Icon.d.ts +5 -0
  42. package/build/components/Icon.js +10 -0
  43. package/build/components/Markdown.d.ts +13 -0
  44. package/build/components/Markdown.js +75 -0
  45. package/build/components/Mermaid.d.ts +4 -0
  46. package/build/components/Mermaid.js +10 -0
  47. package/build/components/MermaidRenderer.d.ts +4 -0
  48. package/build/components/MermaidRenderer.js +44 -0
  49. package/build/components/PackageTabs.d.ts +9 -0
  50. package/build/components/PackageTabs.js +26 -0
  51. package/build/components/SortableTable.d.ts +5 -0
  52. package/build/components/SortableTable.js +63 -0
  53. package/build/components/Tab.d.ts +5 -0
  54. package/build/components/Tab.js +6 -0
  55. package/build/components/Tabs.d.ts +5 -0
  56. package/build/components/Tabs.js +46 -0
  57. package/build/components/Toc.d.ts +4 -0
  58. package/build/components/Toc.js +14 -0
  59. package/build/components/Video.d.ts +4 -0
  60. package/build/components/Video.js +13 -0
  61. package/build/components/ZoomImage.d.ts +4 -0
  62. package/build/components/ZoomImage.js +26 -0
  63. package/build/elements/badge.d.ts +7 -0
  64. package/build/elements/badge.js +36 -0
  65. package/build/elements/button.d.ts +8 -0
  66. package/build/elements/button.js +37 -0
  67. package/build/elements/card.d.ts +11 -0
  68. package/build/elements/card.js +25 -0
  69. package/build/elements/collapsible.d.ts +5 -0
  70. package/build/elements/collapsible.js +13 -0
  71. package/build/elements/hover-card.d.ts +5 -0
  72. package/build/elements/hover-card.js +14 -0
  73. package/build/elements/separator.d.ts +3 -0
  74. package/build/elements/separator.js +8 -0
  75. package/build/elements/table.d.ts +9 -0
  76. package/build/elements/table.js +28 -0
  77. package/build/elements/tooltip.d.ts +6 -0
  78. package/build/elements/tooltip.js +17 -0
  79. package/build/helpers/ansi.d.ts +3 -0
  80. package/build/helpers/ansi.js +208 -0
  81. package/build/helpers/article-link.d.ts +7 -0
  82. package/build/helpers/article-link.js +8 -0
  83. package/build/helpers/code-icon.d.ts +2 -0
  84. package/build/helpers/code-icon.js +57 -0
  85. package/build/helpers/content-warnings.d.ts +8 -0
  86. package/build/helpers/content-warnings.js +47 -0
  87. package/build/helpers/dynamic-icon-resolver.d.ts +5 -0
  88. package/build/helpers/dynamic-icon-resolver.js +11 -0
  89. package/build/helpers/dynamic-icon.d.ts +5 -0
  90. package/build/helpers/dynamic-icon.js +14 -0
  91. package/build/helpers/frontmatter.d.ts +5 -0
  92. package/build/helpers/frontmatter.js +16 -0
  93. package/build/helpers/icon-names.d.ts +11 -0
  94. package/build/helpers/icon-names.js +35 -0
  95. package/build/helpers/message-format.d.ts +2 -0
  96. package/build/helpers/message-format.js +7 -0
  97. package/build/helpers/node-text.d.ts +9 -0
  98. package/build/helpers/node-text.js +9 -0
  99. package/build/helpers/site-messages.d.ts +86 -0
  100. package/build/helpers/site-messages.js +7 -0
  101. package/build/helpers/toc-context.d.ts +5 -0
  102. package/build/helpers/toc-context.js +8 -0
  103. package/build/helpers/toc-outline.d.ts +3 -0
  104. package/build/helpers/toc-outline.js +16 -0
  105. package/build/helpers/youtube-id.d.ts +2 -0
  106. package/build/helpers/youtube-id.js +25 -0
  107. package/build/hooks/icons.d.ts +13 -0
  108. package/build/hooks/icons.js +12 -0
  109. package/build/hooks/messages.d.ts +95 -0
  110. package/build/hooks/messages.js +17 -0
  111. package/build/models/message.d.ts +177 -0
  112. package/build/models/message.js +88 -0
  113. package/build/models/plugins.d.ts +10 -0
  114. package/build/models/plugins.js +6 -0
  115. package/build/models/theme.d.ts +76 -0
  116. package/build/models/theme.js +71 -0
  117. package/build/models/toc.d.ts +5 -0
  118. package/build/models/toc.js +2 -0
  119. package/build/plugins/twoslash.d.ts +13 -0
  120. package/build/plugins/twoslash.js +146 -0
  121. package/package.json +63 -3
  122. package/source/actions/markdown/compile.ts +82 -0
  123. package/source/actions/processor/create.ts +235 -0
  124. package/source/components/Abbr.tsx +13 -0
  125. package/source/components/AnsiCode.tsx +17 -0
  126. package/source/components/Audio.tsx +18 -0
  127. package/source/components/Badge.tsx +9 -0
  128. package/source/components/Button.tsx +33 -0
  129. package/source/components/Callout.tsx +68 -0
  130. package/source/components/Card.tsx +48 -0
  131. package/source/components/Cards.tsx +8 -0
  132. package/source/components/CodeBlock.tsx +144 -0
  133. package/source/components/CodeTabs.tsx +81 -0
  134. package/source/components/Column.tsx +4 -0
  135. package/source/components/Columns.tsx +10 -0
  136. package/source/components/DefinitionList.tsx +18 -0
  137. package/source/components/Details.tsx +30 -0
  138. package/source/components/Filetree.tsx +63 -0
  139. package/source/components/FootnoteRef.tsx +52 -0
  140. package/source/components/Heading.tsx +20 -0
  141. package/source/components/Icon.tsx +10 -0
  142. package/source/components/Markdown.tsx +89 -0
  143. package/source/components/Mermaid.tsx +20 -0
  144. package/source/components/MermaidRenderer.tsx +48 -0
  145. package/source/components/PackageTabs.tsx +72 -0
  146. package/source/components/SortableTable.tsx +81 -0
  147. package/source/components/Tab.tsx +4 -0
  148. package/source/components/Tabs.tsx +75 -0
  149. package/source/components/Toc.tsx +30 -0
  150. package/source/components/Video.tsx +28 -0
  151. package/source/components/ZoomImage.tsx +25 -0
  152. package/source/elements/badge.tsx +53 -0
  153. package/source/elements/button.tsx +61 -0
  154. package/source/elements/card.tsx +102 -0
  155. package/source/elements/collapsible.tsx +15 -0
  156. package/source/elements/hover-card.tsx +47 -0
  157. package/source/elements/separator.tsx +22 -0
  158. package/source/elements/table.tsx +103 -0
  159. package/source/elements/tooltip.tsx +60 -0
  160. package/source/helpers/ansi.ts +210 -0
  161. package/source/helpers/article-link.ts +11 -0
  162. package/source/helpers/code-icon.ts +59 -0
  163. package/source/helpers/content-warnings.ts +56 -0
  164. package/source/helpers/dynamic-icon-resolver.tsx +9 -0
  165. package/source/helpers/dynamic-icon.tsx +19 -0
  166. package/source/helpers/frontmatter.ts +16 -0
  167. package/source/helpers/icon-names.ts +37 -0
  168. package/source/helpers/message-format.ts +5 -0
  169. package/source/helpers/node-text.ts +14 -0
  170. package/source/helpers/site-messages.ts +8 -0
  171. package/source/helpers/toc-context.ts +10 -0
  172. package/source/helpers/toc-outline.ts +23 -0
  173. package/source/helpers/youtube-id.ts +23 -0
  174. package/source/hooks/icons.ts +18 -0
  175. package/source/hooks/messages.ts +28 -0
  176. package/source/models/message.ts +96 -0
  177. package/source/models/plugins.ts +11 -0
  178. package/source/models/theme.ts +78 -0
  179. package/source/models/toc.ts +5 -0
  180. package/source/plugins/twoslash.ts +163 -0
  181. package/source/standalone.css +7 -0
  182. package/source/styles/general.css +214 -0
  183. package/source/styles/markdown.css +231 -0
  184. package/source/styles/shape.css +14 -0
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Check, ChevronDown, Clipboard, WrapText } from "lucide-react";
3
+ import { isValidElement, useRef, useState } from "react";
4
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../elements/tooltip.js";
5
+ import { readCodeIcon } from "../helpers/code-icon.js";
6
+ import { useMessages } from "../hooks/messages.js";
7
+ export function CodeBlock(props) {
8
+ const [copied, setCopied] = useState(false);
9
+ const t = useMessages();
10
+ const [wrap, setWrap] = useState(false);
11
+ const [expanded, setExpanded] = useState(false);
12
+ const preRef = useRef(null);
13
+ const extra = props;
14
+ const meta = extra["data-meta"];
15
+ const title = meta?.match(/title="([^"]+)"/)?.[1];
16
+ const maxLines = meta?.match(/maxLines=(\d+)/)?.[1];
17
+ const icon = readCodeIcon(readLanguage(props.children));
18
+ const lineNumbers = meta?.match(/\blineNumbers(?:=(\d+))?(?!\S)/);
19
+ const style = props.style;
20
+ const collapsedHeight = maxLines ? `${Number(maxLines) * 1.5 + 1.75}rem` : undefined;
21
+ const handleCopy = () => {
22
+ const text = preRef.current?.textContent ?? "";
23
+ navigator.clipboard.writeText(text);
24
+ setCopied(true);
25
+ setTimeout(() => setCopied(false), 2000);
26
+ };
27
+ const handleWrapToggle = () => {
28
+ setWrap(prev => !prev);
29
+ };
30
+ return (_jsxs("figure", { className: "shiki not-prose my-4 relative rounded-card border shadow-sm overflow-hidden text-sm bg-sidebar dark:bg-sidebar", style: { ...style, backgroundColor: undefined }, children: [title ? (_jsxs("div", { className: "flex items-center gap-2 h-9.5 border-b px-4 text-muted-foreground", children: [icon && (_jsx("span", { className: "size-3.5 [&>svg]:size-full", dangerouslySetInnerHTML: { __html: icon } })), _jsx("span", { className: "flex-1 truncate text-xs font-medium", children: title }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { onClick: handleWrapToggle, "aria-label": wrap ? t("code.wrapOff") : t("code.wrapOn"), className: `-me-2 p-1.5 rounded-control hover:text-foreground transition-colors ${wrap ? "text-foreground" : ""}`, children: _jsx(WrapText, { className: "size-3.5" }) }), _jsx(TooltipContent, { children: wrap ? t("code.wrapOff") : t("code.wrapOn") })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { onClick: handleCopy, "aria-label": copied ? t("code.copied") : t("code.copy"), className: "-me-2 p-1.5 rounded-control hover:text-foreground transition-colors", children: copied ? (_jsx(Check, { className: "size-3.5" })) : (_jsx(Clipboard, { className: "size-3.5" })) }), _jsx(TooltipContent, { children: copied ? t("code.copied") : t("code.copy") })] })] })) : (_jsxs("div", { className: "empty:hidden absolute top-2 right-2 z-10 backdrop-blur-lg rounded-control text-muted-foreground", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { onClick: handleWrapToggle, "aria-label": wrap ? t("code.wrapOff") : t("code.wrapOn"), className: `p-1.5 rounded-control hover:text-foreground transition-colors ${wrap ? "text-foreground" : ""}`, children: _jsx(WrapText, { className: "size-3.5" }) }), _jsx(TooltipContent, { children: wrap ? t("code.wrapOff") : t("code.wrapOn") })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { onClick: handleCopy, "aria-label": copied ? t("code.copied") : t("code.copy"), className: "p-1.5 rounded-control hover:text-foreground transition-colors", children: copied ? (_jsx(Check, { className: "size-3.5" })) : (_jsx(Clipboard, { className: "size-3.5" })) }), _jsx(TooltipContent, { children: copied ? t("code.copied") : t("code.copy") })] })] })), _jsx("div", { className: "text-[0.8125rem] py-3.5 overflow-auto transition-[max-height] duration-300", style: {
31
+ maxHeight: collapsedHeight && !expanded ? collapsedHeight : "600px",
32
+ }, children: _jsx("pre", { ...props, ref: preRef, style: lineNumbers
33
+ ? { counterReset: `line ${Number(lineNumbers[1] ?? 1) - 1}` }
34
+ : undefined, className: [
35
+ props.className,
36
+ lineNumbers && "line-numbers",
37
+ wrap
38
+ ? "min-w-full whitespace-pre-wrap break-words [&>code]:flex [&>code]:flex-col"
39
+ : "min-w-full w-max [&>code]:flex [&>code]:flex-col",
40
+ ]
41
+ .filter(Boolean)
42
+ .join(" ") }) }), collapsedHeight && !expanded && (_jsxs("button", { type: "button", onClick: () => setExpanded(true), className: "flex items-center justify-center gap-1 w-full py-1.5 text-xs text-muted-foreground hover:text-foreground border-t cursor-pointer transition-colors", children: [_jsx(ChevronDown, { className: "size-3.5" }), t("code.expand")] }))] }));
43
+ }
44
+ // html.highlight names the language in a class of the `<code>` inside `<pre>`
45
+ function readLanguage(children) {
46
+ if (!isValidElement(children))
47
+ return undefined;
48
+ return children.props.className?.match(/\blanguage-(\S+)/)?.[1];
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29kZUJsb2NrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvQ29kZUJsb2NrLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFFeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXlCLENBQUE7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUVsRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWtDO0lBQzFELE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNDLE1BQU0sQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3ZDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQy9DLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBaUIsSUFBSSxDQUFDLENBQUE7SUFDM0MsTUFBTSxLQUFLLEdBQUcsS0FBZ0MsQ0FBQTtJQUM5QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsV0FBVyxDQUF1QixDQUFBO0lBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sUUFBUSxHQUFHLElBQUksRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25ELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDdkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxFQUFFLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO0lBQ2pFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUEyQyxDQUFBO0lBQy9ELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFFcEYsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQTtRQUM5QyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDZixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQzFDLENBQUMsQ0FBQTtJQUVELE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxFQUFFO1FBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDeEIsQ0FBQyxDQUFBO0lBRUQsT0FBTyxDQUNMLGtCQUNFLFNBQVMsRUFBQyxnSEFBZ0gsRUFDMUgsS0FBSyxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxhQUU5QyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ1AsZUFBSyxTQUFTLEVBQUMsbUVBQW1FLGFBQy9FLElBQUksSUFBSSxDQUNQLGVBQ0UsU0FBUyxFQUFDLDRCQUE0QixFQUN0Qyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FDekMsQ0FDSCxFQUNELGVBQU0sU0FBUyxFQUFDLHFDQUFxQyxZQUFFLEtBQUssR0FBUSxFQUNwRSxNQUFDLE9BQU8sZUFDTixLQUFDLGNBQWMsSUFDYixPQUFPLEVBQUUsZ0JBQWdCLGdCQUNiLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQ3ZELFNBQVMsRUFBRSx1RUFBdUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFlBRWpILEtBQUMsUUFBUSxJQUFDLFNBQVMsRUFBQyxVQUFVLEdBQUcsR0FDbEIsRUFDakIsS0FBQyxjQUFjLGNBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBa0IsSUFDdEUsRUFDVixNQUFDLE9BQU8sZUFDTixLQUFDLGNBQWMsSUFDYixPQUFPLEVBQUUsVUFBVSxnQkFDUCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUN0RCxTQUFTLEVBQUMscUVBQXFFLFlBRTlFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDUixLQUFDLEtBQUssSUFBQyxTQUFTLEVBQUMsVUFBVSxHQUFHLENBQy9CLENBQUMsQ0FBQyxDQUFDLENBQ0YsS0FBQyxTQUFTLElBQUMsU0FBUyxFQUFDLFVBQVUsR0FBRyxDQUNuQyxHQUNjLEVBQ2pCLEtBQUMsY0FBYyxjQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQWtCLElBQ3JFLElBQ04sQ0FDUCxDQUFDLENBQUMsQ0FBQyxDQUNGLGVBQUssU0FBUyxFQUFDLGlHQUFpRyxhQUM5RyxNQUFDLE9BQU8sZUFDTixLQUFDLGNBQWMsSUFDYixPQUFPLEVBQUUsZ0JBQWdCLGdCQUNiLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQ3ZELFNBQVMsRUFBRSxpRUFBaUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFlBRTNHLEtBQUMsUUFBUSxJQUFDLFNBQVMsRUFBQyxVQUFVLEdBQUcsR0FDbEIsRUFDakIsS0FBQyxjQUFjLGNBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBa0IsSUFDdEUsRUFDVixNQUFDLE9BQU8sZUFDTixLQUFDLGNBQWMsSUFDYixPQUFPLEVBQUUsVUFBVSxnQkFDUCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUN0RCxTQUFTLEVBQUMsK0RBQStELFlBRXhFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDUixLQUFDLEtBQUssSUFBQyxTQUFTLEVBQUMsVUFBVSxHQUFHLENBQy9CLENBQUMsQ0FBQyxDQUFDLENBQ0YsS0FBQyxTQUFTLElBQUMsU0FBUyxFQUFDLFVBQVUsR0FBRyxDQUNuQyxHQUNjLEVBQ2pCLEtBQUMsY0FBYyxjQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQWtCLElBQ3JFLElBQ04sQ0FDUCxFQUNELGNBQ0UsU0FBUyxFQUFDLDRFQUE0RSxFQUN0RixLQUFLLEVBQUU7b0JBQ0wsU0FBUyxFQUFFLGVBQWUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPO2lCQUNwRSxZQUVELGlCQUNNLEtBQUssRUFDVCxHQUFHLEVBQUUsTUFBTSxFQUNYLEtBQUssRUFDSCxXQUFXO3dCQUNULENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxRQUFRLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7d0JBQzdELENBQUMsQ0FBQyxTQUFTLEVBRWYsU0FBUyxFQUFFO3dCQUNULEtBQUssQ0FBQyxTQUFTO3dCQUNmLFdBQVcsSUFBSSxjQUFjO3dCQUM3QixJQUFJOzRCQUNGLENBQUMsQ0FBQyw0RUFBNEU7NEJBQzlFLENBQUMsQ0FBQyxrREFBa0Q7cUJBQ3ZEO3lCQUNFLE1BQU0sQ0FBQyxPQUFPLENBQUM7eUJBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUNaLEdBQ0UsRUFDTCxlQUFlLElBQUksQ0FBQyxRQUFRLElBQUksQ0FDL0Isa0JBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUNoQyxTQUFTLEVBQUMsb0pBQW9KLGFBRTlKLEtBQUMsV0FBVyxJQUFDLFNBQVMsRUFBQyxVQUFVLEdBQUcsRUFDbkMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUNWLENBQ1YsSUFDTSxDQUNWLENBQUE7QUFDSCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLFNBQVMsWUFBWSxDQUFDLFFBQW1CO0lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQXlCLFFBQVEsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFBO0lBQ3ZFLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hlY2ssIENoZXZyb25Eb3duLCBDbGlwYm9hcmQsIFdyYXBUZXh0IH0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiXG5pbXBvcnQgeyBpc1ZhbGlkRWxlbWVudCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBUb29sdGlwLCBUb29sdGlwQ29udGVudCwgVG9vbHRpcFRyaWdnZXIgfSBmcm9tIFwiLi4vZWxlbWVudHMvdG9vbHRpcC50c3hcIlxuaW1wb3J0IHsgcmVhZENvZGVJY29uIH0gZnJvbSBcIi4uL2hlbHBlcnMvY29kZS1pY29uLnRzXCJcbmltcG9ydCB7IHVzZU1lc3NhZ2VzIH0gZnJvbSBcIi4uL2hvb2tzL21lc3NhZ2VzLnRzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIENvZGVCbG9jayhwcm9wczogUmVhY3QuQ29tcG9uZW50UHJvcHM8XCJwcmVcIj4pIHtcbiAgY29uc3QgW2NvcGllZCwgc2V0Q29waWVkXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCB0ID0gdXNlTWVzc2FnZXMoKVxuICBjb25zdCBbd3JhcCwgc2V0V3JhcF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2V4cGFuZGVkLCBzZXRFeHBhbmRlZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgcHJlUmVmID0gdXNlUmVmPEhUTUxQcmVFbGVtZW50PihudWxsKVxuICBjb25zdCBleHRyYSA9IHByb3BzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGNvbnN0IG1ldGEgPSBleHRyYVtcImRhdGEtbWV0YVwiXSBhcyBzdHJpbmcgfCB1bmRlZmluZWRcbiAgY29uc3QgdGl0bGUgPSBtZXRhPy5tYXRjaCgvdGl0bGU9XCIoW15cIl0rKVwiLyk/LlsxXVxuICBjb25zdCBtYXhMaW5lcyA9IG1ldGE/Lm1hdGNoKC9tYXhMaW5lcz0oXFxkKykvKT8uWzFdXG4gIGNvbnN0IGljb24gPSByZWFkQ29kZUljb24ocmVhZExhbmd1YWdlKHByb3BzLmNoaWxkcmVuKSlcbiAgY29uc3QgbGluZU51bWJlcnMgPSBtZXRhPy5tYXRjaCgvXFxibGluZU51bWJlcnMoPzo9KFxcZCspKT8oPyFcXFMpLylcbiAgY29uc3Qgc3R5bGUgPSBwcm9wcy5zdHlsZSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkXG4gIGNvbnN0IGNvbGxhcHNlZEhlaWdodCA9IG1heExpbmVzID8gYCR7TnVtYmVyKG1heExpbmVzKSAqIDEuNSArIDEuNzV9cmVtYCA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGhhbmRsZUNvcHkgPSAoKSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IHByZVJlZi5jdXJyZW50Py50ZXh0Q29udGVudCA/PyBcIlwiXG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dClcbiAgICBzZXRDb3BpZWQodHJ1ZSlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHNldENvcGllZChmYWxzZSksIDIwMDApXG4gIH1cblxuICBjb25zdCBoYW5kbGVXcmFwVG9nZ2xlID0gKCkgPT4ge1xuICAgIHNldFdyYXAocHJldiA9PiAhcHJldilcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGZpZ3VyZVxuICAgICAgY2xhc3NOYW1lPVwic2hpa2kgbm90LXByb3NlIG15LTQgcmVsYXRpdmUgcm91bmRlZC1jYXJkIGJvcmRlciBzaGFkb3ctc20gb3ZlcmZsb3ctaGlkZGVuIHRleHQtc20gYmctc2lkZWJhciBkYXJrOmJnLXNpZGViYXJcIlxuICAgICAgc3R5bGU9e3sgLi4uc3R5bGUsIGJhY2tncm91bmRDb2xvcjogdW5kZWZpbmVkIH19XG4gICAgPlxuICAgICAge3RpdGxlID8gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIGgtOS41IGJvcmRlci1iIHB4LTQgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAge2ljb24gJiYgKFxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwic2l6ZS0zLjUgWyY+c3ZnXTpzaXplLWZ1bGxcIlxuICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17eyBfX2h0bWw6IGljb24gfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmbGV4LTEgdHJ1bmNhdGUgdGV4dC14cyBmb250LW1lZGl1bVwiPnt0aXRsZX08L3NwYW4+XG4gICAgICAgICAgPFRvb2x0aXA+XG4gICAgICAgICAgICA8VG9vbHRpcFRyaWdnZXJcbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlV3JhcFRvZ2dsZX1cbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD17d3JhcCA/IHQoXCJjb2RlLndyYXBPZmZcIikgOiB0KFwiY29kZS53cmFwT25cIil9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17YC1tZS0yIHAtMS41IHJvdW5kZWQtY29udHJvbCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgdHJhbnNpdGlvbi1jb2xvcnMgJHt3cmFwID8gXCJ0ZXh0LWZvcmVncm91bmRcIiA6IFwiXCJ9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFdyYXBUZXh0IGNsYXNzTmFtZT1cInNpemUtMy41XCIgLz5cbiAgICAgICAgICAgIDwvVG9vbHRpcFRyaWdnZXI+XG4gICAgICAgICAgICA8VG9vbHRpcENvbnRlbnQ+e3dyYXAgPyB0KFwiY29kZS53cmFwT2ZmXCIpIDogdChcImNvZGUud3JhcE9uXCIpfTwvVG9vbHRpcENvbnRlbnQ+XG4gICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgIDxUb29sdGlwPlxuICAgICAgICAgICAgPFRvb2x0aXBUcmlnZ2VyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNvcHl9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2NvcGllZCA/IHQoXCJjb2RlLmNvcGllZFwiKSA6IHQoXCJjb2RlLmNvcHlcIil9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIi1tZS0yIHAtMS41IHJvdW5kZWQtY29udHJvbCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7Y29waWVkID8gKFxuICAgICAgICAgICAgICAgIDxDaGVjayBjbGFzc05hbWU9XCJzaXplLTMuNVwiIC8+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPENsaXBib2FyZCBjbGFzc05hbWU9XCJzaXplLTMuNVwiIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L1Rvb2x0aXBUcmlnZ2VyPlxuICAgICAgICAgICAgPFRvb2x0aXBDb250ZW50Pntjb3BpZWQgPyB0KFwiY29kZS5jb3BpZWRcIikgOiB0KFwiY29kZS5jb3B5XCIpfTwvVG9vbHRpcENvbnRlbnQ+XG4gICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZW1wdHk6aGlkZGVuIGFic29sdXRlIHRvcC0yIHJpZ2h0LTIgei0xMCBiYWNrZHJvcC1ibHVyLWxnIHJvdW5kZWQtY29udHJvbCB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5cbiAgICAgICAgICA8VG9vbHRpcD5cbiAgICAgICAgICAgIDxUb29sdGlwVHJpZ2dlclxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVXcmFwVG9nZ2xlfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt3cmFwID8gdChcImNvZGUud3JhcE9mZlwiKSA6IHQoXCJjb2RlLndyYXBPblwiKX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcC0xLjUgcm91bmRlZC1jb250cm9sIGhvdmVyOnRleHQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycyAke3dyYXAgPyBcInRleHQtZm9yZWdyb3VuZFwiIDogXCJcIn1gfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8V3JhcFRleHQgY2xhc3NOYW1lPVwic2l6ZS0zLjVcIiAvPlxuICAgICAgICAgICAgPC9Ub29sdGlwVHJpZ2dlcj5cbiAgICAgICAgICAgIDxUb29sdGlwQ29udGVudD57d3JhcCA/IHQoXCJjb2RlLndyYXBPZmZcIikgOiB0KFwiY29kZS53cmFwT25cIil9PC9Ub29sdGlwQ29udGVudD5cbiAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgPFRvb2x0aXA+XG4gICAgICAgICAgICA8VG9vbHRpcFRyaWdnZXJcbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQ29weX1cbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Y29waWVkID8gdChcImNvZGUuY29waWVkXCIpIDogdChcImNvZGUuY29weVwiKX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicC0xLjUgcm91bmRlZC1jb250cm9sIGhvdmVyOnRleHQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtjb3BpZWQgPyAoXG4gICAgICAgICAgICAgICAgPENoZWNrIGNsYXNzTmFtZT1cInNpemUtMy41XCIgLz5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8Q2xpcGJvYXJkIGNsYXNzTmFtZT1cInNpemUtMy41XCIgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvVG9vbHRpcFRyaWdnZXI+XG4gICAgICAgICAgICA8VG9vbHRpcENvbnRlbnQ+e2NvcGllZCA/IHQoXCJjb2RlLmNvcGllZFwiKSA6IHQoXCJjb2RlLmNvcHlcIil9PC9Ub29sdGlwQ29udGVudD5cbiAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMC44MTI1cmVtXSBweS0zLjUgb3ZlcmZsb3ctYXV0byB0cmFuc2l0aW9uLVttYXgtaGVpZ2h0XSBkdXJhdGlvbi0zMDBcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIG1heEhlaWdodDogY29sbGFwc2VkSGVpZ2h0ICYmICFleHBhbmRlZCA/IGNvbGxhcHNlZEhlaWdodCA6IFwiNjAwcHhcIixcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPHByZVxuICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICByZWY9e3ByZVJlZn1cbiAgICAgICAgICBzdHlsZT17XG4gICAgICAgICAgICBsaW5lTnVtYmVyc1xuICAgICAgICAgICAgICA/IHsgY291bnRlclJlc2V0OiBgbGluZSAke051bWJlcihsaW5lTnVtYmVyc1sxXSA/PyAxKSAtIDF9YCB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGNsYXNzTmFtZT17W1xuICAgICAgICAgICAgcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgbGluZU51bWJlcnMgJiYgXCJsaW5lLW51bWJlcnNcIixcbiAgICAgICAgICAgIHdyYXBcbiAgICAgICAgICAgICAgPyBcIm1pbi13LWZ1bGwgd2hpdGVzcGFjZS1wcmUtd3JhcCBicmVhay13b3JkcyBbJj5jb2RlXTpmbGV4IFsmPmNvZGVdOmZsZXgtY29sXCJcbiAgICAgICAgICAgICAgOiBcIm1pbi13LWZ1bGwgdy1tYXggWyY+Y29kZV06ZmxleCBbJj5jb2RlXTpmbGV4LWNvbFwiLFxuICAgICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKFwiIFwiKX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICAge2NvbGxhcHNlZEhlaWdodCAmJiAhZXhwYW5kZWQgJiYgKFxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0RXhwYW5kZWQodHJ1ZSl9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTEgdy1mdWxsIHB5LTEuNSB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgYm9yZGVyLXQgY3Vyc29yLXBvaW50ZXIgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICA+XG4gICAgICAgICAgPENoZXZyb25Eb3duIGNsYXNzTmFtZT1cInNpemUtMy41XCIgLz5cbiAgICAgICAgICB7dChcImNvZGUuZXhwYW5kXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICl9XG4gICAgPC9maWd1cmU+XG4gIClcbn1cblxuLy8gaHRtbC5oaWdobGlnaHQgbmFtZXMgdGhlIGxhbmd1YWdlIGluIGEgY2xhc3Mgb2YgdGhlIGA8Y29kZT5gIGluc2lkZSBgPHByZT5gXG5mdW5jdGlvbiByZWFkTGFuZ3VhZ2UoY2hpbGRyZW46IFJlYWN0Tm9kZSkge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50PHsgY2xhc3NOYW1lPzogc3RyaW5nIH0+KGNoaWxkcmVuKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lPy5tYXRjaCgvXFxibGFuZ3VhZ2UtKFxcUyspLyk/LlsxXVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ /** Tabbed code block component for grouping multiple code blocks with optional sync */
2
+ export declare function CodeTabs(props: {
3
+ tabs: string;
4
+ sync?: string;
5
+ children: React.ReactNode;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Children, useEffect, useState } from "react";
3
+ /** Tabbed code block component for grouping multiple code blocks with optional sync */
4
+ export function CodeTabs(props) {
5
+ const names = JSON.parse(props.tabs);
6
+ const children = Children.toArray(props.children);
7
+ const getInitialIndex = () => {
8
+ if (!props.sync)
9
+ return 0;
10
+ const saved = typeof window !== "undefined"
11
+ ? localStorage.getItem("livemark-tab-" + props.sync)
12
+ : null;
13
+ if (!saved)
14
+ return 0;
15
+ const idx = names.indexOf(saved);
16
+ return idx >= 0 ? idx : 0;
17
+ };
18
+ const [active, setActive] = useState(getInitialIndex);
19
+ const handleSelect = (i) => {
20
+ setActive(i);
21
+ if (props.sync) {
22
+ localStorage.setItem("livemark-tab-" + props.sync, names[i]);
23
+ window.dispatchEvent(new CustomEvent("livemark-tab-sync", {
24
+ detail: { sync: props.sync, title: names[i] },
25
+ }));
26
+ }
27
+ };
28
+ useEffect(() => {
29
+ if (!props.sync)
30
+ return;
31
+ const handler = (e) => {
32
+ const { sync, title } = e.detail;
33
+ if (sync !== props.sync)
34
+ return;
35
+ const idx = names.indexOf(title);
36
+ if (idx >= 0)
37
+ setActive(idx);
38
+ };
39
+ window.addEventListener("livemark-tab-sync", handler);
40
+ return () => window.removeEventListener("livemark-tab-sync", handler);
41
+ }, [props.sync, names]);
42
+ return (_jsxs("div", { className: "not-prose my-4 rounded-card border shadow-sm overflow-hidden text-sm bg-sidebar dark:bg-sidebar", children: [_jsx("div", { className: "flex border-b", children: names.map((name, i) => (_jsx("button", { type: "button", onClick: () => handleSelect(i), className: `px-4 py-2 text-xs font-medium transition-colors cursor-pointer ${i === active
43
+ ? "text-foreground border-b-2 border-primary -mb-px"
44
+ : "text-muted-foreground hover:text-foreground"}`, children: name }, name))) }), children.map((child, i) => (_jsx("div", { className: i === active
45
+ ? "[&>figure]:my-0 [&>figure]:rounded-none [&>figure]:border-0 [&>figure]:shadow-none"
46
+ : "hidden", children: child }, names[i])))] }));
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29kZVRhYnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9Db2RlVGFicy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUVyRCx1RkFBdUY7QUFDdkYsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUl4QjtJQUNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBYSxDQUFBO0lBQ2hELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRWpELE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRTtRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7WUFBRSxPQUFPLENBQUMsQ0FBQTtRQUN6QixNQUFNLEtBQUssR0FDVCxPQUFPLE1BQU0sS0FBSyxXQUFXO1lBQzNCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDVixJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMzQixDQUFDLENBQUE7SUFFRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUVyRCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFO1FBQ2pDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNaLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQTtZQUM3RCxNQUFNLENBQUMsYUFBYSxDQUNsQixJQUFJLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRTtnQkFDbkMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTthQUM5QyxDQUFDLENBQ0gsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDLENBQUE7SUFFRCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQUUsT0FBTTtRQUN2QixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQVEsRUFBRSxFQUFFO1lBQzNCLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUksQ0FBa0QsQ0FBQyxNQUFNLENBQUE7WUFDbEYsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUk7Z0JBQUUsT0FBTTtZQUMvQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2hDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzlCLENBQUMsQ0FBQTtRQUNELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNyRCxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN2RSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFFdkIsT0FBTyxDQUNMLGVBQUssU0FBUyxFQUFDLGlHQUFpRyxhQUM5RyxjQUFLLFNBQVMsRUFBQyxlQUFlLFlBQzNCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUN0QixpQkFFRSxJQUFJLEVBQUMsUUFBUSxFQUNiLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQzlCLFNBQVMsRUFBRSxrRUFDVCxDQUFDLEtBQUssTUFBTTt3QkFDVixDQUFDLENBQUMsa0RBQWtEO3dCQUNwRCxDQUFDLENBQUMsNkNBQ04sRUFBRSxZQUVELElBQUksSUFUQSxJQUFJLENBVUYsQ0FDVixDQUFDLEdBQ0UsRUFDTCxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDMUIsY0FFRSxTQUFTLEVBQ1AsQ0FBQyxLQUFLLE1BQU07b0JBQ1YsQ0FBQyxDQUFDLG9GQUFvRjtvQkFDdEYsQ0FBQyxDQUFDLFFBQVEsWUFHYixLQUFLLElBUEQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQVFULENBQ1AsQ0FBQyxJQUNFLENBQ1AsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGlsZHJlbiwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiXG5cbi8qKiBUYWJiZWQgY29kZSBibG9jayBjb21wb25lbnQgZm9yIGdyb3VwaW5nIG11bHRpcGxlIGNvZGUgYmxvY2tzIHdpdGggb3B0aW9uYWwgc3luYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvZGVUYWJzKHByb3BzOiB7XG4gIHRhYnM6IHN0cmluZ1xuICBzeW5jPzogc3RyaW5nXG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbn0pIHtcbiAgY29uc3QgbmFtZXMgPSBKU09OLnBhcnNlKHByb3BzLnRhYnMpIGFzIHN0cmluZ1tdXG4gIGNvbnN0IGNoaWxkcmVuID0gQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbilcblxuICBjb25zdCBnZXRJbml0aWFsSW5kZXggPSAoKSA9PiB7XG4gICAgaWYgKCFwcm9wcy5zeW5jKSByZXR1cm4gMFxuICAgIGNvbnN0IHNhdmVkID1cbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImxpdmVtYXJrLXRhYi1cIiArIHByb3BzLnN5bmMpXG4gICAgICAgIDogbnVsbFxuICAgIGlmICghc2F2ZWQpIHJldHVybiAwXG4gICAgY29uc3QgaWR4ID0gbmFtZXMuaW5kZXhPZihzYXZlZClcbiAgICByZXR1cm4gaWR4ID49IDAgPyBpZHggOiAwXG4gIH1cblxuICBjb25zdCBbYWN0aXZlLCBzZXRBY3RpdmVdID0gdXNlU3RhdGUoZ2V0SW5pdGlhbEluZGV4KVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IChpOiBudW1iZXIpID0+IHtcbiAgICBzZXRBY3RpdmUoaSlcbiAgICBpZiAocHJvcHMuc3luYykge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJsaXZlbWFyay10YWItXCIgKyBwcm9wcy5zeW5jLCBuYW1lc1tpXSEpXG4gICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KFwibGl2ZW1hcmstdGFiLXN5bmNcIiwge1xuICAgICAgICAgIGRldGFpbDogeyBzeW5jOiBwcm9wcy5zeW5jLCB0aXRsZTogbmFtZXNbaV0gfSxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXByb3BzLnN5bmMpIHJldHVyblxuICAgIGNvbnN0IGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgc3luYywgdGl0bGUgfSA9IChlIGFzIEN1c3RvbUV2ZW50PHsgc3luYzogc3RyaW5nOyB0aXRsZTogc3RyaW5nIH0+KS5kZXRhaWxcbiAgICAgIGlmIChzeW5jICE9PSBwcm9wcy5zeW5jKSByZXR1cm5cbiAgICAgIGNvbnN0IGlkeCA9IG5hbWVzLmluZGV4T2YodGl0bGUpXG4gICAgICBpZiAoaWR4ID49IDApIHNldEFjdGl2ZShpZHgpXG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibGl2ZW1hcmstdGFiLXN5bmNcIiwgaGFuZGxlcilcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsaXZlbWFyay10YWItc3luY1wiLCBoYW5kbGVyKVxuICB9LCBbcHJvcHMuc3luYywgbmFtZXNdKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJub3QtcHJvc2UgbXktNCByb3VuZGVkLWNhcmQgYm9yZGVyIHNoYWRvdy1zbSBvdmVyZmxvdy1oaWRkZW4gdGV4dC1zbSBiZy1zaWRlYmFyIGRhcms6Ymctc2lkZWJhclwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGJvcmRlci1iXCI+XG4gICAgICAgIHtuYW1lcy5tYXAoKG5hbWUsIGkpID0+IChcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBrZXk9e25hbWV9XG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVNlbGVjdChpKX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTQgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRyYW5zaXRpb24tY29sb3JzIGN1cnNvci1wb2ludGVyICR7XG4gICAgICAgICAgICAgIGkgPT09IGFjdGl2ZVxuICAgICAgICAgICAgICAgID8gXCJ0ZXh0LWZvcmVncm91bmQgYm9yZGVyLWItMiBib3JkZXItcHJpbWFyeSAtbWItcHhcIlxuICAgICAgICAgICAgICAgIDogXCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kXCJcbiAgICAgICAgICAgIH1gfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtuYW1lfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgICAge2NoaWxkcmVuLm1hcCgoY2hpbGQsIGkpID0+IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGtleT17bmFtZXNbaV19XG4gICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgIGkgPT09IGFjdGl2ZVxuICAgICAgICAgICAgICA/IFwiWyY+ZmlndXJlXTpteS0wIFsmPmZpZ3VyZV06cm91bmRlZC1ub25lIFsmPmZpZ3VyZV06Ym9yZGVyLTAgWyY+ZmlndXJlXTpzaGFkb3ctbm9uZVwiXG4gICAgICAgICAgICAgIDogXCJoaWRkZW5cIlxuICAgICAgICAgIH1cbiAgICAgICAgPlxuICAgICAgICAgIHtjaGlsZH1cbiAgICAgICAgPC9kaXY+XG4gICAgICApKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIl19
@@ -0,0 +1,4 @@
1
+ /** Single column within a Columns grid */
2
+ export declare function Column(props: {
3
+ children: React.ReactNode;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** Single column within a Columns grid */
3
+ export function Column(props) {
4
+ return _jsx("div", { className: "max-w-none", children: props.children });
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sdW1uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvQ29sdW1uLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMENBQTBDO0FBQzFDLE1BQU0sVUFBVSxNQUFNLENBQUMsS0FBb0M7SUFDekQsT0FBTyxjQUFLLFNBQVMsRUFBQyxZQUFZLFlBQUUsS0FBSyxDQUFDLFFBQVEsR0FBTyxDQUFBO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU2luZ2xlIGNvbHVtbiB3aXRoaW4gYSBDb2x1bW5zIGdyaWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4ocHJvcHM6IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LW5vbmVcIj57cHJvcHMuY2hpbGRyZW59PC9kaXY+XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /** Grid layout for arranging content side by side */
2
+ export declare function Columns(props: {
3
+ cols?: string;
4
+ children: React.ReactNode;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** Grid layout for arranging content side by side */
3
+ export function Columns(props) {
4
+ const cols = props.cols ? parseInt(props.cols, 10) : undefined;
5
+ const style = cols ? { gridTemplateColumns: `repeat(${cols}, 1fr)` } : undefined;
6
+ return (_jsx("div", { className: "grid gap-6 my-4 sm:grid-cols-2", style: style, children: props.children }));
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sdW1ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL0NvbHVtbnMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxxREFBcUQ7QUFDckQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFtRDtJQUN6RSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNoRixPQUFPLENBQ0wsY0FBSyxTQUFTLEVBQUMsZ0NBQWdDLEVBQUMsS0FBSyxFQUFFLEtBQUssWUFDekQsS0FBSyxDQUFDLFFBQVEsR0FDWCxDQUNQLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEdyaWQgbGF5b3V0IGZvciBhcnJhbmdpbmcgY29udGVudCBzaWRlIGJ5IHNpZGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW5zKHByb3BzOiB7IGNvbHM/OiBzdHJpbmc7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfSkge1xuICBjb25zdCBjb2xzID0gcHJvcHMuY29scyA/IHBhcnNlSW50KHByb3BzLmNvbHMsIDEwKSA6IHVuZGVmaW5lZFxuICBjb25zdCBzdHlsZSA9IGNvbHMgPyB7IGdyaWRUZW1wbGF0ZUNvbHVtbnM6IGByZXBlYXQoJHtjb2xzfSwgMWZyKWAgfSA6IHVuZGVmaW5lZFxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtNiBteS00IHNtOmdyaWQtY29scy0yXCIgc3R5bGU9e3N0eWxlfT5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIl19
@@ -0,0 +1,7 @@
1
+ import type { ComponentProps } from "react";
2
+ /** Styled wrapper for definition lists produced by remark-definition-list */
3
+ export declare function DefinitionList(props: ComponentProps<"dl">): import("react").JSX.Element;
4
+ /** Styled definition term rendered as bold text */
5
+ export declare function DefinitionTerm(props: ComponentProps<"dt">): import("react").JSX.Element;
6
+ /** Styled definition detail with a left border accent */
7
+ export declare function DefinitionDetail(props: ComponentProps<"dd">): import("react").JSX.Element;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** Styled wrapper for definition lists produced by remark-definition-list */
3
+ export function DefinitionList(props) {
4
+ return _jsx("dl", { ...props, className: "not-prose space-y-4" });
5
+ }
6
+ /** Styled definition term rendered as bold text */
7
+ export function DefinitionTerm(props) {
8
+ return _jsx("dt", { ...props, className: "text-foreground font-semibold" });
9
+ }
10
+ /** Styled definition detail with a left border accent */
11
+ export function DefinitionDetail(props) {
12
+ return (_jsx("dd", { ...props, className: "ml-0 pl-4 border-l-2 border-border text-muted-foreground" }));
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmaW5pdGlvbkxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9EZWZpbml0aW9uTGlzdC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQTJCO0lBQ3hELE9BQU8sZ0JBQVEsS0FBSyxFQUFFLFNBQVMsRUFBQyxxQkFBcUIsR0FBRyxDQUFBO0FBQzFELENBQUM7QUFFRCxtREFBbUQ7QUFDbkQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUEyQjtJQUN4RCxPQUFPLGdCQUFRLEtBQUssRUFBRSxTQUFTLEVBQUMsK0JBQStCLEdBQUcsQ0FBQTtBQUNwRSxDQUFDO0FBRUQseURBQXlEO0FBQ3pELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUEyQjtJQUMxRCxPQUFPLENBQ0wsZ0JBQVEsS0FBSyxFQUFFLFNBQVMsRUFBQywwREFBMEQsR0FBRyxDQUN2RixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29tcG9uZW50UHJvcHMgfSBmcm9tIFwicmVhY3RcIlxuXG4vKiogU3R5bGVkIHdyYXBwZXIgZm9yIGRlZmluaXRpb24gbGlzdHMgcHJvZHVjZWQgYnkgcmVtYXJrLWRlZmluaXRpb24tbGlzdCAqL1xuZXhwb3J0IGZ1bmN0aW9uIERlZmluaXRpb25MaXN0KHByb3BzOiBDb21wb25lbnRQcm9wczxcImRsXCI+KSB7XG4gIHJldHVybiA8ZGwgey4uLnByb3BzfSBjbGFzc05hbWU9XCJub3QtcHJvc2Ugc3BhY2UteS00XCIgLz5cbn1cblxuLyoqIFN0eWxlZCBkZWZpbml0aW9uIHRlcm0gcmVuZGVyZWQgYXMgYm9sZCB0ZXh0ICovXG5leHBvcnQgZnVuY3Rpb24gRGVmaW5pdGlvblRlcm0ocHJvcHM6IENvbXBvbmVudFByb3BzPFwiZHRcIj4pIHtcbiAgcmV0dXJuIDxkdCB7Li4ucHJvcHN9IGNsYXNzTmFtZT1cInRleHQtZm9yZWdyb3VuZCBmb250LXNlbWlib2xkXCIgLz5cbn1cblxuLyoqIFN0eWxlZCBkZWZpbml0aW9uIGRldGFpbCB3aXRoIGEgbGVmdCBib3JkZXIgYWNjZW50ICovXG5leHBvcnQgZnVuY3Rpb24gRGVmaW5pdGlvbkRldGFpbChwcm9wczogQ29tcG9uZW50UHJvcHM8XCJkZFwiPikge1xuICByZXR1cm4gKFxuICAgIDxkZCB7Li4ucHJvcHN9IGNsYXNzTmFtZT1cIm1sLTAgcGwtNCBib3JkZXItbC0yIGJvcmRlci1ib3JkZXIgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCIgLz5cbiAgKVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ /** Collapsible content section with a summary label */
2
+ export declare function Details(props: {
3
+ summary: string;
4
+ children: React.ReactNode;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { ChevronRight } from "lucide-react";
4
+ import { Collapsible, CollapsibleTrigger, CollapsibleContent, } from "../elements/collapsible.js";
5
+ /** Collapsible content section with a summary label */
6
+ export function Details(props) {
7
+ const [open, setOpen] = useState(false);
8
+ return (_jsxs(Collapsible, { open: open, onOpenChange: setOpen, className: "not-prose my-4 rounded-card border border-border bg-card px-4 py-3", children: [_jsxs(CollapsibleTrigger, { className: "flex w-full cursor-pointer items-center gap-2 text-sm font-semibold select-none", children: [_jsx(ChevronRight, { className: `size-4 shrink-0 transition-transform ${open ? "rotate-90" : ""}` }), props.summary] }), _jsx(CollapsibleContent, { className: "mt-3 text-sm [&>p]:my-1 [&>p:first-child]:mt-0 [&>p:last-child]:mb-0", children: props.children })] }));
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGV0YWlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL0RldGFpbHMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxFQUNMLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsa0JBQWtCLEdBQ25CLE1BQU0sNEJBQTZCLENBQUE7QUFFcEMsdURBQXVEO0FBQ3ZELE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBcUQ7SUFDM0UsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFdkMsT0FBTyxDQUNMLE1BQUMsV0FBVyxJQUNWLElBQUksRUFBRSxJQUFJLEVBQ1YsWUFBWSxFQUFFLE9BQU8sRUFDckIsU0FBUyxFQUFDLG9FQUFvRSxhQUU5RSxNQUFDLGtCQUFrQixJQUFDLFNBQVMsRUFBQyxpRkFBaUYsYUFDN0csS0FBQyxZQUFZLElBQ1gsU0FBUyxFQUFFLHdDQUF3QyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQzVFLEVBQ0QsS0FBSyxDQUFDLE9BQU8sSUFDSyxFQUNyQixLQUFDLGtCQUFrQixJQUFDLFNBQVMsRUFBQyxzRUFBc0UsWUFDakcsS0FBSyxDQUFDLFFBQVEsR0FDSSxJQUNULENBQ2YsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBDaGV2cm9uUmlnaHQgfSBmcm9tIFwibHVjaWRlLXJlYWN0XCJcbmltcG9ydCB7XG4gIENvbGxhcHNpYmxlLFxuICBDb2xsYXBzaWJsZVRyaWdnZXIsXG4gIENvbGxhcHNpYmxlQ29udGVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnRzL2NvbGxhcHNpYmxlLnRzeFwiXG5cbi8qKiBDb2xsYXBzaWJsZSBjb250ZW50IHNlY3Rpb24gd2l0aCBhIHN1bW1hcnkgbGFiZWwgKi9cbmV4cG9ydCBmdW5jdGlvbiBEZXRhaWxzKHByb3BzOiB7IHN1bW1hcnk6IHN0cmluZzsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gIHJldHVybiAoXG4gICAgPENvbGxhcHNpYmxlXG4gICAgICBvcGVuPXtvcGVufVxuICAgICAgb25PcGVuQ2hhbmdlPXtzZXRPcGVufVxuICAgICAgY2xhc3NOYW1lPVwibm90LXByb3NlIG15LTQgcm91bmRlZC1jYXJkIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLWNhcmQgcHgtNCBweS0zXCJcbiAgICA+XG4gICAgICA8Q29sbGFwc2libGVUcmlnZ2VyIGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgc2VsZWN0LW5vbmVcIj5cbiAgICAgICAgPENoZXZyb25SaWdodFxuICAgICAgICAgIGNsYXNzTmFtZT17YHNpemUtNCBzaHJpbmstMCB0cmFuc2l0aW9uLXRyYW5zZm9ybSAke29wZW4gPyBcInJvdGF0ZS05MFwiIDogXCJcIn1gfVxuICAgICAgICAvPlxuICAgICAgICB7cHJvcHMuc3VtbWFyeX1cbiAgICAgIDwvQ29sbGFwc2libGVUcmlnZ2VyPlxuICAgICAgPENvbGxhcHNpYmxlQ29udGVudCBjbGFzc05hbWU9XCJtdC0zIHRleHQtc20gWyY+cF06bXktMSBbJj5wOmZpcnN0LWNoaWxkXTptdC0wIFsmPnA6bGFzdC1jaGlsZF06bWItMFwiPlxuICAgICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgICA8L0NvbGxhcHNpYmxlQ29udGVudD5cbiAgICA8L0NvbGxhcHNpYmxlPlxuICApXG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ /** Renders a file/directory tree from a JSON-serialized tree structure */
2
+ export declare function Filetree(props: {
3
+ tree: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { File, Folder } from "lucide-react";
3
+ /** Renders a file/directory tree from a JSON-serialized tree structure */
4
+ export function Filetree(props) {
5
+ const items = JSON.parse(props.tree);
6
+ return (_jsx("div", { className: "not-prose my-4 rounded-card border border-border bg-card p-4 font-mono text-sm", children: _jsx(TreeItems, { items: items, depth: 0 }) }));
7
+ }
8
+ function TreeItems(props) {
9
+ return (_jsx("ul", { className: props.depth > 0 ? "ml-4 border-l border-border pl-2" : "", children: props.items.map((item, index) => (_jsx(TreeNode, { item: item, depth: props.depth }, `${item.name}-${index}`))) }));
10
+ }
11
+ function TreeNode(props) {
12
+ const { item, depth } = props;
13
+ const isDir = item.type === "directory";
14
+ return (_jsxs("li", { className: "py-0.5", children: [_jsxs("span", { className: "inline-flex items-center gap-2", children: [isDir && _jsx(Folder, { className: "size-4 shrink-0 text-primary" }), item.type === "file" && (_jsx(File, { className: "size-4 shrink-0 text-muted-foreground" })), _jsx("span", { className: [
15
+ isDir && "font-semibold",
16
+ item.type === "placeholder" && "text-muted-foreground",
17
+ item.highlighted && "rounded bg-primary/10 px-1 text-primary",
18
+ ]
19
+ .filter(Boolean)
20
+ .join(" "), children: item.name }), item.comment && (_jsx("span", { className: "font-sans text-xs text-muted-foreground", children: item.comment }))] }), item.children && item.children.length > 0 && (_jsx(TreeItems, { items: item.children, depth: depth + 1 }))] }));
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9GaWxldHJlZS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBVTNDLDBFQUEwRTtBQUMxRSxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQXVCO0lBQzlDLE1BQU0sS0FBSyxHQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRWhELE9BQU8sQ0FDTCxjQUFLLFNBQVMsRUFBQyxnRkFBZ0YsWUFDN0YsS0FBQyxTQUFTLElBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFJLEdBQ2pDLENBQ1AsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUEyQztJQUM1RCxPQUFPLENBQ0wsYUFBSSxTQUFTLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQ3JFLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FDaEMsS0FBQyxRQUFRLElBQStCLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQXZELEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBb0MsQ0FDM0UsQ0FBQyxHQUNDLENBQ04sQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUF3QztJQUN4RCxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQTtJQUV2QyxPQUFPLENBQ0wsY0FBSSxTQUFTLEVBQUMsUUFBUSxhQUNwQixnQkFBTSxTQUFTLEVBQUMsZ0NBQWdDLGFBQzdDLEtBQUssSUFBSSxLQUFDLE1BQU0sSUFBQyxTQUFTLEVBQUMsOEJBQThCLEdBQUcsRUFDNUQsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksQ0FDdkIsS0FBQyxJQUFJLElBQUMsU0FBUyxFQUFDLHVDQUF1QyxHQUFHLENBQzNELEVBQ0QsZUFDRSxTQUFTLEVBQUU7NEJBQ1QsS0FBSyxJQUFJLGVBQWU7NEJBQ3hCLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxJQUFJLHVCQUF1Qjs0QkFDdEQsSUFBSSxDQUFDLFdBQVcsSUFBSSx5Q0FBeUM7eUJBQzlEOzZCQUNFLE1BQU0sQ0FBQyxPQUFPLENBQUM7NkJBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUVYLElBQUksQ0FBQyxJQUFJLEdBQ0wsRUFDTixJQUFJLENBQUMsT0FBTyxJQUFJLENBQ2YsZUFBTSxTQUFTLEVBQUMseUNBQXlDLFlBQUUsSUFBSSxDQUFDLE9BQU8sR0FBUSxDQUNoRixJQUNJLEVBQ04sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FDNUMsS0FBQyxTQUFTLElBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEdBQUksQ0FDdEQsSUFDRSxDQUNOLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmlsZSwgRm9sZGVyIH0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiXG5cbmludGVyZmFjZSBUcmVlSXRlbSB7XG4gIG5hbWU6IHN0cmluZ1xuICB0eXBlOiBcImRpcmVjdG9yeVwiIHwgXCJmaWxlXCIgfCBcInBsYWNlaG9sZGVyXCJcbiAgY29tbWVudD86IHN0cmluZ1xuICBoaWdobGlnaHRlZD86IGJvb2xlYW5cbiAgY2hpbGRyZW4/OiBUcmVlSXRlbVtdXG59XG5cbi8qKiBSZW5kZXJzIGEgZmlsZS9kaXJlY3RvcnkgdHJlZSBmcm9tIGEgSlNPTi1zZXJpYWxpemVkIHRyZWUgc3RydWN0dXJlICovXG5leHBvcnQgZnVuY3Rpb24gRmlsZXRyZWUocHJvcHM6IHsgdHJlZTogc3RyaW5nIH0pIHtcbiAgY29uc3QgaXRlbXM6IFRyZWVJdGVtW10gPSBKU09OLnBhcnNlKHByb3BzLnRyZWUpXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm5vdC1wcm9zZSBteS00IHJvdW5kZWQtY2FyZCBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1jYXJkIHAtNCBmb250LW1vbm8gdGV4dC1zbVwiPlxuICAgICAgPFRyZWVJdGVtcyBpdGVtcz17aXRlbXN9IGRlcHRoPXswfSAvPlxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIFRyZWVJdGVtcyhwcm9wczogeyBpdGVtczogVHJlZUl0ZW1bXTsgZGVwdGg6IG51bWJlciB9KSB7XG4gIHJldHVybiAoXG4gICAgPHVsIGNsYXNzTmFtZT17cHJvcHMuZGVwdGggPiAwID8gXCJtbC00IGJvcmRlci1sIGJvcmRlci1ib3JkZXIgcGwtMlwiIDogXCJcIn0+XG4gICAgICB7cHJvcHMuaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICA8VHJlZU5vZGUga2V5PXtgJHtpdGVtLm5hbWV9LSR7aW5kZXh9YH0gaXRlbT17aXRlbX0gZGVwdGg9e3Byb3BzLmRlcHRofSAvPlxuICAgICAgKSl9XG4gICAgPC91bD5cbiAgKVxufVxuXG5mdW5jdGlvbiBUcmVlTm9kZShwcm9wczogeyBpdGVtOiBUcmVlSXRlbTsgZGVwdGg6IG51bWJlciB9KSB7XG4gIGNvbnN0IHsgaXRlbSwgZGVwdGggfSA9IHByb3BzXG4gIGNvbnN0IGlzRGlyID0gaXRlbS50eXBlID09PSBcImRpcmVjdG9yeVwiXG5cbiAgcmV0dXJuIChcbiAgICA8bGkgY2xhc3NOYW1lPVwicHktMC41XCI+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAge2lzRGlyICYmIDxGb2xkZXIgY2xhc3NOYW1lPVwic2l6ZS00IHNocmluay0wIHRleHQtcHJpbWFyeVwiIC8+fVxuICAgICAgICB7aXRlbS50eXBlID09PSBcImZpbGVcIiAmJiAoXG4gICAgICAgICAgPEZpbGUgY2xhc3NOYW1lPVwic2l6ZS00IHNocmluay0wIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiIC8+XG4gICAgICAgICl9XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3NOYW1lPXtbXG4gICAgICAgICAgICBpc0RpciAmJiBcImZvbnQtc2VtaWJvbGRcIixcbiAgICAgICAgICAgIGl0ZW0udHlwZSA9PT0gXCJwbGFjZWhvbGRlclwiICYmIFwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCIsXG4gICAgICAgICAgICBpdGVtLmhpZ2hsaWdodGVkICYmIFwicm91bmRlZCBiZy1wcmltYXJ5LzEwIHB4LTEgdGV4dC1wcmltYXJ5XCIsXG4gICAgICAgICAgXVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgLmpvaW4oXCIgXCIpfVxuICAgICAgICA+XG4gICAgICAgICAge2l0ZW0ubmFtZX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICB7aXRlbS5jb21tZW50ICYmIChcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LXNhbnMgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57aXRlbS5jb21tZW50fTwvc3Bhbj5cbiAgICAgICAgKX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHtpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgIDxUcmVlSXRlbXMgaXRlbXM9e2l0ZW0uY2hpbGRyZW59IGRlcHRoPXtkZXB0aCArIDF9IC8+XG4gICAgICApfVxuICAgIDwvbGk+XG4gIClcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import { type ComponentProps } from "react";
2
+ /** Wraps footnote reference links in a HoverCard that previews footnote content inline,
3
+ * and points relative links to Markdown files at their articles */
4
+ export declare function FootnoteRef(props: ComponentProps<"a">): import("react").JSX.Element;
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { HoverCard, HoverCardContent, HoverCardTrigger } from "../elements/hover-card.js";
4
+ import { useArticleHref } from "../helpers/article-link.js";
5
+ import { useMessages } from "../hooks/messages.js";
6
+ const FOOTNOTE_PREFIX = "#user-content-fn-";
7
+ /** Wraps footnote reference links in a HoverCard that previews footnote content inline,
8
+ * and points relative links to Markdown files at their articles */
9
+ export function FootnoteRef(props) {
10
+ const href = useArticleHref(props.href) ?? "";
11
+ if (!href.startsWith(FOOTNOTE_PREFIX)) {
12
+ return _jsx("a", { ...props, href: props.href && href });
13
+ }
14
+ return _jsx(FootnoteHoverCard, { ...props, href: href });
15
+ }
16
+ function FootnoteHoverCard(props) {
17
+ const [footnoteHtml, setFootnoteHtml] = useState("");
18
+ const t = useMessages();
19
+ useEffect(() => {
20
+ const targetId = props.href.slice(1);
21
+ const el = document.getElementById(targetId);
22
+ if (!el)
23
+ return;
24
+ const wrapper = document.createElement("div");
25
+ wrapper.innerHTML = el.innerHTML;
26
+ for (const backref of wrapper.querySelectorAll("[data-footnote-backref]")) {
27
+ backref.remove();
28
+ }
29
+ setFootnoteHtml(wrapper.innerHTML);
30
+ }, [props.href]);
31
+ return (_jsxs(HoverCard, { children: [_jsx(HoverCardTrigger, { render: _jsx("a", { ...props }) }), _jsx(HoverCardContent, { className: "prose dark:prose-invert text-sm w-80 [&>p]:my-1 [&>p:first-child]:mt-0 [&>p:last-child]:mb-0", side: "top", sideOffset: 8, children: footnoteHtml ? (_jsx("div", { dangerouslySetInnerHTML: { __html: footnoteHtml } })) : (_jsx("p", { className: "text-muted-foreground", children: t("footnote.missing") })) })] }));
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRm9vdG5vdGVSZWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9Gb290bm90ZVJlZi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBdUIsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTRCLENBQUE7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUVsRCxNQUFNLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQTtBQUUzQztvRUFDb0U7QUFDcEUsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUEwQjtJQUNwRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sZUFBTyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxHQUFJLENBQUE7SUFDbkQsQ0FBQztJQUVELE9BQU8sS0FBQyxpQkFBaUIsT0FBSyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBSSxDQUFBO0FBQ3JELENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEtBQTZDO0lBQ3RFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3BELE1BQU0sQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFBO0lBRXZCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNwQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTTtRQUVmLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDN0MsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFBO1FBQ2hDLEtBQUssTUFBTSxPQUFPLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQztZQUMxRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDbEIsQ0FBQztRQUNELGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDcEMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFFaEIsT0FBTyxDQUNMLE1BQUMsU0FBUyxlQUNSLEtBQUMsZ0JBQWdCLElBQUMsTUFBTSxFQUFFLGVBQU8sS0FBSyxHQUFJLEdBQUksRUFDOUMsS0FBQyxnQkFBZ0IsSUFDZixTQUFTLEVBQUMsOEZBQThGLEVBQ3hHLElBQUksRUFBQyxLQUFLLEVBQ1YsVUFBVSxFQUFFLENBQUMsWUFFWixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQ2QsY0FBSyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBSSxDQUMzRCxDQUFDLENBQUMsQ0FBQyxDQUNGLFlBQUcsU0FBUyxFQUFDLHVCQUF1QixZQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFLLENBQ2pFLEdBQ2dCLElBQ1QsQ0FDYixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQ29tcG9uZW50UHJvcHMsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgSG92ZXJDYXJkLCBIb3ZlckNhcmRDb250ZW50LCBIb3ZlckNhcmRUcmlnZ2VyIH0gZnJvbSBcIi4uL2VsZW1lbnRzL2hvdmVyLWNhcmQudHN4XCJcbmltcG9ydCB7IHVzZUFydGljbGVIcmVmIH0gZnJvbSBcIi4uL2hlbHBlcnMvYXJ0aWNsZS1saW5rLnRzXCJcbmltcG9ydCB7IHVzZU1lc3NhZ2VzIH0gZnJvbSBcIi4uL2hvb2tzL21lc3NhZ2VzLnRzXCJcblxuY29uc3QgRk9PVE5PVEVfUFJFRklYID0gXCIjdXNlci1jb250ZW50LWZuLVwiXG5cbi8qKiBXcmFwcyBmb290bm90ZSByZWZlcmVuY2UgbGlua3MgaW4gYSBIb3ZlckNhcmQgdGhhdCBwcmV2aWV3cyBmb290bm90ZSBjb250ZW50IGlubGluZSxcbiAqICBhbmQgcG9pbnRzIHJlbGF0aXZlIGxpbmtzIHRvIE1hcmtkb3duIGZpbGVzIGF0IHRoZWlyIGFydGljbGVzICovXG5leHBvcnQgZnVuY3Rpb24gRm9vdG5vdGVSZWYocHJvcHM6IENvbXBvbmVudFByb3BzPFwiYVwiPikge1xuICBjb25zdCBocmVmID0gdXNlQXJ0aWNsZUhyZWYocHJvcHMuaHJlZikgPz8gXCJcIlxuICBpZiAoIWhyZWYuc3RhcnRzV2l0aChGT09UTk9URV9QUkVGSVgpKSB7XG4gICAgcmV0dXJuIDxhIHsuLi5wcm9wc30gaHJlZj17cHJvcHMuaHJlZiAmJiBocmVmfSAvPlxuICB9XG5cbiAgcmV0dXJuIDxGb290bm90ZUhvdmVyQ2FyZCB7Li4ucHJvcHN9IGhyZWY9e2hyZWZ9IC8+XG59XG5cbmZ1bmN0aW9uIEZvb3Rub3RlSG92ZXJDYXJkKHByb3BzOiBDb21wb25lbnRQcm9wczxcImFcIj4gJiB7IGhyZWY6IHN0cmluZyB9KSB7XG4gIGNvbnN0IFtmb290bm90ZUh0bWwsIHNldEZvb3Rub3RlSHRtbF0gPSB1c2VTdGF0ZShcIlwiKVxuICBjb25zdCB0ID0gdXNlTWVzc2FnZXMoKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0SWQgPSBwcm9wcy5ocmVmLnNsaWNlKDEpXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXRJZClcbiAgICBpZiAoIWVsKSByZXR1cm5cblxuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gICAgd3JhcHBlci5pbm5lckhUTUwgPSBlbC5pbm5lckhUTUxcbiAgICBmb3IgKGNvbnN0IGJhY2tyZWYgb2Ygd3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtZm9vdG5vdGUtYmFja3JlZl1cIikpIHtcbiAgICAgIGJhY2tyZWYucmVtb3ZlKClcbiAgICB9XG4gICAgc2V0Rm9vdG5vdGVIdG1sKHdyYXBwZXIuaW5uZXJIVE1MKVxuICB9LCBbcHJvcHMuaHJlZl0pXG5cbiAgcmV0dXJuIChcbiAgICA8SG92ZXJDYXJkPlxuICAgICAgPEhvdmVyQ2FyZFRyaWdnZXIgcmVuZGVyPXs8YSB7Li4ucHJvcHN9IC8+fSAvPlxuICAgICAgPEhvdmVyQ2FyZENvbnRlbnRcbiAgICAgICAgY2xhc3NOYW1lPVwicHJvc2UgZGFyazpwcm9zZS1pbnZlcnQgdGV4dC1zbSB3LTgwIFsmPnBdOm15LTEgWyY+cDpmaXJzdC1jaGlsZF06bXQtMCBbJj5wOmxhc3QtY2hpbGRdOm1iLTBcIlxuICAgICAgICBzaWRlPVwidG9wXCJcbiAgICAgICAgc2lkZU9mZnNldD17OH1cbiAgICAgID5cbiAgICAgICAge2Zvb3Rub3RlSHRtbCA/IChcbiAgICAgICAgICA8ZGl2IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogZm9vdG5vdGVIdG1sIH19IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3QoXCJmb290bm90ZS5taXNzaW5nXCIpfTwvcD5cbiAgICAgICAgKX1cbiAgICAgIDwvSG92ZXJDYXJkQ29udGVudD5cbiAgICA8L0hvdmVyQ2FyZD5cbiAgKVxufVxuIl19
@@ -0,0 +1,8 @@
1
+ export declare const headingComponents: {
2
+ h1: (props: React.HTMLAttributes<HTMLHeadingElement>) => import("react").JSX.Element;
3
+ h2: (props: React.HTMLAttributes<HTMLHeadingElement>) => import("react").JSX.Element;
4
+ h3: (props: React.HTMLAttributes<HTMLHeadingElement>) => import("react").JSX.Element;
5
+ h4: (props: React.HTMLAttributes<HTMLHeadingElement>) => import("react").JSX.Element;
6
+ h5: (props: React.HTMLAttributes<HTMLHeadingElement>) => import("react").JSX.Element;
7
+ h6: (props: React.HTMLAttributes<HTMLHeadingElement>) => import("react").JSX.Element;
8
+ };
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** Heading component that wraps content in an anchor link to itself */
3
+ function createHeading(Tag) {
4
+ return function Heading(props) {
5
+ if (!props.id)
6
+ return _jsx(Tag, { ...props });
7
+ return (_jsx(Tag, { ...props, children: _jsx("a", { href: `#${props.id}`, children: props.children }) }));
8
+ };
9
+ }
10
+ export const headingComponents = {
11
+ h1: createHeading("h1"),
12
+ h2: createHeading("h2"),
13
+ h3: createHeading("h3"),
14
+ h4: createHeading("h4"),
15
+ h5: createHeading("h5"),
16
+ h6: createHeading("h6"),
17
+ };
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVhZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL0hlYWRpbmcudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1RUFBdUU7QUFDdkUsU0FBUyxhQUFhLENBQUMsR0FBNEM7SUFDakUsT0FBTyxTQUFTLE9BQU8sQ0FBQyxLQUErQztRQUNyRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFBRSxPQUFPLEtBQUMsR0FBRyxPQUFLLEtBQUssR0FBSSxDQUFBO1FBQ3hDLE9BQU8sQ0FDTCxLQUFDLEdBQUcsT0FBSyxLQUFLLFlBQ1osWUFBRyxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBRSxFQUFFLFlBQUcsS0FBSyxDQUFDLFFBQVEsR0FBSyxHQUN6QyxDQUNQLENBQUE7SUFDSCxDQUFDLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0IsRUFBRSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDdkIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDdkIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDdkIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDdkIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDdkIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUM7Q0FDeEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBIZWFkaW5nIGNvbXBvbmVudCB0aGF0IHdyYXBzIGNvbnRlbnQgaW4gYW4gYW5jaG9yIGxpbmsgdG8gaXRzZWxmICovXG5mdW5jdGlvbiBjcmVhdGVIZWFkaW5nKFRhZzogXCJoMVwiIHwgXCJoMlwiIHwgXCJoM1wiIHwgXCJoNFwiIHwgXCJoNVwiIHwgXCJoNlwiKSB7XG4gIHJldHVybiBmdW5jdGlvbiBIZWFkaW5nKHByb3BzOiBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MSGVhZGluZ0VsZW1lbnQ+KSB7XG4gICAgaWYgKCFwcm9wcy5pZCkgcmV0dXJuIDxUYWcgey4uLnByb3BzfSAvPlxuICAgIHJldHVybiAoXG4gICAgICA8VGFnIHsuLi5wcm9wc30+XG4gICAgICAgIDxhIGhyZWY9e2AjJHtwcm9wcy5pZH1gfT57cHJvcHMuY2hpbGRyZW59PC9hPlxuICAgICAgPC9UYWc+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBoZWFkaW5nQ29tcG9uZW50cyA9IHtcbiAgaDE6IGNyZWF0ZUhlYWRpbmcoXCJoMVwiKSxcbiAgaDI6IGNyZWF0ZUhlYWRpbmcoXCJoMlwiKSxcbiAgaDM6IGNyZWF0ZUhlYWRpbmcoXCJoM1wiKSxcbiAgaDQ6IGNyZWF0ZUhlYWRpbmcoXCJoNFwiKSxcbiAgaDU6IGNyZWF0ZUhlYWRpbmcoXCJoNVwiKSxcbiAgaDY6IGNyZWF0ZUhlYWRpbmcoXCJoNlwiKSxcbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /** Renders a Lucide icon inline by name */
2
+ export declare function Icon(props: {
3
+ name: string;
4
+ className?: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { DynamicIcon } from "../helpers/dynamic-icon.js";
3
+ /** Renders a Lucide icon inline by name */
4
+ export function Icon(props) {
5
+ const className = props.className
6
+ ? `inline-block size-4 align-text-bottom ${props.className}`
7
+ : "inline-block size-4 align-text-bottom";
8
+ return _jsx(DynamicIcon, { name: props.name, className: className });
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL0ljb24udHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTZCLENBQUE7QUFFekQsMkNBQTJDO0FBQzNDLE1BQU0sVUFBVSxJQUFJLENBQUMsS0FBMkM7SUFDOUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVM7UUFDL0IsQ0FBQyxDQUFDLHlDQUF5QyxLQUFLLENBQUMsU0FBUyxFQUFFO1FBQzVELENBQUMsQ0FBQyx1Q0FBdUMsQ0FBQTtJQUUzQyxPQUFPLEtBQUMsV0FBVyxJQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEdBQUksQ0FBQTtBQUNoRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHluYW1pY0ljb24gfSBmcm9tIFwiLi4vaGVscGVycy9keW5hbWljLWljb24udHN4XCJcblxuLyoqIFJlbmRlcnMgYSBMdWNpZGUgaWNvbiBpbmxpbmUgYnkgbmFtZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIEljb24ocHJvcHM6IHsgbmFtZTogc3RyaW5nOyBjbGFzc05hbWU/OiBzdHJpbmcgfSkge1xuICBjb25zdCBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWVcbiAgICA/IGBpbmxpbmUtYmxvY2sgc2l6ZS00IGFsaWduLXRleHQtYm90dG9tICR7cHJvcHMuY2xhc3NOYW1lfWBcbiAgICA6IFwiaW5saW5lLWJsb2NrIHNpemUtNCBhbGlnbi10ZXh0LWJvdHRvbVwiXG5cbiAgcmV0dXJuIDxEeW5hbWljSWNvbiBuYW1lPXtwcm9wcy5uYW1lfSBjbGFzc05hbWU9e2NsYXNzTmFtZX0gLz5cbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import type { ComponentType } from "react";
2
+ import type { TocItem } from "../models/toc.ts";
3
+ type MarkdownComponents = Record<string, ComponentType<never>>;
4
+ /** Renders compiled Markdown with Livemark's components for its HTML elements,
5
+ * directives and code blocks; `components` adds or replaces any of them. */
6
+ export declare function Markdown(props: {
7
+ component: ComponentType<{
8
+ components?: object;
9
+ }>;
10
+ toc?: TocItem[];
11
+ components?: MarkdownComponents;
12
+ }): import("react").JSX.Element;
13
+ export {};
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { TocContext } from "../helpers/toc-context.js";
3
+ import { Abbr } from "./Abbr.js";
4
+ import { AnsiCode } from "./AnsiCode.js";
5
+ import { Audio } from "./Audio.js";
6
+ import { Badge } from "./Badge.js";
7
+ import { Button } from "./Button.js";
8
+ import { Callout } from "./Callout.js";
9
+ import { Card } from "./Card.js";
10
+ import { Cards } from "./Cards.js";
11
+ import { CodeBlock } from "./CodeBlock.js";
12
+ import { CodeTabs } from "./CodeTabs.js";
13
+ import { Column } from "./Column.js";
14
+ import { Columns } from "./Columns.js";
15
+ import { DefinitionDetail, DefinitionList, DefinitionTerm } from "./DefinitionList.js";
16
+ import { Details } from "./Details.js";
17
+ import { Filetree } from "./Filetree.js";
18
+ import { FootnoteRef } from "./FootnoteRef.js";
19
+ import { headingComponents } from "./Heading.js";
20
+ import { Icon } from "./Icon.js";
21
+ import { Mermaid } from "./Mermaid.js";
22
+ import { PackageTabs } from "./PackageTabs.js";
23
+ import { SortableTable, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "./SortableTable.js";
24
+ import { Tab } from "./Tab.js";
25
+ import { Tabs } from "./Tabs.js";
26
+ import { Toc } from "./Toc.js";
27
+ import { Video } from "./Video.js";
28
+ import { ZoomImage } from "./ZoomImage.js";
29
+ import { Separator } from "../elements/separator.js";
30
+ /** Renders compiled Markdown with Livemark's components for its HTML elements,
31
+ * directives and code blocks; `components` adds or replaces any of them. */
32
+ export function Markdown(props) {
33
+ const Content = props.component;
34
+ const content = _jsx(Content, { components: { ...COMPONENTS, ...props.components } });
35
+ if (!props.toc)
36
+ return content;
37
+ return _jsx(TocContext.Provider, { value: props.toc, children: content });
38
+ }
39
+ const COMPONENTS = {
40
+ hr: Separator,
41
+ img: ZoomImage,
42
+ pre: CodeBlock,
43
+ table: SortableTable,
44
+ thead: TableHeader,
45
+ tbody: TableBody,
46
+ tr: TableRow,
47
+ th: TableHead,
48
+ td: TableCell,
49
+ a: FootnoteRef,
50
+ Abbr,
51
+ AnsiCode,
52
+ Audio,
53
+ Badge,
54
+ Button,
55
+ Callout,
56
+ Card,
57
+ Cards,
58
+ Column,
59
+ Columns,
60
+ CodeTabs,
61
+ DefinitionDetail,
62
+ DefinitionList,
63
+ DefinitionTerm,
64
+ Details,
65
+ Filetree,
66
+ Icon,
67
+ Mermaid,
68
+ PackageTabs,
69
+ Tab,
70
+ Tabs,
71
+ Toc,
72
+ Video,
73
+ ...headingComponents,
74
+ };
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFya2Rvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9NYXJrZG93bi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUV0RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBWSxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFnQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFhLENBQUE7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQWEsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYyxDQUFBO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFlLENBQUE7QUFDdkMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVksQ0FBQTtBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBYSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZ0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYyxDQUFBO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFlLENBQUE7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBc0IsQ0FBQTtBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBZSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFnQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBbUIsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFlLENBQUE7QUFDakQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVksQ0FBQTtBQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBZSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBbUIsQ0FBQTtBQUMvQyxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFdBQVcsRUFDWCxRQUFRLEdBQ1QsTUFBTSxvQkFBcUIsQ0FBQTtBQUM1QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVyxDQUFBO0FBQy9CLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFZLENBQUE7QUFDakMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVcsQ0FBQTtBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBYSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTJCLENBQUE7QUFJckQ7NkVBQzZFO0FBQzdFLE1BQU0sVUFBVSxRQUFRLENBQUMsS0FJeEI7SUFDQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFBO0lBQy9CLE1BQU0sT0FBTyxHQUFHLEtBQUMsT0FBTyxJQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFJLENBQUE7SUFDL0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO1FBQUUsT0FBTyxPQUFPLENBQUE7SUFDOUIsT0FBTyxLQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLFlBQUcsT0FBTyxHQUF1QixDQUFBO0FBQy9FLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRztJQUNqQixFQUFFLEVBQUUsU0FBUztJQUNiLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFNBQVM7SUFDZCxLQUFLLEVBQUUsYUFBYTtJQUNwQixLQUFLLEVBQUUsV0FBVztJQUNsQixLQUFLLEVBQUUsU0FBUztJQUNoQixFQUFFLEVBQUUsUUFBUTtJQUNaLEVBQUUsRUFBRSxTQUFTO0lBQ2IsRUFBRSxFQUFFLFNBQVM7SUFDYixDQUFDLEVBQUUsV0FBVztJQUNkLElBQUk7SUFDSixRQUFRO0lBQ1IsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sT0FBTztJQUNQLElBQUk7SUFDSixLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxjQUFjO0lBQ2QsT0FBTztJQUNQLFFBQVE7SUFDUixJQUFJO0lBQ0osT0FBTztJQUNQLFdBQVc7SUFDWCxHQUFHO0lBQ0gsSUFBSTtJQUNKLEdBQUc7SUFDSCxLQUFLO0lBQ0wsR0FBRyxpQkFBaUI7Q0FDckIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29tcG9uZW50VHlwZSB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBUb2NDb250ZXh0IH0gZnJvbSBcIi4uL2hlbHBlcnMvdG9jLWNvbnRleHQudHNcIlxuaW1wb3J0IHR5cGUgeyBUb2NJdGVtIH0gZnJvbSBcIi4uL21vZGVscy90b2MudHNcIlxuaW1wb3J0IHsgQWJiciB9IGZyb20gXCIuL0FiYnIudHN4XCJcbmltcG9ydCB7IEFuc2lDb2RlIH0gZnJvbSBcIi4vQW5zaUNvZGUudHN4XCJcbmltcG9ydCB7IEF1ZGlvIH0gZnJvbSBcIi4vQXVkaW8udHN4XCJcbmltcG9ydCB7IEJhZGdlIH0gZnJvbSBcIi4vQmFkZ2UudHN4XCJcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCIuL0J1dHRvbi50c3hcIlxuaW1wb3J0IHsgQ2FsbG91dCB9IGZyb20gXCIuL0NhbGxvdXQudHN4XCJcbmltcG9ydCB7IENhcmQgfSBmcm9tIFwiLi9DYXJkLnRzeFwiXG5pbXBvcnQgeyBDYXJkcyB9IGZyb20gXCIuL0NhcmRzLnRzeFwiXG5pbXBvcnQgeyBDb2RlQmxvY2sgfSBmcm9tIFwiLi9Db2RlQmxvY2sudHN4XCJcbmltcG9ydCB7IENvZGVUYWJzIH0gZnJvbSBcIi4vQ29kZVRhYnMudHN4XCJcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL0NvbHVtbi50c3hcIlxuaW1wb3J0IHsgQ29sdW1ucyB9IGZyb20gXCIuL0NvbHVtbnMudHN4XCJcbmltcG9ydCB7IERlZmluaXRpb25EZXRhaWwsIERlZmluaXRpb25MaXN0LCBEZWZpbml0aW9uVGVybSB9IGZyb20gXCIuL0RlZmluaXRpb25MaXN0LnRzeFwiXG5pbXBvcnQgeyBEZXRhaWxzIH0gZnJvbSBcIi4vRGV0YWlscy50c3hcIlxuaW1wb3J0IHsgRmlsZXRyZWUgfSBmcm9tIFwiLi9GaWxldHJlZS50c3hcIlxuaW1wb3J0IHsgRm9vdG5vdGVSZWYgfSBmcm9tIFwiLi9Gb290bm90ZVJlZi50c3hcIlxuaW1wb3J0IHsgaGVhZGluZ0NvbXBvbmVudHMgfSBmcm9tIFwiLi9IZWFkaW5nLnRzeFwiXG5pbXBvcnQgeyBJY29uIH0gZnJvbSBcIi4vSWNvbi50c3hcIlxuaW1wb3J0IHsgTWVybWFpZCB9IGZyb20gXCIuL01lcm1haWQudHN4XCJcbmltcG9ydCB7IFBhY2thZ2VUYWJzIH0gZnJvbSBcIi4vUGFja2FnZVRhYnMudHN4XCJcbmltcG9ydCB7XG4gIFNvcnRhYmxlVGFibGUsXG4gIFRhYmxlQm9keSxcbiAgVGFibGVDZWxsLFxuICBUYWJsZUhlYWQsXG4gIFRhYmxlSGVhZGVyLFxuICBUYWJsZVJvdyxcbn0gZnJvbSBcIi4vU29ydGFibGVUYWJsZS50c3hcIlxuaW1wb3J0IHsgVGFiIH0gZnJvbSBcIi4vVGFiLnRzeFwiXG5pbXBvcnQgeyBUYWJzIH0gZnJvbSBcIi4vVGFicy50c3hcIlxuaW1wb3J0IHsgVG9jIH0gZnJvbSBcIi4vVG9jLnRzeFwiXG5pbXBvcnQgeyBWaWRlbyB9IGZyb20gXCIuL1ZpZGVvLnRzeFwiXG5pbXBvcnQgeyBab29tSW1hZ2UgfSBmcm9tIFwiLi9ab29tSW1hZ2UudHN4XCJcbmltcG9ydCB7IFNlcGFyYXRvciB9IGZyb20gXCIuLi9lbGVtZW50cy9zZXBhcmF0b3IudHN4XCJcblxudHlwZSBNYXJrZG93bkNvbXBvbmVudHMgPSBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRUeXBlPG5ldmVyPj5cblxuLyoqIFJlbmRlcnMgY29tcGlsZWQgTWFya2Rvd24gd2l0aCBMaXZlbWFyaydzIGNvbXBvbmVudHMgZm9yIGl0cyBIVE1MIGVsZW1lbnRzLFxuICogIGRpcmVjdGl2ZXMgYW5kIGNvZGUgYmxvY2tzOyBgY29tcG9uZW50c2AgYWRkcyBvciByZXBsYWNlcyBhbnkgb2YgdGhlbS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXJrZG93bihwcm9wczoge1xuICBjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8eyBjb21wb25lbnRzPzogb2JqZWN0IH0+XG4gIHRvYz86IFRvY0l0ZW1bXVxuICBjb21wb25lbnRzPzogTWFya2Rvd25Db21wb25lbnRzXG59KSB7XG4gIGNvbnN0IENvbnRlbnQgPSBwcm9wcy5jb21wb25lbnRcbiAgY29uc3QgY29udGVudCA9IDxDb250ZW50IGNvbXBvbmVudHM9e3sgLi4uQ09NUE9ORU5UUywgLi4ucHJvcHMuY29tcG9uZW50cyB9fSAvPlxuICBpZiAoIXByb3BzLnRvYykgcmV0dXJuIGNvbnRlbnRcbiAgcmV0dXJuIDxUb2NDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcm9wcy50b2N9Pntjb250ZW50fTwvVG9jQ29udGV4dC5Qcm92aWRlcj5cbn1cblxuY29uc3QgQ09NUE9ORU5UUyA9IHtcbiAgaHI6IFNlcGFyYXRvcixcbiAgaW1nOiBab29tSW1hZ2UsXG4gIHByZTogQ29kZUJsb2NrLFxuICB0YWJsZTogU29ydGFibGVUYWJsZSxcbiAgdGhlYWQ6IFRhYmxlSGVhZGVyLFxuICB0Ym9keTogVGFibGVCb2R5LFxuICB0cjogVGFibGVSb3csXG4gIHRoOiBUYWJsZUhlYWQsXG4gIHRkOiBUYWJsZUNlbGwsXG4gIGE6IEZvb3Rub3RlUmVmLFxuICBBYmJyLFxuICBBbnNpQ29kZSxcbiAgQXVkaW8sXG4gIEJhZGdlLFxuICBCdXR0b24sXG4gIENhbGxvdXQsXG4gIENhcmQsXG4gIENhcmRzLFxuICBDb2x1bW4sXG4gIENvbHVtbnMsXG4gIENvZGVUYWJzLFxuICBEZWZpbml0aW9uRGV0YWlsLFxuICBEZWZpbml0aW9uTGlzdCxcbiAgRGVmaW5pdGlvblRlcm0sXG4gIERldGFpbHMsXG4gIEZpbGV0cmVlLFxuICBJY29uLFxuICBNZXJtYWlkLFxuICBQYWNrYWdlVGFicyxcbiAgVGFiLFxuICBUYWJzLFxuICBUb2MsXG4gIFZpZGVvLFxuICAuLi5oZWFkaW5nQ29tcG9uZW50cyxcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ /** Lazily loads and renders a Mermaid diagram */
2
+ export declare function Mermaid(props: {
3
+ children: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Suspense, lazy } from "react";
3
+ import { useMessages } from "../hooks/messages.js";
4
+ const MermaidRenderer = lazy(() => import("./MermaidRenderer.js"));
5
+ /** Lazily loads and renders a Mermaid diagram */
6
+ export function Mermaid(props) {
7
+ const t = useMessages();
8
+ return (_jsx(Suspense, { fallback: _jsx("div", { className: "not-prose mermaid flex justify-center", children: t("media.loadingDiagram") }), children: _jsx(MermaidRenderer, { children: props.children }) }));
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVybWFpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL01lcm1haWQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUN0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFbEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxzQkFBdUIsQ0FBQyxDQUFDLENBQUE7QUFFbkUsaURBQWlEO0FBQ2pELE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBMkI7SUFDakQsTUFBTSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUE7SUFDdkIsT0FBTyxDQUNMLEtBQUMsUUFBUSxJQUNQLFFBQVEsRUFDTixjQUFLLFNBQVMsRUFBQyx1Q0FBdUMsWUFDbkQsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLEdBQ3RCLFlBR1IsS0FBQyxlQUFlLGNBQUUsS0FBSyxDQUFDLFFBQVEsR0FBbUIsR0FDMUMsQ0FDWixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1c3BlbnNlLCBsYXp5IH0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IHVzZU1lc3NhZ2VzIH0gZnJvbSBcIi4uL2hvb2tzL21lc3NhZ2VzLnRzXCJcblxuY29uc3QgTWVybWFpZFJlbmRlcmVyID0gbGF6eSgoKSA9PiBpbXBvcnQoXCIuL01lcm1haWRSZW5kZXJlci50c3hcIikpXG5cbi8qKiBMYXppbHkgbG9hZHMgYW5kIHJlbmRlcnMgYSBNZXJtYWlkIGRpYWdyYW0gKi9cbmV4cG9ydCBmdW5jdGlvbiBNZXJtYWlkKHByb3BzOiB7IGNoaWxkcmVuOiBzdHJpbmcgfSkge1xuICBjb25zdCB0ID0gdXNlTWVzc2FnZXMoKVxuICByZXR1cm4gKFxuICAgIDxTdXNwZW5zZVxuICAgICAgZmFsbGJhY2s9e1xuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm5vdC1wcm9zZSBtZXJtYWlkIGZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICB7dChcIm1lZGlhLmxvYWRpbmdEaWFncmFtXCIpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA+XG4gICAgICA8TWVybWFpZFJlbmRlcmVyPntwcm9wcy5jaGlsZHJlbn08L01lcm1haWRSZW5kZXJlcj5cbiAgICA8L1N1c3BlbnNlPlxuICApXG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ /** Renders a Mermaid diagram from a chart definition string */
2
+ export default function MermaidRenderer(props: {
3
+ children: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import mermaid from "mermaid";
4
+ mermaid.initialize({ startOnLoad: false });
5
+ // Module-wide so runs never overlap, even across effect re-runs: overlapping runs on
6
+ // one node reject with "reading 'firstChild'".
7
+ let renderQueue = Promise.resolve();
8
+ /** Renders a Mermaid diagram from a chart definition string */
9
+ export default function MermaidRenderer(props) {
10
+ const ref = useRef(null);
11
+ useEffect(() => {
12
+ const el = ref.current;
13
+ if (!el)
14
+ return;
15
+ const render = () => {
16
+ renderQueue = renderQueue
17
+ .then(() => {
18
+ if (!el.isConnected)
19
+ return;
20
+ const isDark = document.documentElement.classList.contains("dark");
21
+ mermaid.initialize({
22
+ startOnLoad: false,
23
+ theme: isDark ? "dark" : "default",
24
+ });
25
+ el.textContent = props.children;
26
+ el.removeAttribute("data-processed");
27
+ return mermaid.run({ nodes: [el] });
28
+ })
29
+ .catch(error => {
30
+ if (el.isConnected)
31
+ console.error(error);
32
+ });
33
+ };
34
+ render();
35
+ const observer = new MutationObserver(render);
36
+ observer.observe(document.documentElement, {
37
+ attributes: true,
38
+ attributeFilter: ["class"],
39
+ });
40
+ return () => observer.disconnect();
41
+ }, [props.children]);
42
+ return _jsx("div", { ref: ref, className: "not-prose mermaid flex justify-center" });
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVybWFpZFJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvTWVybWFpZFJlbmRlcmVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDekMsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFBO0FBRTdCLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtBQUUxQyxxRkFBcUY7QUFDckYsK0NBQStDO0FBQy9DLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUVuQywrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE9BQU8sVUFBVSxlQUFlLENBQUMsS0FBMkI7SUFDakUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQTtJQUV4QyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU07UUFFZixNQUFNLE1BQU0sR0FBRyxHQUFHLEVBQUU7WUFDbEIsV0FBVyxHQUFHLFdBQVc7aUJBQ3RCLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXO29CQUFFLE9BQU07Z0JBQzNCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDbEUsT0FBTyxDQUFDLFVBQVUsQ0FBQztvQkFDakIsV0FBVyxFQUFFLEtBQUs7b0JBQ2xCLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUztpQkFDbkMsQ0FBQyxDQUFBO2dCQUNGLEVBQUUsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQTtnQkFDL0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO2dCQUNwQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDckMsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDYixJQUFJLEVBQUUsQ0FBQyxXQUFXO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDMUMsQ0FBQyxDQUFDLENBQUE7UUFDTixDQUFDLENBQUE7UUFFRCxNQUFNLEVBQUUsQ0FBQTtRQUVSLE1BQU0sUUFBUSxHQUFHLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDN0MsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO1lBQ3pDLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGVBQWUsRUFBRSxDQUFDLE9BQU8sQ0FBQztTQUMzQixDQUFDLENBQUE7UUFFRixPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNwQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUVwQixPQUFPLGNBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsdUNBQXVDLEdBQUcsQ0FBQTtBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IG1lcm1haWQgZnJvbSBcIm1lcm1haWRcIlxuXG5tZXJtYWlkLmluaXRpYWxpemUoeyBzdGFydE9uTG9hZDogZmFsc2UgfSlcblxuLy8gTW9kdWxlLXdpZGUgc28gcnVucyBuZXZlciBvdmVybGFwLCBldmVuIGFjcm9zcyBlZmZlY3QgcmUtcnVuczogb3ZlcmxhcHBpbmcgcnVucyBvblxuLy8gb25lIG5vZGUgcmVqZWN0IHdpdGggXCJyZWFkaW5nICdmaXJzdENoaWxkJ1wiLlxubGV0IHJlbmRlclF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKClcblxuLyoqIFJlbmRlcnMgYSBNZXJtYWlkIGRpYWdyYW0gZnJvbSBhIGNoYXJ0IGRlZmluaXRpb24gc3RyaW5nICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZXJtYWlkUmVuZGVyZXIocHJvcHM6IHsgY2hpbGRyZW46IHN0cmluZyB9KSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gcmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsKSByZXR1cm5cblxuICAgIGNvbnN0IHJlbmRlciA9ICgpID0+IHtcbiAgICAgIHJlbmRlclF1ZXVlID0gcmVuZGVyUXVldWVcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGlmICghZWwuaXNDb25uZWN0ZWQpIHJldHVyblxuICAgICAgICAgIGNvbnN0IGlzRGFyayA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJkYXJrXCIpXG4gICAgICAgICAgbWVybWFpZC5pbml0aWFsaXplKHtcbiAgICAgICAgICAgIHN0YXJ0T25Mb2FkOiBmYWxzZSxcbiAgICAgICAgICAgIHRoZW1lOiBpc0RhcmsgPyBcImRhcmtcIiA6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgZWwudGV4dENvbnRlbnQgPSBwcm9wcy5jaGlsZHJlblxuICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtcHJvY2Vzc2VkXCIpXG4gICAgICAgICAgcmV0dXJuIG1lcm1haWQucnVuKHsgbm9kZXM6IFtlbF0gfSlcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcmVuZGVyKClcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIocmVuZGVyKVxuICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgYXR0cmlidXRlRmlsdGVyOiBbXCJjbGFzc1wiXSxcbiAgICB9KVxuXG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICB9LCBbcHJvcHMuY2hpbGRyZW5dKVxuXG4gIHJldHVybiA8ZGl2IHJlZj17cmVmfSBjbGFzc05hbWU9XCJub3QtcHJvc2UgbWVybWFpZCBmbGV4IGp1c3RpZnktY2VudGVyXCIgLz5cbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ interface PackageTabsProps {
2
+ npm: string;
3
+ pnpm: string;
4
+ yarn: string;
5
+ bun: string;
6
+ }
7
+ /** Tabbed code block showing a command for each package manager */
8
+ export declare function PackageTabs(props: PackageTabsProps): import("react").JSX.Element;
9
+ export {};