@voithos-labs/aragonite 0.10.4 → 0.10.7

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