@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,89 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { ViewPlugin } from "@codemirror/view";
3
+ import { addColumnAfter, addRowBelow } from "../table/tableEditCommands.js";
4
+ const PLUS = 20;
5
+ const PLUS_SVG = '<svg viewBox="0 0 16 16" width="11" height="11" aria-hidden="true"><path d="M8 2.75v10.5M2.75 8h10.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>';
6
+ function makeInserter(kind, label) {
7
+ const el = document.createElement("button");
8
+ el.type = "button";
9
+ el.className = `cm-table-inserter cm-table-inserter--${kind}`;
10
+ el.setAttribute("aria-label", label);
11
+ el.innerHTML = PLUS_SVG;
12
+ return el;
13
+ }
14
+ function tableV2HoverControls() {
15
+ return ViewPlugin.define((view) => {
16
+ let lastCell = null;
17
+ const runInsert = (event) => {
18
+ const button = event.currentTarget;
19
+ const pos = Number(button.dataset.pos);
20
+ if (Number.isNaN(pos)) return;
21
+ const command = button.classList.contains("cm-table-inserter--row") ? addRowBelow : addColumnAfter;
22
+ const change = command(view.state, pos);
23
+ if (change) view.dispatch({ changes: change, userEvent: "input.table.structure" });
24
+ };
25
+ const ensure = (wrap) => {
26
+ let row = wrap.querySelector(":scope > .cm-table-inserter--row");
27
+ let col = wrap.querySelector(":scope > .cm-table-inserter--column");
28
+ if (!row) {
29
+ row = makeInserter("row", "Insert row below");
30
+ row.addEventListener("click", runInsert);
31
+ wrap.appendChild(row);
32
+ }
33
+ if (!col) {
34
+ col = makeInserter("column", "Insert column right");
35
+ col.addEventListener("click", runInsert);
36
+ wrap.appendChild(col);
37
+ }
38
+ return { row, col };
39
+ };
40
+ const hideAll = () => {
41
+ lastCell = null;
42
+ view.dom.querySelectorAll(".cm-table-inserter").forEach((el) => el.style.display = "none");
43
+ };
44
+ const onMouseMove = (event) => {
45
+ const target = event.target;
46
+ if (target.closest?.(".cm-table-inserter")) return;
47
+ const cell = target.closest?.("[data-cell-from]");
48
+ const wrap = target.closest?.("[data-tablev2-from]");
49
+ if (!(cell instanceof HTMLElement) || !(wrap instanceof HTMLElement)) {
50
+ hideAll();
51
+ return;
52
+ }
53
+ if (cell.getAttribute("contenteditable")) {
54
+ hideAll();
55
+ return;
56
+ }
57
+ if (cell === lastCell) return;
58
+ lastCell = cell;
59
+ const { row, col } = ensure(wrap);
60
+ row.dataset.pos = cell.dataset.cellFrom;
61
+ col.dataset.pos = cell.dataset.cellFrom;
62
+ const table = wrap.querySelector("table");
63
+ if (!table) return;
64
+ const cellRect = cell.getBoundingClientRect();
65
+ const tableRect = table.getBoundingClientRect();
66
+ const wrapRect = wrap.getBoundingClientRect();
67
+ const leftGutter = tableRect.left - wrapRect.left;
68
+ const topGutter = tableRect.top - wrapRect.top;
69
+ row.style.display = "flex";
70
+ row.style.left = `${(leftGutter - PLUS) / 2}px`;
71
+ row.style.top = `${cellRect.bottom - wrapRect.top - PLUS / 2}px`;
72
+ col.style.display = "flex";
73
+ col.style.left = `${cellRect.right - wrapRect.left - PLUS / 2}px`;
74
+ col.style.top = `${(topGutter - PLUS) / 2}px`;
75
+ };
76
+ view.dom.addEventListener("mousemove", onMouseMove);
77
+ view.dom.addEventListener("mouseleave", hideAll);
78
+ return {
79
+ destroy() {
80
+ view.dom.removeEventListener("mousemove", onMouseMove);
81
+ view.dom.removeEventListener("mouseleave", hideAll);
82
+ }
83
+ };
84
+ });
85
+ }
86
+ export {
87
+ tableV2HoverControls
88
+ };
89
+ //# sourceMappingURL=tableV2HoverControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/tablev2/tableV2HoverControls.ts"],"sourcesContent":["/**\n * Zettlr-style quick inserters for the V2 table: hovering a cell reveals a\n * \"+\" in the wrap's gutter — below-left for a row, top-right for a column —\n * inserting relative to the hovered cell. The right-click menu carries the\n * full command set; these are the two high-frequency shortcuts.\n *\n * Ported from the V1 controls with both approved fixes baked in:\n * - repositioning is gated on the hovered CELL changing (per-mousemove\n * rewrites made the buttons jitter — \"flashing\"),\n * - the glyph is a centred SVG on a subtle neutral chip; the primary accent\n * is the hover state, not the resting state (editorTheme).\n *\n * One delegated listener per editor; buttons attach lazily per wrap and are\n * re-attached automatically after a widget recreate (the next mousemove).\n */\n\nimport { ViewPlugin } from \"@codemirror/view\";\nimport { type ChangeSpec, type EditorState } from \"@codemirror/state\";\n\nimport { addColumnAfter, addRowBelow } from \"../table/tableEditCommands\";\n\ntype InsertCommand = (state: EditorState, pos: number) => ChangeSpec | null;\n\n/** Inserter circle diameter; keep in sync with `.cm-table-inserter`. */\nconst PLUS = 20;\n\nconst PLUS_SVG =\n '<svg viewBox=\"0 0 16 16\" width=\"11\" height=\"11\" aria-hidden=\"true\">' +\n '<path d=\"M8 2.75v10.5M2.75 8h10.5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/></svg>';\n\nfunction makeInserter(kind: \"row\" | \"column\", label: string): HTMLButtonElement {\n const el = document.createElement(\"button\");\n el.type = \"button\";\n el.className = `cm-table-inserter cm-table-inserter--${kind}`;\n el.setAttribute(\"aria-label\", label);\n el.innerHTML = PLUS_SVG;\n return el;\n}\n\nexport function tableV2HoverControls() {\n return ViewPlugin.define((view) => {\n let lastCell: Element | null = null;\n\n const runInsert = (event: Event): void => {\n const button = event.currentTarget as HTMLElement;\n const pos = Number(button.dataset.pos);\n if (Number.isNaN(pos)) return;\n const command: InsertCommand = button.classList.contains(\"cm-table-inserter--row\")\n ? addRowBelow\n : addColumnAfter;\n const change = command(view.state, pos);\n if (change) view.dispatch({ changes: change, userEvent: \"input.table.structure\" });\n };\n\n const ensure = (wrap: HTMLElement): { row: HTMLElement; col: HTMLElement } => {\n let row = wrap.querySelector<HTMLElement>(\":scope > .cm-table-inserter--row\");\n let col = wrap.querySelector<HTMLElement>(\":scope > .cm-table-inserter--column\");\n if (!row) {\n row = makeInserter(\"row\", \"Insert row below\");\n row.addEventListener(\"click\", runInsert);\n wrap.appendChild(row);\n }\n if (!col) {\n col = makeInserter(\"column\", \"Insert column right\");\n col.addEventListener(\"click\", runInsert);\n wrap.appendChild(col);\n }\n return { row, col };\n };\n\n const hideAll = (): void => {\n lastCell = null;\n view.dom\n .querySelectorAll<HTMLElement>(\".cm-table-inserter\")\n .forEach((el) => (el.style.display = \"none\"));\n };\n\n const onMouseMove = (event: MouseEvent): void => {\n const target = event.target as HTMLElement;\n // On an inserter: leave it exactly where it is so it stays clickable.\n if (target.closest?.(\".cm-table-inserter\")) return;\n const cell = target.closest?.(\"[data-cell-from]\");\n const wrap = target.closest?.(\"[data-tablev2-from]\");\n if (!(cell instanceof HTMLElement) || !(wrap instanceof HTMLElement)) {\n hideAll();\n return;\n }\n if (cell.getAttribute(\"contenteditable\")) {\n // The cell is being edited — stay out of its way.\n hideAll();\n return;\n }\n // Reposition only when the hovered cell changes: per-move rewrites\n // jitter (\"flashing\") while the pointer travels within one cell.\n if (cell === lastCell) return;\n lastCell = cell;\n\n const { row, col } = ensure(wrap);\n row.dataset.pos = cell.dataset.cellFrom;\n col.dataset.pos = cell.dataset.cellFrom;\n\n const table = wrap.querySelector(\"table\");\n if (!table) return;\n const cellRect = cell.getBoundingClientRect();\n const tableRect = table.getBoundingClientRect();\n const wrapRect = wrap.getBoundingClientRect();\n const leftGutter = tableRect.left - wrapRect.left;\n const topGutter = tableRect.top - wrapRect.top;\n\n row.style.display = \"flex\";\n row.style.left = `${(leftGutter - PLUS) / 2}px`;\n row.style.top = `${cellRect.bottom - wrapRect.top - PLUS / 2}px`;\n\n col.style.display = \"flex\";\n col.style.left = `${cellRect.right - wrapRect.left - PLUS / 2}px`;\n col.style.top = `${(topGutter - PLUS) / 2}px`;\n };\n\n view.dom.addEventListener(\"mousemove\", onMouseMove);\n view.dom.addEventListener(\"mouseleave\", hideAll);\n return {\n destroy() {\n view.dom.removeEventListener(\"mousemove\", onMouseMove);\n view.dom.removeEventListener(\"mouseleave\", hideAll);\n },\n };\n });\n}\n"],"mappings":";AAgBA,SAAS,kBAAkB;AAG3B,SAAS,gBAAgB,mBAAmB;AAK5C,MAAM,OAAO;AAEb,MAAM,WACJ;AAGF,SAAS,aAAa,MAAwB,OAAkC;AAC9E,QAAM,KAAK,SAAS,cAAc,QAAQ;AAC1C,KAAG,OAAO;AACV,KAAG,YAAY,wCAAwC,IAAI;AAC3D,KAAG,aAAa,cAAc,KAAK;AACnC,KAAG,YAAY;AACf,SAAO;AACT;AAEO,SAAS,uBAAuB;AACrC,SAAO,WAAW,OAAO,CAAC,SAAS;AACjC,QAAI,WAA2B;AAE/B,UAAM,YAAY,CAAC,UAAuB;AACxC,YAAM,SAAS,MAAM;AACrB,YAAM,MAAM,OAAO,OAAO,QAAQ,GAAG;AACrC,UAAI,OAAO,MAAM,GAAG,EAAG;AACvB,YAAM,UAAyB,OAAO,UAAU,SAAS,wBAAwB,IAC7E,cACA;AACJ,YAAM,SAAS,QAAQ,KAAK,OAAO,GAAG;AACtC,UAAI,OAAQ,MAAK,SAAS,EAAE,SAAS,QAAQ,WAAW,wBAAwB,CAAC;AAAA,IACnF;AAEA,UAAM,SAAS,CAAC,SAA8D;AAC5E,UAAI,MAAM,KAAK,cAA2B,kCAAkC;AAC5E,UAAI,MAAM,KAAK,cAA2B,qCAAqC;AAC/E,UAAI,CAAC,KAAK;AACR,cAAM,aAAa,OAAO,kBAAkB;AAC5C,YAAI,iBAAiB,SAAS,SAAS;AACvC,aAAK,YAAY,GAAG;AAAA,MACtB;AACA,UAAI,CAAC,KAAK;AACR,cAAM,aAAa,UAAU,qBAAqB;AAClD,YAAI,iBAAiB,SAAS,SAAS;AACvC,aAAK,YAAY,GAAG;AAAA,MACtB;AACA,aAAO,EAAE,KAAK,IAAI;AAAA,IACpB;AAEA,UAAM,UAAU,MAAY;AAC1B,iBAAW;AACX,WAAK,IACF,iBAA8B,oBAAoB,EAClD,QAAQ,CAAC,OAAQ,GAAG,MAAM,UAAU,MAAO;AAAA,IAChD;AAEA,UAAM,cAAc,CAAC,UAA4B;AAC/C,YAAM,SAAS,MAAM;AAErB,UAAI,OAAO,UAAU,oBAAoB,EAAG;AAC5C,YAAM,OAAO,OAAO,UAAU,kBAAkB;AAChD,YAAM,OAAO,OAAO,UAAU,qBAAqB;AACnD,UAAI,EAAE,gBAAgB,gBAAgB,EAAE,gBAAgB,cAAc;AACpE,gBAAQ;AACR;AAAA,MACF;AACA,UAAI,KAAK,aAAa,iBAAiB,GAAG;AAExC,gBAAQ;AACR;AAAA,MACF;AAGA,UAAI,SAAS,SAAU;AACvB,iBAAW;AAEX,YAAM,EAAE,KAAK,IAAI,IAAI,OAAO,IAAI;AAChC,UAAI,QAAQ,MAAM,KAAK,QAAQ;AAC/B,UAAI,QAAQ,MAAM,KAAK,QAAQ;AAE/B,YAAM,QAAQ,KAAK,cAAc,OAAO;AACxC,UAAI,CAAC,MAAO;AACZ,YAAM,WAAW,KAAK,sBAAsB;AAC5C,YAAM,YAAY,MAAM,sBAAsB;AAC9C,YAAM,WAAW,KAAK,sBAAsB;AAC5C,YAAM,aAAa,UAAU,OAAO,SAAS;AAC7C,YAAM,YAAY,UAAU,MAAM,SAAS;AAE3C,UAAI,MAAM,UAAU;AACpB,UAAI,MAAM,OAAO,IAAI,aAAa,QAAQ,CAAC;AAC3C,UAAI,MAAM,MAAM,GAAG,SAAS,SAAS,SAAS,MAAM,OAAO,CAAC;AAE5D,UAAI,MAAM,UAAU;AACpB,UAAI,MAAM,OAAO,GAAG,SAAS,QAAQ,SAAS,OAAO,OAAO,CAAC;AAC7D,UAAI,MAAM,MAAM,IAAI,YAAY,QAAQ,CAAC;AAAA,IAC3C;AAEA,SAAK,IAAI,iBAAiB,aAAa,WAAW;AAClD,SAAK,IAAI,iBAAiB,cAAc,OAAO;AAC/C,WAAO;AAAA,MACL,UAAU;AACR,aAAK,IAAI,oBAAoB,aAAa,WAAW;AACrD,aAAK,IAAI,oBAAoB,cAAc,OAAO;AAAA,MACpD;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,29 @@
1
+ import { Extension } from '@codemirror/state';
2
+ import { CellEditingSurface } from './cellEditingSurface.js';
3
+ import '@codemirror/view';
4
+
5
+ /**
6
+ * The interaction wiring around a {@link CellEditingSurface} (ADR 0001):
7
+ *
8
+ * - pointer: one press lifecycle owns the mouse. A press that stays in its
9
+ * cell is a CLICK → edit begins on release with the caret at the pressed
10
+ * point (caretRangeFromPoint). A press that crosses into another cell is a
11
+ * DRAG → whole-cell selection (never a ragged native text selection).
12
+ * Presses inside the active editing element stay native. Handled by
13
+ * NATIVE listeners because the widget's `ignoreEvent() → true` hides
14
+ * these events from CodeMirror — which is also what keeps a table click
15
+ * from ever moving the main caret.
16
+ * - keys: a document-capture keydown runs {@link bridgeKey} while an edit is
17
+ * active — mid-text keys stay native; boundary keys commit and step to the
18
+ * neighbour cell or exit to the main document (exitCaretPos).
19
+ * - copy: with a cell selection active, copy yields TSV.
20
+ * - context menu: right-click on a cell opens the structure menu
21
+ * (insert/delete row/column) targeting that cell's position.
22
+ * - entry: ArrowDown/ArrowUp in the MAIN editor next to a table enters its
23
+ * first/last row (the table is an atomic block the caret can't land on).
24
+ */
25
+
26
+ /** All interaction wiring for the V2 table; compose with `tableV2(surface)`. */
27
+ declare function tableV2Interaction(surface: CellEditingSurface): Extension;
28
+
29
+ export { tableV2Interaction };
@@ -0,0 +1,224 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { Prec } from "@codemirror/state";
3
+ import { ViewPlugin, keymap } from "@codemirror/view";
4
+ import { showTableMenu } from "../table/tableContextMenu.js";
5
+ import { exitCaretPos, rowCount } from "../table/tableCellNav.js";
6
+ import { modelAt } from "../table/tableGeometry.js";
7
+ import {
8
+ cellRange,
9
+ offsetAtPoint,
10
+ visualEdges
11
+ } from "./cellEditingSurface.js";
12
+ import { bridgeKey, gridSize } from "./bridgeRules.js";
13
+ import {
14
+ CellSelectionController,
15
+ columnRect,
16
+ rectOf,
17
+ rowRect,
18
+ tableRect
19
+ } from "./tableV2Selection.js";
20
+ function refOf(cellEl) {
21
+ return { row: Number(cellEl.dataset.row), col: Number(cellEl.dataset.col) };
22
+ }
23
+ function hitCell(target) {
24
+ if (!(target instanceof HTMLElement)) return null;
25
+ const cellEl = target.closest?.("[data-row][data-col]");
26
+ const wrap = target.closest?.("[data-tablev2-from]");
27
+ if (!(cellEl instanceof HTMLElement) || !(wrap instanceof HTMLElement)) return null;
28
+ return { cellEl, tableFrom: Number(wrap.dataset.tablev2From) };
29
+ }
30
+ function bridgeKeyOf(event) {
31
+ if (event.metaKey || event.ctrlKey || event.altKey) return null;
32
+ switch (event.key) {
33
+ case "Tab":
34
+ return event.shiftKey ? "Shift-Tab" : "Tab";
35
+ case "ArrowRight":
36
+ case "ArrowLeft":
37
+ case "ArrowUp":
38
+ case "ArrowDown":
39
+ case "Backspace":
40
+ case "Delete":
41
+ case "Enter":
42
+ return event.shiftKey ? null : event.key;
43
+ default:
44
+ return null;
45
+ }
46
+ }
47
+ function pointerPlugin(surface, selection) {
48
+ return ViewPlugin.define((view) => {
49
+ let press = null;
50
+ const onMouseMove = (event) => {
51
+ if (!press) return;
52
+ const hit = hitCell(event.target);
53
+ if (!hit || hit.tableFrom !== press.tableFrom) return;
54
+ const ref = refOf(hit.cellEl);
55
+ const crossed = ref.row !== press.startRef.row || ref.col !== press.startRef.col;
56
+ if (crossed || press.dragged) {
57
+ press.dragged = true;
58
+ selection.set(view, press.tableFrom, rectOf(press.startRef, ref));
59
+ }
60
+ };
61
+ const onMouseUp = () => {
62
+ const p = press;
63
+ press = null;
64
+ window.removeEventListener("mousemove", onMouseMove, true);
65
+ window.removeEventListener("mouseup", onMouseUp, true);
66
+ if (!p || p.dragged) return;
67
+ if (!surface.begin(view, p.tableFrom, p.startRef, 0)) return;
68
+ const el = surface.editingElement();
69
+ if (!el) return;
70
+ const offset = offsetAtPoint(el, p.startX, p.startY);
71
+ surface.placeCaret(offset ?? surface.active().text.length);
72
+ };
73
+ const onMouseDown = (event) => {
74
+ if (event.button !== 0) return;
75
+ const editing = surface.editingElement();
76
+ if (editing && event.target instanceof Node && editing.contains(event.target)) return;
77
+ const hit = hitCell(event.target);
78
+ if (!hit) {
79
+ selection.clear(view);
80
+ return;
81
+ }
82
+ event.preventDefault();
83
+ surface.commit(view);
84
+ selection.clear(view);
85
+ press = {
86
+ tableFrom: hit.tableFrom,
87
+ startRef: refOf(hit.cellEl),
88
+ startX: event.clientX,
89
+ startY: event.clientY,
90
+ dragged: false
91
+ };
92
+ window.addEventListener("mousemove", onMouseMove, true);
93
+ window.addEventListener("mouseup", onMouseUp, true);
94
+ };
95
+ const onContextMenu = (event) => {
96
+ const hit = hitCell(event.target);
97
+ if (!hit) return;
98
+ event.preventDefault();
99
+ surface.commit(view);
100
+ const ref = refOf(hit.cellEl);
101
+ const range = cellRange(view.state, hit.tableFrom, ref);
102
+ if (!range) return;
103
+ showTableMenu({
104
+ x: event.clientX,
105
+ y: event.clientY,
106
+ view,
107
+ pos: range.from,
108
+ selectCells: (axis) => {
109
+ const model = modelAt(view.state, hit.tableFrom);
110
+ if (!model) return;
111
+ const { rows, cols } = gridSize(model);
112
+ const rect = axis === "row" ? rowRect(cols, ref.row) : axis === "column" ? columnRect(rows, ref.col) : tableRect(rows, cols);
113
+ selection.set(view, hit.tableFrom, rect);
114
+ }
115
+ });
116
+ };
117
+ const onCopy = (event) => {
118
+ const tsv = selection.tsv(view);
119
+ if (tsv === null) return;
120
+ event.clipboardData?.setData("text/plain", tsv);
121
+ event.preventDefault();
122
+ };
123
+ view.dom.addEventListener("mousedown", onMouseDown);
124
+ view.dom.addEventListener("contextmenu", onContextMenu);
125
+ document.addEventListener("copy", onCopy, true);
126
+ return {
127
+ update(update) {
128
+ if (update.docChanged) selection.clear(view);
129
+ },
130
+ destroy() {
131
+ view.dom.removeEventListener("mousedown", onMouseDown);
132
+ view.dom.removeEventListener("contextmenu", onContextMenu);
133
+ document.removeEventListener("copy", onCopy, true);
134
+ window.removeEventListener("mousemove", onMouseMove, true);
135
+ window.removeEventListener("mouseup", onMouseUp, true);
136
+ }
137
+ };
138
+ });
139
+ }
140
+ function keyPlugin(surface) {
141
+ return ViewPlugin.define((view) => {
142
+ const onKeyDown = (event) => {
143
+ const el = surface.editingElement();
144
+ if (!el || !(event.target instanceof Node) || !el.contains(event.target)) return;
145
+ const key = bridgeKeyOf(event);
146
+ if (!key) return;
147
+ const active = surface.active();
148
+ const tableFrom = surface.anchor();
149
+ if (!active || tableFrom === null) return;
150
+ const model = modelAt(view.state, tableFrom);
151
+ if (!model) return;
152
+ const action = bridgeKey(
153
+ {
154
+ ...gridSize(model),
155
+ row: active.ref.row,
156
+ col: active.ref.col,
157
+ offset: active.caret,
158
+ length: active.text.length,
159
+ ...visualEdges(el)
160
+ },
161
+ key
162
+ );
163
+ if (action.kind === "native") return;
164
+ event.preventDefault();
165
+ surface.commit(view);
166
+ if (action.kind === "focusCell") {
167
+ surface.begin(
168
+ view,
169
+ tableFrom,
170
+ { row: action.row, col: action.col },
171
+ action.caret === "end" ? Number.MAX_SAFE_INTEGER : 0
172
+ );
173
+ return;
174
+ }
175
+ const after = modelAt(view.state, tableFrom);
176
+ if (!after) return;
177
+ const pos = exitCaretPos(
178
+ action.edge === "before" ? "above" : "below",
179
+ after.from,
180
+ after.to,
181
+ view.state.doc.length
182
+ );
183
+ view.focus();
184
+ view.dispatch({ selection: { anchor: pos }, scrollIntoView: true });
185
+ };
186
+ document.addEventListener("keydown", onKeyDown, true);
187
+ return {
188
+ destroy() {
189
+ document.removeEventListener("keydown", onKeyDown, true);
190
+ }
191
+ };
192
+ });
193
+ }
194
+ function enterTable(view, surface, dir) {
195
+ const { main } = view.state.selection;
196
+ if (!main.empty) return false;
197
+ const doc = view.state.doc;
198
+ const line = doc.lineAt(main.head);
199
+ const neighbour = dir === "down" ? line.number + 1 : line.number - 1;
200
+ if (neighbour < 1 || neighbour > doc.lines) return false;
201
+ const target = doc.line(neighbour);
202
+ const probe = dir === "down" ? target.from : Math.max(target.from, target.to - 1);
203
+ const model = modelAt(view.state, probe);
204
+ if (!model) return false;
205
+ const ref = dir === "down" ? { row: 0, col: 0 } : { row: rowCount(model) - 1, col: 0 };
206
+ return surface.begin(view, model.from, ref, 0);
207
+ }
208
+ function tableV2Interaction(surface) {
209
+ const selection = new CellSelectionController();
210
+ return [
211
+ pointerPlugin(surface, selection),
212
+ keyPlugin(surface),
213
+ Prec.high(
214
+ keymap.of([
215
+ { key: "ArrowDown", run: (view) => enterTable(view, surface, "down") },
216
+ { key: "ArrowUp", run: (view) => enterTable(view, surface, "up") }
217
+ ])
218
+ )
219
+ ];
220
+ }
221
+ export {
222
+ tableV2Interaction
223
+ };
224
+ //# sourceMappingURL=tableV2Interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/tablev2/tableV2Interaction.ts"],"sourcesContent":["/**\n * The interaction wiring around a {@link CellEditingSurface} (ADR 0001):\n *\n * - pointer: one press lifecycle owns the mouse. A press that stays in its\n * cell is a CLICK → edit begins on release with the caret at the pressed\n * point (caretRangeFromPoint). A press that crosses into another cell is a\n * DRAG → whole-cell selection (never a ragged native text selection).\n * Presses inside the active editing element stay native. Handled by\n * NATIVE listeners because the widget's `ignoreEvent() → true` hides\n * these events from CodeMirror — which is also what keeps a table click\n * from ever moving the main caret.\n * - keys: a document-capture keydown runs {@link bridgeKey} while an edit is\n * active — mid-text keys stay native; boundary keys commit and step to the\n * neighbour cell or exit to the main document (exitCaretPos).\n * - copy: with a cell selection active, copy yields TSV.\n * - context menu: right-click on a cell opens the structure menu\n * (insert/delete row/column) targeting that cell's position.\n * - entry: ArrowDown/ArrowUp in the MAIN editor next to a table enters its\n * first/last row (the table is an atomic block the caret can't land on).\n */\n\nimport { Prec } from \"@codemirror/state\";\nimport { EditorView, ViewPlugin, keymap } from \"@codemirror/view\";\nimport { type Extension } from \"@codemirror/state\";\n\nimport { showTableMenu } from \"../table/tableContextMenu\";\nimport { exitCaretPos, rowCount } from \"../table/tableCellNav\";\nimport { modelAt } from \"../table/tableGeometry\";\nimport {\n type CellEditingSurface,\n type CellRef,\n cellRange,\n offsetAtPoint,\n visualEdges,\n} from \"./cellEditingSurface\";\nimport { type BridgeKey, bridgeKey, gridSize } from \"./bridgeRules\";\nimport {\n CellSelectionController,\n columnRect,\n rectOf,\n rowRect,\n tableRect,\n} from \"./tableV2Selection\";\n\nfunction refOf(cellEl: HTMLElement): CellRef {\n return { row: Number(cellEl.dataset.row), col: Number(cellEl.dataset.col) };\n}\n\nfunction hitCell(target: EventTarget | null): { cellEl: HTMLElement; tableFrom: number } | null {\n if (!(target instanceof HTMLElement)) return null;\n const cellEl = target.closest?.(\"[data-row][data-col]\");\n const wrap = target.closest?.(\"[data-tablev2-from]\");\n if (!(cellEl instanceof HTMLElement) || !(wrap instanceof HTMLElement)) return null;\n return { cellEl, tableFrom: Number(wrap.dataset.tablev2From) };\n}\n\n/** Map a KeyboardEvent to a bridge key; null = not the bridge's business. */\nfunction bridgeKeyOf(event: KeyboardEvent): BridgeKey | null {\n if (event.metaKey || event.ctrlKey || event.altKey) return null;\n switch (event.key) {\n case \"Tab\":\n return event.shiftKey ? \"Shift-Tab\" : \"Tab\";\n case \"ArrowRight\":\n case \"ArrowLeft\":\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"Backspace\":\n case \"Delete\":\n case \"Enter\":\n return event.shiftKey ? null : (event.key as BridgeKey);\n default:\n return null;\n }\n}\n\ninterface Press {\n tableFrom: number;\n startRef: CellRef;\n startX: number;\n startY: number;\n dragged: boolean;\n}\n\nfunction pointerPlugin(surface: CellEditingSurface, selection: CellSelectionController) {\n return ViewPlugin.define((view) => {\n let press: Press | null = null;\n\n const onMouseMove = (event: MouseEvent): void => {\n if (!press) return;\n const hit = hitCell(event.target);\n if (!hit || hit.tableFrom !== press.tableFrom) return;\n const ref = refOf(hit.cellEl);\n const crossed = ref.row !== press.startRef.row || ref.col !== press.startRef.col;\n if (crossed || press.dragged) {\n press.dragged = true;\n selection.set(view, press.tableFrom, rectOf(press.startRef, ref));\n }\n };\n\n const onMouseUp = (): void => {\n const p = press;\n press = null;\n window.removeEventListener(\"mousemove\", onMouseMove, true);\n window.removeEventListener(\"mouseup\", onMouseUp, true);\n if (!p || p.dragged) return; // a drag leaves its selection standing\n if (!surface.begin(view, p.tableFrom, p.startRef, 0)) return;\n const el = surface.editingElement();\n if (!el) return;\n const offset = offsetAtPoint(el, p.startX, p.startY);\n surface.placeCaret(offset ?? surface.active()!.text.length);\n };\n\n const onMouseDown = (event: MouseEvent): void => {\n if (event.button !== 0) return;\n const editing = surface.editingElement();\n if (editing && event.target instanceof Node && editing.contains(event.target)) return;\n const hit = hitCell(event.target);\n if (!hit) {\n // A press outside any table (prose, gutters): selection is done.\n selection.clear(view);\n return;\n }\n event.preventDefault();\n surface.commit(view);\n selection.clear(view);\n press = {\n tableFrom: hit.tableFrom,\n startRef: refOf(hit.cellEl),\n startX: event.clientX,\n startY: event.clientY,\n dragged: false,\n };\n window.addEventListener(\"mousemove\", onMouseMove, true);\n window.addEventListener(\"mouseup\", onMouseUp, true);\n };\n\n const onContextMenu = (event: MouseEvent): void => {\n const hit = hitCell(event.target);\n if (!hit) return;\n event.preventDefault();\n surface.commit(view);\n const ref = refOf(hit.cellEl);\n const range = cellRange(view.state, hit.tableFrom, ref);\n if (!range) return;\n showTableMenu({\n x: event.clientX,\n y: event.clientY,\n view,\n pos: range.from,\n selectCells: (axis) => {\n const model = modelAt(view.state, hit.tableFrom);\n if (!model) return;\n const { rows, cols } = gridSize(model);\n const rect =\n axis === \"row\"\n ? rowRect(cols, ref.row)\n : axis === \"column\"\n ? columnRect(rows, ref.col)\n : tableRect(rows, cols);\n selection.set(view, hit.tableFrom, rect);\n },\n });\n };\n\n const onCopy = (event: ClipboardEvent): void => {\n const tsv = selection.tsv(view);\n if (tsv === null) return;\n event.clipboardData?.setData(\"text/plain\", tsv);\n event.preventDefault();\n };\n\n view.dom.addEventListener(\"mousedown\", onMouseDown);\n view.dom.addEventListener(\"contextmenu\", onContextMenu);\n document.addEventListener(\"copy\", onCopy, true);\n return {\n update(update: { docChanged: boolean }) {\n // Cell geometry changed under the selection: transient by design.\n if (update.docChanged) selection.clear(view);\n },\n destroy() {\n view.dom.removeEventListener(\"mousedown\", onMouseDown);\n view.dom.removeEventListener(\"contextmenu\", onContextMenu);\n document.removeEventListener(\"copy\", onCopy, true);\n window.removeEventListener(\"mousemove\", onMouseMove, true);\n window.removeEventListener(\"mouseup\", onMouseUp, true);\n },\n };\n });\n}\n\nfunction keyPlugin(surface: CellEditingSurface) {\n return ViewPlugin.define((view) => {\n const onKeyDown = (event: KeyboardEvent): void => {\n const el = surface.editingElement();\n if (!el || !(event.target instanceof Node) || !el.contains(event.target)) return;\n const key = bridgeKeyOf(event);\n if (!key) return;\n const active = surface.active();\n const tableFrom = surface.anchor();\n if (!active || tableFrom === null) return;\n const model = modelAt(view.state, tableFrom);\n if (!model) return;\n const action = bridgeKey(\n {\n ...gridSize(model),\n row: active.ref.row,\n col: active.ref.col,\n offset: active.caret,\n length: active.text.length,\n ...visualEdges(el),\n },\n key,\n );\n if (action.kind === \"native\") return;\n event.preventDefault();\n surface.commit(view);\n if (action.kind === \"focusCell\") {\n surface.begin(\n view,\n tableFrom,\n { row: action.row, col: action.col },\n action.caret === \"end\" ? Number.MAX_SAFE_INTEGER : 0,\n );\n return;\n }\n const after = modelAt(view.state, tableFrom);\n if (!after) return;\n const pos = exitCaretPos(\n action.edge === \"before\" ? \"above\" : \"below\",\n after.from,\n after.to,\n view.state.doc.length,\n );\n view.focus();\n view.dispatch({ selection: { anchor: pos }, scrollIntoView: true });\n };\n document.addEventListener(\"keydown\", onKeyDown, true);\n return {\n destroy() {\n document.removeEventListener(\"keydown\", onKeyDown, true);\n },\n };\n });\n}\n\n/** Enter the table's first/last row when vertical motion in the main editor\n * reaches it — the block widget itself can't hold the caret. */\nfunction enterTable(view: EditorView, surface: CellEditingSurface, dir: \"up\" | \"down\"): boolean {\n const { main } = view.state.selection;\n if (!main.empty) return false;\n const doc = view.state.doc;\n const line = doc.lineAt(main.head);\n const neighbour = dir === \"down\" ? line.number + 1 : line.number - 1;\n if (neighbour < 1 || neighbour > doc.lines) return false;\n const target = doc.line(neighbour);\n // Probe INSIDE the neighbour line: its end sits on the table node's own end\n // boundary, which side-sensitive resolution misses.\n const probe = dir === \"down\" ? target.from : Math.max(target.from, target.to - 1);\n const model = modelAt(view.state, probe);\n if (!model) return false;\n const ref: CellRef =\n dir === \"down\" ? { row: 0, col: 0 } : { row: rowCount(model) - 1, col: 0 };\n return surface.begin(view, model.from, ref, 0);\n}\n\n/** All interaction wiring for the V2 table; compose with `tableV2(surface)`. */\nexport function tableV2Interaction(surface: CellEditingSurface): Extension {\n const selection = new CellSelectionController();\n return [\n pointerPlugin(surface, selection),\n keyPlugin(surface),\n Prec.high(\n keymap.of([\n { key: \"ArrowDown\", run: (view) => enterTable(view, surface, \"down\") },\n { key: \"ArrowUp\", run: (view) => enterTable(view, surface, \"up\") },\n ]),\n ),\n ];\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,45 @@
1
+ import { EditorView } from '@codemirror/view';
2
+ import { CellRef } from './cellEditingSurface.js';
3
+ import '@codemirror/state';
4
+
5
+ /**
6
+ * Whole-cell visual selection (feature scenarios 11–13). A drag across cells
7
+ * never produces a ragged native text selection — it selects whole cells,
8
+ * painted with a class; copy serialises the selected rectangle as TSV from
9
+ * the CURRENT document. Selection is transient: any document change clears it.
10
+ *
11
+ * The rectangle math is pure and dimension-based so the @pure tier can
12
+ * enumerate it without a model or DOM.
13
+ */
14
+
15
+ declare const SELECTED_CLASS = "cm-table-cell--selected";
16
+ interface CellRect {
17
+ r0: number;
18
+ c0: number;
19
+ r1: number;
20
+ c1: number;
21
+ }
22
+ /** The normalised rectangle spanned by two cells. */
23
+ declare function rectOf(a: CellRef, b: CellRef): CellRect;
24
+ /** Every cell in `rect`, row-major. */
25
+ declare function refsIn(rect: CellRect): CellRef[];
26
+ /** One whole column of a `rows`-high grid (row 0 = header). */
27
+ declare function columnRect(rows: number, col: number): CellRect;
28
+ /** One whole row of a `cols`-wide grid. */
29
+ declare function rowRect(cols: number, row: number): CellRect;
30
+ /** The whole grid. */
31
+ declare function tableRect(rows: number, cols: number): CellRect;
32
+ declare class CellSelectionController {
33
+ private sel;
34
+ set(view: EditorView, tableFrom: number, rect: CellRect): void;
35
+ get(): {
36
+ tableFrom: number;
37
+ rect: CellRect;
38
+ } | null;
39
+ clear(view: EditorView): void;
40
+ /** The selected rectangle as TSV, resolved from the current document. */
41
+ tsv(view: EditorView): string | null;
42
+ private unpaint;
43
+ }
44
+
45
+ export { type CellRect, CellSelectionController, SELECTED_CLASS, columnRect, rectOf, refsIn, rowRect, tableRect };
@@ -0,0 +1,81 @@
1
+ import {
2
+ __publicField
3
+ } from "../../chunk-V6TY7KAL.js";
4
+ import { cellAt } from "../table/tableCellNav.js";
5
+ import { modelAt } from "../table/tableGeometry.js";
6
+ import { cellElement } from "./cellEditingSurface.js";
7
+ import { unescapePipes } from "./cellText.js";
8
+ const SELECTED_CLASS = "cm-table-cell--selected";
9
+ function rectOf(a, b) {
10
+ return {
11
+ r0: Math.min(a.row, b.row),
12
+ c0: Math.min(a.col, b.col),
13
+ r1: Math.max(a.row, b.row),
14
+ c1: Math.max(a.col, b.col)
15
+ };
16
+ }
17
+ function refsIn(rect) {
18
+ const refs = [];
19
+ for (let row = rect.r0; row <= rect.r1; row++) {
20
+ for (let col = rect.c0; col <= rect.c1; col++) refs.push({ row, col });
21
+ }
22
+ return refs;
23
+ }
24
+ function columnRect(rows, col) {
25
+ return { r0: 0, c0: col, r1: rows - 1, c1: col };
26
+ }
27
+ function rowRect(cols, row) {
28
+ return { r0: row, c0: 0, r1: row, c1: cols - 1 };
29
+ }
30
+ function tableRect(rows, cols) {
31
+ return { r0: 0, c0: 0, r1: rows - 1, c1: cols - 1 };
32
+ }
33
+ class CellSelectionController {
34
+ constructor() {
35
+ __publicField(this, "sel", null);
36
+ }
37
+ set(view, tableFrom, rect) {
38
+ this.unpaint(view);
39
+ this.sel = { tableFrom, rect };
40
+ for (const ref of refsIn(rect)) {
41
+ cellElement(view, tableFrom, ref)?.classList.add(SELECTED_CLASS);
42
+ }
43
+ }
44
+ get() {
45
+ return this.sel;
46
+ }
47
+ clear(view) {
48
+ this.unpaint(view);
49
+ this.sel = null;
50
+ }
51
+ /** The selected rectangle as TSV, resolved from the current document. */
52
+ tsv(view) {
53
+ const s = this.sel;
54
+ if (!s) return null;
55
+ const model = modelAt(view.state, s.tableFrom);
56
+ if (!model) return null;
57
+ const lines = [];
58
+ for (let row = s.rect.r0; row <= s.rect.r1; row++) {
59
+ const cells = [];
60
+ for (let col = s.rect.c0; col <= s.rect.c1; col++) {
61
+ const cell = cellAt(model, row, col);
62
+ cells.push(cell ? unescapePipes(view.state.sliceDoc(cell.from, cell.to)) : "");
63
+ }
64
+ lines.push(cells.join(" "));
65
+ }
66
+ return lines.join("\n");
67
+ }
68
+ unpaint(view) {
69
+ view.dom.querySelectorAll(`.${SELECTED_CLASS}`).forEach((el) => el.classList.remove(SELECTED_CLASS));
70
+ }
71
+ }
72
+ export {
73
+ CellSelectionController,
74
+ SELECTED_CLASS,
75
+ columnRect,
76
+ rectOf,
77
+ refsIn,
78
+ rowRect,
79
+ tableRect
80
+ };
81
+ //# sourceMappingURL=tableV2Selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/tablev2/tableV2Selection.ts"],"sourcesContent":["/**\n * Whole-cell visual selection (feature scenarios 11–13). A drag across cells\n * never produces a ragged native text selection — it selects whole cells,\n * painted with a class; copy serialises the selected rectangle as TSV from\n * the CURRENT document. Selection is transient: any document change clears it.\n *\n * The rectangle math is pure and dimension-based so the @pure tier can\n * enumerate it without a model or DOM.\n */\n\nimport { type EditorView } from \"@codemirror/view\";\n\nimport { cellAt } from \"../table/tableCellNav\";\nimport { modelAt } from \"../table/tableGeometry\";\nimport { type CellRef, cellElement } from \"./cellEditingSurface\";\nimport { unescapePipes } from \"./cellText\";\n\n// The V1 theme already styles this class; reuse it wholesale.\nexport const SELECTED_CLASS = \"cm-table-cell--selected\";\n\nexport interface CellRect {\n r0: number;\n c0: number;\n r1: number;\n c1: number;\n}\n\n/** The normalised rectangle spanned by two cells. */\nexport function rectOf(a: CellRef, b: CellRef): CellRect {\n return {\n r0: Math.min(a.row, b.row),\n c0: Math.min(a.col, b.col),\n r1: Math.max(a.row, b.row),\n c1: Math.max(a.col, b.col),\n };\n}\n\n/** Every cell in `rect`, row-major. */\nexport function refsIn(rect: CellRect): CellRef[] {\n const refs: CellRef[] = [];\n for (let row = rect.r0; row <= rect.r1; row++) {\n for (let col = rect.c0; col <= rect.c1; col++) refs.push({ row, col });\n }\n return refs;\n}\n\n/** One whole column of a `rows`-high grid (row 0 = header). */\nexport function columnRect(rows: number, col: number): CellRect {\n return { r0: 0, c0: col, r1: rows - 1, c1: col };\n}\n\n/** One whole row of a `cols`-wide grid. */\nexport function rowRect(cols: number, row: number): CellRect {\n return { r0: row, c0: 0, r1: row, c1: cols - 1 };\n}\n\n/** The whole grid. */\nexport function tableRect(rows: number, cols: number): CellRect {\n return { r0: 0, c0: 0, r1: rows - 1, c1: cols - 1 };\n}\n\nexport class CellSelectionController {\n private sel: { tableFrom: number; rect: CellRect } | null = null;\n\n set(view: EditorView, tableFrom: number, rect: CellRect): void {\n this.unpaint(view);\n this.sel = { tableFrom, rect };\n for (const ref of refsIn(rect)) {\n cellElement(view, tableFrom, ref)?.classList.add(SELECTED_CLASS);\n }\n }\n\n get(): { tableFrom: number; rect: CellRect } | null {\n return this.sel;\n }\n\n clear(view: EditorView): void {\n this.unpaint(view);\n this.sel = null;\n }\n\n /** The selected rectangle as TSV, resolved from the current document. */\n tsv(view: EditorView): string | null {\n const s = this.sel;\n if (!s) return null;\n const model = modelAt(view.state, s.tableFrom);\n if (!model) return null;\n const lines: string[] = [];\n for (let row = s.rect.r0; row <= s.rect.r1; row++) {\n const cells: string[] = [];\n for (let col = s.rect.c0; col <= s.rect.c1; col++) {\n const cell = cellAt(model, row, col);\n cells.push(cell ? unescapePipes(view.state.sliceDoc(cell.from, cell.to)) : \"\");\n }\n lines.push(cells.join(\"\\t\"));\n }\n return lines.join(\"\\n\");\n }\n\n private unpaint(view: EditorView): void {\n view.dom\n .querySelectorAll(`.${SELECTED_CLASS}`)\n .forEach((el) => el.classList.remove(SELECTED_CLASS));\n }\n}\n"],"mappings":";;;AAYA,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAuB,mBAAmB;AAC1C,SAAS,qBAAqB;AAGvB,MAAM,iBAAiB;AAUvB,SAAS,OAAO,GAAY,GAAsB;AACvD,SAAO;AAAA,IACL,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG;AAAA,IACzB,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG;AAAA,IACzB,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG;AAAA,IACzB,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG;AAAA,EAC3B;AACF;AAGO,SAAS,OAAO,MAA2B;AAChD,QAAM,OAAkB,CAAC;AACzB,WAAS,MAAM,KAAK,IAAI,OAAO,KAAK,IAAI,OAAO;AAC7C,aAAS,MAAM,KAAK,IAAI,OAAO,KAAK,IAAI,MAAO,MAAK,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,EACvE;AACA,SAAO;AACT;AAGO,SAAS,WAAW,MAAc,KAAuB;AAC9D,SAAO,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,GAAG,IAAI,IAAI;AACjD;AAGO,SAAS,QAAQ,MAAc,KAAuB;AAC3D,SAAO,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,EAAE;AACjD;AAGO,SAAS,UAAU,MAAc,MAAwB;AAC9D,SAAO,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE;AACpD;AAEO,MAAM,wBAAwB;AAAA,EAA9B;AACL,wBAAQ,OAAoD;AAAA;AAAA,EAE5D,IAAI,MAAkB,WAAmB,MAAsB;AAC7D,SAAK,QAAQ,IAAI;AACjB,SAAK,MAAM,EAAE,WAAW,KAAK;AAC7B,eAAW,OAAO,OAAO,IAAI,GAAG;AAC9B,kBAAY,MAAM,WAAW,GAAG,GAAG,UAAU,IAAI,cAAc;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAoD;AAClD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,MAAwB;AAC5B,SAAK,QAAQ,IAAI;AACjB,SAAK,MAAM;AAAA,EACb;AAAA;AAAA,EAGA,IAAI,MAAiC;AACnC,UAAM,IAAI,KAAK;AACf,QAAI,CAAC,EAAG,QAAO;AACf,UAAM,QAAQ,QAAQ,KAAK,OAAO,EAAE,SAAS;AAC7C,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,QAAkB,CAAC;AACzB,aAAS,MAAM,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO;AACjD,YAAM,QAAkB,CAAC;AACzB,eAAS,MAAM,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO;AACjD,cAAM,OAAO,OAAO,OAAO,KAAK,GAAG;AACnC,cAAM,KAAK,OAAO,cAAc,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK,EAAE,CAAC,IAAI,EAAE;AAAA,MAC/E;AACA,YAAM,KAAK,MAAM,KAAK,GAAI,CAAC;AAAA,IAC7B;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,QAAQ,MAAwB;AACtC,SAAK,IACF,iBAAiB,IAAI,cAAc,EAAE,EACrC,QAAQ,CAAC,OAAO,GAAG,UAAU,OAAO,cAAc,CAAC;AAAA,EACxD;AACF;","names":[]}
@@ -0,0 +1,13 @@
1
+ import { Extension } from '@codemirror/state';
2
+ import { CellEditingSurface } from './cellEditingSurface.js';
3
+ import '@codemirror/view';
4
+
5
+ /**
6
+ * Surface synchronisation for the V2 table (ADR 0001): after every document
7
+ * change the widget DOM has been patched or recreated — remap the surface's
8
+ * table anchor through the change, then let it re-attach the active edit.
9
+ */
10
+
11
+ declare function tableV2Sync(surface: CellEditingSurface): Extension;
12
+
13
+ export { tableV2Sync };
@@ -0,0 +1,13 @@
1
+ import "../../chunk-V6TY7KAL.js";
2
+ import { EditorView } from "@codemirror/view";
3
+ function tableV2Sync(surface) {
4
+ return EditorView.updateListener.of((update) => {
5
+ if (!update.docChanged) return;
6
+ surface.mapThrough(update.changes);
7
+ surface.reanchor(update.view);
8
+ });
9
+ }
10
+ export {
11
+ tableV2Sync
12
+ };
13
+ //# sourceMappingURL=tableV2Sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/codemirror/tablev2/tableV2Sync.ts"],"sourcesContent":["/**\n * Surface synchronisation for the V2 table (ADR 0001): after every document\n * change the widget DOM has been patched or recreated — remap the surface's\n * table anchor through the change, then let it re-attach the active edit.\n */\n\nimport { EditorView } from \"@codemirror/view\";\nimport { type Extension } from \"@codemirror/state\";\n\nimport { type CellEditingSurface } from \"./cellEditingSurface\";\n\nexport function tableV2Sync(surface: CellEditingSurface): Extension {\n return EditorView.updateListener.of((update) => {\n if (!update.docChanged) return;\n surface.mapThrough(update.changes);\n surface.reanchor(update.view);\n });\n}\n"],"mappings":";AAMA,SAAS,kBAAkB;AAKpB,SAAS,YAAY,SAAwC;AAClE,SAAO,WAAW,eAAe,GAAG,CAAC,WAAW;AAC9C,QAAI,CAAC,OAAO,WAAY;AACxB,YAAQ,WAAW,OAAO,OAAO;AACjC,YAAQ,SAAS,OAAO,IAAI;AAAA,EAC9B,CAAC;AACH;","names":[]}
@@ -0,0 +1,46 @@
1
+ import { Extension } from '@codemirror/state';
2
+ import { WidgetType, EditorView } from '@codemirror/view';
3
+ import { TableData } from '../table/tableModel.js';
4
+ import { CellEditingSurface } from './cellEditingSurface.js';
5
+
6
+ /**
7
+ * V2 table widget (ADR 0001): pure render, stable lifecycle, no editors inside.
8
+ *
9
+ * Lifecycle contract — the make-or-break constraint:
10
+ * - `eq` compares source anchors + data, so ANY doc change (offsets shift)
11
+ * makes CM consult `updateDOM`.
12
+ * - `updateDOM` patches cell contents IN PLACE (element identity preserved)
13
+ * and re-stamps the source anchor; it declines (→ full recreate) only when
14
+ * the grid SHAPE changed.
15
+ * - After either path, the tableV2 extension calls the active surface's
16
+ * `reanchor` so an in-progress cell edit survives.
17
+ *
18
+ * Editing is delegated entirely to a {@link CellEditingSurface}; this file has
19
+ * no caret, focus, or selection logic by design.
20
+ */
21
+
22
+ /**
23
+ * Wrap-aware height estimate for an unmeasured table. CM6 places everything
24
+ * below an unmeasured widget using this number; the previous one-line-per-row
25
+ * assumption under-estimated prose-heavy tables by 3-5×, so a fast scroll ran
26
+ * on geometry that was off by hundreds of px per table — and the correction,
27
+ * landing mid-interaction, yanked the viewport and re-anchored selections
28
+ * onto whatever content shifted under the pointer.
29
+ */
30
+ declare function estimateTableHeight(data: TableData): number;
31
+ declare class TableWidgetV2 extends WidgetType {
32
+ readonly data: TableData;
33
+ readonly sourceFrom: number;
34
+ readonly sourceTo: number;
35
+ private readonly heightEstimate;
36
+ constructor(data: TableData, sourceFrom: number, sourceTo: number);
37
+ eq(other: TableWidgetV2): boolean;
38
+ toDOM(view: EditorView): HTMLElement;
39
+ updateDOM(dom: HTMLElement, view: EditorView): boolean;
40
+ ignoreEvent(): boolean;
41
+ get estimatedHeight(): number;
42
+ }
43
+ /** The V2 table extension: widget field + surface synchronisation. */
44
+ declare function tableV2(surface: CellEditingSurface): Extension;
45
+
46
+ export { TableWidgetV2, estimateTableHeight, tableV2 };