@coderminer/vue-markdown 1.0.0 → 1.0.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 (179) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/README.md +7 -2
  3. package/README.zh-CN.md +6 -3
  4. package/dist/chunks/MarkdownBlockquote-DVXziX2t.js +0 -2
  5. package/dist/chunks/MarkdownBreak-BwCi2Itt.js +0 -2
  6. package/dist/chunks/MarkdownCode-B1k9tmW5.js +0 -2
  7. package/dist/chunks/MarkdownConfigProvider-5N3ylrIu.js +0 -2
  8. package/dist/chunks/MarkdownContent-BAK6dqo7.js +0 -2
  9. package/dist/chunks/MarkdownCustomTag-lZJHsD6f.js +46 -0
  10. package/dist/chunks/MarkdownEmphasis-CppivOEu.js +0 -2
  11. package/dist/chunks/MarkdownEmpty-Av5k6bqa.js +0 -2
  12. package/dist/chunks/MarkdownError-C0sPs5W0.js +0 -2
  13. package/dist/chunks/MarkdownFootnoteReference-Dy3Khwyj.js +0 -2
  14. package/dist/chunks/MarkdownFootnotes-BRPzkbXv.js +0 -2
  15. package/dist/chunks/MarkdownHeading-DaNcP0_6.js +0 -2
  16. package/dist/chunks/MarkdownHorizontalRule-QNe_cuUI.js +0 -2
  17. package/dist/chunks/MarkdownHtml-66lYkvwM.js +0 -2
  18. package/dist/chunks/MarkdownImage-BRy76svs.js +0 -2
  19. package/dist/chunks/MarkdownInlineCode-MXZYFwex.js +0 -2
  20. package/dist/chunks/MarkdownLink-Dbx3NwgV.js +0 -2
  21. package/dist/chunks/MarkdownList-BJ-_C71k.js +0 -2
  22. package/dist/chunks/MarkdownListItem-Z1EHIY26.js +0 -2
  23. package/dist/chunks/MarkdownLoading-D-RYtXxf.js +0 -2
  24. package/dist/chunks/MarkdownParagraph-BxLSmSaG.js +0 -2
  25. package/dist/chunks/MarkdownRenderer-OlkdsvI3.js +482 -0
  26. package/dist/chunks/MarkdownRoot-DEE6iVfh.js +0 -2
  27. package/dist/chunks/MarkdownStrikethrough-CblvbqDk.js +0 -2
  28. package/dist/chunks/MarkdownStrong-uU5MzAoJ.js +0 -2
  29. package/dist/chunks/MarkdownTable-DmBTg_CR.js +0 -2
  30. package/dist/chunks/MarkdownTableCell-eiCJe847.js +0 -2
  31. package/dist/chunks/MarkdownTableRow-DuJaPntg.js +0 -2
  32. package/dist/chunks/MarkdownTableSection-PFHz-R33.js +0 -2
  33. package/dist/chunks/MarkdownTaskItem-BcmKo1lk.js +0 -2
  34. package/dist/chunks/{MarkdownToc-BdOHF-Yo.js → MarkdownToc-DHWWoH6t.js} +1 -3
  35. package/dist/chunks/MarkdownTocItem-DT9mR3vL.js +0 -2
  36. package/dist/chunks/{MermaidLiveEditor-W-qf3G-5.js → MermaidLiveEditor-1TKkI5bp.js} +1 -3
  37. package/dist/chunks/{VueSyntaxHighlighter-DyLsYMwy.js → VueSyntaxHighlighter-BWpCO-cX.js} +1 -3
  38. package/dist/chunks/adapters-CMwX_NEI.js +0 -2
  39. package/dist/chunks/{blank-line-Cb-JBP_5.js → blank-line-CKKsFeKR.js} +1 -3
  40. package/dist/chunks/codemirror-DyphMAEg.js +0 -2
  41. package/dist/chunks/config-aRYo2R8_.js +0 -2
  42. package/dist/chunks/context-8NfW6fxI.js +0 -2
  43. package/dist/chunks/convert-hast-C4Rg2ZuF.js +6 -0
  44. package/dist/chunks/default-ZQ5aHh-N.js +3 -0
  45. package/dist/chunks/diagnostics-CtHoJyiX.js +0 -2
  46. package/dist/chunks/{export-DZQ3cUry.js → export-BrgMLgUp.js} +13 -14
  47. package/dist/chunks/hast-to-nodes-DuZsi4XT.js +29 -0
  48. package/dist/chunks/{lib-BQiWGWpu.js → hast-util-from-html-D3e_iQ89.js} +495 -494
  49. package/dist/chunks/highlightjs-BxJFpKS1.js +196 -0
  50. package/dist/chunks/{identity-jZEhX2d5.js → identity-Bi27FKyx.js} +7 -8
  51. package/dist/chunks/labels-BtHiUTQI.js +0 -2
  52. package/dist/chunks/lib-CCnkLL6S.js +252 -0
  53. package/dist/chunks/longest-streak-DZE_EqsU.js +0 -2
  54. package/dist/chunks/{micromark-factory-space-Db040TnW.js → micromark-factory-space-CpXAnYUY.js} +2 -4
  55. package/dist/chunks/{normalize-CRYv3Wqt.js → normalize-VKfQXZiK.js} +57 -51
  56. package/dist/chunks/{plugin-DqkFHyny.js → plugin-YWo5uqTh.js} +1 -2
  57. package/dist/chunks/preset-BjaOuJUL.js +0 -2
  58. package/dist/chunks/{registry-DLjr93-V.js → registry-B7BfEkuy.js} +1051 -1045
  59. package/dist/chunks/{render-Cs8iKrgz.js → render-DAqK0w5J.js} +524 -494
  60. package/dist/chunks/{default-DWVS-I_8.js → rolldown-runtime-QGRDbDUS.js} +1 -5
  61. package/dist/chunks/{runtime-DJMnzjah.js → runtime-D95F41zG.js} +145 -117
  62. package/dist/chunks/security-y4EwUyAs.js +0 -2
  63. package/dist/chunks/{shared-DNAvZ-UY.js → shared-NjFDPmkb.js} +18 -27
  64. package/dist/chunks/{space-separated-tokens-CmBjEPdR.js → space-separated-tokens-1ebNqf35.js} +1 -3
  65. package/dist/chunks/url-D2BoivaE.js +0 -2
  66. package/dist/chunks/{useActiveHeading-BaGVMJnB.js → useActiveHeading-CnyGTG1u.js} +165 -122
  67. package/dist/components/CodeBlock.js +1 -1
  68. package/dist/components/MarkdownCustomTag.js +1 -1
  69. package/dist/components/MarkdownMath.js +1 -1
  70. package/dist/components/MarkdownMermaid.d.ts +3 -3
  71. package/dist/components/MarkdownMermaid.js +1 -1
  72. package/dist/components/MarkdownRenderer.d.ts +16 -19
  73. package/dist/components/MarkdownRenderer.js +1 -1
  74. package/dist/components/MarkdownToc.js +1 -1
  75. package/dist/components/MermaidBlock.js +1 -1
  76. package/dist/components/MermaidLiveEditor.js +1 -1
  77. package/dist/components/VueSyntaxHighlighter.js +1 -1
  78. package/dist/components/context.d.ts +2 -2
  79. package/dist/components/index.js +6 -6
  80. package/dist/components/types.d.ts +34 -2
  81. package/dist/composables/useMarkdownDocument.d.ts +2 -0
  82. package/dist/core/hast-nodes.d.ts +0 -3
  83. package/dist/core/hast-to-nodes.d.ts +9 -0
  84. package/dist/core/normalize.d.ts +10 -0
  85. package/dist/core/parts.d.ts +1 -0
  86. package/dist/core/slugger.d.ts +7 -0
  87. package/dist/core/types.d.ts +3 -1
  88. package/dist/headless.js +8 -8
  89. package/dist/highlight/convert-hast.d.ts +8 -0
  90. package/dist/highlight/index.d.ts +2 -1
  91. package/dist/highlight/index.js +4 -3
  92. package/dist/highlight/shared.d.ts +0 -5
  93. package/dist/highlight/shiki.js +2 -3
  94. package/dist/html/index.js +0 -2
  95. package/dist/index.d.ts +1 -1
  96. package/dist/index.js +47 -49
  97. package/dist/math/index.js +18 -16
  98. package/dist/mermaid/index.d.ts +2 -1
  99. package/dist/mermaid/index.js +8 -3
  100. package/dist/mermaid/plugin.d.ts +3 -0
  101. package/dist/mermaid/runtime.d.ts +3 -1
  102. package/dist/mermaid/sanitize-svg-lazy.d.ts +10 -0
  103. package/dist/mermaid/sanitize-svg.d.ts +3 -0
  104. package/dist/mermaid/sanitize.d.ts +6 -2
  105. package/dist/node-components.js +6 -6
  106. package/dist/pipeline.js +1 -1
  107. package/dist/plugins.js +1 -1
  108. package/dist/styles/components.css +25 -0
  109. package/package.json +6 -3
  110. package/dist/chunks/MarkdownBlockquote-DVXziX2t.js.map +0 -1
  111. package/dist/chunks/MarkdownBreak-BwCi2Itt.js.map +0 -1
  112. package/dist/chunks/MarkdownCode-B1k9tmW5.js.map +0 -1
  113. package/dist/chunks/MarkdownConfigProvider-5N3ylrIu.js.map +0 -1
  114. package/dist/chunks/MarkdownContent-BAK6dqo7.js.map +0 -1
  115. package/dist/chunks/MarkdownCustomTag-BBdn3-WO.js +0 -42
  116. package/dist/chunks/MarkdownCustomTag-BBdn3-WO.js.map +0 -1
  117. package/dist/chunks/MarkdownEmphasis-CppivOEu.js.map +0 -1
  118. package/dist/chunks/MarkdownEmpty-Av5k6bqa.js.map +0 -1
  119. package/dist/chunks/MarkdownError-C0sPs5W0.js.map +0 -1
  120. package/dist/chunks/MarkdownFootnoteReference-Dy3Khwyj.js.map +0 -1
  121. package/dist/chunks/MarkdownFootnotes-BRPzkbXv.js.map +0 -1
  122. package/dist/chunks/MarkdownHeading-DaNcP0_6.js.map +0 -1
  123. package/dist/chunks/MarkdownHorizontalRule-QNe_cuUI.js.map +0 -1
  124. package/dist/chunks/MarkdownHtml-66lYkvwM.js.map +0 -1
  125. package/dist/chunks/MarkdownImage-BRy76svs.js.map +0 -1
  126. package/dist/chunks/MarkdownInlineCode-MXZYFwex.js.map +0 -1
  127. package/dist/chunks/MarkdownLink-Dbx3NwgV.js.map +0 -1
  128. package/dist/chunks/MarkdownList-BJ-_C71k.js.map +0 -1
  129. package/dist/chunks/MarkdownListItem-Z1EHIY26.js.map +0 -1
  130. package/dist/chunks/MarkdownLoading-D-RYtXxf.js.map +0 -1
  131. package/dist/chunks/MarkdownParagraph-BxLSmSaG.js.map +0 -1
  132. package/dist/chunks/MarkdownRenderer-DLRRfsdI.js +0 -416
  133. package/dist/chunks/MarkdownRenderer-DLRRfsdI.js.map +0 -1
  134. package/dist/chunks/MarkdownRoot-DEE6iVfh.js.map +0 -1
  135. package/dist/chunks/MarkdownStrikethrough-CblvbqDk.js.map +0 -1
  136. package/dist/chunks/MarkdownStrong-uU5MzAoJ.js.map +0 -1
  137. package/dist/chunks/MarkdownTable-DmBTg_CR.js.map +0 -1
  138. package/dist/chunks/MarkdownTableCell-eiCJe847.js.map +0 -1
  139. package/dist/chunks/MarkdownTableRow-DuJaPntg.js.map +0 -1
  140. package/dist/chunks/MarkdownTableSection-PFHz-R33.js.map +0 -1
  141. package/dist/chunks/MarkdownTaskItem-BcmKo1lk.js.map +0 -1
  142. package/dist/chunks/MarkdownToc-BdOHF-Yo.js.map +0 -1
  143. package/dist/chunks/MarkdownTocItem-DT9mR3vL.js.map +0 -1
  144. package/dist/chunks/MermaidLiveEditor-W-qf3G-5.js.map +0 -1
  145. package/dist/chunks/VueSyntaxHighlighter-DyLsYMwy.js.map +0 -1
  146. package/dist/chunks/adapters-CMwX_NEI.js.map +0 -1
  147. package/dist/chunks/blank-line-Cb-JBP_5.js.map +0 -1
  148. package/dist/chunks/codemirror-DyphMAEg.js.map +0 -1
  149. package/dist/chunks/config-aRYo2R8_.js.map +0 -1
  150. package/dist/chunks/context-8NfW6fxI.js.map +0 -1
  151. package/dist/chunks/default-DWVS-I_8.js.map +0 -1
  152. package/dist/chunks/diagnostics-CtHoJyiX.js.map +0 -1
  153. package/dist/chunks/export-DZQ3cUry.js.map +0 -1
  154. package/dist/chunks/hast-nodes-C0bX3M5Z.js +0 -35
  155. package/dist/chunks/hast-nodes-C0bX3M5Z.js.map +0 -1
  156. package/dist/chunks/highlightjs-BEh-YwEG.js +0 -6041
  157. package/dist/chunks/highlightjs-BEh-YwEG.js.map +0 -1
  158. package/dist/chunks/identity-jZEhX2d5.js.map +0 -1
  159. package/dist/chunks/labels-BtHiUTQI.js.map +0 -1
  160. package/dist/chunks/lib-BQiWGWpu.js.map +0 -1
  161. package/dist/chunks/lib-LwqA_W3J.js +0 -127
  162. package/dist/chunks/lib-LwqA_W3J.js.map +0 -1
  163. package/dist/chunks/longest-streak-DZE_EqsU.js.map +0 -1
  164. package/dist/chunks/micromark-factory-space-Db040TnW.js.map +0 -1
  165. package/dist/chunks/normalize-CRYv3Wqt.js.map +0 -1
  166. package/dist/chunks/plugin-DqkFHyny.js.map +0 -1
  167. package/dist/chunks/preset-BjaOuJUL.js.map +0 -1
  168. package/dist/chunks/registry-DLjr93-V.js.map +0 -1
  169. package/dist/chunks/render-Cs8iKrgz.js.map +0 -1
  170. package/dist/chunks/runtime-DJMnzjah.js.map +0 -1
  171. package/dist/chunks/security-y4EwUyAs.js.map +0 -1
  172. package/dist/chunks/shared-DNAvZ-UY.js.map +0 -1
  173. package/dist/chunks/space-separated-tokens-CmBjEPdR.js.map +0 -1
  174. package/dist/chunks/url-D2BoivaE.js.map +0 -1
  175. package/dist/chunks/useActiveHeading-BaGVMJnB.js.map +0 -1
  176. package/dist/highlight/shiki.js.map +0 -1
  177. package/dist/html/index.js.map +0 -1
  178. package/dist/index.js.map +0 -1
  179. package/dist/math/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownTaskItem-BcmKo1lk.js","names":["_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_sfc_main","useRenderContext","_hoisted_1","_hoisted_2","_hoisted_3","MarkdownTaskItem_default","defineComponent","props","__props","context","checked","ref","value","state","computed","onChange","event","openBlock","createElementBlock","normalizeClass","createElementVNode","renderSlot","_ctx"],"sources":["../../src/components/MarkdownTaskItem.vue","../../src/components/MarkdownTaskItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport type { MarkdownNode } from '../core/types'\r\nimport { useRenderContext } from './context'\r\n\r\nconst props = defineProps<{\r\n node: MarkdownNode\r\n children?: MarkdownNode[]\r\n checked?: boolean\r\n disabled?: boolean\r\n}>()\r\n\r\nconst context = useRenderContext()\r\nconst checked = ref(Boolean(props.checked))\r\n\r\nwatch(\r\n () => props.checked,\r\n (value) => {\r\n checked.value = Boolean(value)\r\n },\r\n)\r\n\r\nconst state = computed(() => (checked.value ? 'checked' : 'unchecked'))\r\n\r\nfunction onChange(event: Event): void {\r\n checked.value = (event.target as HTMLInputElement).checked\r\n context.onTaskChange({ checked: checked.value, node: props.node })\r\n}\r\n</script>\r\n\r\n<template>\r\n <li\r\n data-vmd-part=\"task-item\"\r\n class=\"vmd-task-item\"\r\n :data-state=\"state\"\r\n :class=\"{ 'vmd-list-item': true }\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n data-vmd-part=\"task-checkbox\"\r\n class=\"vmd-task-checkbox\"\r\n :checked=\"checked\"\r\n :disabled=\"disabled\"\r\n @change=\"onChange\"\r\n />\r\n <span class=\"vmd-task-content\"><slot /></span>\r\n </li>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport type { MarkdownNode } from '../core/types'\r\nimport { useRenderContext } from './context'\r\n\r\nconst props = defineProps<{\r\n node: MarkdownNode\r\n children?: MarkdownNode[]\r\n checked?: boolean\r\n disabled?: boolean\r\n}>()\r\n\r\nconst context = useRenderContext()\r\nconst checked = ref(Boolean(props.checked))\r\n\r\nwatch(\r\n () => props.checked,\r\n (value) => {\r\n checked.value = Boolean(value)\r\n },\r\n)\r\n\r\nconst state = computed(() => (checked.value ? 'checked' : 'unchecked'))\r\n\r\nfunction onChange(event: Event): void {\r\n checked.value = (event.target as HTMLInputElement).checked\r\n context.onTaskChange({ checked: checked.value, node: props.node })\r\n}\r\n</script>\r\n\r\n<template>\r\n <li\r\n data-vmd-part=\"task-item\"\r\n class=\"vmd-task-item\"\r\n :data-state=\"state\"\r\n :class=\"{ 'vmd-list-item': true }\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n data-vmd-part=\"task-checkbox\"\r\n class=\"vmd-task-checkbox\"\r\n :checked=\"checked\"\r\n :disabled=\"disabled\"\r\n @change=\"onChange\"\r\n />\r\n <span class=\"vmd-task-content\"><slot /></span>\r\n </li>\r\n</template>\r\n"],"mappings":";;;;;;;;;;;;EAKA,IAAMY,IAAQC,GAORC,IAAUR,EAAiB,GAC3BS,IAAUC,EAAI,EAAQJ,EAAM,OAAQ;EAE1C,QACQA,EAAM,UACX,MAAU;GACT,EAAQ,QAAQ,EAAQK;EAC1B,CACF;EAEA,IAAMC,IAAQC,QAAgBJ,EAAQ,QAAQ,YAAY,WAAY;EAEtE,SAASK,EAAS,GAAoB;GAEpC,AADA,EAAQ,QAASC,EAAM,OAA4B,SACnDP,EAAQ,aAAa;IAAE,SAASC,EAAQ;IAAO,MAAMH,EAAM;GAAK,CAAC;EACnE;E,kBAIEZ,EAAA,GAAAC,EAeK,MAAA;GAdH,iBAAc;GACd,OAAKC,EAAA,CAAC,iBAEE,EAAA,iBAAA,GAAA,CAAyB,CAAA;GADhC,cAAYgB,EAAA;E,IAGbf,EAOE,SAAA;GANA,MAAK;GACL,iBAAc;GACd,OAAM;GACL,SAASY,EAAA;GACT,UAAUF,EAAA;GACF;E,iBAEXV,EAA8C,QAA9CM,GAA8C,CAAfL,EAAQuB,EAAA,QAAA,SAAA,C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownToc-BdOHF-Yo.js","names":["MarkdownTocItem","_openBlock","_createElementBlock","_createElementVNode","_Fragment","_renderList","_renderSlot","_createBlock","_resolveDynamicComponent","_sfc_main","filterTocByDepth","_hoisted_1","_hoisted_2","MarkdownToc_default","defineComponent","__emit","props","__props","visibleItems","computed","emit","navigate","id","itemComponent","_props$tocItem","MarkdownTocItem_default","openBlock","createElementBlock","createElementVNode","Fragment","renderList","renderSlot","_ctx","item","createBlock","resolveDynamicComponent"],"sources":["../../src/components/MarkdownToc.vue","../../src/components/MarkdownToc.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport type { MarkdownComponentValue, TocItem } from '../core/types'\r\nimport { filterTocByDepth } from '../core/normalize'\r\nimport MarkdownTocItem from './MarkdownTocItem.vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n items: TocItem[]\r\n activeId?: string\r\n label?: string\r\n tocItem?: MarkdownComponentValue\r\n /** Maximum heading level to show. `0` or omitted means every level. */\r\n tocDepth?: number\r\n }>(),\r\n {\r\n activeId: undefined,\r\n label: 'Table of contents',\r\n tocItem: undefined,\r\n tocDepth: 0,\r\n },\r\n)\r\n\r\nconst visibleItems = computed(() =>\r\n filterTocByDepth(props.items, props.tocDepth),\r\n)\r\n\r\nconst emit = defineEmits<{ navigate: [id: string] }>()\r\n\r\nfunction navigate(id: string): void {\r\n emit('navigate', id)\r\n}\r\n\r\nconst itemComponent = computed(() => props.tocItem ?? MarkdownTocItem)\r\n</script>\r\n\r\n<template>\r\n <nav data-vmd-part=\"toc\" class=\"vmd-toc\" :aria-label=\"label\">\r\n <ol data-vmd-part=\"toc-nav\" class=\"vmd-toc-nav\">\r\n <template v-for=\"item in visibleItems\" :key=\"item.id\">\r\n <slot\r\n name=\"toc-item\"\r\n :item=\"item\"\r\n :active=\"item.id === activeId\"\r\n :navigate=\"navigate\"\r\n >\r\n <component\r\n :is=\"itemComponent\"\r\n :item=\"item\"\r\n :active=\"item.id === activeId\"\r\n @navigate=\"navigate\"\r\n />\r\n </slot>\r\n </template>\r\n </ol>\r\n </nav>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport type { MarkdownComponentValue, TocItem } from '../core/types'\r\nimport { filterTocByDepth } from '../core/normalize'\r\nimport MarkdownTocItem from './MarkdownTocItem.vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n items: TocItem[]\r\n activeId?: string\r\n label?: string\r\n tocItem?: MarkdownComponentValue\r\n /** Maximum heading level to show. `0` or omitted means every level. */\r\n tocDepth?: number\r\n }>(),\r\n {\r\n activeId: undefined,\r\n label: 'Table of contents',\r\n tocItem: undefined,\r\n tocDepth: 0,\r\n },\r\n)\r\n\r\nconst visibleItems = computed(() =>\r\n filterTocByDepth(props.items, props.tocDepth),\r\n)\r\n\r\nconst emit = defineEmits<{ navigate: [id: string] }>()\r\n\r\nfunction navigate(id: string): void {\r\n emit('navigate', id)\r\n}\r\n\r\nconst itemComponent = computed(() => props.tocItem ?? MarkdownTocItem)\r\n</script>\r\n\r\n<template>\r\n <nav data-vmd-part=\"toc\" class=\"vmd-toc\" :aria-label=\"label\">\r\n <ol data-vmd-part=\"toc-nav\" class=\"vmd-toc-nav\">\r\n <template v-for=\"item in visibleItems\" :key=\"item.id\">\r\n <slot\r\n name=\"toc-item\"\r\n :item=\"item\"\r\n :active=\"item.id === activeId\"\r\n :navigate=\"navigate\"\r\n >\r\n <component\r\n :is=\"itemComponent\"\r\n :item=\"item\"\r\n :active=\"item.id === activeId\"\r\n @navigate=\"navigate\"\r\n />\r\n </slot>\r\n </template>\r\n </ol>\r\n </nav>\r\n</template>\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAMA,IAAMgB,IAAQC,GAiBRC,IAAeC,QACnBT,EAAiBM,EAAM,OAAOA,EAAM,QAAQ,CAC9C,GAEMI,IAAOL;EAEb,SAASM,EAAS,GAAkB;GAClC,EAAK,YAAYC,CAAE;EACrB;EAEA,IAAMC,IAAgBJ,QAAe;;GAAM,QAAA,IAAAH,EAAA,YAAA,OAAWhB,IAAXwB;EAAW,CAAe;E,kBAInEvB,EAAA,GAAAC,EAkBM,OAAA;GAlBD,iBAAc;GAAM,OAAM;GAAW,cAAYe,EAAA;E,IACpDd,EAgBK,MAhBLS,GAgBK,EAfHX,EAAA,EAAA,GAAAC,EAcWE,GAAA,MAAAC,EAdca,EAAA,QAAR,MACfZ,EAYO0B,EAAA,QAAA,YAAA;GAVE;GACN,QAAQC,EAAK,OAAOhB,EAAA;GACV;EAJb,SAYO,EANLhB,EAAA,GAAAM,EAKEC,EAJKe,EAAA,KAAa,GAAA;GACX;GACN,QAAQU,EAAK,OAAOhB,EAAA;GACpB,YAAUI;E,iCAX4B,GAAA,KAAA,GAAAY,EAAK,EAAE,C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownTocItem-DT9mR3vL.js","names":["$emit","_openBlock","_createElementBlock","_createElementVNode","_normalizeStyle","_withModifiers","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","MarkdownTocItem_default","defineComponent","props","__props","style","computed","openBlock","createElementBlock","createElementVNode","normalizeStyle","_cache","withModifiers","_ctx","toDisplayString"],"sources":["../../src/components/MarkdownTocItem.vue","../../src/components/MarkdownTocItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, type CSSProperties } from 'vue'\r\nimport type { TocItem } from '../core/types'\r\n\r\nconst props = withDefaults(\r\n defineProps<{ item: TocItem; active?: boolean }>(),\r\n { active: false },\r\n)\r\n\r\ndefineEmits<{ navigate: [id: string] }>()\r\n\r\nconst style = computed(\r\n () => ({ '--vmd-toc-depth': String(props.item.level) }) as CSSProperties,\r\n)\r\n</script>\r\n\r\n<template>\r\n <li class=\"vmd-toc-entry\">\r\n <a\r\n data-vmd-part=\"toc-item\"\r\n class=\"vmd-toc-item\"\r\n :href=\"`#${item.id}`\"\r\n :aria-current=\"active ? 'true' : undefined\"\r\n :style=\"style\"\r\n @click.prevent=\"$emit('navigate', item.id)\"\r\n >{{ item.text }}</a>\r\n </li>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, type CSSProperties } from 'vue'\r\nimport type { TocItem } from '../core/types'\r\n\r\nconst props = withDefaults(\r\n defineProps<{ item: TocItem; active?: boolean }>(),\r\n { active: false },\r\n)\r\n\r\ndefineEmits<{ navigate: [id: string] }>()\r\n\r\nconst style = computed(\r\n () => ({ '--vmd-toc-depth': String(props.item.level) }) as CSSProperties,\r\n)\r\n</script>\r\n\r\n<template>\r\n <li class=\"vmd-toc-entry\">\r\n <a\r\n data-vmd-part=\"toc-item\"\r\n class=\"vmd-toc-item\"\r\n :href=\"`#${item.id}`\"\r\n :aria-current=\"active ? 'true' : undefined\"\r\n :style=\"style\"\r\n @click.prevent=\"$emit('navigate', item.id)\"\r\n >{{ item.text }}</a>\r\n </li>\r\n</template>\r\n"],"mappings":";;;;;;;;;;;;;EAIA,IAAMY,IAAQC,GAORC,IAAQC,SACL,EAAE,mBAAmB,OAAOH,EAAM,KAAK,KAAK,EAAE,EACvD;E,kBAIEX,EAAA,GAAAC,EASK,MATLM,GASK,CARHL,EAOoB,KAAA;GANlB,iBAAc;GACd,OAAM;GACL,MAAI,IAAMU,EAAA,KAAK;GACf,gBAAcA,EAAA,SAAM,SAAY,KAAA;GAChC,OAAKT,EAAEU,EAAA,KAAK;GACZ,SAAKM,EAAA,OAAA,EAAA,KAAAf,GAAA,MAAUL,EAAAA,MAAK,YAAaa,EAAA,KAAK,EAAE,GAAA,CAAA,SAAA,CAAA;EACvC,GAAAP,EAAAO,EAAA,KAAK,IAAI,GAAA,IAAAJ,CAAA,C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MermaidLiveEditor-W-qf3G-5.js","names":["MermaidBlock","_openBlock","_createElementBlock","_unref","_createElementVNode","_createVNode","_normalizeStyle","_sfc_main","resolveLabel","_asyncToGenerator","isEmptySlotContent","useRenderContext","MermaidBlock_default","createMermaidEditor","lockCount","previousOverflow","lockPageScroll","unlockPageScroll","_previousOverflow","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","MermaidLiveEditor_default","defineComponent","__expose","__emit","props","__props","emit","asSource","value","initialValue","context","ownSlots","useSlots","resolvedTheme","computed","_ref","_props$theme","ref","previewSource","ratio","status","diagnostics","shallowRef","fullscreen","root","editorHost","handle","previewTimer","previewResult","previewError","isEmptyPreview","hasFullscreenSlot","_context$slots","renderSlot","name","slotProps","slot","fallback","output","scrollLocked","nativeFullscreen","active","lockScroll","unlockScroll","setFullscreen","next","_root$value","_root$value$focus","onKeydown","toggleFullscreen","_toggleFullscreen","element","_unused2","_element$requestFulls","_unused","_root$value$querySele","_root$value2","event","focusables","_root$value3","first","last","onFullscreenChange","diagnosticFromError","_props$diagnosticsFor","formatter","message","_unused3","match","line","createDiagnostic","onError","_diagnostic$source","diagnostic","nextTick","_diagnostic$source2","focusLine","onRendered","result","updateValue","source","schedulePreview","watch","onDividerKeydown","dragCleanup","startDrag","_root$value4","rect","move","moveEvent","up","onMounted","error","onUnmounted","focus","refreshPreview","FullscreenSlot","label","h","ToolbarSlot","defaultToolbar","_context$slots$toolba","_context$slots2","EditorSlot","PreviewSlot","emptyPreview","_previewResult$value$","_previewResult$value","_context$slots$previe","_context$slots3","hasSlotOutput","DiagnosticsContent","_diagnostic$source3","openBlock","createElementBlock","unref","createElementVNode","createVNode","normalizeStyle"],"sources":["../../src/components/scroll-lock.ts","../../src/components/MermaidLiveEditor.vue","../../src/components/MermaidLiveEditor.vue"],"sourcesContent":["let lockCount = 0\nlet previousOverflow: string | undefined\n\n/**\n * Lock page scrolling for every fullscreen surface on the page. The original\n * overflow is restored only when the last surface releases the lock.\n */\nexport function lockPageScroll(): void {\n if (typeof document === 'undefined') return\n if (lockCount === 0) {\n previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n }\n lockCount += 1\n}\n\n/** Release one page-scroll lock. Safe to call when the caller owns no lock. */\nexport function unlockPageScroll(): void {\n if (typeof document === 'undefined' || lockCount === 0) return\n lockCount -= 1\n if (lockCount === 0) {\n document.body.style.overflow = previousOverflow ?? ''\n previousOverflow = undefined\n }\n}\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n defineComponent,\r\n h,\r\n nextTick,\r\n onMounted,\r\n onUnmounted,\r\n ref,\r\n shallowRef,\r\n useSlots,\r\n watch,\r\n type VNodeChild,\r\n} from 'vue'\r\nimport type {\r\n DiagnosticFormatter,\r\n MarkdownDiagnostic,\r\n MarkdownTheme,\r\n MermaidRenderResult,\r\n MermaidRenderer,\r\n} from '../core/types'\r\nimport { createDiagnostic } from '../core/diagnostics'\r\nimport { resolveLabel } from '../core/labels'\r\nimport { isEmptySlotContent, useRenderContext } from './context'\r\nimport { lockPageScroll, unlockPageScroll } from './scroll-lock'\r\nimport MermaidBlock from './MermaidBlock.vue'\r\nimport { createMermaidEditor, type MermaidEditorHandle } from '../editor/codemirror'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n debounce?: number\r\n theme?: 'light' | 'dark' | 'auto' | 'custom'\r\n renderer?: MermaidRenderer\r\n diagnosticsFormatter?: DiagnosticFormatter\r\n compact?: boolean\r\n rawDetails?: boolean\r\n autoFocus?: boolean\r\n initialRatio?: number\r\n minRatio?: number\r\n }>(),\r\n {\r\n modelValue: '',\r\n debounce: 300,\r\n theme: undefined,\r\n renderer: undefined,\r\n diagnosticsFormatter: undefined,\r\n compact: false,\r\n rawDetails: false,\r\n autoFocus: false,\r\n initialRatio: 0.5,\r\n minRatio: 0.2,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string]\r\n preview: [value: string]\r\n error: [diagnostic: MarkdownDiagnostic]\r\n}>()\r\n\r\nfunction asSource(value: unknown): string {\r\n return typeof value === 'string' ? value : ''\r\n}\r\n\r\nconst initialValue = asSource(props.modelValue)\r\n\r\nconst context = useRenderContext()\r\nconst ownSlots = useSlots()\r\nconst resolvedTheme = computed<MarkdownTheme>(\r\n () => props.theme ?? context.theme ?? 'light',\r\n)\r\nconst value = ref(initialValue)\r\nconst previewSource = ref(initialValue)\r\nconst ratio = ref(props.initialRatio)\r\nconst status = ref<'idle' | 'pending' | 'ready' | 'error'>(\r\n initialValue.trim() ? 'pending' : 'idle',\r\n)\r\nconst diagnostics = shallowRef<MarkdownDiagnostic[]>([])\r\nconst fullscreen = ref(false)\r\nconst root = ref<HTMLElement>()\r\nconst editorHost = ref<HTMLElement>()\r\nlet handle: MermaidEditorHandle | undefined\r\nlet previewTimer: ReturnType<typeof setTimeout> | undefined\r\n\r\nconst previewResult = shallowRef<MermaidRenderResult | null>(null)\r\nconst previewError = ref<string | undefined>()\r\nconst isEmptyPreview = computed(() => previewSource.value.trim() === '')\r\nconst hasFullscreenSlot = computed(() =>\r\n Boolean(ownSlots.fullscreen || context.slots?.fullscreen),\r\n)\r\n\r\nfunction renderSlot(\r\n name: string,\r\n slotProps: Record<string, unknown>,\r\n fallback: () => VNodeChild,\r\n): VNodeChild {\r\n return context.renderHostSlot(name, slotProps, () => {\r\n const slot = ownSlots[name]\r\n if (!slot) return fallback()\r\n const output = slot(slotProps)\r\n return isEmptySlotContent(output) ? fallback() : output\r\n })\r\n}\r\n\r\nlet scrollLocked = false\r\nlet nativeFullscreen = false\r\nlet active = true\r\n\r\nfunction lockScroll(): void {\r\n if (scrollLocked) return\r\n scrollLocked = true\r\n lockPageScroll()\r\n}\r\n\r\nfunction unlockScroll(): void {\r\n if (!scrollLocked) return\r\n scrollLocked = false\r\n unlockPageScroll()\r\n}\r\n\r\nfunction setFullscreen(next: boolean): void {\r\n if (!active) return\r\n if (next) lockScroll()\r\n fullscreen.value = next\r\n if (next) {\r\n root.value?.focus?.()\r\n if (typeof document !== 'undefined') {\r\n document.addEventListener('keydown', onKeydown)\r\n }\r\n } else {\r\n if (typeof document !== 'undefined') {\r\n document.removeEventListener('keydown', onKeydown)\r\n }\r\n unlockScroll()\r\n }\r\n}\r\n\r\nasync function toggleFullscreen(): Promise<void> {\r\n const element = root.value\r\n if (typeof document === 'undefined') return\r\n if (!fullscreen.value) {\r\n nativeFullscreen = false\r\n try {\r\n await element?.requestFullscreen?.()\r\n if (!active) return\r\n nativeFullscreen = Boolean(element) && document.fullscreenElement === element\r\n } catch {\r\n // CSS fallback.\r\n }\r\n if (!active) return\r\n setFullscreen(true)\r\n } else {\r\n try {\r\n if (element && document.fullscreenElement === element) {\r\n await document.exitFullscreen()\r\n }\r\n } catch {\r\n // Ignore.\r\n }\r\n if (!active) return\r\n nativeFullscreen = false\r\n setFullscreen(false)\r\n }\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent): void {\r\n if (!fullscreen.value) return\r\n if (event.key === 'Escape') {\r\n setFullscreen(false)\r\n return\r\n }\r\n if (event.key !== 'Tab') return\r\n\r\n const focusables = Array.from(\r\n root.value?.querySelectorAll<HTMLElement>(\r\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n ) ?? [],\r\n ).filter((element) => !element.closest('[aria-hidden=\"true\"]'))\r\n if (focusables.length === 0) {\r\n event.preventDefault()\r\n root.value?.focus()\r\n return\r\n }\r\n const first = focusables[0]\r\n const last = focusables[focusables.length - 1]\r\n if (!first || !last) return\r\n if (event.shiftKey) {\r\n if (document.activeElement === first || document.activeElement === root.value) {\r\n event.preventDefault()\r\n last.focus()\r\n }\r\n } else if (document.activeElement === last) {\r\n event.preventDefault()\r\n first.focus()\r\n }\r\n}\r\n\r\nfunction onFullscreenChange(): void {\r\n if (!active) return\r\n const element = root.value\r\n if (element && document.fullscreenElement === element) {\r\n nativeFullscreen = true\r\n return\r\n }\r\n if (!nativeFullscreen) return\r\n nativeFullscreen = false\r\n setFullscreen(false)\r\n}\r\n\r\nfunction diagnosticFromError(message: string): MarkdownDiagnostic {\r\n const formatter = props.diagnosticsFormatter ?? context.diagnosticsFormatter\r\n if (formatter) {\r\n try {\r\n return formatter.format(message, value.value)\r\n } catch {\r\n // Fall through to the default formatter.\r\n }\r\n }\r\n const match = /line\\s+(\\d+)/i.exec(message)\r\n const line = match?.[1] ? Number(match[1]) : undefined\r\n return createDiagnostic(\r\n 'mermaid-error',\r\n line\r\n ? resolveLabel(context.labels.editorSyntaxError, { line })\r\n : resolveLabel(context.labels.editorParseError),\r\n {\r\n phase: 'render',\r\n details: message,\r\n source: line\r\n ? {\r\n start: { line, column: 1 },\r\n end: { line, column: 1 },\r\n }\r\n : undefined,\r\n },\r\n )\r\n}\r\n\r\nfunction onError(message: string): void {\r\n status.value = 'error'\r\n const diagnostic = diagnosticFromError(message)\r\n previewError.value = message\r\n diagnostics.value = [diagnostic]\r\n emit('error', diagnostic)\r\n if (props.autoFocus && diagnostic.source?.start?.line) {\r\n void nextTick(() => focusLine(diagnostic.source?.start.line))\r\n }\r\n}\r\n\r\nfunction onRendered(result: MermaidRenderResult): void {\r\n previewResult.value = result\r\n previewError.value = undefined\r\n status.value = 'ready'\r\n diagnostics.value = []\r\n}\r\n\r\nfunction updateValue(next: string): void {\r\n const source = asSource(next)\r\n value.value = source\r\n emit('update:modelValue', source)\r\n}\r\n\r\nfunction schedulePreview(next: string): void {\r\n if (previewTimer) clearTimeout(previewTimer)\r\n previewTimer = setTimeout(() => {\r\n previewSource.value = next\r\n emit('preview', next)\r\n }, Math.max(0, props.debounce))\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (next) => {\r\n const source = asSource(next)\r\n if (source === value.value) return\r\n value.value = source\r\n handle?.setValue(source)\r\n schedulePreview(source)\r\n },\r\n)\r\n\r\nwatch(value, (next) => {\r\n schedulePreview(next)\r\n})\r\n\r\nwatch(previewSource, (next) => {\r\n if (next.trim()) {\r\n status.value = 'pending'\r\n previewError.value = undefined\r\n diagnostics.value = []\r\n return\r\n }\r\n previewResult.value = null\r\n previewError.value = undefined\r\n diagnostics.value = []\r\n status.value = 'idle'\r\n})\r\n\r\nfunction focusLine(line?: number): void {\r\n if (line) handle?.focusLine(line)\r\n}\r\n\r\nfunction onDividerKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'ArrowLeft') {\r\n ratio.value = Math.max(props.minRatio, ratio.value - 0.05)\r\n event.preventDefault()\r\n } else if (event.key === 'ArrowRight') {\r\n ratio.value = Math.min(1 - props.minRatio, ratio.value + 0.05)\r\n event.preventDefault()\r\n } else if (event.key === 'Home') {\r\n ratio.value = props.initialRatio\r\n event.preventDefault()\r\n }\r\n}\r\n\r\nlet dragCleanup: (() => void) | undefined\r\nfunction startDrag(event: MouseEvent): void {\r\n if (typeof document === 'undefined') return\r\n const rect = root.value?.getBoundingClientRect()\r\n if (!rect) return\r\n const move = (moveEvent: MouseEvent): void => {\r\n const next = (moveEvent.clientX - rect.left) / rect.width\r\n ratio.value = Math.min(1 - props.minRatio, Math.max(props.minRatio, next))\r\n }\r\n const up = (): void => {\r\n document.removeEventListener('mousemove', move)\r\n document.removeEventListener('mouseup', up)\r\n dragCleanup = undefined\r\n }\r\n document.addEventListener('mousemove', move)\r\n document.addEventListener('mouseup', up)\r\n dragCleanup = up\r\n event.preventDefault()\r\n}\r\n\r\nonMounted(async () => {\r\n if (typeof document !== 'undefined') {\r\n document.addEventListener('fullscreenchange', onFullscreenChange)\r\n }\r\n await nextTick()\r\n if (!editorHost.value) return\r\n try {\r\n handle = await createMermaidEditor(editorHost.value, {\r\n value: value.value,\r\n theme: resolvedTheme.value,\r\n onChange: updateValue,\r\n })\r\n } catch (error) {\r\n if (import.meta.env.DEV) console.error('Mermaid editor failed', error)\r\n handle = undefined\r\n }\r\n})\r\n\r\nonUnmounted(() => {\r\n active = false\r\n if (previewTimer) clearTimeout(previewTimer)\r\n dragCleanup?.()\r\n handle?.destroy()\r\n if (typeof document !== 'undefined') {\r\n document.removeEventListener('keydown', onKeydown)\r\n document.removeEventListener('fullscreenchange', onFullscreenChange)\r\n }\r\n unlockScroll()\r\n})\r\n\r\nfunction focus(): void {\r\n handle?.focus()\r\n}\r\n\r\n/** Apply the current editor value to the preview without waiting for debounce. */\r\nfunction refreshPreview(): void {\r\n if (previewTimer) clearTimeout(previewTimer)\r\n previewSource.value = value.value\r\n emit('preview', value.value)\r\n}\r\n\r\ndefineExpose({\r\n focus,\r\n refreshPreview,\r\n toggleFullscreen,\r\n getDiagnostics: (): MarkdownDiagnostic[] => diagnostics.value,\r\n})\r\n\r\nconst FullscreenSlot = defineComponent({\r\n setup() {\r\n return () => {\r\n const label = resolveLabel(\r\n fullscreen.value\r\n ? context.labels.exitFullscreen\r\n : context.labels.fullscreen,\r\n )\r\n return renderSlot(\r\n 'fullscreen',\r\n {\r\n fullscreen: fullscreen.value,\r\n label,\r\n toggle: toggleFullscreen,\r\n },\r\n () =>\r\n h(\r\n 'button',\r\n {\r\n type: 'button',\r\n 'aria-pressed': fullscreen.value ? 'true' : 'false',\r\n onClick: toggleFullscreen,\r\n },\r\n label,\r\n ),\r\n )\r\n }\r\n },\r\n})\r\n\r\nconst ToolbarSlot = defineComponent({\r\n setup() {\r\n function defaultToolbar(): VNodeChild[] {\r\n return [\r\n h(\r\n 'span',\r\n { class: 'vmd-editor-title' },\r\n resolveLabel(context.labels.editor),\r\n ),\r\n h(FullscreenSlot),\r\n h(\r\n 'button',\r\n {\r\n type: 'button',\r\n onClick: () => {\r\n ratio.value = props.initialRatio\r\n },\r\n },\r\n resolveLabel(context.labels.editorReset),\r\n ),\r\n ]\r\n }\r\n\r\n return () => {\r\n const slotProps = {\r\n ratio: ratio.value,\r\n fullscreen: fullscreen.value,\r\n compact: props.compact,\r\n actions: {\r\n toggleFullscreen,\r\n resetRatio: () => {\r\n ratio.value = props.initialRatio\r\n },\r\n setRatio: (next: number) => {\r\n ratio.value = Math.min(\r\n 1 - props.minRatio,\r\n Math.max(props.minRatio, next),\r\n )\r\n },\r\n },\r\n }\r\n const slot = context.slots?.toolbar ?? ownSlots.toolbar\r\n if (!slot) return defaultToolbar()\r\n const output = slot(slotProps)\r\n if (isEmptySlotContent(output)) return defaultToolbar()\r\n return hasFullscreenSlot.value ? [output, h(FullscreenSlot)] : output\r\n }\r\n },\r\n})\r\n\r\nconst EditorSlot = defineComponent({\r\n setup() {\r\n return () =>\r\n renderSlot(\r\n 'editor',\r\n {\r\n value: value.value,\r\n update: updateValue,\r\n diagnostics: diagnostics.value,\r\n status: status.value,\r\n actions: {\r\n focus: () => handle?.focus(),\r\n reset: () => {\r\n updateValue('')\r\n handle?.setValue('')\r\n },\r\n fullscreen: toggleFullscreen,\r\n },\r\n },\r\n () =>\r\n h('div', {\r\n ref: editorHost,\r\n class: 'vmd-editor-host',\r\n 'data-vmd-part': 'editor-pane',\r\n }),\r\n )\r\n },\r\n})\r\n\r\nconst PreviewSlot = defineComponent({\r\n setup() {\r\n function emptyPreview(): VNodeChild {\r\n return renderSlot(\r\n 'empty',\r\n {\r\n source: previewSource.value,\r\n actions: {\r\n focus: () => handle?.focus(),\r\n refresh: refreshPreview,\r\n },\r\n },\r\n () =>\r\n h(\r\n 'p',\r\n {\r\n class: 'vmd-editor-empty',\r\n 'data-vmd-part': 'editor-empty',\r\n },\r\n resolveLabel(context.labels.editorEmpty),\r\n ),\r\n )\r\n }\r\n\r\n return () => {\r\n const slotProps = {\r\n source: previewSource.value,\r\n status: status.value,\r\n error: previewError.value,\r\n nodes: previewResult.value?.nodes ?? [],\r\n actions: {\r\n refresh: refreshPreview,\r\n fullscreen: toggleFullscreen,\r\n focus: () => handle?.focus(),\r\n },\r\n }\r\n const slot = context.slots?.preview ?? ownSlots.preview\r\n const output = slot ? slot(slotProps) : undefined\r\n const hasSlotOutput = slot ? !isEmptySlotContent(output) : false\r\n const renderer = isEmptyPreview.value\r\n ? null\r\n : h(MermaidBlock, {\r\n source: previewSource.value,\r\n renderer: props.renderer,\r\n theme: resolvedTheme.value,\r\n showErrors: true,\r\n compact: props.compact,\r\n style: hasSlotOutput ? { display: 'none' } : undefined,\r\n 'aria-hidden': hasSlotOutput ? 'true' : undefined,\r\n onError,\r\n onRendered,\r\n })\r\n const content = hasSlotOutput\r\n ? output\r\n : isEmptyPreview.value\r\n ? emptyPreview()\r\n : null\r\n return [renderer, content]\r\n }\r\n },\r\n})\r\n\r\nconst DiagnosticsContent = defineComponent({\r\n setup() {\r\n return () =>\r\n renderSlot(\r\n 'editor-diagnostics',\r\n {\r\n diagnostics: diagnostics.value,\r\n focusLine,\r\n },\r\n () => {\r\n if (diagnostics.value.length === 0) return null\r\n return h(\r\n 'ul',\r\n { class: 'vmd-editor-diagnostic-list', role: 'status' },\r\n diagnostics.value.map((diagnostic) => {\r\n const line = diagnostic.source?.start?.line\r\n return h('li', { key: diagnostic.message }, [\r\n h('span', diagnostic.message),\r\n props.rawDetails && diagnostic.details\r\n ? h(\r\n 'pre',\r\n { class: 'vmd-editor-diagnostic-details' },\r\n diagnostic.details,\r\n )\r\n : null,\r\n line\r\n ? h(\r\n 'button',\r\n {\r\n type: 'button',\r\n onClick: () => focusLine(line),\r\n },\r\n resolveLabel(context.labels.editorLine, { line }),\r\n )\r\n : null,\r\n ])\r\n }),\r\n )\r\n },\r\n )\r\n },\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"root\"\r\n data-vmd-part=\"editor\"\r\n class=\"vmd-editor\"\r\n :data-vmd-theme=\"resolvedTheme\"\r\n :data-fullscreen=\"fullscreen ? 'true' : undefined\"\r\n :data-compact=\"compact ? 'true' : undefined\"\r\n :aria-label=\"resolveLabel(context.labels.editor)\"\r\n role=\"group\"\r\n tabindex=\"-1\"\r\n >\r\n <div\r\n class=\"vmd-editor-surface\"\r\n :data-vmd-part=\"fullscreen ? 'editor-fullscreen' : undefined\"\r\n >\r\n <div data-vmd-part=\"editor-toolbar\" class=\"vmd-editor-toolbar\">\r\n <ToolbarSlot />\r\n </div>\r\n\r\n <div class=\"vmd-editor-body\">\r\n <div\r\n data-vmd-part=\"editor-pane\"\r\n class=\"vmd-editor-pane\"\r\n :style=\"{ flexBasis: `${ratio * 100}%` }\"\r\n >\r\n <EditorSlot />\r\n </div>\r\n <div\r\n data-vmd-part=\"editor-divider\"\r\n class=\"vmd-editor-divider\"\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n tabindex=\"0\"\r\n :aria-label=\"resolveLabel(context.labels.editorSplitter)\"\r\n :aria-valuenow=\"Math.round(ratio * 100)\"\r\n :aria-valuemin=\"Math.round(minRatio * 100)\"\r\n :aria-valuemax=\"Math.round((1 - minRatio) * 100)\"\r\n @mousedown=\"startDrag\"\r\n @keydown=\"onDividerKeydown\"\r\n />\r\n <div\r\n data-vmd-part=\"editor-preview\"\r\n class=\"vmd-editor-preview\"\r\n role=\"region\"\r\n :aria-label=\"resolveLabel(context.labels.preview)\"\r\n >\r\n <PreviewSlot />\r\n </div>\r\n </div>\r\n\r\n <div\r\n data-vmd-part=\"editor-diagnostics\"\r\n class=\"vmd-editor-diagnostics\"\r\n :data-compact=\"compact ? 'true' : undefined\"\r\n role=\"group\"\r\n :aria-label=\"resolveLabel(context.labels.editorDiagnostics)\"\r\n >\r\n <DiagnosticsContent />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n defineComponent,\r\n h,\r\n nextTick,\r\n onMounted,\r\n onUnmounted,\r\n ref,\r\n shallowRef,\r\n useSlots,\r\n watch,\r\n type VNodeChild,\r\n} from 'vue'\r\nimport type {\r\n DiagnosticFormatter,\r\n MarkdownDiagnostic,\r\n MarkdownTheme,\r\n MermaidRenderResult,\r\n MermaidRenderer,\r\n} from '../core/types'\r\nimport { createDiagnostic } from '../core/diagnostics'\r\nimport { resolveLabel } from '../core/labels'\r\nimport { isEmptySlotContent, useRenderContext } from './context'\r\nimport { lockPageScroll, unlockPageScroll } from './scroll-lock'\r\nimport MermaidBlock from './MermaidBlock.vue'\r\nimport { createMermaidEditor, type MermaidEditorHandle } from '../editor/codemirror'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n debounce?: number\r\n theme?: 'light' | 'dark' | 'auto' | 'custom'\r\n renderer?: MermaidRenderer\r\n diagnosticsFormatter?: DiagnosticFormatter\r\n compact?: boolean\r\n rawDetails?: boolean\r\n autoFocus?: boolean\r\n initialRatio?: number\r\n minRatio?: number\r\n }>(),\r\n {\r\n modelValue: '',\r\n debounce: 300,\r\n theme: undefined,\r\n renderer: undefined,\r\n diagnosticsFormatter: undefined,\r\n compact: false,\r\n rawDetails: false,\r\n autoFocus: false,\r\n initialRatio: 0.5,\r\n minRatio: 0.2,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string]\r\n preview: [value: string]\r\n error: [diagnostic: MarkdownDiagnostic]\r\n}>()\r\n\r\nfunction asSource(value: unknown): string {\r\n return typeof value === 'string' ? value : ''\r\n}\r\n\r\nconst initialValue = asSource(props.modelValue)\r\n\r\nconst context = useRenderContext()\r\nconst ownSlots = useSlots()\r\nconst resolvedTheme = computed<MarkdownTheme>(\r\n () => props.theme ?? context.theme ?? 'light',\r\n)\r\nconst value = ref(initialValue)\r\nconst previewSource = ref(initialValue)\r\nconst ratio = ref(props.initialRatio)\r\nconst status = ref<'idle' | 'pending' | 'ready' | 'error'>(\r\n initialValue.trim() ? 'pending' : 'idle',\r\n)\r\nconst diagnostics = shallowRef<MarkdownDiagnostic[]>([])\r\nconst fullscreen = ref(false)\r\nconst root = ref<HTMLElement>()\r\nconst editorHost = ref<HTMLElement>()\r\nlet handle: MermaidEditorHandle | undefined\r\nlet previewTimer: ReturnType<typeof setTimeout> | undefined\r\n\r\nconst previewResult = shallowRef<MermaidRenderResult | null>(null)\r\nconst previewError = ref<string | undefined>()\r\nconst isEmptyPreview = computed(() => previewSource.value.trim() === '')\r\nconst hasFullscreenSlot = computed(() =>\r\n Boolean(ownSlots.fullscreen || context.slots?.fullscreen),\r\n)\r\n\r\nfunction renderSlot(\r\n name: string,\r\n slotProps: Record<string, unknown>,\r\n fallback: () => VNodeChild,\r\n): VNodeChild {\r\n return context.renderHostSlot(name, slotProps, () => {\r\n const slot = ownSlots[name]\r\n if (!slot) return fallback()\r\n const output = slot(slotProps)\r\n return isEmptySlotContent(output) ? fallback() : output\r\n })\r\n}\r\n\r\nlet scrollLocked = false\r\nlet nativeFullscreen = false\r\nlet active = true\r\n\r\nfunction lockScroll(): void {\r\n if (scrollLocked) return\r\n scrollLocked = true\r\n lockPageScroll()\r\n}\r\n\r\nfunction unlockScroll(): void {\r\n if (!scrollLocked) return\r\n scrollLocked = false\r\n unlockPageScroll()\r\n}\r\n\r\nfunction setFullscreen(next: boolean): void {\r\n if (!active) return\r\n if (next) lockScroll()\r\n fullscreen.value = next\r\n if (next) {\r\n root.value?.focus?.()\r\n if (typeof document !== 'undefined') {\r\n document.addEventListener('keydown', onKeydown)\r\n }\r\n } else {\r\n if (typeof document !== 'undefined') {\r\n document.removeEventListener('keydown', onKeydown)\r\n }\r\n unlockScroll()\r\n }\r\n}\r\n\r\nasync function toggleFullscreen(): Promise<void> {\r\n const element = root.value\r\n if (typeof document === 'undefined') return\r\n if (!fullscreen.value) {\r\n nativeFullscreen = false\r\n try {\r\n await element?.requestFullscreen?.()\r\n if (!active) return\r\n nativeFullscreen = Boolean(element) && document.fullscreenElement === element\r\n } catch {\r\n // CSS fallback.\r\n }\r\n if (!active) return\r\n setFullscreen(true)\r\n } else {\r\n try {\r\n if (element && document.fullscreenElement === element) {\r\n await document.exitFullscreen()\r\n }\r\n } catch {\r\n // Ignore.\r\n }\r\n if (!active) return\r\n nativeFullscreen = false\r\n setFullscreen(false)\r\n }\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent): void {\r\n if (!fullscreen.value) return\r\n if (event.key === 'Escape') {\r\n setFullscreen(false)\r\n return\r\n }\r\n if (event.key !== 'Tab') return\r\n\r\n const focusables = Array.from(\r\n root.value?.querySelectorAll<HTMLElement>(\r\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n ) ?? [],\r\n ).filter((element) => !element.closest('[aria-hidden=\"true\"]'))\r\n if (focusables.length === 0) {\r\n event.preventDefault()\r\n root.value?.focus()\r\n return\r\n }\r\n const first = focusables[0]\r\n const last = focusables[focusables.length - 1]\r\n if (!first || !last) return\r\n if (event.shiftKey) {\r\n if (document.activeElement === first || document.activeElement === root.value) {\r\n event.preventDefault()\r\n last.focus()\r\n }\r\n } else if (document.activeElement === last) {\r\n event.preventDefault()\r\n first.focus()\r\n }\r\n}\r\n\r\nfunction onFullscreenChange(): void {\r\n if (!active) return\r\n const element = root.value\r\n if (element && document.fullscreenElement === element) {\r\n nativeFullscreen = true\r\n return\r\n }\r\n if (!nativeFullscreen) return\r\n nativeFullscreen = false\r\n setFullscreen(false)\r\n}\r\n\r\nfunction diagnosticFromError(message: string): MarkdownDiagnostic {\r\n const formatter = props.diagnosticsFormatter ?? context.diagnosticsFormatter\r\n if (formatter) {\r\n try {\r\n return formatter.format(message, value.value)\r\n } catch {\r\n // Fall through to the default formatter.\r\n }\r\n }\r\n const match = /line\\s+(\\d+)/i.exec(message)\r\n const line = match?.[1] ? Number(match[1]) : undefined\r\n return createDiagnostic(\r\n 'mermaid-error',\r\n line\r\n ? resolveLabel(context.labels.editorSyntaxError, { line })\r\n : resolveLabel(context.labels.editorParseError),\r\n {\r\n phase: 'render',\r\n details: message,\r\n source: line\r\n ? {\r\n start: { line, column: 1 },\r\n end: { line, column: 1 },\r\n }\r\n : undefined,\r\n },\r\n )\r\n}\r\n\r\nfunction onError(message: string): void {\r\n status.value = 'error'\r\n const diagnostic = diagnosticFromError(message)\r\n previewError.value = message\r\n diagnostics.value = [diagnostic]\r\n emit('error', diagnostic)\r\n if (props.autoFocus && diagnostic.source?.start?.line) {\r\n void nextTick(() => focusLine(diagnostic.source?.start.line))\r\n }\r\n}\r\n\r\nfunction onRendered(result: MermaidRenderResult): void {\r\n previewResult.value = result\r\n previewError.value = undefined\r\n status.value = 'ready'\r\n diagnostics.value = []\r\n}\r\n\r\nfunction updateValue(next: string): void {\r\n const source = asSource(next)\r\n value.value = source\r\n emit('update:modelValue', source)\r\n}\r\n\r\nfunction schedulePreview(next: string): void {\r\n if (previewTimer) clearTimeout(previewTimer)\r\n previewTimer = setTimeout(() => {\r\n previewSource.value = next\r\n emit('preview', next)\r\n }, Math.max(0, props.debounce))\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (next) => {\r\n const source = asSource(next)\r\n if (source === value.value) return\r\n value.value = source\r\n handle?.setValue(source)\r\n schedulePreview(source)\r\n },\r\n)\r\n\r\nwatch(value, (next) => {\r\n schedulePreview(next)\r\n})\r\n\r\nwatch(previewSource, (next) => {\r\n if (next.trim()) {\r\n status.value = 'pending'\r\n previewError.value = undefined\r\n diagnostics.value = []\r\n return\r\n }\r\n previewResult.value = null\r\n previewError.value = undefined\r\n diagnostics.value = []\r\n status.value = 'idle'\r\n})\r\n\r\nfunction focusLine(line?: number): void {\r\n if (line) handle?.focusLine(line)\r\n}\r\n\r\nfunction onDividerKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'ArrowLeft') {\r\n ratio.value = Math.max(props.minRatio, ratio.value - 0.05)\r\n event.preventDefault()\r\n } else if (event.key === 'ArrowRight') {\r\n ratio.value = Math.min(1 - props.minRatio, ratio.value + 0.05)\r\n event.preventDefault()\r\n } else if (event.key === 'Home') {\r\n ratio.value = props.initialRatio\r\n event.preventDefault()\r\n }\r\n}\r\n\r\nlet dragCleanup: (() => void) | undefined\r\nfunction startDrag(event: MouseEvent): void {\r\n if (typeof document === 'undefined') return\r\n const rect = root.value?.getBoundingClientRect()\r\n if (!rect) return\r\n const move = (moveEvent: MouseEvent): void => {\r\n const next = (moveEvent.clientX - rect.left) / rect.width\r\n ratio.value = Math.min(1 - props.minRatio, Math.max(props.minRatio, next))\r\n }\r\n const up = (): void => {\r\n document.removeEventListener('mousemove', move)\r\n document.removeEventListener('mouseup', up)\r\n dragCleanup = undefined\r\n }\r\n document.addEventListener('mousemove', move)\r\n document.addEventListener('mouseup', up)\r\n dragCleanup = up\r\n event.preventDefault()\r\n}\r\n\r\nonMounted(async () => {\r\n if (typeof document !== 'undefined') {\r\n document.addEventListener('fullscreenchange', onFullscreenChange)\r\n }\r\n await nextTick()\r\n if (!editorHost.value) return\r\n try {\r\n handle = await createMermaidEditor(editorHost.value, {\r\n value: value.value,\r\n theme: resolvedTheme.value,\r\n onChange: updateValue,\r\n })\r\n } catch (error) {\r\n if (import.meta.env.DEV) console.error('Mermaid editor failed', error)\r\n handle = undefined\r\n }\r\n})\r\n\r\nonUnmounted(() => {\r\n active = false\r\n if (previewTimer) clearTimeout(previewTimer)\r\n dragCleanup?.()\r\n handle?.destroy()\r\n if (typeof document !== 'undefined') {\r\n document.removeEventListener('keydown', onKeydown)\r\n document.removeEventListener('fullscreenchange', onFullscreenChange)\r\n }\r\n unlockScroll()\r\n})\r\n\r\nfunction focus(): void {\r\n handle?.focus()\r\n}\r\n\r\n/** Apply the current editor value to the preview without waiting for debounce. */\r\nfunction refreshPreview(): void {\r\n if (previewTimer) clearTimeout(previewTimer)\r\n previewSource.value = value.value\r\n emit('preview', value.value)\r\n}\r\n\r\ndefineExpose({\r\n focus,\r\n refreshPreview,\r\n toggleFullscreen,\r\n getDiagnostics: (): MarkdownDiagnostic[] => diagnostics.value,\r\n})\r\n\r\nconst FullscreenSlot = defineComponent({\r\n setup() {\r\n return () => {\r\n const label = resolveLabel(\r\n fullscreen.value\r\n ? context.labels.exitFullscreen\r\n : context.labels.fullscreen,\r\n )\r\n return renderSlot(\r\n 'fullscreen',\r\n {\r\n fullscreen: fullscreen.value,\r\n label,\r\n toggle: toggleFullscreen,\r\n },\r\n () =>\r\n h(\r\n 'button',\r\n {\r\n type: 'button',\r\n 'aria-pressed': fullscreen.value ? 'true' : 'false',\r\n onClick: toggleFullscreen,\r\n },\r\n label,\r\n ),\r\n )\r\n }\r\n },\r\n})\r\n\r\nconst ToolbarSlot = defineComponent({\r\n setup() {\r\n function defaultToolbar(): VNodeChild[] {\r\n return [\r\n h(\r\n 'span',\r\n { class: 'vmd-editor-title' },\r\n resolveLabel(context.labels.editor),\r\n ),\r\n h(FullscreenSlot),\r\n h(\r\n 'button',\r\n {\r\n type: 'button',\r\n onClick: () => {\r\n ratio.value = props.initialRatio\r\n },\r\n },\r\n resolveLabel(context.labels.editorReset),\r\n ),\r\n ]\r\n }\r\n\r\n return () => {\r\n const slotProps = {\r\n ratio: ratio.value,\r\n fullscreen: fullscreen.value,\r\n compact: props.compact,\r\n actions: {\r\n toggleFullscreen,\r\n resetRatio: () => {\r\n ratio.value = props.initialRatio\r\n },\r\n setRatio: (next: number) => {\r\n ratio.value = Math.min(\r\n 1 - props.minRatio,\r\n Math.max(props.minRatio, next),\r\n )\r\n },\r\n },\r\n }\r\n const slot = context.slots?.toolbar ?? ownSlots.toolbar\r\n if (!slot) return defaultToolbar()\r\n const output = slot(slotProps)\r\n if (isEmptySlotContent(output)) return defaultToolbar()\r\n return hasFullscreenSlot.value ? [output, h(FullscreenSlot)] : output\r\n }\r\n },\r\n})\r\n\r\nconst EditorSlot = defineComponent({\r\n setup() {\r\n return () =>\r\n renderSlot(\r\n 'editor',\r\n {\r\n value: value.value,\r\n update: updateValue,\r\n diagnostics: diagnostics.value,\r\n status: status.value,\r\n actions: {\r\n focus: () => handle?.focus(),\r\n reset: () => {\r\n updateValue('')\r\n handle?.setValue('')\r\n },\r\n fullscreen: toggleFullscreen,\r\n },\r\n },\r\n () =>\r\n h('div', {\r\n ref: editorHost,\r\n class: 'vmd-editor-host',\r\n 'data-vmd-part': 'editor-pane',\r\n }),\r\n )\r\n },\r\n})\r\n\r\nconst PreviewSlot = defineComponent({\r\n setup() {\r\n function emptyPreview(): VNodeChild {\r\n return renderSlot(\r\n 'empty',\r\n {\r\n source: previewSource.value,\r\n actions: {\r\n focus: () => handle?.focus(),\r\n refresh: refreshPreview,\r\n },\r\n },\r\n () =>\r\n h(\r\n 'p',\r\n {\r\n class: 'vmd-editor-empty',\r\n 'data-vmd-part': 'editor-empty',\r\n },\r\n resolveLabel(context.labels.editorEmpty),\r\n ),\r\n )\r\n }\r\n\r\n return () => {\r\n const slotProps = {\r\n source: previewSource.value,\r\n status: status.value,\r\n error: previewError.value,\r\n nodes: previewResult.value?.nodes ?? [],\r\n actions: {\r\n refresh: refreshPreview,\r\n fullscreen: toggleFullscreen,\r\n focus: () => handle?.focus(),\r\n },\r\n }\r\n const slot = context.slots?.preview ?? ownSlots.preview\r\n const output = slot ? slot(slotProps) : undefined\r\n const hasSlotOutput = slot ? !isEmptySlotContent(output) : false\r\n const renderer = isEmptyPreview.value\r\n ? null\r\n : h(MermaidBlock, {\r\n source: previewSource.value,\r\n renderer: props.renderer,\r\n theme: resolvedTheme.value,\r\n showErrors: true,\r\n compact: props.compact,\r\n style: hasSlotOutput ? { display: 'none' } : undefined,\r\n 'aria-hidden': hasSlotOutput ? 'true' : undefined,\r\n onError,\r\n onRendered,\r\n })\r\n const content = hasSlotOutput\r\n ? output\r\n : isEmptyPreview.value\r\n ? emptyPreview()\r\n : null\r\n return [renderer, content]\r\n }\r\n },\r\n})\r\n\r\nconst DiagnosticsContent = defineComponent({\r\n setup() {\r\n return () =>\r\n renderSlot(\r\n 'editor-diagnostics',\r\n {\r\n diagnostics: diagnostics.value,\r\n focusLine,\r\n },\r\n () => {\r\n if (diagnostics.value.length === 0) return null\r\n return h(\r\n 'ul',\r\n { class: 'vmd-editor-diagnostic-list', role: 'status' },\r\n diagnostics.value.map((diagnostic) => {\r\n const line = diagnostic.source?.start?.line\r\n return h('li', { key: diagnostic.message }, [\r\n h('span', diagnostic.message),\r\n props.rawDetails && diagnostic.details\r\n ? h(\r\n 'pre',\r\n { class: 'vmd-editor-diagnostic-details' },\r\n diagnostic.details,\r\n )\r\n : null,\r\n line\r\n ? h(\r\n 'button',\r\n {\r\n type: 'button',\r\n onClick: () => focusLine(line),\r\n },\r\n resolveLabel(context.labels.editorLine, { line }),\r\n )\r\n : null,\r\n ])\r\n }),\r\n )\r\n },\r\n )\r\n },\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"root\"\r\n data-vmd-part=\"editor\"\r\n class=\"vmd-editor\"\r\n :data-vmd-theme=\"resolvedTheme\"\r\n :data-fullscreen=\"fullscreen ? 'true' : undefined\"\r\n :data-compact=\"compact ? 'true' : undefined\"\r\n :aria-label=\"resolveLabel(context.labels.editor)\"\r\n role=\"group\"\r\n tabindex=\"-1\"\r\n >\r\n <div\r\n class=\"vmd-editor-surface\"\r\n :data-vmd-part=\"fullscreen ? 'editor-fullscreen' : undefined\"\r\n >\r\n <div data-vmd-part=\"editor-toolbar\" class=\"vmd-editor-toolbar\">\r\n <ToolbarSlot />\r\n </div>\r\n\r\n <div class=\"vmd-editor-body\">\r\n <div\r\n data-vmd-part=\"editor-pane\"\r\n class=\"vmd-editor-pane\"\r\n :style=\"{ flexBasis: `${ratio * 100}%` }\"\r\n >\r\n <EditorSlot />\r\n </div>\r\n <div\r\n data-vmd-part=\"editor-divider\"\r\n class=\"vmd-editor-divider\"\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n tabindex=\"0\"\r\n :aria-label=\"resolveLabel(context.labels.editorSplitter)\"\r\n :aria-valuenow=\"Math.round(ratio * 100)\"\r\n :aria-valuemin=\"Math.round(minRatio * 100)\"\r\n :aria-valuemax=\"Math.round((1 - minRatio) * 100)\"\r\n @mousedown=\"startDrag\"\r\n @keydown=\"onDividerKeydown\"\r\n />\r\n <div\r\n data-vmd-part=\"editor-preview\"\r\n class=\"vmd-editor-preview\"\r\n role=\"region\"\r\n :aria-label=\"resolveLabel(context.labels.preview)\"\r\n >\r\n <PreviewSlot />\r\n </div>\r\n </div>\r\n\r\n <div\r\n data-vmd-part=\"editor-diagnostics\"\r\n class=\"vmd-editor-diagnostics\"\r\n :data-compact=\"compact ? 'true' : undefined\"\r\n role=\"group\"\r\n :aria-label=\"resolveLabel(context.labels.editorDiagnostics)\"\r\n >\r\n <DiagnosticsContent />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"VueSyntaxHighlighter-DyLsYMwy.js","names":["_openBlock","_createElementBlock","_unref","_normalizeStyle","_createVNode","_createElementVNode","_sfc_main","resolveLabel","errorMessage","createDiagnostic","_asyncToGenerator","useMarkdownConfig","isEmptySlotContent","useRenderContext","useLineWindow","useCodeHighlighter","renderNodes","_hoisted_1","_hoisted_2","VueSyntaxHighlighter_default","defineComponent","__expose","__emit","props","__props","emit","context","config","ownSlots","useSlots","reportDiagnostic","_context$onRenderErro","diagnostic","_ref","_props$highlighter","_context$theme","result","blockMode","computed","copy","_copy","area","succeeded","error","slotContext","visibleLines","emptyContext","ActionsRegion","_context$slots","own","output","host","HeaderRegion","_context$slots2","_context$slots3","FooterRegion","_context$slots4","Body","slot","empty","children","virtualActive","startLine","lineHeight","line","highlighted","isHighlightedLine","endLine","totalLines","truncatable","expanded","toggle","_unref2","openBlock","createElementBlock","scrollRef","unref","resolvedTheme","active","normalizeStyle","_cache","args","onScroll","createVNode","createElementVNode"],"sources":["../../src/components/VueSyntaxHighlighter.vue","../../src/components/VueSyntaxHighlighter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, defineComponent, h, useSlots, type VNodeChild } from 'vue'\nimport type {\n HighlightLine,\n MarkdownDiagnostic,\n MarkdownHighlighter,\n MarkdownTheme,\n} from '../core/types'\nimport { createDiagnostic, errorMessage } from '../core/diagnostics'\nimport { resolveLabel } from '../core/labels'\nimport { useCodeHighlighter } from '../composables/useCodeHighlighter'\nimport { useLineWindow } from '../composables/useLineWindow'\nimport { renderNodes } from './render'\nimport { isEmptySlotContent, useRenderContext } from './context'\nimport { useMarkdownConfig } from './config'\n\nconst props = withDefaults(\n defineProps<{\n source: string\n language?: string\n theme?: MarkdownTheme\n highlighter?: MarkdownHighlighter\n lineNumbers?: boolean\n highlightLines?: HighlightLine[]\n maxLines?: number\n virtual?: boolean\n virtualThreshold?: number\n lineHeight?: number\n delay?: number\n }>(),\n {\n language: '',\n theme: undefined,\n highlighter: undefined,\n lineNumbers: false,\n highlightLines: () => [],\n maxLines: 0,\n virtual: false,\n virtualThreshold: 200,\n lineHeight: 20,\n delay: 0,\n },\n)\n\nconst emit = defineEmits<{\n copy: [source: string]\n error: [diagnostic: MarkdownDiagnostic]\n}>()\nconst context = useRenderContext()\nconst config = useMarkdownConfig()\nconst ownSlots = useSlots()\n\nfunction reportDiagnostic(diagnostic: MarkdownDiagnostic): void {\n context.onRenderError?.(diagnostic)\n emit('error', diagnostic)\n}\n\nconst { result, active, resolvedTheme, getHighlighted } = useCodeHighlighter({\n source: () => props.source,\n language: () => props.language,\n highlighter: () =>\n props.highlighter ?? context.highlighter ?? config.value.highlighter,\n theme: () => props.theme,\n contextTheme: () => context.theme ?? config.value.theme,\n delay: () => props.delay,\n onDiagnostic: reportDiagnostic,\n})\n\nconst {\n expanded,\n truncatable,\n totalLines,\n virtualActive,\n startLine,\n endLine,\n visibleLines,\n lineHeight,\n scrollRef,\n onScroll,\n toggle,\n isHighlightedLine,\n} = useLineWindow({\n nodes: () => result.value.nodes,\n source: () => props.source,\n maxLines: () => props.maxLines,\n virtual: () => props.virtual,\n virtualThreshold: () => props.virtualThreshold,\n lineHeight: () => props.lineHeight,\n highlightLines: () => props.highlightLines,\n})\n\nconst blockMode = computed(() => result.value.mode === 'block')\n\nasync function copy(): Promise<void> {\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n await navigator.clipboard.writeText(props.source)\n } else if (typeof document !== 'undefined') {\n const area = document.createElement('textarea')\n area.value = props.source\n document.body.appendChild(area)\n area.select()\n const succeeded = document.execCommand('copy')\n area.remove()\n if (succeeded === false) throw new Error('The copy command was rejected.')\n } else {\n throw new Error('Clipboard access is not available.')\n }\n emit('copy', props.source)\n } catch (error) {\n reportDiagnostic(\n createDiagnostic(\n 'copy-error',\n `The source could not be copied to the clipboard: ${errorMessage(error)}`,\n { severity: 'warning', phase: 'render' },\n ),\n )\n }\n}\n\ndefineExpose({ copy, getHighlighted, highlighted: result })\n\nconst slotContext = computed(() => ({\n source: props.source,\n language: props.language,\n highlighted: result.value,\n nodes: result.value.nodes,\n lines: visibleLines.value,\n actions: { copy },\n}))\n\nconst emptyContext = computed(() => ({\n source: props.source,\n language: props.language,\n label: resolveLabel(context.labels.empty),\n actions: { copy },\n}))\n\nconst ActionsRegion = defineComponent({\n setup() {\n return () => {\n const own = ownSlots.actions\n if (own) {\n const output = own(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'span',\n {\n 'data-vmd-part': 'highlighter-actions',\n class: 'vmd-highlighter-actions',\n },\n output,\n )\n }\n }\n const host = context.slots?.actions\n if (host) {\n const output = host(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'span',\n {\n 'data-vmd-part': 'highlighter-actions',\n class: 'vmd-highlighter-actions',\n },\n output,\n )\n }\n }\n return null\n }\n },\n})\n\nconst HeaderRegion = defineComponent({\n setup() {\n return () => {\n const own = ownSlots.header\n if (own) {\n const output = own(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-header',\n class: 'vmd-highlighter-header',\n },\n output,\n )\n }\n }\n const host = context.slots?.header\n if (host) {\n const output = host(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-header',\n class: 'vmd-highlighter-header',\n },\n output,\n )\n }\n }\n if (!ownSlots.actions && !context.slots?.actions) return null\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-header',\n class: 'vmd-highlighter-header',\n },\n [\n h(\n 'span',\n { class: 'vmd-highlighter-label' },\n props.language || 'text',\n ),\n h(ActionsRegion),\n ],\n )\n }\n },\n})\n\nconst FooterRegion = defineComponent({\n setup() {\n return () => {\n const own = ownSlots.footer\n if (own) {\n const output = own(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-footer',\n class: 'vmd-highlighter-footer',\n },\n output,\n )\n }\n }\n const host = context.slots?.footer\n if (host) {\n const output = host(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-footer',\n class: 'vmd-highlighter-footer',\n },\n output,\n )\n }\n }\n return null\n }\n },\n})\n\nconst Body = defineComponent({\n setup() {\n return () =>\n context.renderHostSlot(\n 'highlighter',\n {\n source: props.source,\n language: props.language,\n nodes: result.value.nodes,\n lines: visibleLines.value,\n highlighted: result.value,\n actions: { copy },\n },\n () => {\n const slot = ownSlots.highlighter\n if (slot) {\n const output = slot({\n source: props.source,\n language: props.language,\n nodes: result.value.nodes,\n lines: visibleLines.value,\n highlighted: result.value,\n actions: { copy },\n })\n if (!isEmptySlotContent(output)) return output\n }\n if (props.source === '') {\n return context.renderHostSlot('empty', emptyContext.value, () => {\n const empty = ownSlots.empty\n if (empty) {\n const output = empty(emptyContext.value)\n if (!isEmptySlotContent(output)) return output\n }\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-empty',\n class: 'vmd-highlighter-empty',\n },\n resolveLabel(context.labels.empty),\n )\n })\n }\n if (blockMode.value) {\n return renderNodes(result.value.nodes, context)\n }\n const children: VNodeChild[] = []\n if (virtualActive.value && startLine.value > 0) {\n children.push(\n h('div', {\n 'aria-hidden': 'true',\n style: { height: `${startLine.value * lineHeight.value}px` },\n }),\n )\n }\n for (const line of visibleLines.value) {\n const highlighted = isHighlightedLine(line.index)\n children.push(\n h(\n 'div',\n {\n class: 'vmd-highlighter-line',\n 'data-vmd-part': 'highlighter-line',\n 'data-line': String(line.index + 1),\n 'data-highlighted': highlighted ? 'true' : undefined,\n },\n [\n props.lineNumbers\n ? h(\n 'span',\n {\n class: 'vmd-highlighter-gutter',\n 'data-vmd-part': 'highlighter-gutter',\n 'aria-hidden': 'true',\n },\n String(line.index + 1),\n )\n : null,\n h(\n 'code',\n { class: 'vmd-highlighter-code' },\n renderNodes(line.nodes, context),\n ),\n ],\n ),\n )\n }\n if (virtualActive.value && endLine.value < totalLines.value) {\n children.push(\n h('div', {\n 'aria-hidden': 'true',\n style: {\n height: `${(totalLines.value - endLine.value) * lineHeight.value}px`,\n },\n }),\n )\n }\n if (truncatable.value) {\n children.push(\n h(\n 'button',\n {\n type: 'button',\n class: 'vmd-highlighter-toggle',\n 'data-vmd-part': 'highlighter-toggle',\n 'aria-expanded': expanded.value ? 'true' : 'false',\n onClick: toggle,\n },\n expanded.value\n ? resolveLabel(context.labels.showLess)\n : resolveLabel(context.labels.showAll),\n ),\n )\n }\n return children\n },\n )\n },\n})\n</script>\n\n<template>\n <div\n ref=\"scrollRef\"\n data-vmd-part=\"highlighter\"\n class=\"vmd-highlighter\"\n :data-vmd-theme=\"resolvedTheme\"\n :data-language=\"language || 'text'\"\n :data-highlighter=\"active?.id\"\n :data-virtual=\"virtualActive ? 'true' : undefined\"\n :style=\"\n virtualActive\n ? { maxHeight: `${lineHeight * 20}px`, overflow: 'auto' }\n : undefined\n \"\n @scroll=\"onScroll\"\n >\n <HeaderRegion />\n <div data-vmd-part=\"highlighter-body\" class=\"vmd-highlighter-body\">\n <Body />\n </div>\n <FooterRegion />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, defineComponent, h, useSlots, type VNodeChild } from 'vue'\nimport type {\n HighlightLine,\n MarkdownDiagnostic,\n MarkdownHighlighter,\n MarkdownTheme,\n} from '../core/types'\nimport { createDiagnostic, errorMessage } from '../core/diagnostics'\nimport { resolveLabel } from '../core/labels'\nimport { useCodeHighlighter } from '../composables/useCodeHighlighter'\nimport { useLineWindow } from '../composables/useLineWindow'\nimport { renderNodes } from './render'\nimport { isEmptySlotContent, useRenderContext } from './context'\nimport { useMarkdownConfig } from './config'\n\nconst props = withDefaults(\n defineProps<{\n source: string\n language?: string\n theme?: MarkdownTheme\n highlighter?: MarkdownHighlighter\n lineNumbers?: boolean\n highlightLines?: HighlightLine[]\n maxLines?: number\n virtual?: boolean\n virtualThreshold?: number\n lineHeight?: number\n delay?: number\n }>(),\n {\n language: '',\n theme: undefined,\n highlighter: undefined,\n lineNumbers: false,\n highlightLines: () => [],\n maxLines: 0,\n virtual: false,\n virtualThreshold: 200,\n lineHeight: 20,\n delay: 0,\n },\n)\n\nconst emit = defineEmits<{\n copy: [source: string]\n error: [diagnostic: MarkdownDiagnostic]\n}>()\nconst context = useRenderContext()\nconst config = useMarkdownConfig()\nconst ownSlots = useSlots()\n\nfunction reportDiagnostic(diagnostic: MarkdownDiagnostic): void {\n context.onRenderError?.(diagnostic)\n emit('error', diagnostic)\n}\n\nconst { result, active, resolvedTheme, getHighlighted } = useCodeHighlighter({\n source: () => props.source,\n language: () => props.language,\n highlighter: () =>\n props.highlighter ?? context.highlighter ?? config.value.highlighter,\n theme: () => props.theme,\n contextTheme: () => context.theme ?? config.value.theme,\n delay: () => props.delay,\n onDiagnostic: reportDiagnostic,\n})\n\nconst {\n expanded,\n truncatable,\n totalLines,\n virtualActive,\n startLine,\n endLine,\n visibleLines,\n lineHeight,\n scrollRef,\n onScroll,\n toggle,\n isHighlightedLine,\n} = useLineWindow({\n nodes: () => result.value.nodes,\n source: () => props.source,\n maxLines: () => props.maxLines,\n virtual: () => props.virtual,\n virtualThreshold: () => props.virtualThreshold,\n lineHeight: () => props.lineHeight,\n highlightLines: () => props.highlightLines,\n})\n\nconst blockMode = computed(() => result.value.mode === 'block')\n\nasync function copy(): Promise<void> {\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n await navigator.clipboard.writeText(props.source)\n } else if (typeof document !== 'undefined') {\n const area = document.createElement('textarea')\n area.value = props.source\n document.body.appendChild(area)\n area.select()\n const succeeded = document.execCommand('copy')\n area.remove()\n if (succeeded === false) throw new Error('The copy command was rejected.')\n } else {\n throw new Error('Clipboard access is not available.')\n }\n emit('copy', props.source)\n } catch (error) {\n reportDiagnostic(\n createDiagnostic(\n 'copy-error',\n `The source could not be copied to the clipboard: ${errorMessage(error)}`,\n { severity: 'warning', phase: 'render' },\n ),\n )\n }\n}\n\ndefineExpose({ copy, getHighlighted, highlighted: result })\n\nconst slotContext = computed(() => ({\n source: props.source,\n language: props.language,\n highlighted: result.value,\n nodes: result.value.nodes,\n lines: visibleLines.value,\n actions: { copy },\n}))\n\nconst emptyContext = computed(() => ({\n source: props.source,\n language: props.language,\n label: resolveLabel(context.labels.empty),\n actions: { copy },\n}))\n\nconst ActionsRegion = defineComponent({\n setup() {\n return () => {\n const own = ownSlots.actions\n if (own) {\n const output = own(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'span',\n {\n 'data-vmd-part': 'highlighter-actions',\n class: 'vmd-highlighter-actions',\n },\n output,\n )\n }\n }\n const host = context.slots?.actions\n if (host) {\n const output = host(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'span',\n {\n 'data-vmd-part': 'highlighter-actions',\n class: 'vmd-highlighter-actions',\n },\n output,\n )\n }\n }\n return null\n }\n },\n})\n\nconst HeaderRegion = defineComponent({\n setup() {\n return () => {\n const own = ownSlots.header\n if (own) {\n const output = own(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-header',\n class: 'vmd-highlighter-header',\n },\n output,\n )\n }\n }\n const host = context.slots?.header\n if (host) {\n const output = host(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-header',\n class: 'vmd-highlighter-header',\n },\n output,\n )\n }\n }\n if (!ownSlots.actions && !context.slots?.actions) return null\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-header',\n class: 'vmd-highlighter-header',\n },\n [\n h(\n 'span',\n { class: 'vmd-highlighter-label' },\n props.language || 'text',\n ),\n h(ActionsRegion),\n ],\n )\n }\n },\n})\n\nconst FooterRegion = defineComponent({\n setup() {\n return () => {\n const own = ownSlots.footer\n if (own) {\n const output = own(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-footer',\n class: 'vmd-highlighter-footer',\n },\n output,\n )\n }\n }\n const host = context.slots?.footer\n if (host) {\n const output = host(slotContext.value)\n if (!isEmptySlotContent(output)) {\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-footer',\n class: 'vmd-highlighter-footer',\n },\n output,\n )\n }\n }\n return null\n }\n },\n})\n\nconst Body = defineComponent({\n setup() {\n return () =>\n context.renderHostSlot(\n 'highlighter',\n {\n source: props.source,\n language: props.language,\n nodes: result.value.nodes,\n lines: visibleLines.value,\n highlighted: result.value,\n actions: { copy },\n },\n () => {\n const slot = ownSlots.highlighter\n if (slot) {\n const output = slot({\n source: props.source,\n language: props.language,\n nodes: result.value.nodes,\n lines: visibleLines.value,\n highlighted: result.value,\n actions: { copy },\n })\n if (!isEmptySlotContent(output)) return output\n }\n if (props.source === '') {\n return context.renderHostSlot('empty', emptyContext.value, () => {\n const empty = ownSlots.empty\n if (empty) {\n const output = empty(emptyContext.value)\n if (!isEmptySlotContent(output)) return output\n }\n return h(\n 'div',\n {\n 'data-vmd-part': 'highlighter-empty',\n class: 'vmd-highlighter-empty',\n },\n resolveLabel(context.labels.empty),\n )\n })\n }\n if (blockMode.value) {\n return renderNodes(result.value.nodes, context)\n }\n const children: VNodeChild[] = []\n if (virtualActive.value && startLine.value > 0) {\n children.push(\n h('div', {\n 'aria-hidden': 'true',\n style: { height: `${startLine.value * lineHeight.value}px` },\n }),\n )\n }\n for (const line of visibleLines.value) {\n const highlighted = isHighlightedLine(line.index)\n children.push(\n h(\n 'div',\n {\n class: 'vmd-highlighter-line',\n 'data-vmd-part': 'highlighter-line',\n 'data-line': String(line.index + 1),\n 'data-highlighted': highlighted ? 'true' : undefined,\n },\n [\n props.lineNumbers\n ? h(\n 'span',\n {\n class: 'vmd-highlighter-gutter',\n 'data-vmd-part': 'highlighter-gutter',\n 'aria-hidden': 'true',\n },\n String(line.index + 1),\n )\n : null,\n h(\n 'code',\n { class: 'vmd-highlighter-code' },\n renderNodes(line.nodes, context),\n ),\n ],\n ),\n )\n }\n if (virtualActive.value && endLine.value < totalLines.value) {\n children.push(\n h('div', {\n 'aria-hidden': 'true',\n style: {\n height: `${(totalLines.value - endLine.value) * lineHeight.value}px`,\n },\n }),\n )\n }\n if (truncatable.value) {\n children.push(\n h(\n 'button',\n {\n type: 'button',\n class: 'vmd-highlighter-toggle',\n 'data-vmd-part': 'highlighter-toggle',\n 'aria-expanded': expanded.value ? 'true' : 'false',\n onClick: toggle,\n },\n expanded.value\n ? resolveLabel(context.labels.showLess)\n : resolveLabel(context.labels.showAll),\n ),\n )\n }\n return children\n },\n )\n },\n})\n</script>\n\n<template>\n <div\n ref=\"scrollRef\"\n data-vmd-part=\"highlighter\"\n class=\"vmd-highlighter\"\n :data-vmd-theme=\"resolvedTheme\"\n :data-language=\"language || 'text'\"\n :data-highlighter=\"active?.id\"\n :data-virtual=\"virtualActive ? 'true' : undefined\"\n :style=\"\n virtualActive\n ? { maxHeight: `${lineHeight * 20}px`, overflow: 'auto' }\n : undefined\n \"\n @scroll=\"onScroll\"\n >\n <HeaderRegion />\n <div data-vmd-part=\"highlighter-body\" class=\"vmd-highlighter-body\">\n <Body />\n </div>\n <FooterRegion />\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapters-CMwX_NEI.js","names":["isValidHighlighter","value","adapter","isValidMathEngine","isValidMermaidRenderer","isValidDiagnosticFormatter","isValidSlugger","isValidUrlTransform"],"sources":["../../src/core/adapters.ts"],"sourcesContent":["import type {\r\n DiagnosticFormatter,\r\n MarkdownHighlighter,\r\n MarkdownSlugger,\r\n MarkdownUrlTransform,\r\n MathEngine,\r\n MermaidRenderer,\r\n} from './types'\r\n\r\nexport function isValidHighlighter(value: unknown): value is MarkdownHighlighter {\r\n if (!value || typeof value !== 'object') return false\r\n const adapter = value as MarkdownHighlighter\r\n return typeof adapter.id === 'string' && typeof adapter.highlight === 'function'\r\n}\r\n\r\nexport function isValidMathEngine(value: unknown): value is MathEngine {\r\n if (!value || typeof value !== 'object') return false\r\n const adapter = value as MathEngine\r\n return typeof adapter.id === 'string' && typeof adapter.render === 'function'\r\n}\r\n\r\nexport function isValidMermaidRenderer(value: unknown): value is MermaidRenderer {\r\n if (!value || typeof value !== 'object') return false\r\n const adapter = value as MermaidRenderer\r\n return typeof adapter.id === 'string' && typeof adapter.render === 'function'\r\n}\r\n\r\nexport function isValidDiagnosticFormatter(\r\n value: unknown,\r\n): value is DiagnosticFormatter {\r\n if (!value || typeof value !== 'object') return false\r\n return typeof (value as DiagnosticFormatter).format === 'function'\r\n}\r\n\r\nexport function isValidSlugger(value: unknown): value is MarkdownSlugger {\r\n if (!value || typeof value !== 'object') return false\r\n return typeof (value as MarkdownSlugger).slug === 'function'\r\n}\r\n\r\nexport function isValidUrlTransform(\r\n value: unknown,\r\n): value is MarkdownUrlTransform {\r\n return typeof value === 'function'\r\n}\r\n"],"mappings":";AASA,SAAgBA,EAAmB,GAA8C;CAC/E,IAAI,CAACC,KAAS,OAAOA,KAAU,UAAU,OAAO;CAChD,IAAMC,IAAUD;CAChB,OAAO,OAAOC,EAAQ,MAAO,YAAY,OAAOA,EAAQ,aAAc;AACxE;AAEA,SAAgBC,EAAkB,GAAqC;CACrE,IAAI,CAACF,KAAS,OAAOA,KAAU,UAAU,OAAO;CAChD,IAAMC,IAAUD;CAChB,OAAO,OAAOC,EAAQ,MAAO,YAAY,OAAOA,EAAQ,UAAW;AACrE;AAEA,SAAgBE,EAAuB,GAA0C;CAC/E,IAAI,CAACH,KAAS,OAAOA,KAAU,UAAU,OAAO;CAChD,IAAMC,IAAUD;CAChB,OAAO,OAAOC,EAAQ,MAAO,YAAY,OAAOA,EAAQ,UAAW;AACrE;AAEA,SAAgBG,EACd,GAC8B;CAE9B,OADI,CAACJ,KAAS,OAAOA,KAAU,WAAiB,KACzC,OAAQA,EAA8B,UAAW;AAC1D;AAEA,SAAgBK,EAAe,GAA0C;CAEvE,OADI,CAACL,KAAS,OAAOA,KAAU,WAAiB,KACzC,OAAQA,EAA0B,QAAS;AACpD;AAEA,SAAgBM,EACd,GAC+B;CAC/B,OAAO,OAAON,KAAU;AAC1B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"blank-line-Cb-JBP_5.js","names":["unicodePunctuation","markdownSpace","markdownLineEndingOrSpace","markdownLineEnding","factorySpace","unicodeWhitespace","normalizeIdentifier","value","emptyOptions","toString","settings","options","one","node","includeHtml","includeImageAlt","all","result","index","values","classifyCharacter","code","splice","end","list","chunkStart","parameters","start","remove","items","push","hasOwnProperty","combineExtensions","extensions","syntaxExtension","hook","extension","left","right","constructs","before","existing","resolveAll","called","resolve","events","context","blankLine","tokenizeBlankLine","effects","after","ok","nok"],"sources":["../../node_modules/micromark-util-normalize-identifier/index.js","../../node_modules/mdast-util-to-string/lib/index.js","../../node_modules/micromark-util-classify-character/index.js","../../node_modules/micromark-util-chunked/index.js","../../node_modules/micromark-util-combine-extensions/index.js","../../node_modules/micromark-util-resolve-all/index.js","../../node_modules/micromark-core-commonmark/lib/blank-line.js"],"sourcesContent":["/**\n * Normalize an identifier (as found in references, definitions).\n *\n * Collapses markdown whitespace, trim, and then lower- and uppercase.\n *\n * Some characters are considered “uppercase”, such as U+03F4 (`ϴ`), but if their\n * lowercase counterpart (U+03B8 (`θ`)) is uppercased will result in a different\n * uppercase character (U+0398 (`Θ`)).\n * So, to get a canonical form, we perform both lower- and uppercase.\n *\n * Using uppercase last makes sure keys will never interact with default\n * prototypal values (such as `constructor`): nothing in the prototype of\n * `Object` is uppercase.\n *\n * @param {string} value\n * Identifier to normalize.\n * @returns {string}\n * Normalized identifier.\n */\nexport function normalizeIdentifier(value) {\n return value\n // Collapse markdown whitespace.\n .replace(/[\\t\\n\\r ]+/g, \" \")\n // Trim.\n .replace(/^ | $/g, '')\n // Some characters are considered “uppercase”, but if their lowercase\n // counterpart is uppercased will result in a different uppercase\n // character.\n // Hence, to get that form, we perform both lower- and uppercase.\n // Upper case makes sure keys will not interact with default prototypal\n // methods: no method is uppercase.\n .toLowerCase().toUpperCase();\n}","/**\n * @typedef {import('mdast').Nodes} Nodes\n *\n * @typedef Options\n * Configuration (optional).\n * @property {boolean | null | undefined} [includeImageAlt=true]\n * Whether to use `alt` for `image`s (default: `true`).\n * @property {boolean | null | undefined} [includeHtml=true]\n * Whether to use `value` of HTML (default: `true`).\n */\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Get the text content of a node or list of nodes.\n *\n * Prefers the node’s plain-text fields, otherwise serializes its children,\n * and if the given value is an array, serialize the nodes in it.\n *\n * @param {unknown} [value]\n * Thing to serialize, typically `Node`.\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n * @returns {string}\n * Serialized `value`.\n */\nexport function toString(value, options) {\n const settings = options || emptyOptions\n const includeImageAlt =\n typeof settings.includeImageAlt === 'boolean'\n ? settings.includeImageAlt\n : true\n const includeHtml =\n typeof settings.includeHtml === 'boolean' ? settings.includeHtml : true\n\n return one(value, includeImageAlt, includeHtml)\n}\n\n/**\n * One node or several nodes.\n *\n * @param {unknown} value\n * Thing to serialize.\n * @param {boolean} includeImageAlt\n * Include image `alt`s.\n * @param {boolean} includeHtml\n * Include HTML.\n * @returns {string}\n * Serialized node.\n */\nfunction one(value, includeImageAlt, includeHtml) {\n if (node(value)) {\n if ('value' in value) {\n return value.type === 'html' && !includeHtml ? '' : value.value\n }\n\n if (includeImageAlt && 'alt' in value && value.alt) {\n return value.alt\n }\n\n if ('children' in value) {\n return all(value.children, includeImageAlt, includeHtml)\n }\n }\n\n if (Array.isArray(value)) {\n return all(value, includeImageAlt, includeHtml)\n }\n\n return ''\n}\n\n/**\n * Serialize a list of nodes.\n *\n * @param {Array<unknown>} values\n * Thing to serialize.\n * @param {boolean} includeImageAlt\n * Include image `alt`s.\n * @param {boolean} includeHtml\n * Include HTML.\n * @returns {string}\n * Serialized nodes.\n */\nfunction all(values, includeImageAlt, includeHtml) {\n /** @type {Array<string>} */\n const result = []\n let index = -1\n\n while (++index < values.length) {\n result[index] = one(values[index], includeImageAlt, includeHtml)\n }\n\n return result.join('')\n}\n\n/**\n * Check if `value` looks like a node.\n *\n * @param {unknown} value\n * Thing.\n * @returns {value is Nodes}\n * Whether `value` is a node.\n */\nfunction node(value) {\n return Boolean(value && typeof value === 'object')\n}\n","/**\n * @import {Code} from 'micromark-util-types'\n */\n\nimport { markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\n/**\n * Classify whether a code represents whitespace, punctuation, or something\n * else.\n *\n * Used for attention (emphasis, strong), whose sequences can open or close\n * based on the class of surrounding characters.\n *\n * > 👉 **Note**: eof (`null`) is seen as whitespace.\n *\n * @param {Code} code\n * Code.\n * @returns {typeof constants.characterGroupWhitespace | typeof constants.characterGroupPunctuation | undefined}\n * Group.\n */\nexport function classifyCharacter(code) {\n if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return 1;\n }\n if (unicodePunctuation(code)) {\n return 2;\n }\n}","/**\n * Like `Array#splice`, but smarter for giant arrays.\n *\n * `Array#splice` takes all items to be inserted as individual argument which\n * causes a stack overflow in V8 when trying to insert 100k items for instance.\n *\n * Otherwise, this does not return the removed items, and takes `items` as an\n * array instead of rest parameters.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {number} start\n * Index to remove/insert at (can be negative).\n * @param {number} remove\n * Number of items to remove.\n * @param {Array<T>} items\n * Items to inject into `list`.\n * @returns {undefined}\n * Nothing.\n */\nexport function splice(list, start, remove, items) {\n const end = list.length;\n let chunkStart = 0;\n /** @type {Array<unknown>} */\n let parameters;\n\n // Make start between zero and `end` (included).\n if (start < 0) {\n start = -start > end ? 0 : end + start;\n } else {\n start = start > end ? end : start;\n }\n remove = remove > 0 ? remove : 0;\n\n // No need to chunk the items if there’s only a couple (10k) items.\n if (items.length < 10000) {\n parameters = Array.from(items);\n parameters.unshift(start, remove);\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters);\n } else {\n // Delete `remove` items starting from `start`\n if (remove) list.splice(start, remove);\n\n // Insert the items in chunks to not cause stack overflows.\n while (chunkStart < items.length) {\n parameters = items.slice(chunkStart, chunkStart + 10000);\n parameters.unshift(start, 0);\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters);\n chunkStart += 10000;\n start += 10000;\n }\n }\n}\n\n/**\n * Append `items` (an array) at the end of `list` (another array).\n * When `list` was empty, returns `items` instead.\n *\n * This prevents a potentially expensive operation when `list` is empty,\n * and adds items in batches to prevent V8 from hanging.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {Array<T>} items\n * Items to add to `list`.\n * @returns {Array<T>}\n * Either `list` or `items`.\n */\nexport function push(list, items) {\n if (list.length > 0) {\n splice(list, list.length, 0, items);\n return list;\n }\n return items;\n}","/**\n * @import {\n * Extension,\n * Handles,\n * HtmlExtension,\n * NormalizedExtension\n * } from 'micromark-util-types'\n */\n\nimport {splice} from 'micromark-util-chunked'\n\nconst hasOwnProperty = {}.hasOwnProperty\n\n/**\n * Combine multiple syntax extensions into one.\n *\n * @param {ReadonlyArray<Extension>} extensions\n * List of syntax extensions.\n * @returns {NormalizedExtension}\n * A single combined extension.\n */\nexport function combineExtensions(extensions) {\n /** @type {NormalizedExtension} */\n const all = {}\n let index = -1\n\n while (++index < extensions.length) {\n syntaxExtension(all, extensions[index])\n }\n\n return all\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {NormalizedExtension} all\n * Extension to merge into.\n * @param {Extension} extension\n * Extension to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction syntaxExtension(all, extension) {\n /** @type {keyof Extension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n /** @type {Record<string, unknown>} */\n const left = maybe || (all[hook] = {})\n /** @type {Record<string, unknown> | undefined} */\n const right = extension[hook]\n /** @type {string} */\n let code\n\n if (right) {\n for (code in right) {\n if (!hasOwnProperty.call(left, code)) left[code] = []\n const value = right[code]\n constructs(\n // @ts-expect-error Looks like a list.\n left[code],\n Array.isArray(value) ? value : value ? [value] : []\n )\n }\n }\n }\n}\n\n/**\n * Merge `list` into `existing` (both lists of constructs).\n * Mutates `existing`.\n *\n * @param {Array<unknown>} existing\n * List of constructs to merge into.\n * @param {Array<unknown>} list\n * List of constructs to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction constructs(existing, list) {\n let index = -1\n /** @type {Array<unknown>} */\n const before = []\n\n while (++index < list.length) {\n // @ts-expect-error Looks like an object.\n ;(list[index].add === 'after' ? existing : before).push(list[index])\n }\n\n splice(existing, 0, 0, before)\n}\n\n/**\n * Combine multiple HTML extensions into one.\n *\n * @param {ReadonlyArray<HtmlExtension>} htmlExtensions\n * List of HTML extensions.\n * @returns {HtmlExtension}\n * Single combined HTML extension.\n */\nexport function combineHtmlExtensions(htmlExtensions) {\n /** @type {HtmlExtension} */\n const handlers = {}\n let index = -1\n\n while (++index < htmlExtensions.length) {\n htmlExtension(handlers, htmlExtensions[index])\n }\n\n return handlers\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {HtmlExtension} all\n * Extension to merge into.\n * @param {HtmlExtension} extension\n * Extension to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction htmlExtension(all, extension) {\n /** @type {keyof HtmlExtension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n const left = maybe || (all[hook] = {})\n const right = extension[hook]\n /** @type {keyof Handles} */\n let type\n\n if (right) {\n for (type in right) {\n // @ts-expect-error assume document vs regular handler are managed correctly.\n left[type] = right[type]\n }\n }\n }\n}\n","/**\n * @import {Event, Resolver, TokenizeContext} from 'micromark-util-types'\n */\n\n/**\n * Call all `resolveAll`s.\n *\n * @param {ReadonlyArray<{resolveAll?: Resolver | undefined}>} constructs\n * List of constructs, optionally with `resolveAll`s.\n * @param {Array<Event>} events\n * List of events.\n * @param {TokenizeContext} context\n * Context used by `tokenize`.\n * @returns {Array<Event>}\n * Changed events.\n */\nexport function resolveAll(constructs, events, context) {\n /** @type {Array<Resolver>} */\n const called = []\n let index = -1\n\n while (++index < constructs.length) {\n const resolve = constructs[index].resolveAll\n\n if (resolve && !called.includes(resolve)) {\n events = resolve(events, context)\n called.push(resolve)\n }\n }\n\n return events\n}\n","/**\n * @import {\n * Construct,\n * State,\n * TokenizeContext,\n * Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blankLine = {\n partial: true,\n tokenize: tokenizeBlankLine\n};\n\n/**\n * @this {TokenizeContext}\n * Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLine(effects, ok, nok) {\n return start;\n\n /**\n * Start of blank line.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n return markdownSpace(code) ? factorySpace(effects, after, \"linePrefix\")(code) : after(code);\n }\n\n /**\n * At eof/eol, after optional whitespace.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n }\n}"],"ignoreList":[0,1,2,3,4,5,6],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"codemirror-DyphMAEg.js","names":["_asyncToGenerator","mermaidMode","stream","createMermaidEditor","_createMermaidEditor","viewModule","stateModule","languageModule","commandsModule","theme","EditorView","view","EditorState","options","history","keymap","defaultKeymap","historyKeymap","StreamLanguage","placeholder","update","value","docLine","line"],"sources":["../../src/editor/codemirror.ts"],"sourcesContent":["import type { EditorView } from '@codemirror/view'\r\n\r\nexport interface MermaidEditorHandle {\r\n destroy(): void\r\n focus(): void\r\n setValue(value: string): void\r\n focusLine(line: number): void\r\n}\r\n\r\nexport interface CreateEditorOptions {\r\n value: string\r\n theme?: 'light' | 'dark' | 'auto' | 'custom'\r\n onChange(value: string): void\r\n}\r\n\r\n/**\r\n * Minimal Mermaid tokenizer. CodeMirror has no official Mermaid language\r\n * package, so a StreamLanguage keeps the editor lazy and dependency-free.\r\n */\r\nfunction mermaidMode() {\r\n return {\r\n startState: () => ({}),\r\n token(stream: {\r\n sol(): boolean\r\n eatSpace(): boolean\r\n match(pattern: RegExp): boolean\r\n next(): string | undefined\r\n skipToEnd(): void\r\n }) {\r\n if (stream.sol()) stream.eatSpace()\r\n if (stream.match(/^\\s*(graph|flowchart|sequenceDiagram|classDiagram|stateDiagram|erDiagram|journey|gantt|pie|mindmap|timeline|gitGraph|quadrantChart|requirementDiagram|C4Context)\\b/)) {\r\n return 'keyword'\r\n }\r\n if (stream.match(/%%[^\\n]*/)) {\r\n stream.skipToEnd()\r\n return 'comment'\r\n }\r\n if (stream.match(/\"[^\"]*\"/)) return 'string'\r\n if (stream.match(/-->|---|==>|-.->|--x|--o|<\\|--|\\|\\|--|\\.\\.>/)) {\r\n return 'operator'\r\n }\r\n if (stream.match(/[{}[\\]()]/)) return 'bracket'\r\n stream.next()\r\n return null\r\n },\r\n }\r\n}\r\n\r\nexport async function createMermaidEditor(\r\n parent: HTMLElement,\r\n options: CreateEditorOptions,\r\n): Promise<MermaidEditorHandle> {\r\n const [viewModule, stateModule, languageModule, commandsModule] =\r\n await Promise.all([\r\n import('@codemirror/view'),\r\n import('@codemirror/state'),\r\n import('@codemirror/language'),\r\n import('@codemirror/commands'),\r\n ])\r\n\r\n const { EditorView, keymap, placeholder } = viewModule\r\n const { EditorState } = stateModule\r\n const { StreamLanguage } = languageModule\r\n const { defaultKeymap, history, historyKeymap } = commandsModule\r\n\r\n const theme = EditorView.theme({\r\n '&': {\r\n height: '100%',\r\n backgroundColor: 'var(--vmd-code-bg, #f6f8fa)',\r\n color: 'var(--vmd-code-text, #1f2328)',\r\n fontSize: 'var(--vmd-font-size-sm, 0.875rem)',\r\n },\r\n '.cm-content': {\r\n fontFamily: 'var(--vmd-font-mono, monospace)',\r\n padding: '0.75rem',\r\n },\r\n '.cm-gutters': {\r\n backgroundColor: 'var(--vmd-code-toolbar-bg, #eef1f4)',\r\n color: 'var(--vmd-color-muted, #59636e)',\r\n border: 'none',\r\n },\r\n '&.cm-focused': { outline: 'none' },\r\n })\r\n\r\n const view = new EditorView({\r\n parent,\r\n state: EditorState.create({\r\n doc: options.value,\r\n extensions: [\r\n history(),\r\n keymap.of([...defaultKeymap, ...historyKeymap]),\r\n StreamLanguage.define(mermaidMode() as never),\r\n placeholder('Write Mermaid source…'),\r\n EditorView.lineWrapping,\r\n theme,\r\n EditorView.updateListener.of((update) => {\r\n if (update.docChanged) options.onChange(update.state.doc.toString())\r\n }),\r\n ],\r\n }),\r\n })\r\n\r\n return {\r\n destroy() {\r\n view.destroy()\r\n },\r\n focus() {\r\n view.focus()\r\n },\r\n setValue(value: string) {\r\n if (value !== view.state.doc.toString()) {\r\n view.dispatch({\r\n changes: { from: 0, to: view.state.doc.length, insert: value },\r\n })\r\n }\r\n },\r\n focusLine(line: number) {\r\n const docLine = view.state.doc.line(Math.max(1, Math.min(line, view.state.doc.lines)))\r\n view.dispatch({\r\n selection: { anchor: docLine.from, head: docLine.to },\r\n scrollIntoView: true,\r\n })\r\n view.focus()\r\n },\r\n }\r\n}\r\n\r\nexport type { EditorView }\r\n"],"mappings":";;AAmBA,SAASC,IAAc;CACrB,OAAO;EACL,mBAAmB,CAAC;EACpB,MAAM,GAMH;GAeD,OAdIC,EAAO,IAAI,KAAGA,EAAO,SAAS,GAC9BA,EAAO,MAAM,oKAAoK,IAC5K,YAELA,EAAO,MAAM,UAAU,KACzBA,EAAO,UAAU,GACV,aAELA,EAAO,MAAM,SAAS,IAAU,WAChCA,EAAO,MAAM,6CAA6C,IACrD,aAELA,EAAO,MAAM,WAAW,IAAU,aACtCA,EAAO,KAAK,GACL;EACT;CACF;AACF;AAEA,SAAsBC,EACpB,GACA,GAAA;;;;C,OADA,IAAAH,EAAA,WAAA,GACA,GAC8B;EAC9B,IAAM,CAACK,GAAYC,GAAaC,GAAgBC,KAC9C,MAAM,QAAQ,IAAI;GAChB,OAAO;GACP,OAAO;GACP,OAAO;GACP,OAAO;EACT,CAAC,GAEG,EAAE,eAAY,WAAQ,mBAAgBH,GACtC,EAAE,mBAAgBC,GAClB,EAAE,sBAAmBC,GACrB,EAAE,kBAAe,YAAS,qBAAkBC,GAE5CC,IAAQC,EAAW,MAAM;GAC7B,KAAK;IACH,QAAQ;IACR,iBAAiB;IACjB,OAAO;IACP,UAAU;GACZ;GACA,eAAe;IACb,YAAY;IACZ,SAAS;GACX;GACA,eAAe;IACb,iBAAiB;IACjB,OAAO;IACP,QAAQ;GACV;GACA,gBAAgB,EAAE,SAAS,OAAO;EACpC,CAAC,GAEKC,IAAO,IAAID,EAAW;GAC1B;GACA,OAAOE,EAAY,OAAO;IACxB,KAAKC,EAAQ;IACb,YAAY;KACVC,EAAQ;KACRC,EAAO,GAAG,CAAC,GAAGC,GAAe,GAAGC,CAAa,CAAC;KAC9CC,EAAe,OAAOjB,EAAY,CAAU;KAC5CkB,EAAY,uBAAuB;KACnCT,EAAW;KACXD;KACAC,EAAW,eAAe,IAAI,MAAW;MACvC,AAAIU,EAAO,cAAYP,EAAQ,SAASO,EAAO,MAAM,IAAI,SAAS,CAAC;KACrE,CAAC;IACH;GACF,CAAC;EACH,CAAC;EAED,OAAO;GACL,UAAU;IACR,EAAK,QAAQ;GACf;GACA,QAAQ;IACN,EAAK,MAAM;GACb;GACA,SAAS,GAAe;IACtB,AAAIC,MAAUV,EAAK,MAAM,IAAI,SAAS,KACpCA,EAAK,SAAS,EACZ,SAAS;KAAE,MAAM;KAAG,IAAIA,EAAK,MAAM,IAAI;KAAQ,QAAQU;IAAM,EAC/D,CAAC;GAEL;GACA,UAAU,GAAc;IACtB,IAAMC,IAAUX,EAAK,MAAM,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,IAAIY,GAAMZ,EAAK,MAAM,IAAI,KAAK,CAAC,CAAC;IAKrF,AAJAA,EAAK,SAAS;KACZ,WAAW;MAAE,QAAQW,EAAQ;MAAM,MAAMA,EAAQ;KAAG;KACpD,gBAAgB;IAClB,CAAC,GACDX,EAAK,MAAM;GACb;EACF;CACF,CAAA,G"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-aRYo2R8_.js","names":["MARKDOWN_CONFIG","useMarkdownConfig","inject","computed","provideMarkdownConfig","config"],"sources":["../../src/components/config.ts"],"sourcesContent":["import {\r\n computed,\r\n inject,\r\n provide,\r\n type ComputedRef,\r\n type InjectionKey,\r\n} from 'vue'\r\nimport type { MarkdownConfig } from '../core/types'\r\n\r\nexport const MARKDOWN_CONFIG: InjectionKey<ComputedRef<MarkdownConfig>> = Symbol(\r\n '@coderminer/vue-markdown:config',\r\n)\r\n\r\n/** Read the nearest provider configuration, or an empty configuration. */\r\nexport function useMarkdownConfig(): ComputedRef<MarkdownConfig> {\r\n return inject(MARKDOWN_CONFIG, computed(() => ({})))\r\n}\r\n\r\n/** Provide a configuration to descendant renderers and providers. */\r\nexport function provideMarkdownConfig(\r\n config: ComputedRef<MarkdownConfig>,\r\n): void {\r\n provide(MARKDOWN_CONFIG, config)\r\n}\r\n"],"mappings":";;AASA,IAAaA,IAA6D,OACxE,iCACF;AAGA,SAAgBC,IAAiD;CAC/D,OAAOC,EAAOF,GAAiBG,SAAgB,CAAC,EAAE,CAAC;AACrD;AAGA,SAAgBC,EACd,GACM;CACN,EAAQJ,GAAiBK,CAAM;AACjC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-8NfW6fxI.js","names":["DEFAULT_LABELS","RENDER_CONTEXT","fallbackContext","fallback","useRenderContext","inject","isEmptySlotContent","value","child","vnode","Comment","Fragment"],"sources":["../../src/components/context.ts"],"sourcesContent":["import {\r\n Comment,\r\n Fragment,\r\n inject,\r\n type InjectionKey,\r\n type Slot,\r\n type VNode,\r\n type VNodeChild,\r\n} from 'vue'\r\nimport type {\r\n DiagnosticFormatter,\r\n MarkdownComponentValue,\r\n MarkdownDocument,\r\n MarkdownHighlighter,\r\n MarkdownLabels,\r\n MarkdownNode,\r\n MarkdownRegionComponents,\r\n MarkdownTheme,\r\n MathEngine,\r\n MermaidRenderer,\r\n} from '../core/types'\r\nimport { DEFAULT_LABELS } from '../core/labels'\r\n\r\nexport interface LinkClickPayload {\r\n url: string\r\n target: string\r\n node: MarkdownNode\r\n event: MouseEvent\r\n}\r\n\r\nexport interface CustomTagClickPayload {\r\n tag: string\r\n props: Record<string, unknown>\r\n node: MarkdownNode\r\n event: MouseEvent\r\n}\r\n\r\nexport interface TaskChangePayload {\r\n checked: boolean\r\n node: MarkdownNode\r\n}\r\n\r\nexport interface RenderContext {\r\n components: Record<string, MarkdownComponentValue>\r\n nodeComponents?: Record<string, MarkdownComponentValue>\r\n regions?: MarkdownRegionComponents\r\n document?: MarkdownDocument\r\n theme?: MarkdownTheme\r\n labels: MarkdownLabels\r\n linkTarget: string\r\n externalLinkTarget: string\r\n highlighter?: MarkdownHighlighter\r\n mathEngine?: MathEngine\r\n mermaidRenderer?: MermaidRenderer\r\n diagnosticsFormatter?: DiagnosticFormatter\r\n /** Host-authored region slots keyed by documented slot name. */\r\n slots?: Readonly<Record<string, Slot | undefined>>\r\n /** Render a host slot, falling back to the default region when empty. */\r\n renderHostSlot(\r\n name: string,\r\n props: Record<string, unknown>,\r\n fallback: () => VNodeChild,\r\n ): VNodeChild\r\n onLinkClick(payload: LinkClickPayload): void\r\n onCustomTagClick(payload: CustomTagClickPayload): void\r\n onTaskChange(payload: TaskChangePayload): void\r\n onRenderError?(diagnostic: import('../core/types').MarkdownDiagnostic): void\r\n onMathError?(diagnostic: import('../core/types').MarkdownDiagnostic): void\r\n}\r\n\r\nexport const RENDER_CONTEXT: InjectionKey<RenderContext> = Symbol(\r\n '@coderminer/vue-markdown:render-context',\r\n)\r\n\r\nconst fallbackContext: RenderContext = {\r\n components: {},\r\n labels: DEFAULT_LABELS,\r\n linkTarget: '_self',\r\n externalLinkTarget: '_self',\r\n renderHostSlot(_name, _props, fallback) {\r\n return fallback()\r\n },\r\n onLinkClick() {},\r\n onCustomTagClick() {},\r\n onTaskChange() {},\r\n}\r\n\r\nexport function useRenderContext(): RenderContext {\r\n return inject(RENDER_CONTEXT, fallbackContext)\r\n}\r\n\r\n/** True when a slot produced no meaningful output and the default should win. */\r\nexport function isEmptySlotContent(value: VNodeChild): boolean {\r\n if (value === null || value === undefined) return true\r\n if (typeof value === 'string') return value.trim() === ''\r\n if (Array.isArray(value)) {\r\n return value.length === 0 || value.every((child) => isEmptySlotContent(child))\r\n }\r\n if (typeof value === 'object') {\r\n const vnode = value as VNode\r\n // `v-if=\"false\"` inside a slot compiles to a comment vnode. It must not\r\n // count as meaningful output, or the default region/toolbar disappears.\r\n if (vnode.type === Comment) return true\r\n if (vnode.type === Fragment && Array.isArray(vnode.children)) {\r\n return (\r\n vnode.children.length === 0 ||\r\n vnode.children.every((child) => isEmptySlotContent(child as VNodeChild))\r\n )\r\n }\r\n }\r\n return false\r\n}\r\n"],"mappings":";;;AAsEA,IAAaC,IAA8C,OACzD,yCACF,GAEMC,IAAiC;CACrC,YAAY,CAAC;CACb,QAAQF;CACR,YAAY;CACZ,oBAAoB;CACpB,eAAe,GAAO,GAAQ,GAAU;EACtC,OAAOG,EAAS;CAClB;CACA,cAAc,CAAC;CACf,mBAAmB,CAAC;CACpB,eAAe,CAAC;AAClB;AAEA,SAAgBC,IAAkC;CAChD,OAAOC,EAAOJ,GAAgBC,CAAe;AAC/C;AAGA,SAAgBI,EAAmB,GAA4B;CAC7D,IAAIC,KAAU,MAA6B,OAAO;CAClD,IAAI,OAAOA,KAAU,UAAU,OAAOA,EAAM,KAAK,MAAM;CACvD,IAAI,MAAM,QAAQA,CAAK,GACrB,OAAOA,EAAM,WAAW,KAAKA,EAAM,OAAO,MAAUD,EAAmBE,CAAK,CAAC;CAE/E,IAAI,OAAOD,KAAU,UAAU;EAC7B,IAAME,IAAQF;EAGd,IAAIE,EAAM,SAASC,GAAS,OAAO;EACnC,IAAID,EAAM,SAASE,KAAY,MAAM,QAAQF,EAAM,QAAQ,GACzD,OACEA,EAAM,SAAS,WAAW,KAC1BA,EAAM,SAAS,OAAO,MAAUH,EAAmBE,CAAmB,CAAC;CAG7E;CACA,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"default-DWVS-I_8.js","names":["__create","__defProp","__getOwnPropDesc","__getOwnPropNames","__getProtoOf","__hasOwnProp","__commonJSMin","mod","cb","__exportAll","target","name","all","no_symbols","__copyProps","from","keys","i","n","key","to","except","k","desc","__toESM","isNodeMode","ok"],"sources":["../../node_modules/devlop/lib/default.js"],"sourcesContent":["export function deprecate(fn) {\n return fn\n}\n\nexport function equal() {}\n\nexport function ok() {}\n\nexport function unreachable() {}\n"],"ignoreList":[0],"mappings":";;;;;;;;;;;;;;;;;;;AAMA,SAAgB0B,IAAK,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnostics-CtHoJyiX.js","names":["createDiagnostic","_options$severity","options","errorMessage","error","_unused"],"sources":["../../src/core/diagnostics.ts"],"sourcesContent":["import type {\r\n MarkdownDiagnostic,\r\n DiagnosticPhase,\r\n SourceRange,\r\n} from './types'\r\n\r\nexport function createDiagnostic(\r\n code: string,\r\n message: string,\r\n options: {\r\n severity?: MarkdownDiagnostic['severity']\r\n phase?: DiagnosticPhase\r\n plugin?: string\r\n source?: SourceRange\r\n details?: string\r\n } = {},\r\n): MarkdownDiagnostic {\r\n return {\r\n code,\r\n message,\r\n severity: options.severity ?? 'error',\r\n phase: options.phase,\r\n plugin: options.plugin,\r\n source: options.source,\r\n details: options.details,\r\n }\r\n}\r\n\r\nexport function errorMessage(error: unknown): string {\r\n if (error instanceof Error) return error.message\r\n if (typeof error === 'string') return error\r\n try {\r\n return JSON.stringify(error)\r\n } catch {\r\n return String(error)\r\n }\r\n}\r\n"],"mappings":";AAMA,SAAgBA,EACd,GACA,GACA,IAMI,CAAC,GACe;;CACpB,OAAO;EACL;EACA;EACA,WAAA,IAAUE,EAAQ,aAAA,OAAY,UAAZD;EAClB,OAAOC,EAAQ;EACf,QAAQA,EAAQ;EAChB,QAAQA,EAAQ;EAChB,SAASA,EAAQ;CACnB;AACF;AAEA,SAAgBC,EAAa,GAAwB;CACnD,IAAIC,aAAiB,OAAO,OAAOA,EAAM;CACzC,IAAI,OAAOA,KAAU,UAAU,OAAOA;CACtC,IAAI;EACF,OAAO,KAAK,UAAUA,CAAK;CAC7B,SAAAC,GAAQ;EACN,OAAO,OAAOD,CAAK;CACrB;AACF"}