@voithos-labs/aragonite 0.10.3 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +12 -5
  3. package/dist/a11y-strings.js +61 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +13 -20
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +619 -1089
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +36 -67
  26. package/dist/components/SelectionOverlay.svelte.d.ts +6 -4
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +103 -100
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +35 -28
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +58 -32
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +144 -202
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +46 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +99 -144
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +3 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +9 -4
  102. package/dist/components/blocks/text/click-snap-guard.js +16 -5
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +164 -180
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -105
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +243 -208
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +13 -30
  144. package/dist/components/drag-handle.js +25 -63
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -31
  162. package/dist/components/editor-root-listeners.js +49 -46
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +26 -30
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +380 -0
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +14 -0
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +55 -68
  256. package/dist/core/inline/inline-widgets.js +55 -58
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +33 -17
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -7
  347. package/dist/cursor/height-oracle.js +26 -75
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +16 -8
  365. package/dist/cursor/scrollport.js +28 -5
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -13
  375. package/dist/cursor/visual-lines.js +72 -28
  376. package/dist/cursor/widget-edge-snap.d.ts +23 -0
  377. package/dist/cursor/widget-edge-snap.js +39 -0
  378. package/dist/cursor/widget-offset.d.ts +111 -102
  379. package/dist/cursor/widget-offset.js +352 -177
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +31 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +33 -52
  434. package/dist/editor-actions/focus/focus-landing.d.ts +11 -5
  435. package/dist/editor-actions/focus/focus-landing.js +29 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +55 -76
  465. package/dist/editor-actions/plugin/container.js +105 -186
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +91 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +38 -8
  550. package/dist/plugin.js +102 -74
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +113 -85
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -75
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +63 -47
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +18 -7
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +143 -292
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +79 -81
  695. package/dist/schema/commands.js +156 -116
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +9 -11
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +73 -78
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +93 -152
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +61 -104
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +53 -146
  807. package/dist/selection/dead-space-caret.d.ts +20 -28
  808. package/dist/selection/dead-space-caret.js +79 -87
  809. package/dist/selection/drag-pointer.d.ts +22 -5
  810. package/dist/selection/drag-pointer.js +63 -31
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -39
  816. package/dist/selection/keyboard-extend.js +94 -116
  817. package/dist/selection/multi-click.d.ts +37 -0
  818. package/dist/selection/multi-click.js +197 -0
  819. package/dist/selection/native-bridge.d.ts +30 -37
  820. package/dist/selection/native-bridge.js +80 -100
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +31 -14
  824. package/dist/selection/path-lookup.js +110 -20
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +9 -0
  828. package/dist/selection/pointer-gesture.js +11 -0
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -33
  832. package/dist/selection/primitives.js +61 -53
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -19
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +52 -0
  852. package/dist/selection/selection-drop.js +317 -0
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +75 -53
  864. package/dist/styles/editor.css +248 -139
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +19 -0
  960. package/dist/tree-operations/paste/replacement-parse.js +24 -0
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +329 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +267 -183
  996. package/docs/guide/plugin-guide.md +341 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +17 -21
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/invariants/split-landing.d.ts +0 -8
  1015. package/dist/invariants/split-landing.js +0 -15
  1016. package/dist/selection/double-click-trim.d.ts +0 -17
  1017. package/dist/selection/double-click-trim.js +0 -57
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -29
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -75
@@ -1,27 +1,40 @@
1
1
  /**
2
- * Inline-widget interaction for TextEditableBlock: the offset math and the handler
3
- * bodies that branch off keydown/click. Each keydown sub-handler returns whether it
4
- * consumed the event, so the component can interleave them with the shared pipeline.
2
+ * Inline-widget interaction for the prose editable elements (the text block and the table cell):
3
+ * selecting a widget, showing its source, and the keydown and click handlers around both. Each
4
+ * keydown handler returns whether it consumed the event, so the component can interleave them
5
+ * with the shared pipeline.
5
6
  */
6
7
  import { tick } from 'svelte';
7
8
  import { resolvedInlineContent } from '../../../core/inline/inline-cache';
8
- import { flattenInlineWidgets, getInlineWidgetEditing, isWidgetActivationClick } from '../../../core/inline/inline-widgets';
9
+ import { flattenInlineWidgets, getInlineWidgetEditing, isCharacterLikeWidget, isWidgetActivationClick } from '../../../core/inline/inline-widgets';
9
10
  import { isVerticallyTransparentNode } from '../../../core/inline/transparency';
10
11
  import { trimTrailingLineEnding, trailingLineEnding } from '../../../core/lines';
11
- import { asRawOffset, toClampedRawOffset, toDomTextOffset } from '../../../cursor/coordinate-spaces';
12
- import { domTextOffsetAtNode, createRangeAtDomTextOffsets, selectionFocusWalkOffset } from '../../../cursor/widget-offset';
12
+ import { asRawOffset } from '../../../cursor/coordinate-spaces';
13
+ import { extendSelectionToRaw as extendSelectionToRawIn, rawOffsetAt, rawSelectionFocus, selectRawRange } from '../../../cursor/widget-offset';
13
14
  import { createSourceReveal } from '../../../cursor/reveal-source';
15
+ import { nearestWidgetEdgeSeat } from '../../../cursor/widget-edge-snap';
14
16
  import { traceRevealOpen, traceRevealFold } from '../../../debug/interaction-trace';
15
17
  import { assertInvariant } from '../../../assert';
16
- import { caretIsInTextContent, hasModifier, isPlainTypingKey } from './click-snap-guard';
18
+ import { caretIsInTextContent, hasModifier, isPlainTypingKey, surfaceHoldsRange } from './click-snap-guard';
17
19
  import { findWidgetNodeByStart, findFirstEdgeWidget, findLastEdgeWidget, rawHasNoTextBefore, rawHasNoTextAfter, widgetElByStart } from './widget-adjacency';
18
- /**
19
- * The inline-code wash over a revealed source, painted through the CSS Custom Highlight API
20
- * (`::highlight(md-inline-reveal)` in editor.css) rather than a wrapper span: the reveal's
21
- * contract, and every offset read on it, is that the source is a bare text node in the block.
22
- * The range selects the NODE, so it keeps covering the text as typing grows it. Absent the API
23
- * (jsdom, an old engine) the source simply shows unwashed.
24
- */
20
+ import { replaceRangeInLeaf } from '../../../tree-operations/leaf-range';
21
+ /** The widget edge a selected widget hands a caret-moving key off from, or null for any other key. */
22
+ function caretMoveEdge(key) {
23
+ switch (key) {
24
+ case 'ArrowUp':
25
+ case 'Home':
26
+ case 'PageUp':
27
+ return 'start';
28
+ case 'ArrowDown':
29
+ case 'End':
30
+ case 'PageDown':
31
+ return 'end';
32
+ default:
33
+ return null;
34
+ }
35
+ }
36
+ /** The shown source is tinted with the CSS Custom Highlight API because offset reads need it to
37
+ * stay a bare text node. Without the API (jsdom, an old browser) it shows untinted. */
25
38
  const REVEAL_HIGHLIGHT = 'md-inline-reveal';
26
39
  const washRanges = new WeakMap();
27
40
  function revealHighlight() {
@@ -51,35 +64,43 @@ function unwashRevealedSource(node) {
51
64
  washRanges.delete(node);
52
65
  revealHighlight()?.delete(range);
53
66
  }
67
+ /** Replace a selected widget's bytes with `text` in one undoable write and put the caret after
68
+ * `text`, since with the widget gone the browser has no caret to keep. */
69
+ export async function replaceSelectedWidget(deps, widget, preSelectOffset, text, mode) {
70
+ const edit = replaceRangeInLeaf(deps.node, widget, text, deps.storedAs());
71
+ const write = deps.blockEdit.updateBlockContent(deps.index, edit.raw, mode, preSelectOffset, edit.caret);
72
+ // Before the write's render, so the caret and the new bytes land in one flush.
73
+ if (write.admitted)
74
+ deps.setPendingCursor(write.caret);
75
+ deps.widgetSelection.clear();
76
+ await write;
77
+ // The render that places the caret, so a caller awaiting the insert finds the caret there.
78
+ await tick();
79
+ }
54
80
  export function createWidgetInteraction(deps) {
55
- const isReading = () => deps.getPresentationMode?.() === 'reading';
81
+ const isReading = () => deps.reading.mode() === 'reading';
56
82
  // Resolver-aware so widget detection matches the render path's view; a mismatch
57
83
  // around reference-style image widgets breaks cursor and clipboard offsets.
58
84
  function inlinesOf(node) {
59
- return resolvedInlineContent(node, deps.linkRef);
60
- }
61
- /**
62
- * Every widget in this block, DESCENDING into non-widget parents. The flat inline list is
63
- * the wrong shape to scan for widgets: a construct wrapping one — emphasis around a math
64
- * span, a link around an image — hides it, and every pointer and arrow-key path that
65
- * scanned the flat list simply did not see it. `> *… $L/9 \times 10^{20}$ …*` is the case
66
- * that surfaced it: the quote's whole text is one emphasis node, so nothing inside it was
67
- * ever clickable.
68
- */
85
+ return resolvedInlineContent(node, deps.reading);
86
+ }
87
+ const widgetEditing = (kind) => getInlineWidgetEditing(kind, deps.reading.grammar);
88
+ const characterLike = (kind) => isCharacterLikeWidget(kind, deps.reading.grammar);
89
+ /** Every widget in this block, nested ones included: a construct wrapping a widget (emphasis
90
+ * around a formula, a link around an image) hides it from the top-level inline list. */
69
91
  function widgetsOf() {
70
- return flattenInlineWidgets(inlinesOf(deps.node), deps.node.raw);
92
+ return flattenInlineWidgets(inlinesOf(deps.node), deps.node.raw, deps.reading.grammar);
71
93
  }
72
94
  let revealState = null;
73
- // Outside the record because they must survive `resetReveal` for the kernel's async
74
- // restore. Identity is load-bearing: two byte-identical widgets share a reuse-pool key,
75
- // so a lookup can return the OTHER instance and `replaceWith` would MOVE it.
95
+ // Kept outside the record to survive `resetReveal` for the async restore. The exact element
96
+ // is kept because two byte-identical widgets share a pool key, so a lookup could return the other.
76
97
  let activeSourceNode = null;
77
98
  let revealedWidget = null;
78
- // The offset the last fold parked, which lies inside the construct it just folded: the
79
- // restore must not read it as a formula closing around the caret and reopen the reveal.
99
+ // The offset left behind when a source was last hidden, which lies inside that construct:
100
+ // the restore must not read it as a formula closing around the caret and show it again.
80
101
  let foldParkedCaret = null;
81
- // Every fold entry is module-private and pre-guarded by all of its callers, so a fold
82
- // with no active reveal means a new caller skipped the guard or a flag leaked (G1.26).
102
+ // Every way of hiding a source is private to this module and checked by all its callers,
103
+ // so hiding with none shown means a caller skipped the check or a flag leaked (G1.26).
83
104
  function assertFoldTargetsActiveReveal(entry) {
84
105
  assertInvariant('reveal-transition', () => revealState
85
106
  ? null
@@ -93,19 +114,18 @@ export function createWidgetInteraction(deps) {
93
114
  activeSourceNode = null;
94
115
  revealedWidget = null;
95
116
  }
96
- // The one canonical teardown. Widget restoration is a SEPARATE step, so the swap
97
- // handles are left untouched: cancel resets the record before awaiting the kernel
98
- // restore that still needs them.
117
+ // The swap handles are left alone: cancel resets the record before awaiting the restore,
118
+ // which still needs them.
99
119
  function resetReveal() {
100
120
  revealState = null;
101
121
  deps.setRevealing(false);
102
122
  }
103
123
  async function startReveal(widget, caretBefore, atSourceOffset = 0) {
104
- // Every reveal entry converges here, so this is the one reading-mode gate needed.
124
+ // Every way in comes through here, so this is the only reading-mode check needed.
105
125
  if (isReading())
106
126
  return;
107
- // The settle window spans only microtasks plus the synchronous focus dispatch, so
108
- // no user gesture lands inside it — a re-entry is a call from the chain itself (G1.26).
127
+ // The wait for the caret spans only microtasks and the synchronous focus dispatch, so a
128
+ // re-entry can only come from this call chain itself (G1.26).
109
129
  assertInvariant('reveal-transition', () => revealState?.settling
110
130
  ? {
111
131
  code: 'start-during-settle',
@@ -118,7 +138,7 @@ export function createWidgetInteraction(deps) {
118
138
  const start = widget.start;
119
139
  const end = widget.end;
120
140
  const source = deps.node.raw.slice(start, end);
121
- // The imperative span-swap IS the mechanism: the opaque island becomes a text node.
141
+ // Swapping the span is the whole mechanism: the opaque widget becomes a text node.
122
142
  const kernel = createSourceReveal({
123
143
  get container() {
124
144
  return deps.getEl();
@@ -132,7 +152,6 @@ export function createWidgetInteraction(deps) {
132
152
  get source() {
133
153
  return source;
134
154
  },
135
- getAmbientLength: deps.getAmbientLength,
136
155
  isRevealed: () => activeSourceNode !== null,
137
156
  showSource: () => {
138
157
  const container = deps.getEl();
@@ -163,15 +182,14 @@ export function createWidgetInteraction(deps) {
163
182
  await kernel.reveal(atSourceOffset);
164
183
  }
165
184
  finally {
166
- // `finally`, not a plain clear: a wedged-true flag would disable the escape fold
167
- // for the rest of the block's life. Guarded — a fold mid-await already nulled it.
185
+ // `finally`, not a plain clear: a flag stuck true would disable the escape check for
186
+ // the rest of the block's life. Null-checked, since hiding mid-await already cleared it.
168
187
  if (revealState)
169
188
  revealState.settling = false;
170
189
  }
171
190
  }
172
- // Persist the ephemeral source edit, or fold back untouched. The caret lands on the
173
- // source node's LIVE trailing edge, so a concurrent prose edit shifts it correctly.
174
- // ALWAYS folds: a null read as "nothing to wait for" would let a seam splice stale bytes.
191
+ // Always hides, even with nothing to write: a null read as "nothing to wait for" would let a
192
+ // caller splice stale bytes. The caret lands on the source node's current trailing edge.
175
193
  function commitReveal(reason = 'commit', caretOverride) {
176
194
  assertFoldTargetsActiveReveal('commitReveal');
177
195
  if (!revealState)
@@ -184,43 +202,42 @@ export function createWidgetInteraction(deps) {
184
202
  const sourceNode = activeSourceNode;
185
203
  const editedDisplay = deps.readRawText();
186
204
  const caretAfter = caretOverride ??
187
- (el && sourceNode
188
- ? toClampedRawOffset(domTextOffsetAtNode(el, sourceNode, sourceNode.length), deps.getAmbientLength())
189
- : active.widgetEnd);
205
+ (el && sourceNode ? rawOffsetAt(el, sourceNode, sourceNode.length) : active.widgetEnd);
190
206
  const { caretBefore, originalDisplay } = active;
191
- // The reactive re-render rebuilds the island, so drop the swap handles without a
192
- // DOM restore, then run the canonical teardown.
207
+ // The reactive re-render rebuilds the widget, so drop the swap handles without
208
+ // restoring the DOM, then run the teardown.
193
209
  if (sourceNode)
194
210
  unwashRevealedSource(sourceNode);
195
211
  activeSourceNode = null;
196
212
  revealedWidget = null;
197
213
  resetReveal();
198
- foldParkedCaret = caretAfter;
199
- // No edit: fold without touching the CST. A zero-diff write still pushes a dead
200
- // undo entry, so the user's next Ctrl+Z would revert nothing instead of their
201
- // prior action. The pending-cursor set alone re-renders from the untouched CST.
214
+ // No edit, so no write: a write that changes nothing still pushes an undo entry, and the
215
+ // next Ctrl+Z would spend itself on nothing.
202
216
  if (editedDisplay === originalDisplay) {
217
+ foldParkedCaret = caretAfter;
203
218
  deps.setPendingCursor(caretAfter);
204
219
  return { caret: caretAfter, settled: tick() };
205
220
  }
206
- const write = deps.blockEdit.updateBlockContent(deps.index, editedDisplay + trailingLineEnding(deps.node.raw), caretBefore, caretAfter);
207
- deps.setPendingCursor(caretAfter, editedDisplay);
208
- return { caret: caretAfter, settled: settleWrite(write) };
209
- }
210
- // "Settled" for every fold caller: the write landed AND the render it forced flushed.
211
- // A rejection is absorbed — the commit ceremony rethrows only in DEV, so forwarding
212
- // would let a DEV-only throw cancel the gesture the seam is holding open.
221
+ const write = deps.blockEdit.updateBlockContent(deps.index, editedDisplay + trailingLineEnding(deps.node.raw, deps.getLineEnding()), 'authored', caretBefore, caretAfter);
222
+ // A refused write leaves the bytes as the reveal found them, where the caret began.
223
+ const caret = write.admitted ? write.caret : caretBefore;
224
+ foldParkedCaret = caret;
225
+ deps.setPendingCursor(caret);
226
+ return { caret, settled: settleWrite(write) };
227
+ }
228
+ // A rejection is swallowed: the commit rethrows only in dev builds, and a dev-only throw must
229
+ // not cancel the gesture in progress.
213
230
  async function settleWrite(write) {
214
231
  try {
215
232
  await write;
216
233
  }
217
234
  catch {
218
- // reported at the commit seam
235
+ // reported where the commit happens
219
236
  }
220
237
  await tick();
221
238
  }
222
- // Discard the ephemeral edit and rebuild the original widget from the untouched raw:
223
- // a CST-free view toggle, so no undo entry.
239
+ // Discard the temporary edit and rebuild the original widget from the untouched raw:
240
+ // a change of view only, so no undo entry.
224
241
  async function cancelReveal() {
225
242
  assertFoldTargetsActiveReveal('cancelReveal');
226
243
  if (!revealState)
@@ -228,25 +245,46 @@ export function createWidgetInteraction(deps) {
228
245
  const active = revealState;
229
246
  traceRevealFold('cancel');
230
247
  const { kernel } = active;
231
- // Reset BEFORE the await so the record reads idle across the kernel's restore:
232
- // `replaceWith` fires selectionchange, and a live record would let the escape-fold
233
- // re-enter mid-swap. The restore reads the swap handles kept outside the record.
248
+ // Reset before the await: `replaceWith` fires `selectionchange`, and a live record would
249
+ // let the escape check re-enter mid-swap.
234
250
  resetReveal();
235
251
  await kernel.commit();
236
252
  }
237
- // Click-away fold for an UNEDITED reveal: no caret is written, because the escaping
238
- // click owns the caret and the commit path's trailing-edge landing would hijack it.
253
+ // No caret is written, because the click that left owns it. A selected range is read in raw
254
+ // offsets and put back after the rebuild, which would otherwise leave its end inside a widget.
239
255
  function foldRevealNoEdit(reason = 'no-edit') {
240
256
  assertFoldTargetsActiveReveal('foldRevealNoEdit');
241
257
  if (!revealState)
242
258
  return;
243
259
  traceRevealFold(reason);
260
+ const span = liveRangeInBlock();
244
261
  resetReveal();
245
262
  restoreRenderedWidget();
263
+ if (span)
264
+ void restoreRangeInBlock(span);
246
265
  }
247
- // Containment is decided by RAW OFFSET through the canonical walk, boundary-inclusive:
248
- // a caret at the source's edge may anchor in the ADJACENT text node, the browser's
249
- // choice, and node identity would misread that as an escape.
266
+ /** The live selection in raw offsets, when it is a range with both ends inside this block. */
267
+ function liveRangeInBlock() {
268
+ const el = deps.getEl();
269
+ const sel = window.getSelection();
270
+ if (!el || !sel || sel.rangeCount === 0 || sel.isCollapsed)
271
+ return null;
272
+ const range = sel.getRangeAt(0);
273
+ if (!el.contains(range.startContainer) || !el.contains(range.endContainer))
274
+ return null;
275
+ return {
276
+ start: rawOffsetAt(el, range.startContainer, range.startOffset),
277
+ end: rawOffsetAt(el, range.endContainer, range.endOffset)
278
+ };
279
+ }
280
+ async function restoreRangeInBlock(span) {
281
+ await tick();
282
+ const el = deps.getEl();
283
+ if (el)
284
+ selectRawRange(el, span.start, span.end);
285
+ }
286
+ // Compared by raw offset, bounds included: a caret at the source's edge may sit in the
287
+ // neighbouring text node, which a node comparison would misread as leaving.
250
288
  function selectionEscapedSource() {
251
289
  if (!revealState || !activeSourceNode || revealState.settling)
252
290
  return false;
@@ -263,17 +301,15 @@ export function createWidgetInteraction(deps) {
263
301
  return false;
264
302
  if (activeSourceNode.contains(anchorNode) || activeSourceNode.contains(focusNode))
265
303
  return false;
266
- const ambient = deps.getAmbientLength();
267
- const sourceStart = toClampedRawOffset(domTextOffsetAtNode(el, activeSourceNode, 0), ambient);
304
+ const sourceStart = rawOffsetAt(el, activeSourceNode, 0);
268
305
  const sourceEnd = sourceStart + activeSourceNode.length;
269
- const anchorOff = toClampedRawOffset(domTextOffsetAtNode(el, anchorNode, sel.anchorOffset), ambient);
270
- const focusOff = toClampedRawOffset(domTextOffsetAtNode(el, focusNode, sel.focusOffset), ambient);
306
+ const anchorOff = rawOffsetAt(el, anchorNode, sel.anchorOffset);
307
+ const focusOff = rawOffsetAt(el, focusNode, sel.focusOffset);
271
308
  const inSource = (o) => o >= sourceStart && o <= sourceEnd;
272
309
  return !inSource(anchorOff) && !inSource(focusOff);
273
310
  }
274
- // An escape must SURVIVE A TICK to fold: cross-block entry clears the native selection
275
- // before its flag flips, manufacturing a transient escape-shaped state that re-verifying
276
- // rejects. The latch survives the very exit it triggers, so `resetReveal` never clears it.
311
+ // The escape is re-checked after a tick: entering a cross-block selection clears the browser
312
+ // selection before its flag is set. `resetReveal` leaves `foldCheckQueued`, which outlives it.
277
313
  let foldCheckQueued = false;
278
314
  function foldRevealIfSelectionEscaped() {
279
315
  if (foldCheckQueued || !selectionEscapedSource())
@@ -296,52 +332,48 @@ export function createWidgetInteraction(deps) {
296
332
  commitReveal('selection-escape');
297
333
  })();
298
334
  }
299
- // The ONE hit test the pointerdown probe, the click dispatch, and the post-fold
300
- // re-resolve share.
301
- /**
302
- * What the pointer is actually over, asked of the DOM rather than of a rectangle. An
303
- * island's border box is not what the reader sees: a KaTeX render (a superscript, a
304
- * fraction) paints ABOVE and BELOW its own box, so a click on the visible glyphs missed
305
- * the rect by a pixel or two and the widget looked inert to the mouse while the keyboard
306
- * reached it fine. `elementFromPoint` has no such gap — it answers with whatever is
307
- * painted at the point, overflow included.
308
- */
335
+ /** The widget under the pointer, asked of the DOM rather than of a rectangle: a KaTeX render
336
+ * draws past its own border box, and `elementFromPoint` counts that overflow. */
309
337
  function revealWidgetFromDom(el, x, y) {
310
- // Feature-detected: jsdom implements no hit testing, and the rect scan below is the
311
- // answer there — the same shape as `getTargetRanges`' detection on the code surface.
338
+ // jsdom has no hit testing; the rectangle scan in `hitTestRevealWidget` answers there.
312
339
  if (typeof document.elementFromPoint !== 'function')
313
340
  return null;
314
341
  const at = document.elementFromPoint(x, y);
315
342
  const island = at instanceof Element ? at.closest('[data-inline-widget][data-source-start]') : null;
316
- // Containment guard: the point may sit over another block's widget entirely.
343
+ // The point may sit over another block's widget entirely.
317
344
  if (!island || !el.contains(island))
318
345
  return null;
319
346
  const start = Number(island.getAttribute('data-source-start'));
320
347
  if (!Number.isInteger(start))
321
348
  return null;
322
- const inline = widgetsOf().find((n) => n.start === start && getInlineWidgetEditing(n.kind)?.revealSource);
349
+ const inline = widgetsOf().find((n) => n.start === start && widgetEditing(n.kind)?.revealSource);
323
350
  return inline ? { inline } : null;
324
351
  }
325
- /**
326
- * The caret a click on a rendered widget wants: the END of the content a kind names, INSIDE
327
- * its delimiters, so typing continues the construct rather than escaping it. A kind naming no
328
- * span keeps the leading edge: guessing an end from its parsed text put a footnote's caret
329
- * past its bracket.
330
- */
352
+ /** Where a click on a widget puts the caret when the kind maps no point: the end of its content
353
+ * span, inside the delimiters, so typing continues the construct. No span keeps the leading edge. */
331
354
  function insideEndOffset(inline) {
332
355
  const source = deps.node.raw.slice(inline.start, inline.end);
333
- const span = getInlineWidgetEditing(inline.kind)?.revealContentSpan?.(source);
356
+ const span = widgetEditing(inline.kind)?.revealContentSpan?.(source);
334
357
  return span && span.end >= 0 && span.end <= source.length ? span.end : 0;
335
358
  }
359
+ /** The offset a click names inside a widget's source. Read against the layout from before
360
+ * any source was hidden: hiding one reflows the line, and the point then means nothing. */
361
+ function seatFromPoint(el, inline, x, y) {
362
+ const widget = widgetElByStart(el, inline.start);
363
+ const atPoint = widgetEditing(inline.kind)?.revealOffsetAtPoint;
364
+ if (!widget || !atPoint)
365
+ return null;
366
+ const source = deps.node.raw.slice(inline.start, inline.end);
367
+ const seat = atPoint(widget, source, x, y);
368
+ return seat === null ? null : Math.max(0, Math.min(seat, source.length));
369
+ }
336
370
  function hitTestRevealWidget(el, x, y) {
337
371
  const painted = revealWidgetFromDom(el, x, y);
338
372
  if (painted)
339
373
  return painted;
340
- // Fallback for a point the DOM cannot answer for (a synthetic call with no element
341
- // under it): the original box test, which still covers a widget that paints inside
342
- // its own bounds.
374
+ // The box test, for a point the DOM cannot answer, such as a synthetic call.
343
375
  for (const inline of widgetsOf()) {
344
- if (!getInlineWidgetEditing(inline.kind)?.revealSource)
376
+ if (!widgetEditing(inline.kind)?.revealSource)
345
377
  continue;
346
378
  const widget = widgetElByStart(el, inline.start);
347
379
  if (!widget)
@@ -357,12 +389,18 @@ export function createWidgetInteraction(deps) {
357
389
  const el = deps.getEl();
358
390
  return el !== null && hitTestRevealWidget(el, x, y) !== null;
359
391
  }
360
- // The whole-token select belongs to the double-click that OPENED a reveal, and nothing in
361
- // the second click's own shape tells it apart from a later one inside the same source.
392
+ function islandDragAnchor(x, y) {
393
+ const el = deps.getEl();
394
+ if (!el)
395
+ return null;
396
+ const seat = nearestWidgetEdgeSeat(measuredWidgets(el, dragsFromIsland), x, y);
397
+ return seat?.inside ? seat.offset : null;
398
+ }
399
+ // Selecting the whole token belongs to the double-click that opened the source, and nothing
400
+ // in the second click's own shape tells it apart from a later one inside that source.
362
401
  let revealOpenedByLastClick = false;
363
- // Order is the whole point: resolve the target BEFORE folding, because the fold shifts
364
- // layout and the click point only means something against pre-fold geometry, then
365
- // re-locate by OFFSET, because an edited commit shifts raw positions by its delta.
402
+ // The target is resolved before hiding the current source, which reflows the line the click was
403
+ // read against, then found again by offset, since a committed edit shifts raw positions.
366
404
  async function revealFromClick(clickX, clickY) {
367
405
  const el = deps.getEl();
368
406
  if (!el)
@@ -370,12 +408,11 @@ export function createWidgetInteraction(deps) {
370
408
  const hit = hitTestRevealWidget(el, clickX, clickY);
371
409
  if (!hit)
372
410
  return;
411
+ const seat = seatFromPoint(el, hit.inline, clickX, clickY);
373
412
  let targetStart = hit.inline.start;
374
413
  if (revealState) {
375
414
  const active = revealState;
376
- const revealedStart = activeSourceNode === null
377
- ? Number.POSITIVE_INFINITY
378
- : toClampedRawOffset(domTextOffsetAtNode(el, activeSourceNode, 0), deps.getAmbientLength());
415
+ const revealedStart = activeSourceNode === null ? Number.POSITIVE_INFINITY : rawOffsetAt(el, activeSourceNode, 0);
379
416
  const rawBefore = deps.node.raw.length;
380
417
  if (deps.readRawText() === active.originalDisplay) {
381
418
  foldRevealNoEdit();
@@ -386,20 +423,15 @@ export function createWidgetInteraction(deps) {
386
423
  targetStart += deps.node.raw.length - rawBefore;
387
424
  }
388
425
  }
389
- const target = widgetsOf().find((n) => n.start === targetStart && getInlineWidgetEditing(n.kind)?.revealSource);
426
+ const target = widgetsOf().find((n) => n.start === targetStart && widgetEditing(n.kind)?.revealSource);
390
427
  if (!target)
391
428
  return;
392
429
  el.focus();
393
430
  revealOpenedByLastClick = true;
394
- // A click can't map to a source glyph, so it lands at the end of the content rather
395
- // than guessing: the caret sits inside the delimiters, ready to type.
396
- void startReveal(target, target.start, insideEndOffset(target));
397
- }
398
- /**
399
- * Take the whole revealed token; declines unless the double-click landed on it. Keyed off the
400
- * point, not the selection: the root's second-press word select runs before this click and
401
- * may have moved the selection off the source.
402
- */
431
+ void startReveal(target, target.start, seat ?? insideEndOffset(target));
432
+ }
433
+ /** Select the whole shown token if the double-click landed on it. Decided from the point: the
434
+ * editor root's word-select runs first and may have moved the selection off the source. */
403
435
  function selectRevealedSource(x, y) {
404
436
  const source = activeSourceNode;
405
437
  if (!revealState || !source || y === null)
@@ -417,9 +449,8 @@ export function createWidgetInteraction(deps) {
417
449
  function isRevealing() {
418
450
  return revealState !== null;
419
451
  }
420
- // Escape is the only key the reveal claims. Enter deliberately isn't: it is the block's
421
- // split command everywhere else, and the command seam folds the reveal before it
422
- // mutates, so one Enter both commits the edit and splits.
452
+ // Enter is left to the block's split command, which hides the source before it writes, so one
453
+ // Enter both commits the edit and splits.
423
454
  async function handleRevealingKeydown(e) {
424
455
  if (!revealState)
425
456
  return false;
@@ -430,16 +461,14 @@ export function createWidgetInteraction(deps) {
430
461
  }
431
462
  return false;
432
463
  }
433
- // The one fold that stands down mid-cross-block: a sweeping selection keeps the source
434
- // revealed so its rects measure real text and no endpoint anchored in it is stranded
435
- // (the escape fold carries the same rule in `selectionEscapedSource`).
464
+ // A cross-block drag keeps the source shown, so its rectangles measure real text and no
465
+ // endpoint in it is stranded (`selectionEscapedSource` holds the same rule).
436
466
  function commitRevealOnBlur() {
437
467
  if (revealState && !deps.isCrossBlock())
438
468
  commitReveal('blur');
439
469
  }
440
- // A mutation runs the CST pipeline against `node.raw`, which a live reveal has outrun,
441
- // so it must fold first. Returns the committed caret — a folded caret on an
442
- // element-level edge would land the paste at offset 0 — and the write's completion.
470
+ // The committed caret is returned because a caret left on an element-level edge would land a
471
+ // paste at offset 0.
443
472
  function foldRevealBeforeMutation(caretAfter) {
444
473
  if (!revealState)
445
474
  return null;
@@ -448,22 +477,22 @@ export function createWidgetInteraction(deps) {
448
477
  function isVerticallyTransparent() {
449
478
  // Resolver-free, matching the off-window keyboard-extend path, so the vertical-skip
450
479
  // decision is uniform everywhere. Other widget reads stay resolver-aware.
451
- return isVerticallyTransparentNode(deps.node);
480
+ return isVerticallyTransparentNode(deps.node, deps.reading.grammar);
452
481
  }
453
482
  async function handleSelectedWidgetKeydown(e) {
454
483
  const node = deps.node;
455
484
  const selectedWidget = deps.widgetSelection.getSelected();
456
485
  if (selectedWidget === null)
457
486
  return false;
458
- const widget = findWidgetNodeByStart(selectedWidget.sourceStart, inlinesOf(node), node.raw);
487
+ const widget = findWidgetNodeByStart(selectedWidget.sourceStart, inlinesOf(node), node.raw, deps.reading.grammar);
459
488
  const widgetIsHere = widget !== null && deps.widgetSelection.isSelected(deps.myPath, selectedWidget.sourceStart);
460
489
  if (!widgetIsHere)
461
490
  return false;
462
- // The kind's editing policy claims custom keys first. Flattened so the nested image
463
- // of `[![alt][ref]][repo]` is the resolved widget.
464
- const inline = flattenInlineWidgets(inlinesOf(node), node.raw).find((n) => n.start === widget.start);
491
+ // The kind's editing policy takes its own keys first. Flattened so the nested image
492
+ // of `[![alt][ref]][repo]` is the widget resolved.
493
+ const inline = flattenInlineWidgets(inlinesOf(node), node.raw, deps.reading.grammar).find((n) => n.start === widget.start);
465
494
  if (inline) {
466
- const policy = getInlineWidgetEditing(inline.kind);
495
+ const policy = widgetEditing(inline.kind);
467
496
  const consumed = policy?.onSelectedKey?.(e, {
468
497
  node,
469
498
  inline,
@@ -472,23 +501,22 @@ export function createWidgetInteraction(deps) {
472
501
  index: deps.index,
473
502
  preSelectOffset: selectedWidget.preSelectOffset,
474
503
  editorContentWidth: deps.getEditorContentWidth(),
475
- presentationMode: deps.getPresentationMode?.() ?? 'source',
476
- updateContent: (newRaw, caretBefore, caretAfter) => void deps.blockEdit.updateBlockContent(deps.index, newRaw, caretBefore, caretAfter)
504
+ presentationMode: deps.reading.mode(),
505
+ updateContent: (newRaw, caretBefore, caretAfter) => void deps.blockEdit.updateBlockContent(deps.index, newRaw, 'authored', caretBefore, caretAfter)
477
506
  });
478
507
  if (consumed)
479
508
  return true;
480
509
  }
481
- // Declining hands the chord to the keymap dispatch, which sits AFTER this handler and
482
- // owns undo/redo. Arrows are the exception: selecting cleared the native range, so a
483
- // shared-pipeline arm would read offset 0 and move focus to a block that isn't there.
510
+ // A modified chord goes on to the keymap dispatch, which owns undo and redo. Arrows stop here:
511
+ // selecting cleared the browser range, so a later handler would read offset 0.
484
512
  if (hasModifier(e)) {
485
513
  if (!e.key.startsWith('Arrow'))
486
514
  return false;
487
515
  e.preventDefault();
488
516
  return true;
489
517
  }
490
- // Swallowed even by a kind that claims no Shift+Arrow: stepping out is reserved
491
- // for plain Arrow.
518
+ // Consumed even by a kind that handles no Shift+Arrow: stepping out is reserved
519
+ // for a plain Arrow.
492
520
  if (e.shiftKey && (e.key === 'ArrowLeft' || e.key === 'ArrowRight')) {
493
521
  e.preventDefault();
494
522
  return true;
@@ -504,27 +532,27 @@ export function createWidgetInteraction(deps) {
504
532
  await deps.focusActions.moveFocus(deps.index + (left ? -1 : 1), left ? 'end' : 'start');
505
533
  }
506
534
  else {
507
- deps.cursor.setRaw(asRawOffset(left ? widget.start : widget.end));
535
+ deps.cursor.setRaw(asRawOffset(left ? widget.start : widget.end), { clamp: 'reachable' });
508
536
  deps.widgetSelection.clear();
509
537
  }
510
538
  return true;
511
539
  }
512
- // A vertical arrow is the shared pipeline's line walk, which needs a real caret to read:
513
- // seat one at the edge the arrow leaves from and decline, so the walk runs from there.
514
- if (!e.shiftKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {
515
- deps.cursor.setRaw(asRawOffset(e.key === 'ArrowUp' ? widget.start : widget.end));
540
+ // A vertical arrow, Home, End and the page keys are shared moves that need a real caret to
541
+ // read: put one at the edge the key leaves from and decline, so the move runs from there.
542
+ const moveEdge = e.shiftKey ? null : caretMoveEdge(e.key);
543
+ if (moveEdge) {
544
+ deps.cursor.setRaw(asRawOffset(moveEdge === 'start' ? widget.start : widget.end), {
545
+ clamp: 'reachable'
546
+ });
516
547
  deps.widgetSelection.clear();
517
548
  return false;
518
549
  }
519
- // Reading mode still swallows — a selected widget owns its keys — but commits nothing.
520
- // Undo anchored at the pre-select caret, so Ctrl+Z restores the caret where the user
521
- // actually was when selection took over.
550
+ // Reading mode still consumes the key, since a selected widget owns its keys, but writes
551
+ // nothing.
522
552
  const spliceWidget = (text) => {
523
553
  if (isReading())
524
554
  return;
525
- const newRaw = node.raw.slice(0, widget.start) + text + node.raw.slice(widget.end);
526
- void deps.blockEdit.updateBlockContent(deps.index, newRaw, selectedWidget.preSelectOffset, widget.start + text.length);
527
- deps.widgetSelection.clear();
555
+ void replaceSelectedWidget(deps, widget, selectedWidget.preSelectOffset, text, 'authored');
528
556
  };
529
557
  if (e.key === 'Backspace' || e.key === 'Delete') {
530
558
  e.preventDefault();
@@ -533,7 +561,7 @@ export function createWidgetInteraction(deps) {
533
561
  }
534
562
  if (e.key === 'Escape') {
535
563
  e.preventDefault();
536
- deps.cursor.setRaw(asRawOffset(widget.end));
564
+ deps.cursor.setRaw(asRawOffset(widget.end), { clamp: 'reachable' });
537
565
  deps.widgetSelection.clear();
538
566
  return true;
539
567
  }
@@ -542,15 +570,14 @@ export function createWidgetInteraction(deps) {
542
570
  spliceWidget(e.key);
543
571
  return true;
544
572
  }
545
- // Every remaining key is swallowed, so navigation can't leak into the shared pipeline
546
- // mid-selection. preventDefault too: reporting the key consumed stops only THIS
547
- // editor's chain, and the browser's default would still mutate behind the CST.
573
+ // Every remaining key is consumed and its default prevented, since the browser's default
574
+ // would still edit behind the CST.
548
575
  e.preventDefault();
549
576
  return true;
550
577
  }
551
578
  function handleShiftArrowIntoWidget(e) {
552
- // While source is revealed the CST still reports an atomic island, but the DOM is
553
- // editable text: let native selection run over it, not past a phantom widget.
579
+ // While a source is shown the CST still reports an atomic widget, but the DOM holds
580
+ // editable text: let the browser's selection run over it, not past a widget that is gone.
554
581
  if (revealState)
555
582
  return false;
556
583
  const el = deps.getEl();
@@ -565,12 +592,11 @@ export function createWidgetInteraction(deps) {
565
592
  extendSelectionToRaw(widgetExt);
566
593
  return true;
567
594
  }
568
- // The ONE seam the reveal-vs-select policy split lives at, shared by within-block caret
569
- // entry and cross-block edge landing. `fromTrailingEdge` fixes both the reveal caret
570
- // target and the undo / pre-select anchor.
595
+ // The one place the show-source-or-select choice is made. `fromTrailingEdge` sets both where
596
+ // the caret goes in the source and the undo anchor.
571
597
  function enterWidget(widget, fromTrailingEdge) {
572
598
  const enteredOffset = fromTrailingEdge ? widget.end : widget.start;
573
- if (getInlineWidgetEditing(widget.kind)?.revealSource) {
599
+ if (widgetEditing(widget.kind)?.revealSource) {
574
600
  const atSourceOffset = fromTrailingEdge ? widget.end - widget.start : 0;
575
601
  void startReveal(widget, enteredOffset, atSourceOffset);
576
602
  }
@@ -592,7 +618,7 @@ export function createWidgetInteraction(deps) {
592
618
  const widget = widgetsOf().find((w) => w.start < offset && offset < w.end);
593
619
  if (!widget)
594
620
  return false;
595
- const editing = getInlineWidgetEditing(widget.kind);
621
+ const editing = widgetEditing(widget.kind);
596
622
  if (!editing?.revealSource || !editing.revealContentSpan)
597
623
  return false;
598
624
  const at = offset - widget.start;
@@ -607,8 +633,8 @@ export function createWidgetInteraction(deps) {
607
633
  if (inlines.length === 0)
608
634
  return false;
609
635
  const target = side === 'start'
610
- ? findFirstEdgeWidget(inlines, deps.node.raw)
611
- : findLastEdgeWidget(inlines, deps.node.raw);
636
+ ? findFirstEdgeWidget(inlines, deps.node.raw, deps.reading.grammar)
637
+ : findLastEdgeWidget(inlines, deps.node.raw, deps.reading.grammar);
612
638
  if (!target)
613
639
  return false;
614
640
  // Focus the contenteditable so subsequent keys route to this block's handler.
@@ -618,58 +644,74 @@ export function createWidgetInteraction(deps) {
618
644
  }
619
645
  function snapClickToWidgetEdge(clickX, clickY, press = {}) {
620
646
  deps.setSnapTarget(null);
621
- const doubleClick = (press.clickCount ?? 1) >= 2;
622
- // Every double-click opens with a click of its own, so the opening click is where the
623
- // flag is armed and the flag from any earlier gesture is dropped.
624
- if (!doubleClick)
647
+ const clickCount = press.clickCount ?? 1;
648
+ // Every double-click starts with a single click, so that first click is where the flag
649
+ // is set and any flag left over from an earlier gesture is cleared.
650
+ if (clickCount === 1)
625
651
  revealOpenedByLastClick = false;
626
652
  const el = deps.getEl();
627
653
  if (!el || clickX === null)
628
654
  return;
629
- // The point-in-rect test runs BEFORE the text-node guard below, so a column-aligned
630
- // click on real text on another visual line falls through to the caret path.
631
- if (clickY !== null) {
632
- const hit = hitTestRevealWidget(el, clickX, clickY);
655
+ // A third click selects the block (`selection/multi-click.ts`), and showing a source under
656
+ // it would place a caret over the range it just painted.
657
+ if (clickY !== null && clickCount < 3) {
658
+ const hit = press.moved ? null : hitTestRevealWidget(el, clickX, clickY);
633
659
  if (hit) {
634
660
  // Returns rather than falls through: the edge-snap below would focus this block and
635
661
  // place a caret, stealing back what the widget's own navigation just landed.
636
- if (getInlineWidgetEditing(hit.inline.kind)?.claimsActivationClick &&
637
- isWidgetActivationClick(press.modified ?? false, deps.getPresentationMode?.() ?? 'source')) {
662
+ if (widgetEditing(hit.inline.kind)?.claimsActivationClick &&
663
+ isWidgetActivationClick(press.modified ?? false, deps.reading.mode())) {
638
664
  return;
639
665
  }
640
666
  void revealFromClick(clickX, clickY);
641
667
  return;
642
668
  }
643
669
  }
644
- // The first click of a double-click already revealed, so the second lands in the source
645
- // text and the browser's word rule takes `[` or `$` as a word of its own.
646
- if (doubleClick && revealOpenedByLastClick && selectRevealedSource(clickX, clickY))
670
+ // The first click of a double-click showed the source, and the browser's word rule would take
671
+ // `[` or `$` alone, so the second click selects the whole token.
672
+ if (clickCount === 2 && revealOpenedByLastClick && selectRevealedSource(clickX, clickY))
647
673
  return;
648
- // A click in a real text node keeps the native caret; a synthetic overlay would compete.
649
- if (caretIsInTextContent(el, window.getSelection()))
674
+ // The snap below places a caret, so it does nothing while this block shows a selected
675
+ // range, which it would collapse; `clampOutOfMarkerPrefix` already holds that rule.
676
+ const live = window.getSelection();
677
+ if (surfaceHoldsRange(el, live))
650
678
  return;
679
+ const seat = nearestWidgetEdgeSeat(measuredWidgets(el), clickX, clickY);
680
+ if (seat === null)
681
+ return;
682
+ // A click beside a widget leaves a visible caret alone; a click on one cannot, since the
683
+ // browser answers that hit test with a position in the neighbouring text.
684
+ if (!seat.inside && caretIsInTextContent(el, live))
685
+ return;
686
+ el.focus();
687
+ deps.cursor.setRaw(asRawOffset(seat.offset), { clamp: 'reachable' });
688
+ // `setRaw` may have landed in a trailing text node, where the browser draws a caret.
689
+ if (!caretIsInTextContent(el, window.getSelection()))
690
+ deps.setSnapTarget(seat.offset);
691
+ }
692
+ function* measuredWidgets(el, seatsInside = characterLike) {
651
693
  for (const inline of widgetsOf()) {
652
694
  const widget = widgetElByStart(el, inline.start);
653
- if (!widget)
654
- continue;
655
- const rect = widget.getBoundingClientRect();
656
- const snapTo = clickX > rect.right ? inline.end : clickX < rect.left ? inline.start : null;
657
- if (snapTo === null)
658
- continue;
659
- el.focus();
660
- deps.cursor.setRaw(asRawOffset(snapTo));
661
- // `setRaw`'s walker may have landed in a trailing text node, where native renders.
662
- if (!caretIsInTextContent(el, window.getSelection())) {
663
- deps.setSnapTarget(snapTo);
695
+ if (widget) {
696
+ yield {
697
+ start: inline.start,
698
+ end: inline.end,
699
+ rect: widget.getBoundingClientRect(),
700
+ seatsInside: seatsInside(inline.kind)
701
+ };
664
702
  }
665
- return;
666
703
  }
667
704
  }
705
+ /** Which inline widgets a drag may start inside: a kind with a pointer gesture of its own (an
706
+ * image's resize handles) owns its press. */
707
+ function dragsFromIsland(kind) {
708
+ return characterLike(kind) || widgetEditing(kind)?.revealSource === true;
709
+ }
668
710
  function widgetExtensionTarget(key) {
669
711
  const el = deps.getEl();
670
712
  if (!el)
671
713
  return null;
672
- const focus = selectionFocusWalkOffset(el, deps.getAmbientLength());
714
+ const focus = rawSelectionFocus(el);
673
715
  if (focus === null)
674
716
  return null;
675
717
  for (const inline of widgetsOf()) {
@@ -684,16 +726,8 @@ export function createWidgetInteraction(deps) {
684
726
  }
685
727
  function extendSelectionToRaw(rawOffset) {
686
728
  const el = deps.getEl();
687
- if (!el)
688
- return;
689
- const sel = window.getSelection();
690
- if (!sel || sel.rangeCount === 0)
691
- return;
692
- const target = toDomTextOffset(asRawOffset(rawOffset), deps.getAmbientLength());
693
- const range = createRangeAtDomTextOffsets(el, target, target);
694
- if (!range)
695
- return;
696
- sel.extend(range.endContainer, range.endOffset);
729
+ if (el)
730
+ extendSelectionToRawIn(el, rawOffset);
697
731
  }
698
732
  return {
699
733
  isVerticallyTransparent,
@@ -708,6 +742,7 @@ export function createWidgetInteraction(deps) {
708
742
  commitRevealOnBlur,
709
743
  foldRevealBeforeMutation,
710
744
  foldRevealIfSelectionEscaped,
711
- isPointOnRevealWidget
745
+ isPointOnRevealWidget,
746
+ islandDragAnchor
712
747
  };
713
748
  }