@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
@@ -3,24 +3,24 @@
3
3
  * values are invariant to vertical scrolling inside the editor.
4
4
  */
5
5
  import { asDomTextOffset, asViewportX, toEditorX, toViewportX } from './coordinate-spaces';
6
- import { containerDomTextLength, findDomTextOffsetTarget } from './widget-offset';
7
- import { firstUsefulRect } from './visual-lines';
8
- // Half a line height of padding on each side of the probe line — wide enough for
9
- // ascender/descender variation, narrow enough to exclude the neighbouring line.
10
- const LINE_BAND_TOLERANCE = 0.5;
6
+ import { containerDomTextLength, domTextOffsetAtNode, findDomTextLanding, holdsTextPast, widgetSpanContainingOffset } from './widget-offset';
7
+ import { firstUsefulRect, neighbourCaretRect, sameLineTolerance } from './visual-lines';
11
8
  export function getCurrentCursorEditorRelativeX(el) {
12
9
  const sel = window.getSelection();
13
10
  if (!sel || sel.rangeCount === 0)
14
11
  return null;
15
12
  const range = sel.getRangeAt(0);
16
- const rect = firstUsefulRect(range);
13
+ const rect = firstUsefulRect(range) ?? neighbourCaretRect(range);
17
14
  const viewportX = asViewportX(rect ? rect.left : el.getBoundingClientRect().left);
18
15
  return toEditorX(viewportX, editorLeftOf(el));
19
16
  }
20
- export function getOffsetRect(container, offset) {
21
- const pos = findDomTextOffsetTarget(container, offset);
22
- if (!pos)
17
+ /** The caret's box at a DOM-walk offset, under the offset the caret would really take; a position
18
+ * beside a widget borrows the widget's near edge. Null where the offset measures to nothing. */
19
+ export function caretBoxAt(container, offset) {
20
+ const landing = findDomTextLanding(container, offset);
21
+ if (!landing)
23
22
  return null;
23
+ const pos = landing.position;
24
24
  const range = document.createRange();
25
25
  try {
26
26
  range.setStart(pos.node, pos.offset);
@@ -29,58 +29,68 @@ export function getOffsetRect(container, offset) {
29
29
  return null;
30
30
  }
31
31
  range.collapse(true);
32
- return firstUsefulRect(range);
32
+ const measured = firstUsefulRect(range);
33
+ const rect = measured ?? neighbourCaretRect(range);
34
+ if (!rect)
35
+ return null;
36
+ return {
37
+ offset: landing.inTextAtTarget ? offset : domTextOffsetAtNode(container, pos.node, pos.offset),
38
+ rect,
39
+ borrowed: measured === null
40
+ };
33
41
  }
34
- /**
35
- * Offset on the first or last caret-bearing visual line whose collapsed-range rect is
36
- * closest to `editorRelativeX`. Linear scan — `getClientRects` left values are
37
- * non-monotonic on BiDi lines, so binary search is invalid. Widget-only lines are
38
- * transparent (their collapsed ranges return null rects); `minOffset` excludes the
39
- * ambient-marker prefix.
40
- */
41
- export function findOffsetNearestX(container, editorRelativeX, from, minOffset = asDomTextOffset(0)) {
42
- const totalLen = containerDomTextLength(container);
42
+ /** The offset on the first or last caret-bearing line nearest `editorRelativeX`, by linear scan
43
+ * since BiDi rect lefts are non-monotonic. `minOffset` and `maxOffset` bound the answer. */
44
+ export function findOffsetNearestX(container, editorRelativeX, from, minOffset = asDomTextOffset(0), maxOffset) {
45
+ const totalLen = Math.min(maxOffset ?? Infinity, containerDomTextLength(container));
43
46
  if (totalLen <= minOffset)
44
47
  return minOffset;
45
48
  const targetViewportX = toViewportX(editorRelativeX, editorLeftOf(container));
46
- // Only offsets near the probed edge can be the answer, so walk inward and stop a few
47
- // lines past it: the band filter below discards anything further regardless, making
48
- // this identical to a full scan at O(lines-near-edge) instead of O(raw length).
49
+ // Only offsets near the probed edge can be the answer, so walk inward and stop past it: the
50
+ // band filter below discards anything further regardless.
49
51
  const forward = from === 'above';
50
- const STOP_AFTER_LINES = 3;
52
+ const tolerance = sameLineTolerance(container);
53
+ const owned = createEdgeTracker(forward, (first) => STOP_AFTER_LINES * lineHeightOf(first));
54
+ // A caret beside a widget shows nothing, so a borrowed box sets the edge only in a block made
55
+ // of widgets alone, where offsets run line by line and the walk can stop past the edge's band.
56
+ const borrowed = holdsTextPast(container, minOffset)
57
+ ? null
58
+ : createEdgeTracker(forward, () => tolerance);
59
+ const walkEndsAt = (probe) => {
60
+ if (!probe.borrowed)
61
+ return owned.passes(probe.rect);
62
+ // Once text has set the edge, a widget box as far past it ends the walk as a text box would.
63
+ return owned.edge ? owned.isPast(probe.rect) : (borrowed?.passes(probe.rect) ?? false);
64
+ };
51
65
  const candidates = [];
52
- // The probed edge's own line: min top (above) / max bottom (below), first candidate wins a tie.
53
- let edgeRect = null;
54
- let lineH = 0;
55
66
  for (let k = 0; k <= totalLen - minOffset; k++) {
56
- const offset = asDomTextOffset(forward ? minOffset + k : totalLen - k);
57
- const rect = getOffsetRect(container, offset);
58
- if (!rect)
67
+ const target = asDomTextOffset(forward ? minOffset + k : totalLen - k);
68
+ // Every offset inside a widget lands beside it, where one of its boundaries measures: skip
69
+ // to the far boundary so the widget costs one probe.
70
+ const inside = widgetSpanContainingOffset(container, target);
71
+ if (inside) {
72
+ k = (forward ? inside.end - minOffset : totalLen - inside.start) - 1;
59
73
  continue;
60
- if (lineH === 0)
61
- lineH = Math.max(1, rect.bottom - rect.top);
62
- if (edgeRect) {
63
- const distancePastEdge = forward ? rect.top - edgeRect.top : edgeRect.bottom - rect.bottom;
64
- if (distancePastEdge > STOP_AFTER_LINES * lineH)
65
- break;
66
- }
67
- candidates.push({ offset, rect });
68
- if (!edgeRect || (forward ? rect.top < edgeRect.top : rect.bottom > edgeRect.bottom)) {
69
- edgeRect = rect;
70
74
  }
75
+ const probe = caretBoxAt(container, target);
76
+ if (!probe)
77
+ continue;
78
+ if (walkEndsAt(probe))
79
+ break;
80
+ candidates.push(probe);
71
81
  }
72
- if (!edgeRect)
82
+ if (candidates.length === 0)
73
83
  return minOffset;
74
- const lineTop = edgeRect.top;
75
- const lineBottom = edgeRect.bottom;
76
- const lineHeight = Math.max(1, lineBottom - lineTop);
77
- const tolerance = lineHeight * LINE_BAND_TOLERANCE;
78
- let bestOffset = candidates[0].offset;
84
+ // A block made of widgets alone has no line with a box of its own, and the widget edges are
85
+ // the only positions its caret can take.
86
+ const pool = owned.edge ? candidates.filter((probe) => !probe.borrowed) : candidates;
87
+ const edgeLine = owned.edge ?? edgeLineOf(pool, forward);
88
+ // Which offsets share the edge line: boxes ending within four fifths of the block's line
89
+ // height of it, which holds a tall widget on the line with a few pixels to spare over the gap.
90
+ let bestOffset = pool[0].offset;
79
91
  let bestDelta = Infinity;
80
- for (const { offset, rect } of candidates) {
81
- if (rect.top > lineBottom + tolerance)
82
- continue;
83
- if (rect.bottom < lineTop - tolerance)
92
+ for (const { offset, rect } of pool) {
93
+ if (Math.abs(rect.bottom - edgeLine.bottom) > tolerance)
84
94
  continue;
85
95
  const delta = Math.abs(rect.left - targetViewportX);
86
96
  if (delta < bestDelta) {
@@ -91,6 +101,46 @@ export function findOffsetNearestX(container, editorRelativeX, from, minOffset =
91
101
  return bestOffset;
92
102
  }
93
103
  // ── Internal ─────────────────────────────────────────────────────────────────
104
+ const STOP_AFTER_LINES = 3;
105
+ /** The probed edge's line as an inward walk sees it, and whether a box has gone further past it
106
+ * than `allowance` (read off the first box) allows. Distances are between bottoms. */
107
+ function createEdgeTracker(forward, allowance) {
108
+ let edge = null;
109
+ let limit = 0;
110
+ const isPast = (rect) => {
111
+ if (!edge)
112
+ return false;
113
+ return (forward ? rect.bottom - edge.bottom : edge.bottom - rect.bottom) > limit;
114
+ };
115
+ return {
116
+ get edge() {
117
+ return edge;
118
+ },
119
+ /** Reads the box against the edge without letting it move the edge. */
120
+ isPast,
121
+ /** Takes the box as the edge when it is the first, or sits nearer the edge than it. */
122
+ passes(rect) {
123
+ if (!edge) {
124
+ edge = rect;
125
+ limit = allowance(rect);
126
+ return false;
127
+ }
128
+ if (isPast(rect))
129
+ return true;
130
+ if (forward ? rect.top < edge.top : rect.bottom > edge.bottom)
131
+ edge = rect;
132
+ return false;
133
+ }
134
+ };
135
+ }
136
+ function lineHeightOf(rect) {
137
+ return Math.max(1, rect.bottom - rect.top);
138
+ }
139
+ /** The box on the probed edge's line: the highest top (above) or the lowest bottom (below), the
140
+ * first of equals winning. */
141
+ function edgeLineOf(probes, forward) {
142
+ return probes.reduce((held, probe) => (forward ? probe.rect.top < held.top : probe.rect.bottom > held.bottom) ? probe.rect : held, probes[0].rect);
143
+ }
94
144
  function editorLeftOf(el) {
95
145
  const editor = el.closest('.editor');
96
146
  return editor ? editor.getBoundingClientRect().left : 0;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Caret reads and writes for an editable block element, in raw offsets, over the one offset walk
3
+ * in `widget-offset.ts`. Every editable surface (prose, code, table cell, plugin leaf) builds one.
4
+ * Reads answer only while the element holds focus.
5
+ */
6
+ import { type RawOffset } from './coordinate-spaces';
7
+ import { type CaretClamp } from './widget-offset';
8
+ export interface SurfaceBackendDeps {
9
+ getEl: () => HTMLElement | null;
10
+ /** Where the user meant the caret, in raw units, when the browser holds no usable range: Chromium
11
+ * drops an element-level caret beside an atomic widget across an event-loop yield. */
12
+ getSnapTarget?: () => number | null;
13
+ }
14
+ /** The caret calls the editable-surface factory needs from a block. */
15
+ export interface CursorBackend {
16
+ /** Raw offset of the caret (the range start), or null when the element does not hold focus. */
17
+ getRaw(): RawOffset | null;
18
+ /** Place a collapsed caret; `clamp` says whether the offset may move onto a position the
19
+ * caret can reach. */
20
+ setRaw(offset: RawOffset, placement: {
21
+ clamp: CaretClamp;
22
+ }): void;
23
+ }
24
+ export interface SurfaceBackend extends CursorBackend {
25
+ /** Raw offset of the selection's moving end, or null when it sits outside the element. */
26
+ getFocusOffset(): RawOffset | null;
27
+ /** Raw offsets of the selection's start and end, or null for a caret or an unfocused element. */
28
+ getRawSelection(): {
29
+ start: RawOffset;
30
+ end: RawOffset;
31
+ } | null;
32
+ /** Raw offsets of an arbitrary range inside the element: an InputEvent's target range, which a
33
+ * word delete reports at a collapsed caret, so the selection cannot answer it. */
34
+ rawRangeOf(range: AbstractRange): {
35
+ start: RawOffset;
36
+ end: RawOffset;
37
+ } | null;
38
+ /** Move a focused caret that sits inside the marker prefix to raw 0, just past the prefix. */
39
+ clampOutOfMarkerPrefix(): void;
40
+ }
41
+ export declare function createSurfaceBackend(deps: SurfaceBackendDeps): SurfaceBackend;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Caret reads and writes for an editable block element, in raw offsets, over the one offset walk
3
+ * in `widget-offset.ts`. Every editable surface (prose, code, table cell, plugin leaf) builds one.
4
+ * Reads answer only while the element holds focus.
5
+ */
6
+ import { asRawOffset } from './coordinate-spaces';
7
+ import { domTextOffsetAtNode, markerPrefixLength, markerPrefixOf, placeCaretAtRaw, rawOffsetAt, rawSelectionFocus } from './widget-offset';
8
+ export function createSurfaceBackend(deps) {
9
+ function snapTargetRaw() {
10
+ const target = deps.getSnapTarget?.() ?? null;
11
+ return target === null ? null : asRawOffset(target);
12
+ }
13
+ function getRaw() {
14
+ const live = readLiveRange(deps.getEl());
15
+ if (live.state === 'inactive')
16
+ return null;
17
+ // A dropped range, or one bounced into the read-only prefix: the snap target holds where the
18
+ // user meant the caret.
19
+ if (live.state === 'dropped' || live.inPrefix(live.range.startContainer))
20
+ return snapTargetRaw();
21
+ return rawOffsetAt(live.el, live.range.startContainer, live.range.startOffset);
22
+ }
23
+ function setRaw(offset, placement) {
24
+ const el = deps.getEl();
25
+ if (el)
26
+ placeCaretAtRaw(el, offset, placement);
27
+ }
28
+ function getFocusOffset() {
29
+ const el = deps.getEl();
30
+ return el ? rawSelectionFocus(el) : null;
31
+ }
32
+ function getRawSelection() {
33
+ const live = readLiveRange(deps.getEl());
34
+ if (live.state !== 'live' || live.collapsed)
35
+ return null;
36
+ // No snap-target fallback: one caret intent cannot stand in for one end of a pair, and an
37
+ // endpoint inside the prefix already reads as raw 0.
38
+ return rawEndpointsOf(live.el, live.range);
39
+ }
40
+ function rawRangeOf(range) {
41
+ const el = deps.getEl();
42
+ if (!el || !el.contains(range.startContainer) || !el.contains(range.endContainer))
43
+ return null;
44
+ return rawEndpointsOf(el, range);
45
+ }
46
+ function clampOutOfMarkerPrefix() {
47
+ const live = readLiveRange(deps.getEl());
48
+ if (live.state !== 'live' || !live.collapsed)
49
+ return;
50
+ const { startContainer, startOffset } = live.range;
51
+ const walk = domTextOffsetAtNode(live.el, startContainer, startOffset);
52
+ if (walk < markerPrefixLength(live.el))
53
+ placeCaretAtRaw(live.el, 0, { clamp: 'exact' });
54
+ }
55
+ return { getRaw, setRaw, getFocusOffset, getRawSelection, rawRangeOf, clampOutOfMarkerPrefix };
56
+ }
57
+ // ── Internal ────────────────────────────────────────────────────────────────
58
+ function rawEndpointsOf(el, range) {
59
+ return {
60
+ start: rawOffsetAt(el, range.startContainer, range.startOffset),
61
+ end: rawOffsetAt(el, range.endContainer, range.endOffset)
62
+ };
63
+ }
64
+ function readLiveRange(el) {
65
+ if (!el || document.activeElement !== el)
66
+ return { state: 'inactive' };
67
+ const sel = window.getSelection();
68
+ if (!sel || sel.rangeCount === 0)
69
+ return { state: 'dropped' };
70
+ const prefix = markerPrefixOf(el);
71
+ return {
72
+ state: 'live',
73
+ el,
74
+ range: sel.getRangeAt(0),
75
+ collapsed: sel.isCollapsed,
76
+ inPrefix: (node) => prefix !== null && prefix.contains(node)
77
+ };
78
+ }
@@ -2,8 +2,8 @@
2
2
  * Empirical pixel estimates of the editor font's line box, measured at
3
3
  * {@link ESTIMATE_BASE_FONT_SIZE} and shared by `height-oracle.ts` and `visual-lines.ts`.
4
4
  * Character width has no CSS number to derive from, so the set is mirrored by hand at one scale.
5
- * The editor's type scale is font-relative, so consumers scale these by the root's live computed
6
- * font size — an estimate calibrated for one scale can miss the windowing watermark entirely.
5
+ * The editor's type scale is font-relative, so callers scale these by the root's live computed
6
+ * font size; an estimate calibrated for one scale can miss the windowing threshold entirely.
7
7
  */
8
8
  /** The computed root font size the estimates below were measured at. */
9
9
  export declare const ESTIMATE_BASE_FONT_SIZE = 16;
@@ -14,7 +14,7 @@ export declare const HEIGHT_ESTIMATES: {
14
14
  readonly blockChrome: 16;
15
15
  readonly imageBlockMinHeight: 200;
16
16
  };
17
- /** Fallback for a `normal` computed `lineHeight` (parses to NaN) — a generic line box,
17
+ /** Fallback for a `normal` computed `lineHeight` (parses to NaN): a generic line box,
18
18
  * independent of the per-kind estimates above. */
19
19
  export declare const FALLBACK_LINE_HEIGHT = 20;
20
20
  /** Fallback content width when no editor element is measurable yet (pre-mount, jsdom). */
@@ -2,8 +2,8 @@
2
2
  * Empirical pixel estimates of the editor font's line box, measured at
3
3
  * {@link ESTIMATE_BASE_FONT_SIZE} and shared by `height-oracle.ts` and `visual-lines.ts`.
4
4
  * Character width has no CSS number to derive from, so the set is mirrored by hand at one scale.
5
- * The editor's type scale is font-relative, so consumers scale these by the root's live computed
6
- * font size — an estimate calibrated for one scale can miss the windowing watermark entirely.
5
+ * The editor's type scale is font-relative, so callers scale these by the root's live computed
6
+ * font size; an estimate calibrated for one scale can miss the windowing threshold entirely.
7
7
  */
8
8
  /** The computed root font size the estimates below were measured at. */
9
9
  export const ESTIMATE_BASE_FONT_SIZE = 16;
@@ -14,7 +14,7 @@ export const HEIGHT_ESTIMATES = {
14
14
  blockChrome: 16, // px of margin/padding per block
15
15
  imageBlockMinHeight: 200 // px floor for an image-bearing paragraph
16
16
  };
17
- /** Fallback for a `normal` computed `lineHeight` (parses to NaN) — a generic line box,
17
+ /** Fallback for a `normal` computed `lineHeight` (parses to NaN): a generic line box,
18
18
  * independent of the per-kind estimates above. */
19
19
  export const FALLBACK_LINE_HEIGHT = 20;
20
20
  /** Fallback content width when no editor element is measurable yet (pre-mount, jsdom). */
@@ -1,26 +1,37 @@
1
1
  /**
2
- * Whether the cursor sits on the first or last visual line of a wrapping element. Offsets alone
3
- * can't answer it past 2 wrapped lines, so the cursor's line is compared to the edge line's.
4
- * Collapsed ranges beside non-text children (dimmed markers, atomic islands) measure to nothing,
5
- * so the edge line is measured around real text, and a rect-less caret reads the box it sits
6
- * against.
2
+ * Whether the cursor sits on the first or last visual line of a wrapping element, by comparing
3
+ * the cursor's line box with the edge line's. A caret beside a non-text child measures to
4
+ * nothing, so it borrows the box it sits against; that box and the line tolerance live here.
7
5
  */
8
6
  /** The first rect that can position a caret: the leading client rect when it has real
9
7
  * height, else the bounding rect. `widthTolerant` also accepts a zero-height rect with width. */
10
8
  export declare function firstUsefulRect(range: Range, widthTolerant?: boolean): DOMRect | null;
11
9
  export declare function getRangeTop(range: Range): number | null;
10
+ /** The box a caret sits in: what the line comparisons and the sticky column both read of it. */
11
+ export interface CaretRect {
12
+ /** The caret's x. For a caret borrowing a widget's box, the edge it sits on. */
13
+ left: number;
14
+ top: number;
15
+ bottom: number;
16
+ }
17
+ /** The box a caret with no rect of its own borrows: the widget it precedes, else the one it follows.
18
+ * Null off an element-level position, or when the neighbour measures to nothing. */
19
+ export declare function neighbourCaretRect(range: Range): CaretRect | null;
20
+ /** How far apart two carets' boxes may sit and still read as one visual line: under one line of
21
+ * the element's own leading, so sub/superscript or inline-image jitter is not a new line. */
22
+ export declare function sameLineTolerance(el: HTMLElement): number;
12
23
  /** Non-collapsed ranges reliably return rects where collapsed ones don't. */
13
24
  export declare function getCharRangeTop(container: Node, offset: number, atEnd: boolean): number | null;
14
25
  /** Skips non-text children (dimmed marker spans) that would otherwise leave the block's
15
26
  * first line unmeasurable, and hidden marker text, which measures to no rect at all. */
16
27
  export declare function findFirstTextNode(root: Node): Text | null;
17
28
  export declare function findLastTextNode(root: Node): Text | null;
18
- /**
19
- * True if the selection inside `el` sits on the first visual line; empty containers return true.
20
- * `fallbackOffset` (the snapped caret intent from `ambient-cursor.getRaw`) resolves the case
21
- * where there is no live range — Chromium drops the caret range next to atomic
22
- * contenteditable=false islands across event-loop yields. It is compared against the block's
23
- * first LANDABLE offset, which a leading hidden run moves off raw 0.
24
- */
25
- export declare function isAtFirstVisualLine(el: HTMLElement, fallbackOffset: number, contentStart: number): boolean;
26
- export declare function isAtLastVisualLine(el: HTMLElement, fallbackOffset: number, contentEnd: number): boolean;
29
+ /** The first and last offsets a caret can sit at in a block, which a hidden run moves inward. */
30
+ export interface CaretBounds {
31
+ start: number;
32
+ end: number;
33
+ }
34
+ /** True if the selection in `el` sits on the first visual line, or holds no range. `fallbackOffset`
35
+ * answers without a live range, which Chromium drops beside widgets across event-loop yields. */
36
+ export declare function isAtFirstVisualLine(el: HTMLElement, fallbackOffset: number, bounds: CaretBounds): boolean;
37
+ export declare function isAtLastVisualLine(el: HTMLElement, fallbackOffset: number, bounds: CaretBounds): boolean;
@@ -1,15 +1,13 @@
1
1
  /**
2
- * Whether the cursor sits on the first or last visual line of a wrapping element. Offsets alone
3
- * can't answer it past 2 wrapped lines, so the cursor's line is compared to the edge line's.
4
- * Collapsed ranges beside non-text children (dimmed markers, atomic islands) measure to nothing,
5
- * so the edge line is measured around real text, and a rect-less caret reads the box it sits
6
- * against.
2
+ * Whether the cursor sits on the first or last visual line of a wrapping element, by comparing
3
+ * the cursor's line box with the edge line's. A caret beside a non-text child measures to
4
+ * nothing, so it borrows the box it sits against; that box and the line tolerance live here.
7
5
  */
8
6
  import { domDescendants } from './dom-walk';
9
7
  import { FALLBACK_LINE_HEIGHT } from './typography-estimates';
10
8
  import { isHiddenMarkerText } from './widget-offset';
11
- // Fraction of a line height within which the cursor Y counts as the boundary line —
12
- // sub-line, so sub/superscript or inline-image jitter doesn't read as a different line.
9
+ // Fraction of a line height within which the cursor Y counts as the boundary line; under one
10
+ // line, so sub/superscript or inline-image jitter doesn't read as a different line.
13
11
  const SAME_LINE_TOLERANCE = 0.8;
14
12
  /** The first rect that can position a caret: the leading client rect when it has real
15
13
  * height, else the bounding rect. `widthTolerant` also accepts a zero-height rect with width. */
@@ -25,6 +23,22 @@ export function firstUsefulRect(range, widthTolerant = true) {
25
23
  export function getRangeTop(range) {
26
24
  return firstUsefulRect(range, false)?.top ?? null;
27
25
  }
26
+ /** The box a caret with no rect of its own borrows: the widget it precedes, else the one it follows.
27
+ * Null off an element-level position, or when the neighbour measures to nothing. */
28
+ export function neighbourCaretRect(range) {
29
+ const container = range.startContainer;
30
+ if (container.nodeType !== Node.ELEMENT_NODE)
31
+ return null;
32
+ const children = container.childNodes;
33
+ return (nodeCaretRect(children[range.startOffset], false) ??
34
+ nodeCaretRect(children[range.startOffset - 1], true));
35
+ }
36
+ /** How far apart two carets' boxes may sit and still read as one visual line: under one line of
37
+ * the element's own leading, so sub/superscript or inline-image jitter is not a new line. */
38
+ export function sameLineTolerance(el) {
39
+ const lineHeight = parseFloat(getComputedStyle(el).lineHeight) || FALLBACK_LINE_HEIGHT;
40
+ return lineHeight * SAME_LINE_TOLERANCE;
41
+ }
28
42
  /** Non-collapsed ranges reliably return rects where collapsed ones don't. */
29
43
  export function getCharRangeTop(container, offset, atEnd) {
30
44
  try {
@@ -52,16 +66,11 @@ export function findFirstTextNode(root) {
52
66
  export function findLastTextNode(root) {
53
67
  return measurableText(root, containerOf(root), true);
54
68
  }
55
- /**
56
- * True if the selection inside `el` sits on the first visual line; empty containers return true.
57
- * `fallbackOffset` (the snapped caret intent from `ambient-cursor.getRaw`) resolves the case
58
- * where there is no live range — Chromium drops the caret range next to atomic
59
- * contenteditable=false islands across event-loop yields. It is compared against the block's
60
- * first LANDABLE offset, which a leading hidden run moves off raw 0.
61
- */
62
- export function isAtFirstVisualLine(el, fallbackOffset, contentStart) {
63
- return isAtEdgeVisualLine(el, () => fallbackOffset <= contentStart, {
64
- isEmpty: (el.textContent ?? '').length === 0,
69
+ /** True if the selection in `el` sits on the first visual line, or holds no range. `fallbackOffset`
70
+ * answers without a live range, which Chromium drops beside widgets across event-loop yields. */
71
+ export function isAtFirstVisualLine(el, fallbackOffset, bounds) {
72
+ return isAtEdgeVisualLine(el, () => fallbackOffset <= bounds.start, {
73
+ isEmpty: bounds.start === bounds.end,
65
74
  toStart: true,
66
75
  boundaryTop: () => {
67
76
  const firstText = findFirstTextNode(el);
@@ -70,9 +79,9 @@ export function isAtFirstVisualLine(el, fallbackOffset, contentStart) {
70
79
  }
71
80
  });
72
81
  }
73
- export function isAtLastVisualLine(el, fallbackOffset, contentEnd) {
74
- return isAtEdgeVisualLine(el, () => fallbackOffset >= contentEnd, {
75
- isEmpty: contentEnd === 0,
82
+ export function isAtLastVisualLine(el, fallbackOffset, bounds) {
83
+ return isAtEdgeVisualLine(el, () => fallbackOffset >= bounds.end, {
84
+ isEmpty: bounds.start === bounds.end,
76
85
  toStart: false,
77
86
  boundaryTop: () => {
78
87
  const lastText = findLastTextNode(el);
@@ -82,8 +91,7 @@ export function isAtLastVisualLine(el, fallbackOffset, contentEnd) {
82
91
  });
83
92
  }
84
93
  // ── Internal ────────────────────────────────────────────────────────────────
85
- /** The shared skeleton of the two edge predicates: `fallback` answers where geometry cannot — a
86
- * dropped range, a caret no box can be found for, an unmeasurable boundary line — and
94
+ /** The shared skeleton of the two edge predicates: `fallback` answers where geometry cannot, and
87
95
  * `boundaryTop` measures the edge line each side's own way. */
88
96
  function isAtEdgeVisualLine(el, fallback, edge) {
89
97
  const sel = window.getSelection();
@@ -92,16 +100,15 @@ function isAtEdgeVisualLine(el, fallback, edge) {
92
100
  if (edge.isEmpty)
93
101
  return true;
94
102
  const cursorRange = sel.getRangeAt(0);
95
- const lineHeight = parseFloat(getComputedStyle(el).lineHeight) || FALLBACK_LINE_HEIGHT;
96
- const tolerance = lineHeight * SAME_LINE_TOLERANCE;
103
+ const tolerance = sameLineTolerance(el);
97
104
  const cursorTop = getRangeTop(cursorRange);
98
105
  if (cursorTop === null) {
99
106
  if (!cursorRange.collapsed)
100
107
  return true;
101
- // A caret beside an atomic island sits at an element-level position and measures to no rect
102
- // of its own: it rides the island's box, and is at the edge line when nothing reaches past.
103
- const band = neighbourBand(cursorRange);
104
- const contents = bandOfRange(contentsRange(el));
108
+ // A caret beside an atomic widget sits at an element-level position and measures to no rect
109
+ // of its own: it borrows the widget's box, and is at the edge line when nothing reaches past.
110
+ const band = neighbourCaretRect(cursorRange);
111
+ const contents = contentsRect(el);
105
112
  if (!band || !contents)
106
113
  return fallback();
107
114
  return edge.toStart
@@ -113,36 +120,28 @@ function isAtEdgeVisualLine(el, fallback, edge) {
113
120
  return fallback();
114
121
  return Math.abs(cursorTop - edgeTop) < tolerance;
115
122
  }
116
- /** The vertical band of the box a rect-less caret sits against: the child it precedes, else the
117
- * one it follows. Null where the caret is not at an element-level position. */
118
- function neighbourBand(range) {
119
- const container = range.startContainer;
120
- if (container.nodeType !== Node.ELEMENT_NODE)
121
- return null;
122
- const children = container.childNodes;
123
- return (nodeBand(children[range.startOffset], false) ?? nodeBand(children[range.startOffset - 1], true));
124
- }
125
- function nodeBand(node, fromEnd) {
123
+ function nodeCaretRect(node, fromEnd) {
126
124
  if (!node)
127
125
  return null;
128
126
  const range = document.createRange();
129
127
  range.selectNode(node);
130
128
  // A node that wraps has one rect per line, and the caret touches the line on its own side.
131
129
  const rects = range.getClientRects();
132
- if (rects.length === 0)
133
- return bandOfRange(range);
134
- return bandOf(rects[fromEnd ? rects.length - 1 : 0]);
130
+ const rect = rects.length === 0 ? range.getBoundingClientRect() : rects[fromEnd ? rects.length - 1 : 0];
131
+ return caretRectOf(rect, fromEnd);
135
132
  }
136
133
  function contentsRange(el) {
137
134
  const range = document.createRange();
138
135
  range.selectNodeContents(el);
139
136
  return range;
140
137
  }
141
- function bandOfRange(range) {
142
- return bandOf(range.getBoundingClientRect());
138
+ function contentsRect(el) {
139
+ return caretRectOf(contentsRange(el).getBoundingClientRect(), false);
143
140
  }
144
- function bandOf(rect) {
145
- return rect.height > 0 ? { top: rect.top, bottom: rect.bottom } : null;
141
+ function caretRectOf(rect, fromEnd) {
142
+ if (rect.height <= 0)
143
+ return null;
144
+ return { left: fromEnd ? rect.right : rect.left, top: rect.top, bottom: rect.bottom };
146
145
  }
147
146
  /** The boundary line's collapsed-contents fallback measurement. */
148
147
  function collapsedContentsTop(el, toStart) {
@@ -150,7 +149,7 @@ function collapsedContentsTop(el, toStart) {
150
149
  range.collapse(toStart);
151
150
  return getRangeTop(range);
152
151
  }
153
- /** Hidden-run classification needs the walk container; a bare text-node root has none. */
152
+ /** Deciding whether text is a hidden marker needs the walk container; a bare text-node root has none. */
154
153
  function containerOf(root) {
155
154
  return root instanceof HTMLElement ? root : null;
156
155
  }
@@ -1,28 +1,23 @@
1
1
  /**
2
- * Which atomic island's raw edge a point lands on: the NEAREST edge among the islands the caller
3
- * measures, so a run of flush islands answers the one the point is actually beside. A point inside
4
- * one reads its kind: a character-like island names the edge on the point's side, while an island
5
- * that selects whole declines and keeps its own click handling.
2
+ * Which atomic inline widget's raw edge a point lands on: the nearest edge among the widgets the
3
+ * caller measures. A point on a widget that behaves like a character names the edge on its side;
4
+ * one on a widget that selects whole declines, leaving that widget's own click handling.
6
5
  */
7
6
  export interface WidgetEdgeCandidate {
8
- /** The island's own raw source span; the caret seats at one end or the other. */
7
+ /** The widget's own raw source span; the caret goes at one end or the other. */
9
8
  start: number;
10
9
  end: number;
11
10
  rect: Pick<DOMRect, 'left' | 'right' | 'top' | 'bottom'>;
12
- /** The kind reads as one character, so a press ON it names an edge by side rather than
13
- * selecting the island whole. */
11
+ /** The kind behaves as one character, so a click on it names an edge by side rather than
12
+ * selecting the widget whole. */
14
13
  seatsInside: boolean;
15
14
  }
16
15
  export interface WidgetEdgeSeat {
17
16
  offset: number;
18
- /** The press landed ON the island: the engine answers such a point with a position in the
19
- * neighbouring text, so its own caret is no reason to stand this seat down. */
17
+ /** The click landed on the widget itself. The browser would put the caret in the text
18
+ * beside it, and that caret is no reason to drop this snap. */
20
19
  inside: boolean;
21
20
  }
22
- /**
23
- * The raw offset a point snaps to, in document order for ties. Null where the point snaps to none:
24
- * inside an island that selects whole, whose own click handling owns it, or with no island to
25
- * either side. A null `y` is a point with no line to compare against, so vertical distance drops
26
- * out and horizontal containment alone reads as inside.
27
- */
21
+ /** The raw offset a point snaps to, ties in document order. Null inside a widget that selects whole
22
+ * (its own click handling owns it) or with no widget; a null `y` compares columns alone. */
28
23
  export declare function nearestWidgetEdgeSeat(candidates: Iterable<WidgetEdgeCandidate>, x: number, y: number | null): WidgetEdgeSeat | null;