@voithos-labs/aragonite 0.10.4 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +11 -5
  3. package/dist/a11y-strings.js +60 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +12 -21
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +603 -1126
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +26 -51
  26. package/dist/components/SelectionOverlay.svelte.d.ts +5 -3
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +72 -87
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +29 -34
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +57 -39
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +141 -203
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +45 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +93 -147
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +1 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +8 -6
  102. package/dist/components/blocks/text/click-snap-guard.js +10 -7
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +150 -181
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -108
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +212 -199
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +12 -35
  144. package/dist/components/drag-handle.js +22 -68
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -24
  162. package/dist/components/editor-root-listeners.js +49 -24
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +14 -26
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +30 -35
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +3 -5
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +54 -75
  256. package/dist/core/inline/inline-widgets.js +54 -62
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +31 -15
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -6
  347. package/dist/cursor/height-oracle.js +26 -74
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +14 -15
  365. package/dist/cursor/scrollport.js +7 -13
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -14
  375. package/dist/cursor/visual-lines.js +45 -46
  376. package/dist/cursor/widget-edge-snap.d.ts +10 -15
  377. package/dist/cursor/widget-edge-snap.js +13 -12
  378. package/dist/cursor/widget-offset.d.ts +110 -104
  379. package/dist/cursor/widget-offset.js +344 -179
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +30 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +28 -50
  434. package/dist/editor-actions/focus/focus-landing.d.ts +8 -11
  435. package/dist/editor-actions/focus/focus-landing.js +15 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +54 -82
  465. package/dist/editor-actions/plugin/container.js +105 -188
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +88 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +37 -8
  550. package/dist/plugin.js +100 -77
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +78 -67
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -81
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +51 -45
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +15 -6
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +141 -310
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +78 -84
  695. package/dist/schema/commands.js +152 -117
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +8 -10
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +63 -80
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +92 -125
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +59 -96
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +51 -134
  807. package/dist/selection/dead-space-caret.d.ts +19 -30
  808. package/dist/selection/dead-space-caret.js +70 -88
  809. package/dist/selection/drag-pointer.d.ts +7 -9
  810. package/dist/selection/drag-pointer.js +23 -33
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -40
  816. package/dist/selection/keyboard-extend.js +94 -117
  817. package/dist/selection/multi-click.d.ts +13 -18
  818. package/dist/selection/multi-click.js +32 -38
  819. package/dist/selection/native-bridge.d.ts +29 -39
  820. package/dist/selection/native-bridge.js +78 -127
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +25 -16
  824. package/dist/selection/path-lookup.js +101 -18
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +5 -5
  828. package/dist/selection/pointer-gesture.js +5 -5
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -40
  832. package/dist/selection/primitives.js +57 -67
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -23
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +34 -16
  852. package/dist/selection/selection-drop.js +159 -95
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +60 -53
  864. package/dist/styles/editor.css +201 -143
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +9 -7
  960. package/dist/tree-operations/paste/replacement-parse.js +12 -10
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +327 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +253 -185
  996. package/docs/guide/plugin-guide.md +332 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +12 -16
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/cursor/scroll-hold.d.ts +0 -10
  1015. package/dist/cursor/scroll-hold.js +0 -22
  1016. package/dist/invariants/split-landing.d.ts +0 -8
  1017. package/dist/invariants/split-landing.js +0 -15
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -31
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -78
@@ -1,44 +1,31 @@
1
- /** Cross-block keyboard extension and collapse. Pure helpers over SelectionState. */
1
+ /** Cross-block keyboard extension and collapse: `SelectionState` writes plus the native caret. */
2
2
  import type { SelectionState } from './selection-state.svelte';
3
+ import type { SelectedWidgetHandle, SelectedWidgetRange, SelectionPoint } from './primitives';
3
4
  import type { Document } from '../core/nodes';
4
- import type { BlockComponent } from '../block-component';
5
+ import type { GrammarView } from '../schema/block-openers';
6
+ import type { CaretLanding } from './caret-landing';
5
7
  import type { BlockElLookup } from '../editor-keys';
6
- /**
7
- * Collapse to start/end, restore a native caret, exit cross-block mode. `revealPath` mounts an
8
- * off-window target first. A cell-coordinate target's offset is a cell index, not a char
9
- * offset, so the caret lands at the cell's edge via the cell ref.
10
- */
11
- export declare function collapseCrossBlock(selection: SelectionState, to: 'start' | 'end', doc: Document, getBlockElByPath: (path: number[]) => HTMLElement | null, revealPath: (path: number[]) => Promise<BlockComponent | null>): Promise<void>;
12
- /**
13
- * Scroll the focus block into view when mounted. Does not itself reveal a windowed-out block:
14
- * the doc-edge extend reveals its endpoint via `revealActiveEndpoint` first, and a single-step
15
- * Shift+Arrow extend lands adjacent to the mounted window.
16
- */
17
- export declare function scrollFocusBlockIntoView(selection: SelectionState, getBlockElByPath: (path: number[]) => HTMLElement | null): void;
18
- /**
19
- * Extend focus to the next leaf in document order (Shift+ArrowDown / Shift+ArrowRight leaving
20
- * the block), entering cross-block mode if needed. Returns true if focus moved. `axis` =
21
- * 'vertical' skips vertically-transparent leaves — a range covers one either way, so unlike a
22
- * collapsed caret it needs no object stop; 'horizontal' lands unconditionally so an image-only
23
- * paragraph is selectable in one step.
24
- */
25
- export declare function extendFocusToNextBlock(selection: SelectionState, doc: Document, currentBlockEl: HTMLElement, currentBlockPath: number[], axis?: 'horizontal' | 'vertical', getBlockElByPath?: BlockElLookup): boolean;
26
- /**
27
- * Extend focus to the previous leaf (Shift+ArrowUp / Shift+ArrowLeft). `side` = 'end' for
28
- * ArrowLeft (cross the boundary by one char), 'start' for ArrowUp (select the whole previous
29
- * line, matching native). The vertical path skips vertically-transparent leaves.
30
- */
31
- export declare function extendFocusToPreviousBlock(selection: SelectionState, doc: Document, currentBlockEl: HTMLElement, currentBlockPath: number[], side?: 'start' | 'end', getBlockElByPath?: BlockElLookup): boolean;
32
- /**
33
- * Extend focus to the document edge (Mod+Shift+Home / Mod+Shift+End). A transparent edge
34
- * leaf is bypassed for the nearest text-bearing one, matching the cross-block extension path.
35
- */
36
- export declare function extendFocusToDocEdge(selection: SelectionState, doc: Document, currentBlockEl: HTMLElement, currentBlockPath: number[], to: 'start' | 'end', getBlockElByPath?: BlockElLookup): boolean;
37
- /** Select the entire document as a cross-block range (second Ctrl+A press). */
8
+ import type { ScrollOwner } from '../cursor/scroll-owner';
9
+ /** Collapses a cross-block range to its start or end and puts the caret back there as a stored
10
+ * byte, brought into view, mounting a windowed-out target and never opening a closed body. */
11
+ export declare function collapseCrossBlock(selection: SelectionState, to: 'start' | 'end', doc: Document, restore: CaretLanding['restore']): Promise<void>;
12
+ /** Scrolls the focus block into view if mounted, without mounting it: a document-edge extend
13
+ * mounts its endpoint first, and one Shift+Arrow step lands beside the mounted range. */
14
+ export declare function scrollFocusBlockIntoView(selection: SelectionState, scroll: Pick<ScrollOwner, 'place'>): void;
15
+ /** Extends focus to the next leaf a caret can reach. The vertical axis skips leaves the caret
16
+ * passes over (an image-only paragraph); the horizontal stops on each, so it stays selectable. */
17
+ export declare function extendFocusToNextBlock(selection: SelectionState, doc: Document, grammar: GrammarView, currentBlockEl: HTMLElement, currentBlockPath: number[], axis?: 'horizontal' | 'vertical', getBlockElByPath?: BlockElLookup): boolean;
18
+ /** Extends focus to the previous leaf: `'end'` crosses the boundary by one character, `'start'`
19
+ * takes the whole previous line as native ArrowUp does, skipping leaves the caret passes over. */
20
+ export declare function extendFocusToPreviousBlock(selection: SelectionState, doc: Document, grammar: GrammarView, currentBlockEl: HTMLElement, currentBlockPath: number[], side?: 'start' | 'end', getBlockElByPath?: BlockElLookup): boolean;
21
+ /** Extends focus to the document edge; a transparent edge leaf is bypassed for the nearest
22
+ * text-bearing one, as the one-step extension does. */
23
+ export declare function extendFocusToDocEdge(selection: SelectionState, doc: Document, grammar: GrammarView, currentBlockEl: HTMLElement, currentBlockPath: number[], to: 'start' | 'end', getBlockElByPath?: BlockElLookup): boolean;
24
+ /** Selects the entire document as a cross-block range (the second Ctrl+A). */
38
25
  export declare function selectWholeDocument(selection: SelectionState, doc: Document, getBlockElByPath?: (path: number[]) => HTMLElement | null): boolean;
39
- /**
40
- * Shift+click on a block: extend the cross-block selection, or enter cross-block mode using the
41
- * previously focused block's caret as the anchor. False when no anchor could be recovered, or
42
- * the click stayed within the same block (native shift-click handles that).
43
- */
44
- export declare function handleShiftClick(selection: SelectionState, clickedBlockEl: HTMLElement, clickedBlockPath: number[], clickedX: number, clickedY: number, previouslyFocusedBlockEl: HTMLElement | null, previouslyFocusedBlockPath: number[] | null): boolean;
26
+ /** Shift+click on a block: extends the range, grows one from an image selected whole, or enters
27
+ * cross-block mode from the last caret. False for a same-block click, left to the browser. */
28
+ export declare function handleShiftClick(selection: SelectionState, clickedBlockEl: HTMLElement, clickedBlockPath: number[], clickedX: number, clickedY: number, previouslyFocusedBlockEl: HTMLElement | null, previouslyFocusedBlockPath: number[] | null, selectedWidget: SelectedWidgetHandle): boolean;
29
+ /** The edge of a selected widget a shift-click grows from: the one away from the click, so the
30
+ * range covers the widget and everything up to the click. */
31
+ export declare function widgetShiftAnchor(widget: SelectedWidgetRange, press: SelectionPoint): SelectionPoint;
@@ -1,16 +1,14 @@
1
- /** Cross-block keyboard extension and collapse. Pure helpers over SelectionState. */
1
+ /** Cross-block keyboard extension and collapse: `SelectionState` writes plus the native caret. */
2
2
  import { isVerticallyTransparentNode } from '../core/inline/transparency';
3
- import { readNativeCaretInBlock, applyCollapsedCaret, focusCollapsedCaret, applySingleBlockRange, clearNativeSelection } from './native-bridge';
3
+ import { readNativeCaretInBlock, applyCollapsedCaret, applySingleBlockRange, clearNativeSelection } from './native-bridge';
4
4
  import { offsetFromViewportPoint } from '../cursor/point-offset';
5
- import { nextPath, previousPath, firstPath, lastPath, firstLeafAtOrAfter, lastLeafAtOrBefore, findCellPathForElement } from './path-lookup';
5
+ import { firstPath, lastPath, firstCaretLeaf, lastCaretLeaf, nextCaretPath, previousCaretPath, findCellPathForElement } from './path-lookup';
6
6
  import { nodeAt } from '../tree-operations/node-primitives';
7
- import { comparePaths, isStrictAncestorOf, pathsEqual } from './path-math';
7
+ import { comparePaths, pathsEqual } from './path-math';
8
8
  import { displayLength } from '../core/lines';
9
9
  // ── Enter / Collapse / Scroll ──────────────────────────────────────────────
10
- /**
11
- * Enter cross-block mode on a keyboard extension (Shift+Arrow leaving a block). Captures the
12
- * native caret as both anchor and focus; the caller immediately extendFocus()es to the target.
13
- */
10
+ /** Enters cross-block mode on a Shift+Arrow leaving a block, with the native caret as both
11
+ * anchor and focus; the caller extends the focus right after. */
14
12
  function enterCrossBlockFromKeyboard(selection, currentBlockEl, currentBlockPath) {
15
13
  const anchorPoint = readNativeCaretInBlock(currentBlockEl, currentBlockPath);
16
14
  if (!anchorPoint)
@@ -19,52 +17,37 @@ function enterCrossBlockFromKeyboard(selection, currentBlockEl, currentBlockPath
19
17
  path: anchorPoint.path.slice(),
20
18
  offset: anchorPoint.offset
21
19
  });
22
- // Collapse (not clear) so the focus block retains a caret, or Chromium retargets clipboard
23
- // events to <body> (same rule as `parkCaretInFocusBlock`). Best-effort: an endpoint hosting
24
- // no text position gets no caret, which is why components/editor-root-clipboard.ts exists.
20
+ // A collapsed caret stays in the focus block, or Chromium sends clipboard events to <body>;
21
+ // an endpoint with no text position gets none, and `editor-root-clipboard.ts` covers it.
25
22
  applyCollapsedCaret(currentBlockEl, anchorPoint);
26
23
  return true;
27
24
  }
28
- /**
29
- * Collapse to start/end, restore a native caret, exit cross-block mode. `revealPath` mounts an
30
- * off-window target first. A cell-coordinate target's offset is a cell index, not a char
31
- * offset, so the caret lands at the cell's edge via the cell ref.
32
- */
33
- export async function collapseCrossBlock(selection, to, doc, getBlockElByPath, revealPath) {
25
+ /** Collapses a cross-block range to its start or end and puts the caret back there as a stored
26
+ * byte, brought into view, mounting a windowed-out target and never opening a closed body. */
27
+ export async function collapseCrossBlock(selection, to, doc, restore) {
34
28
  const target = to === 'start' ? selection.start : selection.end;
35
29
  if (!target)
36
30
  return;
37
31
  selection.collapse();
38
32
  clearNativeSelection();
39
- // The cell landing seats at the cell's own edge; from there it takes the SAME seat as a
40
- // prose leaf. Seating through the cell's own focus door instead would skip the collapse
41
- // ceremony, and the byte typed at the arrival would join the construct the cell opens with
42
- // rather than land in front of it. Only the END side overrides the landing's own offset.
33
+ // A cell target takes the text-leaf caret path: the cell's own `focus` skips the collapse
34
+ // steps, and a byte typed there would join the construct the cell opens with.
43
35
  const landing = selection.cellLandingFor(target);
44
36
  const point = to === 'end' && !pathsEqual(landing.path, target.path)
45
37
  ? { path: landing.path, offset: leafOffsetEnd(doc, landing.path) }
46
38
  : landing;
47
- // The landable clamp (a caret may not sit past a hidden run) lives in applyCollapsedCaret.
48
- await revealPath(landing.path);
49
- focusCollapsedCaret(getBlockElByPath, point);
39
+ await restore({ anchor: point, focus: point }, { reveal: 'into-view' });
50
40
  }
51
- /**
52
- * Scroll the focus block into view when mounted. Does not itself reveal a windowed-out block:
53
- * the doc-edge extend reveals its endpoint via `revealActiveEndpoint` first, and a single-step
54
- * Shift+Arrow extend lands adjacent to the mounted window.
55
- */
56
- export function scrollFocusBlockIntoView(selection, getBlockElByPath) {
57
- if (!selection.focus)
58
- return;
59
- const blockEl = getBlockElByPath(selection.focus.path);
60
- blockEl?.scrollIntoView({ block: 'nearest', inline: 'nearest' });
41
+ /** Scrolls the focus block into view if mounted, without mounting it: a document-edge extend
42
+ * mounts its endpoint first, and one Shift+Arrow step lands beside the mounted range. */
43
+ export function scrollFocusBlockIntoView(selection, scroll) {
44
+ if (selection.focus) {
45
+ void scroll.place(selection.focus.path, { block: 'nearest', hold: false }).scroll();
46
+ }
61
47
  }
62
48
  // ── Keyboard Extension ─────────────────────────────────────────────────────
63
- /**
64
- * Move the cross-block focus to `target`, or restore the resulting single-block range natively
65
- * when the seam collapses (focus contracted back onto the anchor's prose leaf). Keyboard entry
66
- * parks only a collapsed caret, so the range must be re-established here to stay visible.
67
- */
49
+ /** Moves the cross-block focus to `target`, or re-creates the range natively when the focus is
50
+ * back on the anchor's block, since keyboard entry left only a collapsed caret there. */
68
51
  function extendFocusOrRestore(selection, target, offset, getBlockElByPath) {
69
52
  const anchor = selection.anchor;
70
53
  selection.extendFocus({ path: target, offset });
@@ -76,17 +59,12 @@ function extendFocusOrRestore(selection, target, offset, getBlockElByPath) {
76
59
  blockEl.focus();
77
60
  applySingleBlockRange(blockEl, Math.min(anchor.offset, offset), Math.max(anchor.offset, offset));
78
61
  }
79
- /**
80
- * Extend focus to the next leaf in document order (Shift+ArrowDown / Shift+ArrowRight leaving
81
- * the block), entering cross-block mode if needed. Returns true if focus moved. `axis` =
82
- * 'vertical' skips vertically-transparent leaves — a range covers one either way, so unlike a
83
- * collapsed caret it needs no object stop; 'horizontal' lands unconditionally so an image-only
84
- * paragraph is selectable in one step.
85
- */
86
- export function extendFocusToNextBlock(selection, doc, currentBlockEl, currentBlockPath, axis = 'horizontal', getBlockElByPath) {
62
+ /** Extends focus to the next leaf a caret can reach. The vertical axis skips leaves the caret
63
+ * passes over (an image-only paragraph); the horizontal stops on each, so it stays selectable. */
64
+ export function extendFocusToNextBlock(selection, doc, grammar, currentBlockEl, currentBlockPath, axis = 'horizontal', getBlockElByPath) {
87
65
  const leafTarget = axis === 'vertical'
88
- ? firstNonTransparentLeafAfter(doc, currentBlockPath)
89
- : firstLeafAfter(doc, currentBlockPath);
66
+ ? firstNonTransparentLeafAfter(doc, grammar, currentBlockPath)
67
+ : nextCaretPath(doc, currentBlockPath);
90
68
  if (!leafTarget)
91
69
  return false;
92
70
  if (!selection.isCrossBlock) {
@@ -96,15 +74,12 @@ export function extendFocusToNextBlock(selection, doc, currentBlockEl, currentBl
96
74
  extendFocusOrRestore(selection, leafTarget, 0, getBlockElByPath);
97
75
  return true;
98
76
  }
99
- /**
100
- * Extend focus to the previous leaf (Shift+ArrowUp / Shift+ArrowLeft). `side` = 'end' for
101
- * ArrowLeft (cross the boundary by one char), 'start' for ArrowUp (select the whole previous
102
- * line, matching native). The vertical path skips vertically-transparent leaves.
103
- */
104
- export function extendFocusToPreviousBlock(selection, doc, currentBlockEl, currentBlockPath, side = 'end', getBlockElByPath) {
77
+ /** Extends focus to the previous leaf: `'end'` crosses the boundary by one character, `'start'`
78
+ * takes the whole previous line as native ArrowUp does, skipping leaves the caret passes over. */
79
+ export function extendFocusToPreviousBlock(selection, doc, grammar, currentBlockEl, currentBlockPath, side = 'end', getBlockElByPath) {
105
80
  const leafTarget = side === 'start'
106
- ? lastNonTransparentLeafBefore(doc, currentBlockPath)
107
- : lastLeafBefore(doc, currentBlockPath);
81
+ ? lastNonTransparentLeafBefore(doc, grammar, currentBlockPath)
82
+ : previousCaretPath(doc, currentBlockPath);
108
83
  if (!leafTarget)
109
84
  return false;
110
85
  if (!selection.isCrossBlock) {
@@ -115,18 +90,16 @@ export function extendFocusToPreviousBlock(selection, doc, currentBlockEl, curre
115
90
  extendFocusOrRestore(selection, leafTarget, offset, getBlockElByPath);
116
91
  return true;
117
92
  }
118
- /**
119
- * Extend focus to the document edge (Mod+Shift+Home / Mod+Shift+End). A transparent edge
120
- * leaf is bypassed for the nearest text-bearing one, matching the cross-block extension path.
121
- */
122
- export function extendFocusToDocEdge(selection, doc, currentBlockEl, currentBlockPath, to, getBlockElByPath) {
123
- const edge = to === 'start' ? firstPath(doc) : lastPath(doc);
93
+ /** Extends focus to the document edge; a transparent edge leaf is bypassed for the nearest
94
+ * text-bearing one, as the one-step extension does. */
95
+ export function extendFocusToDocEdge(selection, doc, grammar, currentBlockEl, currentBlockPath, to, getBlockElByPath) {
96
+ const edge = to === 'start' ? firstCaretLeaf(doc, [0]) : lastCaretLeaf(doc, [doc.children.length - 1]);
124
97
  if (!edge)
125
98
  return false;
126
- const target = isTransparent(doc, edge)
99
+ const target = isTransparent(doc, grammar, edge)
127
100
  ? to === 'start'
128
- ? firstNonTransparentLeafFrom(doc, edge)
129
- : lastNonTransparentLeafFrom(doc, edge)
101
+ ? firstNonTransparentLeafFrom(doc, grammar, edge)
102
+ : lastNonTransparentLeafFrom(doc, grammar, edge)
130
103
  : edge;
131
104
  if (!target)
132
105
  return false;
@@ -138,16 +111,18 @@ export function extendFocusToDocEdge(selection, doc, currentBlockEl, currentBloc
138
111
  extendFocusOrRestore(selection, target, offset, getBlockElByPath);
139
112
  return true;
140
113
  }
141
- /** Select the entire document as a cross-block range (second Ctrl+A press). */
114
+ /** Selects the entire document as a cross-block range (the second Ctrl+A). */
142
115
  export function selectWholeDocument(selection, doc, getBlockElByPath) {
116
+ // Not the caret-reachable order: the range has to cover a closed container's hidden body, so
117
+ // that a delete or a copy of the whole document takes it too.
143
118
  const first = firstPath(doc);
144
119
  const last = lastPath(doc);
145
120
  if (!first || !last)
146
121
  return false;
147
122
  const lastOffset = leafOffsetEnd(doc, last);
148
123
  selection.enterCrossBlock({ path: first, offset: 0 }, { path: last, offset: lastOffset });
149
- // A single prose leaf (whole doc is one block) has no cross-block state to paint; the seam
150
- // refuses it. Select natively so a 2nd Ctrl+A on a one-block doc doesn't deselect.
124
+ // A one-block document has no cross-block range to paint and `enterCrossBlock` refuses it,
125
+ // so select natively; otherwise a second Ctrl+A would deselect.
151
126
  if (!selection.isCustomRendered) {
152
127
  selection.collapse();
153
128
  const blockEl = getBlockElByPath?.(first);
@@ -157,8 +132,8 @@ export function selectWholeDocument(selection, doc, getBlockElByPath) {
157
132
  }
158
133
  return true;
159
134
  }
160
- // Paste-dispatch anchor, see enterCrossBlockFromKeyboard. A table focus normalizes to the
161
- // table block, whose wrapper holds no caret, so park in its deep cell.
135
+ // A collapsed caret for paste dispatch, as in `enterCrossBlockFromKeyboard`. A table focus
136
+ // names the table block, whose wrapper holds no caret, so the caret goes in the cell.
162
137
  const focus = selection.focus;
163
138
  const parkPoint = focus && selection.cellLandingFor(focus);
164
139
  const focusBlockEl = parkPoint ? getBlockElByPath?.(parkPoint.path) : null;
@@ -169,12 +144,14 @@ export function selectWholeDocument(selection, doc, getBlockElByPath) {
169
144
  return true;
170
145
  }
171
146
  // ── Shift+Click ────────────────────────────────────────────────────────────
172
- /**
173
- * Shift+click on a block: extend the cross-block selection, or enter cross-block mode using the
174
- * previously focused block's caret as the anchor. False when no anchor could be recovered, or
175
- * the click stayed within the same block (native shift-click handles that).
176
- */
177
- export function handleShiftClick(selection, clickedBlockEl, clickedBlockPath, clickedX, clickedY, previouslyFocusedBlockEl, previouslyFocusedBlockPath) {
147
+ /** Shift+click on a block: extends the range, grows one from an image selected whole, or enters
148
+ * cross-block mode from the last caret. False for a same-block click, left to the browser. */
149
+ export function handleShiftClick(selection, clickedBlockEl, clickedBlockPath, clickedX, clickedY, previouslyFocusedBlockEl, previouslyFocusedBlockPath, selectedWidget) {
150
+ // While an image is selected whole there is no caret to grow from, so the image is the
151
+ // anchor; the click ends that selection either way, as a range and it never coexist.
152
+ const widget = selectedWidget.range();
153
+ if (widget)
154
+ selectedWidget.clear();
178
155
  const clickOffset = offsetFromViewportPoint(clickedBlockEl, clickedX, clickedY);
179
156
  if (clickOffset === null)
180
157
  return false;
@@ -183,71 +160,71 @@ export function handleShiftClick(selection, clickedBlockEl, clickedBlockPath, cl
183
160
  selection.extendFocus(focusPoint);
184
161
  return true;
185
162
  }
163
+ if (widget) {
164
+ const anchor = widgetShiftAnchor(widget, focusPoint);
165
+ if (comparePaths(anchor.path, focusPoint.path) === 0) {
166
+ applySingleBlockRange(clickedBlockEl, anchor.offset, focusPoint.offset);
167
+ return true;
168
+ }
169
+ selection.enterCrossBlock(anchor, focusPoint);
170
+ applyCollapsedCaret(clickedBlockEl, focusPoint);
171
+ return true;
172
+ }
186
173
  if (!previouslyFocusedBlockEl || !previouslyFocusedBlockPath)
187
174
  return false;
188
- // The anchor path comes from the DOM, and no path host exists below a table, so a caret
189
- // parked in a cell would carry the TABLE's path with a char offset. The endpoint seam can't
190
- // tell that from a cell index, so deepen to the cell here and let the seam convert.
175
+ // Nothing below a table carries a path, so a caret in a cell would read as the table's path
176
+ // with a character offset, which the endpoint snap can't tell from a cell index.
191
177
  const anchorPath = findCellPathForElement(previouslyFocusedBlockEl) ?? previouslyFocusedBlockPath;
192
178
  const anchor = readNativeCaretInBlock(previouslyFocusedBlockEl, anchorPath);
193
179
  if (!anchor)
194
180
  return false;
195
- // Same-block — native selection already produced a single-block range.
181
+ // Same block: the browser's own shift-click already made the range.
196
182
  if (comparePaths(anchor.path, focusPoint.path) === 0)
197
183
  return false;
198
184
  selection.enterCrossBlock(anchor, focusPoint);
199
- // Paste-dispatch anchor (see enterCrossBlockFromKeyboard); the click default isn't relied on.
185
+ // A collapsed caret for paste dispatch (see `enterCrossBlockFromKeyboard`); the click's
186
+ // default is not relied on.
200
187
  applyCollapsedCaret(clickedBlockEl, focusPoint);
201
188
  return true;
202
189
  }
203
- // ── Internal ───────────────────────────────────────────────────────────────
204
- /** First leaf reachable from `fromPath` going forward (descend or step). */
205
- function firstLeafAfter(doc, fromPath) {
206
- const next = nextPath(doc, fromPath);
207
- return next ? firstLeafAtOrAfter(doc, next) : null;
208
- }
209
- /** Last leaf reachable from `fromPath` going backward (descend or step). */
210
- function lastLeafBefore(doc, fromPath) {
211
- // previousPath is doc-order (ancestor-before-descendant), so a first-child leaf's "previous"
212
- // is its own container, and descending into that ancestor's LAST leaf would move the walk
213
- // forward. Skip ancestors until a genuinely preceding subtree is reached.
214
- let prev = previousPath(doc, fromPath);
215
- while (prev && isStrictAncestorOf(prev, fromPath))
216
- prev = previousPath(doc, prev);
217
- return prev ? lastLeafAtOrBefore(doc, prev) : null;
190
+ /** The edge of a selected widget a shift-click grows from: the one away from the click, so the
191
+ * range covers the widget and everything up to the click. */
192
+ export function widgetShiftAnchor(widget, press) {
193
+ const order = comparePaths(press.path, widget.path);
194
+ const pressAfter = order > 0 || (order === 0 && press.offset > widget.start);
195
+ return { path: widget.path.slice(), offset: pressAfter ? widget.start : widget.end };
218
196
  }
219
- function isTransparent(doc, path) {
197
+ // ── Internal ───────────────────────────────────────────────────────────────
198
+ function isTransparent(doc, grammar, path) {
220
199
  const node = nodeAt(doc, path);
221
200
  // nodeAt returns the Document for an empty path; narrow it out (Document has no `raw`).
222
- return node !== null && 'raw' in node && isVerticallyTransparentNode(node);
201
+ return node !== null && 'raw' in node && isVerticallyTransparentNode(node, grammar);
223
202
  }
224
- function firstNonTransparentLeafAfter(doc, fromPath) {
225
- let leaf = firstLeafAfter(doc, fromPath);
226
- while (leaf && isTransparent(doc, leaf)) {
227
- leaf = firstLeafAfter(doc, leaf);
203
+ function firstNonTransparentLeafAfter(doc, grammar, fromPath) {
204
+ let leaf = nextCaretPath(doc, fromPath);
205
+ while (leaf && isTransparent(doc, grammar, leaf)) {
206
+ leaf = nextCaretPath(doc, leaf);
228
207
  }
229
208
  return leaf;
230
209
  }
231
- function lastNonTransparentLeafBefore(doc, fromPath) {
232
- let leaf = lastLeafBefore(doc, fromPath);
233
- while (leaf && isTransparent(doc, leaf)) {
234
- leaf = lastLeafBefore(doc, leaf);
210
+ function lastNonTransparentLeafBefore(doc, grammar, fromPath) {
211
+ let leaf = previousCaretPath(doc, fromPath);
212
+ while (leaf && isTransparent(doc, grammar, leaf)) {
213
+ leaf = previousCaretPath(doc, leaf);
235
214
  }
236
215
  return leaf;
237
216
  }
238
- /**
239
- * Doc-edge resolver: start AT the edge leaf and step inward to a text-bearing leaf. Distinct
240
- * from the leafAfter/leafBefore walkers, which step away from `fromPath`.
241
- */
242
- function firstNonTransparentLeafFrom(doc, startPath) {
243
- if (!isTransparent(doc, startPath))
217
+ /** Starts at the edge leaf itself and steps inward, unlike `nextCaretPath` and
218
+ * `previousCaretPath`, which step away from their start. */
219
+ function firstNonTransparentLeafFrom(doc, grammar, startPath) {
220
+ if (!isTransparent(doc, grammar, startPath))
244
221
  return startPath;
245
- return firstNonTransparentLeafAfter(doc, startPath);
222
+ return firstNonTransparentLeafAfter(doc, grammar, startPath);
246
223
  }
247
- function lastNonTransparentLeafFrom(doc, startPath) {
248
- if (!isTransparent(doc, startPath))
224
+ function lastNonTransparentLeafFrom(doc, grammar, startPath) {
225
+ if (!isTransparent(doc, grammar, startPath))
249
226
  return startPath;
250
- return lastNonTransparentLeafBefore(doc, startPath);
227
+ return lastNonTransparentLeafBefore(doc, grammar, startPath);
251
228
  }
252
229
  function leafOffsetEnd(doc, path) {
253
230
  const node = nodeAt(doc, path);
@@ -1,8 +1,8 @@
1
1
  /**
2
- * The click ladder past the caret: the second press of a run selects the word under it, the
3
- * third the surface's content, and a drag from either extends at that granularity. Owned from
4
- * the second press, so the browser paints nothing of its own: its word rule is per platform,
5
- * its walk enters atomic islands, and a marker here never joins a word.
2
+ * Double and triple click: the second click of a run selects the word under it, the third the
3
+ * whole block's text, and a drag from either grows by that unit. The editor owns the gesture
4
+ * from the second click so the browser paints nothing of its own: its word rule varies by
5
+ * platform, it walks into non-editable widgets, and a marker here never joins a word.
6
6
  */
7
7
  import type { UserScrollport } from '../cursor/scroll-ancestors';
8
8
  import type { BlockElLookup } from '../editor-keys';
@@ -12,16 +12,13 @@ export interface Span {
12
12
  start: number;
13
13
  end: number;
14
14
  }
15
- /**
16
- * [start, end) of the segment at `offset` in `text`: the word ending there when it is one, else
17
- * the segment starting there (whitespace or punctuation, as the engine would take). Null on
18
- * empty text, or on a platform with no segmenter.
19
- */
15
+ /** The segment at `offset`: the word ending there if there is one, else the segment starting
16
+ * there, as the browser takes it. Null on a platform with no segmenter. */
20
17
  export declare function wordSpanAt(text: string, offset: number): Span | null;
21
18
  /** The raw span `granularity` takes around a raw offset in `surface`; null where the word rule
22
19
  * has nothing to read. */
23
20
  export declare function spanAround(surface: HTMLElement, granularity: ClickGranularity, rawOffset: number): Span | null;
24
- /** The rung a press's click count reaches; the run stays at the block rung past three. */
21
+ /** The unit a click count selects; a run stays at the block unit past three clicks. */
25
22
  export declare function granularityForClickCount(clickCount: number): ClickGranularity | null;
26
23
  export interface MultiClickDeps {
27
24
  editorRoot: HTMLElement;
@@ -29,14 +26,12 @@ export interface MultiClickDeps {
29
26
  getBlockElByPath: BlockElLookup;
30
27
  getScrollContainer(): UserScrollport;
31
28
  lifetimeSignal?: AbortSignal;
32
- /** A press outside every editable surface (the margin, a container's own box) names the
33
- * nearest block, as a single click there does; null where the press is chrome's. */
29
+ /** A click outside every editable element (the margin, a container's own box) names the
30
+ * nearest block, as a single click there does; null when the click is on a button or handle. */
34
31
  marginBlockAt(target: EventTarget | null, clientX: number, clientY: number): number[] | null;
32
+ /** Whether the click landed on an inline widget the editor already holds selected whole. */
33
+ pressesSelectedWidget(target: EventTarget | null): boolean;
35
34
  }
36
- /**
37
- * Root listeners for the ladder. The count rides the mousedown (a pointer event carries none),
38
- * and the drag rides the pointerdown of the same press, so both are heard. The mousedown is
39
- * cancelled, never the pointerdown (that would silence the click), and so is the mouseup: the
40
- * browser's release seats a caret at a press that landed off a glyph, over the range just painted.
41
- */
35
+ /** Root listeners for the gesture. The mousedown and mouseup are cancelled so the browser paints
36
+ * no caret over the range, but never the pointerdown, which would silence the click. */
42
37
  export declare function installMultiClickSelect(deps: MultiClickDeps): () => void;
@@ -1,17 +1,17 @@
1
1
  /**
2
- * The click ladder past the caret: the second press of a run selects the word under it, the
3
- * third the surface's content, and a drag from either extends at that granularity. Owned from
4
- * the second press, so the browser paints nothing of its own: its word rule is per platform,
5
- * its walk enters atomic islands, and a marker here never joins a word.
2
+ * Double and triple click: the second click of a run selects the word under it, the third the
3
+ * whole block's text, and a drag from either grows by that unit. The editor owns the gesture
4
+ * from the second click so the browser paints nothing of its own: its word rule varies by
5
+ * platform, it walks into non-editable widgets, and a marker here never joins a word.
6
6
  */
7
- import { ambientLengthOf } from '../ambient/ambient-dom';
8
- import { asDomTextOffset, asRawOffset, toClampedRawOffset, toDomTextOffset } from '../cursor/coordinate-spaces';
7
+ import { asDomTextOffset } from '../cursor/coordinate-spaces';
9
8
  import { caretOffsetAtPoint } from '../cursor/point-offset';
10
- import { containerDomTextLength, maskedWalkText } from '../cursor/widget-offset';
9
+ import { containerDomTextLength, maskedWalkText, rawOfWalkOffset, walkOffsetOfRaw } from '../cursor/widget-offset';
11
10
  import { isWholeBlockInputProxy } from '../editor-actions/whole-block-focus-surface';
12
11
  import { installDragListener } from './drag-pointer';
13
12
  import { applySingleBlockRange, applySurfaceContentRange } from './native-bridge';
14
13
  import { blockNearPoint } from './nearest-block';
14
+ import { readBlockPath } from './path-lookup';
15
15
  // ── The word rule ────────────────────────────────────────────────────────────
16
16
  let segmenter;
17
17
  function wordSegmenter() {
@@ -23,11 +23,8 @@ function wordSegmenter() {
23
23
  }
24
24
  return segmenter;
25
25
  }
26
- /**
27
- * [start, end) of the segment at `offset` in `text`: the word ending there when it is one, else
28
- * the segment starting there (whitespace or punctuation, as the engine would take). Null on
29
- * empty text, or on a platform with no segmenter.
30
- */
26
+ /** The segment at `offset`: the word ending there if there is one, else the segment starting
27
+ * there, as the browser takes it. Null on a platform with no segmenter. */
31
28
  export function wordSpanAt(text, offset) {
32
29
  const seg = wordSegmenter();
33
30
  if (!seg || text.length === 0)
@@ -49,31 +46,25 @@ function spanOf(segment) {
49
46
  /** The raw span `granularity` takes around a raw offset in `surface`; null where the word rule
50
47
  * has nothing to read. */
51
48
  export function spanAround(surface, granularity, rawOffset) {
52
- const ambient = ambientLengthOf(surface);
53
49
  if (granularity === 'block') {
54
- return { start: 0, end: toClampedRawOffset(containerDomTextLength(surface), ambient) };
50
+ return { start: 0, end: rawOfWalkOffset(surface, containerDomTextLength(surface)) };
55
51
  }
56
- const walk = toDomTextOffset(asRawOffset(rawOffset), ambient);
57
- const span = wordSpanAt(maskedWalkText(surface), walk);
52
+ const span = wordSpanAt(maskedWalkText(surface), walkOffsetOfRaw(surface, rawOffset));
58
53
  if (!span)
59
54
  return null;
60
55
  return {
61
- start: toClampedRawOffset(asDomTextOffset(span.start), ambient),
62
- end: toClampedRawOffset(asDomTextOffset(span.end), ambient)
56
+ start: rawOfWalkOffset(surface, asDomTextOffset(span.start)),
57
+ end: rawOfWalkOffset(surface, asDomTextOffset(span.end))
63
58
  };
64
59
  }
65
- /** The rung a press's click count reaches; the run stays at the block rung past three. */
60
+ /** The unit a click count selects; a run stays at the block unit past three clicks. */
66
61
  export function granularityForClickCount(clickCount) {
67
62
  if (clickCount === 2)
68
63
  return 'word';
69
64
  return clickCount >= 3 ? 'block' : null;
70
65
  }
71
- /**
72
- * Root listeners for the ladder. The count rides the mousedown (a pointer event carries none),
73
- * and the drag rides the pointerdown of the same press, so both are heard. The mousedown is
74
- * cancelled, never the pointerdown (that would silence the click), and so is the mouseup: the
75
- * browser's release seats a caret at a press that landed off a glyph, over the range just painted.
76
- */
66
+ /** Root listeners for the gesture. The mousedown and mouseup are cancelled so the browser paints
67
+ * no caret over the range, but never the pointerdown, which would silence the click. */
77
68
  export function installMultiClickSelect(deps) {
78
69
  let lastPointerDown = null;
79
70
  let claimed = false;
@@ -89,7 +80,11 @@ export function installMultiClickSelect(deps) {
89
80
  const granularity = granularityForClickCount(e.detail);
90
81
  if (!granularity || e.button !== 0 || e.shiftKey || e.ctrlKey || e.metaKey || e.altKey)
91
82
  return;
92
- if (pressesInlineWidget(e.target))
83
+ if (granularity === 'word' && pressesInlineWidget(e.target))
84
+ return;
85
+ // A widget already selected whole took the run with its first click, so no later click of
86
+ // that run is the block's: claiming one would paint a range over an object selection.
87
+ if (deps.pressesSelectedWidget(e.target))
93
88
  return;
94
89
  const press = pressedSurface(deps, e);
95
90
  if (!press)
@@ -120,10 +115,10 @@ export function installMultiClickSelect(deps) {
120
115
  deps.editorRoot.removeEventListener('mouseup', onMouseUp);
121
116
  };
122
117
  }
123
- /** The surface a press selects in: the editable under it, else the nearest block's, the way a
124
- * single click in the margin lands there. A block with no text surface is nobody's word. */
118
+ /** The editable element a click selects in: the one under it, else the nearest block's, the
119
+ * way a single click in the margin lands there. A block with no text has no word to select. */
125
120
  function pressedSurface(deps, e) {
126
- // Up through an island inside the editable (a list's `- ` prefix) to the surface itself.
121
+ // Up through a non-editable span inside the editable (a list's `- ` prefix) to the editable.
127
122
  const own = surfaceOf(e.target);
128
123
  if (own)
129
124
  return isWholeBlockInputProxy(own) ? null : { surface: own, anchor: null };
@@ -131,7 +126,7 @@ function pressedSurface(deps, e) {
131
126
  const block = path && deps.getBlockElByPath(path);
132
127
  if (!block)
133
128
  return null;
134
- // A container's own box (a quote's gutter) selects in the leaf nearest the press, the way a
129
+ // A container's own box (a quote's gutter) selects in the leaf nearest the click, the way a
135
130
  // click beside a line lands in that line.
136
131
  const surface = block.contentEditable === 'true' ? block : nearestSurfaceIn(block, e.clientY);
137
132
  const surfacePath = surface && pathOfSurface(surface);
@@ -153,17 +148,16 @@ function nearestSurfaceIn(block, clientY) {
153
148
  }
154
149
  return best;
155
150
  }
156
- /** The path of the block a surface is the content of; null for a surface addressed some other
157
- * way (a table's cell), whose drag is not a char-point drag. */
151
+ /** The path of the block this editable element is the text of; null for one addressed some
152
+ * other way (a table's cell), whose drag is not a character drag. */
158
153
  function pathOfSurface(surface) {
159
154
  const host = surface.closest('[data-block-path]');
160
- const raw = host?.getAttribute('data-block-path');
161
- if (!raw || !host?.contains(surface))
155
+ const path = readBlockPath(host);
156
+ if (!path || !host?.contains(surface))
162
157
  return null;
163
- const path = JSON.parse(raw);
164
158
  return host.querySelector('[contenteditable="true"]') === surface ? path : null;
165
159
  }
166
- /** Paint the rung's span at the press and answer it, in raw offsets. */
160
+ /** Selects the unit's span at the click and returns it, in raw offsets. */
167
161
  function selectAtPoint(surface, granularity, clientX, clientY) {
168
162
  if (granularity === 'block') {
169
163
  applySurfaceContentRange(surface);
@@ -190,8 +184,8 @@ function createGranularity(getBlockElByPath, surface, granularity, anchorSpan) {
190
184
  }
191
185
  };
192
186
  }
193
- /** A press on an inline widget is that widget's own gesture (a footnote's double-click takes
194
- * its whole token), so the ladder leaves it alone. */
187
+ /** The second click on an inline widget is that widget's own gesture (a footnote's double-click
188
+ * takes its whole token), so the word level does nothing there. */
195
189
  function pressesInlineWidget(target) {
196
190
  return target instanceof Element && target.closest('[data-inline-widget]') !== null;
197
191
  }