@latentic/live-markdown 0.3.1 → 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 +27 -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 -5996
  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,518 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { history, historyKeymap } from "@codemirror/commands";
3
+ import { markdown, markdownLanguage } from "@codemirror/lang-markdown";
4
+ import { ensureSyntaxTree } from "@codemirror/language";
5
+ import { EditorState } from "@codemirror/state";
6
+ import { EditorView, keymap } from "@codemirror/view";
7
+ import { defineSteps } from "@amiceli/vitest-cucumber";
8
+ import { userEvent } from "@vitest/browser/context";
9
+ import { expect, vi } from "vitest";
10
+ import { drawnCaret } from "../caretLayer.js";
11
+ import { cellAt, rowCount } from "../table/tableCellNav.js";
12
+ import {
13
+ addColumnAfter,
14
+ addRowBelow,
15
+ deleteColumn,
16
+ deleteRow,
17
+ deleteTable
18
+ } from "../table/tableEditCommands.js";
19
+ import { modelAt } from "../table/tableGeometry.js";
20
+ import { ZWSP } from "../features/blockCommandSteps.js";
21
+ import {
22
+ bridgeKey
23
+ } from "./bridgeRules.js";
24
+ import { cellElement, cellRange } from "./cellEditingSurface.js";
25
+ import { InlineCellSurface } from "./inlineCellSurface.js";
26
+ import { SELECTED_CLASS, columnRect, refsIn } from "./tableV2Selection.js";
27
+ import { tableV2 } from "./tableWidgetV2.js";
28
+ import { tableV2Interaction } from "./tableV2Interaction.js";
29
+ import { modChord } from "../core/testKeys.js";
30
+ let ctx = null;
31
+ function cleanupTableSteps() {
32
+ ctx?.surface.cancel();
33
+ ctx?.view.destroy();
34
+ ctx = null;
35
+ document.querySelectorAll(".cm-table-menu").forEach((el) => el.remove());
36
+ }
37
+ const need = () => {
38
+ if (!ctx) throw new Error("Background did not run");
39
+ return ctx;
40
+ };
41
+ function stripGuards(block) {
42
+ return block.split(ZWSP).join("").replace(/\n$/, "");
43
+ }
44
+ const tf = () => need().view.state.doc.toString().indexOf("| Name");
45
+ function model() {
46
+ const m = modelAt(need().view.state, tf());
47
+ if (!m) throw new Error("table not parsed");
48
+ return m;
49
+ }
50
+ function refByText(text) {
51
+ const m = model();
52
+ const { view } = need();
53
+ for (let row = 0; row < rowCount(m); row++) {
54
+ for (let col = 0; col < m.data.header.length; col++) {
55
+ const cell = cellAt(m, row, col);
56
+ if (cell && view.state.sliceDoc(cell.from, cell.to) === text) return { row, col };
57
+ }
58
+ }
59
+ throw new Error(`no cell with text "${text}"`);
60
+ }
61
+ function tdOf(ref) {
62
+ const el = cellElement(need().view, tf(), ref);
63
+ if (!el) throw new Error(`cell ${ref.row},${ref.col} not rendered`);
64
+ return el;
65
+ }
66
+ function mouse(type, el, at) {
67
+ const rect = el.getBoundingClientRect();
68
+ el.dispatchEvent(
69
+ new MouseEvent(type, {
70
+ bubbles: true,
71
+ cancelable: true,
72
+ button: 0,
73
+ clientX: at?.x ?? rect.left + rect.width / 2,
74
+ clientY: at?.y ?? rect.top + rect.height / 2
75
+ })
76
+ );
77
+ }
78
+ const clickCell = (ref) => {
79
+ const el = tdOf(ref);
80
+ mouse("mousedown", el);
81
+ mouse("mouseup", el);
82
+ };
83
+ async function press(name) {
84
+ const map = {
85
+ ArrowDown: "{ArrowDown}",
86
+ ArrowUp: "{ArrowUp}",
87
+ ArrowRight: "{ArrowRight}",
88
+ ArrowLeft: "{ArrowLeft}",
89
+ Tab: "{Tab}",
90
+ "Shift-Tab": "{Shift>}{Tab}{/Shift}",
91
+ Backspace: "{Backspace}",
92
+ Enter: "{Enter}",
93
+ "Mod-z": modChord("z")
94
+ };
95
+ const seq = map[name];
96
+ if (!seq) throw new Error(`no key mapping for "${name}"`);
97
+ await userEvent.keyboard(seq);
98
+ }
99
+ const COMMANDS = {
100
+ "add row below": addRowBelow,
101
+ "add column after": addColumnAfter,
102
+ "delete row": deleteRow,
103
+ "delete column": deleteColumn,
104
+ "delete table": deleteTable
105
+ };
106
+ function dragSelect(from, to) {
107
+ mouse("mousedown", tdOf(from));
108
+ mouse("mousemove", tdOf(to));
109
+ mouse("mouseup", tdOf(to));
110
+ }
111
+ const selectedEls = () => need().view.dom.querySelectorAll(`.${SELECTED_CLASS}`);
112
+ function defineTableSteps() {
113
+ defineSteps(({ Given, When, Then, And }) => {
114
+ Given("a document with prose around this table:", async (_c, table) => {
115
+ cleanupTableSteps();
116
+ const doc = `intro prose
117
+
118
+ ${stripGuards(table)}
119
+
120
+ outro prose`;
121
+ const surface = new InlineCellSurface();
122
+ const state = EditorState.create({
123
+ doc,
124
+ extensions: [
125
+ history(),
126
+ keymap.of(historyKeymap),
127
+ drawnCaret,
128
+ markdown({ base: markdownLanguage }),
129
+ tableV2(surface),
130
+ tableV2Interaction(surface)
131
+ ]
132
+ });
133
+ ensureSyntaxTree(state, doc.length, 5e3);
134
+ const view = new EditorView({ state, parent: document.body });
135
+ ctx = {
136
+ view,
137
+ surface,
138
+ backgroundDoc: doc,
139
+ savedMainHead: view.state.selection.main.head,
140
+ layerHiddenDuringEdits: true,
141
+ bridgeInput: null,
142
+ bridgeAction: null,
143
+ selectionSet: null,
144
+ copied: null
145
+ };
146
+ await vi.waitFor(() => {
147
+ if (!view.dom.querySelector("[data-tablev2-from]")) throw new Error("widget pending");
148
+ });
149
+ });
150
+ Given("the caret is on the line directly above the table", () => {
151
+ const { view } = need();
152
+ view.focus();
153
+ view.dispatch({ selection: { anchor: tf() - 1 } });
154
+ });
155
+ Given("the caret is in the {string} cell", (_c, text) => {
156
+ const { surface, view } = need();
157
+ expect(surface.begin(view, tf(), refByText(text), 0)).toBe(true);
158
+ });
159
+ Given(
160
+ "the caret is in the {string} cell at offset {int}",
161
+ (_c, text, offset) => {
162
+ const { surface, view } = need();
163
+ expect(surface.begin(view, tf(), refByText(text), offset)).toBe(true);
164
+ }
165
+ );
166
+ Given("the main caret is parked in the prose above the table", () => {
167
+ const { view } = need();
168
+ view.dispatch({ selection: { anchor: 2 } });
169
+ need().savedMainHead = 2;
170
+ });
171
+ When("I press {string}", async (_c, name) => {
172
+ if (name === "Mod-z" && !need().surface.active()) need().view.focus();
173
+ await press(name);
174
+ });
175
+ Then("the caret is inside the {string} cell", (_c, text) => {
176
+ const { surface } = need();
177
+ expect(surface.active()?.ref).toEqual(refByText(text));
178
+ expect(document.activeElement).toBe(surface.editingElement());
179
+ });
180
+ Then(
181
+ "the caret is in the {string} cell at offset {int}",
182
+ (_c, text, offset) => {
183
+ const { surface } = need();
184
+ expect(surface.active()?.ref).toEqual(refByText(text));
185
+ expect(surface.active()?.caret).toBe(offset);
186
+ }
187
+ );
188
+ Then("the caret is in the main document directly below the table", () => {
189
+ const { surface, view } = need();
190
+ expect(surface.active()).toBeNull();
191
+ expect(view.state.selection.main.head).toBe(model().to + 1);
192
+ });
193
+ Then("the caret is in the main document directly above the table", () => {
194
+ const { surface, view } = need();
195
+ expect(surface.active()).toBeNull();
196
+ expect(view.state.selection.main.head).toBe(model().from - 1);
197
+ });
198
+ When(
199
+ "I click between {string} and {string} in the {string} cell",
200
+ (_c, before, _after, text) => {
201
+ const el = tdOf(refByText(text));
202
+ const textNode = el.firstChild;
203
+ if (!textNode) throw new Error("cell has no text");
204
+ const probe = document.createRange();
205
+ probe.setStart(textNode, before.length);
206
+ probe.setEnd(textNode, before.length + 1);
207
+ const rect = probe.getBoundingClientRect();
208
+ const at = { x: rect.left + Math.min(2, rect.width / 4), y: rect.top + rect.height / 2 };
209
+ mouse("mousedown", el, at);
210
+ mouse("mouseup", el, at);
211
+ }
212
+ );
213
+ And("typing {string} produces {string} in that cell", async (_c, ch, out) => {
214
+ await userEvent.keyboard(ch);
215
+ expect(need().surface.active()?.text).toBe(out);
216
+ });
217
+ Given("the table has an empty row", async () => {
218
+ const { view } = need();
219
+ const pos = cellRange(view.state, tf(), refByText("Lin")).from;
220
+ view.dispatch({ changes: addRowBelow(view.state, pos), userEvent: "input.table.structure" });
221
+ await vi.waitFor(() => {
222
+ if (!cellElement(view, tf(), { row: 3, col: 0 })) throw new Error("row pending");
223
+ });
224
+ need().savedMainHead = view.state.selection.main.head;
225
+ });
226
+ When("I click the empty row's first cell", () => {
227
+ clickCell({ row: 3, col: 0 });
228
+ });
229
+ Then("that cell has focus and a visible caret", () => {
230
+ const el = need().surface.editingElement();
231
+ expect(el).not.toBeNull();
232
+ expect(document.activeElement).toBe(el);
233
+ const color = getComputedStyle(el).caretColor;
234
+ expect(color).not.toBe("transparent");
235
+ expect(color).not.toBe("rgba(0, 0, 0, 0)");
236
+ });
237
+ And("the main editor selection did not move", () => {
238
+ expect(need().view.state.selection.main.head).toBe(need().savedMainHead);
239
+ });
240
+ When("I click each body cell of the table in turn", () => {
241
+ const c = need();
242
+ for (const ref of [
243
+ { row: 1, col: 0 },
244
+ { row: 1, col: 1 },
245
+ { row: 2, col: 0 },
246
+ { row: 2, col: 1 }
247
+ ]) {
248
+ clickCell(ref);
249
+ const layer = c.view.dom.querySelector(".cm-cursorLayer");
250
+ if (layer && getComputedStyle(layer).display !== "none") {
251
+ c.layerHiddenDuringEdits = false;
252
+ }
253
+ }
254
+ });
255
+ Then("the main editor selection never changes", () => {
256
+ expect(need().view.state.selection.main.head).toBe(need().savedMainHead);
257
+ });
258
+ And("the drawn caret stays hidden while a cell is edited", () => {
259
+ expect(need().layerHiddenDuringEdits).toBe(true);
260
+ });
261
+ Given(
262
+ "the bridge state is row {int}, column {int}, offset {int}, length {int}",
263
+ (_c, row, col, offset, length) => {
264
+ need().bridgeInput = {
265
+ rows: 3,
266
+ cols: 2,
267
+ row,
268
+ col,
269
+ offset,
270
+ length,
271
+ onFirstVisualLine: true,
272
+ onLastVisualLine: true
273
+ };
274
+ }
275
+ );
276
+ When("the bridge receives {string}", (_c, key) => {
277
+ const c = need();
278
+ c.bridgeAction = bridgeKey(c.bridgeInput, key);
279
+ });
280
+ Then(
281
+ "the bridge targets row {int}, column {int} at the start",
282
+ (_c, row, col) => {
283
+ expect(need().bridgeAction).toEqual({ kind: "focusCell", row, col, caret: "start" });
284
+ }
285
+ );
286
+ Then(
287
+ "the bridge targets row {int}, column {int} at the end",
288
+ (_c, row, col) => {
289
+ expect(need().bridgeAction).toEqual({ kind: "focusCell", row, col, caret: "end" });
290
+ }
291
+ );
292
+ When(
293
+ "the {string} command runs from the {string} cell",
294
+ (_c, name, text) => {
295
+ const { view } = need();
296
+ const command = COMMANDS[name];
297
+ if (!command) throw new Error(`no command "${name}"`);
298
+ const pos = cellRange(view.state, tf(), refByText(text)).from;
299
+ const change = command(view.state, pos);
300
+ expect(change).not.toBeNull();
301
+ view.dispatch({ changes: change, userEvent: "input.table.structure" });
302
+ }
303
+ );
304
+ Then("the table has {int} body rows", (_c, n) => {
305
+ expect(model().data.rows).toHaveLength(n);
306
+ });
307
+ And("every cell of body row {int} is empty", (_c, row) => {
308
+ const { view } = need();
309
+ for (const cell of model().data.rows[row - 1]) {
310
+ expect(view.state.sliceDoc(cell.from, cell.to).trim()).toBe("");
311
+ }
312
+ });
313
+ Then("every row has {int} cells", (_c, n) => {
314
+ const m = model();
315
+ expect(m.data.header).toHaveLength(n);
316
+ for (const row of m.data.rows) expect(row).toHaveLength(n);
317
+ });
318
+ Then("every row has {int} cell", (_c, n) => {
319
+ const m = model();
320
+ expect(m.data.header).toHaveLength(n);
321
+ for (const row of m.data.rows) expect(row).toHaveLength(n);
322
+ });
323
+ And("the delimiter row gains one {string} cell", (_c, dashes) => {
324
+ const { view } = need();
325
+ const headerLine = view.state.doc.lineAt(model().from);
326
+ const delimiter = view.state.doc.line(headerLine.number + 1);
327
+ const cells = delimiter.text.split("|").map((s) => s.trim()).filter(Boolean);
328
+ expect(cells).toHaveLength(3);
329
+ for (const cell of cells) expect(cell).toContain(dashes);
330
+ });
331
+ Then(
332
+ "the table has {int} body row and it contains {string}",
333
+ (_c, n, text) => {
334
+ const { view } = need();
335
+ const m = model();
336
+ expect(m.data.rows).toHaveLength(n);
337
+ const texts = m.data.rows[0].map((c) => view.state.sliceDoc(c.from, c.to));
338
+ expect(texts).toContain(text);
339
+ }
340
+ );
341
+ And("no cell contains {string}", (_c, text) => {
342
+ expect(need().view.state.doc.toString()).not.toContain(text);
343
+ });
344
+ Then("the table's source lines are gone", () => {
345
+ const doc = need().view.state.doc.toString();
346
+ expect(doc).not.toContain("|");
347
+ expect(doc).not.toContain("---");
348
+ });
349
+ And("the surrounding prose is untouched", () => {
350
+ const doc = need().view.state.doc.toString();
351
+ expect(doc).toContain("intro prose");
352
+ expect(doc).toContain("outro prose");
353
+ });
354
+ When(
355
+ "I press the mouse in the {string} cell and release in the {string} cell",
356
+ (_c, a, b) => {
357
+ dragSelect(refByText(a), refByText(b));
358
+ }
359
+ );
360
+ Then(
361
+ "cells {int},{int} through {int},{int} render as selected",
362
+ (_c, r0, c0, r1, c1) => {
363
+ expect(selectedEls()).toHaveLength((r1 - r0 + 1) * (c1 - c0 + 1));
364
+ for (let row = r0; row <= r1; row++) {
365
+ for (let col = c0; col <= c1; col++) {
366
+ expect(tdOf({ row, col }).classList.contains(SELECTED_CLASS)).toBe(true);
367
+ }
368
+ }
369
+ }
370
+ );
371
+ And("the native text selection is empty", () => {
372
+ expect(document.getSelection()?.isCollapsed ?? true).toBe(true);
373
+ });
374
+ Given(
375
+ "cells {int},{int} through {int},{int} are selected",
376
+ (_c, r0, c0, r1, c1) => {
377
+ dragSelect({ row: r0, col: c0 }, { row: r1, col: c1 });
378
+ expect(selectedEls().length).toBeGreaterThan(0);
379
+ }
380
+ );
381
+ When("I copy", () => {
382
+ const dt = new DataTransfer();
383
+ const event = new ClipboardEvent("copy", { clipboardData: dt, bubbles: true, cancelable: true });
384
+ document.dispatchEvent(event);
385
+ need().copied = dt.getData("text/plain");
386
+ });
387
+ Then("the clipboard contains the selected cells as TSV", () => {
388
+ expect(need().copied).toBe("Ada Engineer\nLin Designer");
389
+ });
390
+ When("column {int} of a {int}-row grid is selected", (_c, col, rows) => {
391
+ need().selectionSet = refsIn(columnRect(rows, col));
392
+ });
393
+ Then(
394
+ "the selection set is cells {int},{int} and {int},{int} and {int},{int}",
395
+ (_c, ...nums) => {
396
+ const expected = [];
397
+ for (let i = 0; i < 6; i += 2) expected.push({ row: nums[i], col: nums[i + 1] });
398
+ expect(need().selectionSet).toEqual(expected);
399
+ }
400
+ );
401
+ When("I right-click the {string} cell", (_c, text) => {
402
+ const el = tdOf(refByText(text));
403
+ const rect = el.getBoundingClientRect();
404
+ el.dispatchEvent(
405
+ new MouseEvent("contextmenu", {
406
+ bubbles: true,
407
+ cancelable: true,
408
+ clientX: rect.left + rect.width / 2,
409
+ clientY: rect.top + rect.height / 2
410
+ })
411
+ );
412
+ });
413
+ Then("the table menu opens", () => {
414
+ expect(document.querySelector(".cm-table-menu")).not.toBeNull();
415
+ });
416
+ And("I choose {string} from the table menu", (_c, label) => {
417
+ const item = Array.from(document.querySelectorAll(".cm-table-menu button")).find(
418
+ (b) => b.textContent === label
419
+ );
420
+ if (!item) throw new Error(`no menu item "${label}"`);
421
+ item.dispatchEvent(new MouseEvent("click", { bubbles: true }));
422
+ });
423
+ Then("{int} cells render as selected", (_c, n) => {
424
+ expect(selectedEls()).toHaveLength(n);
425
+ });
426
+ And(
427
+ "choosing {string} inserts a row after the {string} row",
428
+ async (_c, label, rowText) => {
429
+ const item = Array.from(document.querySelectorAll(".cm-table-menu button")).find(
430
+ (b) => b.textContent === label
431
+ );
432
+ if (!item) throw new Error(`no menu item "${label}"`);
433
+ item.dispatchEvent(new MouseEvent("click", { bubbles: true }));
434
+ await vi.waitFor(() => {
435
+ if (model().data.rows.length !== 3) throw new Error("row pending");
436
+ });
437
+ const { view } = need();
438
+ const rows = model().data.rows;
439
+ expect(rows[1].map((c) => view.state.sliceDoc(c.from, c.to))).toContain(rowText);
440
+ for (const cell of rows[2]) {
441
+ expect(view.state.sliceDoc(cell.from, cell.to).trim()).toBe("");
442
+ }
443
+ }
444
+ );
445
+ Then("the {string} cell now contains {string}", (_c, _cell, out) => {
446
+ expect(need().surface.active()?.text).toBe(out);
447
+ });
448
+ And("the table structure is unchanged", () => {
449
+ expect(need().view.state.doc.toString()).toBe(need().backgroundDoc);
450
+ });
451
+ Given(
452
+ "I am typing {string} at the end of the {string} cell",
453
+ async (_c, typed, text) => {
454
+ const { surface, view } = need();
455
+ expect(surface.begin(view, tf(), refByText(text), Number.MAX_SAFE_INTEGER)).toBe(true);
456
+ await userEvent.keyboard(typed);
457
+ }
458
+ );
459
+ When("an unrelated document change forces the table widget to update", () => {
460
+ const { view } = need();
461
+ view.dispatch({ changes: { from: 0, insert: "X" } });
462
+ });
463
+ Then("my in-progress text and caret survive", () => {
464
+ const { surface } = need();
465
+ expect(surface.active()?.text).toBe("AdaQ");
466
+ expect(surface.active()?.caret).toBe(4);
467
+ expect(document.activeElement).toBe(surface.editingElement());
468
+ });
469
+ And("further typing still lands at the caret", async () => {
470
+ await userEvent.keyboard("!");
471
+ expect(need().surface.active()?.text).toBe("AdaQ!");
472
+ });
473
+ When(
474
+ "the document changes {string} to {string} externally",
475
+ (_c, from, to) => {
476
+ const { view } = need();
477
+ const at = view.state.doc.toString().indexOf(from);
478
+ view.dispatch({ changes: { from: at, to: at + from.length, insert: to } });
479
+ }
480
+ );
481
+ Then(
482
+ "committing my edit produces a table containing both {string} and {string}",
483
+ (_c, a, b) => {
484
+ const { surface, view } = need();
485
+ surface.commit(view);
486
+ const doc = view.state.doc.toString();
487
+ expect(doc).toContain(a);
488
+ expect(doc).toContain(b);
489
+ }
490
+ );
491
+ Given(
492
+ "I typed {string} into the {string} cell and committed",
493
+ async (_c, typed, text) => {
494
+ const { surface, view } = need();
495
+ surface.begin(view, tf(), refByText(text), Number.MAX_SAFE_INTEGER);
496
+ await userEvent.keyboard(typed);
497
+ surface.commit(view);
498
+ expect(view.state.doc.toString()).toContain(text + typed);
499
+ }
500
+ );
501
+ Then("the table source shows {string} again", (_c, text) => {
502
+ const { view } = need();
503
+ const cell = cellRange(view.state, tf(), refByText(text));
504
+ expect(cell).not.toBeNull();
505
+ expect(view.state.sliceDoc(cell.from, cell.to)).toBe(text);
506
+ });
507
+ And("redo restores the committed edit", async () => {
508
+ need().view.focus();
509
+ await userEvent.keyboard(modChord("{Shift>}z{/Shift}"));
510
+ expect(need().view.state.doc.toString()).toContain("AdaX");
511
+ });
512
+ });
513
+ }
514
+ export {
515
+ cleanupTableSteps,
516
+ defineTableSteps
517
+ };
518
+ //# sourceMappingURL=tableEditingSteps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/tablev2/tableEditingSteps.ts"],"sourcesContent":["/**\n * Step definitions for features/browser/table-editing.feature — the ADR 0001\n * interaction contract, executed against the REAL tablev2 stack in WebKit.\n *\n * Registered once as a shared pool (defineSteps); every scenario draws the\n * steps it needs, so the feature file stays the single source of truth.\n * Scenario-scoped state lives in `ctx`, reset by the Background step.\n */\n\nimport { history, historyKeymap } from \"@codemirror/commands\";\nimport { markdown, markdownLanguage } from \"@codemirror/lang-markdown\";\nimport { ensureSyntaxTree } from \"@codemirror/language\";\nimport { EditorState } from \"@codemirror/state\";\nimport { EditorView, keymap } from \"@codemirror/view\";\nimport { defineSteps } from \"@amiceli/vitest-cucumber\";\nimport { userEvent } from \"@vitest/browser/context\";\nimport { expect, vi } from \"vitest\";\n\nimport { drawnCaret } from \"../caretLayer\";\nimport { cellAt, rowCount } from \"../table/tableCellNav\";\nimport {\n addColumnAfter,\n addRowBelow,\n deleteColumn,\n deleteRow,\n deleteTable,\n} from \"../table/tableEditCommands\";\nimport { modelAt } from \"../table/tableGeometry\";\nimport { ZWSP } from \"../features/blockCommandSteps\";\nimport {\n type BridgeAction,\n type BridgeInput,\n type BridgeKey,\n bridgeKey,\n} from \"./bridgeRules\";\nimport { type CellRef, cellElement, cellRange } from \"./cellEditingSurface\";\nimport { InlineCellSurface } from \"./inlineCellSurface\";\nimport { SELECTED_CLASS, columnRect, refsIn } from \"./tableV2Selection\";\nimport { tableV2 } from \"./tableWidgetV2\";\nimport { tableV2Interaction } from \"./tableV2Interaction\";\nimport { modChord } from \"../core/testKeys\";\n\ninterface Ctx {\n view: EditorView;\n surface: InlineCellSurface;\n backgroundDoc: string;\n savedMainHead: number;\n layerHiddenDuringEdits: boolean;\n bridgeInput: BridgeInput | null;\n bridgeAction: BridgeAction | null;\n selectionSet: CellRef[] | null;\n copied: string | null;\n}\n\nlet ctx: Ctx | null = null;\n\nexport function cleanupTableSteps(): void {\n ctx?.surface.cancel();\n ctx?.view.destroy();\n ctx = null;\n document.querySelectorAll(\".cm-table-menu\").forEach((el) => el.remove());\n}\n\nconst need = (): Ctx => {\n if (!ctx) throw new Error(\"Background did not run\");\n return ctx;\n};\n\nfunction stripGuards(block: string): string {\n return block.split(ZWSP).join(\"\").replace(/\\n$/, \"\");\n}\n\nconst tf = (): number => need().view.state.doc.toString().indexOf(\"| Name\");\n\nfunction model() {\n const m = modelAt(need().view.state, tf());\n if (!m) throw new Error(\"table not parsed\");\n return m;\n}\n\n/** The (row, col) of the cell whose source text equals `text`. */\nfunction refByText(text: string): CellRef {\n const m = model();\n const { view } = need();\n for (let row = 0; row < rowCount(m); row++) {\n for (let col = 0; col < m.data.header.length; col++) {\n const cell = cellAt(m, row, col);\n if (cell && view.state.sliceDoc(cell.from, cell.to) === text) return { row, col };\n }\n }\n throw new Error(`no cell with text \"${text}\"`);\n}\n\nfunction tdOf(ref: CellRef): HTMLElement {\n const el = cellElement(need().view, tf(), ref);\n if (!el) throw new Error(`cell ${ref.row},${ref.col} not rendered`);\n return el;\n}\n\nfunction mouse(type: string, el: Element, at?: { x: number; y: number }): void {\n const rect = el.getBoundingClientRect();\n el.dispatchEvent(\n new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n button: 0,\n clientX: at?.x ?? rect.left + rect.width / 2,\n clientY: at?.y ?? rect.top + rect.height / 2,\n }),\n );\n}\n\nconst clickCell = (ref: CellRef): void => {\n const el = tdOf(ref);\n mouse(\"mousedown\", el);\n mouse(\"mouseup\", el);\n};\n\nasync function press(name: string): Promise<void> {\n const map: Record<string, string> = {\n ArrowDown: \"{ArrowDown}\",\n ArrowUp: \"{ArrowUp}\",\n ArrowRight: \"{ArrowRight}\",\n ArrowLeft: \"{ArrowLeft}\",\n Tab: \"{Tab}\",\n \"Shift-Tab\": \"{Shift>}{Tab}{/Shift}\",\n Backspace: \"{Backspace}\",\n Enter: \"{Enter}\",\n \"Mod-z\": modChord(\"z\"),\n };\n const seq = map[name];\n if (!seq) throw new Error(`no key mapping for \"${name}\"`);\n await userEvent.keyboard(seq);\n}\n\nconst COMMANDS = {\n \"add row below\": addRowBelow,\n \"add column after\": addColumnAfter,\n \"delete row\": deleteRow,\n \"delete column\": deleteColumn,\n \"delete table\": deleteTable,\n} as const;\n\nfunction dragSelect(from: CellRef, to: CellRef): void {\n mouse(\"mousedown\", tdOf(from));\n mouse(\"mousemove\", tdOf(to));\n mouse(\"mouseup\", tdOf(to));\n}\n\nconst selectedEls = () =>\n need().view.dom.querySelectorAll(`.${SELECTED_CLASS}`);\n\nexport function defineTableSteps(): void {\n defineSteps(({ Given, When, Then, And }) => {\n Given(\"a document with prose around this table:\", async (_c: unknown, table: string) => {\n cleanupTableSteps();\n const doc = `intro prose\\n\\n${stripGuards(table)}\\n\\noutro prose`;\n const surface = new InlineCellSurface();\n const state = EditorState.create({\n doc,\n extensions: [\n history(),\n keymap.of(historyKeymap),\n drawnCaret,\n markdown({ base: markdownLanguage }),\n tableV2(surface),\n tableV2Interaction(surface),\n ],\n });\n ensureSyntaxTree(state, doc.length, 5000);\n const view = new EditorView({ state, parent: document.body });\n ctx = {\n view,\n surface,\n backgroundDoc: doc,\n savedMainHead: view.state.selection.main.head,\n layerHiddenDuringEdits: true,\n bridgeInput: null,\n bridgeAction: null,\n selectionSet: null,\n copied: null,\n };\n await vi.waitFor(() => {\n if (!view.dom.querySelector(\"[data-tablev2-from]\")) throw new Error(\"widget pending\");\n });\n });\n\n // ── caret placement ──────────────────────────────────────────────\n Given(\"the caret is on the line directly above the table\", () => {\n const { view } = need();\n view.focus();\n view.dispatch({ selection: { anchor: tf() - 1 } });\n });\n Given(\"the caret is in the {string} cell\", (_c: unknown, text: string) => {\n const { surface, view } = need();\n expect(surface.begin(view, tf(), refByText(text), 0)).toBe(true);\n });\n Given(\n \"the caret is in the {string} cell at offset {int}\",\n (_c: unknown, text: string, offset: number) => {\n const { surface, view } = need();\n expect(surface.begin(view, tf(), refByText(text), offset)).toBe(true);\n },\n );\n Given(\"the main caret is parked in the prose above the table\", () => {\n const { view } = need();\n view.dispatch({ selection: { anchor: 2 } });\n need().savedMainHead = 2;\n });\n\n // ── key presses ──────────────────────────────────────────────────\n When(\"I press {string}\", async (_c: unknown, name: string) => {\n if (name === \"Mod-z\" && !need().surface.active()) need().view.focus();\n await press(name);\n });\n\n // ── caret assertions ─────────────────────────────────────────────\n Then(\"the caret is inside the {string} cell\", (_c: unknown, text: string) => {\n const { surface } = need();\n expect(surface.active()?.ref).toEqual(refByText(text));\n expect(document.activeElement).toBe(surface.editingElement());\n });\n Then(\n \"the caret is in the {string} cell at offset {int}\",\n (_c: unknown, text: string, offset: number) => {\n const { surface } = need();\n expect(surface.active()?.ref).toEqual(refByText(text));\n expect(surface.active()?.caret).toBe(offset);\n },\n );\n Then(\"the caret is in the main document directly below the table\", () => {\n const { surface, view } = need();\n expect(surface.active()).toBeNull();\n expect(view.state.selection.main.head).toBe(model().to + 1);\n });\n Then(\"the caret is in the main document directly above the table\", () => {\n const { surface, view } = need();\n expect(surface.active()).toBeNull();\n expect(view.state.selection.main.head).toBe(model().from - 1);\n });\n\n // ── clicking ─────────────────────────────────────────────────────\n When(\n \"I click between {string} and {string} in the {string} cell\",\n (_c: unknown, before: string, _after: string, text: string) => {\n const el = tdOf(refByText(text));\n const textNode = el.firstChild;\n if (!textNode) throw new Error(\"cell has no text\");\n const probe = document.createRange();\n probe.setStart(textNode, before.length);\n probe.setEnd(textNode, before.length + 1);\n const rect = probe.getBoundingClientRect();\n const at = { x: rect.left + Math.min(2, rect.width / 4), y: rect.top + rect.height / 2 };\n mouse(\"mousedown\", el, at);\n mouse(\"mouseup\", el, at);\n },\n );\n And(\"typing {string} produces {string} in that cell\", async (_c: unknown, ch: string, out: string) => {\n await userEvent.keyboard(ch);\n expect(need().surface.active()?.text).toBe(out);\n });\n\n Given(\"the table has an empty row\", async () => {\n const { view } = need();\n const pos = cellRange(view.state, tf(), refByText(\"Lin\"))!.from;\n view.dispatch({ changes: addRowBelow(view.state, pos)!, userEvent: \"input.table.structure\" });\n await vi.waitFor(() => {\n if (!cellElement(view, tf(), { row: 3, col: 0 })) throw new Error(\"row pending\");\n });\n need().savedMainHead = view.state.selection.main.head;\n });\n When(\"I click the empty row's first cell\", () => {\n clickCell({ row: 3, col: 0 });\n });\n Then(\"that cell has focus and a visible caret\", () => {\n const el = need().surface.editingElement();\n expect(el).not.toBeNull();\n expect(document.activeElement).toBe(el);\n const color = getComputedStyle(el!).caretColor;\n expect(color).not.toBe(\"transparent\");\n expect(color).not.toBe(\"rgba(0, 0, 0, 0)\");\n });\n And(\"the main editor selection did not move\", () => {\n expect(need().view.state.selection.main.head).toBe(need().savedMainHead);\n });\n\n When(\"I click each body cell of the table in turn\", () => {\n const c = need();\n for (const ref of [\n { row: 1, col: 0 },\n { row: 1, col: 1 },\n { row: 2, col: 0 },\n { row: 2, col: 1 },\n ]) {\n clickCell(ref);\n const layer = c.view.dom.querySelector<HTMLElement>(\".cm-cursorLayer\");\n if (layer && getComputedStyle(layer).display !== \"none\") {\n c.layerHiddenDuringEdits = false;\n }\n }\n });\n Then(\"the main editor selection never changes\", () => {\n expect(need().view.state.selection.main.head).toBe(need().savedMainHead);\n });\n And(\"the drawn caret stays hidden while a cell is edited\", () => {\n expect(need().layerHiddenDuringEdits).toBe(true);\n });\n\n // ── bridge (@pure) ───────────────────────────────────────────────\n Given(\n \"the bridge state is row {int}, column {int}, offset {int}, length {int}\",\n (_c: unknown, row: number, col: number, offset: number, length: number) => {\n need().bridgeInput = {\n rows: 3,\n cols: 2,\n row,\n col,\n offset,\n length,\n onFirstVisualLine: true,\n onLastVisualLine: true,\n };\n },\n );\n When(\"the bridge receives {string}\", (_c: unknown, key: string) => {\n const c = need();\n c.bridgeAction = bridgeKey(c.bridgeInput!, key as BridgeKey);\n });\n Then(\n \"the bridge targets row {int}, column {int} at the start\",\n (_c: unknown, row: number, col: number) => {\n expect(need().bridgeAction).toEqual({ kind: \"focusCell\", row, col, caret: \"start\" });\n },\n );\n Then(\n \"the bridge targets row {int}, column {int} at the end\",\n (_c: unknown, row: number, col: number) => {\n expect(need().bridgeAction).toEqual({ kind: \"focusCell\", row, col, caret: \"end\" });\n },\n );\n\n // ── structure commands (@pure) ───────────────────────────────────\n When(\n \"the {string} command runs from the {string} cell\",\n (_c: unknown, name: string, text: string) => {\n const { view } = need();\n const command = COMMANDS[name as keyof typeof COMMANDS];\n if (!command) throw new Error(`no command \"${name}\"`);\n const pos = cellRange(view.state, tf(), refByText(text))!.from;\n const change = command(view.state, pos);\n expect(change).not.toBeNull();\n view.dispatch({ changes: change!, userEvent: \"input.table.structure\" });\n },\n );\n Then(\"the table has {int} body rows\", (_c: unknown, n: number) => {\n expect(model().data.rows).toHaveLength(n);\n });\n And(\"every cell of body row {int} is empty\", (_c: unknown, row: number) => {\n // Body rows are 1-based in the feature's phrasing.\n const { view } = need();\n for (const cell of model().data.rows[row - 1]) {\n expect(view.state.sliceDoc(cell.from, cell.to).trim()).toBe(\"\");\n }\n });\n Then(\"every row has {int} cells\", (_c: unknown, n: number) => {\n const m = model();\n expect(m.data.header).toHaveLength(n);\n for (const row of m.data.rows) expect(row).toHaveLength(n);\n });\n Then(\"every row has {int} cell\", (_c: unknown, n: number) => {\n const m = model();\n expect(m.data.header).toHaveLength(n);\n for (const row of m.data.rows) expect(row).toHaveLength(n);\n });\n And(\"the delimiter row gains one {string} cell\", (_c: unknown, dashes: string) => {\n const { view } = need();\n const headerLine = view.state.doc.lineAt(model().from);\n const delimiter = view.state.doc.line(headerLine.number + 1);\n const cells = delimiter.text.split(\"|\").map((s) => s.trim()).filter(Boolean);\n expect(cells).toHaveLength(3);\n for (const cell of cells) expect(cell).toContain(dashes);\n });\n Then(\n \"the table has {int} body row and it contains {string}\",\n (_c: unknown, n: number, text: string) => {\n const { view } = need();\n const m = model();\n expect(m.data.rows).toHaveLength(n);\n const texts = m.data.rows[0].map((c) => view.state.sliceDoc(c.from, c.to));\n expect(texts).toContain(text);\n },\n );\n And(\"no cell contains {string}\", (_c: unknown, text: string) => {\n expect(need().view.state.doc.toString()).not.toContain(text);\n });\n Then(\"the table's source lines are gone\", () => {\n const doc = need().view.state.doc.toString();\n expect(doc).not.toContain(\"|\");\n expect(doc).not.toContain(\"---\");\n });\n And(\"the surrounding prose is untouched\", () => {\n const doc = need().view.state.doc.toString();\n expect(doc).toContain(\"intro prose\");\n expect(doc).toContain(\"outro prose\");\n });\n\n // ── selection ────────────────────────────────────────────────────\n When(\n \"I press the mouse in the {string} cell and release in the {string} cell\",\n (_c: unknown, a: string, b: string) => {\n dragSelect(refByText(a), refByText(b));\n },\n );\n Then(\n \"cells {int},{int} through {int},{int} render as selected\",\n (_c: unknown, r0: number, c0: number, r1: number, c1: number) => {\n expect(selectedEls()).toHaveLength((r1 - r0 + 1) * (c1 - c0 + 1));\n for (let row = r0; row <= r1; row++) {\n for (let col = c0; col <= c1; col++) {\n expect(tdOf({ row, col }).classList.contains(SELECTED_CLASS)).toBe(true);\n }\n }\n },\n );\n And(\"the native text selection is empty\", () => {\n expect(document.getSelection()?.isCollapsed ?? true).toBe(true);\n });\n Given(\n \"cells {int},{int} through {int},{int} are selected\",\n (_c: unknown, r0: number, c0: number, r1: number, c1: number) => {\n dragSelect({ row: r0, col: c0 }, { row: r1, col: c1 });\n expect(selectedEls().length).toBeGreaterThan(0);\n },\n );\n When(\"I copy\", () => {\n const dt = new DataTransfer();\n const event = new ClipboardEvent(\"copy\", { clipboardData: dt, bubbles: true, cancelable: true });\n document.dispatchEvent(event);\n need().copied = dt.getData(\"text/plain\");\n });\n Then(\"the clipboard contains the selected cells as TSV\", () => {\n expect(need().copied).toBe(\"Ada\\tEngineer\\nLin\\tDesigner\");\n });\n When(\"column {int} of a {int}-row grid is selected\", (_c: unknown, col: number, rows: number) => {\n need().selectionSet = refsIn(columnRect(rows, col));\n });\n Then(\n \"the selection set is cells {int},{int} and {int},{int} and {int},{int}\",\n (_c: unknown, ...nums: number[]) => {\n const expected: CellRef[] = [];\n for (let i = 0; i < 6; i += 2) expected.push({ row: nums[i], col: nums[i + 1] });\n expect(need().selectionSet).toEqual(expected);\n },\n );\n\n // ── menu ─────────────────────────────────────────────────────────\n When(\"I right-click the {string} cell\", (_c: unknown, text: string) => {\n const el = tdOf(refByText(text));\n const rect = el.getBoundingClientRect();\n el.dispatchEvent(\n new MouseEvent(\"contextmenu\", {\n bubbles: true,\n cancelable: true,\n clientX: rect.left + rect.width / 2,\n clientY: rect.top + rect.height / 2,\n }),\n );\n });\n Then(\"the table menu opens\", () => {\n expect(document.querySelector(\".cm-table-menu\")).not.toBeNull();\n });\n And(\"I choose {string} from the table menu\", (_c: unknown, label: string) => {\n const item = Array.from(document.querySelectorAll(\".cm-table-menu button\")).find(\n (b) => b.textContent === label,\n );\n if (!item) throw new Error(`no menu item \"${label}\"`);\n item.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n });\n Then(\"{int} cells render as selected\", (_c: unknown, n: number) => {\n expect(selectedEls()).toHaveLength(n);\n });\n And(\n \"choosing {string} inserts a row after the {string} row\",\n async (_c: unknown, label: string, rowText: string) => {\n const item = Array.from(document.querySelectorAll(\".cm-table-menu button\")).find(\n (b) => b.textContent === label,\n );\n if (!item) throw new Error(`no menu item \"${label}\"`);\n item.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await vi.waitFor(() => {\n if (model().data.rows.length !== 3) throw new Error(\"row pending\");\n });\n const { view } = need();\n const rows = model().data.rows;\n expect(rows[1].map((c) => view.state.sliceDoc(c.from, c.to))).toContain(rowText);\n for (const cell of rows[2]) {\n expect(view.state.sliceDoc(cell.from, cell.to).trim()).toBe(\"\");\n }\n },\n );\n\n Then(\"the {string} cell now contains {string}\", (_c: unknown, _cell: string, out: string) => {\n expect(need().surface.active()?.text).toBe(out);\n });\n And(\"the table structure is unchanged\", () => {\n // Nothing was committed: the document is exactly the Background's.\n expect(need().view.state.doc.toString()).toBe(need().backgroundDoc);\n });\n\n // ── the spike gate, as living spec ───────────────────────────────\n Given(\n \"I am typing {string} at the end of the {string} cell\",\n async (_c: unknown, typed: string, text: string) => {\n const { surface, view } = need();\n expect(surface.begin(view, tf(), refByText(text), Number.MAX_SAFE_INTEGER)).toBe(true);\n await userEvent.keyboard(typed);\n },\n );\n When(\"an unrelated document change forces the table widget to update\", () => {\n const { view } = need();\n view.dispatch({ changes: { from: 0, insert: \"X\" } });\n });\n Then(\"my in-progress text and caret survive\", () => {\n const { surface } = need();\n expect(surface.active()?.text).toBe(\"AdaQ\");\n expect(surface.active()?.caret).toBe(4);\n expect(document.activeElement).toBe(surface.editingElement());\n });\n And(\"further typing still lands at the caret\", async () => {\n await userEvent.keyboard(\"!\");\n expect(need().surface.active()?.text).toBe(\"AdaQ!\");\n });\n When(\n \"the document changes {string} to {string} externally\",\n (_c: unknown, from: string, to: string) => {\n const { view } = need();\n const at = view.state.doc.toString().indexOf(from);\n view.dispatch({ changes: { from: at, to: at + from.length, insert: to } });\n },\n );\n Then(\n \"committing my edit produces a table containing both {string} and {string}\",\n (_c: unknown, a: string, b: string) => {\n const { surface, view } = need();\n surface.commit(view);\n const doc = view.state.doc.toString();\n expect(doc).toContain(a);\n expect(doc).toContain(b);\n },\n );\n Given(\n \"I typed {string} into the {string} cell and committed\",\n async (_c: unknown, typed: string, text: string) => {\n const { surface, view } = need();\n surface.begin(view, tf(), refByText(text), Number.MAX_SAFE_INTEGER);\n await userEvent.keyboard(typed);\n surface.commit(view);\n expect(view.state.doc.toString()).toContain(text + typed);\n },\n );\n Then(\"the table source shows {string} again\", (_c: unknown, text: string) => {\n const { view } = need();\n const cell = cellRange(view.state, tf(), refByText(text));\n expect(cell).not.toBeNull();\n expect(view.state.sliceDoc(cell!.from, cell!.to)).toBe(text);\n });\n And(\"redo restores the committed edit\", async () => {\n need().view.focus();\n await userEvent.keyboard(modChord(\"{Shift>}z{/Shift}\"));\n expect(need().view.state.doc.toString()).toContain(\"AdaX\");\n });\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,23 @@
1
+ import { ViewPlugin } from '@codemirror/view';
2
+
3
+ /**
4
+ * Zettlr-style quick inserters for the V2 table: hovering a cell reveals a
5
+ * "+" in the wrap's gutter — below-left for a row, top-right for a column —
6
+ * inserting relative to the hovered cell. The right-click menu carries the
7
+ * full command set; these are the two high-frequency shortcuts.
8
+ *
9
+ * Ported from the V1 controls with both approved fixes baked in:
10
+ * - repositioning is gated on the hovered CELL changing (per-mousemove
11
+ * rewrites made the buttons jitter — "flashing"),
12
+ * - the glyph is a centred SVG on a subtle neutral chip; the primary accent
13
+ * is the hover state, not the resting state (editorTheme).
14
+ *
15
+ * One delegated listener per editor; buttons attach lazily per wrap and are
16
+ * re-attached automatically after a widget recreate (the next mousemove).
17
+ */
18
+
19
+ declare function tableV2HoverControls(): ViewPlugin<{
20
+ destroy(): void;
21
+ }, undefined>;
22
+
23
+ export { tableV2HoverControls };