@latentic/live-markdown 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +2 -2
  3. package/dist/chunk-V6TY7KAL.js +8 -0
  4. package/dist/chunk-V6TY7KAL.js.map +1 -0
  5. package/dist/codemirror/CodeMirrorMarkdownEditor.d.ts +106 -0
  6. package/dist/codemirror/CodeMirrorMarkdownEditor.js +482 -0
  7. package/dist/codemirror/CodeMirrorMarkdownEditor.js.map +1 -0
  8. package/dist/codemirror/byteOffset.d.ts +17 -0
  9. package/dist/codemirror/byteOffset.js +19 -0
  10. package/dist/codemirror/byteOffset.js.map +1 -0
  11. package/dist/codemirror/caretLayer.d.ts +19 -0
  12. package/dist/codemirror/caretLayer.js +44 -0
  13. package/dist/codemirror/caretLayer.js.map +1 -0
  14. package/dist/codemirror/clipboard/copyRich.d.ts +37 -0
  15. package/dist/codemirror/clipboard/copyRich.js +72 -0
  16. package/dist/codemirror/clipboard/copyRich.js.map +1 -0
  17. package/dist/codemirror/clipboard/htmlToMarkdown.d.ts +20 -0
  18. package/dist/codemirror/clipboard/htmlToMarkdown.js +91 -0
  19. package/dist/codemirror/clipboard/htmlToMarkdown.js.map +1 -0
  20. package/dist/codemirror/clipboard/pasteMarkdown.d.ts +18 -0
  21. package/dist/codemirror/clipboard/pasteMarkdown.js +41 -0
  22. package/dist/codemirror/clipboard/pasteMarkdown.js.map +1 -0
  23. package/dist/codemirror/code/codeHighlight.d.ts +13 -0
  24. package/dist/codemirror/code/codeHighlight.js +15 -0
  25. package/dist/codemirror/code/codeHighlight.js.map +1 -0
  26. package/dist/codemirror/code/codeLangAffordance.d.ts +17 -0
  27. package/dist/codemirror/code/codeLangAffordance.js +80 -0
  28. package/dist/codemirror/code/codeLangAffordance.js.map +1 -0
  29. package/dist/codemirror/code/codeLanguageMenu.d.ts +40 -0
  30. package/dist/codemirror/code/codeLanguageMenu.js +184 -0
  31. package/dist/codemirror/code/codeLanguageMenu.js.map +1 -0
  32. package/dist/codemirror/code/codePalette.d.ts +39 -0
  33. package/dist/codemirror/code/codePalette.js +53 -0
  34. package/dist/codemirror/code/codePalette.js.map +1 -0
  35. package/dist/codemirror/code/fenceAutoClose.d.ts +30 -0
  36. package/dist/codemirror/code/fenceAutoClose.js +171 -0
  37. package/dist/codemirror/code/fenceAutoClose.js.map +1 -0
  38. package/dist/codemirror/code/fenceCaretGuard.d.ts +28 -0
  39. package/dist/codemirror/code/fenceCaretGuard.js +66 -0
  40. package/dist/codemirror/code/fenceCaretGuard.js.map +1 -0
  41. package/dist/codemirror/code/fenceDeleteGuards.d.ts +22 -0
  42. package/dist/codemirror/code/fenceDeleteGuards.js +105 -0
  43. package/dist/codemirror/code/fenceDeleteGuards.js.map +1 -0
  44. package/dist/codemirror/code/fenceTabIndent.d.ts +8 -0
  45. package/dist/codemirror/code/fenceTabIndent.js +50 -0
  46. package/dist/codemirror/code/fenceTabIndent.js.map +1 -0
  47. package/dist/codemirror/code/highlightFence.d.ts +25 -0
  48. package/dist/codemirror/code/highlightFence.js +45 -0
  49. package/dist/codemirror/code/highlightFence.js.map +1 -0
  50. package/dist/codemirror/code/index.d.ts +9 -0
  51. package/dist/codemirror/code/index.js +8 -0
  52. package/dist/codemirror/code/index.js.map +1 -0
  53. package/dist/codemirror/core/codeContext.d.ts +32 -0
  54. package/dist/codemirror/core/codeContext.js +22 -0
  55. package/dist/codemirror/core/codeContext.js.map +1 -0
  56. package/dist/codemirror/core/editorTestHarness.d.ts +31 -0
  57. package/dist/codemirror/core/editorTestHarness.js +69 -0
  58. package/dist/codemirror/core/editorTestHarness.js.map +1 -0
  59. package/dist/codemirror/core/editorTheme.d.ts +39 -0
  60. package/dist/codemirror/core/editorTheme.js +498 -0
  61. package/dist/codemirror/core/editorTheme.js.map +1 -0
  62. package/dist/codemirror/core/hostFacets.d.ts +58 -0
  63. package/dist/codemirror/core/hostFacets.js +27 -0
  64. package/dist/codemirror/core/hostFacets.js.map +1 -0
  65. package/dist/codemirror/core/hrWidget.d.ts +22 -0
  66. package/dist/codemirror/core/hrWidget.js +22 -0
  67. package/dist/codemirror/core/hrWidget.js.map +1 -0
  68. package/dist/codemirror/core/htmlEscape.d.ts +6 -0
  69. package/dist/codemirror/core/htmlEscape.js +12 -0
  70. package/dist/codemirror/core/htmlEscape.js.map +1 -0
  71. package/dist/codemirror/core/index.d.ts +13 -0
  72. package/dist/codemirror/core/index.js +9 -0
  73. package/dist/codemirror/core/index.js.map +1 -0
  74. package/dist/codemirror/core/inlineScan.d.ts +49 -0
  75. package/dist/codemirror/core/inlineScan.js +31 -0
  76. package/dist/codemirror/core/inlineScan.js.map +1 -0
  77. package/dist/codemirror/core/lineStructure.d.ts +47 -0
  78. package/dist/codemirror/core/lineStructure.js +64 -0
  79. package/dist/codemirror/core/lineStructure.js.map +1 -0
  80. package/dist/codemirror/core/linkResolution.d.ts +36 -0
  81. package/dist/codemirror/core/linkResolution.js +58 -0
  82. package/dist/codemirror/core/linkResolution.js.map +1 -0
  83. package/dist/codemirror/core/paint.d.ts +118 -0
  84. package/dist/codemirror/core/paint.js +42 -0
  85. package/dist/codemirror/core/paint.js.map +1 -0
  86. package/dist/codemirror/core/parseToEnd.d.ts +24 -0
  87. package/dist/codemirror/core/parseToEnd.js +38 -0
  88. package/dist/codemirror/core/parseToEnd.js.map +1 -0
  89. package/dist/codemirror/core/plugin.d.ts +32 -0
  90. package/dist/codemirror/core/plugin.js +161 -0
  91. package/dist/codemirror/core/plugin.js.map +1 -0
  92. package/dist/codemirror/core/registry.d.ts +38 -0
  93. package/dist/codemirror/core/registry.js +133 -0
  94. package/dist/codemirror/core/registry.js.map +1 -0
  95. package/dist/codemirror/core/testKeys.d.ts +17 -0
  96. package/dist/codemirror/core/testKeys.js +11 -0
  97. package/dist/codemirror/core/testKeys.js.map +1 -0
  98. package/dist/codemirror/core/treeAt.d.ts +31 -0
  99. package/dist/codemirror/core/treeAt.js +10 -0
  100. package/dist/codemirror/core/treeAt.js.map +1 -0
  101. package/dist/codemirror/extensions/footnoteExtension.d.ts +9 -0
  102. package/dist/codemirror/extensions/footnoteExtension.js +14 -0
  103. package/dist/codemirror/extensions/footnoteExtension.js.map +1 -0
  104. package/dist/codemirror/extensions/highlightExtension.d.ts +9 -0
  105. package/dist/codemirror/extensions/highlightExtension.js +14 -0
  106. package/dist/codemirror/extensions/highlightExtension.js.map +1 -0
  107. package/dist/codemirror/extensions/index.d.ts +12 -0
  108. package/dist/codemirror/extensions/index.js +19 -0
  109. package/dist/codemirror/extensions/index.js.map +1 -0
  110. package/dist/codemirror/extensions/loader.d.ts +24 -0
  111. package/dist/codemirror/extensions/loader.js +33 -0
  112. package/dist/codemirror/extensions/loader.js.map +1 -0
  113. package/dist/codemirror/extensions/mathExtension.d.ts +9 -0
  114. package/dist/codemirror/extensions/mathExtension.js +14 -0
  115. package/dist/codemirror/extensions/mathExtension.js.map +1 -0
  116. package/dist/codemirror/extensions/mermaidExtension.d.ts +9 -0
  117. package/dist/codemirror/extensions/mermaidExtension.js +12 -0
  118. package/dist/codemirror/extensions/mermaidExtension.js.map +1 -0
  119. package/dist/codemirror/extensions/tableExtension.d.ts +13 -0
  120. package/dist/codemirror/extensions/tableExtension.js +39 -0
  121. package/dist/codemirror/extensions/tableExtension.js.map +1 -0
  122. package/dist/codemirror/extensions/types.d.ts +39 -0
  123. package/dist/codemirror/extensions/types.js +1 -0
  124. package/dist/codemirror/extensions/types.js.map +1 -0
  125. package/dist/codemirror/extensions/wikilinkExtension.d.ts +9 -0
  126. package/dist/codemirror/extensions/wikilinkExtension.js +14 -0
  127. package/dist/codemirror/extensions/wikilinkExtension.js.map +1 -0
  128. package/dist/codemirror/features/blockCommandSteps.d.ts +20 -0
  129. package/dist/codemirror/features/blockCommandSteps.js +83 -0
  130. package/dist/codemirror/features/blockCommandSteps.js.map +1 -0
  131. package/dist/codemirror/footnote/footnotePlugin.d.ts +10 -0
  132. package/dist/codemirror/footnote/footnotePlugin.js +78 -0
  133. package/dist/codemirror/footnote/footnotePlugin.js.map +1 -0
  134. package/dist/codemirror/footnote/footnoteScanRule.d.ts +9 -0
  135. package/dist/codemirror/footnote/footnoteScanRule.js +12 -0
  136. package/dist/codemirror/footnote/footnoteScanRule.js.map +1 -0
  137. package/dist/codemirror/footnote/index.d.ts +2 -0
  138. package/dist/codemirror/footnote/index.js +2 -0
  139. package/dist/codemirror/footnote/index.js.map +1 -0
  140. package/dist/codemirror/format/blockCommands.d.ts +17 -0
  141. package/dist/codemirror/format/blockCommands.js +176 -0
  142. package/dist/codemirror/format/blockCommands.js.map +1 -0
  143. package/dist/codemirror/format/formatCommands.d.ts +11 -0
  144. package/dist/codemirror/format/formatCommands.js +132 -0
  145. package/dist/codemirror/format/formatCommands.js.map +1 -0
  146. package/dist/codemirror/format/index.d.ts +4 -0
  147. package/dist/codemirror/format/index.js +3 -0
  148. package/dist/codemirror/format/index.js.map +1 -0
  149. package/dist/codemirror/highlight/highlightPlugin.d.ts +10 -0
  150. package/dist/codemirror/highlight/highlightPlugin.js +66 -0
  151. package/dist/codemirror/highlight/highlightPlugin.js.map +1 -0
  152. package/dist/codemirror/highlight/highlightScanRule.d.ts +8 -0
  153. package/dist/codemirror/highlight/highlightScanRule.js +12 -0
  154. package/dist/codemirror/highlight/highlightScanRule.js.map +1 -0
  155. package/dist/codemirror/highlight/index.d.ts +2 -0
  156. package/dist/codemirror/highlight/index.js +2 -0
  157. package/dist/codemirror/highlight/index.js.map +1 -0
  158. package/dist/codemirror/html/htmlWidget.d.ts +23 -0
  159. package/dist/codemirror/html/htmlWidget.js +67 -0
  160. package/dist/codemirror/html/htmlWidget.js.map +1 -0
  161. package/dist/codemirror/html/index.d.ts +4 -0
  162. package/dist/codemirror/html/index.js +2 -0
  163. package/dist/codemirror/html/index.js.map +1 -0
  164. package/dist/codemirror/image/imageActionMenu.d.ts +14 -0
  165. package/dist/codemirror/image/imageActionMenu.js +112 -0
  166. package/dist/codemirror/image/imageActionMenu.js.map +1 -0
  167. package/dist/codemirror/image/imageEditEvent.d.ts +20 -0
  168. package/dist/codemirror/image/imageEditEvent.js +6 -0
  169. package/dist/codemirror/image/imageEditEvent.js.map +1 -0
  170. package/dist/codemirror/image/imageInsertHandlers.d.ts +13 -0
  171. package/dist/codemirror/image/imageInsertHandlers.js +64 -0
  172. package/dist/codemirror/image/imageInsertHandlers.js.map +1 -0
  173. package/dist/codemirror/image/imageWidget.d.ts +49 -0
  174. package/dist/codemirror/image/imageWidget.js +83 -0
  175. package/dist/codemirror/image/imageWidget.js.map +1 -0
  176. package/dist/codemirror/image/index.d.ts +8 -0
  177. package/dist/codemirror/image/index.js +5 -0
  178. package/dist/codemirror/image/index.js.map +1 -0
  179. package/dist/codemirror/interaction/clickModel.d.ts +43 -0
  180. package/dist/codemirror/interaction/clickModel.js +99 -0
  181. package/dist/codemirror/interaction/clickModel.js.map +1 -0
  182. package/dist/codemirror/interaction/cursorModel.d.ts +10 -0
  183. package/dist/codemirror/interaction/cursorModel.js +58 -0
  184. package/dist/codemirror/interaction/cursorModel.js.map +1 -0
  185. package/dist/codemirror/interaction/deleteNormalizer.d.ts +18 -0
  186. package/dist/codemirror/interaction/deleteNormalizer.js +157 -0
  187. package/dist/codemirror/interaction/deleteNormalizer.js.map +1 -0
  188. package/dist/codemirror/interaction/flankingGuard.d.ts +20 -0
  189. package/dist/codemirror/interaction/flankingGuard.js +48 -0
  190. package/dist/codemirror/interaction/flankingGuard.js.map +1 -0
  191. package/dist/codemirror/interaction/index.d.ts +7 -0
  192. package/dist/codemirror/interaction/index.js +6 -0
  193. package/dist/codemirror/interaction/index.js.map +1 -0
  194. package/dist/codemirror/interaction/visiblePosition.d.ts +43 -0
  195. package/dist/codemirror/interaction/visiblePosition.js +98 -0
  196. package/dist/codemirror/interaction/visiblePosition.js.map +1 -0
  197. package/dist/codemirror/list/bulletWidget.d.ts +61 -0
  198. package/dist/codemirror/list/bulletWidget.js +84 -0
  199. package/dist/codemirror/list/bulletWidget.js.map +1 -0
  200. package/dist/codemirror/list/index.d.ts +4 -0
  201. package/dist/codemirror/list/index.js +3 -0
  202. package/dist/codemirror/list/index.js.map +1 -0
  203. package/dist/codemirror/list/listContinuation.d.ts +28 -0
  204. package/dist/codemirror/list/listContinuation.js +61 -0
  205. package/dist/codemirror/list/listContinuation.js.map +1 -0
  206. package/dist/codemirror/list/listIndent.d.ts +8 -0
  207. package/dist/codemirror/list/listIndent.js +95 -0
  208. package/dist/codemirror/list/listIndent.js.map +1 -0
  209. package/dist/codemirror/list/taskCheckboxWidget.d.ts +42 -0
  210. package/dist/codemirror/list/taskCheckboxWidget.js +47 -0
  211. package/dist/codemirror/list/taskCheckboxWidget.js.map +1 -0
  212. package/dist/codemirror/math/index.d.ts +3 -0
  213. package/dist/codemirror/math/index.js +2 -0
  214. package/dist/codemirror/math/index.js.map +1 -0
  215. package/dist/codemirror/math/mathPlugin.d.ts +10 -0
  216. package/dist/codemirror/math/mathPlugin.js +73 -0
  217. package/dist/codemirror/math/mathPlugin.js.map +1 -0
  218. package/dist/codemirror/math/mathScanRule.d.ts +16 -0
  219. package/dist/codemirror/math/mathScanRule.js +18 -0
  220. package/dist/codemirror/math/mathScanRule.js.map +1 -0
  221. package/dist/codemirror/math/mathWidget.d.ts +15 -0
  222. package/dist/codemirror/math/mathWidget.js +36 -0
  223. package/dist/codemirror/math/mathWidget.js.map +1 -0
  224. package/dist/codemirror/mermaid/index.d.ts +4 -0
  225. package/dist/codemirror/mermaid/index.js +3 -0
  226. package/dist/codemirror/mermaid/index.js.map +1 -0
  227. package/dist/codemirror/mermaid/mermaidPlugin.d.ts +25 -0
  228. package/dist/codemirror/mermaid/mermaidPlugin.js +78 -0
  229. package/dist/codemirror/mermaid/mermaidPlugin.js.map +1 -0
  230. package/dist/codemirror/mermaid/mermaidRender.d.ts +42 -0
  231. package/dist/codemirror/mermaid/mermaidRender.js +136 -0
  232. package/dist/codemirror/mermaid/mermaidRender.js.map +1 -0
  233. package/dist/codemirror/mermaid/mermaidWidget.d.ts +42 -0
  234. package/dist/codemirror/mermaid/mermaidWidget.js +142 -0
  235. package/dist/codemirror/mermaid/mermaidWidget.js.map +1 -0
  236. package/dist/codemirror/selectionLayer.d.ts +43 -0
  237. package/dist/codemirror/selectionLayer.js +135 -0
  238. package/dist/codemirror/selectionLayer.js.map +1 -0
  239. package/dist/codemirror/table/cellDividerWidget.d.ts +9 -0
  240. package/dist/codemirror/table/cellDividerWidget.js +19 -0
  241. package/dist/codemirror/table/cellDividerWidget.js.map +1 -0
  242. package/dist/codemirror/table/index.d.ts +5 -0
  243. package/dist/codemirror/table/index.js +4 -0
  244. package/dist/codemirror/table/index.js.map +1 -0
  245. package/dist/codemirror/table/tableArmed.d.ts +27 -0
  246. package/dist/codemirror/table/tableArmed.js +43 -0
  247. package/dist/codemirror/table/tableArmed.js.map +1 -0
  248. package/dist/codemirror/table/tableCell.d.ts +19 -0
  249. package/dist/codemirror/table/tableCell.js +15 -0
  250. package/dist/codemirror/table/tableCell.js.map +1 -0
  251. package/dist/codemirror/table/tableCellNav.d.ts +51 -0
  252. package/dist/codemirror/table/tableCellNav.js +47 -0
  253. package/dist/codemirror/table/tableCellNav.js.map +1 -0
  254. package/dist/codemirror/table/tableContextMenu.d.ts +22 -0
  255. package/dist/codemirror/table/tableContextMenu.js +139 -0
  256. package/dist/codemirror/table/tableContextMenu.js.map +1 -0
  257. package/dist/codemirror/table/tableEditCommands.d.ts +29 -0
  258. package/dist/codemirror/table/tableEditCommands.js +86 -0
  259. package/dist/codemirror/table/tableEditCommands.js.map +1 -0
  260. package/dist/codemirror/table/tableExcerpt.d.ts +29 -0
  261. package/dist/codemirror/table/tableExcerpt.js +34 -0
  262. package/dist/codemirror/table/tableExcerpt.js.map +1 -0
  263. package/dist/codemirror/table/tableField.d.ts +6 -0
  264. package/dist/codemirror/table/tableField.js +37 -0
  265. package/dist/codemirror/table/tableField.js.map +1 -0
  266. package/dist/codemirror/table/tableGeometry.d.ts +33 -0
  267. package/dist/codemirror/table/tableGeometry.js +28 -0
  268. package/dist/codemirror/table/tableGeometry.js.map +1 -0
  269. package/dist/codemirror/table/tableInline.d.ts +37 -0
  270. package/dist/codemirror/table/tableInline.js +105 -0
  271. package/dist/codemirror/table/tableInline.js.map +1 -0
  272. package/dist/codemirror/table/tableModel.d.ts +45 -0
  273. package/dist/codemirror/table/tableModel.js +98 -0
  274. package/dist/codemirror/table/tableModel.js.map +1 -0
  275. package/dist/codemirror/tablev2/bridgeRules.d.ts +48 -0
  276. package/dist/codemirror/tablev2/bridgeRules.js +42 -0
  277. package/dist/codemirror/tablev2/bridgeRules.js.map +1 -0
  278. package/dist/codemirror/tablev2/cellEditingSurface.d.ts +79 -0
  279. package/dist/codemirror/tablev2/cellEditingSurface.js +70 -0
  280. package/dist/codemirror/tablev2/cellEditingSurface.js.map +1 -0
  281. package/dist/codemirror/tablev2/cellText.d.ts +11 -0
  282. package/dist/codemirror/tablev2/cellText.js +12 -0
  283. package/dist/codemirror/tablev2/cellText.js.map +1 -0
  284. package/dist/codemirror/tablev2/inlineCellSurface.d.ts +38 -0
  285. package/dist/codemirror/tablev2/inlineCellSurface.js +162 -0
  286. package/dist/codemirror/tablev2/inlineCellSurface.js.map +1 -0
  287. package/dist/codemirror/tablev2/overlayCellSurface.d.ts +36 -0
  288. package/dist/codemirror/tablev2/overlayCellSurface.js +150 -0
  289. package/dist/codemirror/tablev2/overlayCellSurface.js.map +1 -0
  290. package/dist/codemirror/tablev2/tableEditingSteps.d.ts +12 -0
  291. package/dist/codemirror/tablev2/tableEditingSteps.js +518 -0
  292. package/dist/codemirror/tablev2/tableEditingSteps.js.map +1 -0
  293. package/dist/codemirror/tablev2/tableV2HoverControls.d.ts +23 -0
  294. package/dist/codemirror/tablev2/tableV2HoverControls.js +89 -0
  295. package/dist/codemirror/tablev2/tableV2HoverControls.js.map +1 -0
  296. package/dist/codemirror/tablev2/tableV2Interaction.d.ts +29 -0
  297. package/dist/codemirror/tablev2/tableV2Interaction.js +224 -0
  298. package/dist/codemirror/tablev2/tableV2Interaction.js.map +1 -0
  299. package/dist/codemirror/tablev2/tableV2Selection.d.ts +45 -0
  300. package/dist/codemirror/tablev2/tableV2Selection.js +81 -0
  301. package/dist/codemirror/tablev2/tableV2Selection.js.map +1 -0
  302. package/dist/codemirror/tablev2/tableV2Sync.d.ts +13 -0
  303. package/dist/codemirror/tablev2/tableV2Sync.js +13 -0
  304. package/dist/codemirror/tablev2/tableV2Sync.js.map +1 -0
  305. package/dist/codemirror/tablev2/tableWidgetV2.d.ts +46 -0
  306. package/dist/codemirror/tablev2/tableWidgetV2.js +139 -0
  307. package/dist/codemirror/tablev2/tableWidgetV2.js.map +1 -0
  308. package/dist/codemirror/updateBus.d.ts +29 -0
  309. package/dist/codemirror/updateBus.js +26 -0
  310. package/dist/codemirror/updateBus.js.map +1 -0
  311. package/dist/codemirror/wikilink/index.d.ts +3 -0
  312. package/dist/codemirror/wikilink/index.js +2 -0
  313. package/dist/codemirror/wikilink/index.js.map +1 -0
  314. package/dist/codemirror/wikilink/wikilinkPlugin.d.ts +40 -0
  315. package/dist/codemirror/wikilink/wikilinkPlugin.js +89 -0
  316. package/dist/codemirror/wikilink/wikilinkPlugin.js.map +1 -0
  317. package/dist/codemirror/wikilink/wikilinkScanRule.d.ts +9 -0
  318. package/dist/codemirror/wikilink/wikilinkScanRule.js +13 -0
  319. package/dist/codemirror/wikilink/wikilinkScanRule.js.map +1 -0
  320. package/dist/frontmatter.d.ts +79 -0
  321. package/dist/frontmatter.js +58 -0
  322. package/dist/frontmatter.js.map +1 -0
  323. package/dist/imageInsert.d.ts +66 -0
  324. package/dist/imageInsert.js +111 -0
  325. package/dist/imageInsert.js.map +1 -0
  326. package/dist/imageSrcResolver.d.ts +55 -0
  327. package/dist/imageSrcResolver.js +49 -0
  328. package/dist/imageSrcResolver.js.map +1 -0
  329. package/dist/index.d.ts +35 -880
  330. package/dist/index.js +128 -5989
  331. package/dist/index.js.map +1 -1
  332. package/dist/links/wikilink.d.ts +26 -0
  333. package/dist/links/wikilink.js +54 -0
  334. package/dist/links/wikilink.js.map +1 -0
  335. package/dist/links/workspaceLink.d.ts +34 -0
  336. package/dist/links/workspaceLink.js +60 -0
  337. package/dist/links/workspaceLink.js.map +1 -0
  338. package/dist/types.d.ts +20 -0
  339. package/dist/types.js +1 -0
  340. package/dist/types.js.map +1 -0
  341. package/package.json +7 -3
@@ -0,0 +1,80 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { syntaxTree } from "@codemirror/language";
3
+ import { StateField } from "@codemirror/state";
4
+ import { Decoration, EditorView, ViewPlugin, WidgetType } from "@codemirror/view";
5
+ import { fenceAtLoose, showCodeBlockMenu, showLanguageMenu } from "./codeLanguageMenu.js";
6
+ class PlainLangPill extends WidgetType {
7
+ eq() {
8
+ return true;
9
+ }
10
+ toDOM() {
11
+ const pill = document.createElement("span");
12
+ pill.className = "cm-code-info cm-code-info--unset";
13
+ pill.textContent = "plain";
14
+ return pill;
15
+ }
16
+ ignoreEvent() {
17
+ return false;
18
+ }
19
+ }
20
+ const PILL = Decoration.widget({ widget: new PlainLangPill(), side: 1 });
21
+ function buildPills(state) {
22
+ const ranges = [];
23
+ syntaxTree(state).iterate({
24
+ enter(node) {
25
+ if (node.name !== "FencedCode") return;
26
+ const marks = node.node.getChildren("CodeMark");
27
+ if (marks.length < 2) return;
28
+ if (node.node.getChildren("CodeInfo").length > 0) return;
29
+ ranges.push(PILL.range(marks[0].to));
30
+ }
31
+ });
32
+ return Decoration.set(ranges, true);
33
+ }
34
+ const plainPillField = StateField.define({
35
+ create: buildPills,
36
+ update(value, tr) {
37
+ if (tr.docChanged || syntaxTree(tr.state) !== syntaxTree(tr.startState)) {
38
+ return buildPills(tr.state);
39
+ }
40
+ return value;
41
+ },
42
+ provide: (f) => EditorView.decorations.from(f)
43
+ });
44
+ function fenceAtEvent(view, event) {
45
+ const pos = view.posAtCoords({ x: event.clientX, y: event.clientY });
46
+ if (pos === null) return null;
47
+ const node = fenceAtLoose(view.state, pos);
48
+ return node ? node.from : null;
49
+ }
50
+ const interactionPlugin = ViewPlugin.define((view) => {
51
+ const onMouseDown = (event) => {
52
+ if (event.button !== 0) return;
53
+ const target = event.target;
54
+ if (!target.closest?.(".cm-code-info")) return;
55
+ const fencePos = fenceAtEvent(view, event);
56
+ if (fencePos === null) return;
57
+ event.preventDefault();
58
+ event.stopPropagation();
59
+ showLanguageMenu({ view, x: event.clientX, y: event.clientY, fencePos });
60
+ };
61
+ const onContextMenu = (event) => {
62
+ const fencePos = fenceAtEvent(view, event);
63
+ if (fencePos === null) return;
64
+ event.preventDefault();
65
+ showCodeBlockMenu({ view, x: event.clientX, y: event.clientY, fencePos });
66
+ };
67
+ view.dom.addEventListener("mousedown", onMouseDown, true);
68
+ view.dom.addEventListener("contextmenu", onContextMenu);
69
+ return {
70
+ destroy() {
71
+ view.dom.removeEventListener("mousedown", onMouseDown, true);
72
+ view.dom.removeEventListener("contextmenu", onContextMenu);
73
+ }
74
+ };
75
+ });
76
+ const codeLanguageUI = [plainPillField, interactionPlugin];
77
+ export {
78
+ codeLanguageUI
79
+ };
80
+ //# sourceMappingURL=codeLangAffordance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/code/codeLangAffordance.ts"],"sourcesContent":["/**\n * The opener-row language affordance (ADR 0002).\n *\n * A CLOSED fence with a language shows its styled CodeInfo text (the pill);\n * one without gets a \"plain\" placeholder pill widget so every block has a\n * click target. Clicking either opens the searchable language chooser;\n * right-clicking anywhere in a block opens the block menu (set language,\n * copy code). Pointer handling is delegated — one listener per editor — and\n * clicks are swallowed on mousedown so the fence caret guard (§12.9) never\n * sees them.\n */\n\nimport { syntaxTree } from \"@codemirror/language\";\nimport { type EditorState, type Extension, type Range, StateField } from \"@codemirror/state\";\nimport { Decoration, type DecorationSet, EditorView, ViewPlugin, WidgetType } from \"@codemirror/view\";\n\nimport { fenceAtLoose, showCodeBlockMenu, showLanguageMenu } from \"./codeLanguageMenu\";\n\nclass PlainLangPill extends WidgetType {\n override eq(): boolean {\n return true;\n }\n\n override toDOM(): HTMLElement {\n const pill = document.createElement(\"span\");\n pill.className = \"cm-code-info cm-code-info--unset\";\n pill.textContent = \"plain\";\n return pill;\n }\n\n override ignoreEvent(): boolean {\n return false;\n }\n}\n\nconst PILL = Decoration.widget({ widget: new PlainLangPill(), side: 1 });\n\nfunction buildPills(state: EditorState): DecorationSet {\n const ranges: Range<Decoration>[] = [];\n syntaxTree(state).iterate({\n enter(node) {\n if (node.name !== \"FencedCode\") return;\n const marks = node.node.getChildren(\"CodeMark\");\n if (marks.length < 2) return; // unclosed: the language flow is typing\n if (node.node.getChildren(\"CodeInfo\").length > 0) return;\n ranges.push(PILL.range(marks[0].to));\n },\n });\n return Decoration.set(ranges, true);\n}\n\nconst plainPillField = StateField.define<DecorationSet>({\n create: buildPills,\n update(value, tr) {\n if (tr.docChanged || syntaxTree(tr.state) !== syntaxTree(tr.startState)) {\n return buildPills(tr.state);\n }\n return value;\n },\n provide: (f) => EditorView.decorations.from(f),\n});\n\n/** The fence containing the event point, resolved through the view. */\nfunction fenceAtEvent(view: EditorView, event: MouseEvent): number | null {\n const pos = view.posAtCoords({ x: event.clientX, y: event.clientY });\n if (pos === null) return null;\n const node = fenceAtLoose(view.state, pos);\n return node ? node.from : null;\n}\n\nconst interactionPlugin = ViewPlugin.define((view) => {\n const onMouseDown = (event: MouseEvent): void => {\n if (event.button !== 0) return;\n const target = event.target as HTMLElement;\n if (!target.closest?.(\".cm-code-info\")) return;\n const fencePos = fenceAtEvent(view, event);\n if (fencePos === null) return;\n // Swallow the press: the pill is a control, not text — the caret must\n // not move (and §12.9 must not re-site it).\n event.preventDefault();\n event.stopPropagation();\n showLanguageMenu({ view, x: event.clientX, y: event.clientY, fencePos });\n };\n\n const onContextMenu = (event: MouseEvent): void => {\n const fencePos = fenceAtEvent(view, event);\n if (fencePos === null) return;\n event.preventDefault();\n showCodeBlockMenu({ view, x: event.clientX, y: event.clientY, fencePos });\n };\n\n view.dom.addEventListener(\"mousedown\", onMouseDown, true);\n view.dom.addEventListener(\"contextmenu\", onContextMenu);\n return {\n destroy() {\n view.dom.removeEventListener(\"mousedown\", onMouseDown, true);\n view.dom.removeEventListener(\"contextmenu\", onContextMenu);\n },\n };\n});\n\nexport const codeLanguageUI: Extension = [plainPillField, interactionPlugin];\n"],"mappings":";AAYA,SAAS,kBAAkB;AAC3B,SAAuD,kBAAkB;AACzE,SAAS,YAAgC,YAAY,YAAY,kBAAkB;AAEnF,SAAS,cAAc,mBAAmB,wBAAwB;AAElE,MAAM,sBAAsB,WAAW;AAAA,EAC5B,KAAc;AACrB,WAAO;AAAA,EACT;AAAA,EAES,QAAqB;AAC5B,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAES,cAAuB;AAC9B,WAAO;AAAA,EACT;AACF;AAEA,MAAM,OAAO,WAAW,OAAO,EAAE,QAAQ,IAAI,cAAc,GAAG,MAAM,EAAE,CAAC;AAEvE,SAAS,WAAW,OAAmC;AACrD,QAAM,SAA8B,CAAC;AACrC,aAAW,KAAK,EAAE,QAAQ;AAAA,IACxB,MAAM,MAAM;AACV,UAAI,KAAK,SAAS,aAAc;AAChC,YAAM,QAAQ,KAAK,KAAK,YAAY,UAAU;AAC9C,UAAI,MAAM,SAAS,EAAG;AACtB,UAAI,KAAK,KAAK,YAAY,UAAU,EAAE,SAAS,EAAG;AAClD,aAAO,KAAK,KAAK,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC;AAAA,IACrC;AAAA,EACF,CAAC;AACD,SAAO,WAAW,IAAI,QAAQ,IAAI;AACpC;AAEA,MAAM,iBAAiB,WAAW,OAAsB;AAAA,EACtD,QAAQ;AAAA,EACR,OAAO,OAAO,IAAI;AAChB,QAAI,GAAG,cAAc,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,UAAU,GAAG;AACvE,aAAO,WAAW,GAAG,KAAK;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA,EACA,SAAS,CAAC,MAAM,WAAW,YAAY,KAAK,CAAC;AAC/C,CAAC;AAGD,SAAS,aAAa,MAAkB,OAAkC;AACxE,QAAM,MAAM,KAAK,YAAY,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC;AACnE,MAAI,QAAQ,KAAM,QAAO;AACzB,QAAM,OAAO,aAAa,KAAK,OAAO,GAAG;AACzC,SAAO,OAAO,KAAK,OAAO;AAC5B;AAEA,MAAM,oBAAoB,WAAW,OAAO,CAAC,SAAS;AACpD,QAAM,cAAc,CAAC,UAA4B;AAC/C,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,SAAS,MAAM;AACrB,QAAI,CAAC,OAAO,UAAU,eAAe,EAAG;AACxC,UAAM,WAAW,aAAa,MAAM,KAAK;AACzC,QAAI,aAAa,KAAM;AAGvB,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,qBAAiB,EAAE,MAAM,GAAG,MAAM,SAAS,GAAG,MAAM,SAAS,SAAS,CAAC;AAAA,EACzE;AAEA,QAAM,gBAAgB,CAAC,UAA4B;AACjD,UAAM,WAAW,aAAa,MAAM,KAAK;AACzC,QAAI,aAAa,KAAM;AACvB,UAAM,eAAe;AACrB,sBAAkB,EAAE,MAAM,GAAG,MAAM,SAAS,GAAG,MAAM,SAAS,SAAS,CAAC;AAAA,EAC1E;AAEA,OAAK,IAAI,iBAAiB,aAAa,aAAa,IAAI;AACxD,OAAK,IAAI,iBAAiB,eAAe,aAAa;AACtD,SAAO;AAAA,IACL,UAAU;AACR,WAAK,IAAI,oBAAoB,aAAa,aAAa,IAAI;AAC3D,WAAK,IAAI,oBAAoB,eAAe,aAAa;AAAA,IAC3D;AAAA,EACF;AACF,CAAC;AAEM,MAAM,iBAA4B,CAAC,gBAAgB,iBAAiB;","names":[]}
@@ -0,0 +1,40 @@
1
+ import { FenceNode } from './fenceAutoClose.js';
2
+ import { EditorState, ChangeSpec } from '@codemirror/state';
3
+ import { EditorView } from '@codemirror/view';
4
+
5
+ /** `fenceAt` resolves side -1 and misses the fence's own from-boundary — the
6
+ * very position callers naturally pass (node.from). Probe one step in. */
7
+ declare function fenceAtLoose(state: EditorState, pos: number): FenceNode | null;
8
+ /** Replace the fence's info string (everything after the opening marks on the
9
+ * opener line) with `info`; null clears it. Null result = no fence at pos. */
10
+ declare function setFenceInfo(state: EditorState, fencePos: number, info: string | null): ChangeSpec | null;
11
+ /** The block's code content (between opener and closer lines). */
12
+ declare function fenceContent(state: EditorState, fencePos: number): string | null;
13
+ /** Write the block's content to the clipboard; returns it (for tests). */
14
+ declare function copyFenceCode(view: EditorView, fencePos: number): string | null;
15
+ /** The markdown info string we write for a chosen language: its shortest
16
+ * alias (`ts`, `js`, `py`) — the idiomatic fence tag. */
17
+ declare function infoFor(name: string): string | null;
18
+ interface LanguageEntry {
19
+ label: string;
20
+ hint?: string;
21
+ info: string | null;
22
+ haystack: string;
23
+ }
24
+ /** Every choosable entry: Plain text first, then grammars and rendered tags
25
+ * merged A→Z. */
26
+ declare function languageEntries(): LanguageEntry[];
27
+ interface LanguageMenuArgs {
28
+ view: EditorView;
29
+ x: number;
30
+ y: number;
31
+ /** Any position inside the target fence. */
32
+ fencePos: number;
33
+ }
34
+ /** Searchable language chooser; picking dispatches the info-string change as
35
+ * one undo step. */
36
+ declare function showLanguageMenu(args: LanguageMenuArgs): void;
37
+ /** Right-click menu for a code block: set language, copy content. */
38
+ declare function showCodeBlockMenu(args: LanguageMenuArgs): void;
39
+
40
+ export { type LanguageEntry, type LanguageMenuArgs, copyFenceCode, fenceAtLoose, fenceContent, infoFor, languageEntries, setFenceInfo, showCodeBlockMenu, showLanguageMenu };
@@ -0,0 +1,184 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { EditorSelection } from "@codemirror/state";
3
+ import { languages } from "@codemirror/language-data";
4
+ import { fenceAt } from "./fenceAutoClose.js";
5
+ function fenceAtLoose(state, pos) {
6
+ return fenceAt(state, pos) ?? fenceAt(state, Math.min(pos + 1, state.doc.length));
7
+ }
8
+ function setFenceInfo(state, fencePos, info) {
9
+ const node = fenceAtLoose(state, fencePos);
10
+ if (!node) return null;
11
+ const opener = node.getChildren("CodeMark")[0];
12
+ if (!opener) return null;
13
+ const openerLine = state.doc.lineAt(node.from);
14
+ return { from: opener.to, to: openerLine.to, insert: info ?? "" };
15
+ }
16
+ function fenceContent(state, fencePos) {
17
+ const node = fenceAtLoose(state, fencePos);
18
+ if (!node) return null;
19
+ const marks = node.getChildren("CodeMark");
20
+ if (marks.length < 2) return null;
21
+ const openerLine = state.doc.lineAt(node.from);
22
+ const closerLine = state.doc.lineAt(marks[marks.length - 1].from);
23
+ if (closerLine.from - 1 <= openerLine.to) return "";
24
+ return state.sliceDoc(openerLine.to + 1, closerLine.from - 1);
25
+ }
26
+ function copyFenceCode(view, fencePos) {
27
+ const content = fenceContent(view.state, fencePos);
28
+ if (content === null) return null;
29
+ void navigator.clipboard?.writeText(content).catch(() => {
30
+ const area = document.createElement("textarea");
31
+ area.value = content;
32
+ document.body.appendChild(area);
33
+ area.select();
34
+ document.execCommand("copy");
35
+ area.remove();
36
+ });
37
+ return content;
38
+ }
39
+ function mountMenu(x, y) {
40
+ const root = document.createElement("div");
41
+ root.className = "cm-code-menu";
42
+ root.setAttribute("role", "menu");
43
+ root.style.cssText = "position:fixed;z-index:1000;min-width:12rem;padding:0.25rem;background:var(--cds-layer-01,#ffffff);border:0.0625rem solid var(--cds-border-subtle-01,#e0e0e0);border-radius:0.375rem;box-shadow:0 0.125rem 0.75rem rgba(0,0,0,0.18);font-size:0.875rem;";
44
+ root.style.left = `${x}px`;
45
+ root.style.top = `${y}px`;
46
+ document.body.appendChild(root);
47
+ const onOutside = (event) => {
48
+ if (!root.contains(event.target)) destroy();
49
+ };
50
+ const onEscape = (event) => {
51
+ if (event.key === "Escape") destroy();
52
+ };
53
+ function destroy() {
54
+ root.remove();
55
+ document.removeEventListener("mousedown", onOutside, true);
56
+ document.removeEventListener("keydown", onEscape, true);
57
+ }
58
+ setTimeout(() => {
59
+ document.addEventListener("mousedown", onOutside, true);
60
+ document.addEventListener("keydown", onEscape, true);
61
+ }, 0);
62
+ const clamp = () => {
63
+ const rect = root.getBoundingClientRect();
64
+ if (rect.right > window.innerWidth) root.style.left = `${x - rect.width}px`;
65
+ if (rect.bottom > window.innerHeight) root.style.top = `${Math.max(0, y - rect.height)}px`;
66
+ };
67
+ queueMicrotask(clamp);
68
+ return { root, destroy };
69
+ }
70
+ function itemButton(label, hint) {
71
+ const button = document.createElement("button");
72
+ button.type = "button";
73
+ button.className = "cm-code-menu__item";
74
+ button.style.cssText = "display:flex;justify-content:space-between;gap:1rem;width:100%;padding:0.3rem 0.6rem;border:none;background:none;text-align:left;cursor:pointer;border-radius:0.25rem;color:inherit;";
75
+ button.addEventListener("mouseenter", () => button.style.background = "var(--cds-layer-hover-01,#e8e8e8)");
76
+ button.addEventListener("mouseleave", () => button.style.background = "none");
77
+ const name = document.createElement("span");
78
+ name.textContent = label;
79
+ button.appendChild(name);
80
+ if (hint) {
81
+ const alias = document.createElement("span");
82
+ alias.textContent = hint;
83
+ alias.style.cssText = "color:var(--cds-text-secondary,#6f6f6f);font-size:0.75rem;";
84
+ button.appendChild(alias);
85
+ }
86
+ return button;
87
+ }
88
+ function infoFor(name) {
89
+ const lang = languages.find((l) => l.name === name);
90
+ if (!lang) return null;
91
+ return [...lang.alias, lang.name.toLowerCase()].sort((a, b) => a.length - b.length)[0];
92
+ }
93
+ const RENDERED_FENCE_TAGS = [
94
+ {
95
+ label: "Mermaid",
96
+ hint: "diagram",
97
+ info: "mermaid",
98
+ haystack: "mermaid diagram flowchart sequence graph chart"
99
+ }
100
+ ];
101
+ function languageEntries() {
102
+ return [
103
+ { label: "Plain text", info: null, haystack: "plain text none" },
104
+ ...[
105
+ ...languages.map((l) => ({
106
+ label: l.name,
107
+ hint: infoFor(l.name) ?? void 0,
108
+ info: infoFor(l.name),
109
+ haystack: `${l.name} ${l.alias.join(" ")}`.toLowerCase()
110
+ })),
111
+ ...RENDERED_FENCE_TAGS
112
+ ].sort((a, b) => a.label.localeCompare(b.label))
113
+ ];
114
+ }
115
+ function showLanguageMenu(args) {
116
+ const menu = mountMenu(args.x, args.y);
117
+ const search = document.createElement("input");
118
+ search.type = "text";
119
+ search.placeholder = "Search languages\u2026";
120
+ search.className = "cm-code-menu__search";
121
+ search.style.cssText = "width:100%;box-sizing:border-box;margin-bottom:0.25rem;padding:0.3rem 0.5rem;border:0.0625rem solid var(--cds-border-subtle-01,#e0e0e0);border-radius:0.25rem;font:inherit;outline-color:var(--cds-focus,#0f62fe);";
122
+ menu.root.appendChild(search);
123
+ const list = document.createElement("div");
124
+ list.style.cssText = "max-height:16rem;overflow-y:auto;";
125
+ menu.root.appendChild(list);
126
+ const apply = (info) => {
127
+ const change = setFenceInfo(args.view.state, args.fencePos, info);
128
+ menu.destroy();
129
+ if (change) {
130
+ const newLength = args.view.state.doc.length - (change.to - change.from) + change.insert.length;
131
+ const anchor = Math.min(change.from + change.insert.length + 1, newLength);
132
+ args.view.dispatch({
133
+ changes: change,
134
+ selection: EditorSelection.cursor(anchor),
135
+ userEvent: "input.code.language"
136
+ });
137
+ }
138
+ args.view.focus();
139
+ };
140
+ const entries = languageEntries();
141
+ const render = (filter) => {
142
+ list.textContent = "";
143
+ const needle = filter.trim().toLowerCase();
144
+ for (const entry of entries.filter((e) => !needle || e.haystack.includes(needle))) {
145
+ const button = itemButton(entry.label, entry.hint);
146
+ button.addEventListener("click", () => apply(entry.info));
147
+ list.appendChild(button);
148
+ }
149
+ };
150
+ render("");
151
+ search.addEventListener("input", () => render(search.value));
152
+ search.addEventListener("keydown", (event) => {
153
+ if (event.key !== "Enter") return;
154
+ event.preventDefault();
155
+ list.querySelector("button")?.click();
156
+ });
157
+ search.focus();
158
+ }
159
+ function showCodeBlockMenu(args) {
160
+ const menu = mountMenu(args.x, args.y);
161
+ const language = itemButton("Set language\u2026");
162
+ language.addEventListener("click", () => {
163
+ menu.destroy();
164
+ showLanguageMenu(args);
165
+ });
166
+ const copy = itemButton("Copy code");
167
+ copy.addEventListener("click", () => {
168
+ copyFenceCode(args.view, args.fencePos);
169
+ menu.destroy();
170
+ args.view.focus();
171
+ });
172
+ menu.root.append(language, copy);
173
+ }
174
+ export {
175
+ copyFenceCode,
176
+ fenceAtLoose,
177
+ fenceContent,
178
+ infoFor,
179
+ languageEntries,
180
+ setFenceInfo,
181
+ showCodeBlockMenu,
182
+ showLanguageMenu
183
+ };
184
+ //# sourceMappingURL=codeLanguageMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/code/codeLanguageMenu.ts"],"sourcesContent":["/**\n * Language + block menus for fenced code (ADR 0002).\n *\n * Typing the language right after ``` works while the block is still empty\n * (§12.4 keeps the caret on the opener) — these menus are the POINTER path,\n * and the only path once a block has content: the opener-row pill (real or\n * \"plain\" placeholder) opens a searchable chooser, and right-click anywhere\n * in a block offers \"Set language…\" and \"Copy code\". Menus mount on\n * document.body with inline styles (outside the editor's scoped theme), the\n * same pattern as the table menu.\n */\n\nimport { EditorSelection, type ChangeSpec, type EditorState } from \"@codemirror/state\";\nimport { type EditorView } from \"@codemirror/view\";\nimport { languages } from \"@codemirror/language-data\";\n\nimport { fenceAt } from \"./fenceAutoClose\";\n\n/** `fenceAt` resolves side -1 and misses the fence's own from-boundary — the\n * very position callers naturally pass (node.from). Probe one step in. */\nexport function fenceAtLoose(state: EditorState, pos: number) {\n return fenceAt(state, pos) ?? fenceAt(state, Math.min(pos + 1, state.doc.length));\n}\n\n/** Replace the fence's info string (everything after the opening marks on the\n * opener line) with `info`; null clears it. Null result = no fence at pos. */\nexport function setFenceInfo(\n state: EditorState,\n fencePos: number,\n info: string | null,\n): ChangeSpec | null {\n const node = fenceAtLoose(state, fencePos);\n if (!node) return null;\n const opener = node.getChildren(\"CodeMark\")[0];\n if (!opener) return null;\n const openerLine = state.doc.lineAt(node.from);\n return { from: opener.to, to: openerLine.to, insert: info ?? \"\" };\n}\n\n/** The block's code content (between opener and closer lines). */\nexport function fenceContent(state: EditorState, fencePos: number): string | null {\n const node = fenceAtLoose(state, fencePos);\n if (!node) return null;\n const marks = node.getChildren(\"CodeMark\");\n if (marks.length < 2) return null;\n const openerLine = state.doc.lineAt(node.from);\n const closerLine = state.doc.lineAt(marks[marks.length - 1].from);\n if (closerLine.from - 1 <= openerLine.to) return \"\";\n return state.sliceDoc(openerLine.to + 1, closerLine.from - 1);\n}\n\n/** Write the block's content to the clipboard; returns it (for tests). */\nexport function copyFenceCode(view: EditorView, fencePos: number): string | null {\n const content = fenceContent(view.state, fencePos);\n if (content === null) return null;\n void navigator.clipboard?.writeText(content).catch(() => {\n // Clipboard API denied (rare in the webview): execCommand fallback.\n const area = document.createElement(\"textarea\");\n area.value = content;\n document.body.appendChild(area);\n area.select();\n document.execCommand(\"copy\");\n area.remove();\n });\n return content;\n}\n\ninterface MenuHandle {\n root: HTMLElement;\n destroy(): void;\n}\n\nfunction mountMenu(x: number, y: number): MenuHandle {\n const root = document.createElement(\"div\");\n root.className = \"cm-code-menu\";\n root.setAttribute(\"role\", \"menu\");\n root.style.cssText =\n \"position:fixed;z-index:1000;min-width:12rem;padding:0.25rem;\" +\n \"background:var(--cds-layer-01,#ffffff);border:0.0625rem solid var(--cds-border-subtle-01,#e0e0e0);\" +\n \"border-radius:0.375rem;box-shadow:0 0.125rem 0.75rem rgba(0,0,0,0.18);font-size:0.875rem;\";\n root.style.left = `${x}px`;\n root.style.top = `${y}px`;\n document.body.appendChild(root);\n\n const onOutside = (event: MouseEvent): void => {\n if (!root.contains(event.target as Node)) destroy();\n };\n const onEscape = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") destroy();\n };\n function destroy(): void {\n root.remove();\n document.removeEventListener(\"mousedown\", onOutside, true);\n document.removeEventListener(\"keydown\", onEscape, true);\n }\n // Defer registration past the event that opened the menu.\n setTimeout(() => {\n document.addEventListener(\"mousedown\", onOutside, true);\n document.addEventListener(\"keydown\", onEscape, true);\n }, 0);\n\n const clamp = () => {\n const rect = root.getBoundingClientRect();\n if (rect.right > window.innerWidth) root.style.left = `${x - rect.width}px`;\n if (rect.bottom > window.innerHeight) root.style.top = `${Math.max(0, y - rect.height)}px`;\n };\n queueMicrotask(clamp);\n return { root, destroy };\n}\n\nfunction itemButton(label: string, hint?: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"cm-code-menu__item\";\n button.style.cssText =\n \"display:flex;justify-content:space-between;gap:1rem;width:100%;padding:0.3rem 0.6rem;\" +\n \"border:none;background:none;text-align:left;cursor:pointer;border-radius:0.25rem;color:inherit;\";\n button.addEventListener(\"mouseenter\", () => (button.style.background = \"var(--cds-layer-hover-01,#e8e8e8)\"));\n button.addEventListener(\"mouseleave\", () => (button.style.background = \"none\"));\n const name = document.createElement(\"span\");\n name.textContent = label;\n button.appendChild(name);\n if (hint) {\n const alias = document.createElement(\"span\");\n alias.textContent = hint;\n alias.style.cssText = \"color:var(--cds-text-secondary,#6f6f6f);font-size:0.75rem;\";\n button.appendChild(alias);\n }\n return button;\n}\n\n/** The markdown info string we write for a chosen language: its shortest\n * alias (`ts`, `js`, `py`) — the idiomatic fence tag. */\nexport function infoFor(name: string): string | null {\n const lang = languages.find((l) => l.name === name);\n if (!lang) return null;\n return [...lang.alias, lang.name.toLowerCase()].sort((a, b) => a.length - b.length)[0];\n}\n\nexport interface LanguageEntry {\n label: string;\n hint?: string;\n info: string | null;\n haystack: string;\n}\n\n/** Fence tags Compose RENDERS rather than parses — no CodeMirror grammar\n * exists for them, so they'd otherwise be absent from the chooser, and\n * type-time auto-close (§12.4) makes this menu the only way to give a\n * from-scratch fence its language. */\nconst RENDERED_FENCE_TAGS: LanguageEntry[] = [\n {\n label: \"Mermaid\",\n hint: \"diagram\",\n info: \"mermaid\",\n haystack: \"mermaid diagram flowchart sequence graph chart\",\n },\n];\n\n/** Every choosable entry: Plain text first, then grammars and rendered tags\n * merged A→Z. */\nexport function languageEntries(): LanguageEntry[] {\n return [\n { label: \"Plain text\", info: null, haystack: \"plain text none\" },\n ...[\n ...languages.map((l) => ({\n label: l.name,\n hint: infoFor(l.name) ?? undefined,\n info: infoFor(l.name),\n haystack: `${l.name} ${l.alias.join(\" \")}`.toLowerCase(),\n })),\n ...RENDERED_FENCE_TAGS,\n ].sort((a, b) => a.label.localeCompare(b.label)),\n ];\n}\n\nexport interface LanguageMenuArgs {\n view: EditorView;\n x: number;\n y: number;\n /** Any position inside the target fence. */\n fencePos: number;\n}\n\n/** Searchable language chooser; picking dispatches the info-string change as\n * one undo step. */\nexport function showLanguageMenu(args: LanguageMenuArgs): void {\n const menu = mountMenu(args.x, args.y);\n\n const search = document.createElement(\"input\");\n search.type = \"text\";\n search.placeholder = \"Search languages…\";\n search.className = \"cm-code-menu__search\";\n search.style.cssText =\n \"width:100%;box-sizing:border-box;margin-bottom:0.25rem;padding:0.3rem 0.5rem;\" +\n \"border:0.0625rem solid var(--cds-border-subtle-01,#e0e0e0);border-radius:0.25rem;font:inherit;outline-color:var(--cds-focus,#0f62fe);\";\n menu.root.appendChild(search);\n\n const list = document.createElement(\"div\");\n list.style.cssText = \"max-height:16rem;overflow-y:auto;\";\n menu.root.appendChild(list);\n\n const apply = (info: string | null): void => {\n const change = setFenceInfo(args.view.state, args.fencePos, info) as {\n from: number;\n to: number;\n insert: string;\n } | null;\n menu.destroy();\n if (change) {\n // Language chosen → drop the caret at the start of the first content\n // line, ready to type the code (or diagram) itself.\n const newLength = args.view.state.doc.length - (change.to - change.from) + change.insert.length;\n const anchor = Math.min(change.from + change.insert.length + 1, newLength);\n args.view.dispatch({\n changes: change,\n selection: EditorSelection.cursor(anchor),\n userEvent: \"input.code.language\",\n });\n }\n args.view.focus();\n };\n\n const entries = languageEntries();\n\n const render = (filter: string): void => {\n list.textContent = \"\";\n const needle = filter.trim().toLowerCase();\n for (const entry of entries.filter((e) => !needle || e.haystack.includes(needle))) {\n const button = itemButton(entry.label, entry.hint);\n button.addEventListener(\"click\", () => apply(entry.info));\n list.appendChild(button);\n }\n };\n render(\"\");\n search.addEventListener(\"input\", () => render(search.value));\n // Enter picks the top visible match.\n search.addEventListener(\"keydown\", (event) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n list.querySelector(\"button\")?.click();\n });\n search.focus();\n}\n\n/** Right-click menu for a code block: set language, copy content. */\nexport function showCodeBlockMenu(args: LanguageMenuArgs): void {\n const menu = mountMenu(args.x, args.y);\n const language = itemButton(\"Set language…\");\n language.addEventListener(\"click\", () => {\n menu.destroy();\n showLanguageMenu(args);\n });\n const copy = itemButton(\"Copy code\");\n copy.addEventListener(\"click\", () => {\n copyFenceCode(args.view, args.fencePos);\n menu.destroy();\n args.view.focus();\n });\n menu.root.append(language, copy);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,39 @@
1
+ import { Tag } from '@lezer/highlight';
2
+
3
+ /**
4
+ * The one code-syntax palette (One Light values — ADR 0002), consumed by both
5
+ * renderers so code looks the same everywhere it appears:
6
+ *
7
+ * - the EDITOR, via `codeHighlight.ts` (a CodeMirror `HighlightStyle` built
8
+ * from these specs), and
9
+ * - the CLIPBOARD, via `highlightFence.ts` (inline-styled spans — pasted HTML
10
+ * carries no stylesheet, so classes would be dead weight there).
11
+ *
12
+ * Each entry carries both a CSS custom property and a literal colour, because
13
+ * the two renderers cannot use the same one:
14
+ *
15
+ * - the editor emits a stylesheet, so it can read `var(--md-code-…)` and let a
16
+ * host restyle code for a dark theme;
17
+ * - the clipboard cannot. Pasted HTML arrives with no stylesheet, so a `var()`
18
+ * would resolve to nothing and paste colourless code into Google Docs or
19
+ * Word. It keeps the literal — which is also right on the merits, since the
20
+ * document being pasted into is white whatever theme the editor was in.
21
+ *
22
+ * So `color` is the light value AND the fallback; a host that sets no variables
23
+ * gets exactly the palette it got before.
24
+ */
25
+
26
+ interface CodeStyleSpec {
27
+ tag: Tag | readonly Tag[];
28
+ /** Literal colour: the light value, the `var()` fallback, and what the
29
+ * clipboard uses verbatim. */
30
+ color: string;
31
+ /** Custom property a host can set to restyle this role. */
32
+ cssVar: string;
33
+ fontStyle?: string;
34
+ }
35
+ declare const CODE_PALETTE: readonly CodeStyleSpec[];
36
+ /** What the editor paints with: themeable, falling back to the light value. */
37
+ declare function themedColor(spec: CodeStyleSpec): string;
38
+
39
+ export { CODE_PALETTE, type CodeStyleSpec, themedColor };
@@ -0,0 +1,53 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { tags } from "@lezer/highlight";
3
+ const CODE_PALETTE = [
4
+ {
5
+ tag: [tags.keyword, tags.modifier, tags.operatorKeyword],
6
+ color: "#a626a4",
7
+ cssVar: "--md-code-keyword"
8
+ },
9
+ {
10
+ tag: [tags.string, tags.special(tags.string)],
11
+ color: "#50a14f",
12
+ cssVar: "--md-code-string"
13
+ },
14
+ {
15
+ tag: tags.comment,
16
+ color: "#a0a1a7",
17
+ cssVar: "--md-code-comment",
18
+ fontStyle: "italic"
19
+ },
20
+ {
21
+ tag: [tags.number, tags.bool, tags.null, tags.atom],
22
+ color: "#986801",
23
+ cssVar: "--md-code-literal"
24
+ },
25
+ {
26
+ tag: [tags.function(tags.variableName), tags.function(tags.propertyName)],
27
+ color: "#4078f2",
28
+ cssVar: "--md-code-function"
29
+ },
30
+ {
31
+ tag: [tags.typeName, tags.className, tags.namespace],
32
+ color: "#c18401",
33
+ cssVar: "--md-code-type"
34
+ },
35
+ {
36
+ tag: tags.definition(tags.variableName),
37
+ color: "#e45649",
38
+ cssVar: "--md-code-variable"
39
+ },
40
+ { tag: tags.propertyName, color: "#4078f2", cssVar: "--md-code-property" },
41
+ { tag: [tags.tagName, tags.self], color: "#e45649", cssVar: "--md-code-tag" },
42
+ { tag: tags.attributeName, color: "#986801", cssVar: "--md-code-attribute" },
43
+ { tag: [tags.regexp, tags.escape], color: "#0184bc", cssVar: "--md-code-regexp" },
44
+ { tag: tags.invalid, color: "#ca1243", cssVar: "--md-code-invalid" }
45
+ ];
46
+ function themedColor(spec) {
47
+ return `var(${spec.cssVar}, ${spec.color})`;
48
+ }
49
+ export {
50
+ CODE_PALETTE,
51
+ themedColor
52
+ };
53
+ //# sourceMappingURL=codePalette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/code/codePalette.ts"],"sourcesContent":["/**\n * The one code-syntax palette (One Light values — ADR 0002), consumed by both\n * renderers so code looks the same everywhere it appears:\n *\n * - the EDITOR, via `codeHighlight.ts` (a CodeMirror `HighlightStyle` built\n * from these specs), and\n * - the CLIPBOARD, via `highlightFence.ts` (inline-styled spans — pasted HTML\n * carries no stylesheet, so classes would be dead weight there).\n *\n * Each entry carries both a CSS custom property and a literal colour, because\n * the two renderers cannot use the same one:\n *\n * - the editor emits a stylesheet, so it can read `var(--md-code-…)` and let a\n * host restyle code for a dark theme;\n * - the clipboard cannot. Pasted HTML arrives with no stylesheet, so a `var()`\n * would resolve to nothing and paste colourless code into Google Docs or\n * Word. It keeps the literal — which is also right on the merits, since the\n * document being pasted into is white whatever theme the editor was in.\n *\n * So `color` is the light value AND the fallback; a host that sets no variables\n * gets exactly the palette it got before.\n */\n\nimport { tags, type Tag } from \"@lezer/highlight\";\n\nexport interface CodeStyleSpec {\n tag: Tag | readonly Tag[];\n /** Literal colour: the light value, the `var()` fallback, and what the\n * clipboard uses verbatim. */\n color: string;\n /** Custom property a host can set to restyle this role. */\n cssVar: string;\n fontStyle?: string;\n}\n\nexport const CODE_PALETTE: readonly CodeStyleSpec[] = [\n {\n tag: [tags.keyword, tags.modifier, tags.operatorKeyword],\n color: \"#a626a4\",\n cssVar: \"--md-code-keyword\",\n },\n {\n tag: [tags.string, tags.special(tags.string)],\n color: \"#50a14f\",\n cssVar: \"--md-code-string\",\n },\n {\n tag: tags.comment,\n color: \"#a0a1a7\",\n cssVar: \"--md-code-comment\",\n fontStyle: \"italic\",\n },\n {\n tag: [tags.number, tags.bool, tags.null, tags.atom],\n color: \"#986801\",\n cssVar: \"--md-code-literal\",\n },\n {\n tag: [tags.function(tags.variableName), tags.function(tags.propertyName)],\n color: \"#4078f2\",\n cssVar: \"--md-code-function\",\n },\n {\n tag: [tags.typeName, tags.className, tags.namespace],\n color: \"#c18401\",\n cssVar: \"--md-code-type\",\n },\n {\n tag: tags.definition(tags.variableName),\n color: \"#e45649\",\n cssVar: \"--md-code-variable\",\n },\n { tag: tags.propertyName, color: \"#4078f2\", cssVar: \"--md-code-property\" },\n { tag: [tags.tagName, tags.self], color: \"#e45649\", cssVar: \"--md-code-tag\" },\n { tag: tags.attributeName, color: \"#986801\", cssVar: \"--md-code-attribute\" },\n { tag: [tags.regexp, tags.escape], color: \"#0184bc\", cssVar: \"--md-code-regexp\" },\n { tag: tags.invalid, color: \"#ca1243\", cssVar: \"--md-code-invalid\" },\n];\n\n/** What the editor paints with: themeable, falling back to the light value. */\nexport function themedColor(spec: CodeStyleSpec): string {\n return `var(${spec.cssVar}, ${spec.color})`;\n}\n"],"mappings":";AAuBA,SAAS,YAAsB;AAYxB,MAAM,eAAyC;AAAA,EACpD;AAAA,IACE,KAAK,CAAC,KAAK,SAAS,KAAK,UAAU,KAAK,eAAe;AAAA,IACvD,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,KAAK,CAAC,KAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM,CAAC;AAAA,IAC5C,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,KAAK,KAAK;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,KAAK,CAAC,KAAK,QAAQ,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI;AAAA,IAClD,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,KAAK,CAAC,KAAK,SAAS,KAAK,YAAY,GAAG,KAAK,SAAS,KAAK,YAAY,CAAC;AAAA,IACxE,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,KAAK,CAAC,KAAK,UAAU,KAAK,WAAW,KAAK,SAAS;AAAA,IACnD,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,KAAK,KAAK,WAAW,KAAK,YAAY;AAAA,IACtC,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,EAAE,KAAK,KAAK,cAAc,OAAO,WAAW,QAAQ,qBAAqB;AAAA,EACzE,EAAE,KAAK,CAAC,KAAK,SAAS,KAAK,IAAI,GAAG,OAAO,WAAW,QAAQ,gBAAgB;AAAA,EAC5E,EAAE,KAAK,KAAK,eAAe,OAAO,WAAW,QAAQ,sBAAsB;AAAA,EAC3E,EAAE,KAAK,CAAC,KAAK,QAAQ,KAAK,MAAM,GAAG,OAAO,WAAW,QAAQ,mBAAmB;AAAA,EAChF,EAAE,KAAK,KAAK,SAAS,OAAO,WAAW,QAAQ,oBAAoB;AACrE;AAGO,SAAS,YAAY,MAA6B;AACvD,SAAO,OAAO,KAAK,MAAM,KAAK,KAAK,KAAK;AAC1C;","names":[]}
@@ -0,0 +1,30 @@
1
+ import * as _codemirror_state from '@codemirror/state';
2
+ import { EditorState } from '@codemirror/state';
3
+ import { Command } from '@codemirror/view';
4
+
5
+ /** The FencedCode syntax node, as a structural stand-in (`@lezer/common` stays
6
+ * a transitive dep). Exported because `fenceAt` returns it. */
7
+ type FenceNode = {
8
+ readonly name: string;
9
+ readonly from: number;
10
+ readonly to: number;
11
+ readonly parent: FenceNode | null;
12
+ getChildren(type: string): readonly FenceNode[];
13
+ };
14
+ /** The keystroke that completes a ```/~~~ opener at a line's content start
15
+ * closes the fence below, before the unclosed state can swallow the rest of
16
+ * the document; a keystroke on a closed fence's closing line re-sites onto a
17
+ * fresh content line (§12.7). */
18
+ declare const fenceTypeAutoClose: _codemirror_state.Extension;
19
+ /** The FencedCode ancestor at `pos`, or null.
20
+ *
21
+ * Resolves from {@link treeAt}, not `syntaxTree`: a tree that stops short of
22
+ * `pos` reports it as bare `Document`, and the delete guards then merge a code
23
+ * block into the prose above it. */
24
+ declare function fenceAt(state: EditorState, pos: number): FenceNode | null;
25
+ declare const fenceAutoClose: Command;
26
+ /** Enter on the block's empty last content line exits below the fence. */
27
+ declare const fenceExitBlock: Command;
28
+ declare const fenceAutoCloseKeymap: _codemirror_state.Extension;
29
+
30
+ export { type FenceNode, fenceAt, fenceAutoClose, fenceAutoCloseKeymap, fenceExitBlock, fenceTypeAutoClose };
@@ -0,0 +1,171 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { EditorSelection, EditorState, Prec } from "@codemirror/state";
3
+ import { keymap } from "@codemirror/view";
4
+ import { lineStructure } from "../core/lineStructure.js";
5
+ import { treeAt } from "../core/treeAt.js";
6
+ function containerPrefix(text) {
7
+ return [...text].map((c) => c === ">" ? ">" : " ").join("");
8
+ }
9
+ function resiteFenceLineTyping(tr, from, text) {
10
+ const state = tr.startState;
11
+ let node = fenceAt(state, from);
12
+ if (!node) {
13
+ const line = state.doc.lineAt(from);
14
+ if (from !== line.from || line.to === line.from) return null;
15
+ const probed = fenceAt(state, line.to);
16
+ if (!probed || state.doc.lineAt(probed.from).from !== line.from) return null;
17
+ node = probed;
18
+ }
19
+ const marks = node.getChildren("CodeMark");
20
+ if (marks.length < 2) return null;
21
+ const openerLine = state.doc.lineAt(node.from);
22
+ const closer = marks[marks.length - 1];
23
+ const closerLine = state.doc.lineAt(closer.from);
24
+ if (from >= openerLine.from && from <= openerLine.to) {
25
+ const bodyIsEmpty = closerLine.number - openerLine.number < 2 || state.doc.sliceString(openerLine.to, closerLine.from).split("\n").every((lineText) => /^[>\s]*$/.test(lineText));
26
+ if (bodyIsEmpty && from >= marks[0].to && from <= openerLine.to && text !== "`" && text !== "~") {
27
+ return null;
28
+ }
29
+ if (openerLine.to + 1 <= closerLine.from - 1) {
30
+ const contentStart = openerLine.to + 1;
31
+ return {
32
+ changes: { from: contentStart, insert: text },
33
+ selection: EditorSelection.cursor(contentStart + text.length),
34
+ userEvent: "input.type"
35
+ };
36
+ }
37
+ const prefix2 = containerPrefix(state.doc.sliceString(openerLine.from, node.from));
38
+ const insert2 = `${state.lineBreak}${prefix2}${text}`;
39
+ return {
40
+ changes: { from: openerLine.to, insert: insert2 },
41
+ selection: EditorSelection.cursor(openerLine.to + insert2.length),
42
+ userEvent: "input.type"
43
+ };
44
+ }
45
+ if (from < closerLine.from || from > closerLine.to) return null;
46
+ const prefix = containerPrefix(state.doc.sliceString(closerLine.from, closer.from));
47
+ const insert = `${state.lineBreak}${prefix}${text}`;
48
+ const at = closerLine.from - 1;
49
+ return {
50
+ changes: { from: at, insert },
51
+ selection: EditorSelection.cursor(at + insert.length),
52
+ userEvent: "input.type"
53
+ };
54
+ }
55
+ const fenceTypeAutoClose = EditorState.transactionFilter.of((tr) => {
56
+ if (!tr.docChanged || !tr.isUserEvent("input.type") || tr.isUserEvent("input.type.compose")) {
57
+ return tr;
58
+ }
59
+ let single = null;
60
+ let eligible = true;
61
+ tr.changes.iterChanges((fromA, toA, _fromB, _toB, inserted) => {
62
+ const ch = inserted.toString();
63
+ if (single || fromA !== toA || ch.includes("\n")) eligible = false;
64
+ else single = { from: fromA, ch };
65
+ });
66
+ if (!eligible || !single) return tr;
67
+ const resited = resiteFenceLineTyping(tr, single.from, single.ch);
68
+ if (resited) return [resited];
69
+ const { ch: typed } = single;
70
+ if (typed !== "`" && typed !== "~") return tr;
71
+ const { from } = single;
72
+ const oldLine = tr.startState.doc.lineAt(from);
73
+ const info = lineStructure(tr.startState, oldLine);
74
+ if (info.inCode) return tr;
75
+ const contentStart = info.list ? info.list.markTo : info.contentFrom;
76
+ const newLine = tr.newDoc.lineAt(from + 1);
77
+ const content = tr.newDoc.sliceString(contentStart, newLine.to);
78
+ if (!/^(`{3,}|~{3,})$/.test(content) || from + 1 !== newLine.to) return tr;
79
+ const prefix = containerPrefix(tr.newDoc.sliceString(newLine.from, contentStart));
80
+ const brk = tr.startState.lineBreak;
81
+ return [
82
+ tr,
83
+ {
84
+ changes: { from: newLine.to, insert: `${brk}${prefix}${brk}${prefix}${content}` },
85
+ // The caret STAYS at the end of the opener: typing continues the
86
+ // language tag (```mermaid), Enter steps into the body (§12.5).
87
+ selection: EditorSelection.cursor(newLine.to),
88
+ sequential: true
89
+ }
90
+ ];
91
+ });
92
+ function fenceAt(state, pos) {
93
+ let node = treeAt(state, pos).resolveInner(pos, -1);
94
+ while (node && node.name !== "FencedCode") node = node.parent;
95
+ return node;
96
+ }
97
+ const fenceAutoClose = (view) => {
98
+ const { state } = view;
99
+ const { main } = state.selection;
100
+ if (!main.empty) return false;
101
+ const line = state.doc.lineAt(main.head);
102
+ if (main.head !== line.to) return false;
103
+ const node = fenceAt(state, main.head);
104
+ if (!node || node.from < line.from) return false;
105
+ const marks = node.getChildren("CodeMark");
106
+ const open = marks[0];
107
+ if (!open) return false;
108
+ if (marks.length >= 2) {
109
+ if (line.to < state.doc.length) {
110
+ const next = state.doc.lineAt(line.to + 1);
111
+ const closerLine = state.doc.lineAt(marks[marks.length - 1].from);
112
+ if (next.number < closerLine.number && /^[>\s]*$/.test(next.text)) {
113
+ view.dispatch({
114
+ selection: EditorSelection.cursor(next.to),
115
+ scrollIntoView: true,
116
+ userEvent: "select"
117
+ });
118
+ return true;
119
+ }
120
+ }
121
+ return false;
122
+ }
123
+ const fence = state.sliceDoc(open.from, open.to);
124
+ const indent = state.sliceDoc(line.from, open.from);
125
+ view.dispatch({
126
+ changes: { from: line.to, insert: `${state.lineBreak}${state.lineBreak}${indent}${fence}` },
127
+ selection: EditorSelection.cursor(line.to + state.lineBreak.length),
128
+ scrollIntoView: true,
129
+ userEvent: "input"
130
+ });
131
+ return true;
132
+ };
133
+ const fenceExitBlock = (view) => {
134
+ const { state } = view;
135
+ const { main } = state.selection;
136
+ if (!main.empty) return false;
137
+ const line = state.doc.lineAt(main.head);
138
+ if (line.from !== line.to) return false;
139
+ const node = fenceAt(state, main.head);
140
+ if (!node || node.from >= line.from) return false;
141
+ const marks = node.getChildren("CodeMark");
142
+ if (marks.length < 2) return false;
143
+ const closing = marks[marks.length - 1];
144
+ if (state.doc.lineAt(closing.from).number !== line.number + 1) return false;
145
+ const docLen = state.doc.length;
146
+ const changes = [{ from: line.from - 1, to: line.to, insert: "" }];
147
+ if (node.to === docLen) changes.push({ from: docLen, insert: state.lineBreak });
148
+ const removed = line.to - line.from + 1;
149
+ view.dispatch({
150
+ changes,
151
+ // Just past the (shifted) closing fence's newline — the line below.
152
+ selection: EditorSelection.cursor(node.to - removed + 1),
153
+ scrollIntoView: true,
154
+ userEvent: "input"
155
+ });
156
+ return true;
157
+ };
158
+ const fenceAutoCloseKeymap = Prec.highest(
159
+ keymap.of([
160
+ { key: "Enter", run: fenceAutoClose },
161
+ { key: "Enter", run: fenceExitBlock }
162
+ ])
163
+ );
164
+ export {
165
+ fenceAt,
166
+ fenceAutoClose,
167
+ fenceAutoCloseKeymap,
168
+ fenceExitBlock,
169
+ fenceTypeAutoClose
170
+ };
171
+ //# sourceMappingURL=fenceAutoClose.js.map