@voithos-labs/aragonite 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (900) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +365 -0
  3. package/THIRD-PARTY-NOTICES.md +102 -0
  4. package/dist/a11y-strings.d.ts +46 -0
  5. package/dist/a11y-strings.js +62 -0
  6. package/dist/action-contracts.d.ts +301 -0
  7. package/dist/action-contracts.js +5 -0
  8. package/dist/active-editor.d.ts +16 -0
  9. package/dist/active-editor.js +67 -0
  10. package/dist/ambient/ambient-cursor.d.ts +41 -0
  11. package/dist/ambient/ambient-cursor.js +120 -0
  12. package/dist/ambient/ambient-dom.d.ts +9 -0
  13. package/dist/ambient/ambient-dom.js +102 -0
  14. package/dist/assert.d.ts +6 -0
  15. package/dist/assert.js +17 -0
  16. package/dist/block-component.d.ts +274 -0
  17. package/dist/block-component.js +43 -0
  18. package/dist/block-id.d.ts +14 -0
  19. package/dist/block-id.js +34 -0
  20. package/dist/bounded-memo.d.ts +14 -0
  21. package/dist/bounded-memo.js +32 -0
  22. package/dist/components/BlockDragHandle.svelte +66 -0
  23. package/dist/components/BlockDragHandle.svelte.d.ts +18 -0
  24. package/dist/components/BlockHost.svelte +328 -0
  25. package/dist/components/BlockHost.svelte.d.ts +15 -0
  26. package/dist/components/BlockList.svelte +114 -0
  27. package/dist/components/BlockList.svelte.d.ts +16 -0
  28. package/dist/components/DecorationOverlay.svelte +156 -0
  29. package/dist/components/DecorationOverlay.svelte.d.ts +14 -0
  30. package/dist/components/Editor.svelte +1849 -0
  31. package/dist/components/Editor.svelte.d.ts +49 -0
  32. package/dist/components/GapCaret.svelte +226 -0
  33. package/dist/components/GapCaret.svelte.d.ts +9 -0
  34. package/dist/components/SearchBar.svelte +243 -0
  35. package/dist/components/SearchBar.svelte.d.ts +7 -0
  36. package/dist/components/SelectionOverlay.svelte +171 -0
  37. package/dist/components/SelectionOverlay.svelte.d.ts +14 -0
  38. package/dist/components/block-content-selector.d.ts +12 -0
  39. package/dist/components/block-content-selector.js +12 -0
  40. package/dist/components/blocks/BlockquoteBlock.svelte +32 -0
  41. package/dist/components/blocks/BlockquoteBlock.svelte.d.ts +11 -0
  42. package/dist/components/blocks/ThematicBreakBlock.svelte +156 -0
  43. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +17 -0
  44. package/dist/components/blocks/code/CodeBlock.svelte +726 -0
  45. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +23 -0
  46. package/dist/components/blocks/code/CodeLanguageChip.svelte +127 -0
  47. package/dist/components/blocks/code/CodeLanguageChip.svelte.d.ts +14 -0
  48. package/dist/components/blocks/code/code-beforeinput.d.ts +30 -0
  49. package/dist/components/blocks/code/code-beforeinput.js +40 -0
  50. package/dist/components/blocks/code/code-bootstrap.d.ts +8 -0
  51. package/dist/components/blocks/code/code-bootstrap.js +54 -0
  52. package/dist/components/blocks/code/code-editing.d.ts +28 -0
  53. package/dist/components/blocks/code/code-editing.js +79 -0
  54. package/dist/components/blocks/code/code-enter.d.ts +22 -0
  55. package/dist/components/blocks/code/code-enter.js +19 -0
  56. package/dist/components/blocks/code/code-fence-boundary.d.ts +77 -0
  57. package/dist/components/blocks/code/code-fence-boundary.js +169 -0
  58. package/dist/components/blocks/code/code-fence-exit.d.ts +24 -0
  59. package/dist/components/blocks/code/code-fence-exit.js +36 -0
  60. package/dist/components/blocks/code/code-indent.d.ts +14 -0
  61. package/dist/components/blocks/code/code-indent.js +87 -0
  62. package/dist/components/blocks/code/code-languages.d.ts +15 -0
  63. package/dist/components/blocks/code/code-languages.js +30 -0
  64. package/dist/components/blocks/code/code-paste-surface.d.ts +6 -0
  65. package/dist/components/blocks/code/code-paste-surface.js +29 -0
  66. package/dist/components/blocks/code/code-paste.d.ts +24 -0
  67. package/dist/components/blocks/code/code-paste.js +21 -0
  68. package/dist/components/blocks/code/code-renderer.d.ts +18 -0
  69. package/dist/components/blocks/code/code-renderer.js +249 -0
  70. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +51 -0
  71. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte.d.ts +11 -0
  72. package/dist/components/blocks/directive/activate-directives.d.ts +7 -0
  73. package/dist/components/blocks/directive/activate-directives.js +23 -0
  74. package/dist/components/blocks/editable-leaf.d.ts +126 -0
  75. package/dist/components/blocks/editable-leaf.js +410 -0
  76. package/dist/components/blocks/editable-surface.d.ts +209 -0
  77. package/dist/components/blocks/editable-surface.js +331 -0
  78. package/dist/components/blocks/list/ListBlock.svelte +162 -0
  79. package/dist/components/blocks/list/ListBlock.svelte.d.ts +11 -0
  80. package/dist/components/blocks/list/ListItemBlock.svelte +324 -0
  81. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +14 -0
  82. package/dist/components/blocks/list/task-checkbox.d.ts +3 -0
  83. package/dist/components/blocks/list/task-checkbox.js +33 -0
  84. package/dist/components/blocks/plain-text-backend.d.ts +21 -0
  85. package/dist/components/blocks/plain-text-backend.js +47 -0
  86. package/dist/components/blocks/surface-wiring.svelte.d.ts +18 -0
  87. package/dist/components/blocks/surface-wiring.svelte.js +68 -0
  88. package/dist/components/blocks/table/TableActionMenu.svelte +267 -0
  89. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +15 -0
  90. package/dist/components/blocks/table/TableBlock.svelte +765 -0
  91. package/dist/components/blocks/table/TableBlock.svelte.d.ts +30 -0
  92. package/dist/components/blocks/table/TableCellBlock.svelte +1075 -0
  93. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +30 -0
  94. package/dist/components/blocks/table/TableGrip.svelte +91 -0
  95. package/dist/components/blocks/table/TableGrip.svelte.d.ts +8 -0
  96. package/dist/components/blocks/table/TableRowBlock.svelte +233 -0
  97. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +34 -0
  98. package/dist/components/blocks/table/cell-clipboard.d.ts +23 -0
  99. package/dist/components/blocks/table/cell-clipboard.js +34 -0
  100. package/dist/components/blocks/table/cell-keydown-plan.d.ts +37 -0
  101. package/dist/components/blocks/table/cell-keydown-plan.js +66 -0
  102. package/dist/components/blocks/table/cell-pointer.d.ts +58 -0
  103. package/dist/components/blocks/table/cell-pointer.js +153 -0
  104. package/dist/components/blocks/table/cell-render.d.ts +51 -0
  105. package/dist/components/blocks/table/cell-render.js +98 -0
  106. package/dist/components/blocks/table/cell-table-commands.d.ts +12 -0
  107. package/dist/components/blocks/table/cell-table-commands.js +21 -0
  108. package/dist/components/blocks/table/cell-x-mapping.d.ts +6 -0
  109. package/dist/components/blocks/table/cell-x-mapping.js +16 -0
  110. package/dist/components/blocks/table/selected-cells.d.ts +19 -0
  111. package/dist/components/blocks/table/selected-cells.js +35 -0
  112. package/dist/components/blocks/table/table-caret-at-point.d.ts +8 -0
  113. package/dist/components/blocks/table/table-caret-at-point.js +35 -0
  114. package/dist/components/blocks/table/table-cell-paste.d.ts +16 -0
  115. package/dist/components/blocks/table/table-cell-paste.js +75 -0
  116. package/dist/components/blocks/table/table-drag-hit-test.d.ts +5 -0
  117. package/dist/components/blocks/table/table-drag-hit-test.js +20 -0
  118. package/dist/components/blocks/table/table-drop-target.d.ts +1 -0
  119. package/dist/components/blocks/table/table-drop-target.js +16 -0
  120. package/dist/components/blocks/table/table-menu-model.d.ts +52 -0
  121. package/dist/components/blocks/table/table-menu-model.js +78 -0
  122. package/dist/components/blocks/table/table-navigation.d.ts +8 -0
  123. package/dist/components/blocks/table/table-navigation.js +22 -0
  124. package/dist/components/blocks/table/table-reorder-drag.d.ts +78 -0
  125. package/dist/components/blocks/table/table-reorder-drag.js +97 -0
  126. package/dist/components/blocks/text/TextEditableBlock.svelte +1012 -0
  127. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +33 -0
  128. package/dist/components/blocks/text/click-snap-guard.d.ts +8 -0
  129. package/dist/components/blocks/text/click-snap-guard.js +19 -0
  130. package/dist/components/blocks/text/composition-seat.d.ts +50 -0
  131. package/dist/components/blocks/text/composition-seat.js +65 -0
  132. package/dist/components/blocks/text/construct-edge-delete.d.ts +47 -0
  133. package/dist/components/blocks/text/construct-edge-delete.js +164 -0
  134. package/dist/components/blocks/text/construct-reveal.d.ts +39 -0
  135. package/dist/components/blocks/text/construct-reveal.js +164 -0
  136. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +91 -0
  137. package/dist/components/blocks/text/edge-policy-dispatch.js +457 -0
  138. package/dist/components/blocks/text/edge-seat.d.ts +42 -0
  139. package/dist/components/blocks/text/edge-seat.js +197 -0
  140. package/dist/components/blocks/text/hidden-suffix.d.ts +10 -0
  141. package/dist/components/blocks/text/hidden-suffix.js +15 -0
  142. package/dist/components/blocks/text/link-at-point.d.ts +33 -0
  143. package/dist/components/blocks/text/link-at-point.js +47 -0
  144. package/dist/components/blocks/text/link-source-bytes.d.ts +37 -0
  145. package/dist/components/blocks/text/link-source-bytes.js +161 -0
  146. package/dist/components/blocks/text/live-join-seam.d.ts +15 -0
  147. package/dist/components/blocks/text/live-join-seam.js +327 -0
  148. package/dist/components/blocks/text/live-selection-edit.d.ts +68 -0
  149. package/dist/components/blocks/text/live-selection-edit.js +120 -0
  150. package/dist/components/blocks/text/live-split-rebalance.d.ts +56 -0
  151. package/dist/components/blocks/text/live-split-rebalance.js +239 -0
  152. package/dist/components/blocks/text/marker-completion.d.ts +18 -0
  153. package/dist/components/blocks/text/marker-completion.js +29 -0
  154. package/dist/components/blocks/text/pending-mark-insert.d.ts +37 -0
  155. package/dist/components/blocks/text/pending-mark-insert.js +188 -0
  156. package/dist/components/blocks/text/screen-diff.d.ts +20 -0
  157. package/dist/components/blocks/text/screen-diff.js +39 -0
  158. package/dist/components/blocks/text/text-clipboard.d.ts +70 -0
  159. package/dist/components/blocks/text/text-clipboard.js +131 -0
  160. package/dist/components/blocks/text/text-keydown.d.ts +39 -0
  161. package/dist/components/blocks/text/text-keydown.js +80 -0
  162. package/dist/components/blocks/text/text-render.d.ts +67 -0
  163. package/dist/components/blocks/text/text-render.js +215 -0
  164. package/dist/components/blocks/text/widget-adjacency.d.ts +30 -0
  165. package/dist/components/blocks/text/widget-adjacency.js +68 -0
  166. package/dist/components/blocks/text/widget-interaction.d.ts +90 -0
  167. package/dist/components/blocks/text/widget-interaction.js +591 -0
  168. package/dist/components/blocks/widget-portal.d.ts +54 -0
  169. package/dist/components/blocks/widget-portal.js +136 -0
  170. package/dist/components/built-in-blocks.d.ts +7 -0
  171. package/dist/components/built-in-blocks.js +77 -0
  172. package/dist/components/editor-root-clipboard.d.ts +29 -0
  173. package/dist/components/editor-root-clipboard.js +105 -0
  174. package/dist/components/editor-root-keydown.d.ts +47 -0
  175. package/dist/components/editor-root-keydown.js +88 -0
  176. package/dist/components/editor-root-listeners.d.ts +44 -0
  177. package/dist/components/editor-root-listeners.js +112 -0
  178. package/dist/components/image/ImageOverlayHost.svelte +115 -0
  179. package/dist/components/image/ImageOverlayHost.svelte.d.ts +20 -0
  180. package/dist/components/image/ImageProperties.svelte +153 -0
  181. package/dist/components/image/ImageProperties.svelte.d.ts +14 -0
  182. package/dist/components/image/ImageResizeHandles.svelte +188 -0
  183. package/dist/components/image/ImageResizeHandles.svelte.d.ts +10 -0
  184. package/dist/components/image/image-edit-commit.d.ts +38 -0
  185. package/dist/components/image/image-edit-commit.js +159 -0
  186. package/dist/components/image/image-resize.d.ts +11 -0
  187. package/dist/components/image/image-resize.js +38 -0
  188. package/dist/components/image/image-source-bytes.d.ts +15 -0
  189. package/dist/components/image/image-source-bytes.js +73 -0
  190. package/dist/components/image/image-widget-editing.d.ts +7 -0
  191. package/dist/components/image/image-widget-editing.js +41 -0
  192. package/dist/components/image/widget-dom.d.ts +11 -0
  193. package/dist/components/image/widget-dom.js +110 -0
  194. package/dist/components/image/widget-selection-state.svelte.d.ts +18 -0
  195. package/dist/components/image/widget-selection-state.svelte.js +26 -0
  196. package/dist/components/link-card/LinkCard.svelte +190 -0
  197. package/dist/components/link-card/LinkCard.svelte.d.ts +18 -0
  198. package/dist/components/link-card/LinkCardHost.svelte +181 -0
  199. package/dist/components/link-card/LinkCardHost.svelte.d.ts +25 -0
  200. package/dist/components/link-card/link-card-commit.d.ts +50 -0
  201. package/dist/components/link-card/link-card-commit.js +134 -0
  202. package/dist/components/link-card/link-card-entry.d.ts +39 -0
  203. package/dist/components/link-card/link-card-entry.js +51 -0
  204. package/dist/components/link-card/link-card-state.svelte.d.ts +44 -0
  205. package/dist/components/link-card/link-card-state.svelte.js +46 -0
  206. package/dist/components/lrd-map-gate.d.ts +18 -0
  207. package/dist/components/lrd-map-gate.js +22 -0
  208. package/dist/components/paste-image-arm.d.ts +29 -0
  209. package/dist/components/paste-image-arm.js +61 -0
  210. package/dist/components/portal.d.ts +11 -0
  211. package/dist/components/portal.js +29 -0
  212. package/dist/core/directive/activate.d.ts +8 -0
  213. package/dist/core/directive/activate.js +25 -0
  214. package/dist/core/directive/container-opener.d.ts +7 -0
  215. package/dist/core/directive/container-opener.js +162 -0
  216. package/dist/core/directive/grammar.d.ts +50 -0
  217. package/dist/core/directive/grammar.js +88 -0
  218. package/dist/core/directive/kinds.d.ts +31 -0
  219. package/dist/core/directive/kinds.js +137 -0
  220. package/dist/core/directive/registry.d.ts +39 -0
  221. package/dist/core/directive/registry.js +49 -0
  222. package/dist/core/directive/text-recognizer.d.ts +8 -0
  223. package/dist/core/directive/text-recognizer.js +87 -0
  224. package/dist/core/escapable.d.ts +6 -0
  225. package/dist/core/escapable.js +6 -0
  226. package/dist/core/inline/backticks.d.ts +16 -0
  227. package/dist/core/inline/backticks.js +62 -0
  228. package/dist/core/inline/character-refs.d.ts +7 -0
  229. package/dist/core/inline/character-refs.js +70 -0
  230. package/dist/core/inline/destination-bytes.d.ts +7 -0
  231. package/dist/core/inline/destination-bytes.js +14 -0
  232. package/dist/core/inline/entity-widget.d.ts +11 -0
  233. package/dist/core/inline/entity-widget.js +21 -0
  234. package/dist/core/inline/format-toggle.d.ts +50 -0
  235. package/dist/core/inline/format-toggle.js +533 -0
  236. package/dist/core/inline/html-entities.d.ts +8 -0
  237. package/dist/core/inline/html-entities.js +2134 -0
  238. package/dist/core/inline/html-tag-grammar.d.ts +16 -0
  239. package/dist/core/inline/html-tag-grammar.js +58 -0
  240. package/dist/core/inline/image-dimensions.d.ts +6 -0
  241. package/dist/core/inline/image-dimensions.js +42 -0
  242. package/dist/core/inline/index.d.ts +42 -0
  243. package/dist/core/inline/index.js +77 -0
  244. package/dist/core/inline/inline-cache.d.ts +20 -0
  245. package/dist/core/inline/inline-cache.js +28 -0
  246. package/dist/core/inline/inline-widgets.d.ts +124 -0
  247. package/dist/core/inline/inline-widgets.js +131 -0
  248. package/dist/core/inline/link-reference-resolver.d.ts +21 -0
  249. package/dist/core/inline/link-reference-resolver.js +46 -0
  250. package/dist/core/inline/raw-html-widget.d.ts +10 -0
  251. package/dist/core/inline/raw-html-widget.js +22 -0
  252. package/dist/core/inline/scan/autolinks.d.ts +23 -0
  253. package/dist/core/inline/scan/autolinks.js +354 -0
  254. package/dist/core/inline/scan/brackets.d.ts +11 -0
  255. package/dist/core/inline/scan/brackets.js +284 -0
  256. package/dist/core/inline/scan/code-spans.d.ts +7 -0
  257. package/dist/core/inline/scan/code-spans.js +27 -0
  258. package/dist/core/inline/scan/emphasis.d.ts +10 -0
  259. package/dist/core/inline/scan/emphasis.js +276 -0
  260. package/dist/core/inline/scan/index.d.ts +7 -0
  261. package/dist/core/inline/scan/index.js +176 -0
  262. package/dist/core/inline/scan/plugin-syntax.d.ts +62 -0
  263. package/dist/core/inline/scan/plugin-syntax.js +150 -0
  264. package/dist/core/inline/scan/scan-state.d.ts +47 -0
  265. package/dist/core/inline/scan/scan-state.js +48 -0
  266. package/dist/core/inline/scan/simple-nodes.d.ts +14 -0
  267. package/dist/core/inline/scan/simple-nodes.js +53 -0
  268. package/dist/core/inline/scan/url.d.ts +12 -0
  269. package/dist/core/inline/scan/url.js +82 -0
  270. package/dist/core/inline/transparency.d.ts +8 -0
  271. package/dist/core/inline/transparency.js +39 -0
  272. package/dist/core/inline/visibility.d.ts +81 -0
  273. package/dist/core/inline/visibility.js +144 -0
  274. package/dist/core/inline/walk.d.ts +14 -0
  275. package/dist/core/inline/walk.js +29 -0
  276. package/dist/core/inline-render.d.ts +48 -0
  277. package/dist/core/inline-render.js +322 -0
  278. package/dist/core/lines.d.ts +44 -0
  279. package/dist/core/lines.js +91 -0
  280. package/dist/core/node-views.d.ts +22 -0
  281. package/dist/core/node-views.js +8 -0
  282. package/dist/core/nodes.d.ts +297 -0
  283. package/dist/core/nodes.js +83 -0
  284. package/dist/core/parser.d.ts +68 -0
  285. package/dist/core/parser.js +189 -0
  286. package/dist/core/parsers/blockquote.d.ts +17 -0
  287. package/dist/core/parsers/blockquote.js +69 -0
  288. package/dist/core/parsers/built-in-openers.d.ts +8 -0
  289. package/dist/core/parsers/built-in-openers.js +124 -0
  290. package/dist/core/parsers/fence-syntax.d.ts +24 -0
  291. package/dist/core/parsers/fence-syntax.js +44 -0
  292. package/dist/core/parsers/fenced-code.d.ts +7 -0
  293. package/dist/core/parsers/fenced-code.js +29 -0
  294. package/dist/core/parsers/heading.d.ts +3 -0
  295. package/dist/core/parsers/heading.js +6 -0
  296. package/dist/core/parsers/html-block.d.ts +17 -0
  297. package/dist/core/parsers/html-block.js +94 -0
  298. package/dist/core/parsers/indented-code.d.ts +4 -0
  299. package/dist/core/parsers/indented-code.js +41 -0
  300. package/dist/core/parsers/link-reference.d.ts +7 -0
  301. package/dist/core/parsers/link-reference.js +152 -0
  302. package/dist/core/parsers/list.d.ts +19 -0
  303. package/dist/core/parsers/list.js +133 -0
  304. package/dist/core/parsers/paragraph.d.ts +10 -0
  305. package/dist/core/parsers/paragraph.js +42 -0
  306. package/dist/core/parsers/table-completion.d.ts +13 -0
  307. package/dist/core/parsers/table-completion.js +48 -0
  308. package/dist/core/parsers/table.d.ts +18 -0
  309. package/dist/core/parsers/table.js +110 -0
  310. package/dist/core/parsers/thematic-break.d.ts +1 -0
  311. package/dist/core/parsers/thematic-break.js +19 -0
  312. package/dist/core/serializer.d.ts +15 -0
  313. package/dist/core/serializer.js +11 -0
  314. package/dist/core/terminator-escalation.d.ts +8 -0
  315. package/dist/core/terminator-escalation.js +18 -0
  316. package/dist/core/url-policy.d.ts +14 -0
  317. package/dist/core/url-policy.js +44 -0
  318. package/dist/cursor/content-offsets.d.ts +29 -0
  319. package/dist/cursor/content-offsets.js +151 -0
  320. package/dist/cursor/coordinate-spaces.d.ts +65 -0
  321. package/dist/cursor/coordinate-spaces.js +66 -0
  322. package/dist/cursor/dom-walk.d.ts +18 -0
  323. package/dist/cursor/dom-walk.js +31 -0
  324. package/dist/cursor/edge-affinity.d.ts +44 -0
  325. package/dist/cursor/edge-affinity.js +60 -0
  326. package/dist/cursor/focused-caret.d.ts +10 -0
  327. package/dist/cursor/focused-caret.js +24 -0
  328. package/dist/cursor/height-model.d.ts +24 -0
  329. package/dist/cursor/height-model.js +72 -0
  330. package/dist/cursor/height-oracle.d.ts +24 -0
  331. package/dist/cursor/height-oracle.js +94 -0
  332. package/dist/cursor/overlay-rects.d.ts +8 -0
  333. package/dist/cursor/overlay-rects.js +19 -0
  334. package/dist/cursor/overlay-remeasure.d.ts +17 -0
  335. package/dist/cursor/overlay-remeasure.js +31 -0
  336. package/dist/cursor/pending-marks.d.ts +24 -0
  337. package/dist/cursor/pending-marks.js +36 -0
  338. package/dist/cursor/point-offset.d.ts +21 -0
  339. package/dist/cursor/point-offset.js +48 -0
  340. package/dist/cursor/reveal-anchor.d.ts +30 -0
  341. package/dist/cursor/reveal-anchor.js +31 -0
  342. package/dist/cursor/reveal-source.d.ts +35 -0
  343. package/dist/cursor/reveal-source.js +51 -0
  344. package/dist/cursor/scroll-ancestors.d.ts +28 -0
  345. package/dist/cursor/scroll-ancestors.js +89 -0
  346. package/dist/cursor/scrollport.d.ts +20 -0
  347. package/dist/cursor/scrollport.js +41 -0
  348. package/dist/cursor/sticky-column.d.ts +35 -0
  349. package/dist/cursor/sticky-column.js +64 -0
  350. package/dist/cursor/sticky-measure.d.ts +16 -0
  351. package/dist/cursor/sticky-measure.js +97 -0
  352. package/dist/cursor/typography-estimates.d.ts +21 -0
  353. package/dist/cursor/typography-estimates.js +21 -0
  354. package/dist/cursor/visual-lines.d.ts +25 -0
  355. package/dist/cursor/visual-lines.js +125 -0
  356. package/dist/cursor/widget-offset.d.ts +132 -0
  357. package/dist/cursor/widget-offset.js +543 -0
  358. package/dist/debug/diagnostics-report.d.ts +17 -0
  359. package/dist/debug/diagnostics-report.js +25 -0
  360. package/dist/debug/dump-tree.d.ts +6 -0
  361. package/dist/debug/dump-tree.js +114 -0
  362. package/dist/debug/inspect.d.ts +19 -0
  363. package/dist/debug/inspect.js +116 -0
  364. package/dist/debug/interaction-trace.d.ts +39 -0
  365. package/dist/debug/interaction-trace.js +105 -0
  366. package/dist/debug/operations-log.d.ts +14 -0
  367. package/dist/debug/operations-log.js +30 -0
  368. package/dist/decorations/buckets.d.ts +40 -0
  369. package/dist/decorations/buckets.js +87 -0
  370. package/dist/decorations/decoration-state.svelte.d.ts +20 -0
  371. package/dist/decorations/decoration-state.svelte.js +195 -0
  372. package/dist/decorations/island-dom.d.ts +35 -0
  373. package/dist/decorations/island-dom.js +148 -0
  374. package/dist/decorations/reserved-attrs.d.ts +12 -0
  375. package/dist/decorations/reserved-attrs.js +47 -0
  376. package/dist/decorations/types.d.ts +68 -0
  377. package/dist/decorations/types.js +5 -0
  378. package/dist/decorations/widget-dom.d.ts +15 -0
  379. package/dist/decorations/widget-dom.js +35 -0
  380. package/dist/dev-warn.d.ts +13 -0
  381. package/dist/dev-warn.js +28 -0
  382. package/dist/editor-actions/ancestry-folds.d.ts +32 -0
  383. package/dist/editor-actions/ancestry-folds.js +106 -0
  384. package/dist/editor-actions/block-edit-core.d.ts +29 -0
  385. package/dist/editor-actions/block-edit-core.js +277 -0
  386. package/dist/editor-actions/block-edit-scope.d.ts +79 -0
  387. package/dist/editor-actions/block-edit-scope.js +76 -0
  388. package/dist/editor-actions/block-edit.d.ts +8 -0
  389. package/dist/editor-actions/block-edit.js +111 -0
  390. package/dist/editor-actions/commit/history.d.ts +9 -0
  391. package/dist/editor-actions/commit/history.js +77 -0
  392. package/dist/editor-actions/commit/text-batch.d.ts +34 -0
  393. package/dist/editor-actions/commit/text-batch.js +61 -0
  394. package/dist/editor-actions/commit/undo-controller.d.ts +7 -0
  395. package/dist/editor-actions/commit/undo-controller.js +570 -0
  396. package/dist/editor-actions/container-block-component.d.ts +85 -0
  397. package/dist/editor-actions/container-block-component.js +228 -0
  398. package/dist/editor-actions/container-edit.d.ts +7 -0
  399. package/dist/editor-actions/container-edit.js +49 -0
  400. package/dist/editor-actions/container-exit-overrides.d.ts +16 -0
  401. package/dist/editor-actions/container-exit-overrides.js +38 -0
  402. package/dist/editor-actions/deps.d.ts +60 -0
  403. package/dist/editor-actions/deps.js +1 -0
  404. package/dist/editor-actions/enter-completion.d.ts +25 -0
  405. package/dist/editor-actions/enter-completion.js +76 -0
  406. package/dist/editor-actions/focus/focus-dispatch.d.ts +36 -0
  407. package/dist/editor-actions/focus/focus-dispatch.js +106 -0
  408. package/dist/editor-actions/focus/focus-landing.d.ts +7 -0
  409. package/dist/editor-actions/focus/focus-landing.js +39 -0
  410. package/dist/editor-actions/focus/focus.d.ts +7 -0
  411. package/dist/editor-actions/focus/focus.js +74 -0
  412. package/dist/editor-actions/index.d.ts +15 -0
  413. package/dist/editor-actions/index.js +19 -0
  414. package/dist/editor-actions/inline-range-commit.d.ts +20 -0
  415. package/dist/editor-actions/inline-range-commit.js +63 -0
  416. package/dist/editor-actions/list-context.d.ts +25 -0
  417. package/dist/editor-actions/list-context.js +285 -0
  418. package/dist/editor-actions/list-overrides.d.ts +13 -0
  419. package/dist/editor-actions/list-overrides.js +26 -0
  420. package/dist/editor-actions/merge-fallback.d.ts +19 -0
  421. package/dist/editor-actions/merge-fallback.js +27 -0
  422. package/dist/editor-actions/nested/nested-actions.d.ts +65 -0
  423. package/dist/editor-actions/nested/nested-actions.js +59 -0
  424. package/dist/editor-actions/nested/nested-block-edit.d.ts +10 -0
  425. package/dist/editor-actions/nested/nested-block-edit.js +181 -0
  426. package/dist/editor-actions/nested/nested-focus.d.ts +9 -0
  427. package/dist/editor-actions/nested/nested-focus.js +30 -0
  428. package/dist/editor-actions/paste-coordinator.d.ts +4 -0
  429. package/dist/editor-actions/paste-coordinator.js +20 -0
  430. package/dist/editor-actions/plugin/chrome-leaf.d.ts +25 -0
  431. package/dist/editor-actions/plugin/chrome-leaf.js +80 -0
  432. package/dist/editor-actions/plugin/container.d.ts +137 -0
  433. package/dist/editor-actions/plugin/container.js +351 -0
  434. package/dist/editor-actions/plugin/directive-container.d.ts +13 -0
  435. package/dist/editor-actions/plugin/directive-container.js +31 -0
  436. package/dist/editor-actions/reorder-action.d.ts +17 -0
  437. package/dist/editor-actions/reorder-action.js +104 -0
  438. package/dist/editor-actions/reorder-drag.d.ts +34 -0
  439. package/dist/editor-actions/reorder-drag.js +152 -0
  440. package/dist/editor-actions/replacement-focus.d.ts +27 -0
  441. package/dist/editor-actions/replacement-focus.js +60 -0
  442. package/dist/editor-actions/search-replace.d.ts +6 -0
  443. package/dist/editor-actions/search-replace.js +145 -0
  444. package/dist/editor-actions/table-context.d.ts +34 -0
  445. package/dist/editor-actions/table-context.js +292 -0
  446. package/dist/editor-actions/unwrap-strategies.d.ts +14 -0
  447. package/dist/editor-actions/unwrap-strategies.js +131 -0
  448. package/dist/editor-actions/whole-block-focus-surface.d.ts +51 -0
  449. package/dist/editor-actions/whole-block-focus-surface.js +171 -0
  450. package/dist/editor-events.d.ts +89 -0
  451. package/dist/editor-events.js +96 -0
  452. package/dist/editor-keys.d.ts +197 -0
  453. package/dist/editor-keys.js +40 -0
  454. package/dist/editor-props.d.ts +164 -0
  455. package/dist/editor-props.js +1 -0
  456. package/dist/editor-rects.d.ts +58 -0
  457. package/dist/editor-rects.js +114 -0
  458. package/dist/env.d.ts +12 -0
  459. package/dist/env.js +20 -0
  460. package/dist/index.d.ts +27 -0
  461. package/dist/index.js +19 -0
  462. package/dist/invariants/commit-paths.d.ts +10 -0
  463. package/dist/invariants/commit-paths.js +25 -0
  464. package/dist/invariants/commit-scope.d.ts +9 -0
  465. package/dist/invariants/commit-scope.js +16 -0
  466. package/dist/invariants/context-keys.d.ts +7 -0
  467. package/dist/invariants/context-keys.js +14 -0
  468. package/dist/invariants/descriptor.d.ts +10 -0
  469. package/dist/invariants/descriptor.js +24 -0
  470. package/dist/invariants/inline-transitions.d.ts +23 -0
  471. package/dist/invariants/inline-transitions.js +52 -0
  472. package/dist/invariants/install.d.ts +36 -0
  473. package/dist/invariants/install.js +66 -0
  474. package/dist/invariants/landable-caret.d.ts +12 -0
  475. package/dist/invariants/landable-caret.js +31 -0
  476. package/dist/invariants/marker-css-parity.d.ts +10 -0
  477. package/dist/invariants/marker-css-parity.js +87 -0
  478. package/dist/invariants/node-shape.d.ts +44 -0
  479. package/dist/invariants/node-shape.js +258 -0
  480. package/dist/invariants/registry.d.ts +126 -0
  481. package/dist/invariants/registry.js +349 -0
  482. package/dist/invariants/render-fidelity.d.ts +8 -0
  483. package/dist/invariants/render-fidelity.js +33 -0
  484. package/dist/invariants/selection-endpoints.d.ts +19 -0
  485. package/dist/invariants/selection-endpoints.js +78 -0
  486. package/dist/invariants/single-node-sink.d.ts +9 -0
  487. package/dist/invariants/single-node-sink.js +16 -0
  488. package/dist/invariants/snapshot-integrity.d.ts +17 -0
  489. package/dist/invariants/snapshot-integrity.js +24 -0
  490. package/dist/invariants/split-landing.d.ts +8 -0
  491. package/dist/invariants/split-landing.js +15 -0
  492. package/dist/invariants/structural-descriptor.d.ts +21 -0
  493. package/dist/invariants/structural-descriptor.js +50 -0
  494. package/dist/perf/instruments.d.ts +49 -0
  495. package/dist/perf/instruments.js +154 -0
  496. package/dist/perf/use-mount-gauge.svelte.d.ts +1 -0
  497. package/dist/perf/use-mount-gauge.svelte.js +15 -0
  498. package/dist/plugin.d.ts +102 -0
  499. package/dist/plugin.js +156 -0
  500. package/dist/plugins/admonitions/AdmonitionBlock.svelte +144 -0
  501. package/dist/plugins/admonitions/AdmonitionBlock.svelte.d.ts +11 -0
  502. package/dist/plugins/admonitions/admonition-kind.d.ts +8 -0
  503. package/dist/plugins/admonitions/admonition-kind.js +97 -0
  504. package/dist/plugins/admonitions/convert-document.d.ts +11 -0
  505. package/dist/plugins/admonitions/convert-document.js +39 -0
  506. package/dist/plugins/admonitions/gh-alert.d.ts +13 -0
  507. package/dist/plugins/admonitions/gh-alert.js +83 -0
  508. package/dist/plugins/admonitions/github-alert-kind.d.ts +12 -0
  509. package/dist/plugins/admonitions/github-alert-kind.js +125 -0
  510. package/dist/plugins/admonitions/index.d.ts +6 -0
  511. package/dist/plugins/admonitions/index.js +8 -0
  512. package/dist/plugins/admonitions/kinds.d.ts +26 -0
  513. package/dist/plugins/admonitions/kinds.js +18 -0
  514. package/dist/plugins/admonitions/register.d.ts +7 -0
  515. package/dist/plugins/admonitions/register.js +12 -0
  516. package/dist/plugins/details/DetailsBlock.svelte +129 -0
  517. package/dist/plugins/details/DetailsBlock.svelte.d.ts +11 -0
  518. package/dist/plugins/details/details-disclosure.svelte.d.ts +17 -0
  519. package/dist/plugins/details/details-disclosure.svelte.js +24 -0
  520. package/dist/plugins/details/details-kind.d.ts +25 -0
  521. package/dist/plugins/details/details-kind.js +237 -0
  522. package/dist/plugins/details/index.d.ts +2 -0
  523. package/dist/plugins/details/index.js +2 -0
  524. package/dist/plugins/details/register.d.ts +6 -0
  525. package/dist/plugins/details/register.js +15 -0
  526. package/dist/plugins/emoji/emoji-plugin.d.ts +2 -0
  527. package/dist/plugins/emoji/emoji-plugin.js +10 -0
  528. package/dist/plugins/emoji/emoji-recognizer.d.ts +18 -0
  529. package/dist/plugins/emoji/emoji-recognizer.js +63 -0
  530. package/dist/plugins/emoji/emoji-table.d.ts +1 -0
  531. package/dist/plugins/emoji/emoji-table.js +1919 -0
  532. package/dist/plugins/emoji/index.d.ts +3 -0
  533. package/dist/plugins/emoji/index.js +4 -0
  534. package/dist/plugins/footnotes/FootnoteDefinition.svelte +103 -0
  535. package/dist/plugins/footnotes/FootnoteDefinition.svelte.d.ts +13 -0
  536. package/dist/plugins/footnotes/FootnoteReference.svelte +50 -0
  537. package/dist/plugins/footnotes/FootnoteReference.svelte.d.ts +4 -0
  538. package/dist/plugins/footnotes/constants.d.ts +2 -0
  539. package/dist/plugins/footnotes/constants.js +4 -0
  540. package/dist/plugins/footnotes/footnote-definition.d.ts +14 -0
  541. package/dist/plugins/footnotes/footnote-definition.js +147 -0
  542. package/dist/plugins/footnotes/footnote-lookup.d.ts +9 -0
  543. package/dist/plugins/footnotes/footnote-lookup.js +33 -0
  544. package/dist/plugins/footnotes/footnote-numbering.d.ts +23 -0
  545. package/dist/plugins/footnotes/footnote-numbering.js +78 -0
  546. package/dist/plugins/footnotes/footnote-reference.d.ts +7 -0
  547. package/dist/plugins/footnotes/footnote-reference.js +54 -0
  548. package/dist/plugins/footnotes/footnotes-plugin.d.ts +7 -0
  549. package/dist/plugins/footnotes/footnotes-plugin.js +17 -0
  550. package/dist/plugins/footnotes/index.d.ts +5 -0
  551. package/dist/plugins/footnotes/index.js +6 -0
  552. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +17 -0
  553. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +31 -0
  554. package/dist/plugins/highlight-occurrences/index.d.ts +1 -0
  555. package/dist/plugins/highlight-occurrences/index.js +1 -0
  556. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +26 -0
  557. package/dist/plugins/highlight-occurrences/occurrence-source.js +54 -0
  558. package/dist/plugins/highlight-occurrences/occurrences.d.ts +33 -0
  559. package/dist/plugins/highlight-occurrences/occurrences.js +108 -0
  560. package/dist/plugins/latex/BlockMath.svelte +119 -0
  561. package/dist/plugins/latex/BlockMath.svelte.d.ts +21 -0
  562. package/dist/plugins/latex/MathInline.svelte +28 -0
  563. package/dist/plugins/latex/MathInline.svelte.d.ts +4 -0
  564. package/dist/plugins/latex/index.d.ts +3 -0
  565. package/dist/plugins/latex/index.js +4 -0
  566. package/dist/plugins/latex/latex-kind.d.ts +17 -0
  567. package/dist/plugins/latex/latex-kind.js +224 -0
  568. package/dist/plugins/latex/math-completion.d.ts +10 -0
  569. package/dist/plugins/latex/math-completion.js +19 -0
  570. package/dist/plugins/latex/math-renderer.d.ts +26 -0
  571. package/dist/plugins/latex/math-renderer.js +42 -0
  572. package/dist/plugins/latex/register.d.ts +10 -0
  573. package/dist/plugins/latex/register.js +23 -0
  574. package/dist/plugins/latex/renderer.d.ts +13 -0
  575. package/dist/plugins/latex/renderer.js +34 -0
  576. package/dist/plugins/mermaid/MermaidBlock.svelte +572 -0
  577. package/dist/plugins/mermaid/MermaidBlock.svelte.d.ts +11 -0
  578. package/dist/plugins/mermaid/index.d.ts +3 -0
  579. package/dist/plugins/mermaid/index.js +3 -0
  580. package/dist/plugins/mermaid/mermaid-kind.d.ts +38 -0
  581. package/dist/plugins/mermaid/mermaid-kind.js +176 -0
  582. package/dist/plugins/mermaid/mermaid-renderer.d.ts +28 -0
  583. package/dist/plugins/mermaid/mermaid-renderer.js +35 -0
  584. package/dist/plugins/mermaid/register.d.ts +10 -0
  585. package/dist/plugins/mermaid/register.js +20 -0
  586. package/dist/plugins/mermaid/renderer.d.ts +11 -0
  587. package/dist/plugins/mermaid/renderer.js +53 -0
  588. package/dist/plugins/parrot/ParrotBlock.svelte +342 -0
  589. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +21 -0
  590. package/dist/plugins/parrot/index.d.ts +1 -0
  591. package/dist/plugins/parrot/index.js +2 -0
  592. package/dist/plugins/parrot/parrot-plugin.d.ts +3 -0
  593. package/dist/plugins/parrot/parrot-plugin.js +49 -0
  594. package/dist/plugins/toc/TocBlock.svelte +218 -0
  595. package/dist/plugins/toc/TocBlock.svelte.d.ts +24 -0
  596. package/dist/plugins/toc/heading-outline.d.ts +28 -0
  597. package/dist/plugins/toc/heading-outline.js +65 -0
  598. package/dist/plugins/toc/index.d.ts +2 -0
  599. package/dist/plugins/toc/index.js +2 -0
  600. package/dist/plugins/toc/navigation-queue.d.ts +12 -0
  601. package/dist/plugins/toc/navigation-queue.js +21 -0
  602. package/dist/plugins/toc/toc-plugin.d.ts +16 -0
  603. package/dist/plugins/toc/toc-plugin.js +71 -0
  604. package/dist/presentation-mode.d.ts +32 -0
  605. package/dist/presentation-mode.js +50 -0
  606. package/dist/reactivity/block-list-state.svelte.d.ts +22 -0
  607. package/dist/reactivity/block-list-state.svelte.js +46 -0
  608. package/dist/reactivity/block-window.svelte.d.ts +41 -0
  609. package/dist/reactivity/block-window.svelte.js +93 -0
  610. package/dist/reactivity/content-version.svelte.d.ts +14 -0
  611. package/dist/reactivity/content-version.svelte.js +16 -0
  612. package/dist/reactivity/list-windowing.svelte.d.ts +100 -0
  613. package/dist/reactivity/list-windowing.svelte.js +402 -0
  614. package/dist/reactivity/measure-batch.d.ts +15 -0
  615. package/dist/reactivity/measure-batch.js +18 -0
  616. package/dist/reactivity/publish-ref.svelte.d.ts +54 -0
  617. package/dist/reactivity/publish-ref.svelte.js +128 -0
  618. package/dist/reactivity/scope-geometry.d.ts +18 -0
  619. package/dist/reactivity/scope-geometry.js +29 -0
  620. package/dist/reactivity/state-registry.d.ts +10 -0
  621. package/dist/reactivity/state-registry.js +44 -0
  622. package/dist/reactivity/use-container-windowing.svelte.d.ts +35 -0
  623. package/dist/reactivity/use-container-windowing.svelte.js +95 -0
  624. package/dist/reactivity/window-slice.d.ts +11 -0
  625. package/dist/reactivity/window-slice.js +9 -0
  626. package/dist/scan-index.d.ts +11 -0
  627. package/dist/scan-index.js +27 -0
  628. package/dist/schema/block-commands.d.ts +105 -0
  629. package/dist/schema/block-commands.js +179 -0
  630. package/dist/schema/block-completions.d.ts +33 -0
  631. package/dist/schema/block-completions.js +49 -0
  632. package/dist/schema/block-component-registry.d.ts +33 -0
  633. package/dist/schema/block-component-registry.js +33 -0
  634. package/dist/schema/block-kind-descriptor.d.ts +281 -0
  635. package/dist/schema/block-kind-descriptor.js +187 -0
  636. package/dist/schema/block-openers.d.ts +94 -0
  637. package/dist/schema/block-openers.js +150 -0
  638. package/dist/schema/built-in-descriptors.d.ts +8 -0
  639. package/dist/schema/built-in-descriptors.js +560 -0
  640. package/dist/schema/child-spans.d.ts +25 -0
  641. package/dist/schema/child-spans.js +161 -0
  642. package/dist/schema/closure.d.ts +39 -0
  643. package/dist/schema/closure.js +55 -0
  644. package/dist/schema/command-id.d.ts +20 -0
  645. package/dist/schema/command-id.js +42 -0
  646. package/dist/schema/commands.d.ts +147 -0
  647. package/dist/schema/commands.js +294 -0
  648. package/dist/schema/container-raw.d.ts +21 -0
  649. package/dist/schema/container-raw.js +43 -0
  650. package/dist/schema/container-rebuilders.d.ts +32 -0
  651. package/dist/schema/container-rebuilders.js +95 -0
  652. package/dist/schema/define-plugin-block.d.ts +15 -0
  653. package/dist/schema/define-plugin-block.js +18 -0
  654. package/dist/schema/fenced-code-raw.d.ts +43 -0
  655. package/dist/schema/fenced-code-raw.js +220 -0
  656. package/dist/schema/global-commands.d.ts +11 -0
  657. package/dist/schema/global-commands.js +40 -0
  658. package/dist/schema/inline-construct-policy.d.ts +131 -0
  659. package/dist/schema/inline-construct-policy.js +96 -0
  660. package/dist/schema/keybinding-overrides.d.ts +39 -0
  661. package/dist/schema/keybinding-overrides.js +43 -0
  662. package/dist/schema/keybindings.d.ts +36 -0
  663. package/dist/schema/keybindings.js +75 -0
  664. package/dist/schema/merge-rules.d.ts +28 -0
  665. package/dist/schema/merge-rules.js +57 -0
  666. package/dist/schema/opener-priorities.d.ts +16 -0
  667. package/dist/schema/opener-priorities.js +16 -0
  668. package/dist/schema/operations.d.ts +110 -0
  669. package/dist/schema/operations.js +6 -0
  670. package/dist/schema/plugin-activation.d.ts +13 -0
  671. package/dist/schema/plugin-activation.js +18 -0
  672. package/dist/schema/plugin-editor-context.d.ts +33 -0
  673. package/dist/schema/plugin-editor-context.js +65 -0
  674. package/dist/schema/plugin-install.d.ts +58 -0
  675. package/dist/schema/plugin-install.js +132 -0
  676. package/dist/schema/plugin-kind.d.ts +21 -0
  677. package/dist/schema/plugin-kind.js +86 -0
  678. package/dist/schema/plugin-name.d.ts +1 -0
  679. package/dist/schema/plugin-name.js +7 -0
  680. package/dist/schema/register-once.d.ts +9 -0
  681. package/dist/schema/register-once.js +35 -0
  682. package/dist/schema/registration-checks.d.ts +32 -0
  683. package/dist/schema/registration-checks.js +122 -0
  684. package/dist/schema/registration-pending.d.ts +28 -0
  685. package/dist/schema/registration-pending.js +48 -0
  686. package/dist/schema/registry-reset.d.ts +7 -0
  687. package/dist/schema/registry-reset.js +30 -0
  688. package/dist/schema/registry-view.d.ts +30 -0
  689. package/dist/schema/registry-view.js +39 -0
  690. package/dist/schema/reserved-chords.d.ts +35 -0
  691. package/dist/schema/reserved-chords.js +313 -0
  692. package/dist/schema/reserved-chrome.d.ts +23 -0
  693. package/dist/schema/reserved-chrome.js +33 -0
  694. package/dist/schema/table-cell-raw.d.ts +14 -0
  695. package/dist/schema/table-cell-raw.js +30 -0
  696. package/dist/schema/whole-block-unit.d.ts +8 -0
  697. package/dist/schema/whole-block-unit.js +12 -0
  698. package/dist/search/document-scan.d.ts +22 -0
  699. package/dist/search/document-scan.js +39 -0
  700. package/dist/search/matcher.d.ts +31 -0
  701. package/dist/search/matcher.js +70 -0
  702. package/dist/search/regex-executor.d.ts +41 -0
  703. package/dist/search/regex-executor.js +165 -0
  704. package/dist/search/replace.d.ts +15 -0
  705. package/dist/search/replace.js +29 -0
  706. package/dist/search/search-state.svelte.d.ts +59 -0
  707. package/dist/search/search-state.svelte.js +231 -0
  708. package/dist/selection/autoscroll.d.ts +26 -0
  709. package/dist/selection/autoscroll.js +91 -0
  710. package/dist/selection/block-hit-test.d.ts +37 -0
  711. package/dist/selection/block-hit-test.js +59 -0
  712. package/dist/selection/caret-doors.d.ts +20 -0
  713. package/dist/selection/caret-doors.js +44 -0
  714. package/dist/selection/caret-restore.d.ts +15 -0
  715. package/dist/selection/caret-restore.js +32 -0
  716. package/dist/selection/char-endpoint-snap.d.ts +15 -0
  717. package/dist/selection/char-endpoint-snap.js +39 -0
  718. package/dist/selection/clipboard-text.d.ts +13 -0
  719. package/dist/selection/clipboard-text.js +314 -0
  720. package/dist/selection/cross-block/clipboard.d.ts +14 -0
  721. package/dist/selection/cross-block/clipboard.js +20 -0
  722. package/dist/selection/cross-block/dispatch.d.ts +78 -0
  723. package/dist/selection/cross-block/dispatch.js +57 -0
  724. package/dist/selection/cross-block/format-range.d.ts +38 -0
  725. package/dist/selection/cross-block/format-range.js +193 -0
  726. package/dist/selection/cross-block/format-toggle.d.ts +27 -0
  727. package/dist/selection/cross-block/format-toggle.js +109 -0
  728. package/dist/selection/cross-block/keydown.d.ts +11 -0
  729. package/dist/selection/cross-block/keydown.js +339 -0
  730. package/dist/selection/cross-block/ops.d.ts +56 -0
  731. package/dist/selection/cross-block/ops.js +210 -0
  732. package/dist/selection/cross-block/paste.d.ts +8 -0
  733. package/dist/selection/cross-block/paste.js +156 -0
  734. package/dist/selection/cross-block/pointer.d.ts +19 -0
  735. package/dist/selection/cross-block/pointer.js +80 -0
  736. package/dist/selection/cross-block/type-replace.d.ts +10 -0
  737. package/dist/selection/cross-block/type-replace.js +129 -0
  738. package/dist/selection/dead-space-caret.d.ts +39 -0
  739. package/dist/selection/dead-space-caret.js +173 -0
  740. package/dist/selection/drag-pointer.d.ts +22 -0
  741. package/dist/selection/drag-pointer.js +89 -0
  742. package/dist/selection/gap-caret.d.ts +47 -0
  743. package/dist/selection/gap-caret.js +72 -0
  744. package/dist/selection/keyboard-extend.d.ts +43 -0
  745. package/dist/selection/keyboard-extend.js +257 -0
  746. package/dist/selection/native-bridge.d.ts +47 -0
  747. package/dist/selection/native-bridge.js +204 -0
  748. package/dist/selection/nearest-block.d.ts +43 -0
  749. package/dist/selection/nearest-block.js +73 -0
  750. package/dist/selection/path-lookup.d.ts +32 -0
  751. package/dist/selection/path-lookup.js +132 -0
  752. package/dist/selection/path-math.d.ts +35 -0
  753. package/dist/selection/path-math.js +90 -0
  754. package/dist/selection/pointer-session.d.ts +43 -0
  755. package/dist/selection/pointer-session.js +111 -0
  756. package/dist/selection/primitives.d.ts +75 -0
  757. package/dist/selection/primitives.js +91 -0
  758. package/dist/selection/range-delete-ceremony.d.ts +85 -0
  759. package/dist/selection/range-delete-ceremony.js +197 -0
  760. package/dist/selection/range-delete-chrome.d.ts +39 -0
  761. package/dist/selection/range-delete-chrome.js +105 -0
  762. package/dist/selection/range-delete-table-coverage.d.ts +28 -0
  763. package/dist/selection/range-delete-table-coverage.js +168 -0
  764. package/dist/selection/range-delete-table.d.ts +16 -0
  765. package/dist/selection/range-delete-table.js +347 -0
  766. package/dist/selection/range-delete.d.ts +33 -0
  767. package/dist/selection/range-delete.js +121 -0
  768. package/dist/selection/selection-description.d.ts +7 -0
  769. package/dist/selection/selection-description.js +18 -0
  770. package/dist/selection/selection-restore.d.ts +46 -0
  771. package/dist/selection/selection-restore.js +66 -0
  772. package/dist/selection/selection-state.svelte.d.ts +72 -0
  773. package/dist/selection/selection-state.svelte.js +247 -0
  774. package/dist/selection/shared-keydown.d.ts +61 -0
  775. package/dist/selection/shared-keydown.js +150 -0
  776. package/dist/selection/table-endpoint-snap.d.ts +55 -0
  777. package/dist/selection/table-endpoint-snap.js +143 -0
  778. package/dist/selection/table-rect-extend.d.ts +23 -0
  779. package/dist/selection/table-rect-extend.js +46 -0
  780. package/dist/selection/widget-range-paint.d.ts +12 -0
  781. package/dist/selection/widget-range-paint.js +44 -0
  782. package/dist/styles/editor-theme.css +151 -0
  783. package/dist/styles/editor.css +585 -0
  784. package/dist/testing/conformance-core.d.ts +45 -0
  785. package/dist/testing/conformance-core.js +105 -0
  786. package/dist/testing/container-conformance.d.ts +137 -0
  787. package/dist/testing/container-conformance.js +533 -0
  788. package/dist/testing/headless-actions.d.ts +37 -0
  789. package/dist/testing/headless-actions.js +118 -0
  790. package/dist/testing/inline-conformance.d.ts +50 -0
  791. package/dist/testing/inline-conformance.js +442 -0
  792. package/dist/testing/kind-conformance.d.ts +54 -0
  793. package/dist/testing/kind-conformance.js +325 -0
  794. package/dist/testing/mount-dom-stubs.d.ts +8 -0
  795. package/dist/testing/mount-dom-stubs.js +19 -0
  796. package/dist/testing/parse-convergence.d.ts +14 -0
  797. package/dist/testing/parse-convergence.js +81 -0
  798. package/dist/testing.d.ts +20 -0
  799. package/dist/testing.js +61 -0
  800. package/dist/tree-operations/blockquote.d.ts +18 -0
  801. package/dist/tree-operations/blockquote.js +59 -0
  802. package/dist/tree-operations/children.d.ts +17 -0
  803. package/dist/tree-operations/children.js +56 -0
  804. package/dist/tree-operations/cleanup.d.ts +10 -0
  805. package/dist/tree-operations/cleanup.js +25 -0
  806. package/dist/tree-operations/clone.d.ts +5 -0
  807. package/dist/tree-operations/clone.js +43 -0
  808. package/dist/tree-operations/container-lift.d.ts +9 -0
  809. package/dist/tree-operations/container-lift.js +29 -0
  810. package/dist/tree-operations/index.d.ts +16 -0
  811. package/dist/tree-operations/index.js +14 -0
  812. package/dist/tree-operations/list/empty-check.d.ts +7 -0
  813. package/dist/tree-operations/list/empty-check.js +19 -0
  814. package/dist/tree-operations/list/exit-replacement.d.ts +13 -0
  815. package/dist/tree-operations/list/exit-replacement.js +49 -0
  816. package/dist/tree-operations/list/item-partition.d.ts +13 -0
  817. package/dist/tree-operations/list/item-partition.js +33 -0
  818. package/dist/tree-operations/list/list-builders.d.ts +44 -0
  819. package/dist/tree-operations/list/list-builders.js +129 -0
  820. package/dist/tree-operations/list/ordered-markers.d.ts +36 -0
  821. package/dist/tree-operations/list/ordered-markers.js +114 -0
  822. package/dist/tree-operations/list/reconcile-task.d.ts +12 -0
  823. package/dist/tree-operations/list/reconcile-task.js +47 -0
  824. package/dist/tree-operations/list/sublist-separator.d.ts +13 -0
  825. package/dist/tree-operations/list/sublist-separator.js +34 -0
  826. package/dist/tree-operations/list/terminator.d.ts +17 -0
  827. package/dist/tree-operations/list/terminator.js +60 -0
  828. package/dist/tree-operations/list/unwrap-merge.d.ts +29 -0
  829. package/dist/tree-operations/list/unwrap-merge.js +202 -0
  830. package/dist/tree-operations/node-ops.d.ts +296 -0
  831. package/dist/tree-operations/node-ops.js +1428 -0
  832. package/dist/tree-operations/parse-block.d.ts +3 -0
  833. package/dist/tree-operations/parse-block.js +8 -0
  834. package/dist/tree-operations/paste/apply.d.ts +12 -0
  835. package/dist/tree-operations/paste/apply.js +75 -0
  836. package/dist/tree-operations/paste/body-write.d.ts +19 -0
  837. package/dist/tree-operations/paste/body-write.js +53 -0
  838. package/dist/tree-operations/paste/container-match.d.ts +32 -0
  839. package/dist/tree-operations/paste/container-match.js +238 -0
  840. package/dist/tree-operations/paste/container-paste.d.ts +10 -0
  841. package/dist/tree-operations/paste/container-paste.js +27 -0
  842. package/dist/tree-operations/paste/dispatch.d.ts +61 -0
  843. package/dist/tree-operations/paste/dispatch.js +138 -0
  844. package/dist/tree-operations/paste/find-enclosing-list.d.ts +8 -0
  845. package/dist/tree-operations/paste/find-enclosing-list.js +30 -0
  846. package/dist/tree-operations/paste/focus-target.d.ts +27 -0
  847. package/dist/tree-operations/paste/focus-target.js +40 -0
  848. package/dist/tree-operations/paste/hooks.d.ts +17 -0
  849. package/dist/tree-operations/paste/hooks.js +80 -0
  850. package/dist/tree-operations/paste/list-absorb.d.ts +29 -0
  851. package/dist/tree-operations/paste/list-absorb.js +106 -0
  852. package/dist/tree-operations/paste/list-break-out.d.ts +42 -0
  853. package/dist/tree-operations/paste/list-break-out.js +136 -0
  854. package/dist/tree-operations/paste/parent-scope.d.ts +17 -0
  855. package/dist/tree-operations/paste/parent-scope.js +35 -0
  856. package/dist/tree-operations/paste/paste-deps.d.ts +20 -0
  857. package/dist/tree-operations/paste/paste-deps.js +6 -0
  858. package/dist/tree-operations/paste/paste-replacement.d.ts +8 -0
  859. package/dist/tree-operations/paste/paste-replacement.js +60 -0
  860. package/dist/tree-operations/paste/paste-transforms.d.ts +25 -0
  861. package/dist/tree-operations/paste/paste-transforms.js +72 -0
  862. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +29 -0
  863. package/dist/tree-operations/paste/replace-block-at-parent.js +75 -0
  864. package/dist/tree-operations/paste/strategy.d.ts +9 -0
  865. package/dist/tree-operations/paste/strategy.js +20 -0
  866. package/dist/tree-operations/paste/table-slice.d.ts +10 -0
  867. package/dist/tree-operations/paste/table-slice.js +39 -0
  868. package/dist/tree-operations/paste-surfaces.d.ts +61 -0
  869. package/dist/tree-operations/paste-surfaces.js +15 -0
  870. package/dist/tree-operations/path-mutate.d.ts +12 -0
  871. package/dist/tree-operations/path-mutate.js +20 -0
  872. package/dist/tree-operations/reorder-unit.d.ts +17 -0
  873. package/dist/tree-operations/reorder-unit.js +37 -0
  874. package/dist/tree-operations/reorder.d.ts +13 -0
  875. package/dist/tree-operations/reorder.js +57 -0
  876. package/dist/tree-operations/sharing.d.ts +18 -0
  877. package/dist/tree-operations/sharing.js +14 -0
  878. package/dist/tree-operations/splice-many.d.ts +9 -0
  879. package/dist/tree-operations/splice-many.js +22 -0
  880. package/dist/tree-operations/structural-change.d.ts +65 -0
  881. package/dist/tree-operations/structural-change.js +117 -0
  882. package/dist/tree-operations/sub-table-copy.d.ts +6 -0
  883. package/dist/tree-operations/sub-table-copy.js +43 -0
  884. package/dist/tree-operations/table-mutations.d.ts +17 -0
  885. package/dist/tree-operations/table-mutations.js +101 -0
  886. package/dist/tree-operations/unshare.d.ts +101 -0
  887. package/dist/tree-operations/unshare.js +248 -0
  888. package/dist/undo/manager.d.ts +2 -0
  889. package/dist/undo/manager.js +50 -0
  890. package/dist/undo/types.d.ts +44 -0
  891. package/dist/undo/types.js +7 -0
  892. package/docs/guide/consumer-guide.md +1098 -0
  893. package/docs/guide/directives.md +223 -0
  894. package/docs/guide/plugin-api.md +329 -0
  895. package/docs/guide/plugin-guide/conspiracy.gif +0 -0
  896. package/docs/guide/plugin-guide/parrot-frames.md +209 -0
  897. package/docs/guide/plugin-guide/parrot.gif +0 -0
  898. package/docs/guide/plugin-guide.md +1693 -0
  899. package/docs/guide/plugin-testing.md +463 -0
  900. package/package.json +238 -0
@@ -0,0 +1,1075 @@
1
+ <script lang="ts">
2
+ import { getContext, tick } from 'svelte';
3
+ import type { BlockEditActions, TableContext } from '../../../action-contracts';
4
+ import { type BlockComponent } from '../../../block-component';
5
+ import { type CommandId } from '../../../schema/commands';
6
+ import { eventToChord } from '../../../schema/keybindings';
7
+ import {
8
+ createInlineFormatActiveMemo,
9
+ toggleInlineFormat
10
+ } from '../../../core/inline/format-toggle';
11
+ import { paintsFocusedMarkers } from '../../../presentation-mode';
12
+ import {
13
+ inlineMarkForCommand,
14
+ type InlineMarkKind
15
+ } from '../../../schema/inline-construct-policy';
16
+ import type { NodeView } from '../../../core/node-views';
17
+ import {
18
+ EDITOR_DOC_KEY,
19
+ EDITOR_POLICIES_KEY,
20
+ EDITOR_SERVICES_KEY,
21
+ TABLE_CONTEXT_KEY,
22
+ type EditorDoc,
23
+ type EditorPolicies,
24
+ type EditorServices
25
+ } from '../../../editor-keys';
26
+ import type { TableAlignment } from '../../../core/nodes';
27
+ import { trimTrailingLineEnding, normalizeLineEndings } from '../../../core/lines';
28
+ import { pasteDispatch } from '../../../tree-operations/paste/dispatch';
29
+ import { blockNodeAt, cutRangeFromDisplay } from '../../../tree-operations/node-ops';
30
+ import { applyLiveRangeEdit } from '../text/live-selection-edit';
31
+ import { hasSelection as hasSelectionHelper } from '../../../cursor/content-offsets';
32
+ import { FALLBACK_CONTENT_WIDTH } from '../../../cursor/typography-estimates';
33
+ import {
34
+ rawTextOfNode,
35
+ containerDomTextLength,
36
+ landableDomTextBounds,
37
+ createRangeAtDomTextOffsets,
38
+ screenVisibilityOf,
39
+ selectionFocusWalkOffset
40
+ } from '../../../cursor/widget-offset';
41
+ import { asRawOffset, toDomTextOffset, type RawOffset } from '../../../cursor/coordinate-spaces';
42
+ import { createAmbientCursorIO } from '../../../ambient/ambient-cursor';
43
+ import { getCurrentCursorEditorRelativeX } from '../../../cursor/sticky-measure';
44
+ import { handleSharedKeydown, handleSharedBeforeInput } from '../../../selection/shared-keydown';
45
+ import {
46
+ createEditableSurface,
47
+ createClipboardHandlers,
48
+ consumePendingRestore
49
+ } from '../editable-surface';
50
+ import { wireSurfaceContexts, useParkFocusOnUnmount } from '../surface-wiring.svelte';
51
+ import { resetForPointerDown } from '../../../selection/cross-block/pointer';
52
+ import { publishRefSlot, type RefSlots } from '../../../reactivity/publish-ref.svelte';
53
+ import {
54
+ selectWholeDocument,
55
+ extendFocusToNextBlock,
56
+ extendFocusToPreviousBlock
57
+ } from '../../../selection/keyboard-extend';
58
+ import { intraTableRectExtension } from '../../../selection/table-rect-extend';
59
+ import { isAtFirstVisualLine, isAtLastVisualLine } from '../../../cursor/visual-lines';
60
+ import { cellKeydownPlan, type CellKeyPlan, type CellKeyState } from './cell-keydown-plan';
61
+ import { tableAxisCommand } from './cell-table-commands';
62
+ import { intraTableRectPayload } from './cell-clipboard';
63
+ import { escapedCellOffset } from './table-cell-paste';
64
+ import type { CellSelectionPoint, SelectionPoint } from '../../../selection/primitives';
65
+ import type { ClipboardAction } from './table-menu-model';
66
+ import {
67
+ installCellDragListener,
68
+ handleCellShiftClick,
69
+ cellCoordsOfElement,
70
+ type CellAnchor
71
+ } from './cell-pointer';
72
+ import { createCellRender } from './cell-render';
73
+ import type { IndexedDecoration } from '../../../decorations/buckets';
74
+ import type { ReplaceDecoration, WidgetDecoration } from '../../../decorations/types';
75
+ import { createWidgetInteraction } from '../text/widget-interaction';
76
+ import { createEdgePolicyDispatch } from '../text/edge-policy-dispatch';
77
+ import { createCompositionSeat } from '../text/composition-seat';
78
+ import { resolvedInlineContent } from '../../../core/inline/inline-cache';
79
+ import { widgetElByStart } from '../text/widget-adjacency';
80
+ import { getInlineWidgetEditing } from '../../../core/inline/inline-widgets';
81
+ import { enterLinkCardAtCaret, linkCardTargetAt } from '../../link-card/link-card-entry';
82
+
83
+ type ExitDirection = 'up' | 'down';
84
+
85
+ // The chord that continues a select-all run rather than ending it.
86
+ const SELECT_ALL_CHORD = 'Mod+A';
87
+
88
+ let {
89
+ node,
90
+ index,
91
+ myPath = [],
92
+ rowIdx,
93
+ columnCount,
94
+ rowCount,
95
+ alignment = 'none',
96
+ slots
97
+ }: {
98
+ node: NodeView;
99
+ index: number;
100
+ myPath?: number[];
101
+ rowIdx: number;
102
+ columnCount: number;
103
+ rowCount: number;
104
+ alignment?: TableAlignment;
105
+ slots?: RefSlots<BlockComponent>;
106
+ } = $props();
107
+
108
+ // A cell's position among its row's children IS its column.
109
+ const colIdx = $derived(index);
110
+
111
+ const wiring = wireSurfaceContexts();
112
+ const {
113
+ blockEdit: parentBlockEdit,
114
+ focusActions,
115
+ controller,
116
+ pasteCoordinator,
117
+ stickyColumn,
118
+ edgeAffinity,
119
+ selection,
120
+ getDoc,
121
+ getBlockElByPath,
122
+ getEditorRoot,
123
+ grammar,
124
+ activePlugins,
125
+ events: editorEvents,
126
+ linkRef
127
+ } = wiring.deps;
128
+ const tableContext = getContext<TableContext>(TABLE_CONTEXT_KEY);
129
+ const {
130
+ pendingMarks,
131
+ widgetSelection,
132
+ linkCard,
133
+ reorder,
134
+ rects,
135
+ decorations: decorationEngine
136
+ } = getContext<EditorServices>(EDITOR_SERVICES_KEY);
137
+ const {
138
+ presentationMode: getPresentationMode,
139
+ theme: getTheme,
140
+ resolveLinkUrl,
141
+ onPasteImage
142
+ } = getContext<EditorPolicies>(EDITOR_POLICIES_KEY);
143
+ const { contentVersion: getContentVersion, lifetime: editorLifetime } =
144
+ getContext<EditorDoc>(EDITOR_DOC_KEY);
145
+ const presentationMode = $derived(getPresentationMode?.() ?? 'source');
146
+ const readOnly = $derived(presentationMode === 'reading');
147
+
148
+ // A constant fallback keeps an empty island set out of the render key.
149
+ const NO_ISLANDS: IndexedDecoration<WidgetDecoration | ReplaceDecoration>[] = [];
150
+
151
+ // ── The cell's write door ───────────────────────────────────────────────
152
+ //
153
+ // Every write of this cell's raw goes through `blockEdit`; the escape is the kind's
154
+ // (`normalizeRawWrite`, at the write sink). The caret half stays here: `caretAfter` addresses
155
+ // the text the caller wrote, so the sink's backslashes move it; `caretBefore` addresses the
156
+ // already-escaped pre-write bytes and stays unmapped.
157
+ const blockEdit: BlockEditActions = {
158
+ ...parentBlockEdit,
159
+ updateBlockContent(i, text, caretBefore, caretAfter) {
160
+ const cellText = trimTrailingLineEnding(text);
161
+ return parentBlockEdit.updateBlockContent(
162
+ i,
163
+ cellText,
164
+ caretBefore,
165
+ caretAfter === undefined ? undefined : escapedCellOffset(cellText, caretAfter)
166
+ );
167
+ }
168
+ };
169
+
170
+ let el: HTMLDivElement | undefined = $state();
171
+ let composing = $state(false);
172
+ // A revealed widget source is ephemeral DOM, so onInput skips the per-keystroke CST
173
+ // commit and the cell commits once on reveal exit (mirrors TextEditableBlock).
174
+ let revealing = $state(false);
175
+ let pendingCursorOffset = $state<number | null>(null);
176
+
177
+ // The door's other half, and the ONLY write of `pendingCursorOffset` besides the render
178
+ // effect's clear. A pending cursor never passes through `blockEdit`, so the caller hands
179
+ // over the text its offset addresses; no text means it already stands in escaped space.
180
+ function parkCursor(offset: number | null, writtenText?: string): void {
181
+ pendingCursorOffset =
182
+ offset === null || writtenText === undefined
183
+ ? offset
184
+ : escapedCellOffset(writtenText, offset);
185
+ }
186
+
187
+ let preEditOffset = 0;
188
+ // Y is load-bearing for the reveal hit-test: a column-aligned click on another
189
+ // visual line must not reveal.
190
+ let lastClickClientX: number | null = null;
191
+ let lastClickClientY: number | null = null;
192
+
193
+ // Cells carry no ambient marker; at zero ambient the factory is plain widget-aware
194
+ // raw-unit cursor IO (textContent math undercounts widget bytes).
195
+ const cursor = createAmbientCursorIO({
196
+ getEl: () => el ?? null,
197
+ getAmbientLength: () => 0
198
+ });
199
+
200
+ const editableSurface = createEditableSurface({
201
+ ...wiring.deps,
202
+ // The wiring's blockEdit is the parent door; this surface writes through the
203
+ // cell's escaping one above.
204
+ blockEdit,
205
+ getEl: () => el ?? null,
206
+ getAmbientLength: () => 0,
207
+ isInputSuppressed: () => revealing,
208
+ backend: {
209
+ getRaw: () => cursor.getRaw(),
210
+ setRaw: (offset) => cursor.setRaw(offset),
211
+ buildRange: (start, end) =>
212
+ createRangeAtDomTextOffsets(el!, toDomTextOffset(start, 0), toDomTextOffset(end, 0))
213
+ },
214
+ getMyPath: () => myPath,
215
+ getIndex: () => index,
216
+ getComposing: () => composing,
217
+ setComposing: (value) => {
218
+ composing = value;
219
+ },
220
+ getPreEditOffset: () => preEditOffset,
221
+ setPreEditOffset: (offset) => {
222
+ preEditOffset = offset;
223
+ },
224
+ setPendingCursor: (offset) => parkCursor(offset),
225
+ getPresentationMode,
226
+ getFocusOffset: () => getRawFocusOffset(),
227
+ getTextLen: () => (el ? containerDomTextLength(el) : 0),
228
+ readText: () => readCellText(),
229
+ relocateComposedText: (after, composedAt) => compositionSeat.relocate(after, composedAt),
230
+ // `saved` re-focuses if the edit remounts the cell, so it is reported through
231
+ // the door's escape.
232
+ commitInput: (text, preEdit, saved) => {
233
+ void blockEdit.updateBlockContent(index, text, preEdit, saved);
234
+ return escapedCellOffset(text, saved);
235
+ }
236
+ });
237
+
238
+ // The same seat the keydown dispatch takes, for the one insertion a keydown cannot reach.
239
+ const compositionSeat = createCompositionSeat({
240
+ getDisplayText: () => trimTrailingLineEnding(node.raw),
241
+ getInlines: () => resolvedInlineContent(node, linkRef),
242
+ getAffinity: () => edgeAffinity.get(),
243
+ getScreen: () => screenVisibilityOf(el ?? null),
244
+ consumePendingMarks: () => pendingMarks.consume(),
245
+ restorePendingMarks: (marks) => pendingMarks.restore(marks)
246
+ });
247
+
248
+ const crossBlock = editableSurface.crossBlock;
249
+ const sharedCtx = editableSurface.sharedCtx;
250
+
251
+ // The prose inline-widget seams, threaded with cell-shaped deps: zero ambient, no
252
+ // snap overlay (cells render no image widgets), and the escaping blockEdit.
253
+ const widgetInteraction = createWidgetInteraction({
254
+ get node() {
255
+ return node;
256
+ },
257
+ get index() {
258
+ return index;
259
+ },
260
+ get myPath() {
261
+ return myPath;
262
+ },
263
+ getEl: () => el ?? null,
264
+ getAmbientLength: () => 0,
265
+ getEditorContentWidth: () => getEditorRoot()?.clientWidth ?? FALLBACK_CONTENT_WIDTH,
266
+ cursor,
267
+ widgetSelection,
268
+ blockEdit,
269
+ focusActions,
270
+ setSnapTarget: () => {},
271
+ setPendingCursor: (offset, writtenText) => parkCursor(offset, writtenText),
272
+ readRawText: () => readCellText(),
273
+ setRevealing: (value) => {
274
+ revealing = value;
275
+ },
276
+ isCrossBlock: () => selection.isCrossBlock,
277
+ getPresentationMode,
278
+ get linkRef() {
279
+ return linkRef;
280
+ }
281
+ });
282
+
283
+ // The one caret-edge dispatch (G4.12), same seam prose uses: a plain edge key against
284
+ // a CST widget or a decoration island resolves against its declarative policy.
285
+ const edgeDispatch = createEdgePolicyDispatch({
286
+ get node() {
287
+ return node;
288
+ },
289
+ get index() {
290
+ return index;
291
+ },
292
+ get containerParent() {
293
+ return blockNodeAt(getDoc(), myPath.slice(0, -1));
294
+ },
295
+ get linkRef() {
296
+ return linkRef;
297
+ },
298
+ getEl: () => el ?? null,
299
+ getAmbientLength: () => 0,
300
+ hasIslands: () =>
301
+ decorationEngine ? decorationEngine.islandsForPath(myPath).length > 0 : false,
302
+ getRawSelection: () => cursor.getRawSelection(),
303
+ blockEdit,
304
+ setPendingCursor: (offset, _source, writtenText) => parkCursor(offset, writtenText),
305
+ setSnapTarget: () => {},
306
+ isRevealing: () => widgetInteraction.isRevealing(),
307
+ // A non-reveal widget reached through this seam is an ARROW's entry, so step the
308
+ // caret over it like native contenteditable.
309
+ enterWidget: (widget, fromTrailingEdge) => {
310
+ if (getInlineWidgetEditing(widget.kind)?.revealSource) {
311
+ widgetInteraction.enterWidget(widget, fromTrailingEdge);
312
+ } else {
313
+ cursor.setRaw(asRawOffset(fromTrailingEdge ? widget.start : widget.end));
314
+ }
315
+ },
316
+ // A cell paints no widget-selection overlay, so the prose select-then-delete default
317
+ // would show nothing between the presses. Scoped to what the cell actually PAINTS as
318
+ // a widget, and merged onto the registered policy rather than replacing it.
319
+ widgetEdgePolicy: (widget) => {
320
+ const registered = getInlineWidgetEditing(widget.kind);
321
+ if (!el || registered?.revealSource) return undefined;
322
+ return widgetElByStart(el, widget.start)
323
+ ? { ...registered, deleteGranularity: 'atomic' }
324
+ : undefined;
325
+ },
326
+ isReading: () => readOnly,
327
+ getEdgeAffinity: () => edgeAffinity.get(),
328
+ pendingMarks,
329
+ installedAs: 'cell'
330
+ });
331
+
332
+ // ── BlockComponent interface ────────────────────────────────────────
333
+
334
+ export const editable = true;
335
+ export const focusable = true;
336
+
337
+ export const focus = editableSurface.surface.focus;
338
+ export const parkCaret = editableSurface.surface.parkCaret;
339
+ export const focusAtColumn = editableSurface.surface.focusAtColumn;
340
+ export const getCursorOffset = editableSurface.surface.getCursorOffset;
341
+ export const getSelectedText = editableSurface.surface.getSelectedText;
342
+ export const setSelection = editableSurface.surface.setSelection;
343
+ export const measurePartialRects = editableSurface.surface.measurePartialRects;
344
+
345
+ /** The card's query for this cell. `range` is null at the chord's arm, where a create would
346
+ * have to answer the pipe escapes in cell raw, and the live one at the pressed read. */
347
+ const linkCardQuery = (contentEl: HTMLElement, range: { start: number; end: number } | null) => ({
348
+ contentEl,
349
+ block: node,
350
+ path: myPath,
351
+ linkRef,
352
+ mode: presentationMode,
353
+ selection: range,
354
+ crossBlockRange: selection.isCrossBlock
355
+ });
356
+
357
+ // A toolbar asks once per button on every selection change, so the buttons share the parse.
358
+ const formatActive = createInlineFormatActiveMemo();
359
+
360
+ // The pressed-state read: the same cell text and selection the toggle itself takes, and for
361
+ // the card the same construct its own entry resolves.
362
+ export function isCommandActive(id: CommandId): boolean {
363
+ if (!el) return false;
364
+ const marked = inlineMarkForCommand(id);
365
+ if (!marked) {
366
+ if (id !== 'link.openCard') return false;
367
+ return linkCardTargetAt(linkCardQuery(el, cursor.getRawSelection())) !== null;
368
+ }
369
+ const caret = cursor.getRaw() ?? 0;
370
+ const selection = cursor.getRawSelection() ?? { start: caret, end: caret };
371
+ const cellText = readCellText();
372
+ return formatActive(
373
+ { display: cellText, content: { start: 0, end: cellText.length }, selection },
374
+ marked.kind
375
+ );
376
+ }
377
+
378
+ // Claims the chord even with no caret to act on: declining leaves Mod+B to the browser's
379
+ // own contenteditable bold, an edit this surface never authored.
380
+ function toggleFormat(format: InlineMarkKind): boolean {
381
+ if (!el) return true;
382
+ const caret = cursor.getRaw();
383
+ // A collapsed caret is the empty-pair contract, not a bail — see toggleInlineFormat.
384
+ const offsets =
385
+ cursor.getRawSelection() ?? (caret === null ? null : { start: caret, end: caret });
386
+ if (!offsets) return true;
387
+ // Same fork as the prose surface, on the same question the toggle door asks: a surface
388
+ // painting no delimiter would hold an abandoned empty pair as invisible garbage in the
389
+ // cell's bytes (live-mode.md § 4.3).
390
+ if (!paintsFocusedMarkers(presentationMode) && offsets.start === offsets.end) {
391
+ controller.flushDebouncedCheckpoint();
392
+ pendingMarks.toggle(format);
393
+ return true;
394
+ }
395
+ // A cell has no markers of its own, so the whole read is content — taken from the DOM text
396
+ // rather than `getContentRange(node)`, whose bytes carry the escapes the door writes.
397
+ const cellText = readCellText();
398
+ const result = toggleInlineFormat(
399
+ { display: cellText, content: { start: 0, end: cellText.length }, selection: offsets },
400
+ format,
401
+ presentationMode
402
+ );
403
+ if (!result) return true;
404
+ // Anchor undo at the live post-toggle caret: cross-block dispatch arrives with no
405
+ // preceding onKeyDown, so `preEditOffset` would be stale (mirrors TextEditableBlock).
406
+ // A command is not typing, so the toggle's bytes are their own undo step.
407
+ controller.isolateUndoEntry(() =>
408
+ blockEdit.updateBlockContent(index, result.newDisplay, result.newSelStart, result.newSelStart)
409
+ );
410
+ // The door may have inserted backslashes inside the toggled span, so both selection
411
+ // edges are read back through the escape.
412
+ const selStart = escapedCellOffset(result.newDisplay, result.newSelStart);
413
+ const selEnd = escapedCellOffset(result.newDisplay, result.newSelEnd);
414
+ void tick().then(() => setSelection(selStart, selEnd));
415
+ return true;
416
+ }
417
+
418
+ /**
419
+ * The cell's mutation funnel. A live reveal holds this cell's bytes in ephemeral DOM the CST
420
+ * has not seen, so a mutation would either splice the pre-reveal source or re-derive the whole
421
+ * row from cell raws — dropping the edit. Fold, settle, then act.
422
+ */
423
+ function afterRevealFold(run: () => void): void {
424
+ if (!widgetInteraction.isRevealing()) {
425
+ run();
426
+ return;
427
+ }
428
+ const fold = widgetInteraction.foldRevealBeforeMutation();
429
+ void (fold?.settled ?? tick()).then(run);
430
+ }
431
+
432
+ /** One arm per command this cell owns, resolved BEFORE any fold so the fold sits between
433
+ * resolution and mutation — the prose surface's split. Null declines the chord. */
434
+ function cellCommand(id: CommandId, contentEl: HTMLElement): (() => void) | null {
435
+ // The format chords are rows: the construct that declares a mark names the command that
436
+ // toggles it, so this surface grows a new one without an arm.
437
+ const marked = inlineMarkForCommand(id);
438
+ if (marked) return () => void toggleFormat(marked.kind);
439
+ // Consumed whether or not it enters, the prose surface's rule on this surface too:
440
+ // `reservedChords()` reports Mod+K as the editor's wherever the keymaps bind it.
441
+ if (id === 'link.openCard') {
442
+ return () => enterLinkCardAtCaret({ ...linkCardQuery(contentEl, null), card: linkCard });
443
+ }
444
+ const axisCommand = tableAxisCommand(id);
445
+ if (axisCommand) {
446
+ return () =>
447
+ void tableContext[axisCommand.action](axisCommand.axis === 'row' ? rowIdx : colIdx);
448
+ }
449
+ // Moves the whole table: the reorder walk resolves the unit at the nearest ancestor
450
+ // that reorders its children, which a table's grid rows are not.
451
+ if (id === 'block.moveUp' || id === 'block.moveDown') {
452
+ return () => void reorder.nudgeReorderUnit(myPath, id === 'block.moveUp' ? -1 : 1);
453
+ }
454
+ if (id !== 'cell.enter' && id !== 'cell.tab' && id !== 'cell.shiftTab') return null;
455
+ const plan = cellKeydownPlan(
456
+ {
457
+ key: id === 'cell.enter' ? 'Enter' : 'Tab',
458
+ ctrlOrMeta: false,
459
+ shiftKey: id === 'cell.shiftTab',
460
+ altKey: false
461
+ },
462
+ cellPlanState(cursor.getRaw() ?? 0)
463
+ );
464
+ if (plan.kind === 'native' || plan.kind === 'select-all-step') return null;
465
+ return () => void applyCellPlan(plan);
466
+ }
467
+
468
+ // Every chord the `tableCell` keymap binds arrives here, including from cross-block
469
+ // dispatch, which carries no event — so the 'native'/'select-all-step' plans are
470
+ // declined by the arm table and only the action plans run.
471
+ export function runCommand(id: CommandId): boolean {
472
+ if (!el) return false;
473
+ const perform = cellCommand(id, el);
474
+ if (!perform) return false;
475
+ afterRevealFold(perform);
476
+ return true;
477
+ }
478
+
479
+ // The ONE surface literal: the row mounts this cell with no `bind:this`, so the published slot
480
+ // is the only channel a caller reaches it through — and the parity G4.38 scans.
481
+ $effect(() => {
482
+ if (!slots) return;
483
+ const self = {
484
+ editable,
485
+ focusable,
486
+ focus,
487
+ parkCaret,
488
+ getCursorOffset,
489
+ focusAtColumn,
490
+ getSelectedText,
491
+ setSelection,
492
+ measurePartialRects,
493
+ runCommand,
494
+ getSelectionOffsets,
495
+ applyMenuClipboard,
496
+ snapCaretToPoint,
497
+ insertMarkdown: clipboard.insertMarkdown
498
+ } satisfies BlockComponent;
499
+ return publishRefSlot(slots, index, self, el);
500
+ });
501
+
502
+ // ── Render pipeline ────────────────────────────────────────────────────
503
+
504
+ const cellRender = createCellRender({
505
+ get el() {
506
+ return el ?? null;
507
+ },
508
+ get node() {
509
+ return node;
510
+ },
511
+ get linkRef() {
512
+ return linkRef;
513
+ },
514
+ resolveLinkUrl,
515
+ get presentationMode() {
516
+ return presentationMode;
517
+ },
518
+ getTheme,
519
+ getDocument: () => getDoc(),
520
+ getContentVersion,
521
+ navigateTo: (path) => rects.navigateTo(path),
522
+ get islands() {
523
+ return decorationEngine ? decorationEngine.islandsForPath(myPath) : NO_ISLANDS;
524
+ },
525
+ reportRenderError: (error) =>
526
+ editorEvents?.emit('error', { origin: 'render', error, context: { path: myPath } })
527
+ });
528
+
529
+ $effect(() => {
530
+ if (!el) return;
531
+ cellRender.render({
532
+ forceRebuild: pendingCursorOffset !== null,
533
+ carryCaret: pendingCursorOffset === null
534
+ });
535
+ if (pendingCursorOffset !== null) {
536
+ consumePendingRestore(el, pendingCursorOffset, (offset) =>
537
+ cursor.setRaw(asRawOffset(offset))
538
+ );
539
+ pendingCursorOffset = null;
540
+ }
541
+ });
542
+
543
+ $effect(() => () => cellRender.dispose());
544
+
545
+ useParkFocusOnUnmount(() => el ?? null, getEditorRoot);
546
+
547
+ // A selection move that leaves a revealed source but stays inside the cell folds the
548
+ // reveal; blur owns the focus-leaving fold. Composition suppresses it like onInput.
549
+ $effect(() => {
550
+ const root = el;
551
+ if (!root) return;
552
+ const handler = () => {
553
+ if (composing) return;
554
+ widgetInteraction.foldRevealIfSelectionEscaped();
555
+ };
556
+ document.addEventListener('selectionchange', handler);
557
+ return () => document.removeEventListener('selectionchange', handler);
558
+ });
559
+
560
+ // Not textContent: a rendered widget carries zero textContent but several raw bytes.
561
+ function readCellText(): string {
562
+ return el ? rawTextOfNode(el, node.raw) : '';
563
+ }
564
+
565
+ // Zero-ambient cell: the walk offset IS the raw offset.
566
+ function getRawFocusOffset(): RawOffset | null {
567
+ return el ? selectionFocusWalkOffset(el, 0) : null;
568
+ }
569
+
570
+ // ── Event handlers ─────────────────────────────────────────────────────
571
+
572
+ const onInput = editableSurface.onInput;
573
+ // Captured before the surface's own handler: its cross-block half clears the affinity, and
574
+ // the first mid-composition `input` re-arms it to the typed side.
575
+ function onCompositionStart(): void {
576
+ compositionSeat.noteStart();
577
+ editableSurface.onCompositionStart();
578
+ }
579
+
580
+ function onCompositionEnd(): void {
581
+ editableSurface.onCompositionEnd();
582
+ compositionSeat.noteEnd();
583
+ }
584
+
585
+ // Shared by the live keydown path and the cross-block dispatch entry, which differ
586
+ // only in where the offset comes from; both guard `el` before calling.
587
+ function cellPlanState(offset: number): CellKeyState {
588
+ // Zero-ambient cell: the walk offsets ARE the raw offsets the plan compares. Deliberately
589
+ // unguarded by mode, unlike the prose bounds — a cell's hop follows what is ON SCREEN, so
590
+ // the bound tracks preview-inline's proximity reveal.
591
+ const bounds = landableDomTextBounds(el!);
592
+ return {
593
+ rowIdx,
594
+ colIdx,
595
+ columnCount,
596
+ rowCount,
597
+ offset,
598
+ contentStart: bounds.start,
599
+ contentEnd: bounds.end,
600
+ collapsed: !hasSelectionHelper(),
601
+ selectAllCount: selection.selectAllCount
602
+ };
603
+ }
604
+
605
+ async function onKeyDown(e: KeyboardEvent): Promise<void> {
606
+ if (composing || !el) return;
607
+
608
+ // Ahead of the plan, in the shared prelude's position: the prelude's own reset is
609
+ // reachable only on the 'native' arm, so every key the plan claims would leave the
610
+ // select-all run armed. `eventToChord` declines bare modifiers and uppercases.
611
+ const chord = eventToChord(e);
612
+ if (chord !== null && chord !== SELECT_ALL_CHORD) selection.resetSelectAllCount();
613
+
614
+ // Must precede cellKeydownPlan, which claims arrows and preventDefaults without
615
+ // reaching here — leaving a live selection the next keystroke would range-replace.
616
+ if (selection.isCrossBlock && (await crossBlock.handleKeyDown(e))) return;
617
+
618
+ // Reveal/selection intercepts before the plan, which would otherwise read a
619
+ // mid-reveal ArrowUp/Down as cell nav.
620
+ if ((await widgetInteraction.handleRevealingKeydown(e)) || editableSurface.isDetached()) return;
621
+ // Enter is a cell's exception: prose splits, a cell hops rows, and hopping would
622
+ // carry the ephemeral edit out of the surface that owns it. Commit and stay put.
623
+ if (widgetInteraction.isRevealing() && e.key === 'Enter' && !e.ctrlKey && !e.metaKey) {
624
+ e.preventDefault();
625
+ widgetInteraction.foldRevealBeforeMutation();
626
+ return;
627
+ }
628
+ if ((await widgetInteraction.handleSelectedWidgetKeydown(e)) || editableSurface.isDetached())
629
+ return;
630
+ if (widgetInteraction.handleShiftArrowIntoWidget(e)) return;
631
+
632
+ preEditOffset = cursor.getRaw() ?? 0;
633
+
634
+ // FIRST, because neither the navigation plan's boundary branches nor the shared
635
+ // prelude's ArrowLeft@0 hop tests modifiers: either would eat the column reorder at
636
+ // a cell's left edge. Also the only point a consumer `keybindings` override reaches.
637
+ if (wiring.dispatchChord(e, { kind: node.kind, runCommand })) return;
638
+
639
+ const plan = cellKeydownPlan(
640
+ { key: e.key, ctrlOrMeta: e.ctrlKey || e.metaKey, shiftKey: e.shiftKey, altKey: e.altKey },
641
+ cellPlanState(preEditOffset)
642
+ );
643
+
644
+ switch (plan.kind) {
645
+ case 'native': {
646
+ // The first Shift+ArrowUp/Down at a cell's vertical edge takes a whole row;
647
+ // the shared prose extend would instead walk the next doc-order leaf.
648
+ if (
649
+ !selection.isCrossBlock &&
650
+ e.shiftKey &&
651
+ !e.altKey &&
652
+ !e.ctrlKey &&
653
+ !e.metaKey &&
654
+ (e.key === 'ArrowUp' || e.key === 'ArrowDown') &&
655
+ startIntraTableRect(e.key, preEditOffset)
656
+ ) {
657
+ e.preventDefault();
658
+ return;
659
+ }
660
+ if (await handleSharedKeydown(e, sharedCtx)) return;
661
+ // Runs only where the plan yielded 'native': at the text boundaries the plan
662
+ // claims, an entered widget sits outside the boundary and the dispatch declines.
663
+ if (edgeDispatch.handleKeydown(e, cursor.getRaw())) return;
664
+ return;
665
+ }
666
+ // Cells override the document-level 2-stage Ctrl+A with a 3-stage table-aware
667
+ // variant; the intra-cell step stays native.
668
+ case 'select-all-step':
669
+ selection.incrementSelectAllCount();
670
+ if (plan.step === 'native') return;
671
+ e.preventDefault();
672
+ if (plan.step === 'table') {
673
+ const tablePath = myPath.slice(0, -2);
674
+ // Flagged row-major like the drag/shift-click anchor, so a later
675
+ // exit-the-table extend snaps its whole row.
676
+ selection.enterCrossBlock(
677
+ { path: tablePath, offset: 0, cellCoordinate: true } satisfies CellSelectionPoint,
678
+ { path: tablePath, offset: columnCount * rowCount - 1 }
679
+ );
680
+ } else {
681
+ selectWholeDocument(selection, getDoc(), getBlockElByPath);
682
+ }
683
+ return;
684
+ default:
685
+ e.preventDefault();
686
+ // Reading mode keeps navigation and swallows the structural plans.
687
+ if (readOnly && plan.kind !== 'focus-cell' && plan.kind !== 'exit') return;
688
+ await applyCellPlan(plan);
689
+ return;
690
+ }
691
+ }
692
+
693
+ // The navigation plans, no live event needed; the caller preventDefaults. The fold is here
694
+ // rather than at each caller: insert-row-below rebuilds every row from cell raws, so an open
695
+ // reveal's edit would be re-derived away.
696
+ async function applyCellPlan(plan: CellKeyPlan): Promise<void> {
697
+ const fold = widgetInteraction.foldRevealBeforeMutation();
698
+ if (fold) await fold.settled;
699
+ switch (plan.kind) {
700
+ case 'focus-cell':
701
+ if (plan.setStickyColumn !== undefined) tableContext.setStickyColumn(plan.setStickyColumn);
702
+ tableContext.focusCell(plan.rowIdx, plan.colIdx, plan.position);
703
+ return;
704
+ case 'insert-row-below':
705
+ await tableContext.insertRowBelow(rowIdx);
706
+ return;
707
+ case 'exit':
708
+ exitWithStickyX(plan.direction);
709
+ return;
710
+ }
711
+ }
712
+
713
+ // Enter an intra-table rectangle from a collapsed cell caret on the first
714
+ // Shift+ArrowUp/Down. Gated on the cell's visual edge so a multi-line cell still
715
+ // extends its own text first (prose parity). Returns false to fall through.
716
+ function startIntraTableRect(key: 'ArrowUp' | 'ArrowDown', offset: number): boolean {
717
+ if (!el) return false;
718
+ const bounds = landableDomTextBounds(el);
719
+ const atEdge =
720
+ key === 'ArrowDown'
721
+ ? isAtLastVisualLine(el, offset, bounds.end)
722
+ : isAtFirstVisualLine(el, offset, bounds.start);
723
+ if (!atEdge) return false;
724
+
725
+ const tablePath = myPath.slice(0, -2);
726
+ const currentIdx = rowIdx * columnCount + colIdx;
727
+ const currentPoint: SelectionPoint = { path: tablePath, offset: currentIdx };
728
+ const ext = intraTableRectExtension(getDoc(), currentPoint, currentPoint, key);
729
+ if (!ext) return false;
730
+
731
+ const anchor = {
732
+ path: tablePath,
733
+ offset: currentIdx,
734
+ cellCoordinate: true
735
+ } satisfies CellSelectionPoint;
736
+ if (ext.kind === 'cell') {
737
+ selection.enterCrossBlock(anchor, { path: tablePath.slice(), offset: ext.offset });
738
+ return true;
739
+ }
740
+ // Enter the rect at the current cell, then hand off to the block-level extend so
741
+ // the selection leaves the table. The seed is minted before the extend can answer, so
742
+ // a decline (no block past the table) has to take it back: the stored pair would be an
743
+ // invisible selection the next Backspace deletes the whole cell through.
744
+ selection.enterCrossBlock(anchor, { path: tablePath.slice(), offset: currentIdx });
745
+ const extended =
746
+ ext.direction === 'forward'
747
+ ? extendFocusToNextBlock(selection, getDoc(), el, ext.fromCellPath, 'vertical')
748
+ : extendFocusToPreviousBlock(selection, getDoc(), el, ext.fromCellPath, 'start');
749
+ if (!extended) {
750
+ selection.collapse();
751
+ return false;
752
+ }
753
+ return true;
754
+ }
755
+
756
+ function exitWithStickyX(direction: ExitDirection): void {
757
+ if (!el) return;
758
+ const x = getCurrentCursorEditorRelativeX(el) ?? 0;
759
+ if (direction === 'up') tableContext.exitUpward(x);
760
+ else tableContext.exitDownward(x);
761
+ }
762
+
763
+ // The cell at the prose surface's live ranged-edit arm: a native edit over a range spanning
764
+ // hidden delimiters is the destructive family with no seam offsets of its own.
765
+ function handleLiveSelectionEdit(e: InputEvent): boolean {
766
+ return applyLiveRangeEdit(
767
+ e,
768
+ node,
769
+ cursor,
770
+ presentationMode,
771
+ linkRef,
772
+ '',
773
+ widgetInteraction.isRevealing,
774
+ (edit) => {
775
+ void blockEdit.updateBlockContent(index, edit.raw, edit.range.start, edit.caret);
776
+ parkCursor(edit.caret, edit.raw);
777
+ }
778
+ );
779
+ }
780
+
781
+ async function onBeforeInput(e: InputEvent): Promise<void> {
782
+ if (await handleSharedBeforeInput(e, sharedCtx)) return;
783
+ if (handleLiveSelectionEdit(e)) return;
784
+ if (e.inputType === 'insertLineBreak') {
785
+ // GFM cells can't carry raw newlines, so a line break is a literal `<br>`,
786
+ // which the inline-HTML pipeline renders as a live widget.
787
+ e.preventDefault();
788
+ if (!el) return;
789
+ // Both reads below are taken AFTER the fold: the committed text is what the offset
790
+ // they splice must be measured against.
791
+ const fold = widgetInteraction.foldRevealBeforeMutation();
792
+ if (fold) await fold.settled;
793
+ const offset = cursor.getRaw() ?? 0;
794
+ const text = readCellText();
795
+ const inserted = '<br>';
796
+ const newText = text.slice(0, offset) + inserted + text.slice(offset);
797
+ const caret = offset + inserted.length;
798
+ void blockEdit.updateBlockContent(index, newText, offset, caret);
799
+ parkCursor(caret, newText);
800
+ return;
801
+ }
802
+ }
803
+
804
+ function onPointerDown(e: PointerEvent): void {
805
+ if (!el) return;
806
+ // The clear + drag-install below would collapse an active rectangle before
807
+ // contextmenu fires, leaving the menu's Cut/Copy nothing to act on.
808
+ if (e.button === 2) return;
809
+ lastClickClientX = e.clientX;
810
+ lastClickClientY = e.clientY;
811
+ // A press on a reveal-source widget is an owned gesture: suppress the browser caret
812
+ // default and skip the drag so nothing races the reveal's own placement.
813
+ if (widgetInteraction.isPointOnRevealWidget(e.clientX, e.clientY)) {
814
+ e.preventDefault();
815
+ return;
816
+ }
817
+ const tableEl = el.closest('[role="table"]') as HTMLElement | null;
818
+ if (!tableEl) {
819
+ crossBlock.handlePointerDown(e);
820
+ return;
821
+ }
822
+ const tablePath = myPath.slice(0, -2);
823
+ const anchor: CellAnchor = {
824
+ tableEl,
825
+ tablePath,
826
+ rowIdx,
827
+ colIdx,
828
+ columnCount
829
+ };
830
+
831
+ resetForPointerDown(selection, stickyColumn, edgeAffinity, e.shiftKey);
832
+
833
+ if (e.shiftKey) {
834
+ const prevCoords = cellCoordsOfElement(document.activeElement, tableEl);
835
+ if (prevCoords && (prevCoords.rowIdx !== rowIdx || prevCoords.colIdx !== colIdx)) {
836
+ handleCellShiftClick(
837
+ selection,
838
+ { ...anchor, rowIdx: prevCoords.rowIdx, colIdx: prevCoords.colIdx },
839
+ { rowIdx, colIdx }
840
+ );
841
+ e.preventDefault();
842
+ return;
843
+ }
844
+ crossBlock.handlePointerDown(e);
845
+ return;
846
+ }
847
+
848
+ const editorRoot = getEditorRoot();
849
+ if (!editorRoot) return;
850
+ installCellDragListener({ editorRoot, selection, lifetimeSignal: editorLifetime }, anchor, e);
851
+ }
852
+
853
+ // Copy/cut/paste through the shared skeleton. The cell's extra arms are the intra-table
854
+ // rectangle (copied as a GFM sub-table) and the intra-cell raw slice, which preserves
855
+ // widget bytes like `<br>` that the browser's rendered-textContent copy drops.
856
+ const clipboard = createClipboardHandlers({
857
+ stickyColumn,
858
+ edgeAffinity,
859
+ selection,
860
+ getDoc,
861
+ crossBlock,
862
+ isReadOnly: () => readOnly,
863
+ caret: editableSurface.caret,
864
+ events: editorEvents,
865
+ onPasteImage,
866
+ foldReveal: () => widgetInteraction.foldRevealBeforeMutation(),
867
+ copyPreHook: (e) => {
868
+ const rectPayload = intraTableRectPayload({ selection, getDoc });
869
+ if (rectPayload === null) return false;
870
+ e.preventDefault();
871
+ e.clipboardData?.setData('text/plain', rectPayload);
872
+ return true;
873
+ },
874
+ // During a reveal the swapped DOM holds an edit `node.raw` hasn't seen; copy never
875
+ // mutates, so it slices the live DOM text rather than folding first.
876
+ copyTail: (e) => {
877
+ if (!el) return;
878
+ const offsets = cursor.getRawSelection();
879
+ if (!offsets || offsets.start === offsets.end) return;
880
+ e.preventDefault();
881
+ const display = widgetInteraction.isRevealing()
882
+ ? readCellText()
883
+ : trimTrailingLineEnding(node.raw);
884
+ e.clipboardData?.setData('text/plain', display.slice(offsets.start, offsets.end));
885
+ },
886
+ // Clears the cells in place, without `tableCoverageDelete` — only Backspace's
887
+ // structural delete opts into row/column/table removal.
888
+ cutPreHook: async (e) => {
889
+ const rectPayload = intraTableRectPayload({ selection, getDoc });
890
+ if (rectPayload === null) return false;
891
+ e.clipboardData?.setData('text/plain', rectPayload);
892
+ await crossBlock.performCrossBlockDeleteFromEvent();
893
+ return true;
894
+ },
895
+ // The write must be sync (clipboardData closes after the event), and the truncation
896
+ // goes through the CST: native deleteByCut would leave a stale snapshot anchor.
897
+ cutTail: (e) => {
898
+ if (!el) return;
899
+ const offsets = cursor.getRawSelection();
900
+ if (!offsets || offsets.start === offsets.end) return;
901
+ const display = trimTrailingLineEnding(node.raw);
902
+ e.clipboardData?.setData('text/plain', display.slice(offsets.start, offsets.end));
903
+ deleteCellRange(offsets.start, offsets.end);
904
+ },
905
+ pasteTail: async (pastedText) => {
906
+ if (!el) return;
907
+ const selOffsets = cursor.getRawSelection();
908
+ const start = selOffsets ? selOffsets.start : (cursor.getRaw() ?? 0);
909
+ await applyCellPaste(pastedText, { start, end: selOffsets ? selOffsets.end : start });
910
+ }
911
+ });
912
+ const { onCopy, onCut, onPaste } = clipboard;
913
+
914
+ // ── Shared mutation primitives (event handlers + right-click menu) ───────
915
+
916
+ // The truncation is a join like the paste's delete half: in live the runs it strands are
917
+ // bytes the reader never saw, so it crosses the same seam ahead of the escaping sink
918
+ // (live-mode.md § 4.5).
919
+ function deleteCellRange(start: number, end: number): void {
920
+ const display = trimTrailingLineEnding(node.raw);
921
+ const cut = cutRangeFromDisplay(node, display, { start, end }, presentationMode, linkRef);
922
+ void blockEdit.updateBlockContent(index, cut.display, start, cut.offset);
923
+ parkCursor(cut.offset, cut.display);
924
+ }
925
+
926
+ async function applyCellPaste(
927
+ pastedText: string,
928
+ sel: { start: number; end: number }
929
+ ): Promise<void> {
930
+ const result = await pasteDispatch(
931
+ {
932
+ pastedText,
933
+ targetPath: myPath,
934
+ offset: sel.start,
935
+ preDelete: sel.start !== sel.end ? { start: sel.start, end: sel.end } : undefined
936
+ },
937
+ {
938
+ doc: getDoc(),
939
+ blockEdit,
940
+ controller: pasteCoordinator,
941
+ grammar,
942
+ activePlugins,
943
+ // The delete half is a join like any other, and a cell's is no more literal than a
944
+ // paragraph's: without the seam a live cut pastes the runs it stranded into view.
945
+ seam: { presentationMode, linkRef }
946
+ }
947
+ );
948
+ // Already escaped: the cell's paste surface reports its caret in escaped space.
949
+ if (result.inlineCaretOffset !== undefined) parkCursor(result.inlineCaretOffset);
950
+ }
951
+
952
+ // ── Right-click menu clipboard (no ClipboardEvent) ──────────────────────
953
+ //
954
+ // Copy/Cut restore the range and fire `execCommand('copy')`, keeping the clipboard write
955
+ // synchronous the way Tauri needs and `navigator.clipboard.writeText` isn't. `execCommand('cut')`
956
+ // is unusable because onCut's write trails an await, so Cut copies then deletes; paste has no
957
+ // sync equivalent at all.
958
+
959
+ function getSelectionOffsets(): { start: number; end: number } | null {
960
+ const range = cursor.getRawSelection();
961
+ if (range) return range;
962
+ const caret = cursor.getRaw();
963
+ return caret === null ? null : { start: caret, end: caret };
964
+ }
965
+
966
+ async function applyMenuClipboard(
967
+ action: ClipboardAction,
968
+ sel: { start: number; end: number }
969
+ ): Promise<void> {
970
+ if (!el) return;
971
+ // Belt behind TableBlock's menu-open gate: paste and cut mutate.
972
+ if (readOnly && action !== 'copy') return;
973
+ // Right-click deliberately skips the pointerdown reset, so the reveal is still open here
974
+ // and `sel` was captured in the REVEALED DOM's coordinates — a fold before any of it.
975
+ const fold = widgetInteraction.foldRevealBeforeMutation();
976
+ if (fold) await fold.settled;
977
+ // A rectangle has no cell-local range to restore: refocusing keeps it live in
978
+ // SelectionState, and the onCopy/onCut rect arms do the rest.
979
+ const hasRect = action !== 'paste' && intraTableRectPayload({ selection, getDoc }) !== null;
980
+ if (action !== 'paste' && !hasRect && sel.start === sel.end) return;
981
+ // Clicking the menu item moved focus off the cell, so every branch refocuses before
982
+ // mutating: execCommand needs the restored range, paste needs a focused caret.
983
+ stickyColumn.reset();
984
+ edgeAffinity.reset();
985
+ el.focus();
986
+ if (action === 'paste') {
987
+ let raw: string;
988
+ try {
989
+ // Fired un-awaited from the menu onclick, so a denied read would surface as
990
+ // an unhandled rejection; degrade to a no-op.
991
+ raw = await navigator.clipboard.readText();
992
+ } catch {
993
+ return;
994
+ }
995
+ const text = normalizeLineEndings(raw);
996
+ if (text) await applyCellPaste(text, sel);
997
+ return;
998
+ }
999
+ if (hasRect) {
1000
+ document.execCommand('copy');
1001
+ if (action === 'cut') await crossBlock.performCrossBlockDeleteFromEvent();
1002
+ return;
1003
+ }
1004
+ setSelection(sel.start, sel.end);
1005
+ document.execCommand('copy');
1006
+ if (action === 'cut') deleteCellRange(sel.start, sel.end);
1007
+ }
1008
+
1009
+ // A click past a widget drops the caret at an element-level position with no text
1010
+ // anchor, so snap to the nearest widget edge (or reveal). Normal text clicks fall
1011
+ // through untouched.
1012
+ function onClick(e: MouseEvent): void {
1013
+ const x = lastClickClientX;
1014
+ const y = lastClickClientY;
1015
+ lastClickClientX = null;
1016
+ lastClickClientY = null;
1017
+ widgetInteraction.snapClickToWidgetEdge(x, y, {
1018
+ modified: e.ctrlKey || e.metaKey,
1019
+ clickCount: e.detail
1020
+ });
1021
+ }
1022
+
1023
+ function snapCaretToPoint(clientX: number, clientY: number): void {
1024
+ widgetInteraction.snapClickToWidgetEdge(clientX, clientY);
1025
+ }
1026
+
1027
+ function onFocus(): void {
1028
+ tableContext.notifyCellFocused(rowIdx, colIdx);
1029
+ }
1030
+
1031
+ function onBlur(e: FocusEvent): void {
1032
+ // Persist a revealed source edit before the caret is gone; the render effect's
1033
+ // activeElement guard keeps the commit from yanking focus back.
1034
+ if (!(el && e.relatedTarget && el.contains(e.relatedTarget as Node))) {
1035
+ widgetInteraction.commitRevealOnBlur();
1036
+ }
1037
+ tableContext.notifyCellBlurred();
1038
+ }
1039
+ </script>
1040
+
1041
+ <div
1042
+ bind:this={el}
1043
+ tabindex="0"
1044
+ class="table-cell"
1045
+ contenteditable={readOnly ? 'false' : 'true'}
1046
+ role="cell"
1047
+ style:text-align={alignment === 'none' ? undefined : alignment}
1048
+ oninput={onInput}
1049
+ onkeydown={onKeyDown}
1050
+ onbeforeinput={onBeforeInput}
1051
+ onpointerdown={onPointerDown}
1052
+ onclick={onClick}
1053
+ oncopy={onCopy}
1054
+ oncut={onCut}
1055
+ onpaste={onPaste}
1056
+ onfocus={onFocus}
1057
+ onblur={onBlur}
1058
+ oncompositionstart={onCompositionStart}
1059
+ oncompositionend={onCompositionEnd}
1060
+ ></div>
1061
+
1062
+ <style>
1063
+ .table-cell {
1064
+ outline: none;
1065
+ padding: 4px 8px;
1066
+ min-height: 1.4em;
1067
+ white-space: pre-wrap;
1068
+ word-wrap: break-word;
1069
+ border: 1px solid var(--color-ui-muted, #a4a4a4);
1070
+ }
1071
+ .table-cell:focus {
1072
+ outline: 2px solid var(--color-accent, #567b67);
1073
+ outline-offset: -2px;
1074
+ }
1075
+ </style>