@voithos-labs/aragonite 0.10.3 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +12 -5
  3. package/dist/a11y-strings.js +61 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +13 -20
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +619 -1089
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +36 -67
  26. package/dist/components/SelectionOverlay.svelte.d.ts +6 -4
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +103 -100
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +35 -28
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +58 -32
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +144 -202
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +46 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +99 -144
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +3 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +9 -4
  102. package/dist/components/blocks/text/click-snap-guard.js +16 -5
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +164 -180
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -105
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +243 -208
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +13 -30
  144. package/dist/components/drag-handle.js +25 -63
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -31
  162. package/dist/components/editor-root-listeners.js +49 -46
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +26 -30
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +380 -0
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +14 -0
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +55 -68
  256. package/dist/core/inline/inline-widgets.js +55 -58
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +33 -17
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -7
  347. package/dist/cursor/height-oracle.js +26 -75
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +16 -8
  365. package/dist/cursor/scrollport.js +28 -5
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -13
  375. package/dist/cursor/visual-lines.js +72 -28
  376. package/dist/cursor/widget-edge-snap.d.ts +23 -0
  377. package/dist/cursor/widget-edge-snap.js +39 -0
  378. package/dist/cursor/widget-offset.d.ts +111 -102
  379. package/dist/cursor/widget-offset.js +352 -177
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +31 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +33 -52
  434. package/dist/editor-actions/focus/focus-landing.d.ts +11 -5
  435. package/dist/editor-actions/focus/focus-landing.js +29 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +55 -76
  465. package/dist/editor-actions/plugin/container.js +105 -186
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +91 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +38 -8
  550. package/dist/plugin.js +102 -74
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +113 -85
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -75
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +63 -47
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +18 -7
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +143 -292
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +79 -81
  695. package/dist/schema/commands.js +156 -116
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +9 -11
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +73 -78
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +93 -152
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +61 -104
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +53 -146
  807. package/dist/selection/dead-space-caret.d.ts +20 -28
  808. package/dist/selection/dead-space-caret.js +79 -87
  809. package/dist/selection/drag-pointer.d.ts +22 -5
  810. package/dist/selection/drag-pointer.js +63 -31
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -39
  816. package/dist/selection/keyboard-extend.js +94 -116
  817. package/dist/selection/multi-click.d.ts +37 -0
  818. package/dist/selection/multi-click.js +197 -0
  819. package/dist/selection/native-bridge.d.ts +30 -37
  820. package/dist/selection/native-bridge.js +80 -100
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +31 -14
  824. package/dist/selection/path-lookup.js +110 -20
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +9 -0
  828. package/dist/selection/pointer-gesture.js +11 -0
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -33
  832. package/dist/selection/primitives.js +61 -53
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -19
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +52 -0
  852. package/dist/selection/selection-drop.js +317 -0
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +75 -53
  864. package/dist/styles/editor.css +248 -139
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +19 -0
  960. package/dist/tree-operations/paste/replacement-parse.js +24 -0
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +329 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +267 -183
  996. package/docs/guide/plugin-guide.md +341 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +17 -21
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/invariants/split-landing.d.ts +0 -8
  1015. package/dist/invariants/split-landing.js +0 -15
  1016. package/dist/selection/double-click-trim.d.ts +0 -17
  1017. package/dist/selection/double-click-trim.js +0 -57
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -29
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -75
@@ -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,25 +1,37 @@
1
1
  /**
2
- * Whether the cursor sits on the first or last visual line of a wrapping element. Offsets
3
- * alone can't answer it past 2 wrapped lines, so cursor Y is compared to the first/last
4
- * line's Y. The text-node walk works around collapsed ranges next to non-text children
5
- * (dimmed marker spans) returning null rects — measuring around real text always works.
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.
6
5
  */
7
6
  /** The first rect that can position a caret: the leading client rect when it has real
8
7
  * height, else the bounding rect. `widthTolerant` also accepts a zero-height rect with width. */
9
8
  export declare function firstUsefulRect(range: Range, widthTolerant?: boolean): DOMRect | null;
10
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;
11
23
  /** Non-collapsed ranges reliably return rects where collapsed ones don't. */
12
24
  export declare function getCharRangeTop(container: Node, offset: number, atEnd: boolean): number | null;
13
25
  /** Skips non-text children (dimmed marker spans) that would otherwise leave the block's
14
26
  * first line unmeasurable, and hidden marker text, which measures to no rect at all. */
15
27
  export declare function findFirstTextNode(root: Node): Text | null;
16
28
  export declare function findLastTextNode(root: Node): Text | null;
17
- /**
18
- * True if the selection inside `el` sits on the first visual line; empty containers return true.
19
- * `fallbackOffset` (the snapped caret intent from `ambient-cursor.getRaw`) resolves the case
20
- * where there is no live range — Chromium drops the caret range next to atomic
21
- * contenteditable=false islands across event-loop yields. It is compared against the block's
22
- * first LANDABLE offset, which a leading hidden run moves off raw 0.
23
- */
24
- export declare function isAtFirstVisualLine(el: HTMLElement, fallbackOffset: number, contentStart: number): boolean;
25
- 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,14 +1,13 @@
1
1
  /**
2
- * Whether the cursor sits on the first or last visual line of a wrapping element. Offsets
3
- * alone can't answer it past 2 wrapped lines, so cursor Y is compared to the first/last
4
- * line's Y. The text-node walk works around collapsed ranges next to non-text children
5
- * (dimmed marker spans) returning null rects — measuring around real text always works.
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.
6
5
  */
7
6
  import { domDescendants } from './dom-walk';
8
7
  import { FALLBACK_LINE_HEIGHT } from './typography-estimates';
9
8
  import { isHiddenMarkerText } from './widget-offset';
10
- // Fraction of a line height within which the cursor Y counts as the boundary line —
11
- // 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.
12
11
  const SAME_LINE_TOLERANCE = 0.8;
13
12
  /** The first rect that can position a caret: the leading client rect when it has real
14
13
  * height, else the bounding rect. `widthTolerant` also accepts a zero-height rect with width. */
@@ -24,6 +23,22 @@ export function firstUsefulRect(range, widthTolerant = true) {
24
23
  export function getRangeTop(range) {
25
24
  return firstUsefulRect(range, false)?.top ?? null;
26
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
+ }
27
42
  /** Non-collapsed ranges reliably return rects where collapsed ones don't. */
28
43
  export function getCharRangeTop(container, offset, atEnd) {
29
44
  try {
@@ -51,16 +66,12 @@ export function findFirstTextNode(root) {
51
66
  export function findLastTextNode(root) {
52
67
  return measurableText(root, containerOf(root), true);
53
68
  }
54
- /**
55
- * True if the selection inside `el` sits on the first visual line; empty containers return true.
56
- * `fallbackOffset` (the snapped caret intent from `ambient-cursor.getRaw`) resolves the case
57
- * where there is no live range — Chromium drops the caret range next to atomic
58
- * contenteditable=false islands across event-loop yields. It is compared against the block's
59
- * first LANDABLE offset, which a leading hidden run moves off raw 0.
60
- */
61
- export function isAtFirstVisualLine(el, fallbackOffset, contentStart) {
62
- return isAtEdgeVisualLine(el, () => fallbackOffset <= contentStart, {
63
- 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,
74
+ toStart: true,
64
75
  boundaryTop: () => {
65
76
  const firstText = findFirstTextNode(el);
66
77
  const top = firstText ? getCharRangeTop(firstText, 0, false) : null;
@@ -68,9 +79,10 @@ export function isAtFirstVisualLine(el, fallbackOffset, contentStart) {
68
79
  }
69
80
  });
70
81
  }
71
- export function isAtLastVisualLine(el, fallbackOffset, contentEnd) {
72
- return isAtEdgeVisualLine(el, () => fallbackOffset >= contentEnd, {
73
- isEmpty: contentEnd === 0,
82
+ export function isAtLastVisualLine(el, fallbackOffset, bounds) {
83
+ return isAtEdgeVisualLine(el, () => fallbackOffset >= bounds.end, {
84
+ isEmpty: bounds.start === bounds.end,
85
+ toStart: false,
74
86
  boundaryTop: () => {
75
87
  const lastText = findLastTextNode(el);
76
88
  const top = lastText ? getCharRangeTop(lastText, lastText.textContent.length, true) : null;
@@ -79,8 +91,7 @@ export function isAtLastVisualLine(el, fallbackOffset, contentEnd) {
79
91
  });
80
92
  }
81
93
  // ── Internal ────────────────────────────────────────────────────────────────
82
- /** The shared skeleton of the two edge predicates: `fallback` answers where geometry cannot — a
83
- * dropped range, an unmeasurable collapsed caret, an unmeasurable boundary line — and
94
+ /** The shared skeleton of the two edge predicates: `fallback` answers where geometry cannot, and
84
95
  * `boundaryTop` measures the edge line each side's own way. */
85
96
  function isAtEdgeVisualLine(el, fallback, edge) {
86
97
  const sel = window.getSelection();
@@ -89,23 +100,56 @@ function isAtEdgeVisualLine(el, fallback, edge) {
89
100
  if (edge.isEmpty)
90
101
  return true;
91
102
  const cursorRange = sel.getRangeAt(0);
103
+ const tolerance = sameLineTolerance(el);
92
104
  const cursorTop = getRangeTop(cursorRange);
93
- if (cursorTop === null)
94
- return cursorRange.collapsed ? fallback() : true;
105
+ if (cursorTop === null) {
106
+ if (!cursorRange.collapsed)
107
+ return true;
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);
112
+ if (!band || !contents)
113
+ return fallback();
114
+ return edge.toStart
115
+ ? band.top < contents.top + tolerance
116
+ : band.bottom > contents.bottom - tolerance;
117
+ }
95
118
  const edgeTop = edge.boundaryTop();
96
119
  if (edgeTop === null)
97
120
  return fallback();
98
- const lineHeight = parseFloat(getComputedStyle(el).lineHeight) || FALLBACK_LINE_HEIGHT;
99
- return Math.abs(cursorTop - edgeTop) < lineHeight * SAME_LINE_TOLERANCE;
121
+ return Math.abs(cursorTop - edgeTop) < tolerance;
100
122
  }
101
- /** The boundary line's collapsed-contents fallback measurement. */
102
- function collapsedContentsTop(el, toStart) {
123
+ function nodeCaretRect(node, fromEnd) {
124
+ if (!node)
125
+ return null;
126
+ const range = document.createRange();
127
+ range.selectNode(node);
128
+ // A node that wraps has one rect per line, and the caret touches the line on its own side.
129
+ const rects = range.getClientRects();
130
+ const rect = rects.length === 0 ? range.getBoundingClientRect() : rects[fromEnd ? rects.length - 1 : 0];
131
+ return caretRectOf(rect, fromEnd);
132
+ }
133
+ function contentsRange(el) {
103
134
  const range = document.createRange();
104
135
  range.selectNodeContents(el);
136
+ return range;
137
+ }
138
+ function contentsRect(el) {
139
+ return caretRectOf(contentsRange(el).getBoundingClientRect(), false);
140
+ }
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 };
145
+ }
146
+ /** The boundary line's collapsed-contents fallback measurement. */
147
+ function collapsedContentsTop(el, toStart) {
148
+ const range = contentsRange(el);
105
149
  range.collapse(toStart);
106
150
  return getRangeTop(range);
107
151
  }
108
- /** 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. */
109
153
  function containerOf(root) {
110
154
  return root instanceof HTMLElement ? root : null;
111
155
  }
@@ -0,0 +1,23 @@
1
+ /**
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.
5
+ */
6
+ export interface WidgetEdgeCandidate {
7
+ /** The widget's own raw source span; the caret goes at one end or the other. */
8
+ start: number;
9
+ end: number;
10
+ rect: Pick<DOMRect, 'left' | 'right' | 'top' | 'bottom'>;
11
+ /** The kind behaves as one character, so a click on it names an edge by side rather than
12
+ * selecting the widget whole. */
13
+ seatsInside: boolean;
14
+ }
15
+ export interface WidgetEdgeSeat {
16
+ offset: number;
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. */
19
+ inside: boolean;
20
+ }
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. */
23
+ export declare function nearestWidgetEdgeSeat(candidates: Iterable<WidgetEdgeCandidate>, x: number, y: number | null): WidgetEdgeSeat | null;
@@ -0,0 +1,39 @@
1
+ /**
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.
5
+ */
6
+ /** The raw offset a point snaps to, ties in document order. Null inside a widget that selects whole
7
+ * (its own click handling owns it) or with no widget; a null `y` compares columns alone. */
8
+ export function nearestWidgetEdgeSeat(candidates, x, y) {
9
+ let best = null;
10
+ for (const { start, end, rect, seatsInside } of candidates) {
11
+ const withinRow = y === null || (rect.top < y && y < rect.bottom);
12
+ if (rect.left < x && x < rect.right && withinRow) {
13
+ if (!seatsInside)
14
+ return null;
15
+ return { offset: x < (rect.left + rect.right) / 2 ? start : end, inside: true };
16
+ }
17
+ // Compare rows before columns: a point past the end of one line must not reach a widget
18
+ // on another line that happens to sit at the same x.
19
+ const rowGap = y === null ? 0 : Math.max(rect.top - y, y - rect.bottom, 0);
20
+ if (x <= rect.left)
21
+ best = nearer(best, { offset: start, rowGap, gap: rect.left - x });
22
+ if (x >= rect.right)
23
+ best = nearer(best, { offset: end, rowGap, gap: x - rect.right });
24
+ // A point above or below the widget, inside its columns: no horizontal distance to cover,
25
+ // so the side it falls on names the edge, as it does for a point on the widget itself.
26
+ if (rect.left < x && x < rect.right) {
27
+ const offset = x < (rect.left + rect.right) / 2 ? start : end;
28
+ best = nearer(best, { offset, rowGap, gap: 0 });
29
+ }
30
+ }
31
+ return best === null ? null : { offset: best.offset, inside: false };
32
+ }
33
+ function nearer(held, next) {
34
+ if (!held)
35
+ return next;
36
+ if (next.rowGap !== held.rowGap)
37
+ return next.rowGap < held.rowGap ? next : held;
38
+ return next.gap < held.gap ? next : held;
39
+ }