@voithos-labs/aragonite 0.10.4 → 0.10.7

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 (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +11 -5
  3. package/dist/a11y-strings.js +60 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +12 -21
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +603 -1126
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +26 -51
  26. package/dist/components/SelectionOverlay.svelte.d.ts +5 -3
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +72 -87
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +29 -34
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +57 -39
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +141 -203
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +45 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +93 -147
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +1 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +8 -6
  102. package/dist/components/blocks/text/click-snap-guard.js +10 -7
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +150 -181
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -108
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +212 -199
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +12 -35
  144. package/dist/components/drag-handle.js +22 -68
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -24
  162. package/dist/components/editor-root-listeners.js +49 -24
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +14 -26
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +30 -35
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +3 -5
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +54 -75
  256. package/dist/core/inline/inline-widgets.js +54 -62
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +31 -15
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -6
  347. package/dist/cursor/height-oracle.js +26 -74
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +14 -15
  365. package/dist/cursor/scrollport.js +7 -13
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -14
  375. package/dist/cursor/visual-lines.js +45 -46
  376. package/dist/cursor/widget-edge-snap.d.ts +10 -15
  377. package/dist/cursor/widget-edge-snap.js +13 -12
  378. package/dist/cursor/widget-offset.d.ts +110 -104
  379. package/dist/cursor/widget-offset.js +344 -179
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +30 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +28 -50
  434. package/dist/editor-actions/focus/focus-landing.d.ts +8 -11
  435. package/dist/editor-actions/focus/focus-landing.js +15 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +54 -82
  465. package/dist/editor-actions/plugin/container.js +105 -188
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +88 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +37 -8
  550. package/dist/plugin.js +100 -77
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +78 -67
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -81
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +51 -45
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +15 -6
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +141 -310
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +78 -84
  695. package/dist/schema/commands.js +152 -117
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +8 -10
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +63 -80
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +92 -125
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +59 -96
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +51 -134
  807. package/dist/selection/dead-space-caret.d.ts +19 -30
  808. package/dist/selection/dead-space-caret.js +70 -88
  809. package/dist/selection/drag-pointer.d.ts +7 -9
  810. package/dist/selection/drag-pointer.js +23 -33
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -40
  816. package/dist/selection/keyboard-extend.js +94 -117
  817. package/dist/selection/multi-click.d.ts +13 -18
  818. package/dist/selection/multi-click.js +32 -38
  819. package/dist/selection/native-bridge.d.ts +29 -39
  820. package/dist/selection/native-bridge.js +78 -127
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +25 -16
  824. package/dist/selection/path-lookup.js +101 -18
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +5 -5
  828. package/dist/selection/pointer-gesture.js +5 -5
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -40
  832. package/dist/selection/primitives.js +57 -67
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -23
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +34 -16
  852. package/dist/selection/selection-drop.js +159 -95
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +60 -53
  864. package/dist/styles/editor.css +201 -143
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +9 -7
  960. package/dist/tree-operations/paste/replacement-parse.js +12 -10
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +327 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +253 -185
  996. package/docs/guide/plugin-guide.md +332 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +12 -16
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/cursor/scroll-hold.d.ts +0 -10
  1015. package/dist/cursor/scroll-hold.js +0 -22
  1016. package/dist/invariants/split-landing.d.ts +0 -8
  1017. package/dist/invariants/split-landing.js +0 -15
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -31
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -78
@@ -1,35 +1,33 @@
1
1
  /**
2
- * The live-mode join rewrite (live-mode.md § 4.5): a literal concatenation surfaces the runs a
3
- * truncation left unpaired and the closer/opener pair a split's inverse abuts around nothing. Both
4
- * are dropped here and nowhere else, and only once the joined block re-parses to ONE prose block
5
- * showing what the two sides showed.
2
+ * The live-mode join rewrite (live-mode.md § 4.5): joining two blocks literally would show the
3
+ * delimiter runs a truncation left unpaired, and the closer/opener pair a split's inverse pushes
4
+ * together around nothing. Both are dropped here and nowhere else, and only once the joined bytes,
5
+ * read back where they will be stored, show what the two sides showed.
6
6
  */
7
- import { constructContentRange, getContentRange, inlineDescendants, isProseKind, parseInline } from '../../../core/inline';
7
+ import { constructContentRange, getContentRange, inlineDescendants, isProseKind, readInline } from '../../../core/inline';
8
8
  import { CONTENT_VISIBILITY, paintsOnlyChrome, renderedText } from '../../../core/inline/visibility';
9
- import { trimTrailingLineEnding } from '../../../core/lines';
10
- import { parse } from '../../../core/parser';
9
+ import { readBack, readSource, shownOf } from '../../../core/inline/live-edit/read-back';
10
+ import { isBlankText, trimTrailingLineEnding } from '../../../core/lines';
11
11
  import { getInlineConstructPolicy } from '../../../schema/inline-construct-policy';
12
- import { soleProseReparse } from './screen-diff';
13
12
  // ── The rewrite ──────────────────────────────────────────────────────────────
14
13
  export const cleanLiveJoinSeam = (join) => {
15
- const resolver = join.linkRef?.current;
16
- const left = readSide(join.start, 'before', resolver);
17
- const right = readSide(join.end, 'after', resolver);
14
+ const { typed, store } = join;
15
+ const left = readSide(join.start, 'before', store.reading);
16
+ const right = readSide(join.end, 'after', store.reading);
18
17
  if (left === null || right === null)
19
18
  return null;
20
- // Nothing stands on the seam, so the literal join is already the answer — and the ordinary
21
- // Backspace between two plain paragraphs pays no parse for it.
19
+ // Nothing sits at the join, so the plain concatenation is already the answer, and an ordinary
20
+ // Backspace between two paragraphs pays for no parse.
22
21
  if (!standsOnSeam(left) && !standsOnSeam(right))
23
22
  return null;
24
23
  if (!anchorsOnMerged(join, left, right))
25
24
  return null;
26
- // The caller splices `typed` at the seam once this returns, so the bytes verified below are the
25
+ // The caller splices `typed` at the join once this returns, so the bytes checked below are the
27
26
  // bytes written: a typed run changes the flanking a kept delimiter pairs against.
28
- const typed = join.typed ?? '';
29
27
  const shown = shownAfterJoin(left, right, typed);
30
28
  const pairs = abuttingPairSpans(join, left, right);
31
- // Least destructive first: keep the runs the two sides can still pair across the seam, and fall
32
- // back to dropping every stranded one. Identical readings render once.
29
+ // Two readings, least destructive first: keep the runs the two sides can still pair across the
30
+ // join, else drop every stranded one.
33
31
  const readings = [unpairedSpans(join, left, right), everyDanglingSpan(join, left, right)];
34
32
  const spanSets = readings.map((dangling) => [...dangling, ...pairs]);
35
33
  const candidates = (sameSpans(spanSets[0], spanSets[1]) ? [spanSets[0]] : spanSets).map((spans) => {
@@ -39,61 +37,58 @@ export const cleanLiveJoinSeam = (join) => {
39
37
  spans,
40
38
  raw,
41
39
  seam,
42
- read: readCandidate(raw.slice(0, seam) + typed + raw.slice(seam), resolver, join)
40
+ read: readCandidate(raw.slice(0, seam) + typed + raw.slice(seam), store)
43
41
  };
44
42
  });
45
- // § 4.1's other half: a run the leanest reading keeps can be one the cut left enclosing nothing,
46
- // and a pair over nothing passes the screen check. Least destructive is read among the rest.
43
+ // A pair left over nothing also passes the screen check, so among the readings that pass, the
44
+ // one leaving the fewest such pairs wins (`docs/design/live-mode.md` § 4.1).
47
45
  const floor = Math.min(...candidates.map(({ read }) => read?.residue ?? Infinity));
48
46
  for (const { raw: candidate, seam, read } of candidates) {
49
47
  if (read === null || read.visible !== shown || read.residue > floor)
50
48
  continue;
51
- // A candidate that changed nothing IS the literal join: declining says so, and keeps the
52
- // caller off a rewrite path it does not need.
49
+ // A candidate that changed nothing is the plain concatenation: refusing says so, and keeps
50
+ // the caller off a rewrite path it does not need.
53
51
  if (candidate === join.mergedRaw)
54
52
  return null;
55
- // The split half's terminal-trivia rule, on the join: a whitespace-only survivor paints
56
- // nothing and reloads as blank trivia, a different shape than the block written.
53
+ // The split half's trailing-whitespace rule, applied to the join: a survivor that is only
54
+ // whitespace draws nothing and reparses as a blank line, not the block that was written.
57
55
  const display = trimTrailingLineEnding(candidate);
58
- if (display !== '' && display.trim() === '') {
56
+ if (display !== '' && isBlankText(display)) {
59
57
  return { raw: candidate.slice(display.length), seam: 0 };
60
58
  }
61
59
  return { raw: candidate, seam };
62
60
  }
63
61
  return null;
64
62
  };
65
- /** Every byte a reading drops ahead of the seam moves the caret's landing with it. */
63
+ /** Every byte a reading drops before the join moves the caret with it. */
66
64
  const droppedBefore = (spans, seam) => spans
67
65
  .filter((span) => span.end <= seam)
68
66
  .reduce((total, span) => total + span.end - span.start, 0);
69
67
  const standsOnSeam = (side) => side.dangling.length > 0 || side.touching.length > 0;
70
68
  const sameSpans = (a, b) => a.length === b.length && a.every((span, i) => span.start === b[i].start && span.end === b[i].end);
71
- /**
72
- * Read one endpoint's surviving bytes and the constructs its cut leaves at the seam. Null where
73
- * the cleanup has no business running: a non-prose kind, an offset outside the content, or a cut
74
- * through a family that declares no close-and-reopen, whose bytes mean nothing apart.
75
- */
76
- function readSide(endpoint, keep, resolver) {
69
+ /** One endpoint's surviving bytes and the constructs its cut leaves at the join. Null for a
70
+ * non-prose kind, an offset outside the content, or a cut through a family that cannot reopen. */
71
+ function readSide(endpoint, keep, reading) {
77
72
  const { node, offset } = endpoint;
78
73
  if (!isProseKind(node.kind))
79
74
  return null;
80
75
  const content = getContentRange(node);
81
76
  if (offset < content.start || offset > content.end)
82
77
  return null;
83
- const inlines = parseInline(node.raw, content.start, content.end, resolver);
84
- // Chrome standing over nothing is all on screen (live-mode.md § 4.1), so a run surviving this
85
- // cut is bytes the reader saw, not a stranded one: the literal join stands.
86
- if (paintsOnlyChrome(inlines, node.raw))
78
+ const inlines = readInline(node.raw, content.start, content.end, reading.resolver, reading.grammar);
79
+ // Markers standing over nothing are all on screen (live-mode.md § 4.1), so a run that survives
80
+ // this cut is bytes the user saw, not a stranded one: the plain concatenation stands.
81
+ if (paintsOnlyChrome(inlines, node.raw, { grammar: reading.grammar }))
87
82
  return null;
88
83
  const { ranged, atomic } = classifyConstructs(inlines);
89
84
  // Neither an atomic construct's interior nor the middle of a delimiter run leaves halves any
90
- // reading of the seam can repair. Live's caret cannot land there; a plugin's can.
85
+ // reading can repair. A live-mode caret cannot land there; a plugin's can.
91
86
  if (atomic.some((span) => offset > span.start && offset < span.end))
92
87
  return null;
93
88
  if (ranged.some((c) => splitsARun(c, offset)))
94
89
  return null;
95
- // Dangling is about the PARTNER, so content-range containment is not the test: a cut at a
96
- // construct's content start leaves its opener behind just as one in the middle does.
90
+ // What matters is whether the partner delimiter survives, not whether the cut lies inside the
91
+ // content range: a cut at a construct's content start leaves its opener behind too.
97
92
  const dangling = ranged.filter((c) => keep === 'before'
98
93
  ? c.content.start <= offset && offset < c.node.end
99
94
  : c.node.start < offset && offset <= c.content.end);
@@ -101,6 +96,7 @@ function readSide(endpoint, keep, resolver) {
101
96
  return null;
102
97
  return {
103
98
  raw: node.raw,
99
+ grammar: reading.grammar,
104
100
  content,
105
101
  cut: offset,
106
102
  inlines,
@@ -108,11 +104,11 @@ function readSide(endpoint, keep, resolver) {
108
104
  touching: touchingChain(ranged, offset, keep)
109
105
  };
110
106
  }
111
- /** Text is content, not a construct, and nothing under it is one either — the descent predicate
112
- * the two censuses below share. */
107
+ /** Text is content, not a construct, and nothing under it is one either. The two scans below
108
+ * share this test when they descend. */
113
109
  const isConstruct = (node) => node.kind !== 'text';
114
- /** Constructs with a content range (outermost first) apart from those without one, whose bytes
115
- * the seam can only step around. */
110
+ /** Constructs with a content range (outermost first), kept apart from those without one, whose
111
+ * bytes the join can only step around. */
116
112
  function classifyConstructs(inlines) {
117
113
  const ranged = [];
118
114
  const atomic = [];
@@ -129,15 +125,12 @@ function classifyConstructs(inlines) {
129
125
  return { ranged, atomic };
130
126
  }
131
127
  const splitsARun = (c, at) => (at > c.node.start && at < c.content.start) || (at > c.content.end && at < c.node.end);
132
- /** Whether the family declares its delimiters cuttable and rejoinable at all (live-mode.md § 4.4). */
128
+ /** Whether the family can be cut and rejoined (`docs/design/live-mode.md` § 4.4). */
133
129
  function isRejoinable(kind) {
134
130
  return getInlineConstructPolicy(kind)?.splitBehavior === 'close-and-reopen';
135
131
  }
136
- /**
137
- * The nested chain of closers ending at `cut` (or openers starting there), peeled outermost
138
- * first: `**a *b***` cut at its end gives the strong, then the emphasis its closer wraps. This is
139
- * the shape `live-split-rebalance` writes, read back.
140
- */
132
+ /** The nested chain of closers ending at `cut` (or openers starting there), outermost first:
133
+ * `**a *b***` cut at its end gives the strong emphasis, then the emphasis. */
141
134
  function touchingChain(constructs, cut, keep) {
142
135
  const chain = [];
143
136
  let at = cut;
@@ -149,30 +142,27 @@ function touchingChain(constructs, cut, keep) {
149
142
  at = keep === 'before' ? link.content.end : link.content.start;
150
143
  }
151
144
  }
152
- /** Whether the merged bytes are still the two sides' bytes end to end — a normalizer that
153
- * rewrote either one moves every offset below, so the cleanup stands down instead. */
145
+ /** Whether the merged bytes are still the two sides' bytes end to end. Anything that rewrote
146
+ * either side moves every offset below, so the cleanup does nothing instead. */
154
147
  function anchorsOnMerged(join, left, right) {
155
148
  return (join.mergedRaw.slice(0, join.seam) === left.raw.slice(0, left.cut) &&
156
149
  join.mergedRaw.startsWith(right.raw.slice(right.cut, right.content.end), join.seam));
157
150
  }
158
151
  // ── The spans a join may drop ────────────────────────────────────────────────
159
- /** A left-side span is already in merged coordinates; a right-side one shifts by the seam. */
152
+ /** A left-side span is already in merged coordinates; a right-side one shifts by the join. */
160
153
  const rightSpan = (join, right, span) => ({
161
154
  start: join.seam + span.start - right.cut,
162
155
  end: join.seam + span.end - right.cut
163
156
  });
164
157
  const openerRun = (c) => ({ start: c.node.start, end: c.content.start });
165
158
  const closerRun = (c) => ({ start: c.content.end, end: c.node.end });
166
- /** Whether two constructs are written with the same delimiters — the byte-level test for "these
167
- * are one construct's two halves", which kind equality alone cannot make (`__a__` vs `**a**`). */
159
+ /** Whether two constructs are written with the same delimiters: the byte-level test for "these
160
+ * are one construct's two halves", which matching kinds alone cannot make (`__a__` vs `**a**`). */
168
161
  const sameDelimiters = (left, lc, right, rc) => left.raw.slice(lc.node.start, lc.content.start) ===
169
162
  right.raw.slice(rc.node.start, rc.content.start) &&
170
163
  left.raw.slice(lc.content.end, lc.node.end) === right.raw.slice(rc.content.end, rc.node.end);
171
- /**
172
- * The runs a truncation stranded that the join does NOT put back together: the left's opener
173
- * chain and the right's closer chain, minus the leading pairs whose kinds line up — those two
174
- * halves make one construct across the seam, which is what the reader had.
175
- */
164
+ /** The runs a truncation stranded that the join does not rejoin: the left's openers and the right's
165
+ * closers, minus the leading pairs whose kinds line up and so make one construct again. */
176
166
  function unpairedSpans(join, left, right) {
177
167
  let paired = 0;
178
168
  while (paired < left.dangling.length &&
@@ -192,11 +182,8 @@ function everyDanglingSpan(join, left, right) {
192
182
  ...right.dangling.map((c) => rightSpan(join, right, closerRun(c)))
193
183
  ];
194
184
  }
195
- /**
196
- * The closer/opener pair a split's inverse brings back to back: same kinds nested the same way,
197
- * written with the same bytes, enclosing nothing between them. Whole chain or nothing — dropping
198
- * an outer pair while an inner one stays would leave both halves' runs unbalanced.
199
- */
185
+ /** The closer/opener chain a split's inverse brings back to back around nothing, same kinds and
186
+ * bytes. Dropped whole or not at all, since a partial drop leaves the runs unbalanced. */
200
187
  function abuttingPairSpans(join, left, right) {
201
188
  const closing = left.touching;
202
189
  const opening = right.touching;
@@ -228,26 +215,18 @@ function withoutSpans(raw, spans) {
228
215
  return out + raw.slice(at);
229
216
  }
230
217
  // ── Verification ─────────────────────────────────────────────────────────────
231
- /**
232
- * What the reader is owed: what each side ALREADY SHOWED of the bytes that survive. Read off the
233
- * pre-join parse, never off the joined halves — either of those bakes the defect this checks for
234
- * into its own expectation.
235
- */
218
+ /** What the user must still see, read off each side's parse from before the join: reading the
219
+ * joined halves would bake the fault this checks for into the expectation. */
236
220
  const shownAfterJoin = (left, right, typed) => visibleSide(left, 'before') + typed + visibleSide(right, 'after');
237
- /**
238
- * What a reader sees, asked of the thing that paints it: the render path's own DOM with every
239
- * marker span dropped. The clip decides only WHERE the bytes stop; a construct the cut crosses
240
- * contributes its content, since its delimiter runs paint nothing either way — which `readSide`
241
- * has already established by declining a side whose chrome paints.
242
- */
221
+ /** What the user sees of one side, asked of the render with every marker dropped. A construct the
222
+ * cut crosses still gives its content, since `readSide` refused any side whose markers paint. */
243
223
  function visibleSide(side, keep) {
244
- return renderedText(clipNodes(side.inlines, side.cut, keep), side.raw, CONTENT_VISIBILITY);
224
+ return renderedText(clipNodes(side.inlines, side.cut, keep), side.raw, CONTENT_VISIBILITY, {
225
+ grammar: side.grammar
226
+ });
245
227
  }
246
- /**
247
- * The `keep` side of `level`, rebuilt: a construct the cut crosses hands its place to its own
248
- * clipped children. Exported for the depth pin, which has to reach the rebuild with a tree no
249
- * side this deep could be rendered at.
250
- */
228
+ /** The `keep` side of `level`, rebuilt: a construct the cut crosses is replaced by its clipped
229
+ * children. Exported for the depth test. */
251
230
  export function clipNodes(level, cut, keep) {
252
231
  const before = keep === 'before';
253
232
  // A crossed construct is emitted as its children, in its own place, so the pre-order's
@@ -271,7 +250,7 @@ export function clipNodes(level, cut, keep) {
271
250
  if (node.children && node.children.length > 0)
272
251
  continue;
273
252
  // A code span carries its content as bytes rather than children, so the surviving part of
274
- // it is that byte range read as text — which is exactly what the span paints.
253
+ // it is that byte range read as text, which is exactly what the span shows.
275
254
  const start = before ? content.start : Math.max(content.start, cut);
276
255
  const end = before ? Math.min(content.end, cut) : content.end;
277
256
  if (end > start)
@@ -279,46 +258,30 @@ export function clipNodes(level, cut, keep) {
279
258
  }
280
259
  return out;
281
260
  }
282
- /**
283
- * The candidate read back as the caller will install it: what it shows, and how many constructs its
284
- * row unwraps are left standing over nothing. Null where a join produces something the caller cannot
285
- * install — two blocks, a kind with no inline content, or a body the container would re-read.
286
- */
287
- function readCandidate(raw, resolver, join) {
288
- if (!keepsContainerMarker(join.ambientPrefix ?? '', raw))
289
- return null;
290
- const sole = soleProseReparse(raw, resolver);
291
- if (sole === null)
261
+ /** The candidate read back where it will be stored: what it shows, and how many unwrapping
262
+ * constructs stand over nothing. Null where that position would not keep it as one prose block. */
263
+ function readCandidate(raw, store) {
264
+ const read = readBack(raw, store);
265
+ if (read === null)
292
266
  return null;
293
- const { block, nodes } = sole;
267
+ const { inlines } = read;
268
+ const source = readSource(read);
269
+ const render = { grammar: store.reading.grammar };
294
270
  return {
295
- visible: renderedText(nodes, block.raw, CONTENT_VISIBILITY),
296
- // Chrome standing over nothing is all on screen (§ 4.1), so a block that paints hides no pair.
297
- residue: paintsOnlyChrome(nodes, block.raw) ? 0 : countResidue(nodes, block.raw)
271
+ visible: shownOf(read, store),
272
+ // Markers over nothing are all on screen (§ 4.1), so a block that shows them hides no pair.
273
+ residue: paintsOnlyChrome(inlines, source, render) ? 0 : countResidue(inlines, source, render)
298
274
  };
299
275
  }
300
- /**
301
- * Whether the container still reads its own marker off the candidate. The item's marker is not in
302
- * these bytes but absorbs from them, so a body the cut left starting with a space reloads under a
303
- * WIDER marker than the live tree holds — the load/save cycle would then change the tree.
304
- */
305
- function keepsContainerMarker(prefix, raw) {
306
- if (prefix === '')
307
- return true;
308
- const blocks = parse(prefix + raw, { scope: 'fragment' }).children;
309
- if (blocks.length !== 1)
310
- return false;
311
- return blocks[0].marker === prefix;
312
- }
313
- /** Constructs the reader would meet as nothing at all: no painted byte, and a row that unwraps
276
+ /** Constructs the user would meet as nothing at all: no visible byte, and a policy that unwraps
314
277
  * them when emptied rather than leaving delimiters over nothing. */
315
- function countResidue(nodes, raw) {
278
+ function countResidue(nodes, raw, render) {
316
279
  let found = 0;
317
280
  for (const node of inlineDescendants(nodes, isConstruct)) {
318
281
  if (node.kind === 'text')
319
282
  continue;
320
283
  if (node.end > node.start &&
321
- renderedText([node], raw, CONTENT_VISIBILITY) === '' &&
284
+ renderedText([node], raw, CONTENT_VISIBILITY, render) === '' &&
322
285
  getInlineConstructPolicy(node.kind)?.autoUnwrapOnEmpty === true) {
323
286
  found++;
324
287
  }
@@ -1,19 +1,12 @@
1
1
  /**
2
- * What a native ranged edit writes in live mode. The range it targets can span delimiter runs the
3
- * user never saw and contenteditable takes those literally, so the edit is re-expressed as a JOIN
4
- * of what survives on either side and crosses the shared seam (live-mode.md § 4.5). Every editable
5
- * prose surface routes its `beforeinput` through {@link resolveLiveRangeEdit}, so a gesture family
6
- * cannot reach the bytes by being absent from a list.
2
+ * What a browser range edit writes in live mode, read off the `beforeinput` event. The range can
3
+ * span delimiter runs the user never saw, which contenteditable would take literally, so the edit
4
+ * goes through `replaceRangeInLeaf` (`docs/design/live-mode.md` § 4.5). Every prose block routes
5
+ * its `beforeinput` through {@link resolveLiveRangeEdit}.
7
6
  */
8
7
  import type { NodeView } from '../../../core/node-views';
9
- import type { PresentationMode } from '../../../presentation-mode';
10
- import type { InlineResolverRef } from '../../../schema/inline-construct-policy';
11
- export interface SelectionEdit {
12
- /** The block's whole bytes after the edit, trailing line ending included. */
13
- raw: string;
14
- caret: number;
15
- }
16
- /** The raw-offset readers a native ranged edit needs from its surface. */
8
+ import type { StoredAs } from '../../../schema/stored-as';
9
+ /** The raw-offset lookups a browser range edit needs from the block. */
17
10
  export interface LiveEditCursor {
18
11
  rawRangeOf(range: AbstractRange): {
19
12
  start: number;
@@ -24,8 +17,8 @@ export interface LiveEditCursor {
24
17
  end: number;
25
18
  } | null;
26
19
  }
27
- /** Rewrite the block's bytes, or SWALLOW the press: an input this seam owns whose payload it may
28
- * not read writes nothing, since the engine's version would splice the hidden runs literally. */
20
+ /** Rewrite the block's bytes, or consume the key and write nothing: an input handled here whose
21
+ * payload cannot be read writes nothing, since the browser would splice the hidden runs. */
29
22
  export type LiveRangeEdit = LiveRangeRewrite | {
30
23
  kind: 'swallow';
31
24
  };
@@ -38,31 +31,9 @@ export interface LiveRangeRewrite {
38
31
  raw: string;
39
32
  caret: number;
40
33
  }
41
- /**
42
- * What a prose surface does with a `beforeinput` in live mode. Null wherever the press is not this
43
- * seam's or the seam has nothing to clean — there the engine's own edit is already right, and
44
- * leaving it native keeps its grapheme and IME behavior.
45
- */
46
- export declare function resolveLiveRangeEdit(e: InputEvent, node: NodeView, cursor: LiveEditCursor, presentationMode: PresentationMode | undefined, linkRef: InlineResolverRef | undefined, ambientPrefix?: string): LiveRangeEdit | null;
47
- /**
48
- * The whole surface arm around {@link resolveLiveRangeEdit}: stand down while a source reveal has
49
- * outrun the CST, resolve, preventDefault what the seam owns, then swallow or hand the rewrite to
50
- * the surface's own `commit`. Shared so a new precondition lands on every surface at once.
51
- */
52
- export declare function applyLiveRangeEdit(e: InputEvent, node: NodeView, cursor: LiveEditCursor, presentationMode: PresentationMode | undefined, linkRef: InlineResolverRef | undefined, ambientPrefix: string, isRevealing: () => boolean, commit: (edit: LiveRangeRewrite) => void): boolean;
53
- /**
54
- * The bytes replacing `[start, end)` with `typed`, or null when the seam had nothing to clean.
55
- * Exported for the callers that already hold a range of their own (the composition commit, the
56
- * gesture fuzzer) rather than an event to read one off.
57
- */
58
- export declare function resolveSelectionEdit(node: NodeView, selection: {
59
- start: number;
60
- end: number;
61
- }, typed: string, presentationMode: PresentationMode | undefined, linkRef: InlineResolverRef | undefined, ambientPrefix?: string): SelectionEdit | null;
62
- /** The rewrite of `[start, end)` to `typed` a gesture the surface consumed installs, where a
63
- * delete is the empty one. The seam's cleaned bytes where it has them, else the literal display
64
- * splice with the caret past the insert: the fallback's one home, so no arm can drift. */
65
- export declare function replaceRangeRaw(node: NodeView, range: {
66
- start: number;
67
- end: number;
68
- }, typed: string, presentationMode: PresentationMode | undefined, linkRef: InlineResolverRef | undefined, ambientPrefix: string): SelectionEdit;
34
+ /** What a prose block does with a `beforeinput` in live mode. Null where there is nothing to clean,
35
+ * so the browser keeps its own edit and its grapheme and IME behavior. */
36
+ export declare function resolveLiveRangeEdit(e: InputEvent, node: NodeView, cursor: LiveEditCursor, store: StoredAs): LiveRangeEdit | null;
37
+ /** The wrapper every block runs around {@link resolveLiveRangeEdit}, shared so a new precondition
38
+ * reaches every block. Does nothing while a shown source has outrun the CST. */
39
+ export declare function applyLiveRangeEdit(e: InputEvent, node: NodeView, cursor: LiveEditCursor, store: StoredAs, isRevealing: () => boolean, commit: (edit: LiveRangeRewrite) => void): boolean;
@@ -1,42 +1,32 @@
1
1
  /**
2
- * What a native ranged edit writes in live mode. The range it targets can span delimiter runs the
3
- * user never saw and contenteditable takes those literally, so the edit is re-expressed as a JOIN
4
- * of what survives on either side and crosses the shared seam (live-mode.md § 4.5). Every editable
5
- * prose surface routes its `beforeinput` through {@link resolveLiveRangeEdit}, so a gesture family
6
- * cannot reach the bytes by being absent from a list.
2
+ * What a browser range edit writes in live mode, read off the `beforeinput` event. The range can
3
+ * span delimiter runs the user never saw, which contenteditable would take literally, so the edit
4
+ * goes through `replaceRangeInLeaf` (`docs/design/live-mode.md` § 4.5). Every prose block routes
5
+ * its `beforeinput` through {@link resolveLiveRangeEdit}.
7
6
  */
8
- import { snapToScalarBoundary, trailingLineEnding, trimTrailingLineEnding } from '../../../core/lines';
9
- import { cleanJoinedRaw } from '../../../tree-operations/node-ops';
10
- /**
11
- * What a prose surface does with a `beforeinput` in live mode. Null wherever the press is not this
12
- * seam's or the seam has nothing to clean — there the engine's own edit is already right, and
13
- * leaving it native keeps its grapheme and IME behavior.
14
- */
15
- export function resolveLiveRangeEdit(e, node, cursor, presentationMode, linkRef, ambientPrefix = '') {
16
- if (presentationMode !== 'live' || !rewritesTargetRange(e))
7
+ import { replaceRangeInLeaf } from '../../../tree-operations/leaf-range';
8
+ /** What a prose block does with a `beforeinput` in live mode. Null where there is nothing to clean,
9
+ * so the browser keeps its own edit and its grapheme and IME behavior. */
10
+ export function resolveLiveRangeEdit(e, node, cursor, store) {
11
+ if (!store.reading.hidesDelimitersAtCaret() || !rewritesTargetRange(e))
17
12
  return null;
18
- const range = pendingEditRange(e, cursor);
19
- if (!range)
13
+ const target = pendingEditRange(e, cursor);
14
+ if (!target)
20
15
  return null;
21
16
  const insert = replacementText(e);
22
- if (range.start === range.end)
23
- return parkedCaretInsertion(node, cursor, range.start, insert);
24
- const edit = resolveSelectionEdit(node, range, insert ?? '', presentationMode, linkRef, ambientPrefix);
25
- if (!edit)
17
+ if (target.start === target.end) {
18
+ return parkedCaretInsertion(node, cursor, target.start, insert, store);
19
+ }
20
+ const edit = replaceRangeInLeaf(node, target, insert ?? '', store);
21
+ if (edit.matchesBrowserEdit)
26
22
  return null;
27
23
  return insert === null
28
24
  ? { kind: 'swallow' }
29
- : { kind: 'rewrite', range, raw: edit.raw, caret: edit.caret };
25
+ : { kind: 'rewrite', range: edit.range, raw: edit.raw, caret: edit.caret };
30
26
  }
31
- /**
32
- * A collapsed insertion has no seam to clean, but Chromium inserts at its canonical spelling of
33
- * the caret's pixel, UPSTREAM across a hidden run, while the DOM caret may sit where a commit
34
- * parked it, past that run (after a `)` just typed). A target behind the caret is that
35
- * canonicalization, and the byte belongs where the caret is, the side the keydown seat settled. A
36
- * target at or past the caret is the engine landing the byte itself, which a split's reopened run
37
- * relies on: parked at its start, the byte goes inside.
38
- */
39
- function parkedCaretInsertion(node, cursor, engineTarget, insert) {
27
+ /** A collapsed insertion Chromium aimed back across a hidden run (just after a typed `)`) goes where
28
+ * the caret is. A target at or past the caret stands, since a split's reopened run relies on it. */
29
+ function parkedCaretInsertion(node, cursor, engineTarget, insert, store) {
40
30
  if (!insert)
41
31
  return null;
42
32
  const selection = window.getSelection();
@@ -45,23 +35,15 @@ function parkedCaretInsertion(node, cursor, engineTarget, insert) {
45
35
  const caret = cursor.rawRangeOf(selection.getRangeAt(0))?.start ?? null;
46
36
  if (caret === null || engineTarget >= caret)
47
37
  return null;
48
- const display = trimTrailingLineEnding(node.raw);
49
- return {
50
- kind: 'rewrite',
51
- range: { start: caret, end: caret },
52
- raw: display.slice(0, caret) + insert + display.slice(caret) + trailingLineEnding(node.raw),
53
- caret: caret + insert.length
54
- };
38
+ const edit = replaceRangeInLeaf(node, { start: caret, end: caret }, insert, store);
39
+ return { kind: 'rewrite', range: edit.range, raw: edit.raw, caret: edit.caret };
55
40
  }
56
- /**
57
- * The whole surface arm around {@link resolveLiveRangeEdit}: stand down while a source reveal has
58
- * outrun the CST, resolve, preventDefault what the seam owns, then swallow or hand the rewrite to
59
- * the surface's own `commit`. Shared so a new precondition lands on every surface at once.
60
- */
61
- export function applyLiveRangeEdit(e, node, cursor, presentationMode, linkRef, ambientPrefix, isRevealing, commit) {
41
+ /** The wrapper every block runs around {@link resolveLiveRangeEdit}, shared so a new precondition
42
+ * reaches every block. Does nothing while a shown source has outrun the CST. */
43
+ export function applyLiveRangeEdit(e, node, cursor, store, isRevealing, commit) {
62
44
  if (isRevealing())
63
45
  return false;
64
- const edit = resolveLiveRangeEdit(e, node, cursor, presentationMode, linkRef, ambientPrefix);
46
+ const edit = resolveLiveRangeEdit(e, node, cursor, store);
65
47
  if (!edit)
66
48
  return false;
67
49
  e.preventDefault();
@@ -69,72 +51,15 @@ export function applyLiveRangeEdit(e, node, cursor, presentationMode, linkRef, a
69
51
  commit(edit);
70
52
  return true;
71
53
  }
72
- /**
73
- * The bytes replacing `[start, end)` with `typed`, or null when the seam had nothing to clean.
74
- * Exported for the callers that already hold a range of their own (the composition commit, the
75
- * gesture fuzzer) rather than an event to read one off.
76
- */
77
- export function resolveSelectionEdit(node, selection, typed, presentationMode, linkRef, ambientPrefix = '') {
78
- // Both ends off any scalar interior before the slice: a half-pair here is unrecoverable
79
- // bytes, not a recoverable edit. Snapping the same direction cannot invert the range.
80
- const start = snapToScalarBoundary(node.raw, selection.start);
81
- const end = snapToScalarBoundary(node.raw, selection.end);
82
- if (start >= end)
83
- return null;
84
- const mergedRaw = node.raw.slice(0, start) + node.raw.slice(end);
85
- // `typed` rides the seam rather than being spliced past it: the bytes the cleanup verifies have
86
- // to be the bytes this returns, or the flanking it checked is not the flanking that ships.
87
- const joined = cleanJoinedRaw({
88
- mergedRaw,
89
- seam: start,
90
- start: { node, offset: start },
91
- end: { node, offset: end },
92
- linkRef,
93
- typed,
94
- ambientPrefix
95
- }, presentationMode);
96
- if (joined.raw === mergedRaw)
97
- return null;
98
- // The insert lands where the two sides now meet — the paste-at-a-cleaned-seam rule: cleanup
99
- // runs in the DELETE half, and the commit's own re-parse settles what the new bytes make of it.
100
- return {
101
- raw: joined.raw.slice(0, joined.seam) + typed + joined.raw.slice(joined.seam),
102
- caret: joined.seam + typed.length
103
- };
104
- }
105
- /** The rewrite of `[start, end)` to `typed` a gesture the surface consumed installs, where a
106
- * delete is the empty one. The seam's cleaned bytes where it has them, else the literal display
107
- * splice with the caret past the insert: the fallback's one home, so no arm can drift. */
108
- export function replaceRangeRaw(node, range, typed, presentationMode, linkRef, ambientPrefix) {
109
- const cleaned = resolveSelectionEdit(node, range, typed, presentationMode, linkRef, ambientPrefix);
110
- if (cleaned)
111
- return cleaned;
112
- const display = trimTrailingLineEnding(node.raw);
113
- return {
114
- raw: display.slice(0, range.start) +
115
- typed +
116
- display.slice(range.end) +
117
- trailingLineEnding(node.raw),
118
- caret: range.start + typed.length
119
- };
120
- }
121
54
  // ── Reading the event ────────────────────────────────────────────────────────
122
- /**
123
- * The range the pending edit will rewrite. `getTargetRanges()` is the authority — a word or line
124
- * delete at a COLLAPSED caret reports the run, not the caret — and is feature-detected because
125
- * jsdom implements no such method.
126
- */
55
+ /** The range the pending edit will rewrite, from `getTargetRanges()`, since a word delete reports
56
+ * the run rather than the caret. Feature-detected because jsdom has no such method. */
127
57
  function pendingEditRange(e, cursor) {
128
58
  const targets = typeof e.getTargetRanges === 'function' ? e.getTargetRanges() : [];
129
59
  return targets.length > 0 ? cursor.rawRangeOf(targets[0]) : cursor.getRawSelection();
130
60
  }
131
- /**
132
- * The inputs that rewrite the range they target: every delete family — word, line, drag, cut,
133
- * forward, backward — plus the two that replace it with text. Paste and composition carry seams of
134
- * their own; composing is excluded by the NAME and by the flag rather than by listing the two
135
- * delete types today's engines spell, since `composition-seat.ts` owns that window end to end and a
136
- * second resolution here writes the block twice.
137
- */
61
+ /** The inputs that rewrite the range they target. Composition is excluded by name and flag, since
62
+ * `composition-seat.ts` handles it start to finish and a second write here would double it. */
138
63
  function rewritesTargetRange(e) {
139
64
  if (e.isComposing || /composition/i.test(e.inputType))
140
65
  return false;
@@ -142,9 +67,8 @@ function rewritesTargetRange(e) {
142
67
  e.inputType === 'insertText' ||
143
68
  e.inputType === 'insertReplacementText');
144
69
  }
145
- /** What an input writes over its range, or null for a payload this seam may not read: text riding
146
- * a `dataTransfer` would reach the commit's re-parse without the paste transforms (G4.11), and a
147
- * swallowed press is sounder than turning a replacement into a delete. */
70
+ /** What an input writes over its range, or null for `dataTransfer` text, which would skip the paste
71
+ * transforms (G4.11); consuming the key beats turning a replacement into a delete. */
148
72
  function replacementText(e) {
149
73
  return e.inputType.startsWith('delete') ? '' : e.data;
150
74
  }