@voithos-labs/aragonite 0.10.4 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +11 -5
  3. package/dist/a11y-strings.js +60 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +12 -21
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +603 -1126
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +26 -51
  26. package/dist/components/SelectionOverlay.svelte.d.ts +5 -3
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +72 -87
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +29 -34
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +57 -39
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +141 -203
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +45 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +93 -147
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +1 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +8 -6
  102. package/dist/components/blocks/text/click-snap-guard.js +10 -7
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +150 -181
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -108
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +212 -199
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +12 -35
  144. package/dist/components/drag-handle.js +22 -68
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -24
  162. package/dist/components/editor-root-listeners.js +49 -24
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +14 -26
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +30 -35
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +3 -5
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +54 -75
  256. package/dist/core/inline/inline-widgets.js +54 -62
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +31 -15
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -6
  347. package/dist/cursor/height-oracle.js +26 -74
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +14 -15
  365. package/dist/cursor/scrollport.js +7 -13
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -14
  375. package/dist/cursor/visual-lines.js +45 -46
  376. package/dist/cursor/widget-edge-snap.d.ts +10 -15
  377. package/dist/cursor/widget-edge-snap.js +13 -12
  378. package/dist/cursor/widget-offset.d.ts +110 -104
  379. package/dist/cursor/widget-offset.js +344 -179
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +30 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +28 -50
  434. package/dist/editor-actions/focus/focus-landing.d.ts +8 -11
  435. package/dist/editor-actions/focus/focus-landing.js +15 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +54 -82
  465. package/dist/editor-actions/plugin/container.js +105 -188
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +88 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +37 -8
  550. package/dist/plugin.js +100 -77
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +78 -67
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -81
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +51 -45
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +15 -6
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +141 -310
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +78 -84
  695. package/dist/schema/commands.js +152 -117
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +8 -10
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +63 -80
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +92 -125
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +59 -96
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +51 -134
  807. package/dist/selection/dead-space-caret.d.ts +19 -30
  808. package/dist/selection/dead-space-caret.js +70 -88
  809. package/dist/selection/drag-pointer.d.ts +7 -9
  810. package/dist/selection/drag-pointer.js +23 -33
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -40
  816. package/dist/selection/keyboard-extend.js +94 -117
  817. package/dist/selection/multi-click.d.ts +13 -18
  818. package/dist/selection/multi-click.js +32 -38
  819. package/dist/selection/native-bridge.d.ts +29 -39
  820. package/dist/selection/native-bridge.js +78 -127
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +25 -16
  824. package/dist/selection/path-lookup.js +101 -18
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +5 -5
  828. package/dist/selection/pointer-gesture.js +5 -5
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -40
  832. package/dist/selection/primitives.js +57 -67
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -23
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +34 -16
  852. package/dist/selection/selection-drop.js +159 -95
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +60 -53
  864. package/dist/styles/editor.css +201 -143
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +9 -7
  960. package/dist/tree-operations/paste/replacement-parse.js +12 -10
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +327 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +253 -185
  996. package/docs/guide/plugin-guide.md +332 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +12 -16
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/cursor/scroll-hold.d.ts +0 -10
  1015. package/dist/cursor/scroll-hold.js +0 -22
  1016. package/dist/invariants/split-landing.d.ts +0 -8
  1017. package/dist/invariants/split-landing.js +0 -15
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -31
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -78
@@ -1,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 { replaceRangeRaw } 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,38 +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 range this surface holds, or null at a caret. A key aimed at one edits the RANGE: the
116
- * caret the arms read is only its start. */
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. */
117
112
  function heldRange() {
118
- const selection = deps.getRawSelection();
119
- return selection && selection.start < selection.end ? selection : null;
120
- }
121
- // ── The seams the arms below defer to ────────────────────────────────────
122
- /**
123
- * The rung a range rewrite can be asked about. Past the reading cut a surface revealing no
124
- * marker is live, the one mode whose seam has unpainted runs to clean; every other rung takes
125
- * the literal edit the engine would have written.
126
- */
127
- function joinSeamMode(el) {
128
- return revealsNoMarkers(el) ? 'live' : undefined;
113
+ return deps.getRawSelection();
129
114
  }
115
+ // ── The shared helpers the branches below use ────────────────────────────
130
116
  /** What the construct-edge rule (live-mode.md § 4.4) does with a destructive key here, or null
131
- * 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. */
132
118
  function edgeDeletionAt(el, caret, direction) {
133
119
  if (!revealsNoMarkers(el))
134
120
  return null;
@@ -139,32 +125,36 @@ export function createEdgePolicyDispatch(deps) {
139
125
  direction,
140
126
  screen: screenVisibilityOf(el),
141
127
  inlines: inlinesOf(deps.node),
142
- installedAs: deps.installedAs
128
+ store: deps.storedAs()
143
129
  });
144
130
  }
145
- /** 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
146
132
  * delimiters the rule was hiding. */
147
133
  function applyEdgeDeletion(deletion, caretBefore) {
148
134
  if ('swallow' in deletion)
149
135
  return;
150
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);
151
141
  }
152
- /** 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
153
143
  * (live-mode.md § 4.2), or null when no run is touched and the caret's own offset stands. */
154
144
  function typingSeatAt(el, caret, typed) {
155
145
  if (!revealsNoMarkers(el))
156
146
  return null;
157
- 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);
158
148
  }
159
- /** A printable byte an arm claimed because the engine drops it at an element-level caret. Over
160
- * a held range it REPLACES through the join seam, the road a mid-block range takes; at a caret
161
- * the seat answers which side of an unpainted run it lands on. */
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. */
162
151
  function writeTypedByte(el, caretOffset, typed, source) {
163
152
  const range = heldRange();
164
- if (range) {
165
- const edit = replaceRangeRaw(deps.node, range, typed, joinSeamMode(el), deps.linkRef, deps.getAmbientPrefix?.() ?? '');
166
- void deps.blockEdit.updateBlockContent(deps.index, edit.raw, range.start, edit.caret);
167
- deps.setPendingCursor(edit.caret, source, edit.raw);
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);
168
158
  return;
169
159
  }
170
160
  const seatedAt = typingSeatAt(el, caretOffset, typed)?.offset ?? caretOffset;
@@ -180,36 +170,35 @@ export function createEdgePolicyDispatch(deps) {
180
170
  // Forward keys enter the widget after the caret, backward keys the one before, so
181
171
  // a caret between two adjacent widgets enters the one the key is aimed at.
182
172
  const direction = e.key === 'ArrowRight' || e.key === 'Delete' ? 'forward' : 'backward';
183
- 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);
184
175
  if (!widgetAt)
185
176
  return false;
186
- // Below the bail: every keystroke in every prose block reaches the line above.
177
+ // Past the early return: every keystroke in every prose block reaches the line above, so
178
+ // the work below stays off that path.
187
179
  const range = heldRange();
188
- // Unchorded, and at a CARET: a modifier makes the key a word-scoped platform command, and
189
- // a held range is an edit of the range, not an entry into the construct beside its start.
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.
190
182
  const plainEdgeKey = !e.shiftKey && !hasModifier(e) && !range;
191
183
  const enterFromRight = plainEdgeKey && widgetAt.atRight && (e.key === 'ArrowLeft' || e.key === 'Backspace');
192
184
  const enterFromLeft = plainEdgeKey && !widgetAt.atRight && (e.key === 'ArrowRight' || e.key === 'Delete');
193
185
  if (enterFromRight || enterFromLeft) {
194
186
  const isDestructive = e.key === 'Backspace' || e.key === 'Delete';
195
- const policy = deps.widgetEdgePolicy?.(widgetAt) ?? getInlineWidgetEditing(widgetAt.kind);
196
- // A step-over widget reads as one character to navigation, so decline and let
197
- // native carry the caret across. Only navigation steps over; a destructive key
198
- // 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.
199
190
  if (!isDestructive && policy?.onEdge === 'step-over')
200
191
  return false;
201
192
  e.preventDefault();
202
193
  deps.setSnapTarget(null);
203
194
  if (isDestructive && policy?.deleteGranularity === 'atomic' && !deps.isReading()) {
204
- // One press takes the whole construct, anchored at the pre-delete caret so
205
- // Ctrl+Z lands there.
206
- const newRaw = node.raw.slice(0, widgetAt.start) + node.raw.slice(widgetAt.end);
207
- void deps.blockEdit.updateBlockContent(deps.index, newRaw, caretOffset, widgetAt.start);
208
- 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);
209
198
  return true;
210
199
  }
211
- // `onEdge: 'select'`, plus the reveal-capable kinds `enterWidget` routes to
212
- // their source reveal instead.
200
+ // `onEdge: 'select'`, plus the kinds `enterWidget` sends to their source instead of
201
+ // selecting.
213
202
  deps.enterWidget(widgetAt, enterFromRight);
214
203
  return true;
215
204
  }
@@ -227,7 +216,7 @@ export function createEdgePolicyDispatch(deps) {
227
216
  }
228
217
  return false;
229
218
  }
230
- // ── Decoration island ────────────────────────────────────────────────────
219
+ // ── Decoration widgets ───────────────────────────────────────────────────
231
220
  function islandsInDom(el) {
232
221
  recordIslandKeyScan();
233
222
  const out = [];
@@ -252,12 +241,12 @@ export function createEdgePolicyDispatch(deps) {
252
241
  sel.addRange(range);
253
242
  }
254
243
  function handleIsland(e, caretOffset) {
255
- // 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.
256
245
  const isDestructive = !hasModifier(e) && (e.key === 'Backspace' || e.key === 'Delete');
257
246
  const isTyping = isPlainTypingKey(e);
258
247
  if (!isDestructive && !isTyping)
259
248
  return false;
260
- // 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.
261
250
  if (!deps.hasIslands())
262
251
  return false;
263
252
  const el = deps.getEl();
@@ -266,7 +255,7 @@ export function createEdgePolicyDispatch(deps) {
266
255
  const islands = islandsInDom(el);
267
256
  if (islands.length === 0)
268
257
  return false;
269
- // 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
270
259
  // whole hidden range through the CST as one undo entry.
271
260
  if (isDestructive) {
272
261
  const selection = heldRange();
@@ -279,15 +268,15 @@ export function createEdgePolicyDispatch(deps) {
279
268
  editDisplay(selected.start, selected.end, '');
280
269
  return true;
281
270
  }
282
- // 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.
283
272
  return false;
284
273
  }
285
274
  }
286
275
  if (caretOffset === null)
287
276
  return false;
288
277
  const contentLength = display().length;
289
- // First press: selecting the whole island is the only visible thing to eat, since
290
- // 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.
291
280
  if (isDestructive) {
292
281
  const wantTrailingEdge = e.key === 'Backspace';
293
282
  const target = islands.find((i) => islandPolicy(i).onEdge === 'select' &&
@@ -298,8 +287,8 @@ export function createEdgePolicyDispatch(deps) {
298
287
  return true;
299
288
  }
300
289
  }
301
- // A step-over island is transparent to the adjacent real byte; at a true block
302
- // 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.
303
292
  const widget = islands.find((i) => islandPolicy(i).onEdge === 'step-over' && i.start === caretOffset);
304
293
  if (!widget)
305
294
  return false;
@@ -310,9 +299,8 @@ export function createEdgePolicyDispatch(deps) {
310
299
  : null;
311
300
  if (direction !== null) {
312
301
  e.preventDefault();
313
- // The adjacent RAW byte is not always the adjacent real one: beside an unpainted
314
- // delimiter run the construct-edge rule owns which byte a press takes (§ 4.4), and
315
- // 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.
316
304
  const deletion = edgeDeletionAt(el, caretOffset, direction);
317
305
  if (deletion)
318
306
  applyEdgeDeletion(deletion, caretOffset);
@@ -322,9 +310,8 @@ export function createEdgePolicyDispatch(deps) {
322
310
  editDisplay(caretOffset, caretOffset + 1, '');
323
311
  return true;
324
312
  }
325
- // Cross-browser defence: some engines drop printable keys at an element-level caret
326
- // adjacent to a contenteditable=false island. Chromium types natively, masking this
327
- // 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.
328
315
  if (isTyping && !caretIsInTextContent(el, window.getSelection())) {
329
316
  e.preventDefault();
330
317
  writeTypedByte(el, caretOffset, e.key, 'island');
@@ -332,18 +319,19 @@ export function createEdgePolicyDispatch(deps) {
332
319
  }
333
320
  return false;
334
321
  }
335
- // ── Ambient marker overlap ─────────────────────────────────────────────────
336
- // A selection reaching into the contenteditable="false" ambient span blocks native
337
- // 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.
338
325
  function handleAmbient(e) {
339
326
  if (e.key !== 'Backspace' && e.key !== 'Delete')
340
327
  return false;
341
- if (!hasSelectionHelper())
328
+ const range = heldRange();
329
+ if (!range)
342
330
  return false;
343
331
  const el = deps.getEl();
344
- if (!el || deps.getAmbientLength() <= 0)
332
+ if (!el)
345
333
  return false;
346
- const ambient = ambientSpanOf(el);
334
+ const ambient = markerPrefixOf(el);
347
335
  const sel = window.getSelection();
348
336
  const touchesAmbient = !!ambient &&
349
337
  !!sel &&
@@ -352,57 +340,35 @@ export function createEdgePolicyDispatch(deps) {
352
340
  if (!touchesAmbient)
353
341
  return false;
354
342
  e.preventDefault();
355
- const range = heldRange();
356
- if (range) {
357
- // Consumed at KEYDOWN, so no `beforeinput` carries this range to the shared seam: the arm
358
- // asks it here, or a literal splice prints the runs the cut stranded (live-mode.md § 4.5).
359
- const edit = replaceRangeRaw(deps.node, range, '', joinSeamMode(el), deps.linkRef, deps.getAmbientPrefix?.() ?? '');
360
- void deps.blockEdit.updateBlockContent(deps.index, edit.raw, range.start, edit.caret);
361
- 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');
362
352
  }
363
353
  return true;
364
354
  }
365
- // ── Hidden structural suffix ───────────────────────────────────────────────
366
- /**
367
- * Delete at the content end of a block whose own structure sits after it: the merge this press
368
- * would reach concatenates past that suffix, so the press is consumed. The rule itself lives in
369
- * `hidden-suffix.ts`; the command arm asks the same question from its own coordinates.
370
- */
371
- function handleHiddenSuffixDelete(e, caretOffset) {
372
- if (e.key !== 'Delete')
373
- return false;
374
- if (e.shiftKey || hasModifier(e))
375
- return false;
376
- if (caretOffset === null || hasSelectionHelper())
377
- return false;
378
- if (caretOffset !== getContentRange(deps.node).end)
379
- return false;
380
- if (!hidesStructuralSuffix(deps.getEl(), deps.node, display().length))
381
- return false;
382
- e.preventDefault();
383
- return true;
384
- }
385
- // ── Hidden construct edge (the destructive arm) ────────────────────────────
386
- /**
387
- * A plain Backspace/Delete against an inline construct's unpainted delimiter run: the rewrite
388
- * takes the adjacent CONTENT character instead of a byte the reader never saw, plus the
389
- * delimiters that leaves enclosing nothing (live-mode.md § 4.4).
390
- */
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). */
391
358
  function handleConstructEdgeDelete(e, caretOffset) {
392
359
  if (e.key !== 'Backspace' && e.key !== 'Delete')
393
360
  return false;
394
361
  if (e.shiftKey || hasModifier(e))
395
362
  return false;
396
- if (caretOffset === null || hasSelectionHelper())
363
+ if (caretOffset === null || heldRange())
397
364
  return false;
398
365
  const el = deps.getEl();
399
366
  if (!el)
400
367
  return false;
401
- // The landable start is visual column 0, where Backspace is a block gesture (merge or
402
- // inert): an atomic run straddling the start would otherwise take the first visible
403
- // 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.
404
370
  if (e.key === 'Backspace') {
405
- const bounds = landableRawBounds(el, deps.getAmbientLength());
371
+ const bounds = landableRawBounds(el);
406
372
  if (bounds && caretOffset <= bounds.start)
407
373
  return false;
408
374
  }
@@ -414,57 +380,57 @@ export function createEdgePolicyDispatch(deps) {
414
380
  applyEdgeDeletion(deletion, caretOffset);
415
381
  return true;
416
382
  }
417
- // ── Pending marks (the toggle seat) ────────────────────────────────────────
418
- /**
419
- * The byte that completes a hard break made at the END of a block. `insertHardBreak` writes
420
- * `\\` plus the block's ending there, but that ending IS the block's trailing one, so the
421
- * display stops at the backslash and the caret has nowhere to sit past it. The next
422
- * printable key is what supplies the following line: it lands AFTER the break rather than
423
- * between the backslash and its newline, where it would read as content and undo the break.
424
- */
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. */
425
386
  function handleTransitionalHardBreak(e, caretOffset) {
426
387
  if (deps.isReading())
427
388
  return false;
428
- if (!isPlainTypingKey(e) || caretOffset === null || hasSelectionHelper())
389
+ if (!isPlainTypingKey(e) || caretOffset === null || heldRange())
429
390
  return false;
430
391
  const d = display();
431
- // Only at the very end, and only when the block's last byte is the break's backslash.
432
- 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('\\'))
433
404
  return false;
434
405
  // An escaped backslash (`\\\\`) is content, not a break.
435
- if (d.endsWith('\\\\'))
406
+ if (text.endsWith('\\\\'))
436
407
  return false;
437
408
  // Backslash before ASCII punctuation is an escape (`\|`, `\*`), never a break's backslash.
438
409
  if (/^[!-/:-@[-`{-~]$/.test(e.key))
439
410
  return false;
440
- const ending = trailingLineEnding(deps.node.raw);
411
+ const ending = trailingLineEnding(deps.node.raw, deps.getLineEnding());
441
412
  e.preventDefault();
442
413
  deps.setSnapTarget(null);
443
- const next = d + ending + e.key;
444
- 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);
445
416
  return true;
446
417
  }
447
- /**
448
- * A printable key while a collapsed-caret toggle has marks pending. Marks are the newer
449
- * instruction about the same bytes, so they outrank the arrival side the seat below reads
450
- * (live-mode.md § 4.2) and this arm runs first.
451
- */
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). */
452
420
  function handlePendingMarks(e, caretOffset) {
453
- if (deps.isReading())
454
- return false;
455
- if (!isPlainTypingKey(e) || caretOffset === null || hasSelectionHelper())
421
+ if (!isPlainTypingKey(e) || caretOffset === null || heldRange())
456
422
  return false;
457
- // Locally sound like the seat below: only a surface that paints no delimiter can be asked
458
- // 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.
459
425
  const el = deps.getEl();
460
426
  if (!el || !revealsNoMarkers(el))
461
427
  return false;
462
- // Spend on the preconditions, not on the outcome: one insertion was promised the set,
463
- // 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.
464
430
  const marks = deps.pendingMarks.consume();
465
431
  if (!marks)
466
432
  return false;
467
- 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);
468
434
  if (!marked)
469
435
  return false;
470
436
  e.preventDefault();
@@ -473,34 +439,32 @@ export function createEdgePolicyDispatch(deps) {
473
439
  return true;
474
440
  }
475
441
  // ── Container marker completion ────────────────────────────────────────────
476
- /**
477
- * A bare space at the content start of an empty child whose container declares
478
- * `contentStartSpace`. Consumed, not written: the container's `rebuildRaw` re-emits it the
479
- * moment content arrives, so inserting it here would double the marker's own space. The
480
- * claim is once per child; a later space at the same seat is content.
481
- */
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. */
482
444
  function handleMarkerCompletion(e, caretOffset) {
483
445
  const bareSpace = e.key === ' ' && !e.shiftKey && !hasModifier(e);
484
- if (!bareSpace || caretOffset === null || hasSelectionHelper())
446
+ if (!bareSpace || caretOffset === null || heldRange())
485
447
  return false;
486
- if (!markerCompletion.claimSpace(deps.node, deps.containerParent, caretOffset))
448
+ const { node, containerParent, index } = deps;
449
+ if (!markerCompletion.claimSpace(node, containerParent, index, caretOffset))
487
450
  return false;
488
451
  e.preventDefault();
489
452
  return true;
490
453
  }
491
- // ── Hidden construct edge (the typing seat) ────────────────────────────────
492
- /**
493
- * A printable key at an inline construct's unpainted delimiter run. Chromium canonicalizes a
494
- * collapsed caret upstream across a non-rendered run, so the DOM caret cannot carry the answer
495
- * and the byte is written through the CST at the offset the policy and arrival name.
496
- */
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). */
497
457
  function handleConstructSeat(e, caretOffset) {
498
- if (!isPlainTypingKey(e) || caretOffset === null || hasSelectionHelper())
458
+ if (!isPlainTypingKey(e) || caretOffset === null || heldRange())
499
459
  return false;
500
- // A delimiter typed over its own closer is the auto-pair's step-over, which the beforeinput
501
- // 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.
502
462
  const content = getContentRange(deps.node);
503
- 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
+ });
504
468
  if (autoPair?.kind === 'step-over')
505
469
  return false;
506
470
  const el = deps.getEl();
@@ -509,11 +473,16 @@ export function createEdgePolicyDispatch(deps) {
509
473
  return false;
510
474
  e.preventDefault();
511
475
  deps.setSnapTarget(null);
512
- // The seat decides WHERE the byte lands; what a delimiter keystroke writes there is still
513
- // the auto-pair's answer, or a byte seated past a run would arrive without its twin. The
514
- // kind rides the trace: it names the construct whose hidden edge the caret sat at.
515
- 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
+ });
516
484
  if (paired && paired.kind !== 'step-over') {
485
+ noteOwnPair(ownPairs, text, paired);
517
486
  writeDisplay(paired.text, paired.caret, `seat:${seat.kind}`, caretOffset);
518
487
  if (paired.kind === 'close')
519
488
  deps.noteOutside?.();