@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,7 +1,8 @@
1
1
  <script lang="ts">
2
2
  import { untrack } from 'svelte';
3
3
  import type { ImageCrop, ImageFields } from '../../core/nodes';
4
- import { IMAGE_CHROME_SELECTOR, type WidgetTarget } from './widget-selection-state.svelte';
4
+ import { pressLeavesImage } from './widget-selection-state.svelte';
5
+ import type { WidgetTarget } from '../../selection/primitives';
5
6
  import {
6
7
  IMAGE_ALT_FIELD,
7
8
  IMAGE_ALT_PLACEHOLDER,
@@ -12,6 +13,7 @@
12
13
  IMAGE_REMOVE
13
14
  } from '../../a11y-strings';
14
15
  import MenuIcon from '../menu/MenuIcon.svelte';
16
+ import type { MenuPresence } from '../menu/menu-presence.svelte';
15
17
  import { DEFAULT_CROP, applyCropToWidget, panCrop, zoomCrop, type Size } from './image-crop';
16
18
 
17
19
  let {
@@ -23,19 +25,24 @@
23
25
  onRemove,
24
26
  onDismiss,
25
27
  maxFrameWidth,
28
+ menuPresence,
26
29
  cropping = $bindable(false)
27
30
  }: {
28
31
  target: WidgetTarget;
29
32
  fields: ImageFields;
30
33
  getWidgetEl: () => HTMLElement | null;
31
- /** The popover's dirty check is a byte comparison, and the bytes are the write
32
- * seam's to decide. */
34
+ /** The popover decides it has changes by comparing bytes, and what those bytes are
35
+ * is the image write path's to decide. */
33
36
  buildBytes: (target: WidgetTarget, fields: ImageFields) => string | null;
34
- onCommit: (target: WidgetTarget, newFields: ImageFields) => void;
37
+ /** `fields` goes back with each write, so a draft for an image the document has since
38
+ * replaced is dropped. */
39
+ onCommit: (target: WidgetTarget, seenFields: ImageFields, newFields: ImageFields) => void;
35
40
  onRemove: (target: WidgetTarget) => void;
36
41
  onDismiss: () => void;
37
42
  /** The column width: the widest frame a corner drag can open. */
38
43
  maxFrameWidth: () => number;
44
+ /** The alt field is a popover over the document, so it counts as an open menu. */
45
+ menuPresence: MenuPresence;
39
46
  cropping?: boolean;
40
47
  } = $props();
41
48
 
@@ -45,13 +52,12 @@
45
52
  let rootEl: HTMLDivElement | undefined = $state();
46
53
  let fieldInput: HTMLInputElement | undefined = $state();
47
54
 
48
- // The seed is the BYTES, not the fields object: a rebuild mints a fresh one per render, so
49
- // identity says nothing about whether the image moved.
55
+ // The starting point is the bytes, not the fields object: a rebuild creates a fresh object
56
+ // every render, so its identity says nothing about whether the image changed.
50
57
  let seedBytes = $state(untrack(() => buildBytes(target, fields)));
51
58
 
52
- // The surface follows the document while it is open: an undo — or any write landing from
53
- // outside this gesture — moves the image past the draft, and the dismiss commit would put the
54
- // old bytes back. The in-flight draft is discarded rather than a committed change reverted.
59
+ // A write from outside the popover while it stays open (a find-bar replace) discards the
60
+ // draft, or an edit to it would put the earlier bytes back.
55
61
  $effect(() => {
56
62
  const live = buildBytes(target, fields);
57
63
  if (live === seedBytes) return;
@@ -62,17 +68,14 @@
62
68
  $effect(() => {
63
69
  if (!rootEl) return;
64
70
  const handler = (e: PointerEvent) => {
65
- const target = e.target as Element | null;
66
- if (target?.closest(IMAGE_CHROME_SELECTOR)) return;
67
- onDismiss();
71
+ if (pressLeavesImage(e, getWidgetEl()?.closest('.editor') ?? null)) onDismiss();
68
72
  };
69
73
  document.addEventListener('pointerdown', handler, true);
70
74
  return () => document.removeEventListener('pointerdown', handler, true);
71
75
  });
72
76
 
73
- // The commit runs in $effect cleanup so dismiss, image-switch (key change) and
74
- // programmatic clear all commit through one seam. A crop still open is abandoned, not
75
- // committed: only the tick writes one.
77
+ // In the effect's cleanup, so every way the popover closes commits here; an open crop is
78
+ // abandoned, since only the tick button writes one.
76
79
  $effect(() => {
77
80
  return () => {
78
81
  if (cropping) cancelCrop();
@@ -87,7 +90,7 @@
87
90
  // ── Alt ────────────────────────────────────────────────────────────────────
88
91
 
89
92
  // The title (`![alt](url "title")`) has no field: it is a tooltip nobody reads in an editor,
90
- // and an existing one rides through every commit untouched, as do the url, frame and crop.
93
+ // and an existing one passes through every commit untouched, as do the url, frame and crop.
91
94
  function draftFields(): ImageFields {
92
95
  return {
93
96
  alt,
@@ -103,10 +106,10 @@
103
106
  const next = draftFields();
104
107
  const newBytes = buildBytes(target, next);
105
108
  if (newBytes === seedBytes) return;
106
- // Seeded now rather than when the write lands, so a blur and the unmount that follows
109
+ // Set now rather than when the write lands, so a blur and the unmount that follows
107
110
  // it cannot commit the same draft twice.
108
111
  seedBytes = newBytes;
109
- onCommit(target, next);
112
+ onCommit(target, fields, next);
110
113
  }
111
114
 
112
115
  function toggleField() {
@@ -132,9 +135,8 @@
132
135
  }
133
136
 
134
137
  // ── Crop ───────────────────────────────────────────────────────────────────
135
- // limestone's cover crop: drag pans, the wheel zooms, corner brackets mark the frame, and
136
- // the tick writes it. The frame is the box the image has right now, so an unframed image
137
- // gains `|WxH` on its first crop.
138
+ // Drag pans, the wheel zooms, the corners resize the frame, the tick writes it. The frame
139
+ // starts as the image's current box, so an unframed image gains `|WxH` on its first crop.
138
140
 
139
141
  let draft = $state<ImageCrop>(DEFAULT_CROP);
140
142
  let frame: Size = { width: 0, height: 0 };
@@ -200,11 +202,11 @@
200
202
  height: Math.round(frame.height),
201
203
  crop: draft
202
204
  };
203
- // The commit rebuilds the widget from the bytes; the preview styles go with the old DOM.
205
+ // The commit rebuilds the widget from the bytes; the preview styles go with the replaced DOM.
204
206
  snapshot = null;
205
207
  cropping = false;
206
208
  seedBytes = buildBytes(target, next);
207
- onCommit(target, next);
209
+ onCommit(target, fields, next);
208
210
  }
209
211
 
210
212
  function onCropPointerDown(e: PointerEvent) {
@@ -231,10 +233,8 @@
231
233
  paintDraft();
232
234
  }
233
235
 
234
- // The corner brackets resize the frame itself, which is what changes its aspect. The frame
235
- // is anchored where the image sits in the flow, so every corner moves the far edges: a
236
- // left-hand corner dragged inward shrinks the width the way the right-hand one dragged
237
- // inward does.
236
+ // The frame stays anchored in the flow, so every corner moves the far edges: a left corner
237
+ // dragged inward shrinks the width as a right one does.
238
238
  type Corner = 'tl' | 'tr' | 'bl' | 'br';
239
239
  const MIN_FRAME = 32;
240
240
  let cornerDrag: { corner: Corner; startX: number; startY: number; start: Size } | null = null;
@@ -266,9 +266,8 @@
266
266
  cornerDrag = null;
267
267
  }
268
268
 
269
- // A double click on the picture is the crop gesture: the first click selects the image, so
270
- // by the second the toolbar (and this listener) is already mounted. On the document, since
271
- // each commit rebuilds the widget and a listener bound to one goes stale with it.
269
+ // A double click on the picture starts a crop. On the document, since each commit rebuilds
270
+ // the widget and a listener bound to it would go stale.
272
271
  $effect(() => {
273
272
  const onDoubleClick = (e: MouseEvent) => {
274
273
  if (cropping) return;
@@ -301,9 +300,8 @@
301
300
 
302
301
  // ── Placement ──────────────────────────────────────────────────────────────
303
302
 
304
- /** Beside the image, level with its top, when the viewport has room there; otherwise a row
305
- * inside the image's top-right corner, clamped to the viewport when the image itself runs
306
- * past it. Re-measured whenever the overlay re-anchors. */
303
+ /** Beside the image, level with its top, when there is room; otherwise a row inside its
304
+ * top-right corner, clamped to the viewport. Re-measured whenever the overlay moves. */
307
305
  function keepBesideImage(node: HTMLElement): (() => void) | void {
308
306
  const place = () => {
309
307
  node.classList.remove('inside');
@@ -425,7 +423,7 @@
425
423
  </button>
426
424
  {/if}
427
425
  {#if fieldOpen}
428
- <label class="md-image-field" {@attach keepFieldOnScreen}>
426
+ <label class="md-image-field" {@attach keepFieldOnScreen} {@attach menuPresence.track}>
429
427
  <span class="md-image-field-label">Alt</span>
430
428
  <input
431
429
  type="text"
@@ -440,8 +438,8 @@
440
438
  </div>
441
439
 
442
440
  <style>
443
- /* limestone's cover actions: a stack of small surface buttons beside the image, level with
444
- its top. `inside` (no room beside) lays them as a row in the image's top-right corner. */
441
+ /* Small raised buttons beside the image, level with its top; `inside` (no room beside)
442
+ lays them as a row in the image's top-right corner. */
445
443
  .md-image-properties {
446
444
  position: absolute;
447
445
  top: 0;
@@ -481,8 +479,7 @@
481
479
  background: var(--color-surface, #2d3033);
482
480
  }
483
481
 
484
- /* The alt field, hung off the toolbar's far side on the menu surface: a caption over its
485
- input, the way a properties row reads, rather than a label beside a box. */
482
+ /* The alt field hangs off the toolbar's far side: a caption over its input. */
486
483
  .md-image-field {
487
484
  position: absolute;
488
485
  top: 0;
@@ -515,8 +512,7 @@
515
512
  color: var(--color-text-muted, #aaaaaa);
516
513
  }
517
514
 
518
- /* Underlined, not boxed: one rule under the text reads as a field to fill in and keeps the
519
- surface calm, where a second rounded box inside a rounded card reads as chrome on chrome. */
515
+ /* Underlined, not boxed: a box inside the rounded panel would read as a frame in a frame. */
520
516
  .md-image-field input {
521
517
  width: 100%;
522
518
  box-sizing: border-box;
@@ -539,7 +535,7 @@
539
535
  color: var(--color-text-muted, #aaaaaa);
540
536
  }
541
537
 
542
- /* The crop session: the whole image is a pan surface, bracketed at the corners. */
538
+ /* While cropping: the whole image can be dragged to pan, with brackets at the corners. */
543
539
  .md-image-crop-surface {
544
540
  position: absolute;
545
541
  inset: 0;
@@ -1,17 +1,22 @@
1
1
  import type { ImageFields } from '../../core/nodes';
2
- import { type WidgetTarget } from './widget-selection-state.svelte';
2
+ import type { WidgetTarget } from '../../selection/primitives';
3
+ import type { MenuPresence } from '../menu/menu-presence.svelte';
3
4
  type $$ComponentProps = {
4
5
  target: WidgetTarget;
5
6
  fields: ImageFields;
6
7
  getWidgetEl: () => HTMLElement | null;
7
- /** The popover's dirty check is a byte comparison, and the bytes are the write
8
- * seam's to decide. */
8
+ /** The popover decides it has changes by comparing bytes, and what those bytes are
9
+ * is the image write path's to decide. */
9
10
  buildBytes: (target: WidgetTarget, fields: ImageFields) => string | null;
10
- onCommit: (target: WidgetTarget, newFields: ImageFields) => void;
11
+ /** `fields` goes back with each write, so a draft for an image the document has since
12
+ * replaced is dropped. */
13
+ onCommit: (target: WidgetTarget, seenFields: ImageFields, newFields: ImageFields) => void;
11
14
  onRemove: (target: WidgetTarget) => void;
12
15
  onDismiss: () => void;
13
16
  /** The column width: the widest frame a corner drag can open. */
14
17
  maxFrameWidth: () => number;
18
+ /** The alt field is a popover over the document, so it counts as an open menu. */
19
+ menuPresence: MenuPresence;
15
20
  cropping?: boolean;
16
21
  };
17
22
  declare const ImageProperties: import("svelte").Component<$$ComponentProps, {}, "cropping">;
@@ -26,9 +26,8 @@
26
26
  currentWidth: number;
27
27
  } | null = $state(null);
28
28
 
29
- // `md-image-broken` is toggled imperatively on the widget, which Svelte doesn't
30
- // track, so a MutationObserver mirrors it into reactive state. Each commit rebuilds
31
- // the widget DOM, so the observer re-attaches on every edit event.
29
+ // Mirrors the widget's `md-image-broken` class into state; re-attached on every edit, since
30
+ // each commit rebuilds the widget.
32
31
  let isBroken = $state(false);
33
32
  $effect(() => {
34
33
  let observer: MutationObserver | null = null;
@@ -64,12 +63,8 @@
64
63
  return getWidgetEl()?.querySelector('img') ?? null;
65
64
  }
66
65
 
67
- /**
68
- * What the drag measures and previews on. A cropped image is a FRAME (the widget) with the
69
- * picture panned inside it, so the `<img>` is neither the size being changed nor the box the
70
- * user is dragging: previewing on it bulges the picture out of its frame, and at a zoom above
71
- * 1 the drag would start from the painted image's width and jump.
72
- */
66
+ // A cropped image resizes its frame (the widget), not the `<img>` panned inside it, which
67
+ // would bulge out of the frame and, zoomed, start the drag from the wrong width.
73
68
  function isCropped(): boolean {
74
69
  return getWidgetEl()?.classList.contains('md-image-cropped') ?? false;
75
70
  }
@@ -94,9 +89,8 @@
94
89
  startWidth,
95
90
  startHeight,
96
91
  naturalWidth: img.naturalWidth,
97
- // A crop's frame keeps its shape through a resize (`commitImageResize` derives the
98
- // height from it), so Shift has nothing to unlock here; the crop session's corner
99
- // brackets are where a frame's aspect changes.
92
+ // A crop's frame keeps its shape through a resize, so Shift unlocks nothing; the crop
93
+ // corners are where a frame's shape changes.
100
94
  aspectLocked: isCropped() || !e.shiftKey,
101
95
  currentWidth: startWidth
102
96
  };
@@ -104,9 +98,8 @@
104
98
 
105
99
  function moveDrag(e: PointerEvent) {
106
100
  if (!dragState) return;
107
- // Reflow mid-drag (a sibling image settling, a scrollbar appearing) can
108
- // transiently zero the content width; hold the last good width instead of
109
- // snapping the image to nothing.
101
+ // Reflow mid-drag can briefly zero the content width; the last good width holds rather
102
+ // than snapping the image to nothing.
110
103
  if (editorContentWidth < MIN_WIDTH) return;
111
104
  const dx = e.clientX - dragState.startX;
112
105
  const proposed = dragState.startWidth + dx;
@@ -116,9 +109,8 @@
116
109
  const preview = previewEl();
117
110
  if (!preview) return;
118
111
  preview.style.width = `${snapped}px`;
119
- // Shift unlocks the aspect: the height stays where the user found it and the image
120
- // distorts. Locked, the frame's own `aspect-ratio` (cropped) or the stylesheet's
121
- // `height: auto` (plain) derives it from the new width.
112
+ // Unlocked, the height stays put and the image distorts; locked, the frame's `aspect-ratio`
113
+ // or the stylesheet's `height: auto` derives it from the width.
122
114
  preview.style.height = dragState.aspectLocked ? '' : `${dragState.startHeight}px`;
123
115
  }
124
116
 
@@ -173,8 +165,8 @@
173
165
  }
174
166
  </script>
175
167
 
176
- <!-- One grip, on the right edge: width is the only thing a drag sets (Shift unlocks the
177
- aspect), so a second corner grip was the same gesture twice. -->
168
+ <!-- One handle, on the right edge: width is the only thing a drag sets (Shift unlocks the
169
+ aspect ratio), so a second corner handle would be the same gesture twice. -->
178
170
  {#if !isBroken}
179
171
  <div
180
172
  class="md-resize-handle md-resize-handle-right"
@@ -187,12 +179,8 @@
187
179
  {/if}
188
180
 
189
181
  <style>
190
- /* A neutral grip sitting inside the picture's right edge: the selection ring owns the edge
191
- itself, and the accent is the ring's, so a second accent shape beside it reads as decoration
192
- rather than as a control. White over a hairline rim so it carries on a dark picture and a
193
- pale one alike. The hit strip is wider than the paint, so on a picture too narrow to hold
194
- both the strip and a clickable middle (an icon-sized image) the grip steps back outside
195
- the edge, where it stood before. */
182
+ /* White over a hairline rim, inside the right edge, so it shows on any picture without
183
+ competing with the accent selection ring; on an icon-sized image it moves outside the edge. */
196
184
  .md-resize-handle {
197
185
  position: absolute;
198
186
  right: clamp(-3px, calc(50% - 20px), 7px);
@@ -1,10 +1,7 @@
1
1
  /**
2
- * Pure math for the image crop: how a `{x, y, z}` window maps to the styles that paint it, and
3
- * how a pan or a wheel turn moves it. No DOM here beyond a style bag; the properties surface
4
- * owns the pointer events and `widget-dom.ts` paints a committed crop from the same styles.
5
- *
6
- * The model is CSS `background-size: cover` at `z` times the fill scale, with the image point
7
- * (`x`%, `y`%) pinned to that point of the frame, so `{50, 50, 1}` is a centred cover fit.
2
+ * Pure math for the image crop: the styles a `{x, y, z}` window paints with, and how a pan or a
3
+ * wheel turn moves it. The model is a cover fit scaled by `z`, with the image point (`x`%, `y`%)
4
+ * pinned to the same point of the frame, so `{50, 50, 1}` is a centred cover fit.
8
5
  */
9
6
  import type { ImageCrop } from '../../core/nodes';
10
7
  export declare const DEFAULT_CROP: ImageCrop;
@@ -13,11 +10,8 @@ export interface Size {
13
10
  height: number;
14
11
  }
15
12
  export declare function clampCrop(crop: ImageCrop): ImageCrop;
16
- /**
17
- * The styles an `<img>` inside an `overflow: hidden` frame takes. The image box is `z` times
18
- * the frame with `object-fit: cover`, offset so the pinned point stays put: at `z` 1 the offset
19
- * is zero and `object-position` alone pans the cover overflow.
20
- */
13
+ /** The image box is `z` times the frame with `object-fit: cover`, offset so the pinned point
14
+ * stays put; at `z` 1 the offset is zero and `object-position` alone pans. */
21
15
  export declare function cropImageStyle(crop: ImageCrop): {
22
16
  width: string;
23
17
  height: string;
@@ -1,10 +1,7 @@
1
1
  /**
2
- * Pure math for the image crop: how a `{x, y, z}` window maps to the styles that paint it, and
3
- * how a pan or a wheel turn moves it. No DOM here beyond a style bag; the properties surface
4
- * owns the pointer events and `widget-dom.ts` paints a committed crop from the same styles.
5
- *
6
- * The model is CSS `background-size: cover` at `z` times the fill scale, with the image point
7
- * (`x`%, `y`%) pinned to that point of the frame, so `{50, 50, 1}` is a centred cover fit.
2
+ * Pure math for the image crop: the styles a `{x, y, z}` window paints with, and how a pan or a
3
+ * wheel turn moves it. The model is a cover fit scaled by `z`, with the image point (`x`%, `y`%)
4
+ * pinned to the same point of the frame, so `{50, 50, 1}` is a centred cover fit.
8
5
  */
9
6
  import { MAX_CROP_ZOOM } from '../../core/inline/image-dimensions';
10
7
  export const DEFAULT_CROP = { x: 50, y: 50, z: 1 };
@@ -15,11 +12,8 @@ export function clampCrop(crop) {
15
12
  z: Math.min(MAX_CROP_ZOOM, Math.max(1, crop.z))
16
13
  };
17
14
  }
18
- /**
19
- * The styles an `<img>` inside an `overflow: hidden` frame takes. The image box is `z` times
20
- * the frame with `object-fit: cover`, offset so the pinned point stays put: at `z` 1 the offset
21
- * is zero and `object-position` alone pans the cover overflow.
22
- */
15
+ /** The image box is `z` times the frame with `object-fit: cover`, offset so the pinned point
16
+ * stays put; at `z` 1 the offset is zero and `object-position` alone pans. */
23
17
  export function cropImageStyle(crop) {
24
18
  const c = clampCrop(crop);
25
19
  const pct = (n) => `${Math.round(n * 1000) / 1000}%`;
@@ -1,18 +1,21 @@
1
1
  import type { Document, ImageFields, InlineNode } from '../../core/nodes';
2
- import type { LinkReferenceResolverRef } from '../../editor-keys';
3
- import type { UndoController } from '../../editor-actions/deps';
2
+ import type { InlineRangeCommit } from '../../editor-actions/inline-range-commit';
4
3
  import type { EditorEvents } from '../../editor-events';
5
- import type { GrammarView } from '../../schema/block-openers';
6
- import type { WidgetSelectionState, WidgetTarget } from './widget-selection-state.svelte';
4
+ import type { WidgetSelectionState } from './widget-selection-state.svelte';
5
+ import type { WidgetTarget } from '../../selection/primitives';
6
+ import type { Reading } from '../../schema/reading';
7
+ /** The image `target` names in `doc`, or null once no image starts at its bytes. */
8
+ export declare function imageAtTarget(doc: Document, target: WidgetTarget, reading: Reading): InlineNode | null;
7
9
  export interface ImageEditCommitterDeps {
8
10
  getDoc: () => Document;
9
11
  getEditorEl: () => HTMLElement | null;
10
12
  widgetSelection: WidgetSelectionState;
11
- controller: UndoController;
13
+ /** The editor's inline range write, which every popover edit goes through. */
14
+ inlineRange: InlineRangeCommit;
12
15
  events: EditorEvents;
13
- linkRef?: LinkReferenceResolverRef;
14
- /** The instance's grammar, for the leaf's own raw-write rule. Absent = the global grammar. */
15
- grammar?: GrammarView;
16
+ /** How the editor reads its bytes: the image is found in the block as drawn, and the block's
17
+ * own raw-write rule reads its grammar. */
18
+ reading: Reading;
16
19
  }
17
20
  export interface SelectedImageFields {
18
21
  image: InlineNode;
@@ -20,20 +23,20 @@ export interface SelectedImageFields {
20
23
  }
21
24
  export interface ImageEditCommitter {
22
25
  getSelectedImageFields(): SelectedImageFields | null;
23
- /**
24
- * `target` is captured at popover-mount time, not read from the live
25
- * widgetSelection: a popover commit can fire after the user clicked a different
26
- * widget, and writing to the new selection cross-pollinates the two images.
27
- */
28
- commitImageEdit(target: WidgetTarget, newFields: ImageFields): void;
29
- /** The bytes `commitImageEdit` would write, or `null` if it would decline — the
30
- * popover's dirty check compares against these. */
26
+ /** Writes only if the image at `target` still reads as `seenFields`, the image the popover
27
+ * last showed, so a draft never lands on another image. */
28
+ commitImageEdit(target: WidgetTarget, seenFields: ImageFields, newFields: ImageFields): void;
29
+ /** The bytes `commitImageEdit` would write, or `null` if it would refuse; the popover
30
+ * compares against these to see whether anything changed. */
31
31
  buildEditBytes(target: WidgetTarget, newFields: ImageFields): string | null;
32
32
  commitImageResize(newWidth: number, newHeight: number | undefined): void;
33
33
  removeImage(target: WidgetTarget): void;
34
34
  dismissImagePopover(): void;
35
35
  getEditorContentWidth(): number;
36
36
  attachWidgetSelectListener(): () => void;
37
+ /** Clears the widget selection once no image starts at its bytes; commits to this image or
38
+ * to one before it keep it selected. */
39
+ clearStaleSelection(): void;
37
40
  syncOverlayToWidget(getOverlay: () => HTMLElement | null): () => void;
38
41
  }
39
42
  export declare function createImageEditCommitter(deps: ImageEditCommitterDeps): ImageEditCommitter;
@@ -1,42 +1,36 @@
1
+ import { tick } from 'svelte';
1
2
  import { resolvedInlineContent } from '../../core/inline/inline-cache';
2
3
  import { flattenInlineWidgets } from '../../core/inline/inline-widgets';
3
- import { createInlineRangeCommit } from '../../editor-actions/inline-range-commit';
4
4
  import { FALLBACK_CONTENT_WIDTH } from '../../cursor/typography-estimates';
5
5
  import { blockNodeAt } from '../../tree-operations/node-primitives';
6
- import { buildImageEditBytes } from './image-source-bytes';
6
+ import { buildImageEditBytes, imageFieldsFromInline, sameImageFields } from '../../core/inline/image-source-bytes';
7
+ // ── Public API ──────────────────────────────────────────────────────────
8
+ /** The image `target` names in `doc`, or null once no image starts at its bytes. */
9
+ export function imageAtTarget(doc, target, reading) {
10
+ const paragraph = blockNodeAt(doc, target.paragraphPath);
11
+ return paragraph ? findImageInParagraph(paragraph, target.sourceStart, reading) : null;
12
+ }
7
13
  export function createImageEditCommitter(deps) {
8
- const { getDoc, getEditorEl, widgetSelection, controller, events } = deps;
9
- const inlineRange = createInlineRangeCommit({ getDoc, controller, grammar: deps.grammar });
10
- function findImageInParagraph(para, sourceStart) {
11
- // Resolver-aware so a reference-style image resolves as the render path saw it,
12
- // and flattened so an image nested in a link (`[![alt][ref]][repo]`) is found.
13
- const inlines = resolvedInlineContent(para, deps.linkRef);
14
- for (const widget of flattenInlineWidgets(inlines, para.raw)) {
15
- if (widget.kind === 'image' && widget.start === sourceStart)
16
- return widget;
17
- }
18
- return null;
19
- }
14
+ const { getDoc, getEditorEl, widgetSelection, inlineRange, events } = deps;
20
15
  function queryWidgetEl(paragraphPath, sourceStart) {
21
16
  const root = getEditorEl();
22
17
  if (!root)
23
18
  return null;
24
- // Locate by the live block-host path, never a baked attribute on the widget —
19
+ // Locate by the live block-host path, never an attribute baked into the widget:
25
20
  // see widget-dom.ts's click handler.
26
21
  const host = root.querySelector(`[data-block-path='${JSON.stringify(paragraphPath)}']`);
27
22
  if (!host)
28
23
  return null;
29
24
  return host.querySelector(`[data-image-widget][data-source-start="${sourceStart}"]`);
30
25
  }
26
+ const imageAt = (target) => imageAtTarget(getDoc(), target, deps.reading);
27
+ // The bytes the last popover write moved, applied by the next stale check: the write runs as
28
+ // the popover unmounts, where a read of the selection still returns the one before the click.
29
+ let lastShift = null;
31
30
  function getSelectedImageFields() {
32
31
  const sel = widgetSelection.getSelected();
33
- if (!sel)
34
- return null;
35
- const paragraph = blockNodeAt(getDoc(), sel.paragraphPath);
36
- if (!paragraph)
37
- return null;
38
- const image = findImageInParagraph(paragraph, sel.sourceStart);
39
- if (!image)
32
+ const image = sel && imageAt(sel);
33
+ if (!sel || !image)
40
34
  return null;
41
35
  return { image, widgetEl: queryWidgetEl(sel.paragraphPath, sel.sourceStart) };
42
36
  }
@@ -44,11 +38,11 @@ export function createImageEditCommitter(deps) {
44
38
  const paragraph = blockNodeAt(getDoc(), target.paragraphPath);
45
39
  if (!paragraph)
46
40
  return null;
47
- const image = findImageInParagraph(paragraph, target.sourceStart);
41
+ const image = findImageInParagraph(paragraph, target.sourceStart, deps.reading);
48
42
  if (!image)
49
43
  return null;
50
- // Preserve the reference form when url/title are untouched: inlining the
51
- // resolved url would orphan the LRD. Changing either is the user opting in.
44
+ // Keep the reference form when the url and title are untouched: writing the resolved
45
+ // url inline would leave the definition unused. Changing either is the user asking.
52
46
  const fields = image.label !== undefined && newFields.url === image.url && newFields.title === image.title
53
47
  ? { ...newFields, label: image.label }
54
48
  : newFields;
@@ -58,11 +52,24 @@ export function createImageEditCommitter(deps) {
58
52
  function buildEditBytes(target, newFields) {
59
53
  return resolveEdit(target, newFields)?.bytes ?? null;
60
54
  }
61
- function commitImageEdit(target, newFields) {
55
+ function commitImageEdit(target, seenFields, newFields) {
56
+ const image = imageAt(target);
57
+ if (!image || !sameImageFields(imageFieldsFromInline(image), seenFields))
58
+ return;
59
+ writeImageEdit(target, newFields);
60
+ }
61
+ // The caret from before the image was selected anchors the undo entry when no other caret
62
+ // answers: the popover can commit after the selection has moved on.
63
+ function writeImageEdit(target, newFields) {
62
64
  const edit = resolveEdit(target, newFields);
63
65
  if (!edit)
64
66
  return;
65
- void inlineRange.commitInlineRange(target.paragraphPath, edit.image.start, edit.image.end, edit.bytes, 0);
67
+ // Read from the bytes the block's kind will store, which a kind's own write rule can change.
68
+ const delta = inlineRange.writtenDelta(target.paragraphPath, edit.image.start, edit.image.end, edit.bytes);
69
+ if (delta !== 0) {
70
+ lastShift = { paragraphPath: target.paragraphPath, editEnd: edit.image.end, delta };
71
+ }
72
+ void inlineRange.commitInlineRange(target.paragraphPath, edit.image.start, edit.image.end, edit.bytes, target.preSelectOffset);
66
73
  }
67
74
  function commitImageResize(newWidth, newHeight) {
68
75
  const sel = widgetSelection.getSelected();
@@ -84,16 +91,16 @@ export function createImageEditCommitter(deps) {
84
91
  ...(framedHeight !== undefined ? { height: framedHeight } : {}),
85
92
  ...(image.crop !== undefined && framedHeight !== undefined ? { crop: image.crop } : {})
86
93
  };
87
- commitImageEdit(sel, newFields);
94
+ writeImageEdit(sel, newFields);
88
95
  }
89
- /** The whole `![...](...)` span goes; the caret lands where the image began. */
96
+ /** The whole `![...](...)` span goes. The selection clears first, so the undo entry is told
97
+ * the caret the user had before selecting the image rather than reading it. */
90
98
  function removeImage(target) {
91
- const paragraph = blockNodeAt(getDoc(), target.paragraphPath);
92
- const image = paragraph && findImageInParagraph(paragraph, target.sourceStart);
99
+ const image = imageAt(target);
93
100
  if (!image)
94
101
  return;
95
102
  widgetSelection.clear();
96
- void inlineRange.commitInlineRange(target.paragraphPath, image.start, image.end, '', 0);
103
+ void inlineRange.commitInlineRange(target.paragraphPath, image.start, image.end, '', target.preSelectOffset);
97
104
  }
98
105
  function dismissImagePopover() {
99
106
  widgetSelection.clear();
@@ -109,15 +116,33 @@ export function createImageEditCommitter(deps) {
109
116
  root.addEventListener('image-widget-select', handler);
110
117
  return () => root.removeEventListener('image-widget-select', handler);
111
118
  }
119
+ function clearStaleSelection() {
120
+ const shift = lastShift;
121
+ lastShift = null;
122
+ if (!shift) {
123
+ dropSelectionIfStale();
124
+ return;
125
+ }
126
+ // The overlay finds the widget by the bytes its element names, so the move waits for the
127
+ // block to render the write.
128
+ void tick().then(() => {
129
+ widgetSelection.followEdit(shift.paragraphPath, shift.editEnd, shift.delta);
130
+ dropSelectionIfStale();
131
+ });
132
+ }
133
+ function dropSelectionIfStale() {
134
+ const sel = widgetSelection.getSelected();
135
+ if (sel && !imageAt(sel))
136
+ widgetSelection.clear();
137
+ }
112
138
  function syncOverlayToWidget(getOverlay) {
113
139
  const noop = () => { };
114
140
  const overlayEl = getOverlay();
115
141
  const editorEl = getEditorEl();
116
142
  if (!overlayEl || !editorEl)
117
143
  return noop;
118
- // Each commit rebuilds the inline DOM, so a captured widget ref would observe a
119
- // detached node forever: re-resolve on every update and re-attach the observer
120
- // when widget identity changes.
144
+ // Each commit rebuilds the inline DOM, so the widget is re-resolved on every update and
145
+ // the observer re-attached when it changes.
121
146
  let observer = null;
122
147
  let observed = null;
123
148
  const update = () => {
@@ -144,9 +169,8 @@ export function createImageEditCommitter(deps) {
144
169
  // Edits above the widget shift its y without resizing it.
145
170
  const unsubscribeEdit = events.on('edit', update);
146
171
  window.addEventListener('resize', update);
147
- // Sibling images settling their dimensions shift the selected widget's y without
148
- // resizing it, which the ResizeObserver never sees. Capture phase: neither
149
- // event bubbles.
172
+ // Sibling images settling shift the widget's y without resizing it; capture phase,
173
+ // since neither event bubbles.
150
174
  const onImgSettle = (e) => {
151
175
  if (e.target instanceof HTMLImageElement)
152
176
  update();
@@ -170,6 +194,18 @@ export function createImageEditCommitter(deps) {
170
194
  dismissImagePopover,
171
195
  getEditorContentWidth,
172
196
  attachWidgetSelectListener,
197
+ clearStaleSelection,
173
198
  syncOverlayToWidget
174
199
  };
175
200
  }
201
+ // ── Internal ────────────────────────────────────────────────────────────
202
+ function findImageInParagraph(para, sourceStart, reading) {
203
+ // Resolver-aware so a reference-style image resolves as the render path saw it,
204
+ // and flattened so an image nested in a link (`[![alt][ref]][repo]`) is found.
205
+ const inlines = resolvedInlineContent(para, reading);
206
+ for (const widget of flattenInlineWidgets(inlines, para.raw, reading.grammar)) {
207
+ if (widget.kind === 'image' && widget.start === sourceStart)
208
+ return widget;
209
+ }
210
+ return null;
211
+ }