@multiplatform.one/markdown 6.1.0 → 6.4.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.
- package/README.md +61 -0
- package/dist/cjs/Aside/index.cjs +37 -32
- package/dist/cjs/Aside/index.native.js +41 -34
- package/dist/cjs/Aside/index.native.js.map +1 -1
- package/dist/cjs/ExternalIcon/index.cjs +2 -0
- package/dist/cjs/ExternalIcon/index.native.js +2 -0
- package/dist/cjs/ExternalIcon/index.native.js.map +1 -1
- package/dist/cjs/Hr/index.cjs +3 -11
- package/dist/cjs/Hr/index.native.js +3 -11
- package/dist/cjs/Hr/index.native.js.map +1 -1
- package/dist/cjs/{SimpleTable → MarkdownSimpleTable}/index.cjs +27 -9
- package/dist/{jsx/SimpleTable → cjs/MarkdownSimpleTable}/index.native.js +32 -11
- package/dist/cjs/MarkdownSimpleTable/index.native.js.map +1 -0
- package/dist/cjs/Mdx/index.cjs +15 -7
- package/dist/cjs/Mdx/index.native.js +15 -7
- package/dist/cjs/Mdx/index.native.js.map +1 -1
- package/dist/cjs/MdxCodeBlock/index.cjs +28 -20
- package/dist/cjs/MdxCodeBlock/index.native.js +33 -22
- package/dist/cjs/MdxCodeBlock/index.native.js.map +1 -1
- package/dist/cjs/Notice/index.cjs +13 -56
- package/dist/cjs/Notice/index.native.js +13 -56
- package/dist/cjs/Notice/index.native.js.map +1 -1
- package/dist/cjs/Table/index.cjs +13 -0
- package/dist/cjs/Table/index.native.js +15 -0
- package/dist/cjs/Table/index.native.js.map +1 -1
- package/dist/cjs/Tabs/index.cjs +15 -47
- package/dist/cjs/Tabs/index.native.js +20 -52
- package/dist/cjs/Tabs/index.native.js.map +1 -1
- package/dist/cjs/Ul/index.cjs +2 -2
- package/dist/cjs/Ul/index.native.js +2 -2
- package/dist/cjs/Ul/index.native.js.map +1 -1
- package/dist/cjs/Video/index.cjs +4 -2
- package/dist/cjs/Video/index.native.js +4 -2
- package/dist/cjs/Video/index.native.js.map +1 -1
- package/dist/cjs/components/Blockquote.cjs +16 -3
- package/dist/cjs/components/Blockquote.native.js +25 -3
- package/dist/cjs/components/Blockquote.native.js.map +1 -1
- package/dist/cjs/components/Break.cjs +1 -0
- package/dist/cjs/components/Break.native.js +1 -0
- package/dist/cjs/components/Break.native.js.map +1 -1
- package/dist/cjs/components/CodeBlock.cjs +20 -60
- package/dist/cjs/components/CodeBlock.native.js +22 -64
- package/dist/cjs/components/CodeBlock.native.js.map +1 -1
- package/dist/cjs/components/Heading.cjs +23 -0
- package/dist/cjs/components/Heading.native.js +24 -0
- package/dist/cjs/components/Heading.native.js.map +1 -1
- package/dist/cjs/components/Image.cjs +3 -5
- package/dist/cjs/components/Image.native.js +6 -5
- package/dist/cjs/components/Image.native.js.map +1 -1
- package/dist/cjs/components/InlineCode.cjs +3 -6
- package/dist/cjs/components/InlineCode.native.js +3 -6
- package/dist/cjs/components/InlineCode.native.js.map +1 -1
- package/dist/cjs/components/InlineStyles.cjs +3 -0
- package/dist/cjs/components/InlineStyles.native.js +3 -0
- package/dist/cjs/components/InlineStyles.native.js.map +1 -1
- package/dist/cjs/components/Link.cjs +22 -5
- package/dist/cjs/components/Link.native.js +23 -5
- package/dist/cjs/components/Link.native.js.map +1 -1
- package/dist/cjs/components/List.cjs +87 -9
- package/dist/cjs/components/List.native.js +91 -9
- package/dist/cjs/components/List.native.js.map +1 -1
- package/dist/cjs/components/Paragraph.cjs +6 -1
- package/dist/cjs/components/Paragraph.native.js +6 -1
- package/dist/cjs/components/Paragraph.native.js.map +1 -1
- package/dist/cjs/components/Table.cjs +57 -24
- package/dist/cjs/components/Table.native.js +67 -25
- package/dist/cjs/components/Table.native.js.map +1 -1
- package/dist/cjs/hooks/useCompileMdx.cjs +61 -28
- package/dist/cjs/hooks/useCompileMdx.native.js +80 -28
- package/dist/cjs/hooks/useCompileMdx.native.js.map +1 -1
- package/dist/cjs/hooks/useEvaluateMdx.cjs +7 -1
- package/dist/cjs/hooks/useEvaluateMdx.native.js +9 -3
- package/dist/cjs/hooks/useEvaluateMdx.native.js.map +1 -1
- package/dist/cjs/icons/index.cjs +31 -101
- package/dist/cjs/icons/index.native.js +36 -116
- package/dist/cjs/icons/index.native.js.map +1 -1
- package/dist/cjs/index.cjs +6 -4
- package/dist/cjs/index.native.js +6 -4
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/mdxComponents.cjs +13 -6
- package/dist/cjs/mdxComponents.native.js +16 -6
- package/dist/cjs/mdxComponents.native.js.map +1 -1
- package/dist/cjs/mermaid/MermaidBlock.cjs +110 -0
- package/dist/cjs/mermaid/MermaidBlock.native.js +41 -0
- package/dist/cjs/mermaid/MermaidBlock.native.js.map +1 -0
- package/dist/cjs/mermaid/index.cjs +31 -0
- package/dist/cjs/mermaid/index.native.js +34 -0
- package/dist/cjs/mermaid/index.native.js.map +1 -0
- package/dist/cjs/mermaid/mountDiagramSvg.cjs +54 -0
- package/dist/cjs/mermaid/mountDiagramSvg.native.js +98 -0
- package/dist/cjs/mermaid/mountDiagramSvg.native.js.map +1 -0
- package/dist/cjs/mermaid/renderMermaidDiagram.cjs +92 -0
- package/dist/cjs/mermaid/renderMermaidDiagram.native.js +110 -0
- package/dist/cjs/mermaid/renderMermaidDiagram.native.js.map +1 -0
- package/dist/cjs/renderer.cjs +9 -1
- package/dist/cjs/renderer.native.js +10 -2
- package/dist/cjs/renderer.native.js.map +1 -1
- package/dist/cjs/shared/colorRamps.cjs +1 -11
- package/dist/cjs/shared/colorRamps.native.js +1 -11
- package/dist/cjs/shared/colorRamps.native.js.map +1 -1
- package/dist/cjs/shared/cutoffGradient.cjs +54 -0
- package/dist/cjs/shared/cutoffGradient.native.js +63 -0
- package/dist/cjs/shared/cutoffGradient.native.js.map +1 -0
- package/dist/cjs/shiki/index.cjs +1 -16
- package/dist/cjs/shiki/index.native.js +0 -15
- package/dist/cjs/shiki/index.native.js.map +1 -1
- package/dist/esm/Aside/index.mjs +39 -34
- package/dist/esm/Aside/index.mjs.map +1 -1
- package/dist/esm/Aside/index.native.js +43 -36
- package/dist/esm/Aside/index.native.js.map +1 -1
- package/dist/esm/ExternalIcon/index.mjs +2 -0
- package/dist/esm/ExternalIcon/index.mjs.map +1 -1
- package/dist/esm/ExternalIcon/index.native.js +2 -0
- package/dist/esm/ExternalIcon/index.native.js.map +1 -1
- package/dist/esm/Hr/index.mjs +4 -12
- package/dist/esm/Hr/index.mjs.map +1 -1
- package/dist/esm/Hr/index.native.js +4 -12
- package/dist/esm/Hr/index.native.js.map +1 -1
- package/dist/esm/{SimpleTable → MarkdownSimpleTable}/index.mjs +24 -6
- package/dist/esm/MarkdownSimpleTable/index.mjs.map +1 -0
- package/dist/esm/{SimpleTable → MarkdownSimpleTable}/index.native.js +29 -8
- package/dist/esm/MarkdownSimpleTable/index.native.js.map +1 -0
- package/dist/esm/Mdx/index.mjs +15 -7
- package/dist/esm/Mdx/index.mjs.map +1 -1
- package/dist/esm/Mdx/index.native.js +15 -7
- package/dist/esm/Mdx/index.native.js.map +1 -1
- package/dist/esm/MdxCodeBlock/index.mjs +30 -22
- package/dist/esm/MdxCodeBlock/index.mjs.map +1 -1
- package/dist/esm/MdxCodeBlock/index.native.js +35 -24
- package/dist/esm/MdxCodeBlock/index.native.js.map +1 -1
- package/dist/esm/Notice/index.mjs +15 -57
- package/dist/esm/Notice/index.mjs.map +1 -1
- package/dist/esm/Notice/index.native.js +15 -57
- package/dist/esm/Notice/index.native.js.map +1 -1
- package/dist/esm/Table/index.mjs +13 -0
- package/dist/esm/Table/index.mjs.map +1 -1
- package/dist/esm/Table/index.native.js +15 -0
- package/dist/esm/Table/index.native.js.map +1 -1
- package/dist/esm/Tabs/index.mjs +17 -49
- package/dist/esm/Tabs/index.mjs.map +1 -1
- package/dist/esm/Tabs/index.native.js +22 -54
- package/dist/esm/Tabs/index.native.js.map +1 -1
- package/dist/esm/Ul/index.mjs +2 -2
- package/dist/esm/Ul/index.mjs.map +1 -1
- package/dist/esm/Ul/index.native.js +2 -2
- package/dist/esm/Ul/index.native.js.map +1 -1
- package/dist/esm/Video/index.mjs +4 -2
- package/dist/esm/Video/index.mjs.map +1 -1
- package/dist/esm/Video/index.native.js +4 -2
- package/dist/esm/Video/index.native.js.map +1 -1
- package/dist/esm/components/Blockquote.mjs +17 -4
- package/dist/esm/components/Blockquote.mjs.map +1 -1
- package/dist/esm/components/Blockquote.native.js +26 -4
- package/dist/esm/components/Blockquote.native.js.map +1 -1
- package/dist/esm/components/Break.mjs +2 -1
- package/dist/esm/components/Break.mjs.map +1 -1
- package/dist/esm/components/Break.native.js +2 -1
- package/dist/esm/components/Break.native.js.map +1 -1
- package/dist/esm/components/CodeBlock.mjs +21 -61
- package/dist/esm/components/CodeBlock.mjs.map +1 -1
- package/dist/esm/components/CodeBlock.native.js +23 -65
- package/dist/esm/components/CodeBlock.native.js.map +1 -1
- package/dist/esm/components/Heading.mjs +24 -1
- package/dist/esm/components/Heading.mjs.map +1 -1
- package/dist/esm/components/Heading.native.js +25 -1
- package/dist/esm/components/Heading.native.js.map +1 -1
- package/dist/esm/components/Image.mjs +3 -5
- package/dist/esm/components/Image.mjs.map +1 -1
- package/dist/esm/components/Image.native.js +6 -5
- package/dist/esm/components/Image.native.js.map +1 -1
- package/dist/esm/components/InlineCode.mjs +3 -6
- package/dist/esm/components/InlineCode.mjs.map +1 -1
- package/dist/esm/components/InlineCode.native.js +3 -6
- package/dist/esm/components/InlineCode.native.js.map +1 -1
- package/dist/esm/components/InlineStyles.mjs +3 -0
- package/dist/esm/components/InlineStyles.mjs.map +1 -1
- package/dist/esm/components/InlineStyles.native.js +3 -0
- package/dist/esm/components/InlineStyles.native.js.map +1 -1
- package/dist/esm/components/Link.mjs +23 -6
- package/dist/esm/components/Link.mjs.map +1 -1
- package/dist/esm/components/Link.native.js +24 -6
- package/dist/esm/components/Link.native.js.map +1 -1
- package/dist/esm/components/List.mjs +88 -10
- package/dist/esm/components/List.mjs.map +1 -1
- package/dist/esm/components/List.native.js +92 -10
- package/dist/esm/components/List.native.js.map +1 -1
- package/dist/esm/components/Paragraph.mjs +6 -1
- package/dist/esm/components/Paragraph.mjs.map +1 -1
- package/dist/esm/components/Paragraph.native.js +6 -1
- package/dist/esm/components/Paragraph.native.js.map +1 -1
- package/dist/esm/components/Table.mjs +59 -26
- package/dist/esm/components/Table.mjs.map +1 -1
- package/dist/esm/components/Table.native.js +69 -27
- package/dist/esm/components/Table.native.js.map +1 -1
- package/dist/esm/hooks/useCompileMdx.mjs +61 -29
- package/dist/esm/hooks/useCompileMdx.mjs.map +1 -1
- package/dist/esm/hooks/useCompileMdx.native.js +80 -29
- package/dist/esm/hooks/useCompileMdx.native.js.map +1 -1
- package/dist/esm/hooks/useEvaluateMdx.mjs +7 -1
- package/dist/esm/hooks/useEvaluateMdx.mjs.map +1 -1
- package/dist/esm/hooks/useEvaluateMdx.native.js +9 -3
- package/dist/esm/hooks/useEvaluateMdx.native.js.map +1 -1
- package/dist/esm/icons/index.mjs +32 -100
- package/dist/esm/icons/index.mjs.map +1 -1
- package/dist/esm/icons/index.native.js +37 -115
- package/dist/esm/icons/index.native.js.map +1 -1
- package/dist/esm/index.mjs +5 -3
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +5 -3
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/mdxComponents.mjs +14 -7
- package/dist/esm/mdxComponents.mjs.map +1 -1
- package/dist/esm/mdxComponents.native.js +17 -7
- package/dist/esm/mdxComponents.native.js.map +1 -1
- package/dist/esm/mermaid/MermaidBlock.mjs +85 -0
- package/dist/esm/mermaid/MermaidBlock.mjs.map +1 -0
- package/dist/esm/mermaid/MermaidBlock.native.js +13 -0
- package/dist/esm/mermaid/MermaidBlock.native.js.map +1 -0
- package/dist/esm/mermaid/index.mjs +4 -0
- package/dist/esm/mermaid/index.mjs.map +1 -0
- package/dist/esm/mermaid/index.native.js +4 -0
- package/dist/esm/mermaid/index.native.js.map +1 -0
- package/dist/esm/mermaid/mountDiagramSvg.mjs +29 -0
- package/dist/esm/mermaid/mountDiagramSvg.mjs.map +1 -0
- package/dist/esm/mermaid/mountDiagramSvg.native.js +70 -0
- package/dist/esm/mermaid/mountDiagramSvg.native.js.map +1 -0
- package/dist/esm/mermaid/renderMermaidDiagram.mjs +55 -0
- package/dist/esm/mermaid/renderMermaidDiagram.mjs.map +1 -0
- package/dist/esm/mermaid/renderMermaidDiagram.native.js +70 -0
- package/dist/esm/mermaid/renderMermaidDiagram.native.js.map +1 -0
- package/dist/esm/renderer.mjs +9 -1
- package/dist/esm/renderer.mjs.map +1 -1
- package/dist/esm/renderer.native.js +10 -2
- package/dist/esm/renderer.native.js.map +1 -1
- package/dist/esm/shared/colorRamps.mjs +1 -10
- package/dist/esm/shared/colorRamps.mjs.map +1 -1
- package/dist/esm/shared/colorRamps.native.js +1 -10
- package/dist/esm/shared/colorRamps.native.js.map +1 -1
- package/dist/esm/shared/cutoffGradient.mjs +28 -0
- package/dist/esm/shared/cutoffGradient.mjs.map +1 -0
- package/dist/esm/shared/cutoffGradient.native.js +34 -0
- package/dist/esm/shared/cutoffGradient.native.js.map +1 -0
- package/dist/esm/shiki/index.mjs +1 -2
- package/dist/esm/shiki/index.mjs.map +1 -1
- package/dist/esm/shiki/index.native.js +1 -2
- package/dist/esm/shiki/index.native.js.map +1 -1
- package/dist/jsx/Aside/index.mjs +39 -34
- package/dist/jsx/Aside/index.mjs.map +1 -1
- package/dist/jsx/Aside/index.native.js +41 -34
- package/dist/jsx/Aside/index.native.js.map +1 -1
- package/dist/jsx/ExternalIcon/index.mjs +2 -0
- package/dist/jsx/ExternalIcon/index.mjs.map +1 -1
- package/dist/jsx/ExternalIcon/index.native.js +2 -0
- package/dist/jsx/ExternalIcon/index.native.js.map +1 -1
- package/dist/jsx/Hr/index.mjs +4 -12
- package/dist/jsx/Hr/index.mjs.map +1 -1
- package/dist/jsx/Hr/index.native.js +3 -11
- package/dist/jsx/Hr/index.native.js.map +1 -1
- package/dist/jsx/{SimpleTable → MarkdownSimpleTable}/index.mjs +24 -6
- package/dist/jsx/MarkdownSimpleTable/index.mjs.map +1 -0
- package/dist/{cjs/SimpleTable → jsx/MarkdownSimpleTable}/index.native.js +32 -11
- package/dist/jsx/MarkdownSimpleTable/index.native.js.map +1 -0
- package/dist/jsx/Mdx/index.mjs +15 -7
- package/dist/jsx/Mdx/index.mjs.map +1 -1
- package/dist/jsx/Mdx/index.native.js +15 -7
- package/dist/jsx/Mdx/index.native.js.map +1 -1
- package/dist/jsx/MdxCodeBlock/index.mjs +30 -22
- package/dist/jsx/MdxCodeBlock/index.mjs.map +1 -1
- package/dist/jsx/MdxCodeBlock/index.native.js +33 -22
- package/dist/jsx/MdxCodeBlock/index.native.js.map +1 -1
- package/dist/jsx/Notice/index.mjs +15 -57
- package/dist/jsx/Notice/index.mjs.map +1 -1
- package/dist/jsx/Notice/index.native.js +13 -56
- package/dist/jsx/Notice/index.native.js.map +1 -1
- package/dist/jsx/Table/index.mjs +13 -0
- package/dist/jsx/Table/index.mjs.map +1 -1
- package/dist/jsx/Table/index.native.js +15 -0
- package/dist/jsx/Table/index.native.js.map +1 -1
- package/dist/jsx/Tabs/index.mjs +17 -49
- package/dist/jsx/Tabs/index.mjs.map +1 -1
- package/dist/jsx/Tabs/index.native.js +20 -52
- package/dist/jsx/Tabs/index.native.js.map +1 -1
- package/dist/jsx/Ul/index.mjs +2 -2
- package/dist/jsx/Ul/index.mjs.map +1 -1
- package/dist/jsx/Ul/index.native.js +2 -2
- package/dist/jsx/Ul/index.native.js.map +1 -1
- package/dist/jsx/Video/index.mjs +4 -2
- package/dist/jsx/Video/index.mjs.map +1 -1
- package/dist/jsx/Video/index.native.js +4 -2
- package/dist/jsx/Video/index.native.js.map +1 -1
- package/dist/jsx/components/Blockquote.mjs +17 -4
- package/dist/jsx/components/Blockquote.mjs.map +1 -1
- package/dist/jsx/components/Blockquote.native.js +25 -3
- package/dist/jsx/components/Blockquote.native.js.map +1 -1
- package/dist/jsx/components/Break.mjs +2 -1
- package/dist/jsx/components/Break.mjs.map +1 -1
- package/dist/jsx/components/Break.native.js +1 -0
- package/dist/jsx/components/Break.native.js.map +1 -1
- package/dist/jsx/components/CodeBlock.mjs +21 -61
- package/dist/jsx/components/CodeBlock.mjs.map +1 -1
- package/dist/jsx/components/CodeBlock.native.js +22 -64
- package/dist/jsx/components/CodeBlock.native.js.map +1 -1
- package/dist/jsx/components/Heading.mjs +24 -1
- package/dist/jsx/components/Heading.mjs.map +1 -1
- package/dist/jsx/components/Heading.native.js +24 -0
- package/dist/jsx/components/Heading.native.js.map +1 -1
- package/dist/jsx/components/Image.mjs +3 -5
- package/dist/jsx/components/Image.mjs.map +1 -1
- package/dist/jsx/components/Image.native.js +6 -5
- package/dist/jsx/components/Image.native.js.map +1 -1
- package/dist/jsx/components/InlineCode.mjs +3 -6
- package/dist/jsx/components/InlineCode.mjs.map +1 -1
- package/dist/jsx/components/InlineCode.native.js +3 -6
- package/dist/jsx/components/InlineCode.native.js.map +1 -1
- package/dist/jsx/components/InlineStyles.mjs +3 -0
- package/dist/jsx/components/InlineStyles.mjs.map +1 -1
- package/dist/jsx/components/InlineStyles.native.js +3 -0
- package/dist/jsx/components/InlineStyles.native.js.map +1 -1
- package/dist/jsx/components/Link.mjs +23 -6
- package/dist/jsx/components/Link.mjs.map +1 -1
- package/dist/jsx/components/Link.native.js +23 -5
- package/dist/jsx/components/Link.native.js.map +1 -1
- package/dist/jsx/components/List.mjs +88 -10
- package/dist/jsx/components/List.mjs.map +1 -1
- package/dist/jsx/components/List.native.js +91 -9
- package/dist/jsx/components/List.native.js.map +1 -1
- package/dist/jsx/components/Paragraph.mjs +6 -1
- package/dist/jsx/components/Paragraph.mjs.map +1 -1
- package/dist/jsx/components/Paragraph.native.js +6 -1
- package/dist/jsx/components/Paragraph.native.js.map +1 -1
- package/dist/jsx/components/Table.mjs +59 -26
- package/dist/jsx/components/Table.mjs.map +1 -1
- package/dist/jsx/components/Table.native.js +67 -25
- package/dist/jsx/components/Table.native.js.map +1 -1
- package/dist/jsx/hooks/useCompileMdx.mjs +61 -29
- package/dist/jsx/hooks/useCompileMdx.mjs.map +1 -1
- package/dist/jsx/hooks/useCompileMdx.native.js +80 -28
- package/dist/jsx/hooks/useCompileMdx.native.js.map +1 -1
- package/dist/jsx/hooks/useEvaluateMdx.mjs +7 -1
- package/dist/jsx/hooks/useEvaluateMdx.mjs.map +1 -1
- package/dist/jsx/hooks/useEvaluateMdx.native.js +9 -3
- package/dist/jsx/hooks/useEvaluateMdx.native.js.map +1 -1
- package/dist/jsx/icons/index.mjs +32 -100
- package/dist/jsx/icons/index.mjs.map +1 -1
- package/dist/jsx/icons/index.native.js +36 -116
- package/dist/jsx/icons/index.native.js.map +1 -1
- package/dist/jsx/index.js +5 -3
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +5 -3
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +6 -4
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/mdxComponents.mjs +14 -7
- package/dist/jsx/mdxComponents.mjs.map +1 -1
- package/dist/jsx/mdxComponents.native.js +16 -6
- package/dist/jsx/mdxComponents.native.js.map +1 -1
- package/dist/jsx/mermaid/MermaidBlock.mjs +85 -0
- package/dist/jsx/mermaid/MermaidBlock.mjs.map +1 -0
- package/dist/jsx/mermaid/MermaidBlock.native.js +41 -0
- package/dist/jsx/mermaid/MermaidBlock.native.js.map +1 -0
- package/dist/jsx/mermaid/index.mjs +4 -0
- package/dist/jsx/mermaid/index.mjs.map +1 -0
- package/dist/jsx/mermaid/index.native.js +34 -0
- package/dist/jsx/mermaid/index.native.js.map +1 -0
- package/dist/jsx/mermaid/mountDiagramSvg.mjs +29 -0
- package/dist/jsx/mermaid/mountDiagramSvg.mjs.map +1 -0
- package/dist/jsx/mermaid/mountDiagramSvg.native.js +98 -0
- package/dist/jsx/mermaid/mountDiagramSvg.native.js.map +1 -0
- package/dist/jsx/mermaid/renderMermaidDiagram.mjs +55 -0
- package/dist/jsx/mermaid/renderMermaidDiagram.mjs.map +1 -0
- package/dist/jsx/mermaid/renderMermaidDiagram.native.js +110 -0
- package/dist/jsx/mermaid/renderMermaidDiagram.native.js.map +1 -0
- package/dist/jsx/renderer.mjs +9 -1
- package/dist/jsx/renderer.mjs.map +1 -1
- package/dist/jsx/renderer.native.js +10 -2
- package/dist/jsx/renderer.native.js.map +1 -1
- package/dist/jsx/shared/colorRamps.mjs +1 -10
- package/dist/jsx/shared/colorRamps.mjs.map +1 -1
- package/dist/jsx/shared/colorRamps.native.js +1 -11
- package/dist/jsx/shared/colorRamps.native.js.map +1 -1
- package/dist/jsx/shared/cutoffGradient.mjs +28 -0
- package/dist/jsx/shared/cutoffGradient.mjs.map +1 -0
- package/dist/jsx/shared/cutoffGradient.native.js +63 -0
- package/dist/jsx/shared/cutoffGradient.native.js.map +1 -0
- package/dist/jsx/shiki/index.mjs +1 -2
- package/dist/jsx/shiki/index.mjs.map +1 -1
- package/dist/jsx/shiki/index.native.js +0 -15
- package/dist/jsx/shiki/index.native.js.map +1 -1
- package/package.json +25 -14
- package/src/Aside/index.tsx +42 -35
- package/src/ExternalIcon/index.tsx +8 -1
- package/src/Hr/index.tsx +3 -6
- package/src/{SimpleTable → MarkdownSimpleTable}/index.tsx +30 -12
- package/src/MarkdownSimpleTable/markdownSimpleTable.spec.tsx +92 -0
- package/src/Mdx/index.tsx +12 -7
- package/src/MdxCodeBlock/index.tsx +33 -20
- package/src/Notice/index.tsx +12 -54
- package/src/Table/index.tsx +22 -6
- package/src/Tabs/index.tsx +26 -52
- package/src/Ul/index.ts +2 -2
- package/src/Video/index.tsx +15 -12
- package/src/components/Blockquote.tsx +29 -4
- package/src/components/Break.tsx +3 -1
- package/src/components/CodeBlock.tsx +49 -79
- package/src/components/Heading.tsx +15 -2
- package/src/components/Image.tsx +6 -3
- package/src/components/InlineCode.tsx +14 -7
- package/src/components/InlineStyles.tsx +15 -3
- package/src/components/Link.tsx +29 -6
- package/src/components/List.tsx +111 -11
- package/src/components/Paragraph.tsx +6 -1
- package/src/components/Table.tsx +56 -35
- package/src/components/markdownPrimitives.spec.tsx +121 -0
- package/src/docBlocks.spec.tsx +85 -0
- package/src/hooks/useCompileMdx.ts +75 -35
- package/src/hooks/useEvaluateMdx.ts +7 -1
- package/src/icons/index.tsx +36 -58
- package/src/index.ts +15 -3
- package/src/markdownComponent.spec.tsx +58 -0
- package/src/mdx.spec.tsx +4 -0
- package/src/mdxComponents.spec.tsx +185 -0
- package/src/mdxComponents.tsx +14 -5
- package/src/mermaid/MermaidBlock.native.tsx +15 -0
- package/src/mermaid/MermaidBlock.tsx +88 -0
- package/src/mermaid/index.ts +23 -0
- package/src/mermaid/mountDiagramSvg.ts +49 -0
- package/src/mermaid/renderMermaidDiagram.spec.ts +89 -0
- package/src/mermaid/renderMermaidDiagram.ts +78 -0
- package/src/renderer.spec.tsx +276 -0
- package/src/renderer.tsx +13 -1
- package/src/shared/colorRamps.ts +0 -10
- package/src/shared/cutoffGradient.ts +40 -0
- package/src/shiki/index.ts +7 -11
- package/src/stories/Blocks.stories.tsx +232 -0
- package/src/stories/Callouts.stories.tsx +147 -0
- package/src/stories/Code.stories.tsx +116 -0
- package/src/stories/Inline.stories.tsx +162 -0
- package/src/stories/Mdx.stories.tsx +107 -0
- package/src/stories/Media.stories.tsx +148 -0
- package/src/stories/Tables.stories.tsx +173 -0
- package/types/Aside/index.d.ts +11 -0
- package/types/Aside/index.d.ts.map +1 -0
- package/types/ExternalIcon/index.d.ts +2 -0
- package/types/ExternalIcon/index.d.ts.map +1 -0
- package/types/Hr/index.d.ts +2 -0
- package/types/Hr/index.d.ts.map +1 -0
- package/types/Li/index.d.ts +6 -0
- package/types/Li/index.d.ts.map +1 -0
- package/types/Markdown.d.ts +22 -0
- package/types/Markdown.d.ts.map +1 -0
- package/types/MarkdownSimpleTable/index.d.ts +16 -0
- package/types/MarkdownSimpleTable/index.d.ts.map +1 -0
- package/types/Mdx/index.d.ts +9 -0
- package/types/Mdx/index.d.ts.map +1 -0
- package/types/MdxCodeBlock/index.d.ts +7 -0
- package/types/MdxCodeBlock/index.d.ts.map +1 -0
- package/types/MdxCodeBlock/mdxCodeBlockContext.d.ts +13 -0
- package/types/MdxCodeBlock/mdxCodeBlockContext.d.ts.map +1 -0
- package/types/Notice/index.d.ts +12 -0
- package/types/Notice/index.d.ts.map +1 -0
- package/types/Table/index.d.ts +20 -0
- package/types/Table/index.d.ts.map +1 -0
- package/types/Tabs/index.d.ts +21 -0
- package/types/Tabs/index.d.ts.map +1 -0
- package/types/Ul/index.d.ts +6 -0
- package/types/Ul/index.d.ts.map +1 -0
- package/types/Video/index.d.ts +12 -0
- package/types/Video/index.d.ts.map +1 -0
- package/types/components/Blockquote.d.ts +3 -0
- package/types/components/Blockquote.d.ts.map +1 -0
- package/types/components/Break.d.ts +3 -0
- package/types/components/Break.d.ts.map +1 -0
- package/types/components/CodeBlock.d.ts +17 -0
- package/types/components/CodeBlock.d.ts.map +1 -0
- package/types/components/Heading.d.ts +3 -0
- package/types/components/Heading.d.ts.map +1 -0
- package/types/components/HorizontalRule.d.ts +3 -0
- package/types/components/HorizontalRule.d.ts.map +1 -0
- package/types/components/Image.d.ts +3 -0
- package/types/components/Image.d.ts.map +1 -0
- package/types/components/InlineCode.d.ts +12 -0
- package/types/components/InlineCode.d.ts.map +1 -0
- package/types/components/InlineStyles.d.ts +5 -0
- package/types/components/InlineStyles.d.ts.map +1 -0
- package/types/components/Link.d.ts +3 -0
- package/types/components/Link.d.ts.map +1 -0
- package/types/components/List.d.ts +10 -0
- package/types/components/List.d.ts.map +1 -0
- package/types/components/Paragraph.d.ts +3 -0
- package/types/components/Paragraph.d.ts.map +1 -0
- package/types/components/Table.d.ts +13 -0
- package/types/components/Table.d.ts.map +1 -0
- package/types/components/index.d.ts +13 -0
- package/types/components/index.d.ts.map +1 -0
- package/types/hooks/index.d.ts +4 -0
- package/types/hooks/index.d.ts.map +1 -0
- package/types/hooks/useCompileAndEvaluateMdx.d.ts +9 -0
- package/types/hooks/useCompileAndEvaluateMdx.d.ts.map +1 -0
- package/types/hooks/useCompileMdx.d.ts +13 -0
- package/types/hooks/useCompileMdx.d.ts.map +1 -0
- package/types/hooks/useEvaluateMdx.d.ts +5 -0
- package/types/hooks/useEvaluateMdx.d.ts.map +1 -0
- package/types/icons/index.d.ts +12 -0
- package/types/icons/index.d.ts.map +1 -0
- package/types/index.d.ts +29 -0
- package/types/index.d.ts.map +1 -0
- package/types/mdxComponents.d.ts +8 -0
- package/types/mdxComponents.d.ts.map +1 -0
- package/types/mermaid/MermaidBlock.d.ts +15 -0
- package/types/mermaid/MermaidBlock.d.ts.map +1 -0
- package/types/mermaid/MermaidBlock.native.d.ts +10 -0
- package/types/mermaid/MermaidBlock.native.d.ts.map +1 -0
- package/types/mermaid/index.d.ts +18 -0
- package/types/mermaid/index.d.ts.map +1 -0
- package/types/mermaid/mountDiagramSvg.d.ts +11 -0
- package/types/mermaid/mountDiagramSvg.d.ts.map +1 -0
- package/types/mermaid/renderMermaidDiagram.d.ts +33 -0
- package/types/mermaid/renderMermaidDiagram.d.ts.map +1 -0
- package/types/parser.d.ts +11 -0
- package/types/parser.d.ts.map +1 -0
- package/types/renderer.d.ts +32 -0
- package/types/renderer.d.ts.map +1 -0
- package/types/shared/colorRamps.d.ts +39 -0
- package/types/shared/colorRamps.d.ts.map +1 -0
- package/types/shared/cutoffGradient.d.ts +12 -0
- package/types/shared/cutoffGradient.d.ts.map +1 -0
- package/types/shared/index.d.ts +2 -0
- package/types/shared/index.d.ts.map +1 -0
- package/types/shiki/index.d.ts +8 -0
- package/types/shiki/index.d.ts.map +1 -0
- package/types/types.d.ts +160 -0
- package/types/types.d.ts.map +1 -0
- package/types/util/rehypeMetaAttributes.d.ts +2 -0
- package/types/util/rehypeMetaAttributes.d.ts.map +1 -0
- package/dist/cjs/ExternalIcon/ExternalIcon.spec.cjs +0 -37
- package/dist/cjs/ExternalIcon/ExternalIcon.spec.native.js +0 -40
- package/dist/cjs/ExternalIcon/ExternalIcon.spec.native.js.map +0 -1
- package/dist/cjs/Hr/hr.spec.cjs +0 -21
- package/dist/cjs/Hr/hr.spec.native.js +0 -24
- package/dist/cjs/Hr/hr.spec.native.js.map +0 -1
- package/dist/cjs/Li/li.spec.cjs +0 -45
- package/dist/cjs/Li/li.spec.native.js +0 -50
- package/dist/cjs/Li/li.spec.native.js.map +0 -1
- package/dist/cjs/Markdown.stories.cjs +0 -153
- package/dist/cjs/Markdown.stories.native.js +0 -162
- package/dist/cjs/Markdown.stories.native.js.map +0 -1
- package/dist/cjs/Mdx/mdx.spec.cjs +0 -139
- package/dist/cjs/Mdx/mdx.spec.native.js +0 -158
- package/dist/cjs/Mdx/mdx.spec.native.js.map +0 -1
- package/dist/cjs/MdxCodeBlock/mdxCodeBlock.spec.cjs +0 -90
- package/dist/cjs/MdxCodeBlock/mdxCodeBlock.spec.native.js +0 -122
- package/dist/cjs/MdxCodeBlock/mdxCodeBlock.spec.native.js.map +0 -1
- package/dist/cjs/SimpleTable/index.native.js.map +0 -1
- package/dist/cjs/Ul/ul.spec.cjs +0 -150
- package/dist/cjs/Ul/ul.spec.native.js +0 -153
- package/dist/cjs/Ul/ul.spec.native.js.map +0 -1
- package/dist/cjs/hooks/useCompileAndEvaluateMdx.spec.cjs +0 -34
- package/dist/cjs/hooks/useCompileAndEvaluateMdx.spec.native.js +0 -49
- package/dist/cjs/hooks/useCompileAndEvaluateMdx.spec.native.js.map +0 -1
- package/dist/cjs/mdx.spec.cjs +0 -400
- package/dist/cjs/mdx.spec.native.js +0 -465
- package/dist/cjs/mdx.spec.native.js.map +0 -1
- package/dist/cjs/parser.spec.cjs +0 -109
- package/dist/cjs/parser.spec.native.js +0 -114
- package/dist/cjs/parser.spec.native.js.map +0 -1
- package/dist/cjs/shiki/highlighter.cjs +0 -89
- package/dist/cjs/shiki/highlighter.native.js +0 -94
- package/dist/cjs/shiki/highlighter.native.js.map +0 -1
- package/dist/cjs/util/util.spec.cjs +0 -81
- package/dist/cjs/util/util.spec.native.js +0 -84
- package/dist/cjs/util/util.spec.native.js.map +0 -1
- package/dist/esm/ExternalIcon/ExternalIcon.spec.mjs +0 -38
- package/dist/esm/ExternalIcon/ExternalIcon.spec.mjs.map +0 -1
- package/dist/esm/ExternalIcon/ExternalIcon.spec.native.js +0 -38
- package/dist/esm/ExternalIcon/ExternalIcon.spec.native.js.map +0 -1
- package/dist/esm/Hr/hr.spec.mjs +0 -22
- package/dist/esm/Hr/hr.spec.mjs.map +0 -1
- package/dist/esm/Hr/hr.spec.native.js +0 -22
- package/dist/esm/Hr/hr.spec.native.js.map +0 -1
- package/dist/esm/Li/li.spec.mjs +0 -46
- package/dist/esm/Li/li.spec.mjs.map +0 -1
- package/dist/esm/Li/li.spec.native.js +0 -48
- package/dist/esm/Li/li.spec.native.js.map +0 -1
- package/dist/esm/Markdown.stories.mjs +0 -125
- package/dist/esm/Markdown.stories.mjs.map +0 -1
- package/dist/esm/Markdown.stories.native.js +0 -131
- package/dist/esm/Markdown.stories.native.js.map +0 -1
- package/dist/esm/Mdx/mdx.spec.mjs +0 -140
- package/dist/esm/Mdx/mdx.spec.mjs.map +0 -1
- package/dist/esm/Mdx/mdx.spec.native.js +0 -156
- package/dist/esm/Mdx/mdx.spec.native.js.map +0 -1
- package/dist/esm/MdxCodeBlock/mdxCodeBlock.spec.mjs +0 -91
- package/dist/esm/MdxCodeBlock/mdxCodeBlock.spec.mjs.map +0 -1
- package/dist/esm/MdxCodeBlock/mdxCodeBlock.spec.native.js +0 -96
- package/dist/esm/MdxCodeBlock/mdxCodeBlock.spec.native.js.map +0 -1
- package/dist/esm/SimpleTable/index.mjs.map +0 -1
- package/dist/esm/SimpleTable/index.native.js.map +0 -1
- package/dist/esm/Ul/ul.spec.mjs +0 -151
- package/dist/esm/Ul/ul.spec.mjs.map +0 -1
- package/dist/esm/Ul/ul.spec.native.js +0 -151
- package/dist/esm/Ul/ul.spec.native.js.map +0 -1
- package/dist/esm/hooks/useCompileAndEvaluateMdx.spec.mjs +0 -35
- package/dist/esm/hooks/useCompileAndEvaluateMdx.spec.mjs.map +0 -1
- package/dist/esm/hooks/useCompileAndEvaluateMdx.spec.native.js +0 -47
- package/dist/esm/hooks/useCompileAndEvaluateMdx.spec.native.js.map +0 -1
- package/dist/esm/mdx.spec.mjs +0 -377
- package/dist/esm/mdx.spec.mjs.map +0 -1
- package/dist/esm/mdx.spec.native.js +0 -439
- package/dist/esm/mdx.spec.native.js.map +0 -1
- package/dist/esm/parser.spec.mjs +0 -110
- package/dist/esm/parser.spec.mjs.map +0 -1
- package/dist/esm/parser.spec.native.js +0 -112
- package/dist/esm/parser.spec.native.js.map +0 -1
- package/dist/esm/shiki/highlighter.mjs +0 -59
- package/dist/esm/shiki/highlighter.mjs.map +0 -1
- package/dist/esm/shiki/highlighter.native.js +0 -61
- package/dist/esm/shiki/highlighter.native.js.map +0 -1
- package/dist/esm/util/util.spec.mjs +0 -82
- package/dist/esm/util/util.spec.mjs.map +0 -1
- package/dist/esm/util/util.spec.native.js +0 -82
- package/dist/esm/util/util.spec.native.js.map +0 -1
- package/dist/jsx/ExternalIcon/ExternalIcon.spec.mjs +0 -38
- package/dist/jsx/ExternalIcon/ExternalIcon.spec.mjs.map +0 -1
- package/dist/jsx/ExternalIcon/ExternalIcon.spec.native.js +0 -40
- package/dist/jsx/ExternalIcon/ExternalIcon.spec.native.js.map +0 -1
- package/dist/jsx/Hr/hr.spec.mjs +0 -22
- package/dist/jsx/Hr/hr.spec.mjs.map +0 -1
- package/dist/jsx/Hr/hr.spec.native.js +0 -24
- package/dist/jsx/Hr/hr.spec.native.js.map +0 -1
- package/dist/jsx/Li/li.spec.mjs +0 -46
- package/dist/jsx/Li/li.spec.mjs.map +0 -1
- package/dist/jsx/Li/li.spec.native.js +0 -50
- package/dist/jsx/Li/li.spec.native.js.map +0 -1
- package/dist/jsx/Markdown.stories.mjs +0 -125
- package/dist/jsx/Markdown.stories.mjs.map +0 -1
- package/dist/jsx/Markdown.stories.native.js +0 -162
- package/dist/jsx/Markdown.stories.native.js.map +0 -1
- package/dist/jsx/Mdx/mdx.spec.mjs +0 -140
- package/dist/jsx/Mdx/mdx.spec.mjs.map +0 -1
- package/dist/jsx/Mdx/mdx.spec.native.js +0 -158
- package/dist/jsx/Mdx/mdx.spec.native.js.map +0 -1
- package/dist/jsx/MdxCodeBlock/mdxCodeBlock.spec.mjs +0 -91
- package/dist/jsx/MdxCodeBlock/mdxCodeBlock.spec.mjs.map +0 -1
- package/dist/jsx/MdxCodeBlock/mdxCodeBlock.spec.native.js +0 -122
- package/dist/jsx/MdxCodeBlock/mdxCodeBlock.spec.native.js.map +0 -1
- package/dist/jsx/SimpleTable/index.mjs.map +0 -1
- package/dist/jsx/SimpleTable/index.native.js.map +0 -1
- package/dist/jsx/Ul/ul.spec.mjs +0 -151
- package/dist/jsx/Ul/ul.spec.mjs.map +0 -1
- package/dist/jsx/Ul/ul.spec.native.js +0 -153
- package/dist/jsx/Ul/ul.spec.native.js.map +0 -1
- package/dist/jsx/hooks/useCompileAndEvaluateMdx.spec.mjs +0 -35
- package/dist/jsx/hooks/useCompileAndEvaluateMdx.spec.mjs.map +0 -1
- package/dist/jsx/hooks/useCompileAndEvaluateMdx.spec.native.js +0 -49
- package/dist/jsx/hooks/useCompileAndEvaluateMdx.spec.native.js.map +0 -1
- package/dist/jsx/mdx.spec.mjs +0 -377
- package/dist/jsx/mdx.spec.mjs.map +0 -1
- package/dist/jsx/mdx.spec.native.js +0 -465
- package/dist/jsx/mdx.spec.native.js.map +0 -1
- package/dist/jsx/parser.spec.mjs +0 -110
- package/dist/jsx/parser.spec.mjs.map +0 -1
- package/dist/jsx/parser.spec.native.js +0 -114
- package/dist/jsx/parser.spec.native.js.map +0 -1
- package/dist/jsx/shiki/highlighter.mjs +0 -59
- package/dist/jsx/shiki/highlighter.mjs.map +0 -1
- package/dist/jsx/shiki/highlighter.native.js +0 -94
- package/dist/jsx/shiki/highlighter.native.js.map +0 -1
- package/dist/jsx/util/util.spec.mjs +0 -82
- package/dist/jsx/util/util.spec.mjs.map +0 -1
- package/dist/jsx/util/util.spec.native.js +0 -84
- package/dist/jsx/util/util.spec.native.js.map +0 -1
- package/src/shiki/highlighter.ts +0 -148
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mdxComponents mapping specs — the HTML-tag → Tamagui component table MDX
|
|
3
|
+
* documents render through. Locks down real DOM semantics per tag (headings
|
|
4
|
+
* with data-heading anchors, inline strong/em/del, list/table structure) and
|
|
5
|
+
* the `code` dual mode (inline CodeInline without className vs block).
|
|
6
|
+
*
|
|
7
|
+
* The `a` mapping is not covered here: it renders through the router Link,
|
|
8
|
+
* which needs a live router host.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
12
|
+
import { describe, expect, it } from "vitest";
|
|
13
|
+
import { mdxComponents } from "./mdxComponents";
|
|
14
|
+
|
|
15
|
+
function C(tag: keyof typeof mdxComponents): any {
|
|
16
|
+
const component = mdxComponents[tag];
|
|
17
|
+
expect(component, `mdxComponents.${tag}`).toBeTruthy();
|
|
18
|
+
return component;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe("mdxComponents — headings", () => {
|
|
22
|
+
it("renders h1 as a real h1", () => {
|
|
23
|
+
const H1 = C("h1");
|
|
24
|
+
const { container } = renderWithProviders(<H1>Top</H1>);
|
|
25
|
+
expect(container.querySelector("h1")?.textContent).toBe("Top");
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("renders h2 with the data-heading marker used by TOC scrapers", () => {
|
|
29
|
+
const H2 = C("h2");
|
|
30
|
+
const { container } = renderWithProviders(<H2>Section</H2>);
|
|
31
|
+
const h2 = container.querySelector("h2");
|
|
32
|
+
expect(h2?.textContent).toBe("Section");
|
|
33
|
+
expect(h2?.hasAttribute("data-heading")).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("renders h3 as a self-linking anchor heading with its id", () => {
|
|
37
|
+
const H3 = C("h3");
|
|
38
|
+
const { container } = renderWithProviders(<H3 id="install">Install</H3>);
|
|
39
|
+
const anchor = container.querySelector('a[href="#install"]');
|
|
40
|
+
expect(anchor).toBeTruthy();
|
|
41
|
+
expect(anchor!.getAttribute("id")).toBe("install");
|
|
42
|
+
expect(anchor!.textContent).toContain("Install");
|
|
43
|
+
expect(container.querySelector("h3")).toBeTruthy();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("renders h4/h5/h6 at their own levels", () => {
|
|
47
|
+
const H4 = C("h4");
|
|
48
|
+
const H5 = C("h5");
|
|
49
|
+
const H6 = C("h6");
|
|
50
|
+
const { container } = renderWithProviders(
|
|
51
|
+
<>
|
|
52
|
+
<H4>four</H4>
|
|
53
|
+
<H5>five</H5>
|
|
54
|
+
<H6>six</H6>
|
|
55
|
+
</>,
|
|
56
|
+
);
|
|
57
|
+
expect(container.querySelector("h4")?.textContent).toBe("four");
|
|
58
|
+
expect(container.querySelector("h5")?.textContent).toBe("five");
|
|
59
|
+
expect(container.querySelector("h6")?.textContent).toBe("six");
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe("mdxComponents — inline and block text", () => {
|
|
64
|
+
it("renders p as a real paragraph element", () => {
|
|
65
|
+
const P = C("p");
|
|
66
|
+
const { container } = renderWithProviders(<P>body copy</P>);
|
|
67
|
+
expect(container.querySelector("p")?.textContent).toBe("body copy");
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("renders strong/em/del with their native semantics", () => {
|
|
71
|
+
const Strong = C("strong");
|
|
72
|
+
const Em = C("em");
|
|
73
|
+
const Del = C("del");
|
|
74
|
+
const { container } = renderWithProviders(
|
|
75
|
+
<>
|
|
76
|
+
<Strong>bold</Strong>
|
|
77
|
+
<Em>slanted</Em>
|
|
78
|
+
<Del>removed</Del>
|
|
79
|
+
</>,
|
|
80
|
+
);
|
|
81
|
+
expect(container.querySelector("strong")?.textContent).toBe("bold");
|
|
82
|
+
expect(container.querySelector("em")?.textContent).toBe("slanted");
|
|
83
|
+
expect(container.querySelector("del")?.textContent).toBe("removed");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("renders blockquote content through the quote treatment", () => {
|
|
87
|
+
const Blockquote = C("blockquote");
|
|
88
|
+
const { container } = renderWithProviders(<Blockquote>quoted wisdom</Blockquote>);
|
|
89
|
+
expect(container.textContent).toContain("quoted wisdom");
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("renders hr without crashing", () => {
|
|
93
|
+
const Hr = C("hr");
|
|
94
|
+
const { container } = renderWithProviders(<Hr />);
|
|
95
|
+
expect(container.firstChild).toBeTruthy();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe("mdxComponents — code", () => {
|
|
100
|
+
it("renders inline code (no className) as a real <code> element", () => {
|
|
101
|
+
const Code = C("code");
|
|
102
|
+
const { container } = renderWithProviders(<Code>npm i tamagui</Code>);
|
|
103
|
+
const code = container.querySelector("code");
|
|
104
|
+
expect(code).toBeTruthy();
|
|
105
|
+
expect(code!.textContent).toBe("npm i tamagui");
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe("mdxComponents — lists", () => {
|
|
110
|
+
it("renders ul > li structure and strips stray string children", () => {
|
|
111
|
+
const Ul = C("ul");
|
|
112
|
+
const Li = C("li");
|
|
113
|
+
const { container } = renderWithProviders(
|
|
114
|
+
<Ul>
|
|
115
|
+
{"\n"}
|
|
116
|
+
<Li>first</Li>
|
|
117
|
+
{"\n"}
|
|
118
|
+
<Li>second</Li>
|
|
119
|
+
</Ul>,
|
|
120
|
+
);
|
|
121
|
+
const ul = container.querySelector("ul");
|
|
122
|
+
expect(ul).toBeTruthy();
|
|
123
|
+
const items = ul!.querySelectorAll("li");
|
|
124
|
+
expect(items).toHaveLength(2);
|
|
125
|
+
expect(ul!.textContent).not.toContain("\n");
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("renders ol as a real ordered list", () => {
|
|
129
|
+
const Ol = C("ol");
|
|
130
|
+
const Li = C("li");
|
|
131
|
+
const { container } = renderWithProviders(
|
|
132
|
+
<Ol>
|
|
133
|
+
<Li>one</Li>
|
|
134
|
+
</Ol>,
|
|
135
|
+
);
|
|
136
|
+
expect(container.querySelector("ol")).toBeTruthy();
|
|
137
|
+
expect(container.querySelector("ol li")?.textContent).toContain("one");
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe("mdxComponents — media and tables", () => {
|
|
142
|
+
it("renders img nested in a span wrapper with forwarded src/alt", () => {
|
|
143
|
+
const Img = C("img");
|
|
144
|
+
const { container } = renderWithProviders(
|
|
145
|
+
<Img src="https://example.com/x.png" alt="diagram" />,
|
|
146
|
+
);
|
|
147
|
+
const img = container.querySelector("img");
|
|
148
|
+
expect(img).toBeTruthy();
|
|
149
|
+
expect(img!.getAttribute("src")).toBe("https://example.com/x.png");
|
|
150
|
+
expect(img!.getAttribute("alt")).toBe("diagram");
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it("renders the full table family into table/thead/tbody/tr/th/td", () => {
|
|
154
|
+
const Table = C("table");
|
|
155
|
+
const Thead = C("thead");
|
|
156
|
+
const Tbody = C("tbody");
|
|
157
|
+
const Tr = C("tr");
|
|
158
|
+
const Th = C("th");
|
|
159
|
+
const Td = C("td");
|
|
160
|
+
const { container } = renderWithProviders(
|
|
161
|
+
<Table>
|
|
162
|
+
<Thead>
|
|
163
|
+
<Tr>
|
|
164
|
+
<Th>Header</Th>
|
|
165
|
+
</Tr>
|
|
166
|
+
</Thead>
|
|
167
|
+
<Tbody>
|
|
168
|
+
<Tr>
|
|
169
|
+
<Td>Data</Td>
|
|
170
|
+
</Tr>
|
|
171
|
+
</Tbody>
|
|
172
|
+
</Table>,
|
|
173
|
+
);
|
|
174
|
+
expect(container.querySelector("table")).toBeTruthy();
|
|
175
|
+
expect(container.querySelector("thead th")?.textContent).toBe("Header");
|
|
176
|
+
expect(container.querySelector("tbody td")?.textContent).toBe("Data");
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it("pre passes children through unchanged (code block owns the chrome)", () => {
|
|
180
|
+
const Pre = C("pre");
|
|
181
|
+
const { container } = renderWithProviders(<Pre>inner text</Pre>);
|
|
182
|
+
expect(container.textContent).toContain("inner text");
|
|
183
|
+
expect(container.querySelector("pre")).toBeNull();
|
|
184
|
+
});
|
|
185
|
+
});
|
package/src/mdxComponents.tsx
CHANGED
|
@@ -4,7 +4,7 @@ import { Link } from "@multiplatform.one/router";
|
|
|
4
4
|
import type { MDXComponents } from "mdx/types";
|
|
5
5
|
import { Children } from "react";
|
|
6
6
|
import type { XStackProps } from "tamagui";
|
|
7
|
-
import { H1, H2, H3, H4, H5, H6, Paragraph, Text, XStack, YStack, styled } from "tamagui";
|
|
7
|
+
import { H1, H2, H3, H4, H5, H6, Paragraph, Text, XStack, YStack, isWeb, styled } from "tamagui";
|
|
8
8
|
import { ExternalIcon } from "./ExternalIcon";
|
|
9
9
|
import { HR } from "./Hr";
|
|
10
10
|
import { LinkIcon } from "./icons";
|
|
@@ -61,8 +61,17 @@ function MdxBlockquote({ children, ...props }: any) {
|
|
|
61
61
|
<YStack
|
|
62
62
|
marginVertical="$4"
|
|
63
63
|
paddingHorizontal={knobProps.panelPadding.padding}
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
// Logical start rail so the quote mirrors in RTL; tamagui
|
|
65
|
+
// borderStartWidth does not compile to working CSS on web (SB-M-1215)
|
|
66
|
+
{...(isWeb
|
|
67
|
+
? {
|
|
68
|
+
style: {
|
|
69
|
+
marginInlineStart: 12,
|
|
70
|
+
borderInlineStartWidth: 1,
|
|
71
|
+
borderInlineStartStyle: "solid",
|
|
72
|
+
} as any,
|
|
73
|
+
}
|
|
74
|
+
: { style: { marginInlineStart: 12 }, borderStartWidth: 1 })}
|
|
66
75
|
borderColor="$borderColor"
|
|
67
76
|
justifyContent="center"
|
|
68
77
|
{...props}
|
|
@@ -105,7 +114,6 @@ export const mdxComponents: MDXComponents = {
|
|
|
105
114
|
maxWidth="100%"
|
|
106
115
|
position="relative"
|
|
107
116
|
width={"fit-content" as any}
|
|
108
|
-
nativeID={id}
|
|
109
117
|
size="$8"
|
|
110
118
|
color="$color11"
|
|
111
119
|
fontWeight="600"
|
|
@@ -136,7 +144,8 @@ export const mdxComponents: MDXComponents = {
|
|
|
136
144
|
return (
|
|
137
145
|
<Link href={href}>
|
|
138
146
|
<Paragraph
|
|
139
|
-
|
|
147
|
+
// the router Link already renders the anchor; a nested <a> is invalid
|
|
148
|
+
render="span"
|
|
140
149
|
fontSize="inherit"
|
|
141
150
|
display="inline"
|
|
142
151
|
cursor="pointer"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native fallback for mermaid blocks: the engine needs a DOM, so the
|
|
3
|
+
* diagram source renders as a plain highlighted code block.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { CodeBlock } from "../components";
|
|
7
|
+
|
|
8
|
+
export interface MermaidBlockProps {
|
|
9
|
+
/** Mermaid diagram source */
|
|
10
|
+
children: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function MermaidBlock({ children }: MermaidBlockProps) {
|
|
14
|
+
return <CodeBlock lang="mermaid">{children}</CodeBlock>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only mermaid diagram block for rendered markdown (web).
|
|
3
|
+
*
|
|
4
|
+
* Fenced ```mermaid code renders as a live SVG diagram (GitLab behavior).
|
|
5
|
+
* The engine is lazy-loaded on first render via the canonical
|
|
6
|
+
* `renderMermaidDiagram` helper; while loading the raw source shows as a
|
|
7
|
+
* plain code block, and invalid source shows the parse error above the
|
|
8
|
+
* source (Axiom 6: show the error, never blank).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { useEffect, useRef, useState } from "react";
|
|
12
|
+
import { Text, View, useThemeName } from "tamagui";
|
|
13
|
+
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
14
|
+
import { markdownCodeColors } from "../shared/colorRamps";
|
|
15
|
+
import { CodeBlock } from "../components";
|
|
16
|
+
import { mountDiagramSvg } from "./mountDiagramSvg";
|
|
17
|
+
import { renderMermaidDiagram } from "./renderMermaidDiagram";
|
|
18
|
+
|
|
19
|
+
export interface MermaidBlockProps {
|
|
20
|
+
/** Mermaid diagram source */
|
|
21
|
+
children: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type MermaidState =
|
|
25
|
+
| { status: "loading" }
|
|
26
|
+
| { status: "ok"; svg: string }
|
|
27
|
+
| { status: "error"; error: string };
|
|
28
|
+
|
|
29
|
+
export function MermaidBlock({ children }: MermaidBlockProps) {
|
|
30
|
+
const { knobProps } = useResolvedKnobs();
|
|
31
|
+
const themeName = useThemeName();
|
|
32
|
+
const scheme = String(themeName).startsWith("dark") ? "dark" : "light";
|
|
33
|
+
const [state, setState] = useState<MermaidState>({ status: "loading" });
|
|
34
|
+
const svgHostRef = useRef<HTMLDivElement>(null);
|
|
35
|
+
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
let cancelled = false;
|
|
38
|
+
setState({ status: "loading" });
|
|
39
|
+
renderMermaidDiagram(children, { scheme }).then((result) => {
|
|
40
|
+
if (cancelled) return;
|
|
41
|
+
setState(
|
|
42
|
+
result.ok ? { status: "ok", svg: result.svg } : { status: "error", error: result.error },
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
return () => {
|
|
46
|
+
cancelled = true;
|
|
47
|
+
};
|
|
48
|
+
}, [children, scheme]);
|
|
49
|
+
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (state.status !== "ok" || !svgHostRef.current) return;
|
|
52
|
+
mountDiagramSvg(svgHostRef.current, state.svg);
|
|
53
|
+
}, [state]);
|
|
54
|
+
|
|
55
|
+
if (state.status === "ok") {
|
|
56
|
+
return (
|
|
57
|
+
<View
|
|
58
|
+
{...(knobProps.borderRadiusOuter ?? { borderRadius: "$4" })}
|
|
59
|
+
backgroundColor={markdownCodeColors.background.base}
|
|
60
|
+
borderWidth={1}
|
|
61
|
+
borderColor={markdownCodeColors.border.base}
|
|
62
|
+
paddingHorizontal={16}
|
|
63
|
+
paddingVertical={12}
|
|
64
|
+
marginVertical="$2"
|
|
65
|
+
overflow="hidden"
|
|
66
|
+
>
|
|
67
|
+
<div
|
|
68
|
+
ref={svgHostRef}
|
|
69
|
+
role="img"
|
|
70
|
+
aria-label="Mermaid diagram"
|
|
71
|
+
data-mermaid-diagram="true"
|
|
72
|
+
style={{ display: "flex", justifyContent: "center", overflowX: "auto" }}
|
|
73
|
+
/>
|
|
74
|
+
</View>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return (
|
|
79
|
+
<View>
|
|
80
|
+
{state.status === "error" ? (
|
|
81
|
+
<Text color="$red11" fontSize={13} marginTop="$2" role="alert">
|
|
82
|
+
{`Mermaid: ${state.error}`}
|
|
83
|
+
</Text>
|
|
84
|
+
) : null}
|
|
85
|
+
<CodeBlock lang="mermaid">{children}</CodeBlock>
|
|
86
|
+
</View>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dedicated `@multiplatform.one/markdown/mermaid` entry (LC-16 canonical
|
|
3
|
+
* mermaid renderer) for lazy consumers like the rich-text editor.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately free of static dependencies: importing the package BARREL
|
|
6
|
+
* from another package makes the barrel's whole static closure (shiki,
|
|
7
|
+
* the MDX compiler, remark…) graph-reachable, and app chunk-group tests
|
|
8
|
+
* pin reachable node_modules eager. This entry keeps the editor's dynamic
|
|
9
|
+
* import surgical — the only heavy module behind it is `mermaid` itself,
|
|
10
|
+
* loaded through renderMermaidDiagram's own dynamic import.
|
|
11
|
+
*
|
|
12
|
+
* The read-only `MermaidBlock` component intentionally does NOT export
|
|
13
|
+
* from here (it pulls react/tamagui); the package barrel exports it from
|
|
14
|
+
* `./MermaidBlock` directly.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export { mountDiagramSvg } from "./mountDiagramSvg";
|
|
18
|
+
export {
|
|
19
|
+
renderMermaidDiagram,
|
|
20
|
+
resetMermaidForTesting,
|
|
21
|
+
type MermaidRenderOptions,
|
|
22
|
+
type MermaidRenderResult,
|
|
23
|
+
} from "./renderMermaidDiagram";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mounts a mermaid SVG string into a container as real DOM nodes.
|
|
3
|
+
*
|
|
4
|
+
* mermaid already sanitizes its output at securityLevel "strict" (it runs
|
|
5
|
+
* DOMPurify internally); this helper adds defense in depth: the markup is
|
|
6
|
+
* parsed inert (scripts never execute during HTML parsing), executable
|
|
7
|
+
* elements and on* handlers are stripped, and only the <svg> element is
|
|
8
|
+
* imported into the live document.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const EXECUTABLE_SELECTOR = "script, iframe, object, embed";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* XML parse first (faithful SVG namespaces for importNode), lenient HTML
|
|
15
|
+
* parse as fallback for markup that is not well-formed XML (e.g. html
|
|
16
|
+
* labels inside foreignObject).
|
|
17
|
+
*/
|
|
18
|
+
function parseSvgElement(svg: string): Element | null {
|
|
19
|
+
try {
|
|
20
|
+
const xml = new DOMParser().parseFromString(svg, "image/svg+xml");
|
|
21
|
+
const root = xml.documentElement;
|
|
22
|
+
if (root?.tagName.toLowerCase() === "svg" && !xml.querySelector("parsererror")) {
|
|
23
|
+
return root;
|
|
24
|
+
}
|
|
25
|
+
} catch {
|
|
26
|
+
// fall through to HTML parsing
|
|
27
|
+
}
|
|
28
|
+
const html = new DOMParser().parseFromString(svg, "text/html");
|
|
29
|
+
return html.body.querySelector("svg");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function mountDiagramSvg(container: HTMLElement, svg: string): boolean {
|
|
33
|
+
const root = parseSvgElement(svg);
|
|
34
|
+
if (!root) return false;
|
|
35
|
+
for (const el of Array.from(root.querySelectorAll(EXECUTABLE_SELECTOR))) el.remove();
|
|
36
|
+
for (const el of [root, ...Array.from(root.querySelectorAll("*"))]) {
|
|
37
|
+
for (const attr of Array.from(el.attributes)) {
|
|
38
|
+
const name = attr.name.toLowerCase();
|
|
39
|
+
if (
|
|
40
|
+
name.startsWith("on") ||
|
|
41
|
+
(name === "href" && attr.value.trim().toLowerCase().startsWith("javascript:"))
|
|
42
|
+
) {
|
|
43
|
+
el.removeAttribute(attr.name);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
container.replaceChildren(document.importNode(root, true));
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
|
|
3
|
+
const initialize = vi.fn();
|
|
4
|
+
const parse = vi.fn();
|
|
5
|
+
const render = vi.fn();
|
|
6
|
+
|
|
7
|
+
vi.mock("mermaid", () => ({
|
|
8
|
+
default: { initialize, parse, render },
|
|
9
|
+
}));
|
|
10
|
+
|
|
11
|
+
import { renderMermaidDiagram, resetMermaidForTesting } from "./renderMermaidDiagram";
|
|
12
|
+
import { mountDiagramSvg } from "./mountDiagramSvg";
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
resetMermaidForTesting();
|
|
16
|
+
initialize.mockClear();
|
|
17
|
+
parse.mockReset().mockResolvedValue(undefined);
|
|
18
|
+
render.mockReset().mockResolvedValue({ svg: "<svg><g>ok</g></svg>" });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
describe("renderMermaidDiagram", () => {
|
|
22
|
+
it("renders valid source to svg through the lazy engine", async () => {
|
|
23
|
+
const result = await renderMermaidDiagram("graph TD\n A-->B");
|
|
24
|
+
expect(result).toEqual({ ok: true, svg: "<svg><g>ok</g></svg>" });
|
|
25
|
+
expect(parse).toHaveBeenCalledWith("graph TD\n A-->B");
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("passes the dark scheme to mermaid theme config", async () => {
|
|
29
|
+
await renderMermaidDiagram("graph TD\n A-->B", { scheme: "dark" });
|
|
30
|
+
expect(initialize).toHaveBeenCalledWith(
|
|
31
|
+
expect.objectContaining({ theme: "dark", securityLevel: "strict", startOnLoad: false }),
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("defaults to the light theme and re-initializes only on scheme change", async () => {
|
|
36
|
+
await renderMermaidDiagram("a");
|
|
37
|
+
await renderMermaidDiagram("b");
|
|
38
|
+
expect(initialize).toHaveBeenCalledTimes(1);
|
|
39
|
+
expect(initialize).toHaveBeenCalledWith(expect.objectContaining({ theme: "default" }));
|
|
40
|
+
await renderMermaidDiagram("c", { scheme: "dark" });
|
|
41
|
+
expect(initialize).toHaveBeenCalledTimes(2);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("returns the parse error for invalid source (Axiom 6: never blank)", async () => {
|
|
45
|
+
parse.mockRejectedValue(new Error("Parse error on line 2: unexpected token"));
|
|
46
|
+
const result = await renderMermaidDiagram("graph TD\n A--");
|
|
47
|
+
expect(result).toEqual({
|
|
48
|
+
ok: false,
|
|
49
|
+
error: "Parse error on line 2: unexpected token",
|
|
50
|
+
});
|
|
51
|
+
expect(render).not.toHaveBeenCalled();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("returns render failures as errors too", async () => {
|
|
55
|
+
render.mockRejectedValue(new Error("boom"));
|
|
56
|
+
const result = await renderMermaidDiagram("graph TD\n A-->B");
|
|
57
|
+
expect(result).toEqual({ ok: false, error: "boom" });
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
describe("mountDiagramSvg", () => {
|
|
62
|
+
it("mounts the svg element as real nodes", () => {
|
|
63
|
+
const container = document.createElement("div");
|
|
64
|
+
expect(mountDiagramSvg(container, "<svg><g><text>hi</text></g></svg>")).toBe(true);
|
|
65
|
+
expect(container.querySelector("svg g text")?.textContent).toBe("hi");
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("strips executable content and handlers (defense in depth)", () => {
|
|
69
|
+
const container = document.createElement("div");
|
|
70
|
+
mountDiagramSvg(
|
|
71
|
+
container,
|
|
72
|
+
'<svg onload="alert(1)"><script>alert(2)</script>' +
|
|
73
|
+
'<g onclick="x()"><text>t</text></g>' +
|
|
74
|
+
'<image href="javascript:alert(3)"></image></svg>',
|
|
75
|
+
);
|
|
76
|
+
expect(container.querySelector("script")).toBeNull();
|
|
77
|
+
expect(container.querySelector("svg")?.getAttribute("onload")).toBeNull();
|
|
78
|
+
expect(container.querySelector("g")?.getAttribute("onclick")).toBeNull();
|
|
79
|
+
expect(container.querySelector("image")?.getAttribute("href")).toBeNull();
|
|
80
|
+
// the safe content survives
|
|
81
|
+
expect(container.querySelector("text")?.textContent).toBe("t");
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("returns false for non-svg payloads", () => {
|
|
85
|
+
const container = document.createElement("div");
|
|
86
|
+
expect(mountDiagramSvg(container, "<div>nope</div>")).toBe(false);
|
|
87
|
+
expect(container.childNodes.length).toBe(0);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical lazy mermaid renderer (LC-16: one implementation).
|
|
3
|
+
*
|
|
4
|
+
* Consumed by this package's read-only `MermaidBlock` and by the
|
|
5
|
+
* `@multiplatform.one/rich-text` editor's live code-block preview. The
|
|
6
|
+
* mermaid engine (~500 KB raw) is NEVER in an eager chunk: it is
|
|
7
|
+
* dynamically imported on the first diagram render and cached.
|
|
8
|
+
*
|
|
9
|
+
* The result contract is Axiom 6 friendly — invalid diagram source returns
|
|
10
|
+
* `{ ok: false, error }` with mermaid's parse message so callers can show
|
|
11
|
+
* the error instead of a blank box.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export interface MermaidRenderOptions {
|
|
15
|
+
/** Color scheme for mermaid's built-in theming (default "light") */
|
|
16
|
+
scheme?: "light" | "dark";
|
|
17
|
+
/** Font family passed to mermaid's theme config */
|
|
18
|
+
fontFamily?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type MermaidRenderResult = { ok: true; svg: string } | { ok: false; error: string };
|
|
22
|
+
|
|
23
|
+
type MermaidModule = typeof import("mermaid").default;
|
|
24
|
+
|
|
25
|
+
let mermaidPromise: Promise<MermaidModule> | null = null;
|
|
26
|
+
let idCounter = 0;
|
|
27
|
+
let lastInitKey: string | null = null;
|
|
28
|
+
|
|
29
|
+
function loadMermaid(): Promise<MermaidModule> {
|
|
30
|
+
if (!mermaidPromise) {
|
|
31
|
+
mermaidPromise = import("mermaid").then((mod: any) => mod.default ?? mod);
|
|
32
|
+
}
|
|
33
|
+
return mermaidPromise;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Renders mermaid source to an isolated SVG string. Re-initializes the
|
|
38
|
+
* engine only when the scheme/font changes (mermaid config is global).
|
|
39
|
+
*/
|
|
40
|
+
export async function renderMermaidDiagram(
|
|
41
|
+
code: string,
|
|
42
|
+
options: MermaidRenderOptions = {},
|
|
43
|
+
): Promise<MermaidRenderResult> {
|
|
44
|
+
if (typeof document === "undefined") {
|
|
45
|
+
return { ok: false, error: "Mermaid diagrams require a DOM environment" };
|
|
46
|
+
}
|
|
47
|
+
const id = `mpo-mermaid-${++idCounter}`;
|
|
48
|
+
try {
|
|
49
|
+
const mermaid = await loadMermaid();
|
|
50
|
+
const initKey = `${options.scheme ?? "light"}|${options.fontFamily ?? ""}`;
|
|
51
|
+
if (initKey !== lastInitKey) {
|
|
52
|
+
mermaid.initialize({
|
|
53
|
+
startOnLoad: false,
|
|
54
|
+
securityLevel: "strict",
|
|
55
|
+
theme: options.scheme === "dark" ? "dark" : "default",
|
|
56
|
+
...(options.fontFamily ? { fontFamily: options.fontFamily } : {}),
|
|
57
|
+
});
|
|
58
|
+
lastInitKey = initKey;
|
|
59
|
+
}
|
|
60
|
+
// parse() first: it throws a clean syntax error without leaving the
|
|
61
|
+
// error bomb SVG that render() can inject into the document
|
|
62
|
+
await mermaid.parse(code);
|
|
63
|
+
const { svg } = await mermaid.render(id, code);
|
|
64
|
+
return { ok: true, svg };
|
|
65
|
+
} catch (err) {
|
|
66
|
+
// render() can orphan its temp element on failure — clean it up
|
|
67
|
+
document.getElementById(`d${id}`)?.remove();
|
|
68
|
+
document.getElementById(id)?.remove();
|
|
69
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
70
|
+
return { ok: false, error: message };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Test seam: reset engine cache/init state */
|
|
75
|
+
export function resetMermaidForTesting(): void {
|
|
76
|
+
mermaidPromise = null;
|
|
77
|
+
lastInitKey = null;
|
|
78
|
+
}
|