@voithos-labs/aragonite 0.10.3 → 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 +12 -5
  3. package/dist/a11y-strings.js +61 -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 +13 -20
  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 +619 -1089
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +36 -67
  26. package/dist/components/SelectionOverlay.svelte.d.ts +6 -4
  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 +103 -100
  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 +35 -28
  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 +58 -32
  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 +144 -202
  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 +46 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +99 -144
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +3 -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 +9 -4
  102. package/dist/components/blocks/text/click-snap-guard.js +16 -5
  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 +164 -180
  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 -105
  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 +243 -208
  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 +13 -30
  144. package/dist/components/drag-handle.js +25 -63
  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 -31
  162. package/dist/components/editor-root-listeners.js +49 -46
  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 +26 -30
  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 +380 -0
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +14 -0
  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 +55 -68
  256. package/dist/core/inline/inline-widgets.js +55 -58
  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 +33 -17
  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 -7
  347. package/dist/cursor/height-oracle.js +26 -75
  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 +16 -8
  365. package/dist/cursor/scrollport.js +28 -5
  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 -13
  375. package/dist/cursor/visual-lines.js +72 -28
  376. package/dist/cursor/widget-edge-snap.d.ts +23 -0
  377. package/dist/cursor/widget-edge-snap.js +39 -0
  378. package/dist/cursor/widget-offset.d.ts +111 -102
  379. package/dist/cursor/widget-offset.js +352 -177
  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 +31 -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 +33 -52
  434. package/dist/editor-actions/focus/focus-landing.d.ts +11 -5
  435. package/dist/editor-actions/focus/focus-landing.js +29 -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 +55 -76
  465. package/dist/editor-actions/plugin/container.js +105 -186
  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 +91 -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 +38 -8
  550. package/dist/plugin.js +102 -74
  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 +113 -85
  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 -75
  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 +63 -47
  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 +18 -7
  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 +143 -292
  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 +79 -81
  695. package/dist/schema/commands.js +156 -116
  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 +9 -11
  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 +73 -78
  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 +93 -152
  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 +61 -104
  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 +53 -146
  807. package/dist/selection/dead-space-caret.d.ts +20 -28
  808. package/dist/selection/dead-space-caret.js +79 -87
  809. package/dist/selection/drag-pointer.d.ts +22 -5
  810. package/dist/selection/drag-pointer.js +63 -31
  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 -39
  816. package/dist/selection/keyboard-extend.js +94 -116
  817. package/dist/selection/multi-click.d.ts +37 -0
  818. package/dist/selection/multi-click.js +197 -0
  819. package/dist/selection/native-bridge.d.ts +30 -37
  820. package/dist/selection/native-bridge.js +80 -100
  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 +31 -14
  824. package/dist/selection/path-lookup.js +110 -20
  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 +9 -0
  828. package/dist/selection/pointer-gesture.js +11 -0
  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 -33
  832. package/dist/selection/primitives.js +61 -53
  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 -19
  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 +52 -0
  852. package/dist/selection/selection-drop.js +317 -0
  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 +75 -53
  864. package/dist/styles/editor.css +248 -139
  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 +19 -0
  960. package/dist/tree-operations/paste/replacement-parse.js +24 -0
  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 +329 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +267 -183
  996. package/docs/guide/plugin-guide.md +341 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +17 -21
  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/invariants/split-landing.d.ts +0 -8
  1015. package/dist/invariants/split-landing.js +0 -15
  1016. package/dist/selection/double-click-trim.d.ts +0 -17
  1017. package/dist/selection/double-click-trim.js +0 -57
  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 -29
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -75
@@ -1,32 +1,27 @@
1
1
  /**
2
- * The single caret-edge dispatch (G4.12): a plain Backspace/Delete or printable key at a caret
3
- * edge in a prose block resolves against a declarative policy — the construct class's for an
4
- * inline neighbour, the ancestor container's for a content-start key — never native
5
- * contenteditable mutation, which would corrupt the atomic bytes those stand for.
2
+ * The one place a caret-edge key is decided in a prose block. A plain Backspace, Delete or
3
+ * printable key at a caret edge resolves against a declared policy (the inline construct's beside
4
+ * the caret, or the ancestor container's at the content start), never native editing, which would
5
+ * corrupt the bytes those constructs stand for (G4.12).
6
6
  */
7
7
  import { resolvedInlineContent } from '../../../core/inline/inline-cache';
8
- import { getContentRange } from '../../../core/inline';
8
+ import { getContentRange, sameLineSuffix } from '../../../core/inline';
9
9
  import { getInlineWidgetEditing } from '../../../core/inline/inline-widgets';
10
- import { trimTrailingLineEnding, trailingLineEnding } from '../../../core/lines';
10
+ import { trailingLineEnding, trimTrailingLineEnding } from '../../../core/lines';
11
11
  import {} from '../../../cursor/coordinate-spaces';
12
- import { hasSelection as hasSelectionHelper } from '../../../cursor/content-offsets';
13
- import { landableRawBounds, revealsNoMarkers, screenVisibilityOf } from '../../../cursor/widget-offset';
14
- import { ambientSpanOf } from '../../../ambient/ambient-dom';
12
+ import { hiddenSuffixLength, landableRawBounds, markerPrefixOf, revealsNoMarkers, screenVisibilityOf } from '../../../cursor/widget-offset';
15
13
  import { recordIslandKeyScan } from '../../../perf/instruments';
16
14
  import { caretIsInTextContent, hasModifier, isPlainTypingKey } from './click-snap-guard';
17
15
  import { createMarkerCompletion } from './marker-completion';
18
16
  import { resolveEdgeDeletion } from './construct-edge-delete';
19
- import { hidesStructuralSuffix } from './hidden-suffix';
20
17
  import { resolveEdgeSeat } from './edge-seat';
21
- import { deleteRangeRaw } from './live-selection-edit';
18
+ import { replaceRangeInLeaf } from '../../../tree-operations/leaf-range';
19
+ import { openHardBreakLine } from './text-keydown';
22
20
  import { resolveMarkedInsertion } from './pending-mark-insert';
23
21
  import { widgetAtCursor } from './widget-adjacency';
24
- import { resolveDelimiterAutoPair } from './delimiter-autopair';
25
- import { soleProseReparse } from './screen-diff';
26
- /** Whether `line` still reloads as `node`'s kind, the auto-pair resolver's guard. */
27
- export function keepsBlockKind(node, line) {
28
- return soleProseReparse(line + trailingLineEnding(node.raw))?.block.kind === node.kind;
29
- }
22
+ import { noteOwnPair, resolveDelimiterAutoPair } from './delimiter-autopair';
23
+ import { keepsKindAt } from '../../../core/inline/live-edit/read-back';
24
+ import { hidesMarkers } from '../../../presentation-mode';
30
25
  const REPLACE_ISLAND_POLICY = {
31
26
  onEdge: 'select',
32
27
  deleteGranularity: 'select-then-delete'
@@ -52,7 +47,7 @@ export function createEdgePolicyDispatch(deps) {
52
47
  },
53
48
  {
54
49
  id: 'reading-mode',
55
- reason: 'islands and the ambient marker are destructive-only view guards, so reading skips every arm below; the widget arm above still selects, committing nothing',
50
+ reason: 'inline widgets and the container’s marker prefix are destructive-only view guards, so reading skips every branch below; the widget branch above still selects, committing nothing',
56
51
  cut: true,
57
52
  claims: () => deps.isReading()
58
53
  },
@@ -66,13 +61,8 @@ export function createEdgePolicyDispatch(deps) {
66
61
  reason: 'a selection into the ambient span blocks native delete silently, with no beforeinput',
67
62
  claims: handleAmbient
68
63
  },
69
- // The four below claim only what would otherwise reach native editing or the block-merge
70
- // command; the more specific families above still own a key aimed at one of theirs.
71
- {
72
- id: 'hidden-suffix-delete',
73
- reason: 'the merge this press would reach concatenates past the block’s own hidden structure',
74
- claims: handleHiddenSuffixDelete
75
- },
64
+ // The three below handle only what would otherwise reach native editing or the block-merge
65
+ // command; the more specific families above still take a key aimed at one of theirs.
76
66
  {
77
67
  id: 'construct-edge-delete',
78
68
  reason: 'a destructive key beside an unpainted delimiter run takes content, never a marker',
@@ -97,32 +87,34 @@ export function createEdgePolicyDispatch(deps) {
97
87
  return false;
98
88
  }
99
89
  function inlinesOf(node) {
100
- return resolvedInlineContent(node, deps.linkRef);
90
+ return resolvedInlineContent(node, deps.reading);
101
91
  }
102
92
  function display() {
103
93
  return trimTrailingLineEnding(deps.node.raw);
104
94
  }
105
- /** One display-space rewrite, one CST commit. `caretBefore` anchors the undo entry, so it
106
- * is the pre-edit caret — the rewrite's own start everywhere but the seats, which moved it. */
95
+ /** One rewrite of the displayed text, one CST commit. `caretBefore` anchors the undo entry, so
96
+ * it is the caret before the edit: the rewrite's own start, unless a hidden run moved it. */
107
97
  function writeDisplay(next, caretAfter, source, caretBefore) {
108
- void deps.blockEdit.updateBlockContent(deps.index, next + trailingLineEnding(deps.node.raw), caretBefore, caretAfter);
109
- deps.setPendingCursor(caretAfter, source, next);
98
+ const write = deps.blockEdit.updateBlockContent(deps.index, next + trailingLineEnding(deps.node.raw, deps.getLineEnding()), 'authored', caretBefore, caretAfter);
99
+ if (write.admitted)
100
+ deps.setPendingCursor(write.caret, source);
110
101
  }
102
+ /** `[start, end)` replaced by `insert` through the in-leaf range replace, the store read at the
103
+ * key. */
111
104
  function editDisplay(start, end, insert, source = 'island', caretBefore = start) {
112
- const d = display();
113
- writeDisplay(d.slice(0, start) + insert + d.slice(end), start + insert.length, source, caretBefore);
105
+ const edit = replaceRangeInLeaf(deps.node, { start, end }, insert, deps.storedAs());
106
+ const write = deps.blockEdit.updateBlockContent(deps.index, edit.raw, 'authored', caretBefore, edit.caret);
107
+ if (write.admitted)
108
+ deps.setPendingCursor(write.caret, source);
114
109
  }
115
- // ── The seams the arms below defer to ────────────────────────────────────
116
- /**
117
- * The rung a range rewrite can be asked about. Past the reading cut a surface revealing no
118
- * marker is live, the one mode whose seam has unpainted runs to clean; every other rung takes
119
- * the literal edit the engine would have written.
120
- */
121
- function joinSeamMode(el) {
122
- return revealsNoMarkers(el) ? 'live' : undefined;
110
+ /** The selected range, or null at a plain caret; every branch reads it here. Empty when both ends
111
+ * clamp into the marker prefix, so a branch that writes bytes checks `end > start` first. */
112
+ function heldRange() {
113
+ return deps.getRawSelection();
123
114
  }
115
+ // ── The shared helpers the branches below use ────────────────────────────
124
116
  /** What the construct-edge rule (live-mode.md § 4.4) does with a destructive key here, or null
125
- * where the surface paints its markers and the byte beside the caret is one the reader saw. */
117
+ * where the block draws its markers and the byte beside the caret is one the user can see. */
126
118
  function edgeDeletionAt(el, caret, direction) {
127
119
  if (!revealsNoMarkers(el))
128
120
  return null;
@@ -133,22 +125,40 @@ export function createEdgePolicyDispatch(deps) {
133
125
  direction,
134
126
  screen: screenVisibilityOf(el),
135
127
  inlines: inlinesOf(deps.node),
136
- installedAs: deps.installedAs
128
+ store: deps.storedAs()
137
129
  });
138
130
  }
139
- /** A press with no sound rewrite writes nothing: the engine's version would paint the
131
+ /** A keypress with no safe rewrite writes nothing: the browser's version would show the
140
132
  * delimiters the rule was hiding. */
141
133
  function applyEdgeDeletion(deletion, caretBefore) {
142
134
  if ('swallow' in deletion)
143
135
  return;
144
136
  writeDisplay(deletion.raw, deletion.caret, 'construct-delete', caretBefore);
137
+ // Pended after the write, since the write clears pending marks; the caret has not moved, so
138
+ // the format waits for the next insertion (live-mode.md § 4.4).
139
+ for (const kind of deletion.unwrappedMarks)
140
+ deps.pendingMarks.toggle(kind);
145
141
  }
146
- /** Where a printable byte belongs when the caret sits at an unpainted delimiter run
142
+ /** Where a printable byte belongs when the caret sits at a hidden delimiter run
147
143
  * (live-mode.md § 4.2), or null when no run is touched and the caret's own offset stands. */
148
144
  function typingSeatAt(el, caret, typed) {
149
145
  if (!revealsNoMarkers(el))
150
146
  return null;
151
- return resolveEdgeSeat(caret, inlinesOf(deps.node), deps.getEdgeAffinity(), deps.node.raw, screenVisibilityOf(el), typed);
147
+ return resolveEdgeSeat(caret, inlinesOf(deps.node), deps.getEdgeAffinity(), deps.node.raw, screenVisibilityOf(el), typed, deps.reading);
148
+ }
149
+ /** A printable byte the browser would drop at an element-level caret. Over a range it replaces
150
+ * through the join rules; at a caret the hidden-run rules pick which side it lands on. */
151
+ function writeTypedByte(el, caretOffset, typed, source) {
152
+ const range = heldRange();
153
+ if (range && range.end > range.start) {
154
+ const edit = replaceRangeInLeaf(deps.node, range, typed, deps.storedAs());
155
+ const write = deps.blockEdit.updateBlockContent(deps.index, edit.raw, 'authored', range.start, edit.caret);
156
+ if (write.admitted)
157
+ deps.setPendingCursor(write.caret, source);
158
+ return;
159
+ }
160
+ const seatedAt = typingSeatAt(el, caretOffset, typed)?.offset ?? caretOffset;
161
+ editDisplay(seatedAt, seatedAt, typed, source, caretOffset);
152
162
  }
153
163
  // ── CST inline widget ────────────────────────────────────────────────────
154
164
  function handleCstWidget(e, caretOffset) {
@@ -160,34 +170,35 @@ export function createEdgePolicyDispatch(deps) {
160
170
  // Forward keys enter the widget after the caret, backward keys the one before, so
161
171
  // a caret between two adjacent widgets enters the one the key is aimed at.
162
172
  const direction = e.key === 'ArrowRight' || e.key === 'Delete' ? 'forward' : 'backward';
163
- const widgetAt = widgetAtCursor(caretOffset, inlinesOf(node), node.raw, direction);
173
+ const { grammar } = deps.reading;
174
+ const widgetAt = widgetAtCursor(caretOffset, inlinesOf(node), node.raw, direction, grammar);
164
175
  if (!widgetAt)
165
176
  return false;
166
- // Unchorded only: a modifier makes the key a word-scoped platform command, and
167
- // entering here would swap that word-step for the modal widget-selected state.
168
- const plainEdgeKey = !e.shiftKey && !hasModifier(e);
177
+ // Past the early return: every keystroke in every prose block reaches the line above, so
178
+ // the work below stays off that path.
179
+ const range = heldRange();
180
+ // No modifier, and a collapsed caret: a modifier makes the key a word-scoped platform
181
+ // command, and a selected range is an edit of that range, not an entry into a construct.
182
+ const plainEdgeKey = !e.shiftKey && !hasModifier(e) && !range;
169
183
  const enterFromRight = plainEdgeKey && widgetAt.atRight && (e.key === 'ArrowLeft' || e.key === 'Backspace');
170
184
  const enterFromLeft = plainEdgeKey && !widgetAt.atRight && (e.key === 'ArrowRight' || e.key === 'Delete');
171
185
  if (enterFromRight || enterFromLeft) {
172
186
  const isDestructive = e.key === 'Backspace' || e.key === 'Delete';
173
- const policy = deps.widgetEdgePolicy?.(widgetAt) ?? getInlineWidgetEditing(widgetAt.kind);
174
- // A step-over widget reads as one character to navigation, so decline and let
175
- // native carry the caret across. Only navigation steps over; a destructive key
176
- // still runs the atomic-delete branch below.
187
+ const policy = deps.widgetEdgePolicy?.(widgetAt) ?? getInlineWidgetEditing(widgetAt.kind, grammar);
188
+ // A step-over widget reads as one character to navigation, so the browser carries the
189
+ // caret across; a destructive key still runs the atomic-delete branch below.
177
190
  if (!isDestructive && policy?.onEdge === 'step-over')
178
191
  return false;
179
192
  e.preventDefault();
180
193
  deps.setSnapTarget(null);
181
194
  if (isDestructive && policy?.deleteGranularity === 'atomic' && !deps.isReading()) {
182
- // One press takes the whole construct, anchored at the pre-delete caret so
183
- // Ctrl+Z lands there.
184
- const newRaw = node.raw.slice(0, widgetAt.start) + node.raw.slice(widgetAt.end);
185
- void deps.blockEdit.updateBlockContent(deps.index, newRaw, caretOffset, widgetAt.start);
186
- deps.setPendingCursor(widgetAt.start, 'widget');
195
+ // One keypress takes the whole construct, anchored at the caret before the delete
196
+ // so Ctrl+Z lands there.
197
+ editDisplay(widgetAt.start, widgetAt.end, '', 'widget', caretOffset);
187
198
  return true;
188
199
  }
189
- // `onEdge: 'select'`, plus the reveal-capable kinds `enterWidget` routes to
190
- // their source reveal instead.
200
+ // `onEdge: 'select'`, plus the kinds `enterWidget` sends to their source instead of
201
+ // selecting.
191
202
  deps.enterWidget(widgetAt, enterFromRight);
192
203
  return true;
193
204
  }
@@ -200,19 +211,12 @@ export function createEdgePolicyDispatch(deps) {
200
211
  !deps.isReading()) {
201
212
  e.preventDefault();
202
213
  deps.setSnapTarget(null);
203
- const typed = e.key;
204
- // This branch owns only the fact that the engine drops the key beside a widget; which
205
- // side of an unpainted run the byte belongs on is still the seat's answer.
206
- const seatedAt = typingSeatAt(el, caretOffset, typed)?.offset ?? caretOffset;
207
- const newRaw = node.raw.slice(0, seatedAt) + typed + node.raw.slice(seatedAt);
208
- const postEdit = seatedAt + typed.length;
209
- void deps.blockEdit.updateBlockContent(deps.index, newRaw, caretOffset, postEdit);
210
- deps.setPendingCursor(postEdit, 'widget', newRaw);
214
+ writeTypedByte(el, caretOffset, e.key, 'widget');
211
215
  return true;
212
216
  }
213
217
  return false;
214
218
  }
215
- // ── Decoration island ────────────────────────────────────────────────────
219
+ // ── Decoration widgets ───────────────────────────────────────────────────
216
220
  function islandsInDom(el) {
217
221
  recordIslandKeyScan();
218
222
  const out = [];
@@ -237,12 +241,12 @@ export function createEdgePolicyDispatch(deps) {
237
241
  sel.addRange(range);
238
242
  }
239
243
  function handleIsland(e, caretOffset) {
240
- // Modifier chords stay native; the island rules own only the plain edge presses.
244
+ // Modifier chords stay with the browser; these rules take only the plain edge keys.
241
245
  const isDestructive = !hasModifier(e) && (e.key === 'Backspace' || e.key === 'Delete');
242
246
  const isTyping = isPlainTypingKey(e);
243
247
  if (!isDestructive && !isTyping)
244
248
  return false;
245
- // Island-free blocks, the common case, skip the per-keystroke DOM scan entirely.
249
+ // Blocks with no decoration widgets, the common case, skip the per-keystroke DOM scan.
246
250
  if (!deps.hasIslands())
247
251
  return false;
248
252
  const el = deps.getEl();
@@ -251,11 +255,11 @@ export function createEdgePolicyDispatch(deps) {
251
255
  const islands = islandsInDom(el);
252
256
  if (islands.length === 0)
253
257
  return false;
254
- // Second press: the native selection already wraps a replace island, so delete its
258
+ // Second keypress: the browser selection already wraps a replace widget, so delete its
255
259
  // whole hidden range through the CST as one undo entry.
256
260
  if (isDestructive) {
257
- const selection = deps.getRawSelection();
258
- if (selection && selection.start < selection.end) {
261
+ const selection = heldRange();
262
+ if (selection) {
259
263
  const selected = islands.find((i) => islandPolicy(i).onEdge === 'select' &&
260
264
  i.start === selection.start &&
261
265
  i.end === selection.end);
@@ -264,15 +268,15 @@ export function createEdgePolicyDispatch(deps) {
264
268
  editDisplay(selected.start, selected.end, '');
265
269
  return true;
266
270
  }
267
- // A different non-empty selection — leave it to the normal delete paths.
271
+ // A different non-empty selection: leave it to the normal delete paths.
268
272
  return false;
269
273
  }
270
274
  }
271
275
  if (caretOffset === null)
272
276
  return false;
273
277
  const contentLength = display().length;
274
- // First press: selecting the whole island is the only visible thing to eat, since
275
- // the range it hides has no on-screen bytes of its own.
278
+ // First keypress: selecting the whole widget is the only visible thing to delete, since
279
+ // the range it hides has no bytes of its own on screen.
276
280
  if (isDestructive) {
277
281
  const wantTrailingEdge = e.key === 'Backspace';
278
282
  const target = islands.find((i) => islandPolicy(i).onEdge === 'select' &&
@@ -283,8 +287,8 @@ export function createEdgePolicyDispatch(deps) {
283
287
  return true;
284
288
  }
285
289
  }
286
- // A step-over island is transparent to the adjacent real byte; at a true block
287
- // boundary there is none, so fall through and let block merge fire.
290
+ // A step-over widget is transparent to the real byte beside it; at a true block
291
+ // boundary there is none, so fall through and let the block merge run.
288
292
  const widget = islands.find((i) => islandPolicy(i).onEdge === 'step-over' && i.start === caretOffset);
289
293
  if (!widget)
290
294
  return false;
@@ -295,9 +299,8 @@ export function createEdgePolicyDispatch(deps) {
295
299
  : null;
296
300
  if (direction !== null) {
297
301
  e.preventDefault();
298
- // The adjacent RAW byte is not always the adjacent real one: beside an unpainted
299
- // delimiter run the construct-edge rule owns which byte a press takes (§ 4.4), and
300
- // this arm outranks it, so it asks rather than splices.
302
+ // Beside a hidden delimiter run the construct-edge rule decides which byte a key takes
303
+ // (`docs/design/live-mode.md` § 4.4), and this branch outranks it, so it asks that rule.
301
304
  const deletion = edgeDeletionAt(el, caretOffset, direction);
302
305
  if (deletion)
303
306
  applyEdgeDeletion(deletion, caretOffset);
@@ -307,28 +310,28 @@ export function createEdgePolicyDispatch(deps) {
307
310
  editDisplay(caretOffset, caretOffset + 1, '');
308
311
  return true;
309
312
  }
310
- // Cross-browser defence: some engines drop printable keys at an element-level caret
311
- // adjacent to a contenteditable=false island. Chromium types natively, masking this
312
- // branch in e2e, so it is unit-pinned instead.
313
+ // Some browsers drop printable keys at an element-level caret beside a non-editable widget.
314
+ // Chromium types them, so a unit test, not e2e, covers this branch.
313
315
  if (isTyping && !caretIsInTextContent(el, window.getSelection())) {
314
316
  e.preventDefault();
315
- editDisplay(caretOffset, caretOffset, e.key);
317
+ writeTypedByte(el, caretOffset, e.key, 'island');
316
318
  return true;
317
319
  }
318
320
  return false;
319
321
  }
320
- // ── Ambient marker overlap ─────────────────────────────────────────────────
321
- // A selection reaching into the contenteditable="false" ambient span blocks native
322
- // Backspace/Delete silently — no beforeinput fires — so delete through the CST.
322
+ // ── Container marker prefix overlap ────────────────────────────────────────
323
+ // A selection reaching into the contenteditable="false" marker prefix blocks the browser's
324
+ // Backspace and Delete silently, with no beforeinput, so delete through the CST instead.
323
325
  function handleAmbient(e) {
324
326
  if (e.key !== 'Backspace' && e.key !== 'Delete')
325
327
  return false;
326
- if (!hasSelectionHelper())
328
+ const range = heldRange();
329
+ if (!range)
327
330
  return false;
328
331
  const el = deps.getEl();
329
- if (!el || deps.getAmbientLength() <= 0)
332
+ if (!el)
330
333
  return false;
331
- const ambient = ambientSpanOf(el);
334
+ const ambient = markerPrefixOf(el);
332
335
  const sel = window.getSelection();
333
336
  const touchesAmbient = !!ambient &&
334
337
  !!sel &&
@@ -337,57 +340,35 @@ export function createEdgePolicyDispatch(deps) {
337
340
  if (!touchesAmbient)
338
341
  return false;
339
342
  e.preventDefault();
340
- const range = deps.getRawSelection();
341
- if (range && range.start < range.end) {
342
- // Consumed at KEYDOWN, so no `beforeinput` carries this range to the shared seam: the arm
343
- // asks it here, or a literal splice prints the runs the cut stranded (live-mode.md § 4.5).
344
- const edit = deleteRangeRaw(deps.node, range, joinSeamMode(el), deps.linkRef, deps.getAmbientPrefix?.() ?? '');
345
- void deps.blockEdit.updateBlockContent(deps.index, edit.raw, range.start, edit.caret);
346
- deps.setPendingCursor(edit.caret, 'ambient-delete');
343
+ // A selection holding only the marker prefix covers no content byte, so there is nothing
344
+ // to delete and the press is consumed with no commit.
345
+ if (range.end > range.start) {
346
+ // Handled at keydown, so this branch asks the join rules itself, or a literal splice would
347
+ // print the delimiter runs the cut stranded (`docs/design/live-mode.md` § 4.5).
348
+ const edit = replaceRangeInLeaf(deps.node, range, '', deps.storedAs());
349
+ const write = deps.blockEdit.updateBlockContent(deps.index, edit.raw, 'authored', range.start, edit.caret);
350
+ if (write.admitted)
351
+ deps.setPendingCursor(write.caret, 'ambient-delete');
347
352
  }
348
353
  return true;
349
354
  }
350
- // ── Hidden structural suffix ───────────────────────────────────────────────
351
- /**
352
- * Delete at the content end of a block whose own structure sits after it: the merge this press
353
- * would reach concatenates past that suffix, so the press is consumed. The rule itself lives in
354
- * `hidden-suffix.ts`; the command arm asks the same question from its own coordinates.
355
- */
356
- function handleHiddenSuffixDelete(e, caretOffset) {
357
- if (e.key !== 'Delete')
358
- return false;
359
- if (e.shiftKey || hasModifier(e))
360
- return false;
361
- if (caretOffset === null || hasSelectionHelper())
362
- return false;
363
- if (caretOffset !== getContentRange(deps.node).end)
364
- return false;
365
- if (!hidesStructuralSuffix(deps.getEl(), deps.node, display().length))
366
- return false;
367
- e.preventDefault();
368
- return true;
369
- }
370
- // ── Hidden construct edge (the destructive arm) ────────────────────────────
371
- /**
372
- * A plain Backspace/Delete against an inline construct's unpainted delimiter run: the rewrite
373
- * takes the adjacent CONTENT character instead of a byte the reader never saw, plus the
374
- * delimiters that leaves enclosing nothing (live-mode.md § 4.4).
375
- */
355
+ // ── Hidden construct edge (deleting) ───────────────────────────────────────
356
+ /** A plain Backspace or Delete against a hidden delimiter run takes the neighbouring content
357
+ * character instead of a byte the user never saw (`docs/design/live-mode.md` § 4.4). */
376
358
  function handleConstructEdgeDelete(e, caretOffset) {
377
359
  if (e.key !== 'Backspace' && e.key !== 'Delete')
378
360
  return false;
379
361
  if (e.shiftKey || hasModifier(e))
380
362
  return false;
381
- if (caretOffset === null || hasSelectionHelper())
363
+ if (caretOffset === null || heldRange())
382
364
  return false;
383
365
  const el = deps.getEl();
384
366
  if (!el)
385
367
  return false;
386
- // The landable start is visual column 0, where Backspace is a block gesture (merge or
387
- // inert): an atomic run straddling the start would otherwise take the first visible
388
- // glyph forward.
368
+ // At the first offset the caret can sit at, Backspace is a block gesture (merge, or nothing),
369
+ // not a delete of the first visible character past a hidden run.
389
370
  if (e.key === 'Backspace') {
390
- const bounds = landableRawBounds(el, deps.getAmbientLength());
371
+ const bounds = landableRawBounds(el);
391
372
  if (bounds && caretOffset <= bounds.start)
392
373
  return false;
393
374
  }
@@ -399,57 +380,57 @@ export function createEdgePolicyDispatch(deps) {
399
380
  applyEdgeDeletion(deletion, caretOffset);
400
381
  return true;
401
382
  }
402
- // ── Pending marks (the toggle seat) ────────────────────────────────────────
403
- /**
404
- * The byte that completes a hard break made at the END of a block. `insertHardBreak` writes
405
- * `\\` plus the block's ending there, but that ending IS the block's trailing one, so the
406
- * display stops at the backslash and the caret has nowhere to sit past it. The next
407
- * printable key is what supplies the following line: it lands AFTER the break rather than
408
- * between the backslash and its newline, where it would read as content and undo the break.
409
- */
383
+ // ── Hard break at the block end, pending marks ─────────────────────────────
384
+ /** A key typed on a hard break at the end of a block's content goes on the new line, not
385
+ * between the backslash and its line ending, where it would undo the break. */
410
386
  function handleTransitionalHardBreak(e, caretOffset) {
411
387
  if (deps.isReading())
412
388
  return false;
413
- if (!isPlainTypingKey(e) || caretOffset === null || hasSelectionHelper())
389
+ if (!isPlainTypingKey(e) || caretOffset === null || heldRange())
414
390
  return false;
415
391
  const d = display();
416
- // Only at the very end, and only when the block's last byte is the break's backslash.
417
- if (caretOffset !== d.length || !d.endsWith('\\'))
392
+ const contentEnd = getContentRange(deps.node).end;
393
+ // A heading's closing run stays on the heading's line, so the new line starts past it.
394
+ const lineEnd = contentEnd + sameLineSuffix(deps.node).length;
395
+ const el = deps.getEl();
396
+ // The caret past the backslash, or where the new line is drawn (`paintPendingBreak`, past
397
+ // the run); a hidden run draws its whole span at that one spot.
398
+ const onBreak = el !== null && hiddenSuffixLength(el) > 0
399
+ ? caretOffset >= contentEnd && caretOffset <= lineEnd
400
+ : caretOffset === contentEnd ||
401
+ (hidesMarkers(deps.reading.mode()) && caretOffset === lineEnd);
402
+ const text = d.slice(0, contentEnd);
403
+ if (!onBreak || !text.endsWith('\\'))
418
404
  return false;
419
405
  // An escaped backslash (`\\\\`) is content, not a break.
420
- if (d.endsWith('\\\\'))
406
+ if (text.endsWith('\\\\'))
421
407
  return false;
422
408
  // Backslash before ASCII punctuation is an escape (`\|`, `\*`), never a break's backslash.
423
409
  if (/^[!-/:-@[-`{-~]$/.test(e.key))
424
410
  return false;
425
- const ending = trailingLineEnding(deps.node.raw);
411
+ const ending = trailingLineEnding(deps.node.raw, deps.getLineEnding());
426
412
  e.preventDefault();
427
413
  deps.setSnapTarget(null);
428
- const next = d + ending + e.key;
429
- writeDisplay(next, next.length, 'transitional-hard-break', caretOffset);
414
+ const opened = openHardBreakLine(d, lineEnd, ending, e.key);
415
+ writeDisplay(opened.display, opened.caret, 'transitional-hard-break', caretOffset);
430
416
  return true;
431
417
  }
432
- /**
433
- * A printable key while a collapsed-caret toggle has marks pending. Marks are the newer
434
- * instruction about the same bytes, so they outrank the arrival side the seat below reads
435
- * (live-mode.md § 4.2) and this arm runs first.
436
- */
418
+ /** A printable key while a toggle at a collapsed caret has marks pending. The marks are the newer
419
+ * instruction, so they outrank the arrival side (`docs/design/live-mode.md` § 4.3). */
437
420
  function handlePendingMarks(e, caretOffset) {
438
- if (deps.isReading())
439
- return false;
440
- if (!isPlainTypingKey(e) || caretOffset === null || hasSelectionHelper())
421
+ if (!isPlainTypingKey(e) || caretOffset === null || heldRange())
441
422
  return false;
442
- // Locally sound like the seat below: only a surface that paints no delimiter can be asked
443
- // to write one the user never sees. A mode flip clears the marks, so this strands nothing.
423
+ // Only a block that draws no delimiters holds pending marks; switching mode clears them, so
424
+ // nothing is stranded.
444
425
  const el = deps.getEl();
445
426
  if (!el || !revealsNoMarkers(el))
446
427
  return false;
447
- // Spend on the preconditions, not on the outcome: one insertion was promised the set,
448
- // and this is it whether or not the rewrite below finds anything to do.
428
+ // Spent on the conditions above, not on the outcome: one insertion was promised the
429
+ // marks, and this is it whether or not the rewrite below finds anything to do.
449
430
  const marks = deps.pendingMarks.consume();
450
431
  if (!marks)
451
432
  return false;
452
- const marked = resolveMarkedInsertion(display(), caretOffset, e.key, marks, inlinesOf(deps.node));
433
+ const marked = resolveMarkedInsertion(display(), caretOffset, e.key, marks, inlinesOf(deps.node), deps.reading);
453
434
  if (!marked)
454
435
  return false;
455
436
  e.preventDefault();
@@ -458,34 +439,32 @@ export function createEdgePolicyDispatch(deps) {
458
439
  return true;
459
440
  }
460
441
  // ── Container marker completion ────────────────────────────────────────────
461
- /**
462
- * A bare space at the content start of an empty child whose container declares
463
- * `contentStartSpace`. Consumed, not written: the container's `rebuildRaw` re-emits it the
464
- * moment content arrives, so inserting it here would double the marker's own space. The
465
- * claim is once per child; a later space at the same seat is content.
466
- */
442
+ /** A bare space at a child's content start, while its container's marker lacks its space, is
443
+ * consumed once: the container's `rebuildRaw` writes it back, so writing it here would double it. */
467
444
  function handleMarkerCompletion(e, caretOffset) {
468
445
  const bareSpace = e.key === ' ' && !e.shiftKey && !hasModifier(e);
469
- if (!bareSpace || caretOffset === null || hasSelectionHelper())
446
+ if (!bareSpace || caretOffset === null || heldRange())
470
447
  return false;
471
- if (!markerCompletion.claimSpace(deps.node, deps.containerParent, caretOffset))
448
+ const { node, containerParent, index } = deps;
449
+ if (!markerCompletion.claimSpace(node, containerParent, index, caretOffset))
472
450
  return false;
473
451
  e.preventDefault();
474
452
  return true;
475
453
  }
476
- // ── Hidden construct edge (the typing seat) ────────────────────────────────
477
- /**
478
- * A printable key at an inline construct's unpainted delimiter run. Chromium canonicalizes a
479
- * collapsed caret upstream across a non-rendered run, so the DOM caret cannot carry the answer
480
- * and the byte is written through the CST at the offset the policy and arrival name.
481
- */
454
+ // ── Hidden construct edge (typing) ─────────────────────────────────────────
455
+ /** A printable key at a hidden delimiter run is written through the CST, since Chromium moves a
456
+ * collapsed caret back across a run it does not render (`docs/design/live-mode.md` § 4.2). */
482
457
  function handleConstructSeat(e, caretOffset) {
483
- if (!isPlainTypingKey(e) || caretOffset === null || hasSelectionHelper())
458
+ if (!isPlainTypingKey(e) || caretOffset === null || heldRange())
484
459
  return false;
485
- // A delimiter typed over its own closer is the auto-pair's step-over, which the beforeinput
486
- // arm owns (delimiter-autopair.ts); seated outside the run it would be typed instead.
460
+ // A delimiter typed over its own closing one is the auto-pair's step-over, handled on
461
+ // beforeinput (delimiter-autopair.ts); placed outside the run it would be typed instead.
487
462
  const content = getContentRange(deps.node);
488
- const autoPair = resolveDelimiterAutoPair(display(), content, caretOffset, e.key);
463
+ const { reading, ownPairs } = deps;
464
+ const text = display();
465
+ const autoPair = resolveDelimiterAutoPair(text, content, caretOffset, e.key, reading, {
466
+ ownPair: ownPairs.consult(text, caretOffset)
467
+ });
489
468
  if (autoPair?.kind === 'step-over')
490
469
  return false;
491
470
  const el = deps.getEl();
@@ -494,11 +473,16 @@ export function createEdgePolicyDispatch(deps) {
494
473
  return false;
495
474
  e.preventDefault();
496
475
  deps.setSnapTarget(null);
497
- // The seat decides WHERE the byte lands; what a delimiter keystroke writes there is still
498
- // the auto-pair's answer, or a byte seated past a run would arrive without its twin. The
499
- // kind rides the trace: it names the construct whose hidden edge the caret sat at.
500
- const paired = resolveDelimiterAutoPair(display(), content, seat.offset, e.key, (line) => keepsBlockKind(deps.node, line));
476
+ // The hidden-run rules decide where the byte lands; the auto-pair still decides what a delimiter
477
+ // writes there, or it would arrive without its closing partner.
478
+ const store = deps.storedAs();
479
+ const paired = resolveDelimiterAutoPair(text, content, seat.offset, e.key, reading, {
480
+ ownPair: ownPairs.consult(text, seat.offset),
481
+ // Each auto-pair caller asks this itself until the caret-edge key table gives it one caller.
482
+ keepsKind: (line) => keepsKindAt(deps.node, line, store)
483
+ });
501
484
  if (paired && paired.kind !== 'step-over') {
485
+ noteOwnPair(ownPairs, text, paired);
502
486
  writeDisplay(paired.text, paired.caret, `seat:${seat.kind}`, caretOffset);
503
487
  if (paired.kind === 'close')
504
488
  deps.noteOutside?.();