markstream-svelte 0.0.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/README.md +77 -0
  2. package/dist/components/AdmonitionNode.svelte +8 -0
  3. package/dist/components/AdmonitionNode.svelte.d.ts +23 -0
  4. package/dist/components/AdmonitionNode.svelte.d.ts.map +1 -0
  5. package/dist/components/BlockquoteNode.svelte +10 -0
  6. package/dist/components/BlockquoteNode.svelte.d.ts +24 -0
  7. package/dist/components/BlockquoteNode.svelte.d.ts.map +1 -0
  8. package/dist/components/CheckboxNode.svelte +5 -0
  9. package/dist/components/CheckboxNode.svelte.d.ts +22 -0
  10. package/dist/components/CheckboxNode.svelte.d.ts.map +1 -0
  11. package/dist/components/CodeBlockNode.svelte +944 -0
  12. package/dist/components/CodeBlockNode.svelte.d.ts +43 -0
  13. package/dist/components/CodeBlockNode.svelte.d.ts.map +1 -0
  14. package/dist/components/D2BlockNode.svelte +272 -0
  15. package/dist/components/D2BlockNode.svelte.d.ts +33 -0
  16. package/dist/components/D2BlockNode.svelte.d.ts.map +1 -0
  17. package/dist/components/DefinitionListNode.svelte +8 -0
  18. package/dist/components/DefinitionListNode.svelte.d.ts +23 -0
  19. package/dist/components/DefinitionListNode.svelte.d.ts.map +1 -0
  20. package/dist/components/EmojiNode.svelte +7 -0
  21. package/dist/components/EmojiNode.svelte.d.ts +22 -0
  22. package/dist/components/EmojiNode.svelte.d.ts.map +1 -0
  23. package/dist/components/EmphasisNode.svelte +8 -0
  24. package/dist/components/EmphasisNode.svelte.d.ts +24 -0
  25. package/dist/components/EmphasisNode.svelte.d.ts.map +1 -0
  26. package/dist/components/FallbackComponent.svelte +8 -0
  27. package/dist/components/FallbackComponent.svelte.d.ts +23 -0
  28. package/dist/components/FallbackComponent.svelte.d.ts.map +1 -0
  29. package/dist/components/FootnoteAnchorNode.svelte +21 -0
  30. package/dist/components/FootnoteAnchorNode.svelte.d.ts +22 -0
  31. package/dist/components/FootnoteAnchorNode.svelte.d.ts.map +1 -0
  32. package/dist/components/FootnoteNode.svelte +19 -0
  33. package/dist/components/FootnoteNode.svelte.d.ts +24 -0
  34. package/dist/components/FootnoteNode.svelte.d.ts.map +1 -0
  35. package/dist/components/FootnoteReferenceNode.svelte +26 -0
  36. package/dist/components/FootnoteReferenceNode.svelte.d.ts +22 -0
  37. package/dist/components/FootnoteReferenceNode.svelte.d.ts.map +1 -0
  38. package/dist/components/HardBreakNode.svelte +1 -0
  39. package/dist/components/HardBreakNode.svelte.d.ts +27 -0
  40. package/dist/components/HardBreakNode.svelte.d.ts.map +1 -0
  41. package/dist/components/HeadingNode.svelte +15 -0
  42. package/dist/components/HeadingNode.svelte.d.ts +24 -0
  43. package/dist/components/HeadingNode.svelte.d.ts.map +1 -0
  44. package/dist/components/HighlightNode.svelte +8 -0
  45. package/dist/components/HighlightNode.svelte.d.ts +24 -0
  46. package/dist/components/HighlightNode.svelte.d.ts.map +1 -0
  47. package/dist/components/HtmlBlockNode.svelte +8 -0
  48. package/dist/components/HtmlBlockNode.svelte.d.ts +23 -0
  49. package/dist/components/HtmlBlockNode.svelte.d.ts.map +1 -0
  50. package/dist/components/HtmlInlineNode.svelte +8 -0
  51. package/dist/components/HtmlInlineNode.svelte.d.ts +23 -0
  52. package/dist/components/HtmlInlineNode.svelte.d.ts.map +1 -0
  53. package/dist/components/HtmlPreviewFrame.svelte +13 -0
  54. package/dist/components/HtmlPreviewFrame.svelte.d.ts +26 -0
  55. package/dist/components/HtmlPreviewFrame.svelte.d.ts.map +1 -0
  56. package/dist/components/ImageNode.svelte +86 -0
  57. package/dist/components/ImageNode.svelte.d.ts +25 -0
  58. package/dist/components/ImageNode.svelte.d.ts.map +1 -0
  59. package/dist/components/InfographicBlockNode.svelte +429 -0
  60. package/dist/components/InfographicBlockNode.svelte.d.ts +34 -0
  61. package/dist/components/InfographicBlockNode.svelte.d.ts.map +1 -0
  62. package/dist/components/InlineCodeNode.svelte +7 -0
  63. package/dist/components/InlineCodeNode.svelte.d.ts +22 -0
  64. package/dist/components/InlineCodeNode.svelte.d.ts.map +1 -0
  65. package/dist/components/InlineWrapNode.svelte +10 -0
  66. package/dist/components/InlineWrapNode.svelte.d.ts +25 -0
  67. package/dist/components/InlineWrapNode.svelte.d.ts.map +1 -0
  68. package/dist/components/InsertNode.svelte +8 -0
  69. package/dist/components/InsertNode.svelte.d.ts +24 -0
  70. package/dist/components/InsertNode.svelte.d.ts.map +1 -0
  71. package/dist/components/LinkNode.svelte +41 -0
  72. package/dist/components/LinkNode.svelte.d.ts +25 -0
  73. package/dist/components/LinkNode.svelte.d.ts.map +1 -0
  74. package/dist/components/ListItemNode.svelte +9 -0
  75. package/dist/components/ListItemNode.svelte.d.ts +24 -0
  76. package/dist/components/ListItemNode.svelte.d.ts.map +1 -0
  77. package/dist/components/ListNode.svelte +16 -0
  78. package/dist/components/ListNode.svelte.d.ts +24 -0
  79. package/dist/components/ListNode.svelte.d.ts.map +1 -0
  80. package/dist/components/MarkdownCodeBlockNode.svelte +7 -0
  81. package/dist/components/MarkdownCodeBlockNode.svelte.d.ts +23 -0
  82. package/dist/components/MarkdownCodeBlockNode.svelte.d.ts.map +1 -0
  83. package/dist/components/MathBlockNode.svelte +96 -0
  84. package/dist/components/MathBlockNode.svelte.d.ts +22 -0
  85. package/dist/components/MathBlockNode.svelte.d.ts.map +1 -0
  86. package/dist/components/MathInlineNode.svelte +103 -0
  87. package/dist/components/MathInlineNode.svelte.d.ts +22 -0
  88. package/dist/components/MathInlineNode.svelte.d.ts.map +1 -0
  89. package/dist/components/MermaidBlockNode.svelte +557 -0
  90. package/dist/components/MermaidBlockNode.svelte.d.ts +40 -0
  91. package/dist/components/MermaidBlockNode.svelte.d.ts.map +1 -0
  92. package/dist/components/NodeOutlet.svelte +192 -0
  93. package/dist/components/NodeOutlet.svelte.d.ts +24 -0
  94. package/dist/components/NodeOutlet.svelte.d.ts.map +1 -0
  95. package/dist/components/NodeRenderer.svelte +349 -0
  96. package/dist/components/NodeRenderer.svelte.d.ts +64 -0
  97. package/dist/components/NodeRenderer.svelte.d.ts.map +1 -0
  98. package/dist/components/ParagraphNode.svelte +21 -0
  99. package/dist/components/ParagraphNode.svelte.d.ts +24 -0
  100. package/dist/components/ParagraphNode.svelte.d.ts.map +1 -0
  101. package/dist/components/PreCodeNode.svelte +13 -0
  102. package/dist/components/PreCodeNode.svelte.d.ts +22 -0
  103. package/dist/components/PreCodeNode.svelte.d.ts.map +1 -0
  104. package/dist/components/ReferenceNode.svelte +8 -0
  105. package/dist/components/ReferenceNode.svelte.d.ts +23 -0
  106. package/dist/components/ReferenceNode.svelte.d.ts.map +1 -0
  107. package/dist/components/RenderChildren.svelte +12 -0
  108. package/dist/components/RenderChildren.svelte.d.ts +24 -0
  109. package/dist/components/RenderChildren.svelte.d.ts.map +1 -0
  110. package/dist/components/StrikethroughNode.svelte +8 -0
  111. package/dist/components/StrikethroughNode.svelte.d.ts +24 -0
  112. package/dist/components/StrikethroughNode.svelte.d.ts.map +1 -0
  113. package/dist/components/StrongNode.svelte +8 -0
  114. package/dist/components/StrongNode.svelte.d.ts +24 -0
  115. package/dist/components/StrongNode.svelte.d.ts.map +1 -0
  116. package/dist/components/SubscriptNode.svelte +8 -0
  117. package/dist/components/SubscriptNode.svelte.d.ts +24 -0
  118. package/dist/components/SubscriptNode.svelte.d.ts.map +1 -0
  119. package/dist/components/SuperscriptNode.svelte +8 -0
  120. package/dist/components/SuperscriptNode.svelte.d.ts +24 -0
  121. package/dist/components/SuperscriptNode.svelte.d.ts.map +1 -0
  122. package/dist/components/TableNode.svelte +8 -0
  123. package/dist/components/TableNode.svelte.d.ts +23 -0
  124. package/dist/components/TableNode.svelte.d.ts.map +1 -0
  125. package/dist/components/TextNode.svelte +37 -0
  126. package/dist/components/TextNode.svelte.d.ts +25 -0
  127. package/dist/components/TextNode.svelte.d.ts.map +1 -0
  128. package/dist/components/ThematicBreakNode.svelte +1 -0
  129. package/dist/components/ThematicBreakNode.svelte.d.ts +27 -0
  130. package/dist/components/ThematicBreakNode.svelte.d.ts.map +1 -0
  131. package/dist/components/Tooltip.svelte +4 -0
  132. package/dist/components/Tooltip.svelte.d.ts +21 -0
  133. package/dist/components/Tooltip.svelte.d.ts.map +1 -0
  134. package/dist/components/VmrContainerNode.svelte +8 -0
  135. package/dist/components/VmrContainerNode.svelte.d.ts +23 -0
  136. package/dist/components/VmrContainerNode.svelte.d.ts.map +1 -0
  137. package/dist/components/shared/diagram-height.d.ts +10 -0
  138. package/dist/components/shared/diagram-height.d.ts.map +1 -0
  139. package/dist/components/shared/diagram-height.js +52 -0
  140. package/dist/components/shared/node-helpers.d.ts +108 -0
  141. package/dist/components/shared/node-helpers.d.ts.map +1 -0
  142. package/dist/components/shared/node-helpers.js +220 -0
  143. package/dist/components/shared/node-outlet-helpers.d.ts +9 -0
  144. package/dist/components/shared/node-outlet-helpers.d.ts.map +1 -0
  145. package/dist/components/shared/node-outlet-helpers.js +92 -0
  146. package/dist/components/shared/render-window.d.ts +19 -0
  147. package/dist/components/shared/render-window.d.ts.map +1 -0
  148. package/dist/components/shared/render-window.js +63 -0
  149. package/dist/components/shared/renderNodeHtml.d.ts +4 -0
  150. package/dist/components/shared/renderNodeHtml.d.ts.map +1 -0
  151. package/dist/components/shared/renderNodeHtml.js +19 -0
  152. package/dist/components/shared/rich-block-helpers.d.ts +7 -0
  153. package/dist/components/shared/rich-block-helpers.d.ts.map +1 -0
  154. package/dist/components/shared/rich-block-helpers.js +76 -0
  155. package/dist/customComponents.d.ts +10 -0
  156. package/dist/customComponents.d.ts.map +1 -0
  157. package/dist/customComponents.js +66 -0
  158. package/dist/enhanceRenderedHtml.d.ts +21 -0
  159. package/dist/enhanceRenderedHtml.d.ts.map +1 -0
  160. package/dist/enhanceRenderedHtml.js +768 -0
  161. package/dist/hydrateCustomTagContent.d.ts +3 -0
  162. package/dist/hydrateCustomTagContent.d.ts.map +1 -0
  163. package/dist/hydrateCustomTagContent.js +130 -0
  164. package/dist/i18n/useSafeI18n.d.ts +5 -0
  165. package/dist/i18n/useSafeI18n.d.ts.map +1 -0
  166. package/dist/i18n/useSafeI18n.js +42 -0
  167. package/dist/index.css +2009 -0
  168. package/dist/index.d.ts +78 -0
  169. package/dist/index.d.ts.map +1 -0
  170. package/dist/index.js +66 -0
  171. package/dist/index.px.css +2009 -0
  172. package/dist/index.tailwind.css +2009 -0
  173. package/dist/optional/d2.d.ts +7 -0
  174. package/dist/optional/d2.d.ts.map +1 -0
  175. package/dist/optional/d2.js +67 -0
  176. package/dist/optional/infographic.d.ts +2 -0
  177. package/dist/optional/infographic.d.ts.map +1 -0
  178. package/dist/optional/infographic.js +29 -0
  179. package/dist/optional/katex.d.ts +7 -0
  180. package/dist/optional/katex.d.ts.map +1 -0
  181. package/dist/optional/katex.js +93 -0
  182. package/dist/optional/mermaid.d.ts +7 -0
  183. package/dist/optional/mermaid.d.ts.map +1 -0
  184. package/dist/optional/mermaid.js +171 -0
  185. package/dist/optional/monaco.d.ts +5 -0
  186. package/dist/optional/monaco.d.ts.map +1 -0
  187. package/dist/optional/monaco.js +70 -0
  188. package/dist/parseNestedMarkdownToNodes.d.ts +15 -0
  189. package/dist/parseNestedMarkdownToNodes.d.ts.map +1 -0
  190. package/dist/parseNestedMarkdownToNodes.js +66 -0
  191. package/dist/renderMarkdownHtml.d.ts +31 -0
  192. package/dist/renderMarkdownHtml.d.ts.map +1 -0
  193. package/dist/renderMarkdownHtml.js +465 -0
  194. package/dist/sanitizeHtmlContent.d.ts +3 -0
  195. package/dist/sanitizeHtmlContent.d.ts.map +1 -0
  196. package/dist/sanitizeHtmlContent.js +175 -0
  197. package/dist/sanitizeSvg.d.ts +3 -0
  198. package/dist/sanitizeSvg.d.ts.map +1 -0
  199. package/dist/sanitizeSvg.js +76 -0
  200. package/dist/tailwind-entry.d.ts +2 -0
  201. package/dist/tailwind-entry.d.ts.map +1 -0
  202. package/dist/tailwind-entry.js +1 -0
  203. package/dist/tooltip/singletonTooltip.d.ts +8 -0
  204. package/dist/tooltip/singletonTooltip.d.ts.map +1 -0
  205. package/dist/tooltip/singletonTooltip.js +124 -0
  206. package/dist/types/monaco.d.ts +66 -0
  207. package/dist/types/monaco.d.ts.map +1 -0
  208. package/dist/types/monaco.js +1 -0
  209. package/dist/utils/languageIcon.d.ts +8 -0
  210. package/dist/utils/languageIcon.d.ts.map +1 -0
  211. package/dist/utils/languageIcon.js +182 -0
  212. package/dist/utils/normalizeKaTeXRenderInput.d.ts +2 -0
  213. package/dist/utils/normalizeKaTeXRenderInput.d.ts.map +1 -0
  214. package/dist/utils/normalizeKaTeXRenderInput.js +7 -0
  215. package/dist/workers/katexCdnWorker.d.ts +21 -0
  216. package/dist/workers/katexCdnWorker.d.ts.map +1 -0
  217. package/dist/workers/katexCdnWorker.js +193 -0
  218. package/dist/workers/katexRenderer.worker.d.ts +2 -0
  219. package/dist/workers/katexRenderer.worker.d.ts.map +1 -0
  220. package/dist/workers/katexRenderer.worker.js +55 -0
  221. package/dist/workers/katexWorkerClient.d.ts +36 -0
  222. package/dist/workers/katexWorkerClient.d.ts.map +1 -0
  223. package/dist/workers/katexWorkerClient.js +270 -0
  224. package/dist/workers/mermaidCdnWorker.d.ts +16 -0
  225. package/dist/workers/mermaidCdnWorker.d.ts.map +1 -0
  226. package/dist/workers/mermaidCdnWorker.js +235 -0
  227. package/dist/workers/mermaidParser.worker.d.ts +2 -0
  228. package/dist/workers/mermaidParser.worker.d.ts.map +1 -0
  229. package/dist/workers/mermaidParser.worker.js +85 -0
  230. package/dist/workers/mermaidWorkerClient.d.ts +16 -0
  231. package/dist/workers/mermaidWorkerClient.d.ts.map +1 -0
  232. package/dist/workers/mermaidWorkerClient.js +170 -0
  233. package/package.json +95 -0
@@ -0,0 +1,429 @@
1
+ <script lang="ts">
2
+ import type { SvelteRenderableNode, SvelteRenderContext } from './shared/node-helpers'
3
+ import { afterUpdate, onDestroy, onMount, tick } from 'svelte'
4
+ import { useSafeI18n } from '../i18n/useSafeI18n'
5
+ import { getInfographic } from '../optional/infographic'
6
+ import { toSafeSvgMarkup } from '../sanitizeSvg'
7
+ import { hideTooltip, showTooltipForAnchor } from '../tooltip/singletonTooltip'
8
+ import { clampPreviewHeight, estimateInfographicPreviewHeight, parsePositiveNumber } from './shared/diagram-height'
9
+ import { clearElement, copyTextToClipboard, downloadSvgMarkup } from './shared/rich-block-helpers'
10
+ import { getString } from './shared/node-helpers'
11
+
12
+ export let node: SvelteRenderableNode
13
+ export let context: SvelteRenderContext | undefined = undefined
14
+ export let maxHeight: string | null | undefined = '500px'
15
+ export let estimatedPreviewHeightPx: number | undefined = undefined
16
+ export let loading: boolean | undefined = undefined
17
+ export let isDark: boolean | undefined = undefined
18
+ export let showHeader = true
19
+ export let showModeToggle = true
20
+ export let showCopyButton = true
21
+ export let showCollapseButton = true
22
+ export let showExportButton = true
23
+ export let showFullscreenButton = true
24
+ export let showZoomControls = true
25
+
26
+ const { t } = useSafeI18n()
27
+ const infographicIcon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path fill="#5b8ff9" d="M5 4.25A2.25 2.25 0 0 1 7.25 2h2.5A2.25 2.25 0 0 1 12 4.25v2.5A2.25 2.25 0 0 1 9.75 9h-2.5A2.25 2.25 0 0 1 5 6.75z"/><path fill="#61d9a6" d="M12 17.25A2.25 2.25 0 0 1 14.25 15h2.5A2.25 2.25 0 0 1 19 17.25v2.5A2.25 2.25 0 0 1 16.75 22h-2.5A2.25 2.25 0 0 1 12 19.75z"/><path fill="#f6bd16" d="M12 4.25A2.25 2.25 0 0 1 14.25 2h2.5A2.25 2.25 0 0 1 19 4.25v2.5A2.25 2.25 0 0 1 16.75 9h-2.5A2.25 2.25 0 0 1 12 6.75z"/><path fill="#5ad8a6" d="M7.5 10.75h1.75a6.25 6.25 0 0 1 6.25 6.25v.25h-2V17a4.25 4.25 0 0 0-4.25-4.25H7.5z"/><path fill="#7262fd" d="M15.5 11.1l3.75 2.16v4.33l-3.75 2.16l-3.75-2.16v-4.33z"/></svg>'
28
+
29
+ let renderHost: HTMLDivElement | null = null
30
+ let mounted = false
31
+ let renderToken = 0
32
+ let lastCompletedRenderSignature = ''
33
+ let activeRenderSignature = ''
34
+ let lastSuppressedErrorSignature = ''
35
+ let instance: any = null
36
+ let renderError = ''
37
+ let rendering = false
38
+ let rerenderQueued = false
39
+ let rerenderForce = false
40
+ let hasPreview = false
41
+ let copied = false
42
+ let collapsed = false
43
+ let showSource = false
44
+ let modalOpen = false
45
+ let modalMarkup = ''
46
+ let zoom = 1
47
+ let copyTimer: ReturnType<typeof setTimeout> | null = null
48
+
49
+ $: source = getString((node as any)?.code)
50
+ $: nodeLoading = typeof (node as any)?.loading === 'boolean' ? Boolean((node as any)?.loading) : true
51
+ $: resolvedLoading = loading ?? nodeLoading
52
+ $: final = context?.final ?? resolvedLoading === false
53
+ $: progressivePreview = resolvedLoading !== false || final === false
54
+ $: resolvedIsDark = isDark ?? context?.isDark ?? false
55
+ $: maxPreviewHeight = maxHeight === 'none' ? null : parsePositiveNumber(maxHeight)
56
+ $: previewHeight = clampPreviewHeight(
57
+ parsePositiveNumber(estimatedPreviewHeightPx) ?? estimateInfographicPreviewHeight(source),
58
+ 320,
59
+ maxPreviewHeight ?? undefined,
60
+ )
61
+ $: previewStyle = [
62
+ `min-height: ${previewHeight}px`,
63
+ maxHeight && maxHeight !== 'none' ? `max-height: ${maxHeight}` : '',
64
+ ].filter(Boolean).join('; ')
65
+ $: transformStyle = `transform: scale(${zoom}); transform-origin: center center;`
66
+ $: shouldRender = !(resolvedLoading && !source.trim())
67
+
68
+ onMount(() => {
69
+ mounted = true
70
+ queueInfographicRender(true)
71
+ })
72
+
73
+ afterUpdate(() => {
74
+ if (mounted)
75
+ queueInfographicRender()
76
+ })
77
+
78
+ onDestroy(() => {
79
+ mounted = false
80
+ renderToken += 1
81
+ destroyInstance()
82
+ lastCompletedRenderSignature = ''
83
+ if (copyTimer)
84
+ clearTimeout(copyTimer)
85
+ })
86
+
87
+ function queueInfographicRender(force = false) {
88
+ if (!mounted || !renderHost || collapsed || showSource || !source.trim())
89
+ return
90
+ void tick().then(() => renderInfographic(force))
91
+ }
92
+
93
+ async function renderInfographic(force = false) {
94
+ if (!mounted || !renderHost || collapsed || showSource)
95
+ return
96
+ if (!source.trim()) {
97
+ destroyInstance()
98
+ if (renderHost)
99
+ clearElement(renderHost)
100
+ hasPreview = false
101
+ renderError = ''
102
+ lastCompletedRenderSignature = ''
103
+ lastSuppressedErrorSignature = ''
104
+ return
105
+ }
106
+
107
+ const signature = `${source}\n${resolvedIsDark}\n${final}\n${progressivePreview}`
108
+ if (!force && signature === lastCompletedRenderSignature && hasPreview)
109
+ return
110
+ if (!force && signature === lastSuppressedErrorSignature)
111
+ return
112
+
113
+ if (rendering) {
114
+ if (signature !== activeRenderSignature || force) {
115
+ rerenderQueued = true
116
+ rerenderForce = rerenderForce || force
117
+ }
118
+ return
119
+ }
120
+
121
+ const token = ++renderToken
122
+ activeRenderSignature = signature
123
+ const shouldShowError = !progressivePreview
124
+ rendering = true
125
+ if (shouldShowError)
126
+ renderError = ''
127
+
128
+ try {
129
+ const InfographicClass = await getInfographic()
130
+ if (!mounted || token !== renderToken || collapsed || showSource || !renderHost)
131
+ return
132
+ if (!InfographicClass)
133
+ throw new Error('Infographic renderer is not available.')
134
+
135
+ destroyInstance()
136
+ clearElement(renderHost)
137
+ instance = new InfographicClass({
138
+ container: renderHost,
139
+ width: '100%',
140
+ height: '100%',
141
+ })
142
+
143
+ let renderErrorMessage = ''
144
+ instance.on?.('error', (error: unknown) => {
145
+ const errors = Array.isArray(error) ? error : [error]
146
+ renderErrorMessage = errors
147
+ .map((item) => {
148
+ if (item instanceof Error)
149
+ return item.message
150
+ if (typeof item === 'string')
151
+ return item
152
+ if (item && typeof item === 'object' && 'message' in item)
153
+ return String((item as { message?: unknown }).message ?? '')
154
+ return String(item ?? '')
155
+ })
156
+ .filter(Boolean)
157
+ .join('; ')
158
+ })
159
+
160
+ instance.render(source)
161
+ if (renderErrorMessage)
162
+ throw new Error(renderErrorMessage)
163
+ await tick()
164
+ if (!mounted || token !== renderToken || collapsed || showSource || !renderHost)
165
+ return
166
+ if (!renderHost.querySelector('svg') && !renderHost.childElementCount)
167
+ throw new Error('Infographic render returned empty output.')
168
+ hasPreview = true
169
+ renderError = ''
170
+ lastCompletedRenderSignature = signature
171
+ lastSuppressedErrorSignature = ''
172
+ }
173
+ catch (error) {
174
+ if (token === renderToken) {
175
+ lastCompletedRenderSignature = ''
176
+ if (shouldShowError) {
177
+ lastSuppressedErrorSignature = ''
178
+ destroyInstance()
179
+ clearElement(renderHost)
180
+ hasPreview = false
181
+ renderError = error instanceof Error ? error.message : String(error)
182
+ }
183
+ else {
184
+ lastSuppressedErrorSignature = signature
185
+ }
186
+ }
187
+ }
188
+ finally {
189
+ if (token === renderToken) {
190
+ rendering = false
191
+ activeRenderSignature = ''
192
+ if (rerenderQueued) {
193
+ const forceNext = rerenderForce
194
+ rerenderQueued = false
195
+ rerenderForce = false
196
+ queueInfographicRender(forceNext)
197
+ }
198
+ }
199
+ }
200
+ }
201
+
202
+ function destroyInstance() {
203
+ try {
204
+ instance?.destroy?.()
205
+ }
206
+ catch {}
207
+ instance = null
208
+ }
209
+
210
+ function resetPreviewRenderState() {
211
+ renderToken += 1
212
+ destroyInstance()
213
+ if (renderHost)
214
+ clearElement(renderHost)
215
+ rendering = false
216
+ rerenderQueued = false
217
+ rerenderForce = false
218
+ hasPreview = false
219
+ renderError = ''
220
+ activeRenderSignature = ''
221
+ lastCompletedRenderSignature = ''
222
+ lastSuppressedErrorSignature = ''
223
+ }
224
+
225
+ async function copy() {
226
+ await copyTextToClipboard(source)
227
+ context?.events?.onCopy?.(source)
228
+ copied = true
229
+ if (copyTimer)
230
+ clearTimeout(copyTimer)
231
+ copyTimer = setTimeout(() => {
232
+ copied = false
233
+ }, 1000)
234
+ }
235
+
236
+ function getRenderedSvg() {
237
+ const svg = renderHost?.querySelector('svg')
238
+ return svg ? toSafeSvgMarkup(svg.outerHTML) : ''
239
+ }
240
+
241
+ function exportSvg() {
242
+ const svg = getRenderedSvg()
243
+ if (svg)
244
+ downloadSvgMarkup(svg, `infographic-${Date.now()}.svg`)
245
+ }
246
+
247
+ function openModal() {
248
+ modalMarkup = renderHost?.innerHTML || ''
249
+ if (modalMarkup)
250
+ modalOpen = true
251
+ }
252
+
253
+ async function switchMode(mode: 'preview' | 'source') {
254
+ const nextShowSource = mode === 'source'
255
+ if (showSource === nextShowSource)
256
+ return
257
+
258
+ showSource = nextShowSource
259
+ resetPreviewRenderState()
260
+ if (!showSource) {
261
+ await tick()
262
+ queueInfographicRender(true)
263
+ }
264
+ }
265
+
266
+ async function toggleCollapsed() {
267
+ collapsed = !collapsed
268
+ resetPreviewRenderState()
269
+ if (!collapsed) {
270
+ await tick()
271
+ queueInfographicRender(true)
272
+ }
273
+ }
274
+
275
+ function zoomIn() {
276
+ zoom = Math.min(3, Math.round((zoom + 0.1) * 10) / 10)
277
+ }
278
+
279
+ function zoomOut() {
280
+ zoom = Math.max(0.5, Math.round((zoom - 0.1) * 10) / 10)
281
+ }
282
+
283
+ function showButtonTooltip(event: MouseEvent | FocusEvent, text: string) {
284
+ const target = event.currentTarget as HTMLElement | null
285
+ if (!target || (target instanceof HTMLButtonElement && target.disabled))
286
+ return
287
+ showTooltipForAnchor(target, text, 'top', false, undefined, resolvedIsDark)
288
+ }
289
+
290
+ function showCopyTooltip(event: MouseEvent | FocusEvent) {
291
+ showButtonTooltip(event, copied ? (t('common.copied') || 'Copied') : (t('common.copy') || 'Copy'))
292
+ }
293
+
294
+ function portal(node: HTMLElement) {
295
+ document.body.appendChild(node)
296
+ return {
297
+ destroy() {
298
+ node.remove()
299
+ },
300
+ }
301
+ }
302
+
303
+ function closeModal() {
304
+ modalOpen = false
305
+ }
306
+
307
+ function onModalOverlayClick(event: MouseEvent) {
308
+ if (event.target === event.currentTarget)
309
+ closeModal()
310
+ }
311
+
312
+ function onModalKeydown(event: KeyboardEvent) {
313
+ if (event.key === 'Escape')
314
+ closeModal()
315
+ }
316
+ </script>
317
+
318
+ {#if shouldRender}
319
+ <div
320
+ class:dark={resolvedIsDark}
321
+ class:is-rendering={rendering || resolvedLoading}
322
+ class="markstream-svelte-enhanced-block markstream-svelte-enhanced-block--infographic"
323
+ data-markstream-infographic="1"
324
+ data-markstream-mode={showSource ? 'source' : hasPreview ? 'preview' : 'fallback'}
325
+ >
326
+ {#if showHeader}
327
+ <div class="markstream-svelte-enhanced-block__header infographic-block-header">
328
+ <div class="markstream-svelte-enhanced-block__title">
329
+ <span class="markstream-svelte-enhanced-block__title-icon icon-slot action-icon" aria-hidden="true">{@html infographicIcon}</span>
330
+ <span class="markstream-svelte-enhanced-block__title-text infographic-label">Infographic</span>
331
+ </div>
332
+ {#if showModeToggle}
333
+ <div class="infographic-mode-toggle">
334
+ <button type="button" class:is-active={!showSource} class="markstream-svelte-enhanced-block__action mode-btn infographic-mode-btn" onblur={() => hideTooltip()} onclick={() => switchMode('preview')} onfocus={(event) => showButtonTooltip(event, t('common.preview') || 'Preview')} onmouseleave={() => hideTooltip()} onmouseenter={(event) => showButtonTooltip(event, t('common.preview') || 'Preview')}>
335
+ <span class="markstream-svelte-enhanced-block__action-content">
336
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0"/><circle cx="12" cy="12" r="3"/></g></svg>
337
+ <span>{t('common.preview')}</span>
338
+ </span>
339
+ </button>
340
+ <button type="button" class:is-active={showSource} class="markstream-svelte-enhanced-block__action mode-btn infographic-mode-btn" onblur={() => hideTooltip()} onclick={() => switchMode('source')} onfocus={(event) => showButtonTooltip(event, t('common.source') || 'Source')} onmouseleave={() => hideTooltip()} onmouseenter={(event) => showButtonTooltip(event, t('common.source') || 'Source')}>
341
+ <span class="markstream-svelte-enhanced-block__action-content">
342
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m16 18l6-6l-6-6M8 6l-6 6l6 6"/></svg>
343
+ <span>{t('common.source')}</span>
344
+ </span>
345
+ </button>
346
+ </div>
347
+ {/if}
348
+ <div class="markstream-svelte-enhanced-block__actions infographic-header-actions">
349
+ {#if showCollapseButton}
350
+ <button type="button" class="markstream-svelte-enhanced-block__action markstream-svelte-enhanced-block__action--icon infographic-action-btn" aria-label={collapsed ? (t('common.expand') || 'Expand') : (t('common.collapse') || 'Collapse')} aria-pressed={collapsed} onblur={() => hideTooltip()} onclick={toggleCollapsed} onfocus={(event) => showButtonTooltip(event, collapsed ? (t('common.expand') || 'Expand') : (t('common.collapse') || 'Collapse'))} onmouseleave={() => hideTooltip()} onmouseenter={(event) => showButtonTooltip(event, collapsed ? (t('common.expand') || 'Expand') : (t('common.collapse') || 'Collapse'))}>
351
+ <svg aria-hidden="true" role="img" style:transform={collapsed ? 'rotate(0deg)' : 'rotate(90deg)'} viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m9 18l6-6l-6-6"/></svg>
352
+ </button>
353
+ {/if}
354
+ {#if showCopyButton}
355
+ <button type="button" class="markstream-svelte-enhanced-block__action markstream-svelte-enhanced-block__action--icon infographic-action-btn" aria-label={copied ? (t('common.copied') || 'Copied') : (t('common.copy') || 'Copy')} onblur={() => hideTooltip()} onclick={copy} onfocus={showCopyTooltip} onmouseleave={() => hideTooltip()} onmouseenter={showCopyTooltip}>
356
+ {#if copied}
357
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 6L9 17l-5-5"/></svg>
358
+ {:else}
359
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></g></svg>
360
+ {/if}
361
+ </button>
362
+ {/if}
363
+ {#if showExportButton}
364
+ <button type="button" class="markstream-svelte-enhanced-block__action markstream-svelte-enhanced-block__action--icon infographic-action-btn" aria-label={t('common.export') || 'Export'} disabled={!hasPreview || showSource || collapsed} onblur={() => hideTooltip()} onclick={exportSvg} onfocus={(event) => showButtonTooltip(event, t('common.export') || 'Export')} onmouseleave={() => hideTooltip()} onmouseenter={(event) => showButtonTooltip(event, t('common.export') || 'Export')}>
365
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M12 15V3m9 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="m7 10l5 5l5-5"/></g></svg>
366
+ </button>
367
+ {/if}
368
+ {#if showFullscreenButton}
369
+ <button type="button" class="markstream-svelte-enhanced-block__action markstream-svelte-enhanced-block__action--icon infographic-action-btn" aria-label={t('common.open') || 'Open'} disabled={!hasPreview || showSource || collapsed} onblur={() => hideTooltip()} onclick={openModal} onfocus={(event) => showButtonTooltip(event, t('common.open') || 'Open')} onmouseleave={() => hideTooltip()} onmouseenter={(event) => showButtonTooltip(event, t('common.open') || 'Open')}>
370
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 3h6v6m0-6l-7 7M3 21l7-7m-1 7H3v-6"/></svg>
371
+ </button>
372
+ {/if}
373
+ </div>
374
+ </div>
375
+ {/if}
376
+
377
+ {#if !collapsed}
378
+ <div class="markstream-svelte-enhanced-block__body infographic-block-body">
379
+ {#if showSource}
380
+ <div class="infographic-source">
381
+ <pre class="infographic-source-code"><code>{source}</code></pre>
382
+ </div>
383
+ {:else}
384
+ {#if showZoomControls}
385
+ <div class="markstream-svelte-zoom-controls">
386
+ <button type="button" class="markstream-svelte-enhanced-block__action markstream-svelte-enhanced-block__action--icon infographic-action-btn" aria-label={t('common.zoomIn') || 'Zoom in'} onblur={() => hideTooltip()} onclick={zoomIn} onfocus={(event) => showButtonTooltip(event, t('common.zoomIn') || 'Zoom in')} onmouseleave={() => hideTooltip()} onmouseenter={(event) => showButtonTooltip(event, t('common.zoomIn') || 'Zoom in')}>
387
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="11" cy="11" r="8"/><path d="m21 21l-4.35-4.35M11 8v6m-3-3h6"/></g></svg>
388
+ </button>
389
+ <button type="button" class="markstream-svelte-enhanced-block__action markstream-svelte-enhanced-block__action--icon infographic-action-btn" aria-label={t('common.zoomOut') || 'Zoom out'} onblur={() => hideTooltip()} onclick={zoomOut} onfocus={(event) => showButtonTooltip(event, t('common.zoomOut') || 'Zoom out')} onmouseleave={() => hideTooltip()} onmouseenter={(event) => showButtonTooltip(event, t('common.zoomOut') || 'Zoom out')}>
390
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="11" cy="11" r="8"/><path d="m21 21l-4.35-4.35M8 11h6"/></g></svg>
391
+ </button>
392
+ <button type="button" class="markstream-svelte-enhanced-block__action infographic-action-btn infographic-zoom-reset" onblur={() => hideTooltip()} onclick={() => (zoom = 1)} onfocus={(event) => showButtonTooltip(event, t('common.resetZoom') || 'Reset zoom')} onmouseleave={() => hideTooltip()} onmouseenter={(event) => showButtonTooltip(event, t('common.resetZoom') || 'Reset zoom')}>{Math.round(zoom * 100)}%</button>
393
+ </div>
394
+ {/if}
395
+ <div class="infographic-render" style={previewStyle}>
396
+ <div bind:this={renderHost} style={transformStyle}></div>
397
+ {#if renderError}
398
+ <p class="d2-error">{renderError}</p>
399
+ {/if}
400
+ </div>
401
+ {/if}
402
+ </div>
403
+ {/if}
404
+
405
+ {#if modalOpen}
406
+ <div use:portal class:dark={resolvedIsDark} class="markstream-svelte markstream-svelte-modal-root">
407
+ <div class="mermaid-modal-overlay infographic-modal-overlay" role="dialog" aria-modal="true" tabindex="-1" onclick={onModalOverlayClick} onkeydown={onModalKeydown}>
408
+ <div class="mermaid-modal-panel infographic-modal-panel">
409
+ <div class="mermaid-modal-controls">
410
+ <button type="button" class="markstream-svelte-enhanced-block__action markstream-svelte-enhanced-block__action--icon infographic-action-btn" aria-label={t('common.zoomIn') || 'Zoom in'} onclick={zoomIn}>
411
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="11" cy="11" r="8"/><path d="m21 21l-4.35-4.35M11 8v6m-3-3h6"/></g></svg>
412
+ </button>
413
+ <button type="button" class="markstream-svelte-enhanced-block__action markstream-svelte-enhanced-block__action--icon infographic-action-btn" aria-label={t('common.zoomOut') || 'Zoom out'} onclick={zoomOut}>
414
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="11" cy="11" r="8"/><path d="m21 21l-4.35-4.35M8 11h6"/></g></svg>
415
+ </button>
416
+ <button type="button" class="markstream-svelte-enhanced-block__action infographic-action-btn infographic-zoom-reset" aria-label={t('common.resetZoom') || 'Reset zoom'} onclick={() => (zoom = 1)}>{Math.round(zoom * 100)}%</button>
417
+ <button type="button" class="markstream-svelte-enhanced-block__action markstream-svelte-enhanced-block__action--icon infographic-action-btn" aria-label={t('common.close') || 'Close'} onclick={closeModal}>
418
+ <svg aria-hidden="true" role="img" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M18 6L6 18M6 6l12 12"/></svg>
419
+ </button>
420
+ </div>
421
+ <div class="mermaid-modal-body">
422
+ <div class="mermaid-modal-content infographic-modal-content" style={`transform: scale(${zoom});`}>{@html modalMarkup}</div>
423
+ </div>
424
+ </div>
425
+ </div>
426
+ </div>
427
+ {/if}
428
+ </div>
429
+ {/if}
@@ -0,0 +1,34 @@
1
+ import type { SvelteRenderableNode, SvelteRenderContext } from './shared/node-helpers';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const InfographicBlockNode: $$__sveltets_2_IsomorphicComponent<{
16
+ node: SvelteRenderableNode;
17
+ context?: SvelteRenderContext | undefined;
18
+ maxHeight?: string | null | undefined;
19
+ estimatedPreviewHeightPx?: number | undefined;
20
+ loading?: boolean | undefined;
21
+ isDark?: boolean | undefined;
22
+ showHeader?: boolean;
23
+ showModeToggle?: boolean;
24
+ showCopyButton?: boolean;
25
+ showCollapseButton?: boolean;
26
+ showExportButton?: boolean;
27
+ showFullscreenButton?: boolean;
28
+ showZoomControls?: boolean;
29
+ }, {
30
+ [evt: string]: CustomEvent<any>;
31
+ }, {}, {}, string>;
32
+ type InfographicBlockNode = InstanceType<typeof InfographicBlockNode>;
33
+ export default InfographicBlockNode;
34
+ //# sourceMappingURL=InfographicBlockNode.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InfographicBlockNode.svelte.d.ts","sourceRoot":"","sources":["../../src/components/InfographicBlockNode.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAobtF,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,oBAAoB;UAV2Y,oBAAoB;cAAY,mBAAmB,GAAG,SAAS;gBAAc,MAAM,GAAG,IAAI,GAAG,SAAS;+BAA6B,MAAM,GAAG,SAAS;cAAY,OAAO,GAAG,SAAS;aAAW,OAAO,GAAG,SAAS;;;;;;;;;;kBAU9gB,CAAC;AACxF,KAAK,oBAAoB,GAAG,YAAY,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACxE,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import type { SvelteRenderableNode } from './shared/node-helpers'
3
+ import { getString } from './shared/node-helpers'
4
+ export let node: SvelteRenderableNode
5
+ $: code = getString((node as any)?.code ?? (node as any)?.content ?? (node as any)?.raw)
6
+ </script>
7
+ <code class="inline-code-node">{code}</code>
@@ -0,0 +1,22 @@
1
+ import type { SvelteRenderableNode } from './shared/node-helpers';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const InlineCodeNode: $$__sveltets_2_IsomorphicComponent<{
16
+ node: SvelteRenderableNode;
17
+ }, {
18
+ [evt: string]: CustomEvent<any>;
19
+ }, {}, {}, string>;
20
+ type InlineCodeNode = InstanceType<typeof InlineCodeNode>;
21
+ export default InlineCodeNode;
22
+ //# sourceMappingURL=InlineCodeNode.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InlineCodeNode.svelte.d.ts","sourceRoot":"","sources":["../../src/components/InlineCodeNode.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAajE,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,cAAc;UAVmB,oBAAoB;;;kBAUwC,CAAC;AAClF,KAAK,cAAc,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC;AAC5D,eAAe,cAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ <script lang="ts">
2
+ import type { SvelteRenderableNode, SvelteRenderContext } from './shared/node-helpers'
3
+ import RenderChildren from './RenderChildren.svelte'
4
+ import { getNodeList } from './shared/node-helpers'
5
+ export let node: SvelteRenderableNode
6
+ export let context: SvelteRenderContext | undefined = undefined
7
+ export let indexKey: string | number | undefined = undefined
8
+ export let tag = 'span'
9
+ </script>
10
+ <svelte:element this={tag}><RenderChildren nodes={getNodeList((node as any)?.children)} context={context} prefix={String(indexKey ?? tag) + '-' + tag} /></svelte:element>
@@ -0,0 +1,25 @@
1
+ import type { SvelteRenderableNode, SvelteRenderContext } from './shared/node-helpers';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const InlineWrapNode: $$__sveltets_2_IsomorphicComponent<{
16
+ node: SvelteRenderableNode;
17
+ context?: SvelteRenderContext | undefined;
18
+ indexKey?: string | number | undefined;
19
+ tag?: string;
20
+ }, {
21
+ [evt: string]: CustomEvent<any>;
22
+ }, {}, {}, string>;
23
+ type InlineWrapNode = InstanceType<typeof InlineWrapNode>;
24
+ export default InlineWrapNode;
25
+ //# sourceMappingURL=InlineWrapNode.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InlineWrapNode.svelte.d.ts","sourceRoot":"","sources":["../../src/components/InlineWrapNode.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAiBtF,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,cAAc;UAVsE,oBAAoB;cAAY,mBAAmB,GAAG,SAAS;eAAa,MAAM,GAAG,MAAM,GAAG,SAAS;;;;kBAU9F,CAAC;AAClF,KAAK,cAAc,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC;AAC5D,eAAe,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ <script lang="ts">
2
+ import type { SvelteRenderableNode, SvelteRenderContext } from './shared/node-helpers'
3
+ import InlineWrapNode from './InlineWrapNode.svelte'
4
+ export let node: SvelteRenderableNode
5
+ export let context: SvelteRenderContext | undefined = undefined
6
+ export let indexKey: string | number | undefined = undefined
7
+ </script>
8
+ <InlineWrapNode {node} {context} {indexKey} tag="ins" />
@@ -0,0 +1,24 @@
1
+ import type { SvelteRenderableNode, SvelteRenderContext } from './shared/node-helpers';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const InsertNode: $$__sveltets_2_IsomorphicComponent<{
16
+ node: SvelteRenderableNode;
17
+ context?: SvelteRenderContext | undefined;
18
+ indexKey?: string | number | undefined;
19
+ }, {
20
+ [evt: string]: CustomEvent<any>;
21
+ }, {}, {}, string>;
22
+ type InsertNode = InstanceType<typeof InsertNode>;
23
+ export default InsertNode;
24
+ //# sourceMappingURL=InsertNode.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InsertNode.svelte.d.ts","sourceRoot":"","sources":["../../src/components/InsertNode.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AActF,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,UAAU;UAV+D,oBAAoB;cAAY,mBAAmB,GAAG,SAAS;eAAa,MAAM,GAAG,MAAM,GAAG,SAAS;;;kBAUvF,CAAC;AAC9E,KAAK,UAAU,GAAG,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;AACpD,eAAe,UAAU,CAAC"}
@@ -0,0 +1,41 @@
1
+ <script lang="ts">
2
+ import type { SvelteRenderableNode, SvelteRenderContext } from './shared/node-helpers'
3
+ import { hideTooltip, showTooltipForAnchor } from '../tooltip/singletonTooltip'
4
+ import RenderChildren from './RenderChildren.svelte'
5
+ import { getNodeList, getString } from './shared/node-helpers'
6
+ export let node: SvelteRenderableNode
7
+ export let context: SvelteRenderContext | undefined = undefined
8
+ export let indexKey: string | number | undefined = undefined
9
+ export let showTooltip: boolean | undefined = undefined
10
+ $: href = getString((node as any)?.href)
11
+ $: title = getString((node as any)?.title || href)
12
+ $: children = getNodeList((node as any)?.children)
13
+ $: tooltipEnabled = showTooltip ?? context?.showTooltips ?? true
14
+ $: isHashLink = href.startsWith('#') && href.length > 1
15
+
16
+ function showLinkTooltip(event: MouseEvent | FocusEvent) {
17
+ if (!tooltipEnabled || !title)
18
+ return
19
+ showTooltipForAnchor(event.currentTarget as HTMLElement, title, 'top', false, undefined, context?.isDark)
20
+ }
21
+
22
+ function scrollToHashTarget(event: MouseEvent) {
23
+ if (!isHashLink || typeof document === 'undefined')
24
+ return
25
+ event.preventDefault()
26
+ const rawId = href.slice(1)
27
+ const decodedId = safeDecodeHashId(rawId)
28
+ const target = document.getElementById(rawId) || (decodedId !== rawId ? document.getElementById(decodedId) : null)
29
+ target?.scrollIntoView({ behavior: 'smooth', block: 'start' })
30
+ }
31
+
32
+ function safeDecodeHashId(value: string) {
33
+ try {
34
+ return decodeURIComponent(value)
35
+ }
36
+ catch {
37
+ return value
38
+ }
39
+ }
40
+ </script>
41
+ <a class:link-loading={Boolean((node as any)?.loading)} class="link-node" href={href || undefined} title={tooltipEnabled ? undefined : title} onblur={() => hideTooltip()} onclick={scrollToHashTarget} onfocus={showLinkTooltip} onmouseleave={() => hideTooltip()} onmouseenter={showLinkTooltip} target={isHashLink ? undefined : '_blank'} rel={isHashLink ? undefined : 'noreferrer noopener'}><span class="link-text-wrapper"><span class="link-text">{#if children.length}<RenderChildren nodes={children} context={context} prefix={String(indexKey ?? 'link') + '-link'} />{:else}{getString((node as any)?.text || href)}{/if}</span>{#if (node as any)?.loading}<span class="link-loading-indicator"></span>{/if}</span></a>