@voithos-labs/aragonite 0.10.3 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +12 -5
  3. package/dist/a11y-strings.js +61 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +13 -20
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +619 -1089
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +36 -67
  26. package/dist/components/SelectionOverlay.svelte.d.ts +6 -4
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +103 -100
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +35 -28
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +58 -32
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +144 -202
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +46 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +99 -144
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +3 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +9 -4
  102. package/dist/components/blocks/text/click-snap-guard.js +16 -5
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +164 -180
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -105
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +243 -208
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +13 -30
  144. package/dist/components/drag-handle.js +25 -63
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -31
  162. package/dist/components/editor-root-listeners.js +49 -46
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +26 -30
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +380 -0
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +14 -0
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +55 -68
  256. package/dist/core/inline/inline-widgets.js +55 -58
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +33 -17
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -7
  347. package/dist/cursor/height-oracle.js +26 -75
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +16 -8
  365. package/dist/cursor/scrollport.js +28 -5
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -13
  375. package/dist/cursor/visual-lines.js +72 -28
  376. package/dist/cursor/widget-edge-snap.d.ts +23 -0
  377. package/dist/cursor/widget-edge-snap.js +39 -0
  378. package/dist/cursor/widget-offset.d.ts +111 -102
  379. package/dist/cursor/widget-offset.js +352 -177
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +31 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +33 -52
  434. package/dist/editor-actions/focus/focus-landing.d.ts +11 -5
  435. package/dist/editor-actions/focus/focus-landing.js +29 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +55 -76
  465. package/dist/editor-actions/plugin/container.js +105 -186
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +91 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +38 -8
  550. package/dist/plugin.js +102 -74
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +113 -85
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -75
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +63 -47
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +18 -7
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +143 -292
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +79 -81
  695. package/dist/schema/commands.js +156 -116
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +9 -11
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +73 -78
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +93 -152
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +61 -104
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +53 -146
  807. package/dist/selection/dead-space-caret.d.ts +20 -28
  808. package/dist/selection/dead-space-caret.js +79 -87
  809. package/dist/selection/drag-pointer.d.ts +22 -5
  810. package/dist/selection/drag-pointer.js +63 -31
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -39
  816. package/dist/selection/keyboard-extend.js +94 -116
  817. package/dist/selection/multi-click.d.ts +37 -0
  818. package/dist/selection/multi-click.js +197 -0
  819. package/dist/selection/native-bridge.d.ts +30 -37
  820. package/dist/selection/native-bridge.js +80 -100
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +31 -14
  824. package/dist/selection/path-lookup.js +110 -20
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +9 -0
  828. package/dist/selection/pointer-gesture.js +11 -0
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -33
  832. package/dist/selection/primitives.js +61 -53
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -19
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +52 -0
  852. package/dist/selection/selection-drop.js +317 -0
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +75 -53
  864. package/dist/styles/editor.css +248 -139
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +19 -0
  960. package/dist/tree-operations/paste/replacement-parse.js +24 -0
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +329 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +267 -183
  996. package/docs/guide/plugin-guide.md +341 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +17 -21
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/invariants/split-landing.d.ts +0 -8
  1015. package/dist/invariants/split-landing.js +0 -15
  1016. package/dist/selection/double-click-trim.d.ts +0 -17
  1017. package/dist/selection/double-click-trim.js +0 -57
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -29
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -75
@@ -1,34 +1,55 @@
1
1
  /**
2
- * Reactive state for the editor-owned selection modes: a cross-block `anchor`/`focus` pair,
3
- * and the collapsed `gapCaret` (`gap-caret.ts`). Both are null in single-block mode, where the
4
- * native browser selection rules, and the two are mutually exclusive here rather than at any
5
- * call site. Transitions: `docs/design/editor.md` § Cross-block selection.
2
+ * Reactive state for the selections the editor owns: a cross-block range, a gap caret
3
+ * (`gap-caret.ts`), or an inline widget selected whole. At most one is live, since every mutator
4
+ * writes all three through one private writer; all are null while the browser's own selection
5
+ * rules. Transitions: `docs/design/editor.md` § Cross-block selection.
6
6
  */
7
- import { nodeAt } from '../tree-operations/node-primitives';
7
+ import { isBlockNode, nodeAt } from '../tree-operations/node-primitives';
8
8
  import { isWholeBlockEndpoint, normalize } from './primitives';
9
- import { cellEndpointDeepPath, normalizeTableEndpoint, snapCrossBlockTableEndpoints } from './table-endpoint-snap';
9
+ import { cellEndpointDeepPath, normalizeTableEndpoint, snapCrossBlockTableEndpoints, wholeTableEndpoint } from './table-endpoint-snap';
10
10
  import { normalizeCharEndpoint } from './char-endpoint-snap';
11
- import { pathsEqual } from './path-math';
11
+ import { comparePaths, pathsEqual } from './path-math';
12
12
  import { displayLength } from '../core/lines';
13
13
  import { assertInvariant } from '../assert';
14
14
  import { checkCrossBlockEndpointCoordinates } from '../invariants/selection-endpoints';
15
+ import { isWholeBlockUnit } from '../schema/whole-block-unit';
15
16
  export function createSelectionState(options) {
16
17
  return new SelectionStateImpl(options);
17
18
  }
18
19
  // ── Implementation ──────────────────────────────────────────────────────────
20
+ // Normalization flags both corners of a rectangle, so either flag names the pair's space.
21
+ function isCellPair(a, f) {
22
+ return a.cellCoordinate === true || f.cellCoordinate === true;
23
+ }
19
24
  class SelectionStateImpl {
25
+ // Separate cells, so a reader of one kind (the image overlay reads the widget) doesn't re-run
26
+ // on every write of another, such as each move of a drag.
20
27
  #anchor = $state(null);
21
28
  #focus = $state(null);
22
29
  #gapCaret = $state(null);
23
30
  #wholeUnit = $state(null);
31
+ #widget = $state(null);
24
32
  #selectAllCount = $state(0);
25
33
  #onChange;
26
34
  #getDoc;
35
+ #widgetSpan;
27
36
  #batchDepth = 0;
28
37
  #notifyPending = false;
38
+ // False once a notification that is not a caret placement joins the pending flush.
39
+ #placementOnly = true;
29
40
  constructor(options) {
30
41
  this.#onChange = options?.onChange;
31
42
  this.#getDoc = options?.getDoc;
43
+ this.#widgetSpan = options?.widgetSpan;
44
+ }
45
+ // The only writer of the five cells, so no mutator can set one kind without ending the others.
46
+ #claim(next) {
47
+ const range = next && 'range' in next ? next.range : null;
48
+ this.#anchor = range?.anchor ?? null;
49
+ this.#focus = range?.focus ?? null;
50
+ this.#wholeUnit = range?.wholeUnit ?? null;
51
+ this.#gapCaret = next && 'gap' in next ? next.gap : null;
52
+ this.#widget = next && 'widget' in next ? next.widget : null;
32
53
  }
33
54
  batch(mutate) {
34
55
  this.#batchDepth += 1;
@@ -39,16 +60,23 @@ class SelectionStateImpl {
39
60
  this.#batchDepth -= 1;
40
61
  if (this.#batchDepth === 0 && this.#notifyPending) {
41
62
  this.#notifyPending = false;
42
- this.#onChange?.();
63
+ this.#flush();
43
64
  }
44
65
  }
45
66
  }
46
- #notify() {
67
+ #notify(fromPlacement = false) {
68
+ if (!fromPlacement)
69
+ this.#placementOnly = false;
47
70
  if (this.#batchDepth > 0) {
48
71
  this.#notifyPending = true;
49
72
  return;
50
73
  }
51
- this.#onChange?.();
74
+ this.#flush();
75
+ }
76
+ #flush() {
77
+ const placementOnly = this.#placementOnly;
78
+ this.#placementOnly = true;
79
+ this.#onChange?.({ placementOnly });
52
80
  }
53
81
  get anchor() {
54
82
  return this.#anchor;
@@ -68,10 +96,27 @@ class SelectionStateImpl {
68
96
  get wholeUnitPath() {
69
97
  return this.#wholeUnit?.slice() ?? null;
70
98
  }
99
+ get widget() {
100
+ const widget = this.#widget;
101
+ return widget && copyWidget(widget);
102
+ }
103
+ widgetRange() {
104
+ const widget = this.#widget;
105
+ const span = widget && this.#widgetSpan?.(copyWidget(widget));
106
+ return widget && span
107
+ ? { path: widget.paragraphPath.slice(), start: span.start, end: span.end }
108
+ : null;
109
+ }
110
+ widgetCaret() {
111
+ const widget = this.#widget;
112
+ if (!widget)
113
+ return null;
114
+ const live = this.widgetRange();
115
+ const fromStart = widget.preSelectOffset === widget.sourceStart;
116
+ const offset = live ? (fromStart ? live.start : live.end) : widget.preSelectOffset;
117
+ return { path: widget.paragraphPath.slice(), offset };
118
+ }
71
119
  get isCustomRendered() {
72
- const getDoc = this.#getDoc;
73
- if (!getDoc)
74
- return this.isCrossBlock;
75
120
  const anchor = this.#anchor;
76
121
  const focus = this.#focus;
77
122
  if (!anchor || !focus)
@@ -80,12 +125,8 @@ class SelectionStateImpl {
80
125
  return true;
81
126
  if (!pathsEqual(anchor.path, focus.path))
82
127
  return true;
83
- if (anchor.offset === focus.offset)
84
- return false;
85
- const node = nodeAt(getDoc(), anchor.path);
86
- if (!node)
87
- return false;
88
- return node.kind === 'table';
128
+ // A same-path pair is one cell (the browser's) or a rectangle of cells (the overlay's).
129
+ return anchor.offset !== focus.offset && isCellPair(anchor, focus);
89
130
  }
90
131
  get start() {
91
132
  return this.#normalizedSnapped()?.start ?? null;
@@ -108,34 +149,33 @@ class SelectionStateImpl {
108
149
  return this.#selectAllCount;
109
150
  }
110
151
  enterCrossBlock(anchor, focus) {
111
- this.#gapCaret = null;
112
- // Both ends the same surface-less block: the unit itself is the range, stored as its full
113
- // byte span and flagged, since below a same-path pair is refused as prose.
152
+ // Both ends on one block with no text: the block is the range, stored as its full span
153
+ // (a table's first and last cell) and flagged whole, as a same-path pair is refused below.
114
154
  if (isWholeBlockEndpoint(anchor) &&
115
155
  isWholeBlockEndpoint(focus) &&
116
156
  pathsEqual(anchor.path, focus.path)) {
117
157
  const path = anchor.path.slice();
118
- this.#anchor = { path, offset: 0 };
119
- this.#focus = { path: path.slice(), offset: this.#byteLengthAt(path) };
120
- this.#wholeUnit = path.slice();
158
+ const doc = this.#getDoc?.();
159
+ const a = (doc && wholeTableEndpoint(doc, path, 'start')) ?? { path, offset: 0 };
160
+ const f = (doc && wholeTableEndpoint(doc, path, 'end')) ?? {
161
+ path: path.slice(),
162
+ offset: this.#byteLengthAt(path)
163
+ };
164
+ this.#assertEndpointCoordinates(a, f);
165
+ this.#claim({ range: { anchor: a, focus: f, wholeUnit: path.slice() } });
121
166
  this.#notify();
122
167
  return;
123
168
  }
124
- this.#wholeUnit = null;
125
169
  const a = this.#normalizePoint(anchor, focus.path);
126
170
  const f = this.#normalizePoint(focus, anchor.path);
127
- // A same-path prose pair is a single-block range the browser owns; storing it mints an
128
- // INVISIBLE cross-block state. Refuse it here so no entry path can. Intra-table rects
129
- // share the table path but flag a cell coordinate, and the same-offset keyboard seed is
130
- // kept so its immediate `extendFocus` has an anchor.
171
+ // A same-path text pair is a single-block range the browser owns, refused here where every
172
+ // entry path passes; a cell rectangle and the keyboard's equal-offset first pair are kept.
131
173
  if (this.#isSamePathProseRange(a, f)) {
132
- this.#anchor = null;
133
- this.#focus = null;
174
+ this.#claim(null);
134
175
  }
135
176
  else {
136
177
  this.#assertEndpointCoordinates(a, f);
137
- this.#anchor = a;
138
- this.#focus = f;
178
+ this.#claim({ range: { anchor: a, focus: f, wholeUnit: null } });
139
179
  }
140
180
  this.#notify();
141
181
  }
@@ -143,105 +183,105 @@ class SelectionStateImpl {
143
183
  if (!this.#anchor) {
144
184
  throw new Error('SelectionState.extendFocus called without an anchor');
145
185
  }
146
- this.#gapCaret = null;
147
- // Leaving a whole unit: its anchor is the block as a whole again, so the side it means
148
- // (start below the new focus, end above it) is resolved afresh rather than kept at 0.
149
- if (this.#wholeUnit) {
150
- const unit = { path: this.#wholeUnit, wholeBlock: true };
151
- this.#anchor = this.#normalizePoint(unit, point.path);
152
- this.#wholeUnit = null;
153
- }
154
- const f = this.#normalizePoint(point, this.#anchor.path);
155
- // A focus back on the anchor's prose leaf contracts to a single-block range. No
156
- // `offset !== offset` guard, unlike #isSamePathProseRange: extendFocus never seeds, so
157
- // landing exactly on the anchor offset is a collapse that must not be stored either.
158
- if (pathsEqual(this.#anchor.path, f.path) &&
159
- !this.#anchor.cellCoordinate &&
160
- !f.cellCoordinate) {
161
- this.#anchor = null;
162
- this.#focus = null;
186
+ // Leaving a whole-block range: its anchor is the block as a whole again, so the side it
187
+ // means (start below the new focus, end above it) is resolved afresh rather than kept at 0.
188
+ const anchor = this.#wholeUnit
189
+ ? this.#normalizePoint({ path: this.#wholeUnit, wholeBlock: true }, point.path)
190
+ : this.#anchor;
191
+ const f = this.#normalizePoint(point, anchor.path);
192
+ // A focus back on the anchor's text leaf shrinks to a single-block range, even at the
193
+ // anchor's own offset: `extendFocus` never starts a pair, so landing there is a collapse.
194
+ if (pathsEqual(anchor.path, f.path) && !isCellPair(anchor, f)) {
195
+ this.#claim(null);
163
196
  }
164
197
  else {
165
- this.#assertEndpointCoordinates(this.#anchor, f);
166
- this.#focus = f;
198
+ this.#assertEndpointCoordinates(anchor, f);
199
+ this.#claim({ range: { anchor, focus: f, wholeUnit: null } });
167
200
  }
168
201
  this.#notify();
169
202
  }
170
- // G1.29 at the storing seam, the belt behind #normalizePoint: both entries carry it because
171
- // both store an endpoint pair.
172
203
  #byteLengthAt(path) {
173
204
  const doc = this.#getDoc?.();
174
205
  const node = doc ? nodeAt(doc, path) : null;
175
206
  return node && 'raw' in node ? displayLength(node.raw) : 0;
176
207
  }
208
+ // The endpoint coordinate check backs up `#normalizePoint` at every write of anchor and focus.
177
209
  #assertEndpointCoordinates(anchor, focus) {
178
210
  const getDoc = this.#getDoc;
179
211
  if (!getDoc)
180
212
  return;
181
213
  assertInvariant('cross-block-endpoint-coordinates', () => checkCrossBlockEndpointCoordinates(getDoc(), anchor, focus));
182
214
  }
183
- // Same prose leaf, distinct offsets: the shape that must never enter cross-block state.
184
- // Equal-offset pairs are excluded so the keyboard entry seed survives to its extend.
215
+ // Same text leaf, distinct offsets: the shape that must never enter cross-block state.
216
+ // Equal-offset pairs are excluded so the keyboard's starting pair survives to its extend.
185
217
  #isSamePathProseRange(a, f) {
186
- return (pathsEqual(a.path, f.path) && !a.cellCoordinate && !f.cellCoordinate && a.offset !== f.offset);
218
+ return pathsEqual(a.path, f.path) && !isCellPair(a, f) && a.offset !== f.offset;
187
219
  }
188
- // The funnel every entry path (keyboard, shift-click, drag, select-all, undo restore) goes
189
- // through: a table endpoint can never be stored as a deep cell path with a char offset, and a
190
- // char offset can never be stored outside the space its own block addresses (both funnels'
191
- // headers). Never normalize at a call site instead. Idempotent; without a doc nothing can be
192
- // measured, so points pass raw.
220
+ // The one place every entry path normalizes: a table endpoint becomes a flagged cell index and
221
+ // a character offset is clamped into its block. Without a document, points pass through.
193
222
  #normalizePoint(point, otherPath) {
194
223
  const getDoc = this.#getDoc;
195
224
  if (!getDoc) {
196
225
  return isWholeBlockEndpoint(point) ? { path: point.path.slice(), offset: 0 } : point;
197
226
  }
198
227
  const doc = getDoc();
199
- if (isWholeBlockEndpoint(point))
200
- return normalizeCharEndpoint(doc, point, otherPath);
228
+ if (isWholeBlockEndpoint(point)) {
229
+ const side = comparePaths(point.path, otherPath) > 0 ? 'end' : 'start';
230
+ return (wholeTableEndpoint(doc, point.path, side) ?? normalizeCharEndpoint(doc, point, otherPath));
231
+ }
201
232
  if (point.cellCoordinate)
202
233
  return point;
203
234
  const snapped = normalizeTableEndpoint(doc, point.path, point.offset);
204
235
  return snapped.cellCoordinate ? snapped : normalizeCharEndpoint(doc, snapped, otherPath);
205
236
  }
206
237
  collapse() {
207
- if (!this.#hasCaretClaim())
208
- return;
209
- this.#anchor = null;
210
- this.#focus = null;
211
- this.#gapCaret = null;
212
- this.#wholeUnit = null;
213
- this.#notify();
238
+ const announce = this.#hasCaretClaim();
239
+ this.#claim(null);
240
+ if (announce)
241
+ this.#notify();
242
+ }
243
+ dropForDocumentSwap() {
244
+ this.#claim(null);
214
245
  }
215
246
  clear() {
216
- if (!this.#hasCaretClaim() && this.#selectAllCount === 0)
217
- return;
218
- this.#anchor = null;
219
- this.#focus = null;
220
- this.#gapCaret = null;
221
- this.#wholeUnit = null;
247
+ const announce = this.#hasCaretClaim() || this.#selectAllCount !== 0;
248
+ this.#claim(null);
222
249
  this.#selectAllCount = 0;
223
- this.#notify();
250
+ if (announce)
251
+ this.#notify();
224
252
  }
225
- // Every field the two clears zero: a guard reading fewer of them would swallow the
226
- // notification for the ones it does not see.
253
+ // A range or a gap caret: what the clears announce ending. A widget is left out, since the
254
+ // caret that replaces it announces itself.
227
255
  #hasCaretClaim() {
228
256
  return this.#anchor !== null || this.#focus !== null || this.#gapCaret !== null;
229
257
  }
230
- // The mutual exclusion's other half: a gap and a range are never live together, and the
231
- // copy is what keeps a caller's own position object from writing through.
258
+ // The copy keeps a caller's own position object from writing through.
232
259
  setGapCaret(pos) {
233
- this.#anchor = null;
234
- this.#focus = null;
235
- this.#wholeUnit = null;
236
- this.#gapCaret = { parentPath: pos.parentPath.slice(), index: pos.index };
260
+ this.#claim({ gap: { parentPath: pos.parentPath.slice(), index: pos.index } });
237
261
  this.#notify();
238
262
  }
239
263
  clearGapCaret() {
240
264
  if (this.#gapCaret === null)
241
265
  return;
242
- this.#gapCaret = null;
266
+ this.#claim(null);
267
+ this.#notify();
268
+ }
269
+ selectWidget(target) {
270
+ this.#claim({ widget: copyWidget(target) });
243
271
  this.#notify();
244
272
  }
273
+ followWidgetEdit(path, editEnd, delta) {
274
+ const widget = this.#widget;
275
+ if (!widget || widget.sourceStart < editEnd || !pathsEqual(widget.paragraphPath, path))
276
+ return;
277
+ this.#claim({
278
+ widget: {
279
+ paragraphPath: widget.paragraphPath.slice(),
280
+ sourceStart: widget.sourceStart + delta,
281
+ preSelectOffset: widget.preSelectOffset + delta
282
+ }
283
+ });
284
+ }
245
285
  incrementSelectAllCount() {
246
286
  this.#selectAllCount += 1;
247
287
  this.#notify();
@@ -251,22 +291,16 @@ class SelectionStateImpl {
251
291
  return 'custom';
252
292
  if (anchor.offset === focus.offset)
253
293
  return 'collapsed';
254
- // Same path, distinct offsets: a table cell rect (flagged endpoint, or a table node
255
- // under the shared path) paints via the overlay; prose is a native range.
256
- if (anchor.cellCoordinate || focus.cellCoordinate)
294
+ if (isCellPair(anchor, focus))
257
295
  return 'custom';
258
- const getDoc = this.#getDoc;
259
- if (!getDoc)
260
- return 'single-block';
261
- const node = nodeAt(getDoc(), anchor.path);
262
- return node?.kind === 'table' ? 'custom' : 'single-block';
296
+ const doc = this.#getDoc?.();
297
+ const node = doc ? nodeAt(doc, anchor.path) : null;
298
+ return node && isBlockNode(node) && isWholeBlockUnit(node) ? 'whole-block' : 'single-block';
263
299
  }
264
300
  cellLandingFor(point) {
265
301
  const getDoc = this.#getDoc;
266
302
  if (!getDoc)
267
303
  return point;
268
- // Resolution is the door's, on the node kind: a context-established intra-table endpoint
269
- // is unflagged and still a cell index, and a non-table path answers null.
270
304
  const deepPath = cellEndpointDeepPath(getDoc(), point);
271
305
  return deepPath ? { path: deepPath, offset: 0 } : point;
272
306
  }
@@ -279,4 +313,16 @@ class SelectionStateImpl {
279
313
  announceSelection() {
280
314
  this.#notify();
281
315
  }
316
+ announcePlacement() {
317
+ this.#notify(true);
318
+ }
319
+ }
320
+ // Copied at both ends, as the gap caret is: neither a caller's object nor a reader's copy can
321
+ // write the stored widget without a notification.
322
+ function copyWidget(target) {
323
+ return {
324
+ paragraphPath: target.paragraphPath.slice(),
325
+ sourceStart: target.sourceStart,
326
+ preSelectOffset: target.preSelectOffset
327
+ };
282
328
  }
@@ -1,34 +1,37 @@
1
1
  /**
2
2
  * Shared keydown prelude for contenteditable blocks: Ctrl+A counter, cross-block dispatch,
3
- * sticky-column capture/reset, undo/redo, arrow boundary navigation. Block-specific handlers
3
+ * the caret memory's key note, undo/redo, arrow boundary navigation. Block-specific handlers
4
4
  * (Enter, Backspace, Tab, formatting) stay in each component.
5
5
  */
6
6
  import type { FocusActions, HistoryActions } from '../action-contracts';
7
- import type { BlockElLookup, DocumentGetter } from '../editor-keys';
8
- import type { StickyColumnState } from '../cursor/sticky-column';
9
- import type { EdgeAffinityState } from '../cursor/edge-affinity';
7
+ import type { DocumentGetter } from '../editor-keys';
8
+ import type { CaretMemory } from '../cursor/caret-memory';
9
+ import type { ScrollOwner } from '../cursor/scroll-owner';
10
10
  import type { SelectionState } from './selection-state.svelte';
11
11
  import type { CrossBlockHandlers } from './cross-block/dispatch';
12
- import type { PluginActivation } from '../schema/plugin-activation';
12
+ import type { CommandDispatchContext } from '../schema/block-commands';
13
+ import type { Reading } from '../schema/reading';
13
14
  export interface SharedKeydownContext extends LandableBoundsContext {
14
15
  getEl(): HTMLElement | null;
15
- /** Current caret offset in raw-content coordinates (ambient marker excluded). */
16
+ /** Current caret offset in raw-content coordinates (the container's marker prefix excluded). */
16
17
  getCursorOffset(): number | null;
17
- /** Shift-selection focus offset in raw-content coordinates (ambient marker excluded). */
18
+ /** Shift-selection focus offset in raw-content coordinates (the marker prefix excluded). */
18
19
  getFocusOffset(): number | null;
19
20
  getIndex(): number;
20
21
  getMyPath(): number[];
21
22
  getDoc: DocumentGetter;
22
23
  crossBlock: CrossBlockHandlers;
23
24
  selection: SelectionState;
24
- stickyColumn: StickyColumnState;
25
- edgeAffinity: EdgeAffinityState;
25
+ caretMemory: CaretMemory;
26
26
  history: HistoryActions;
27
27
  focus: FocusActions;
28
- getBlockElByPath: BlockElLookup;
29
- /** The plugins this instance activated; without it the suppression below swallows a
30
- * chord another editor's plugin claimed. `undefined` = every installed plugin. */
31
- activePlugins: PluginActivation | undefined;
28
+ /** Brings the block a Shift+Arrow extends into to the nearest edge. */
29
+ scrollOwner: Pick<ScrollOwner, 'place'>;
30
+ /** The editor's command dispatch: the caret memory reads a chord by its current binding, and
31
+ * the history suppression below takes only this editor's plugin chords. */
32
+ commands: CommandDispatchContext;
33
+ /** How the editor reads its bytes, whose grammar the vertical extension skips leaves by. */
34
+ reading: Reading;
32
35
  }
33
36
  /** True when the event was fully handled; the caller must skip its block-specific branches. */
34
37
  export declare function handleSharedKeydown(e: KeyboardEvent, ctx: SharedKeydownContext): Promise<boolean>;
@@ -36,25 +39,17 @@ export interface LandableBounds {
36
39
  start: number;
37
40
  end: number;
38
41
  }
39
- /** The reads the bounds need, so a block-edge gate outside this file can ask without standing up
42
+ /** The reads the bounds need, so a block-edge check outside this file can ask without building
40
43
  * the whole keydown context. */
41
44
  export interface LandableBoundsContext {
42
- /** textContent length in raw-content coordinates (ambient marker excluded). */
45
+ /** textContent length in raw-content coordinates (the marker prefix excluded). */
43
46
  getTextLen(): number;
44
- getAmbientLength(): number;
45
47
  }
46
- /**
47
- * The raw offsets a caret can actually reach in this block, from the walk that decides where a
48
- * caret lands. A mode that hides a block's own markers with no reveal puts those bytes out of
49
- * reach, so the exits move in to what the DOM can land — the kind's declared content range is
50
- * not that bound: paragraph, fenced code and table cell each declare the whole raw and still
51
- * open or close with a run nothing paints. Every block-edge gate reads this, not 0/length.
52
- */
48
+ /** The raw offsets a caret can reach in the block, from the same walk that places it: hidden
49
+ * markers put bytes out of reach, so every block-edge check reads this, not 0 and length. */
53
50
  export declare function caretLandableBounds(ctx: LandableBoundsContext, el: HTMLElement): LandableBounds;
54
- /**
55
- * Routes historyUndo/historyRedo through the undo controller and delegates cross-block
56
- * paste/type-replace. True when the caller should return early from its own `onBeforeInput`.
57
- */
51
+ /** Routes historyUndo/historyRedo through the undo controller and delegates cross-block paste
52
+ * and typing; true when the caller should return early from its own `onBeforeInput`. */
58
53
  export declare function handleSharedBeforeInput(e: InputEvent, ctx: {
59
54
  history: HistoryActions;
60
55
  crossBlock: CrossBlockHandlers;
@@ -1,41 +1,29 @@
1
1
  /**
2
2
  * Shared keydown prelude for contenteditable blocks: Ctrl+A counter, cross-block dispatch,
3
- * sticky-column capture/reset, undo/redo, arrow boundary navigation. Block-specific handlers
3
+ * the caret memory's key note, undo/redo, arrow boundary navigation. Block-specific handlers
4
4
  * (Enter, Backspace, Tab, formatting) stay in each component.
5
5
  */
6
+ import { commandAtBlock } from './cross-block/keydown';
6
7
  import { extendFocusToNextBlock, extendFocusToPreviousBlock, scrollFocusBlockIntoView } from './keyboard-extend';
7
8
  import { getCurrentCursorEditorRelativeX } from '../cursor/sticky-measure';
8
9
  import { landableRawBounds } from '../cursor/widget-offset';
9
10
  import { isAtFirstVisualLine, isAtLastVisualLine } from '../cursor/visual-lines';
10
- import { eventToChord } from '../schema/keybindings';
11
+ import { endsSelectAllRun, eventToChord } from '../schema/keybindings';
11
12
  import { isDefaultGlobalChord } from '../schema/commands';
12
13
  /** True when the event was fully handled; the caller must skip its block-specific branches. */
13
14
  export async function handleSharedKeydown(e, ctx) {
14
- // Bare modifier keys don't reset the Ctrl+A doubling counter: pressing Control before 'a' is
15
- // part of the chord, not a separate action.
16
- const isCtrlA = (e.ctrlKey || e.metaKey) && e.key === 'a' && !e.shiftKey;
17
- const isBareModifier = e.key === 'Control' ||
18
- e.key === 'Shift' ||
19
- e.key === 'Alt' ||
20
- e.key === 'Meta' ||
21
- e.key === 'AltGraph' ||
22
- e.key === 'CapsLock';
23
- if (!isCtrlA && !isBareModifier) {
15
+ if (endsSelectAllRun(e))
24
16
  ctx.selection.resetSelectAllCount();
25
- }
26
17
  if (await ctx.crossBlock.handleKeyDown(e))
27
18
  return true;
28
19
  const el = ctx.getEl();
29
20
  if (!el)
30
21
  return false;
31
- ctx.stickyColumn.noteKey(e, () => getCurrentCursorEditorRelativeX(el));
32
- ctx.edgeAffinity.note(e);
33
- // Native contenteditable history stays suppressed on keydown, since Ctrl+Y doesn't fire
34
- // beforeinput historyRedo in Chromium/WebView2. The DEFAULT table is the right question here:
35
- // it names the chords with a native history default, and running the command is the block's
36
- // own override-aware dispatch, one branch further on.
22
+ ctx.caretMemory.noteKey(e, commandAtBlock(e, ctx), () => getCurrentCursorEditorRelativeX(el));
23
+ // Ctrl+Y fires no `historyRedo` beforeinput in Chromium and WebView2, so every chord with a
24
+ // native history default is suppressed here; the block's own dispatch runs the command.
37
25
  const historyChord = eventToChord(e);
38
- if (historyChord && isDefaultGlobalChord(historyChord, ctx.activePlugins)) {
26
+ if (historyChord && isDefaultGlobalChord(historyChord, ctx.commands.activation)) {
39
27
  e.preventDefault();
40
28
  return false;
41
29
  }
@@ -51,13 +39,13 @@ export async function handleSharedKeydown(e, ctx) {
51
39
  const shiftOffset = e.shiftKey ? ctx.getFocusOffset() : null;
52
40
  if (e.key === 'ArrowUp') {
53
41
  const offset = shiftOffset ?? ctx.getCursorOffset() ?? 0;
54
- if (isAtFirstVisualLine(el, offset, bounds().start)) {
42
+ if (isAtFirstVisualLine(el, offset, bounds())) {
55
43
  // Cross the boundary only when focus is already at the block's first reachable
56
44
  // offset, so native Shift+ArrowUp extension has nowhere left to go within it.
57
45
  if (e.shiftKey && offset <= bounds().start) {
58
46
  e.preventDefault();
59
- extendFocusToPreviousBlock(ctx.selection, ctx.getDoc(), el, myPath, 'start');
60
- scrollFocusBlockIntoView(ctx.selection, ctx.getBlockElByPath);
47
+ extendFocusToPreviousBlock(ctx.selection, ctx.getDoc(), ctx.reading.grammar, el, myPath, 'start');
48
+ scrollFocusBlockIntoView(ctx.selection, ctx.scrollOwner);
61
49
  return true;
62
50
  }
63
51
  if (!e.shiftKey && !e.altKey) {
@@ -69,13 +57,13 @@ export async function handleSharedKeydown(e, ctx) {
69
57
  }
70
58
  if (e.key === 'ArrowDown') {
71
59
  const offset = shiftOffset ?? ctx.getCursorOffset() ?? 0;
72
- if (isAtLastVisualLine(el, offset, bounds().end)) {
60
+ if (isAtLastVisualLine(el, offset, bounds())) {
73
61
  // Cross the boundary only when focus is already at the block's last reachable
74
62
  // offset, so native Shift+ArrowDown extension has nowhere left to go.
75
63
  if (e.shiftKey && offset >= bounds().end) {
76
64
  e.preventDefault();
77
- extendFocusToNextBlock(ctx.selection, ctx.getDoc(), el, myPath, 'vertical');
78
- scrollFocusBlockIntoView(ctx.selection, ctx.getBlockElByPath);
65
+ extendFocusToNextBlock(ctx.selection, ctx.getDoc(), ctx.reading.grammar, el, myPath, 'vertical');
66
+ scrollFocusBlockIntoView(ctx.selection, ctx.scrollOwner);
79
67
  return true;
80
68
  }
81
69
  if (!e.shiftKey && !e.altKey) {
@@ -86,15 +74,14 @@ export async function handleSharedKeydown(e, ctx) {
86
74
  }
87
75
  }
88
76
  if (e.key === 'ArrowLeft') {
89
- // Shift+Arrow reads focus, not anchor: getCursorOffset() gives the range start, which is
90
- // the anchor for a forward selection. That would extend cross-block while focus is
91
- // contracting toward a non-zero anchor, and misfire for backward selections.
77
+ // Shift+Arrow reads the focus, since `getCursorOffset()` gives the range start: the anchor
78
+ // of a forward selection, which would extend across blocks while the focus contracts.
92
79
  const offset = e.shiftKey ? (ctx.getFocusOffset() ?? bounds().start) : ctx.getCursorOffset();
93
80
  if (offset !== null && offset <= bounds().start) {
94
81
  if (e.shiftKey) {
95
82
  e.preventDefault();
96
- extendFocusToPreviousBlock(ctx.selection, ctx.getDoc(), el, myPath);
97
- scrollFocusBlockIntoView(ctx.selection, ctx.getBlockElByPath);
83
+ extendFocusToPreviousBlock(ctx.selection, ctx.getDoc(), ctx.reading.grammar, el, myPath);
84
+ scrollFocusBlockIntoView(ctx.selection, ctx.scrollOwner);
98
85
  return true;
99
86
  }
100
87
  e.preventDefault();
@@ -107,8 +94,8 @@ export async function handleSharedKeydown(e, ctx) {
107
94
  if (offset !== null && offset >= bounds().end) {
108
95
  if (e.shiftKey) {
109
96
  e.preventDefault();
110
- extendFocusToNextBlock(ctx.selection, ctx.getDoc(), el, myPath);
111
- scrollFocusBlockIntoView(ctx.selection, ctx.getBlockElByPath);
97
+ extendFocusToNextBlock(ctx.selection, ctx.getDoc(), ctx.reading.grammar, el, myPath);
98
+ scrollFocusBlockIntoView(ctx.selection, ctx.scrollOwner);
112
99
  return true;
113
100
  }
114
101
  e.preventDefault();
@@ -118,21 +105,14 @@ export async function handleSharedKeydown(e, ctx) {
118
105
  }
119
106
  return false;
120
107
  }
121
- /**
122
- * The raw offsets a caret can actually reach in this block, from the walk that decides where a
123
- * caret lands. A mode that hides a block's own markers with no reveal puts those bytes out of
124
- * reach, so the exits move in to what the DOM can land — the kind's declared content range is
125
- * not that bound: paragraph, fenced code and table cell each declare the whole raw and still
126
- * open or close with a run nothing paints. Every block-edge gate reads this, not 0/length.
127
- */
108
+ /** The raw offsets a caret can reach in the block, from the same walk that places it: hidden
109
+ * markers put bytes out of reach, so every block-edge check reads this, not 0 and length. */
128
110
  export function caretLandableBounds(ctx, el) {
129
- return landableRawBounds(el, ctx.getAmbientLength()) ?? { start: 0, end: ctx.getTextLen() };
111
+ return landableRawBounds(el) ?? { start: 0, end: ctx.getTextLen() };
130
112
  }
131
113
  // ── Shared beforeinput prelude ─────────────────────────────────────────────
132
- /**
133
- * Routes historyUndo/historyRedo through the undo controller and delegates cross-block
134
- * paste/type-replace. True when the caller should return early from its own `onBeforeInput`.
135
- */
114
+ /** Routes historyUndo/historyRedo through the undo controller and delegates cross-block paste
115
+ * and typing; true when the caller should return early from its own `onBeforeInput`. */
136
116
  export async function handleSharedBeforeInput(e, ctx) {
137
117
  if (e.inputType === 'historyUndo') {
138
118
  e.preventDefault();