@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
package/LICENSE.md ADDED
@@ -0,0 +1,9 @@
1
+ # The MIT License (MIT)
2
+
3
+ Copyright © 2025 Evgeny Karev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,6 @@
1
- # Temporary Holding Version
1
+ # @livemark/markdown
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Internal: the Markdown pipeline, components and styles shared by
4
+ [`livemark`](https://www.npmjs.com/package/livemark) and
5
+ [`@livemark/vite`](https://www.npmjs.com/package/@livemark/vite). It has no public API; install
6
+ one of those instead.
@@ -0,0 +1,27 @@
1
+ import type { MarkdownPlugins } from "../../models/plugins.ts";
2
+ /** How Markdown compiles: the code themes, plugins, raw HTML and image URLs. */
3
+ export interface MarkdownOptions {
4
+ codeThemeLight?: string;
5
+ codeThemeDark?: string;
6
+ plugins?: MarkdownPlugins;
7
+ allowDangerousHtml?: boolean;
8
+ root?: string;
9
+ base?: string;
10
+ }
11
+ /** Internal: compile a Markdown or MDX body (no frontmatter) into code and its outline.
12
+ * `program` is an ES module, `function-body` the body `new Function` evaluates. */
13
+ export declare function compileMarkdown(props: {
14
+ content: string;
15
+ filePath: string;
16
+ format: "md" | "mdx";
17
+ outputFormat: "program" | "function-body";
18
+ options: MarkdownOptions;
19
+ }): Promise<{
20
+ code: string;
21
+ toc: import("../../models/toc.ts").TocItem[];
22
+ }>;
23
+ /** A file's format: its frontmatter `format` when set, else `.mdx` is MDX. */
24
+ export declare function detectMarkdownFormat(props: {
25
+ filePath: string;
26
+ format?: unknown;
27
+ }): "md" | "mdx";
@@ -0,0 +1,48 @@
1
+ import { flattenToc } from "../../helpers/toc-outline.js";
2
+ import { TWOSLASH_FENCE } from "../../plugins/twoslash.js";
3
+ import { createProcessor } from "../processor/create.js";
4
+ /** Internal: compile a Markdown or MDX body (no frontmatter) into code and its outline.
5
+ * `program` is an ES module, `function-body` the body `new Function` evaluates. */
6
+ export async function compileMarkdown(props) {
7
+ if (props.format === "mdx" && props.options.allowDangerousHtml === false) {
8
+ throw new Error(`${props.filePath}: MDX runs code, which allowDangerousHtml: false forbids`);
9
+ }
10
+ const twoslash = TWOSLASH_FENCE.test(props.content);
11
+ const processor = readProcessor(props.options, props.format, props.outputFormat, twoslash);
12
+ const file = await processor.process({ value: props.content, path: props.filePath });
13
+ return { code: String(file.value), toc: flattenToc(file.data.toc) };
14
+ }
15
+ /** A file's format: its frontmatter `format` when set, else `.mdx` is MDX. */
16
+ export function detectMarkdownFormat(props) {
17
+ if (props.format === "md" || props.format === "mdx")
18
+ return props.format;
19
+ return props.filePath.endsWith(".mdx") ? "mdx" : "md";
20
+ }
21
+ // A frozen processor runs any number of files, so each variant is built once per options
22
+ const processors = new WeakMap();
23
+ function readProcessor(options, format, outputFormat, twoslash) {
24
+ let variants = processors.get(options);
25
+ if (!variants) {
26
+ variants = new Map();
27
+ processors.set(options, variants);
28
+ }
29
+ const key = `${format}:${outputFormat}:${twoslash}`;
30
+ let processor = variants.get(key);
31
+ if (!processor) {
32
+ processor = createProcessor({
33
+ format,
34
+ twoslash,
35
+ outputFormat,
36
+ allowDangerousHtml: options.allowDangerousHtml ?? true,
37
+ // Livemark's own defaults in models/config.ts
38
+ codeThemeLight: options.codeThemeLight ?? "catppuccin-latte",
39
+ codeThemeDark: options.codeThemeDark ?? "catppuccin-mocha",
40
+ plugins: options.plugins,
41
+ root: options.root,
42
+ base: options.base,
43
+ });
44
+ variants.set(key, processor);
45
+ }
46
+ return processor;
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS9hY3Rpb25zL21hcmtkb3duL2NvbXBpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFBO0FBRXpELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFZeEQ7b0ZBQ29GO0FBQ3BGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLEtBTXJDO0lBQ0MsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3pFLE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxLQUFLLENBQUMsUUFBUSwwREFBMEQsQ0FDNUUsQ0FBQTtJQUNILENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNuRCxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQzdCLEtBQUssQ0FBQyxPQUFPLEVBQ2IsS0FBSyxDQUFDLE1BQU0sRUFDWixLQUFLLENBQUMsWUFBWSxFQUNsQixRQUFRLENBQ1QsQ0FBQTtJQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUNwRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUE7QUFDckUsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBNkM7SUFDaEYsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUE7SUFDeEUsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7QUFDdkQsQ0FBQztBQUVELHlGQUF5RjtBQUN6RixNQUFNLFVBQVUsR0FBRyxJQUFJLE9BQU8sRUFHM0IsQ0FBQTtBQUVILFNBQVMsYUFBYSxDQUNwQixPQUF3QixFQUN4QixNQUFvQixFQUNwQixZQUF5QyxFQUN6QyxRQUFpQjtJQUVqQixJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3BCLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ25DLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sSUFBSSxZQUFZLElBQUksUUFBUSxFQUFFLENBQUE7SUFDbkQsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNqQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQzFCLE1BQU07WUFDTixRQUFRO1lBQ1IsWUFBWTtZQUNaLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSxJQUFJO1lBQ3RELDhDQUE4QztZQUM5QyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxrQkFBa0I7WUFDNUQsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLElBQUksa0JBQWtCO1lBQzFELE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1NBQ25CLENBQUMsQ0FBQTtRQUNGLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmxhdHRlblRvYyB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL3RvYy1vdXRsaW5lLnRzXCJcbmltcG9ydCB0eXBlIHsgTWFya2Rvd25QbHVnaW5zIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wbHVnaW5zLnRzXCJcbmltcG9ydCB7IFRXT1NMQVNIX0ZFTkNFIH0gZnJvbSBcIi4uLy4uL3BsdWdpbnMvdHdvc2xhc2gudHNcIlxuaW1wb3J0IHsgY3JlYXRlUHJvY2Vzc29yIH0gZnJvbSBcIi4uL3Byb2Nlc3Nvci9jcmVhdGUudHNcIlxuXG4vKiogSG93IE1hcmtkb3duIGNvbXBpbGVzOiB0aGUgY29kZSB0aGVtZXMsIHBsdWdpbnMsIHJhdyBIVE1MIGFuZCBpbWFnZSBVUkxzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXJrZG93bk9wdGlvbnMge1xuICBjb2RlVGhlbWVMaWdodD86IHN0cmluZ1xuICBjb2RlVGhlbWVEYXJrPzogc3RyaW5nXG4gIHBsdWdpbnM/OiBNYXJrZG93blBsdWdpbnNcbiAgYWxsb3dEYW5nZXJvdXNIdG1sPzogYm9vbGVhblxuICByb290Pzogc3RyaW5nXG4gIGJhc2U/OiBzdHJpbmdcbn1cblxuLyoqIEludGVybmFsOiBjb21waWxlIGEgTWFya2Rvd24gb3IgTURYIGJvZHkgKG5vIGZyb250bWF0dGVyKSBpbnRvIGNvZGUgYW5kIGl0cyBvdXRsaW5lLlxuICogIGBwcm9ncmFtYCBpcyBhbiBFUyBtb2R1bGUsIGBmdW5jdGlvbi1ib2R5YCB0aGUgYm9keSBgbmV3IEZ1bmN0aW9uYCBldmFsdWF0ZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcGlsZU1hcmtkb3duKHByb3BzOiB7XG4gIGNvbnRlbnQ6IHN0cmluZ1xuICBmaWxlUGF0aDogc3RyaW5nXG4gIGZvcm1hdDogXCJtZFwiIHwgXCJtZHhcIlxuICBvdXRwdXRGb3JtYXQ6IFwicHJvZ3JhbVwiIHwgXCJmdW5jdGlvbi1ib2R5XCJcbiAgb3B0aW9uczogTWFya2Rvd25PcHRpb25zXG59KSB7XG4gIGlmIChwcm9wcy5mb3JtYXQgPT09IFwibWR4XCIgJiYgcHJvcHMub3B0aW9ucy5hbGxvd0Rhbmdlcm91c0h0bWwgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7cHJvcHMuZmlsZVBhdGh9OiBNRFggcnVucyBjb2RlLCB3aGljaCBhbGxvd0Rhbmdlcm91c0h0bWw6IGZhbHNlIGZvcmJpZHNgLFxuICAgIClcbiAgfVxuICBjb25zdCB0d29zbGFzaCA9IFRXT1NMQVNIX0ZFTkNFLnRlc3QocHJvcHMuY29udGVudClcbiAgY29uc3QgcHJvY2Vzc29yID0gcmVhZFByb2Nlc3NvcihcbiAgICBwcm9wcy5vcHRpb25zLFxuICAgIHByb3BzLmZvcm1hdCxcbiAgICBwcm9wcy5vdXRwdXRGb3JtYXQsXG4gICAgdHdvc2xhc2gsXG4gIClcbiAgY29uc3QgZmlsZSA9IGF3YWl0IHByb2Nlc3Nvci5wcm9jZXNzKHsgdmFsdWU6IHByb3BzLmNvbnRlbnQsIHBhdGg6IHByb3BzLmZpbGVQYXRoIH0pXG4gIHJldHVybiB7IGNvZGU6IFN0cmluZyhmaWxlLnZhbHVlKSwgdG9jOiBmbGF0dGVuVG9jKGZpbGUuZGF0YS50b2MpIH1cbn1cblxuLyoqIEEgZmlsZSdzIGZvcm1hdDogaXRzIGZyb250bWF0dGVyIGBmb3JtYXRgIHdoZW4gc2V0LCBlbHNlIGAubWR4YCBpcyBNRFguICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TWFya2Rvd25Gb3JtYXQocHJvcHM6IHsgZmlsZVBhdGg6IHN0cmluZzsgZm9ybWF0PzogdW5rbm93biB9KSB7XG4gIGlmIChwcm9wcy5mb3JtYXQgPT09IFwibWRcIiB8fCBwcm9wcy5mb3JtYXQgPT09IFwibWR4XCIpIHJldHVybiBwcm9wcy5mb3JtYXRcbiAgcmV0dXJuIHByb3BzLmZpbGVQYXRoLmVuZHNXaXRoKFwiLm1keFwiKSA/IFwibWR4XCIgOiBcIm1kXCJcbn1cblxuLy8gQSBmcm96ZW4gcHJvY2Vzc29yIHJ1bnMgYW55IG51bWJlciBvZiBmaWxlcywgc28gZWFjaCB2YXJpYW50IGlzIGJ1aWx0IG9uY2UgcGVyIG9wdGlvbnNcbmNvbnN0IHByb2Nlc3NvcnMgPSBuZXcgV2Vha01hcDxcbiAgTWFya2Rvd25PcHRpb25zLFxuICBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVQcm9jZXNzb3I+PlxuPigpXG5cbmZ1bmN0aW9uIHJlYWRQcm9jZXNzb3IoXG4gIG9wdGlvbnM6IE1hcmtkb3duT3B0aW9ucyxcbiAgZm9ybWF0OiBcIm1kXCIgfCBcIm1keFwiLFxuICBvdXRwdXRGb3JtYXQ6IFwicHJvZ3JhbVwiIHwgXCJmdW5jdGlvbi1ib2R5XCIsXG4gIHR3b3NsYXNoOiBib29sZWFuLFxuKSB7XG4gIGxldCB2YXJpYW50cyA9IHByb2Nlc3NvcnMuZ2V0KG9wdGlvbnMpXG4gIGlmICghdmFyaWFudHMpIHtcbiAgICB2YXJpYW50cyA9IG5ldyBNYXAoKVxuICAgIHByb2Nlc3NvcnMuc2V0KG9wdGlvbnMsIHZhcmlhbnRzKVxuICB9XG4gIGNvbnN0IGtleSA9IGAke2Zvcm1hdH06JHtvdXRwdXRGb3JtYXR9OiR7dHdvc2xhc2h9YFxuICBsZXQgcHJvY2Vzc29yID0gdmFyaWFudHMuZ2V0KGtleSlcbiAgaWYgKCFwcm9jZXNzb3IpIHtcbiAgICBwcm9jZXNzb3IgPSBjcmVhdGVQcm9jZXNzb3Ioe1xuICAgICAgZm9ybWF0LFxuICAgICAgdHdvc2xhc2gsXG4gICAgICBvdXRwdXRGb3JtYXQsXG4gICAgICBhbGxvd0Rhbmdlcm91c0h0bWw6IG9wdGlvbnMuYWxsb3dEYW5nZXJvdXNIdG1sID8/IHRydWUsXG4gICAgICAvLyBMaXZlbWFyaydzIG93biBkZWZhdWx0cyBpbiBtb2RlbHMvY29uZmlnLnRzXG4gICAgICBjb2RlVGhlbWVMaWdodDogb3B0aW9ucy5jb2RlVGhlbWVMaWdodCA/PyBcImNhdHBwdWNjaW4tbGF0dGVcIixcbiAgICAgIGNvZGVUaGVtZURhcms6IG9wdGlvbnMuY29kZVRoZW1lRGFyayA/PyBcImNhdHBwdWNjaW4tbW9jaGFcIixcbiAgICAgIHBsdWdpbnM6IG9wdGlvbnMucGx1Z2lucyxcbiAgICAgIHJvb3Q6IG9wdGlvbnMucm9vdCxcbiAgICAgIGJhc2U6IG9wdGlvbnMuYmFzZSxcbiAgICB9KVxuICAgIHZhcmlhbnRzLnNldChrZXksIHByb2Nlc3NvcilcbiAgfVxuICByZXR1cm4gcHJvY2Vzc29yXG59XG4iXX0=
@@ -0,0 +1,17 @@
1
+ import type { MarkdownPlugins } from "../../models/plugins.ts";
2
+ /** The frozen textlane processor Markdown compiles with: Markdown or MDX, with the
3
+ * twoslash stage only for documents that have a `twoslash` fence, and the `plugins`
4
+ * in their two slots. */
5
+ export declare function createProcessor(props: {
6
+ format: "md" | "mdx";
7
+ twoslash: boolean;
8
+ outputFormat: "program" | "function-body";
9
+ allowDangerousHtml: boolean;
10
+ codeThemeLight: string;
11
+ codeThemeDark: string;
12
+ plugins?: MarkdownPlugins;
13
+ root?: string;
14
+ base?: string;
15
+ }): import("textlane").Processor<import("mdast").Root>;
16
+ /** Every directive name an article may use; any other renders as its source text. */
17
+ export declare const DIRECTIVE_NAMES: Set<string>;
@@ -0,0 +1,212 @@
1
+ import { textlane } from "textlane";
2
+ import * as html from "textlane/html";
3
+ import * as md from "textlane/md";
4
+ import * as mdx from "textlane/mdx";
5
+ import { twoslashStage } from "../../plugins/twoslash.js";
6
+ /** The frozen textlane processor Markdown compiles with: Markdown or MDX, with the
7
+ * twoslash stage only for documents that have a `twoslash` fence, and the `plugins`
8
+ * in their two slots. */
9
+ export function createProcessor(props) {
10
+ const themes = { light: props.codeThemeLight, dark: props.codeThemeDark };
11
+ const processor = textlane()
12
+ .use(md.parse())
13
+ .use(md.gfm())
14
+ .use(md.gemoji())
15
+ .use(md.definitionList())
16
+ .use(md.math())
17
+ .use(md.directive());
18
+ if (props.format === "mdx")
19
+ processor.use(md.mdx());
20
+ // Before md.component, which renders an unknown directive as its source text
21
+ processor
22
+ .use(props.plugins?.md ?? [])
23
+ .use(md.headingId({ attributes: true, markers: HEADING_MARKERS }))
24
+ .use(md.packageCommand({ component: "PackageTabs" }))
25
+ .use(md.component(COMPONENTS));
26
+ if (props.root !== undefined) {
27
+ processor.use(md.pathRewrite({ root: props.root, base: props.base, nodes: ["image"] }));
28
+ }
29
+ processor.use(md.toHtml({
30
+ allowDangerousHtml: props.allowDangerousHtml,
31
+ taskListLabels: TASK_LIST_LABELS,
32
+ }));
33
+ // html.katex first, or display math is a `<pre><code>` html.highlight takes for code
34
+ processor.use(html.katex()).use(html.highlight({
35
+ themes,
36
+ // a fence with no or an unknown language still gets padding, theme colors and
37
+ // transformers
38
+ defaultLanguage: "text",
39
+ fallbackLanguage: "text",
40
+ // catppuccin-latte's green (3.2:1) and comment grey (3.8:1) sit under WCAG AA on
41
+ // the code background
42
+ colorReplacements: {
43
+ "catppuccin-latte": { "#40a02b": "#2a7e16", "#7c7f93": "#6c6f85" },
44
+ },
45
+ addLanguageClass: true,
46
+ metaProperty: "data-meta",
47
+ inline: "tailing-curly-colon",
48
+ transformers: [
49
+ "notationDiff",
50
+ "notationFocus",
51
+ "notationHighlight",
52
+ "notationErrorLevel",
53
+ "metaHighlight",
54
+ "metaWordHighlight",
55
+ ],
56
+ }));
57
+ // html.raw rebuilds every element and drops `data`, where code keeps its meta for
58
+ // html.highlight
59
+ // Without allowDangerousHtml md.toHtml has dropped raw HTML, which html.raw would parse
60
+ if (props.format === "md" && props.allowDangerousHtml) {
61
+ processor.use(html.raw({ passThrough: MDX_NODE_TYPES }));
62
+ }
63
+ processor.use(html.unwrapImages());
64
+ if (props.twoslash)
65
+ processor.use(twoslashStage, { themes });
66
+ return processor
67
+ .use(props.plugins?.html ?? [])
68
+ .use(html.slug())
69
+ .use(html.extractToc({ skip: ["data-step", "data-toc-hidden"] }))
70
+ .use(mdx.compile({ outputFormat: props.outputFormat }))
71
+ .freeze();
72
+ }
73
+ const HEADING_MARKERS = {
74
+ "[step]": { "data-step": true },
75
+ "[!toc]": { "data-toc-hidden": true },
76
+ "[toc]": { hidden: true },
77
+ };
78
+ const TASK_LIST_LABELS = { checked: "Completed task", unchecked: "Task" };
79
+ // md.toHtml hands MDX nodes to hast, which html.raw must leave as they are
80
+ const MDX_NODE_TYPES = [
81
+ "mdxFlowExpression",
82
+ "mdxJsxFlowElement",
83
+ "mdxJsxTextElement",
84
+ "mdxTextExpression",
85
+ "mdxjsEsm",
86
+ ];
87
+ const CALLOUTS = ["note", "tip", "info", "warning", "danger"];
88
+ // Each livemark directive, alert and node as the component it renders
89
+ const COMPONENTS = {
90
+ directives: [
91
+ {
92
+ name: CALLOUTS,
93
+ kind: "container",
94
+ component: "Callout",
95
+ nameAs: "type",
96
+ labelAs: "title",
97
+ attributes: [],
98
+ },
99
+ {
100
+ name: "card",
101
+ kind: "container",
102
+ component: "Card",
103
+ attributes: [{ name: "title", default: "" }, "href", "icon"],
104
+ group: { component: "Cards" },
105
+ },
106
+ {
107
+ name: "column",
108
+ kind: "container",
109
+ component: "Column",
110
+ attributes: [],
111
+ group: { component: "Columns" },
112
+ },
113
+ {
114
+ name: "tab",
115
+ kind: "container",
116
+ component: "Tab",
117
+ attributes: [{ name: "title", default: "" }, "sync"],
118
+ group: { component: "Tabs", min: 1, inherit: ["sync"] },
119
+ },
120
+ {
121
+ name: "details",
122
+ kind: "container",
123
+ component: "Details",
124
+ labelAs: "summary",
125
+ labelDefault: "Details",
126
+ attributes: [],
127
+ },
128
+ {
129
+ name: "filetree",
130
+ kind: "container",
131
+ component: "Filetree",
132
+ attributes: [],
133
+ treeAs: "tree",
134
+ },
135
+ {
136
+ name: "badge",
137
+ kind: "text",
138
+ component: "Badge",
139
+ labelAs: "label",
140
+ attributes: ["variant"],
141
+ },
142
+ {
143
+ name: "button",
144
+ kind: "leaf",
145
+ component: "Button",
146
+ labelAs: "label",
147
+ attributes: ["href", "label", "variant", "size"],
148
+ required: ["href", "label"],
149
+ },
150
+ {
151
+ name: "icon",
152
+ kind: "text",
153
+ component: "Icon",
154
+ attributes: ["name", "className"],
155
+ required: ["name"],
156
+ },
157
+ {
158
+ name: "abbr",
159
+ kind: "text",
160
+ component: "Abbr",
161
+ labelAs: "text",
162
+ attributes: [{ name: "title", default: "" }],
163
+ },
164
+ {
165
+ name: "toc",
166
+ kind: "leaf",
167
+ component: "Toc",
168
+ attributes: ["maxLevel"],
169
+ },
170
+ {
171
+ name: "video",
172
+ kind: "leaf",
173
+ where: { type: "youtube" },
174
+ component: "Video",
175
+ attributes: ["url"],
176
+ required: ["url"],
177
+ },
178
+ {
179
+ name: "audio",
180
+ kind: "leaf",
181
+ where: { type: "soundcloud" },
182
+ component: "Audio",
183
+ attributes: ["url"],
184
+ required: ["url"],
185
+ },
186
+ ],
187
+ alerts: {
188
+ component: "Callout",
189
+ typeAs: "type",
190
+ types: {
191
+ NOTE: "note",
192
+ TIP: "tip",
193
+ WARNING: "warning",
194
+ CAUTION: "danger",
195
+ IMPORTANT: "info",
196
+ },
197
+ },
198
+ nodes: {
199
+ defList: "DefinitionList",
200
+ defListTerm: "DefinitionTerm",
201
+ defListDescription: "DefinitionDetail",
202
+ },
203
+ codes: [
204
+ { lang: "mermaid", component: "Mermaid" },
205
+ { lang: "ansi", component: "AnsiCode" },
206
+ { meta: "tab", group: { component: "CodeTabs", collect: "tabs", inherit: ["sync"] } },
207
+ ],
208
+ unknownDirectives: "source",
209
+ };
210
+ /** Every directive name an article may use; any other renders as its source text. */
211
+ export const DIRECTIVE_NAMES = new Set(COMPONENTS.directives.flatMap(directive => directive.name));
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc291cmNlL2FjdGlvbnMvcHJvY2Vzc29yL2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ25DLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFBO0FBQ3JDLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ2pDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFBO0FBRW5DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUV6RDs7MEJBRTBCO0FBQzFCLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FVL0I7SUFDQyxNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDekUsTUFBTSxTQUFTLEdBQUcsUUFBUSxFQUFFO1NBQ3pCLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDZCxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDdEIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUs7UUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQ25ELDZFQUE2RTtJQUM3RSxTQUFTO1NBQ04sR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUs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RSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7UUFDekMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUU7UUFDdkMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO0tBQ3RGO0lBQ0QsaUJBQWlCLEVBQUUsUUFBaUI7Q0FDckMsQ0FBQTtBQUVELHFGQUFxRjtBQUNyRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQ3BDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUMzRCxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdGV4dGxhbmUgfSBmcm9tIFwidGV4dGxhbmVcIlxuaW1wb3J0ICogYXMgaHRtbCBmcm9tIFwidGV4dGxhbmUvaHRtbFwiXG5pbXBvcnQgKiBhcyBtZCBmcm9tIFwidGV4dGxhbmUvbWRcIlxuaW1wb3J0ICogYXMgbWR4IGZyb20gXCJ0ZXh0bGFuZS9tZHhcIlxuaW1wb3J0IHR5cGUgeyBNYXJrZG93blBsdWdpbnMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3BsdWdpbnMudHNcIlxuaW1wb3J0IHsgdHdvc2xhc2hTdGFnZSB9IGZyb20gXCIuLi8uLi9wbHVnaW5zL3R3b3NsYXNoLnRzXCJcblxuLyoqIFRoZSBmcm96ZW4gdGV4dGxhbmUgcHJvY2Vzc29yIE1hcmtkb3duIGNvbXBpbGVzIHdpdGg6IE1hcmtkb3duIG9yIE1EWCwgd2l0aCB0aGVcbiAqICB0d29zbGFzaCBzdGFnZSBvbmx5IGZvciBkb2N1bWVudHMgdGhhdCBoYXZlIGEgYHR3b3NsYXNoYCBmZW5jZSwgYW5kIHRoZSBgcGx1Z2luc2BcbiAqICBpbiB0aGVpciB0d28gc2xvdHMuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvY2Vzc29yKHByb3BzOiB7XG4gIGZvcm1hdDogXCJtZFwiIHwgXCJtZHhcIlxuICB0d29zbGFzaDogYm9vbGVhblxuICBvdXRwdXRGb3JtYXQ6IFwicHJvZ3JhbVwiIHwgXCJmdW5jdGlvbi1ib2R5XCJcbiAgYWxsb3dEYW5nZXJvdXNIdG1sOiBib29sZWFuXG4gIGNvZGVUaGVtZUxpZ2h0OiBzdHJpbmdcbiAgY29kZVRoZW1lRGFyazogc3RyaW5nXG4gIHBsdWdpbnM/OiBNYXJrZG93blBsdWdpbnNcbiAgcm9vdD86IHN0cmluZ1xuICBiYXNlPzogc3RyaW5nXG59KSB7XG4gIGNvbnN0IHRoZW1lcyA9IHsgbGlnaHQ6IHByb3BzLmNvZGVUaGVtZUxpZ2h0LCBkYXJrOiBwcm9wcy5jb2RlVGhlbWVEYXJrIH1cbiAgY29uc3QgcHJvY2Vzc29yID0gdGV4dGxhbmUoKVxuICAgIC51c2UobWQucGFyc2UoKSlcbiAgICAudXNlKG1kLmdmbSgpKVxuICAgIC51c2UobWQuZ2Vtb2ppKCkpXG4gICAgLnVzZShtZC5kZWZpbml0aW9uTGlzdCgpKVxuICAgIC51c2UobWQubWF0aCgpKVxuICAgIC51c2UobWQuZGlyZWN0aXZlKCkpXG4gIGlmIChwcm9wcy5mb3JtYXQgPT09IFwibWR4XCIpIHByb2Nlc3Nvci51c2UobWQubWR4KCkpXG4gIC8vIEJlZm9yZSBtZC5jb21wb25lbnQsIHdoaWNoIHJlbmRlcnMgYW4gdW5rbm93biBkaXJlY3RpdmUgYXMgaXRzIHNvdXJjZSB0ZXh0XG4gIHByb2Nlc3NvclxuICAgIC51c2UocHJvcHMucGx1Z2lucz8ubWQgPz8gW10pXG4gICAgLnVzZShtZC5oZWFkaW5nSWQoeyBhdHRyaWJ1dGVzOiB0cnVlLCBtYXJrZXJzOiBIRUFESU5HX01BUktFUlMgfSkpXG4gICAgLnVzZShtZC5wYWNrYWdlQ29tbWFuZCh7IGNvbXBvbmVudDogXCJQYWNrYWdlVGFic1wiIH0pKVxuICAgIC51c2UobWQuY29tcG9uZW50KENPTVBPTkVOVFMpKVxuICBpZiAocHJvcHMucm9vdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcHJvY2Vzc29yLnVzZShcbiAgICAgIG1kLnBhdGhSZXdyaXRlKHsgcm9vdDogcHJvcHMucm9vdCwgYmFzZTogcHJvcHMuYmFzZSwgbm9kZXM6IFtcImltYWdlXCJdIH0pLFxuICAgIClcbiAgfVxuICBwcm9jZXNzb3IudXNlKFxuICAgIG1kLnRvSHRtbCh7XG4gICAgICBhbGxvd0Rhbmdlcm91c0h0bWw6IHByb3BzLmFsbG93RGFuZ2Vyb3VzSHRtbCxcbiAgICAgIHRhc2tMaXN0TGFiZWxzOiBUQVNLX0xJU1RfTEFCRUxTLFxuICAgIH0pLFxuICApXG4gIC8vIGh0bWwua2F0ZXggZmlyc3QsIG9yIGRpc3BsYXkgbWF0aCBpcyBhIGA8cHJlPjxjb2RlPmAgaHRtbC5oaWdobGlnaHQgdGFrZXMgZm9yIGNvZGVcbiAgcHJvY2Vzc29yLnVzZShodG1sLmthdGV4KCkpLnVzZShcbiAgICBodG1sLmhpZ2hsaWdodCh7XG4gICAgICB0aGVtZXMsXG4gICAgICAvLyBhIGZlbmNlIHdpdGggbm8gb3IgYW4gdW5rbm93biBsYW5ndWFnZSBzdGlsbCBnZXRzIHBhZGRpbmcsIHRoZW1lIGNvbG9ycyBhbmRcbiAgICAgIC8vIHRyYW5zZm9ybWVyc1xuICAgICAgZGVmYXVsdExhbmd1YWdlOiBcInRleHRcIixcbiAgICAgIGZhbGxiYWNrTGFuZ3VhZ2U6IFwidGV4dFwiLFxuICAgICAgLy8gY2F0cHB1Y2Npbi1sYXR0ZSdzIGdyZWVuICgzLjI6MSkgYW5kIGNvbW1lbnQgZ3JleSAoMy44OjEpIHNpdCB1bmRlciBXQ0FHIEFBIG9uXG4gICAgICAvLyB0aGUgY29kZSBiYWNrZ3JvdW5kXG4gICAgICBjb2xvclJlcGxhY2VtZW50czoge1xuICAgICAgICBcImNhdHBwdWNjaW4tbGF0dGVcIjogeyBcIiM0MGEwMmJcIjogXCIjMmE3ZTE2XCIsIFwiIzdjN2Y5M1wiOiBcIiM2YzZmODVcIiB9LFxuICAgICAgfSxcbiAgICAgIGFkZExhbmd1YWdlQ2xhc3M6IHRydWUsXG4gICAgICBtZXRhUHJvcGVydHk6IFwiZGF0YS1tZXRhXCIsXG4gICAgICBpbmxpbmU6IFwidGFpbGluZy1jdXJseS1jb2xvblwiLFxuICAgICAgdHJhbnNmb3JtZXJzOiBbXG4gICAgICAgIFwibm90YXRpb25EaWZmXCIsXG4gICAgICAgIFwibm90YXRpb25Gb2N1c1wiLFxuICAgICAgICBcIm5vdGF0aW9uSGlnaGxpZ2h0XCIsXG4gICAgICAgIFwibm90YXRpb25FcnJvckxldmVsXCIsXG4gICAgICAgIFwibWV0YUhpZ2hsaWdodFwiLFxuICAgICAgICBcIm1ldGFXb3JkSGlnaGxpZ2h0XCIsXG4gICAgICBdLFxuICAgIH0pLFxuICApXG4gIC8vIGh0bWwucmF3IHJlYnVpbGRzIGV2ZXJ5IGVsZW1lbnQgYW5kIGRyb3BzIGBkYXRhYCwgd2hlcmUgY29kZSBrZWVwcyBpdHMgbWV0YSBmb3JcbiAgLy8gaHRtbC5oaWdobGlnaHRcbiAgLy8gV2l0aG91dCBhbGxvd0Rhbmdlcm91c0h0bWwgbWQudG9IdG1sIGhhcyBkcm9wcGVkIHJhdyBIVE1MLCB3aGljaCBodG1sLnJhdyB3b3VsZCBwYXJzZVxuICBpZiAocHJvcHMuZm9ybWF0ID09PSBcIm1kXCIgJiYgcHJvcHMuYWxsb3dEYW5nZXJvdXNIdG1sKSB7XG4gICAgcHJvY2Vzc29yLnVzZShodG1sLnJhdyh7IHBhc3NUaHJvdWdoOiBNRFhfTk9ERV9UWVBFUyB9KSlcbiAgfVxuICBwcm9jZXNzb3IudXNlKGh0bWwudW53cmFwSW1hZ2VzKCkpXG4gIGlmIChwcm9wcy50d29zbGFzaCkgcHJvY2Vzc29yLnVzZSh0d29zbGFzaFN0YWdlLCB7IHRoZW1lcyB9KVxuICByZXR1cm4gcHJvY2Vzc29yXG4gICAgLnVzZShwcm9wcy5wbHVnaW5zPy5odG1sID8/IFtdKVxuICAgIC51c2UoaHRtbC5zbHVnKCkpXG4gICAgLnVzZShodG1sLmV4dHJhY3RUb2MoeyBza2lwOiBbXCJkYXRhLXN0ZXBcIiwgXCJkYXRhLXRvYy1oaWRkZW5cIl0gfSkpXG4gICAgLnVzZShtZHguY29tcGlsZSh7IG91dHB1dEZvcm1hdDogcHJvcHMub3V0cHV0Rm9ybWF0IH0pKVxuICAgIC5mcmVlemUoKVxufVxuXG5jb25zdCBIRUFESU5HX01BUktFUlMgPSB7XG4gIFwiW3N0ZXBdXCI6IHsgXCJkYXRhLXN0ZXBcIjogdHJ1ZSB9LFxuICBcIlshdG9jXVwiOiB7IFwiZGF0YS10b2MtaGlkZGVuXCI6IHRydWUgfSxcbiAgXCJbdG9jXVwiOiB7IGhpZGRlbjogdHJ1ZSB9LFxufVxuXG5jb25zdCBUQVNLX0xJU1RfTEFCRUxTID0geyBjaGVja2VkOiBcIkNvbXBsZXRlZCB0YXNrXCIsIHVuY2hlY2tlZDogXCJUYXNrXCIgfVxuXG4vLyBtZC50b0h0bWwgaGFuZHMgTURYIG5vZGVzIHRvIGhhc3QsIHdoaWNoIGh0bWwucmF3IG11c3QgbGVhdmUgYXMgdGhleSBhcmVcbmNvbnN0IE1EWF9OT0RFX1RZUEVTID0gW1xuICBcIm1keEZsb3dFeHByZXNzaW9uXCIsXG4gIFwibWR4SnN4Rmxvd0VsZW1lbnRcIixcbiAgXCJtZHhKc3hUZXh0RWxlbWVudFwiLFxuICBcIm1keFRleHRFeHByZXNzaW9uXCIsXG4gIFwibWR4anNFc21cIixcbl1cblxuY29uc3QgQ0FMTE9VVFMgPSBbXCJub3RlXCIsIFwidGlwXCIsIFwiaW5mb1wiLCBcIndhcm5pbmdcIiwgXCJkYW5nZXJcIl1cblxuLy8gRWFjaCBsaXZlbWFyayBkaXJlY3RpdmUsIGFsZXJ0IGFuZCBub2RlIGFzIHRoZSBjb21wb25lbnQgaXQgcmVuZGVyc1xuY29uc3QgQ09NUE9ORU5UUyA9IHtcbiAgZGlyZWN0aXZlczogW1xuICAgIHtcbiAgICAgIG5hbWU6IENBTExPVVRTLFxuICAgICAga2luZDogXCJjb250YWluZXJcIiBhcyBjb25zdCxcbiAgICAgIGNvbXBvbmVudDogXCJDYWxsb3V0XCIsXG4gICAgICBuYW1lQXM6IFwidHlwZVwiLFxuICAgICAgbGFiZWxBczogXCJ0aXRsZVwiLFxuICAgICAgYXR0cmlidXRlczogW10sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNhcmRcIixcbiAgICAgIGtpbmQ6IFwiY29udGFpbmVyXCIgYXMgY29uc3QsXG4gICAgICBjb21wb25lbnQ6IFwiQ2FyZFwiLFxuICAgICAgYXR0cmlidXRlczogW3sgbmFtZTogXCJ0aXRsZVwiLCBkZWZhdWx0OiBcIlwiIH0sIFwiaHJlZlwiLCBcImljb25cIl0sXG4gICAgICBncm91cDogeyBjb21wb25lbnQ6IFwiQ2FyZHNcIiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb2x1bW5cIixcbiAgICAgIGtpbmQ6IFwiY29udGFpbmVyXCIgYXMgY29uc3QsXG4gICAgICBjb21wb25lbnQ6IFwiQ29sdW1uXCIsXG4gICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgIGdyb3VwOiB7IGNvbXBvbmVudDogXCJDb2x1bW5zXCIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidGFiXCIsXG4gICAgICBraW5kOiBcImNvbnRhaW5lclwiIGFzIGNvbnN0LFxuICAgICAgY29tcG9uZW50OiBcIlRhYlwiLFxuICAgICAgYXR0cmlidXRlczogW3sgbmFtZTogXCJ0aXRsZVwiLCBkZWZhdWx0OiBcIlwiIH0sIFwic3luY1wiXSxcbiAgICAgIGdyb3VwOiB7IGNvbXBvbmVudDogXCJUYWJzXCIsIG1pbjogMSwgaW5oZXJpdDogW1wic3luY1wiXSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJkZXRhaWxzXCIsXG4gICAgICBraW5kOiBcImNvbnRhaW5lclwiIGFzIGNvbnN0LFxuICAgICAgY29tcG9uZW50OiBcIkRldGFpbHNcIixcbiAgICAgIGxhYmVsQXM6IFwic3VtbWFyeVwiLFxuICAgICAgbGFiZWxEZWZhdWx0OiBcIkRldGFpbHNcIixcbiAgICAgIGF0dHJpYnV0ZXM6IFtdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJmaWxldHJlZVwiLFxuICAgICAga2luZDogXCJjb250YWluZXJcIiBhcyBjb25zdCxcbiAgICAgIGNvbXBvbmVudDogXCJGaWxldHJlZVwiLFxuICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICB0cmVlQXM6IFwidHJlZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJiYWRnZVwiLFxuICAgICAga2luZDogXCJ0ZXh0XCIgYXMgY29uc3QsXG4gICAgICBjb21wb25lbnQ6IFwiQmFkZ2VcIixcbiAgICAgIGxhYmVsQXM6IFwibGFiZWxcIixcbiAgICAgIGF0dHJpYnV0ZXM6IFtcInZhcmlhbnRcIl0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImJ1dHRvblwiLFxuICAgICAga2luZDogXCJsZWFmXCIgYXMgY29uc3QsXG4gICAgICBjb21wb25lbnQ6IFwiQnV0dG9uXCIsXG4gICAgICBsYWJlbEFzOiBcImxhYmVsXCIsXG4gICAgICBhdHRyaWJ1dGVzOiBbXCJocmVmXCIsIFwibGFiZWxcIiwgXCJ2YXJpYW50XCIsIFwic2l6ZVwiXSxcbiAgICAgIHJlcXVpcmVkOiBbXCJocmVmXCIsIFwibGFiZWxcIl0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImljb25cIixcbiAgICAgIGtpbmQ6IFwidGV4dFwiIGFzIGNvbnN0LFxuICAgICAgY29tcG9uZW50OiBcIkljb25cIixcbiAgICAgIGF0dHJpYnV0ZXM6IFtcIm5hbWVcIiwgXCJjbGFzc05hbWVcIl0sXG4gICAgICByZXF1aXJlZDogW1wibmFtZVwiXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYWJiclwiLFxuICAgICAga2luZDogXCJ0ZXh0XCIgYXMgY29uc3QsXG4gICAgICBjb21wb25lbnQ6IFwiQWJiclwiLFxuICAgICAgbGFiZWxBczogXCJ0ZXh0XCIsXG4gICAgICBhdHRyaWJ1dGVzOiBbeyBuYW1lOiBcInRpdGxlXCIsIGRlZmF1bHQ6IFwiXCIgfV0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRvY1wiLFxuICAgICAga2luZDogXCJsZWFmXCIgYXMgY29uc3QsXG4gICAgICBjb21wb25lbnQ6IFwiVG9jXCIsXG4gICAgICBhdHRyaWJ1dGVzOiBbXCJtYXhMZXZlbFwiXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidmlkZW9cIixcbiAgICAgIGtpbmQ6IFwibGVhZlwiIGFzIGNvbnN0LFxuICAgICAgd2hlcmU6IHsgdHlwZTogXCJ5b3V0dWJlXCIgfSxcbiAgICAgIGNvbXBvbmVudDogXCJWaWRlb1wiLFxuICAgICAgYXR0cmlidXRlczogW1widXJsXCJdLFxuICAgICAgcmVxdWlyZWQ6IFtcInVybFwiXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYXVkaW9cIixcbiAgICAgIGtpbmQ6IFwibGVhZlwiIGFzIGNvbnN0LFxuICAgICAgd2hlcmU6IHsgdHlwZTogXCJzb3VuZGNsb3VkXCIgfSxcbiAgICAgIGNvbXBvbmVudDogXCJBdWRpb1wiLFxuICAgICAgYXR0cmlidXRlczogW1widXJsXCJdLFxuICAgICAgcmVxdWlyZWQ6IFtcInVybFwiXSxcbiAgICB9LFxuICBdLFxuICBhbGVydHM6IHtcbiAgICBjb21wb25lbnQ6IFwiQ2FsbG91dFwiLFxuICAgIHR5cGVBczogXCJ0eXBlXCIsXG4gICAgdHlwZXM6IHtcbiAgICAgIE5PVEU6IFwibm90ZVwiLFxuICAgICAgVElQOiBcInRpcFwiLFxuICAgICAgV0FSTklORzogXCJ3YXJuaW5nXCIsXG4gICAgICBDQVVUSU9OOiBcImRhbmdlclwiLFxuICAgICAgSU1QT1JUQU5UOiBcImluZm9cIixcbiAgICB9LFxuICB9LFxuICBub2Rlczoge1xuICAgIGRlZkxpc3Q6IFwiRGVmaW5pdGlvbkxpc3RcIixcbiAgICBkZWZMaXN0VGVybTogXCJEZWZpbml0aW9uVGVybVwiLFxuICAgIGRlZkxpc3REZXNjcmlwdGlvbjogXCJEZWZpbml0aW9uRGV0YWlsXCIsXG4gIH0sXG4gIGNvZGVzOiBbXG4gICAgeyBsYW5nOiBcIm1lcm1haWRcIiwgY29tcG9uZW50OiBcIk1lcm1haWRcIiB9LFxuICAgIHsgbGFuZzogXCJhbnNpXCIsIGNvbXBvbmVudDogXCJBbnNpQ29kZVwiIH0sXG4gICAgeyBtZXRhOiBcInRhYlwiLCBncm91cDogeyBjb21wb25lbnQ6IFwiQ29kZVRhYnNcIiwgY29sbGVjdDogXCJ0YWJzXCIsIGluaGVyaXQ6IFtcInN5bmNcIl0gfSB9LFxuICBdLFxuICB1bmtub3duRGlyZWN0aXZlczogXCJzb3VyY2VcIiBhcyBjb25zdCxcbn1cblxuLyoqIEV2ZXJ5IGRpcmVjdGl2ZSBuYW1lIGFuIGFydGljbGUgbWF5IHVzZTsgYW55IG90aGVyIHJlbmRlcnMgYXMgaXRzIHNvdXJjZSB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IERJUkVDVElWRV9OQU1FUyA9IG5ldyBTZXQoXG4gIENPTVBPTkVOVFMuZGlyZWN0aXZlcy5mbGF0TWFwKGRpcmVjdGl2ZSA9PiBkaXJlY3RpdmUubmFtZSksXG4pXG4iXX0=
@@ -0,0 +1,5 @@
1
+ /** Renders an abbreviation with a shadcn tooltip showing its full form */
2
+ export declare function Abbr(props: {
3
+ text: string;
4
+ title: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../elements/tooltip.js";
3
+ /** Renders an abbreviation with a shadcn tooltip showing its full form */
4
+ export function Abbr(props) {
5
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { className: "border-b border-dotted border-muted-foreground cursor-help", children: props.text }), _jsx(TooltipContent, { children: props.title })] }));
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJici5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL0FiYnIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBeUIsQ0FBQTtBQUVqRiwwRUFBMEU7QUFDMUUsTUFBTSxVQUFVLElBQUksQ0FBQyxLQUFzQztJQUN6RCxPQUFPLENBQ0wsTUFBQyxPQUFPLGVBQ04sS0FBQyxjQUFjLElBQUMsU0FBUyxFQUFDLDREQUE0RCxZQUNuRixLQUFLLENBQUMsSUFBSSxHQUNJLEVBQ2pCLEtBQUMsY0FBYyxjQUFFLEtBQUssQ0FBQyxLQUFLLEdBQWtCLElBQ3RDLENBQ1gsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb29sdGlwLCBUb29sdGlwQ29udGVudCwgVG9vbHRpcFRyaWdnZXIgfSBmcm9tIFwiLi4vZWxlbWVudHMvdG9vbHRpcC50c3hcIlxuXG4vKiogUmVuZGVycyBhbiBhYmJyZXZpYXRpb24gd2l0aCBhIHNoYWRjbiB0b29sdGlwIHNob3dpbmcgaXRzIGZ1bGwgZm9ybSAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFiYnIocHJvcHM6IHsgdGV4dDogc3RyaW5nOyB0aXRsZTogc3RyaW5nIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8VG9vbHRpcD5cbiAgICAgIDxUb29sdGlwVHJpZ2dlciBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItZG90dGVkIGJvcmRlci1tdXRlZC1mb3JlZ3JvdW5kIGN1cnNvci1oZWxwXCI+XG4gICAgICAgIHtwcm9wcy50ZXh0fVxuICAgICAgPC9Ub29sdGlwVHJpZ2dlcj5cbiAgICAgIDxUb29sdGlwQ29udGVudD57cHJvcHMudGl0bGV9PC9Ub29sdGlwQ29udGVudD5cbiAgICA8L1Rvb2x0aXA+XG4gIClcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ /** Renders terminal output, coloring its ANSI escape sequences */
2
+ export declare function AnsiCode(props: {
3
+ children: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ansiToHtml } from "../helpers/ansi.js";
3
+ /** Renders terminal output, coloring its ANSI escape sequences */
4
+ export function AnsiCode(props) {
5
+ return (_jsx("figure", { className: "shiki not-prose my-4 relative rounded-card border shadow-sm overflow-hidden text-sm bg-sidebar dark:bg-sidebar", children: _jsx("div", { className: "text-[0.8125rem] py-3.5 overflow-auto", children: _jsx("pre", { className: "min-w-full w-max", children: _jsx("code", { className: "flex flex-col", dangerouslySetInnerHTML: { __html: ansiToHtml(props.children) } }) }) }) }));
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5zaUNvZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9BbnNpQ29kZS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUUvQyxrRUFBa0U7QUFDbEUsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUEyQjtJQUNsRCxPQUFPLENBQ0wsaUJBQVEsU0FBUyxFQUFDLGdIQUFnSCxZQUNoSSxjQUFLLFNBQVMsRUFBQyx1Q0FBdUMsWUFDcEQsY0FBSyxTQUFTLEVBQUMsa0JBQWtCLFlBQy9CLGVBQ0UsU0FBUyxFQUFDLGVBQWUsRUFDekIsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUMvRCxHQUNFLEdBQ0YsR0FDQyxDQUNWLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5zaVRvSHRtbCB9IGZyb20gXCIuLi9oZWxwZXJzL2Fuc2kudHNcIlxuXG4vKiogUmVuZGVycyB0ZXJtaW5hbCBvdXRwdXQsIGNvbG9yaW5nIGl0cyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgKi9cbmV4cG9ydCBmdW5jdGlvbiBBbnNpQ29kZShwcm9wczogeyBjaGlsZHJlbjogc3RyaW5nIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZmlndXJlIGNsYXNzTmFtZT1cInNoaWtpIG5vdC1wcm9zZSBteS00IHJlbGF0aXZlIHJvdW5kZWQtY2FyZCBib3JkZXIgc2hhZG93LXNtIG92ZXJmbG93LWhpZGRlbiB0ZXh0LXNtIGJnLXNpZGViYXIgZGFyazpiZy1zaWRlYmFyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzAuODEyNXJlbV0gcHktMy41IG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgPHByZSBjbGFzc05hbWU9XCJtaW4tdy1mdWxsIHctbWF4XCI+XG4gICAgICAgICAgPGNvZGVcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2xcIlxuICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiBhbnNpVG9IdG1sKHByb3BzLmNoaWxkcmVuKSB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvcHJlPlxuICAgICAgPC9kaXY+XG4gICAgPC9maWd1cmU+XG4gIClcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ /** Renders a SoundCloud iframe embed */
2
+ export declare function Audio(props: {
3
+ url: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMessages } from "../hooks/messages.js";
3
+ /** Renders a SoundCloud iframe embed */
4
+ export function Audio(props) {
5
+ const t = useMessages();
6
+ const src = `https://w.soundcloud.com/player/?url=${encodeURIComponent(props.url)}&color=%23ff5500&auto_play=false&hide_related=true&show_comments=false&show_user=true&show_reposts=false&show_teaser=false`;
7
+ return (_jsx("div", { className: "not-prose my-4 overflow-hidden rounded-card border", children: _jsx("iframe", { className: "w-full", height: 166, src: src, title: t("media.soundcloud"), allow: "autoplay" }) }));
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVkaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9BdWRpby50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNsRCx3Q0FBd0M7QUFDeEMsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFzQjtJQUMxQyxNQUFNLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQTtJQUN2QixNQUFNLEdBQUcsR0FBRyx3Q0FBd0Msa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyw0SEFBNEgsQ0FBQTtJQUU3TSxPQUFPLENBQ0wsY0FBSyxTQUFTLEVBQUMsb0RBQW9ELFlBQ2pFLGlCQUNFLFNBQVMsRUFBQyxRQUFRLEVBQ2xCLE1BQU0sRUFBRSxHQUFHLEVBQ1gsR0FBRyxFQUFFLEdBQUcsRUFDUixLQUFLLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQzVCLEtBQUssRUFBQyxVQUFVLEdBQ2hCLEdBQ0UsQ0FDUCxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZU1lc3NhZ2VzIH0gZnJvbSBcIi4uL2hvb2tzL21lc3NhZ2VzLnRzXCJcbi8qKiBSZW5kZXJzIGEgU291bmRDbG91ZCBpZnJhbWUgZW1iZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBBdWRpbyhwcm9wczogeyB1cmw6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHQgPSB1c2VNZXNzYWdlcygpXG4gIGNvbnN0IHNyYyA9IGBodHRwczovL3cuc291bmRjbG91ZC5jb20vcGxheWVyLz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQocHJvcHMudXJsKX0mY29sb3I9JTIzZmY1NTAwJmF1dG9fcGxheT1mYWxzZSZoaWRlX3JlbGF0ZWQ9dHJ1ZSZzaG93X2NvbW1lbnRzPWZhbHNlJnNob3dfdXNlcj10cnVlJnNob3dfcmVwb3N0cz1mYWxzZSZzaG93X3RlYXNlcj1mYWxzZWBcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwibm90LXByb3NlIG15LTQgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtY2FyZCBib3JkZXJcIj5cbiAgICAgIDxpZnJhbWVcbiAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsXCJcbiAgICAgICAgaGVpZ2h0PXsxNjZ9XG4gICAgICAgIHNyYz17c3JjfVxuICAgICAgICB0aXRsZT17dChcIm1lZGlhLnNvdW5kY2xvdWRcIil9XG4gICAgICAgIGFsbG93PVwiYXV0b3BsYXlcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ /** Inline badge rendered from :badge text directives */
2
+ export declare function Badge(props: {
3
+ label: string;
4
+ variant?: "default" | "secondary" | "positive" | "warning" | "destructive" | "outline";
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Badge as BadgeElement } from "../elements/badge.js";
3
+ /** Inline badge rendered from :badge text directives */
4
+ export function Badge(props) {
5
+ return _jsx(BadgeElement, { variant: props.variant, children: props.label });
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9CYWRnZS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sc0JBQXVCLENBQUE7QUFFN0Qsd0RBQXdEO0FBQ3hELE1BQU0sVUFBVSxLQUFLLENBQUMsS0FHckI7SUFDQyxPQUFPLEtBQUMsWUFBWSxJQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxZQUFHLEtBQUssQ0FBQyxLQUFLLEdBQWdCLENBQUE7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhZGdlIGFzIEJhZGdlRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50cy9iYWRnZS50c3hcIlxuXG4vKiogSW5saW5lIGJhZGdlIHJlbmRlcmVkIGZyb20gOmJhZGdlIHRleHQgZGlyZWN0aXZlcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJhZGdlKHByb3BzOiB7XG4gIGxhYmVsOiBzdHJpbmdcbiAgdmFyaWFudD86IFwiZGVmYXVsdFwiIHwgXCJzZWNvbmRhcnlcIiB8IFwicG9zaXRpdmVcIiB8IFwid2FybmluZ1wiIHwgXCJkZXN0cnVjdGl2ZVwiIHwgXCJvdXRsaW5lXCJcbn0pIHtcbiAgcmV0dXJuIDxCYWRnZUVsZW1lbnQgdmFyaWFudD17cHJvcHMudmFyaWFudH0+e3Byb3BzLmxhYmVsfTwvQmFkZ2VFbGVtZW50PlxufVxuIl19
@@ -0,0 +1,7 @@
1
+ /** Styled link button rendered from ::button leaf directives */
2
+ export declare function Button(props: {
3
+ href: string;
4
+ label: string;
5
+ variant?: "default" | "outline" | "secondary" | "ghost" | "positive" | "warning" | "destructive" | "link";
6
+ size?: "default" | "sm" | "lg";
7
+ }): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { buttonVariants } from "../elements/button.js";
3
+ import { cn } from "cn";
4
+ /** Styled link button rendered from ::button leaf directives */
5
+ export function Button(props) {
6
+ return (_jsx("a", { href: props.href, className: cn(buttonVariants({
7
+ variant: props.variant,
8
+ size: props.size,
9
+ }), "no-underline"), children: props.label }));
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnV0dG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvQnV0dG9uLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF3QixDQUFBO0FBQ3ZELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFFdkIsZ0VBQWdFO0FBQ2hFLE1BQU0sVUFBVSxNQUFNLENBQUMsS0FhdEI7SUFDQyxPQUFPLENBQ0wsWUFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFDaEIsU0FBUyxFQUFFLEVBQUUsQ0FDWCxjQUFjLENBQUM7WUFDYixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1NBQ2pCLENBQUMsRUFDRixjQUFjLENBQ2YsWUFFQSxLQUFLLENBQUMsS0FBSyxHQUNWLENBQ0wsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBidXR0b25WYXJpYW50cyB9IGZyb20gXCIuLi9lbGVtZW50cy9idXR0b24udHN4XCJcbmltcG9ydCB7IGNuIH0gZnJvbSBcImNuXCJcblxuLyoqIFN0eWxlZCBsaW5rIGJ1dHRvbiByZW5kZXJlZCBmcm9tIDo6YnV0dG9uIGxlYWYgZGlyZWN0aXZlcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ1dHRvbihwcm9wczoge1xuICBocmVmOiBzdHJpbmdcbiAgbGFiZWw6IHN0cmluZ1xuICB2YXJpYW50PzpcbiAgICB8IFwiZGVmYXVsdFwiXG4gICAgfCBcIm91dGxpbmVcIlxuICAgIHwgXCJzZWNvbmRhcnlcIlxuICAgIHwgXCJnaG9zdFwiXG4gICAgfCBcInBvc2l0aXZlXCJcbiAgICB8IFwid2FybmluZ1wiXG4gICAgfCBcImRlc3RydWN0aXZlXCJcbiAgICB8IFwibGlua1wiXG4gIHNpemU/OiBcImRlZmF1bHRcIiB8IFwic21cIiB8IFwibGdcIlxufSkge1xuICByZXR1cm4gKFxuICAgIDxhXG4gICAgICBocmVmPXtwcm9wcy5ocmVmfVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgYnV0dG9uVmFyaWFudHMoe1xuICAgICAgICAgIHZhcmlhbnQ6IHByb3BzLnZhcmlhbnQsXG4gICAgICAgICAgc2l6ZTogcHJvcHMuc2l6ZSxcbiAgICAgICAgfSksXG4gICAgICAgIFwibm8tdW5kZXJsaW5lXCIsXG4gICAgICApfVxuICAgID5cbiAgICAgIHtwcm9wcy5sYWJlbH1cbiAgICA8L2E+XG4gIClcbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ type CalloutType = "note" | "tip" | "info" | "warning" | "danger";
2
+ /** Styled callout block for notes, tips, warnings, and other admonitions */
3
+ export declare function Callout(props: {
4
+ type?: CalloutType;
5
+ title?: string;
6
+ children: React.ReactNode;
7
+ }): import("react").JSX.Element;
8
+ export {};
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AlertTriangle, Flame, Info, Lightbulb } from "lucide-react";
3
+ import { cn } from "cn";
4
+ import { useMessages } from "../hooks/messages.js";
5
+ const configs = {
6
+ note: {
7
+ icon: Info,
8
+ label: "callout.note",
9
+ classes: "border-blue-500/30 bg-blue-50/50 text-blue-900 dark:bg-blue-950/30 dark:text-blue-200",
10
+ },
11
+ info: {
12
+ icon: Info,
13
+ label: "callout.info",
14
+ classes: "border-blue-500/30 bg-blue-50/50 text-blue-900 dark:bg-blue-950/30 dark:text-blue-200",
15
+ },
16
+ tip: {
17
+ icon: Lightbulb,
18
+ label: "callout.tip",
19
+ classes: "border-positive/30 bg-positive-tint/50 text-positive-tint-foreground",
20
+ },
21
+ warning: {
22
+ icon: AlertTriangle,
23
+ label: "callout.warning",
24
+ classes: "border-warning/30 bg-warning-tint/50 text-warning-tint-foreground",
25
+ },
26
+ danger: {
27
+ icon: Flame,
28
+ label: "callout.danger",
29
+ classes: "border-destructive/30 bg-destructive-tint/50 text-destructive-tint-foreground",
30
+ },
31
+ };
32
+ /** Styled callout block for notes, tips, warnings, and other admonitions */
33
+ export function Callout(props) {
34
+ const t = useMessages();
35
+ const type = props.type ?? "note";
36
+ const config = configs[type];
37
+ const Icon = config.icon;
38
+ const title = props.title ?? t(config.label);
39
+ return (_jsxs("aside", { className: cn("not-prose my-4 rounded-card border px-4 py-3", config.classes), children: [_jsxs("div", { className: "flex items-center gap-2 font-semibold text-sm mb-2", children: [_jsx(Icon, { className: "size-4 shrink-0" }), _jsx("span", { children: title })] }), _jsx("div", { className: "text-sm [&>p]:my-1 [&>p:first-child]:mt-0 [&>p:last-child]:mb-0", children: props.children })] }));
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FsbG91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL0NhbGxvdXQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3BFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBVWxELE1BQU0sT0FBTyxHQUF1QztJQUNsRCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsSUFBSTtRQUNWLEtBQUssRUFBRSxjQUFjO1FBQ3JCLE9BQU8sRUFDTCx1RkFBdUY7S0FDMUY7SUFDRCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsSUFBSTtRQUNWLEtBQUssRUFBRSxjQUFjO1FBQ3JCLE9BQU8sRUFDTCx1RkFBdUY7S0FDMUY7SUFDRCxHQUFHLEVBQUU7UUFDSCxJQUFJLEVBQUUsU0FBUztRQUNmLEtBQUssRUFBRSxhQUFhO1FBQ3BCLE9BQU8sRUFBRSxzRUFBc0U7S0FDaEY7SUFDRCxPQUFPLEVBQUU7UUFDUCxJQUFJLEVBQUUsYUFBYTtRQUNuQixLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLE9BQU8sRUFBRSxtRUFBbUU7S0FDN0U7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsS0FBSztRQUNYLEtBQUssRUFBRSxnQkFBZ0I7UUFDdkIsT0FBTyxFQUNMLCtFQUErRTtLQUNsRjtDQUNGLENBQUE7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUl2QjtJQUNDLE1BQU0sQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFBO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM1QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFBO0lBQ3hCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUU1QyxPQUFPLENBQ0wsaUJBQU8sU0FBUyxFQUFFLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQ2xGLGVBQUssU0FBUyxFQUFDLG9EQUFvRCxhQUNqRSxLQUFDLElBQUksSUFBQyxTQUFTLEVBQUMsaUJBQWlCLEdBQUcsRUFDcEMseUJBQU8sS0FBSyxHQUFRLElBQ2hCLEVBQ04sY0FBSyxTQUFTLEVBQUMsaUVBQWlFLFlBQzdFLEtBQUssQ0FBQyxRQUFRLEdBQ1gsSUFDQSxDQUNULENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWxlcnRUcmlhbmdsZSwgRmxhbWUsIEluZm8sIExpZ2h0YnVsYiB9IGZyb20gXCJsdWNpZGUtcmVhY3RcIlxuaW1wb3J0IHsgY24gfSBmcm9tIFwiY25cIlxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlS2V5IH0gZnJvbSBcIi4uL21vZGVscy9tZXNzYWdlLnRzXCJcbmltcG9ydCB7IHVzZU1lc3NhZ2VzIH0gZnJvbSBcIi4uL2hvb2tzL21lc3NhZ2VzLnRzXCJcblxudHlwZSBDYWxsb3V0VHlwZSA9IFwibm90ZVwiIHwgXCJ0aXBcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuaW5nXCIgfCBcImRhbmdlclwiXG5cbmludGVyZmFjZSBDYWxsb3V0Q29uZmlnIHtcbiAgaWNvbjogUmVhY3QuRWxlbWVudFR5cGVcbiAgbGFiZWw6IE1lc3NhZ2VLZXlcbiAgY2xhc3Nlczogc3RyaW5nXG59XG5cbmNvbnN0IGNvbmZpZ3M6IFJlY29yZDxDYWxsb3V0VHlwZSwgQ2FsbG91dENvbmZpZz4gPSB7XG4gIG5vdGU6IHtcbiAgICBpY29uOiBJbmZvLFxuICAgIGxhYmVsOiBcImNhbGxvdXQubm90ZVwiLFxuICAgIGNsYXNzZXM6XG4gICAgICBcImJvcmRlci1ibHVlLTUwMC8zMCBiZy1ibHVlLTUwLzUwIHRleHQtYmx1ZS05MDAgZGFyazpiZy1ibHVlLTk1MC8zMCBkYXJrOnRleHQtYmx1ZS0yMDBcIixcbiAgfSxcbiAgaW5mbzoge1xuICAgIGljb246IEluZm8sXG4gICAgbGFiZWw6IFwiY2FsbG91dC5pbmZvXCIsXG4gICAgY2xhc3NlczpcbiAgICAgIFwiYm9yZGVyLWJsdWUtNTAwLzMwIGJnLWJsdWUtNTAvNTAgdGV4dC1ibHVlLTkwMCBkYXJrOmJnLWJsdWUtOTUwLzMwIGRhcms6dGV4dC1ibHVlLTIwMFwiLFxuICB9LFxuICB0aXA6IHtcbiAgICBpY29uOiBMaWdodGJ1bGIsXG4gICAgbGFiZWw6IFwiY2FsbG91dC50aXBcIixcbiAgICBjbGFzc2VzOiBcImJvcmRlci1wb3NpdGl2ZS8zMCBiZy1wb3NpdGl2ZS10aW50LzUwIHRleHQtcG9zaXRpdmUtdGludC1mb3JlZ3JvdW5kXCIsXG4gIH0sXG4gIHdhcm5pbmc6IHtcbiAgICBpY29uOiBBbGVydFRyaWFuZ2xlLFxuICAgIGxhYmVsOiBcImNhbGxvdXQud2FybmluZ1wiLFxuICAgIGNsYXNzZXM6IFwiYm9yZGVyLXdhcm5pbmcvMzAgYmctd2FybmluZy10aW50LzUwIHRleHQtd2FybmluZy10aW50LWZvcmVncm91bmRcIixcbiAgfSxcbiAgZGFuZ2VyOiB7XG4gICAgaWNvbjogRmxhbWUsXG4gICAgbGFiZWw6IFwiY2FsbG91dC5kYW5nZXJcIixcbiAgICBjbGFzc2VzOlxuICAgICAgXCJib3JkZXItZGVzdHJ1Y3RpdmUvMzAgYmctZGVzdHJ1Y3RpdmUtdGludC81MCB0ZXh0LWRlc3RydWN0aXZlLXRpbnQtZm9yZWdyb3VuZFwiLFxuICB9LFxufVxuXG4vKiogU3R5bGVkIGNhbGxvdXQgYmxvY2sgZm9yIG5vdGVzLCB0aXBzLCB3YXJuaW5ncywgYW5kIG90aGVyIGFkbW9uaXRpb25zICovXG5leHBvcnQgZnVuY3Rpb24gQ2FsbG91dChwcm9wczoge1xuICB0eXBlPzogQ2FsbG91dFR5cGVcbiAgdGl0bGU/OiBzdHJpbmdcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZVxufSkge1xuICBjb25zdCB0ID0gdXNlTWVzc2FnZXMoKVxuICBjb25zdCB0eXBlID0gcHJvcHMudHlwZSA/PyBcIm5vdGVcIlxuICBjb25zdCBjb25maWcgPSBjb25maWdzW3R5cGVdXG4gIGNvbnN0IEljb24gPSBjb25maWcuaWNvblxuICBjb25zdCB0aXRsZSA9IHByb3BzLnRpdGxlID8/IHQoY29uZmlnLmxhYmVsKVxuXG4gIHJldHVybiAoXG4gICAgPGFzaWRlIGNsYXNzTmFtZT17Y24oXCJub3QtcHJvc2UgbXktNCByb3VuZGVkLWNhcmQgYm9yZGVyIHB4LTQgcHktM1wiLCBjb25maWcuY2xhc3Nlcyl9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBmb250LXNlbWlib2xkIHRleHQtc20gbWItMlwiPlxuICAgICAgICA8SWNvbiBjbGFzc05hbWU9XCJzaXplLTQgc2hyaW5rLTBcIiAvPlxuICAgICAgICA8c3Bhbj57dGl0bGV9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gWyY+cF06bXktMSBbJj5wOmZpcnN0LWNoaWxkXTptdC0wIFsmPnA6bGFzdC1jaGlsZF06bWItMFwiPlxuICAgICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgICA8L2Rpdj5cbiAgICA8L2FzaWRlPlxuICApXG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /** Card component with optional icon, title, description, and link */
2
+ export declare function Card(props: {
3
+ title: string;
4
+ href?: string;
5
+ icon?: string;
6
+ children?: React.ReactNode;
7
+ }): import("react").JSX.Element;
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link } from "@tanstack/react-router";
3
+ import { DynamicIcon } from "../helpers/dynamic-icon.js";
4
+ import { Card as CardElement, CardContent, CardHeader, CardTitle, } from "../elements/card.js";
5
+ /** Card component with optional icon, title, description, and link */
6
+ export function Card(props) {
7
+ const card = (_jsxs(CardElement, { size: "sm", className: "transition-colors hover:bg-accent", children: [_jsx(CardHeader, { children: _jsxs(CardTitle, { className: "flex items-center gap-2", children: [props.icon && (_jsx(DynamicIcon, { name: props.icon, className: "size-5 text-primary" })), props.title] }) }), props.children && (_jsx(CardContent, { children: _jsx("div", { className: "text-muted-foreground text-sm", children: props.children }) }))] }));
8
+ if (props.href?.startsWith("http")) {
9
+ return (_jsx("a", { href: props.href, target: "_blank", rel: "noopener noreferrer", children: card }));
10
+ }
11
+ if (props.href) {
12
+ return _jsx(Link, { to: props.href, children: card });
13
+ }
14
+ return card;
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL0NhcmQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE2QixDQUFBO0FBQ3pELE9BQU8sRUFDTCxJQUFJLElBQUksV0FBVyxFQUNuQixXQUFXLEVBQ1gsVUFBVSxFQUNWLFNBQVMsR0FDVixNQUFNLHFCQUFzQixDQUFBO0FBRTdCLHNFQUFzRTtBQUN0RSxNQUFNLFVBQVUsSUFBSSxDQUFDLEtBS3BCO0lBQ0MsTUFBTSxJQUFJLEdBQUcsQ0FDWCxNQUFDLFdBQVcsSUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLFNBQVMsRUFBQyxtQ0FBbUMsYUFDbEUsS0FBQyxVQUFVLGNBQ1QsTUFBQyxTQUFTLElBQUMsU0FBUyxFQUFDLHlCQUF5QixhQUMzQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQ2IsS0FBQyxXQUFXLElBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFDLHFCQUFxQixHQUFHLENBQ2xFLEVBQ0EsS0FBSyxDQUFDLEtBQUssSUFDRixHQUNELEVBQ1osS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUNqQixLQUFDLFdBQVcsY0FDVixjQUFLLFNBQVMsRUFBQywrQkFBK0IsWUFBRSxLQUFLLENBQUMsUUFBUSxHQUFPLEdBQ3pELENBQ2YsSUFDVyxDQUNmLENBQUE7SUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsT0FBTyxDQUNMLFlBQUcsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLFFBQVEsRUFBQyxHQUFHLEVBQUMscUJBQXFCLFlBQzNELElBQUksR0FDSCxDQUNMLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZixPQUFPLEtBQUMsSUFBSSxJQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxZQUFHLElBQUksR0FBUSxDQUFBO0lBQzVDLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMaW5rIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIlxuaW1wb3J0IHsgRHluYW1pY0ljb24gfSBmcm9tIFwiLi4vaGVscGVycy9keW5hbWljLWljb24udHN4XCJcbmltcG9ydCB7XG4gIENhcmQgYXMgQ2FyZEVsZW1lbnQsXG4gIENhcmRDb250ZW50LFxuICBDYXJkSGVhZGVyLFxuICBDYXJkVGl0bGUsXG59IGZyb20gXCIuLi9lbGVtZW50cy9jYXJkLnRzeFwiXG5cbi8qKiBDYXJkIGNvbXBvbmVudCB3aXRoIG9wdGlvbmFsIGljb24sIHRpdGxlLCBkZXNjcmlwdGlvbiwgYW5kIGxpbmsgKi9cbmV4cG9ydCBmdW5jdGlvbiBDYXJkKHByb3BzOiB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgaHJlZj86IHN0cmluZ1xuICBpY29uPzogc3RyaW5nXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG59KSB7XG4gIGNvbnN0IGNhcmQgPSAoXG4gICAgPENhcmRFbGVtZW50IHNpemU9XCJzbVwiIGNsYXNzTmFtZT1cInRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWFjY2VudFwiPlxuICAgICAgPENhcmRIZWFkZXI+XG4gICAgICAgIDxDYXJkVGl0bGUgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICB7cHJvcHMuaWNvbiAmJiAoXG4gICAgICAgICAgICA8RHluYW1pY0ljb24gbmFtZT17cHJvcHMuaWNvbn0gY2xhc3NOYW1lPVwic2l6ZS01IHRleHQtcHJpbWFyeVwiIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7cHJvcHMudGl0bGV9XG4gICAgICAgIDwvQ2FyZFRpdGxlPlxuICAgICAgPC9DYXJkSGVhZGVyPlxuICAgICAge3Byb3BzLmNoaWxkcmVuICYmIChcbiAgICAgICAgPENhcmRDb250ZW50PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQtc21cIj57cHJvcHMuY2hpbGRyZW59PC9kaXY+XG4gICAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgICApfVxuICAgIDwvQ2FyZEVsZW1lbnQ+XG4gIClcblxuICBpZiAocHJvcHMuaHJlZj8uc3RhcnRzV2l0aChcImh0dHBcIikpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGEgaHJlZj17cHJvcHMuaHJlZn0gdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlxuICAgICAgICB7Y2FyZH1cbiAgICAgIDwvYT5cbiAgICApXG4gIH1cblxuICBpZiAocHJvcHMuaHJlZikge1xuICAgIHJldHVybiA8TGluayB0bz17cHJvcHMuaHJlZn0+e2NhcmR9PC9MaW5rPlxuICB9XG5cbiAgcmV0dXJuIGNhcmRcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ /** Grid container for card components */
2
+ export declare function Cards(props: {
3
+ children: React.ReactNode;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** Grid container for card components */
3
+ export function Cards(props) {
4
+ return (_jsx("div", { className: "not-prose grid grid-cols-1 gap-4 my-4 sm:grid-cols-2", children: props.children }));
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FyZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9DYXJkcy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlDQUF5QztBQUN6QyxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQW9DO0lBQ3hELE9BQU8sQ0FDTCxjQUFLLFNBQVMsRUFBQyxzREFBc0QsWUFDbEUsS0FBSyxDQUFDLFFBQVEsR0FDWCxDQUNQLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEdyaWQgY29udGFpbmVyIGZvciBjYXJkIGNvbXBvbmVudHMgKi9cbmV4cG9ydCBmdW5jdGlvbiBDYXJkcyhwcm9wczogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm5vdC1wcm9zZSBncmlkIGdyaWQtY29scy0xIGdhcC00IG15LTQgc206Z3JpZC1jb2xzLTJcIj5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIl19
@@ -0,0 +1 @@
1
+ export declare function CodeBlock(props: React.ComponentProps<"pre">): import("react").JSX.Element;