@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,49 +1,38 @@
1
1
  /**
2
- * The editable-leaf seam a plugin block component builds on: native caret/IME/undo/selection
3
- * parity in one factory, so a plugin never touches an editor context key. `plain` commits per
4
- * keystroke; `render-primary` reveals its source and commits on blur. A painted source
5
- * (`renderSource`) edits only its own DOM: every byte still enters the CST through
6
- * `commitReveal`'s one `updateBlockContent`. Call synchronously during init. Contract:
7
- * plugin-guide § The editable leaf.
2
+ * What a plugin's block component builds on: the caret, IME, undo and selection behaviour the
3
+ * built-in blocks have, in one factory, so a plugin never touches an editor context key. `plain`
4
+ * commits on every keystroke; `render-primary` shows its source and commits on blur. Call it
5
+ * synchronously during initialisation; the contract is plugin-guide § The editable leaf.
8
6
  */
9
7
  import { getContext } from 'svelte';
10
8
  import { createAttachmentKey } from 'svelte/attachments';
11
9
  import { EDITOR_POLICIES_KEY, EDITOR_SERVICES_KEY } from '../../editor-keys';
12
- import { asDomTextOffset } from '../../cursor/coordinate-spaces';
13
- import { setCursorOffset, getCursorOffset, getSelectionOffsets, getRangeOffsets } from '../../cursor/content-offsets';
10
+ import { asRawOffset } from '../../cursor/coordinate-spaces';
11
+ import { createSurfaceBackend } from '../../cursor/surface-backend';
14
12
  import { handleSharedKeydown } from '../../selection/shared-keydown';
15
- import { createEditableSurface, createClipboardHandlers, consumePendingRestore, withKeydownVerdict } from './editable-surface';
13
+ import { editableSurfaceAttributes, createEditableSurface, createClipboardHandlers, consumePendingRestore, withKeydownVerdict } from './editable-surface';
16
14
  import { wireSurfaceContexts } from './surface-wiring.svelte';
17
- import { createContentOffsetBackend, anchorTrailingNewline } from './plain-text-backend';
15
+ import { anchorTrailingNewline, plainTextOf } from './plain-text-backend';
18
16
  import { CONTENT_EMPTY_ATTR, chromeFreeText, clampToLandableRaw, holdsOnlyMarkerChrome } from '../../cursor/widget-offset';
19
17
  import { parkFocusOnEditorRoot } from '../../selection/native-bridge';
20
18
  import { assertInvariant } from '../../assert';
21
19
  import { checkRenderedTextFidelity } from '../../invariants/render-fidelity';
22
- import { resolveBinding } from '../../schema/commands';
23
- import { eventToChord } from '../../schema/keybindings';
24
20
  import { resetForPointerDown } from '../../selection/cross-block/pointer';
25
21
  import { placeCaret } from '../../selection/caret-doors';
26
22
  import { createSourceReveal } from '../../cursor/reveal-source';
27
23
  import { traceRevealOpen, traceRevealFold } from '../../debug/interaction-trace';
28
- import { trimTrailingLineEnding, trailingLineEnding } from '../../core/lines';
24
+ import { documentLineEnding, isBlankText, trimTrailingLineEnding, trailingLineEnding } from '../../core/lines';
29
25
  import { tryGetBlockKindDescriptor } from '../../schema/block-kind-descriptor';
30
- import {} from '../../schema/commands';
31
26
  import {} from '../../schema/block-commands';
32
- import { owningPluginEditor } from '../../schema/plugin-install';
33
- import { reorderRunCommand } from '../../editor-actions/reorder-action';
27
+ import { componentPluginEditor } from '../../schema/block-component-registry';
34
28
  import { createTextBatch } from '../../editor-actions/commit/text-batch';
35
- /**
36
- * The node → metadata bridge (plus `commandHooks`) a minted block command resolves
37
- * against on the leaf tier — the container factory's `buildContainerKindTarget` sibling.
38
- * Every field reads through `deps`' thunks at dispatch, so a node swap or hook rebind is
39
- * observed live; `pluginEditor` resolves by the kind's recorded owner.
40
- */
41
- export function buildLeafCommandContext(deps, blockEdit, pluginEditor) {
29
+ /** What a plugin block command runs against on a leaf, read through `deps` at dispatch so a
30
+ * node swap is seen; the leaf's counterpart of `buildContainerKindTarget`. */
31
+ export function buildLeafCommandContext(deps, blockEdit) {
42
32
  return {
43
33
  node: deps.getNode(),
44
34
  updateMetadata: (patch) => void blockEdit.updateBlockMetadata(deps.getIndex(), patch),
45
- hooks: deps.commandHooks?.(),
46
- editor: owningPluginEditor(pluginEditor, deps.getNode().kind)
35
+ hooks: deps.commandHooks?.()
47
36
  };
48
37
  }
49
38
  export function createEditableLeaf(deps) {
@@ -55,25 +44,25 @@ export function createEditableLeaf(deps) {
55
44
  // Plain mode's source is always the editable view.
56
45
  const isRevealed = mode === 'render-primary' ? deps.isRevealed : () => true;
57
46
  const wiring = wireSurfaceContexts();
58
- const { blockEdit, focusActions, stickyColumn, edgeAffinity, selection, getDoc, getBlockElByPath, getEditorRoot, pluginEditor, activePlugins, events: editorEvents } = wiring.deps;
59
- const { reorder } = getContext(EDITOR_SERVICES_KEY);
60
- const { presentationMode: getPresentationModeCtx, theme: getThemeCtx, keybindingOverrides, onPasteImage } = getContext(EDITOR_POLICIES_KEY);
61
- const getPresentationMode = () => getPresentationModeCtx?.() ?? 'source';
62
- const getTheme = () => getThemeCtx?.() ?? 'dark';
63
- // Resolved by the kind's recorded owner, like the command context's `editor`.
64
- const getOptions = () => owningPluginEditor(pluginEditor, deps.getNode().kind)?.options;
47
+ const { blockEdit, caretMemory, selection, getDoc, getBlockElByPath, getEditorRoot, events: editorEvents, reading, commands } = wiring.deps;
48
+ const { pluginEditor } = commands;
49
+ const { inlineMenuCombobox } = getContext(EDITOR_SERVICES_KEY);
50
+ const { theme: getTheme, onPasteImage } = getContext(EDITOR_POLICIES_KEY);
51
+ const getPresentationMode = reading.mode;
52
+ const getEditor = () => componentPluginEditor(pluginEditor, deps.getNode().kind);
53
+ const getOptions = () => getEditor()?.options;
65
54
  const isReading = () => getPresentationMode() === 'reading';
66
55
  let composing = false;
67
- let preEditOffset = 0;
68
56
  let pendingCursor = null;
69
57
  /** The bytes the open reveal was measured against; null while folded. */
70
58
  let revealedBase = null;
71
59
  const sourceText = () => trimTrailingLineEnding(deps.getNode().raw);
72
- const { backend, getFocusOffset, getTextLen, readText } = createContentOffsetBackend(() => deps.getEl());
60
+ const backend = createSurfaceBackend({ getEl: () => deps.getEl() });
61
+ // A leaf's text is its raw, so a computed caret lands exactly where the edit put it.
62
+ const setCaret = (offset) => backend.setRaw(asRawOffset(offset), { clamp: 'exact' });
73
63
  const editableSurface = createEditableSurface({
74
64
  ...wiring.deps,
75
65
  getEl: () => deps.getEl(),
76
- getAmbientLength: () => 0,
77
66
  // render-primary edits are ephemeral (one commit on blur); plain commits per keystroke.
78
67
  isInputSuppressed: () => mode === 'render-primary',
79
68
  backend,
@@ -83,33 +72,26 @@ export function createEditableLeaf(deps) {
83
72
  setComposing: (value) => {
84
73
  composing = value;
85
74
  },
86
- getPreEditOffset: () => preEditOffset,
87
- setPreEditOffset: (offset) => {
88
- preEditOffset = offset;
89
- },
90
- // render-primary never restores a pending caret — focus has already left on
91
- // commit, and a re-render must not yank it back.
75
+ // render-primary never restores a pending caret: focus has already left on
76
+ // commit, and a re-render must not pull it back.
92
77
  setPendingCursor: (offset) => {
93
78
  if (mode === 'plain')
94
79
  pendingCursor = offset;
95
80
  },
96
- getPresentationMode,
97
- getFocusOffset,
98
- getTextLen,
99
- readText,
81
+ getFocusOffset: backend.getFocusOffset,
82
+ getTextLen: () => plainTextOf(deps.getEl()).length,
83
+ readText: () => plainTextOf(deps.getEl()),
100
84
  commitInput: (text, preEdit, saved) => {
101
- // !isReading: the leaf is the seam — even if a plain-mode component keeps
102
- // its source editable in reading mode, nothing reaches the CST.
103
- if (mode === 'plain' && !isReading()) {
104
- void blockEdit.updateBlockContent(deps.getIndex(), text + trailingLineEnding(deps.getNode().raw), preEdit, saved);
105
- }
106
- }
85
+ if (mode !== 'plain')
86
+ return;
87
+ const write = blockEdit.updateBlockContent(deps.getIndex(), text + trailingLineEnding(deps.getNode().raw, documentLineEnding(getDoc())), 'authored', preEdit, saved);
88
+ return write.admitted ? write.caret : null;
89
+ },
90
+ handleBeforeInput: onBeforeInput
107
91
  });
108
92
  const surface = editableSurface.surface;
109
93
  const crossBlock = editableSurface.crossBlock;
110
- // The caret core; the swap is the component's reveal flag. Blocks commit on blur via
111
- // `commitReveal`, never the kernel's Escape-cancel `commit()`, so only `reveal()` is
112
- // driven here. Plain mode's swap thunks are inert.
94
+ // A leaf commits on blur through `commitReveal`, so only this primitive's `reveal()` is used.
113
95
  const revealKernel = createSourceReveal({
114
96
  get container() {
115
97
  return deps.getEl();
@@ -123,10 +105,8 @@ export function createEditableLeaf(deps) {
123
105
  get source() {
124
106
  return sourceText();
125
107
  },
126
- getAmbientLength: () => 0,
127
108
  isRevealed,
128
- // The one point block source is shown — the kernel calls it only when not
129
- // already revealed, so it fires once per open.
109
+ // Called only when no source is showing, so it fires once per open.
130
110
  showSource: () => {
131
111
  traceRevealOpen('leaf');
132
112
  revealedBase = sourceText();
@@ -139,8 +119,7 @@ export function createEditableLeaf(deps) {
139
119
  deps.setRevealed?.(false);
140
120
  }
141
121
  });
142
- // Every open goes through here rather than the kernel directly, so a chrome-only source is
143
- // completed (see `EditableLeafDeps.completeBareSource`) whatever door revealed it.
122
+ // Every open goes through here, so a markers-only source is completed however it was opened.
144
123
  async function revealSource(atSourceOffset = 0) {
145
124
  await revealKernel.reveal(atSourceOffset);
146
125
  const el = deps.getEl();
@@ -151,20 +130,16 @@ export function createEditableLeaf(deps) {
151
130
  return;
152
131
  paintSource(el, completed.text);
153
132
  deps.onSourceEdit?.(completed.text);
154
- setCursorOffset(el, asDomTextOffset(completed.caret));
133
+ setCaret(completed.caret);
155
134
  }
156
135
  // ── Commit ─────────────────────────────────────────────────────────────────
157
136
  // Returns the commit's own promise, so a caller that has to act on the committed bytes
158
137
  // (a single-line Enter's split) can wait for the write to land.
159
138
  function commitSource(edited) {
160
- // One undo entry: the anchor is where the caret entered the edit; the post-edit
161
- // caret follows the edit position.
162
- return Promise.resolve(blockEdit.updateBlockContent(deps.getIndex(), edited + trailingLineEnding(deps.getNode().raw), preEditOffset, edited.length));
139
+ return blockEdit.updateBlockContent(deps.getIndex(), edited + trailingLineEnding(deps.getNode().raw, documentLineEnding(getDoc())), 'authored', editableSurface.getPreEditOffset(), edited.length);
163
140
  }
164
- // A blur that arrives with a cross-block range live is the release of a drag that began in
165
- // this source and left it: the fold waits one frame, so the range's rects measured real text
166
- // under the pointer, then folds unless focus came back — else the source stays open with
167
- // nothing focused in it and no further blur to close it.
141
+ // A blur during a cross-block range is a drag leaving this source; it hides a frame later, once
142
+ // the range has measured its text, unless focus came back.
168
143
  let foldFrame = 0;
169
144
  function foldAfterRange() {
170
145
  if (foldFrame)
@@ -184,27 +159,29 @@ export function createEditableLeaf(deps) {
184
159
  foldAfterRange();
185
160
  return;
186
161
  }
187
- // Only wired to onFocusOut — the block leaf folds on blur, never Escape-cancel.
188
162
  traceRevealFold('blur');
189
163
  const edited = deps.getEl()?.textContent ?? sourceText();
190
164
  const base = revealedBase;
191
165
  revealedBase = null;
192
- deps.setRevealed(false); // reactive re-render of the edited source
193
- // The fold writes back only what the reveal measured. An undo, or a `source` prop swap,
194
- // can seat a DIFFERENT document at this index before focusout fires — the component is
195
- // destroyed and the blur arrives on the way out, so these bytes belong to a block that is
196
- // no longer here and writing them corrupts the one that is (#161).
166
+ deps.setRevealed(false);
167
+ // An undo or a `source` swap can put another block at this index before the destroyed
168
+ // component's blur arrives, so write back only over the bytes the source opened on.
197
169
  if (base !== null && base !== sourceText())
198
170
  return;
199
171
  if (edited === sourceText())
200
- return; // pure view toggle, nothing for the CST
172
+ return;
201
173
  await commitSource(edited);
202
174
  }
203
- // ── BlockComponent surface ─────────────────────────────────────────────────
175
+ // Forced, because a cross-block range would put the write off a frame and the command runs now.
176
+ function afterSourceCommit(run) {
177
+ if (mode !== 'render-primary' || !isRevealed())
178
+ return run();
179
+ void commitReveal(true).then(run);
180
+ }
181
+ // ── BlockComponent methods ─────────────────────────────────────────────────
204
182
  function parkCaret(offset) {
205
183
  if (mode === 'render-primary') {
206
- // Reading mode: a rendered view has no source to reveal; focus is a no-op
207
- // and block-level traversal passes over.
184
+ // Reading mode shows no source, so focus does nothing and traversal passes over.
208
185
  if (isReading())
209
186
  return;
210
187
  void revealSource(offset);
@@ -213,15 +190,12 @@ export function createEditableLeaf(deps) {
213
190
  surface.parkCaret(offset);
214
191
  }
215
192
  const focus = placeCaret(selection, parkCaret);
216
- // Sticky-column entry: mount the source, then land at the column nearest x
217
- // on the first/last visual line — the code-block traversal contract.
218
193
  function focusAtColumn(x, from) {
219
194
  void (async () => {
220
195
  if (!isRevealed()) {
221
196
  if (isReading())
222
197
  return;
223
- // Through the kernel like every other open, so this entry gets the same trace pair,
224
- // length assert and reveal base; it seats a caret at 0, which the column re-seats.
198
+ // Opens at offset 0; the column lookup below moves the caret.
225
199
  await revealSource();
226
200
  }
227
201
  if (!deps.getEl())
@@ -229,14 +203,10 @@ export function createEditableLeaf(deps) {
229
203
  surface.focusAtColumn(x, from);
230
204
  })();
231
205
  }
232
- function runCommand(id) {
233
- return reorderRunCommand(id, reorder, deps.getPath);
234
- }
235
- const getCommandContext = () => buildLeafCommandContext(deps, blockEdit, pluginEditor);
206
+ const getCommandContext = () => buildLeafCommandContext(deps, blockEdit);
236
207
  // ── View sync ──────────────────────────────────────────────────────────────
237
- // The one place source bytes become DOM, so G1.28 is asserted here for every painter rather
238
- // than trusted per plugin. A painter's chrome-only case (a fence with no body line) takes the
239
- // same stamp a code block does, so its markers paint while focused.
208
+ // Every painter's output passes here, so the text check covers them all (G1.28). A markers-only
209
+ // source takes the code block's empty-content attribute, so its markers show while focused.
240
210
  function paintSource(el, text) {
241
211
  if (deps.renderSource) {
242
212
  const painted = deps.renderSource(text);
@@ -253,10 +223,10 @@ export function createEditableLeaf(deps) {
253
223
  const el = deps.getEl();
254
224
  if (!el || !deps.renderSource || composing)
255
225
  return;
256
- const offset = getCursorOffset(el);
226
+ const offset = backend.getRaw();
257
227
  paintSource(el, el.textContent ?? '');
258
228
  if (offset !== null)
259
- setCursorOffset(el, asDomTextOffset(offset));
229
+ setCaret(offset);
260
230
  }
261
231
  function syncSource() {
262
232
  const text = sourceText();
@@ -269,15 +239,14 @@ export function createEditableLeaf(deps) {
269
239
  paintSource(el, text);
270
240
  // The local entries were taken against bytes an external rewrite just replaced.
271
241
  clearSourceHistory();
272
- // Restore only under a live caret — an external rewrite (undo, structural
242
+ // Restore only while a caret is live: a rewrite from outside (undo, structural
273
243
  // replace) must not steal focus.
274
- consumePendingRestore(el, pending, (offset) => setCursorOffset(el, asDomTextOffset(offset)));
244
+ consumePendingRestore(el, pending, (offset) => setCaret(offset));
275
245
  }
276
246
  }
277
247
  let sourceUndo = [];
278
248
  let sourceRedo = [];
279
- // The document's own keystroke batch, not a second timer: a burst of typing inside the
280
- // reveal takes one entry there, so it takes one here.
249
+ // The document's keystroke batching, so a burst of typing takes one entry here as it does there.
281
250
  let batchBaseText = '';
282
251
  const sourceBatch = createTextBatch({
283
252
  pushSnapshot: (_leafPath, offset) => {
@@ -296,17 +265,13 @@ export function createEditableLeaf(deps) {
296
265
  return;
297
266
  // The restored text is what the next keystroke must snapshot, so it opens its own batch.
298
267
  sourceBatch.interrupt();
299
- to.push({ text: el.textContent ?? '', caret: getCursorOffset(el) ?? 0 });
268
+ to.push({ text: el.textContent ?? '', caret: backend.getRaw() ?? 0 });
300
269
  paintSource(el, entry.text);
301
- setCursorOffset(el, asDomTextOffset(entry.caret));
270
+ setCaret(entry.caret);
302
271
  deps.onSourceEdit?.(entry.text);
303
272
  }
304
- /**
305
- * The one entry every reveal edit crosses, so the batching rule lives here rather than at
306
- * each gesture: one character replaced by at most one non-newline character is the shape a
307
- * keystroke has, and nothing else coalesces. Enter, a paste, a cut and a selection replace
308
- * each take an entry of their own and end the burst before them.
309
- */
273
+ /** Only a keystroke-shaped edit (one character at most, not a newline) joins a typing burst;
274
+ * anything else takes its own undo entry. */
310
275
  function recordSourceEdit(text, caret, keystroke) {
311
276
  if (!keystroke) {
312
277
  sourceBatch.interrupt();
@@ -317,37 +282,33 @@ export function createEditableLeaf(deps) {
317
282
  batchBaseText = text;
318
283
  sourceBatch.keystroke(deps.getPath(), caret);
319
284
  }
320
- // Splice `insert` over the source text node's [start, end) and reseat the caret. A
321
- // DOM-text mutation keeps the offset walk exact where a native Enter/cut/paste would
322
- // inject <div>/<br> that vanish from textContent.
285
+ // Splice `insert` over [start, end) of the source text and put the caret back: a native Enter,
286
+ // cut or paste would inject <div>/<br> elements that vanish from textContent.
323
287
  function spliceSourceText(el, start, end, insert) {
324
288
  const text = el.textContent ?? '';
325
289
  const keystroke = end - start <= 1 && insert.length <= 1 && insert !== '\n';
326
290
  if (deps.renderSource)
327
- recordSourceEdit(text, getCursorOffset(el) ?? start, keystroke);
291
+ recordSourceEdit(text, backend.getRaw() ?? start, keystroke);
328
292
  const spliced = text.slice(0, start) + insert + text.slice(end);
329
- // An edit that empties the body leaves the same chrome-only source a bare block arrives
330
- // as, so the edit door owes the completion the reveal door applies.
293
+ // Emptying the body leaves the same markers-only source a bare block arrives as, so this
294
+ // edit applies the same completion that showing the source does.
331
295
  const completed = deps.completeBareSource?.(spliced) ?? null;
332
296
  const next = completed?.text ?? spliced;
333
297
  paintSource(el, next);
334
298
  deps.onSourceEdit?.(next);
335
- preEditOffset = start;
336
- setCursorOffset(el, asDomTextOffset(completed?.caret ?? start + insert.length));
337
- // Armed once the edit has settled, so the window measures the gap the user leaves.
299
+ editableSurface.notePreEditOffset(start);
300
+ setCaret(completed?.caret ?? start + insert.length);
301
+ // Started after the edit, so the pause measured is the one the user leaves.
338
302
  if (deps.renderSource && keystroke)
339
303
  sourceBatch.armPause();
340
304
  if (mode === 'plain')
341
305
  editableSurface.onInput();
342
306
  }
343
307
  // ── Clipboard ────────────────────────────────────────────────────────────
344
- // The leaf's DOM-text space IS its raw, so copy falls to the seam's visible-selection
345
- // default and cut/paste splice verbatim. No structural paste hook: the commit
346
- // re-parses the whole raw, re-splitting only where the grammar demands. No reveal
347
- // fold — the render-primary source folds on blur instead.
308
+ // The leaf's DOM text is its raw, so copy writes the visible selection and cut and paste
309
+ // splice verbatim; the commit's reparse splits the block where the grammar demands.
348
310
  const clipboard = createClipboardHandlers({
349
- stickyColumn,
350
- edgeAffinity,
311
+ caretMemory,
351
312
  selection,
352
313
  getDoc,
353
314
  crossBlock,
@@ -359,7 +320,7 @@ export function createEditableLeaf(deps) {
359
320
  const el = deps.getEl();
360
321
  if (!el)
361
322
  return;
362
- const sel = getSelectionOffsets(el);
323
+ const sel = backend.getRawSelection();
363
324
  if (!sel || sel.start === sel.end)
364
325
  return;
365
326
  e.clipboardData?.setData('text/plain', (el.textContent ?? '').slice(sel.start, sel.end));
@@ -369,26 +330,30 @@ export function createEditableLeaf(deps) {
369
330
  const el = deps.getEl();
370
331
  if (!el)
371
332
  return;
372
- const sel = getSelectionOffsets(el);
373
- const start = sel ? sel.start : (getCursorOffset(el) ?? (el.textContent ?? '').length);
333
+ const sel = backend.getRawSelection();
334
+ const start = sel ? sel.start : (backend.getRaw() ?? (el.textContent ?? '').length);
374
335
  const end = sel ? sel.end : start;
375
336
  spliceSourceText(el, start, end, pastedText);
376
337
  }
377
338
  });
378
339
  /** Resolve a chord at this leaf's kind and report whether it was consumed. Both views spend
379
340
  * it: undo belongs to the block whatever half of the swap holds focus. */
380
- const dispatchChord = (e) => wiring.dispatchChord(e, { kind: deps.getNode().kind, runCommand, getCommandContext });
341
+ const dispatchChord = (e) => wiring.dispatchChord(e, {
342
+ kind: deps.getNode().kind,
343
+ getCommandContext,
344
+ getPath: deps.getPath,
345
+ afterSourceCommit
346
+ });
381
347
  async function handleKeydown(e) {
382
348
  const el = deps.getEl();
383
349
  if (composing || !el)
384
350
  return;
385
- preEditOffset = getCursorOffset(el) ?? 0;
386
- // Undo INSIDE an open painted reveal steps back through this session's own edits: the
387
- // document's history sees the session as one entry written on blur, so until the local
388
- // stack is spent the chord has nothing else to mean. Resolved through the keymap like every
389
- // chord, so a host's rebinding or disable reaches it.
351
+ // Enter commits from here, with no input event to read the caret at.
352
+ editableSurface.notePreEditOffset(backend.getRaw() ?? 0);
353
+ // Undo inside a shown painted source steps through its own edits; the document sees them as
354
+ // one entry written on blur.
390
355
  if (deps.renderSource && isRevealed()) {
391
- const command = historyCommandFor(e);
356
+ const command = wiring.resolveChord(e, deps.getNode().kind);
392
357
  if (command === 'history.undo' && sourceUndo.length > 0) {
393
358
  e.preventDefault();
394
359
  restoreSourceEntry(el, sourceUndo, sourceRedo);
@@ -400,24 +365,19 @@ export function createEditableLeaf(deps) {
400
365
  return;
401
366
  }
402
367
  }
403
- // Backspace in a painted source that holds nothing but its own chrome deletes the block, as
404
- // it does in a code block: an empty body has no byte the press could mean, and a seat that
405
- // only steps out (or eats the one blank line) leaves a block the user just asked to be rid
406
- // of. In every mode — the gate is the byte BEFORE the caret: whitespace, or nothing, so a
407
- // press that sits right after a visible marker still edits that marker in source mode.
368
+ // Backspace in a markers-only painted source deletes the block, but only with whitespace or
369
+ // nothing before the caret, so a Backspace right after a visible marker still edits it.
408
370
  if (e.key === 'Backspace' && !e.shiftKey && !e.ctrlKey && !e.metaKey && !e.altKey) {
409
- const offset = deps.renderSource ? getCursorOffset(el) : null;
371
+ const offset = deps.renderSource ? backend.getRaw() : null;
410
372
  const text = el.textContent ?? '';
411
373
  if (offset !== null &&
412
374
  (offset === 0 || /\s/.test(text[offset - 1] ?? '')) &&
413
375
  !hasSelectionIn(el) &&
414
- chromeFreeText(el).trim() === '') {
376
+ isBlankText(chromeFreeText(el))) {
415
377
  e.preventDefault();
416
378
  revealedBase = null;
417
379
  deps.setRevealed?.(false);
418
- const index = deps.getIndex();
419
- await blockEdit.deleteBlock(index);
420
- void focusActions.moveFocus(index - 1, 'end');
380
+ await blockEdit.deleteBlock(deps.getIndex(), 'Backspace');
421
381
  return;
422
382
  }
423
383
  }
@@ -425,18 +385,17 @@ export function createEditableLeaf(deps) {
425
385
  return;
426
386
  if (dispatchChord(e))
427
387
  return;
428
- // Enter stays inside the leaf as a literal newline (multiline source); it never splits
429
- // the block, and plain mode commits the insertion. A single-line leaf has nowhere to put
430
- // that byte, so it spends the press on the document instead.
388
+ // Enter types a literal newline in a multiline source; a single-line leaf has nowhere to put
389
+ // one, so Enter splits the block instead.
431
390
  if (e.key === 'Enter') {
432
391
  e.preventDefault();
433
392
  if (isReading())
434
393
  return;
435
394
  // Read before any fold: `setRevealed(false)` unmounts the element the offset lives in.
436
- const offset = getCursorOffset(el) ?? (el.textContent ?? '').length;
395
+ const offset = backend.getRaw() ?? (el.textContent ?? '').length;
437
396
  if (singleLine) {
438
- // Through the fold, not a bare commit: it is the one door deciding whether an open
439
- // reveal's bytes may still be written, and the split reads `node.raw` after it.
397
+ // `commitReveal` decides whether the shown bytes may still be written, and the split
398
+ // reads `node.raw` after it.
440
399
  await commitReveal();
441
400
  await blockEdit.splitBlock(deps.getIndex(), offset);
442
401
  return;
@@ -444,12 +403,8 @@ export function createEditableLeaf(deps) {
444
403
  spliceSourceText(el, offset, offset, '\n');
445
404
  }
446
405
  }
447
- /**
448
- * A painted source takes plain text edits here, not from the engine: Chromium treats a lone
449
- * `\n` text node as a placeholder and replaces it on insert (a fresh `$$` block lost the line
450
- * before its closer), and a native delete has no notion of hidden chrome. The edit range is
451
- * clamped to the landable span, so nothing reaches a fence line. Composition stays native.
452
- */
406
+ /** A painted source applies text edits itself: the browser's insert replaces a lone `\n` text
407
+ * node and its delete cannot see hidden markers. Clamping keeps edits off hidden fence lines. */
453
408
  function onBeforeInput(e) {
454
409
  if (!deps.renderSource || composing || e.isComposing)
455
410
  return;
@@ -475,21 +430,14 @@ export function createEditableLeaf(deps) {
475
430
  return;
476
431
  }
477
432
  const target = e.getTargetRanges()[0];
478
- const range = target ? getRangeOffsets(el, target) : null;
433
+ const range = target ? backend.rawRangeOf(target) : null;
479
434
  if (!range)
480
435
  return;
481
436
  e.preventDefault();
482
- const start = clampToLandableRaw(el, range.start, 0);
483
- const end = Math.max(start, clampToLandableRaw(el, range.end, 0));
437
+ const start = clampToLandableRaw(el, range.start);
438
+ const end = Math.max(start, clampToLandableRaw(el, range.end));
484
439
  spliceSourceText(el, start, end, insert);
485
440
  }
486
- function historyCommandFor(e) {
487
- const chord = eventToChord(e);
488
- if (!chord)
489
- return undefined;
490
- return resolveBinding(chord, deps.getNode().kind, keybindingOverrides(), activePlugins)
491
- ?.command;
492
- }
493
441
  function hasSelectionIn(el) {
494
442
  const sel = window.getSelection();
495
443
  return Boolean(sel && !sel.isCollapsed && el.contains(sel.anchorNode));
@@ -497,9 +445,8 @@ export function createEditableLeaf(deps) {
497
445
  function onPointerDown(e) {
498
446
  void crossBlock.handlePointerDown(e);
499
447
  }
500
- // The rendered view and the source are different strings, so only the kind can map a point
501
- // to a source offset: `caretTargetAtPoint` is that one declaration, and a kind naming none
502
- // reveals at the source start. The host, not the component root, is what the hook is bound to.
448
+ // The rendered view and the source are different strings, so only the kind's
449
+ // `caretTargetAtPoint` can map a point to a source offset; without one the source opens at 0.
503
450
  function revealOffsetAt(e) {
504
451
  const host = getBlockElByPath(deps.getPath())?.closest('[data-block-path]');
505
452
  if (!(host instanceof HTMLElement))
@@ -507,9 +454,8 @@ export function createEditableLeaf(deps) {
507
454
  const descriptor = tryGetBlockKindDescriptor(deps.getNode().kind);
508
455
  return descriptor?.caretTargetAtPoint?.(host, e.clientX, e.clientY)?.offset ?? 0;
509
456
  }
510
- // The press only notes where it landed: revealing on the press swallowed every drag that
511
- // began on a rendered equation. The editor's own drag runs from such a press (its root
512
- // handler), and the CLICK — a release that did not move — is what reveals.
457
+ // Pointer-down only records where it landed, so a drag starting on the rendered view stays a
458
+ // selection drag; the click, a release that did not move, shows the source.
513
459
  let renderPress = null;
514
460
  function onRenderPointerDown(e) {
515
461
  renderPress = e.shiftKey || isReading() ? null : { x: e.clientX, y: e.clientY };
@@ -521,14 +467,13 @@ export function createEditableLeaf(deps) {
521
467
  return;
522
468
  if (Math.abs(e.clientX - press.x) > 3 || Math.abs(e.clientY - press.y) > 3)
523
469
  return;
524
- // The reveal lands a caret, so this owes the shared preamble. NOT through
525
- // crossBlock.handlePointerDown: that hit-tests against the SOURCE text, which the
526
- // rendered view is not.
527
- resetForPointerDown(selection, stickyColumn, edgeAffinity, false);
470
+ // Showing the source places a caret, so the pointer-down reset runs; not through
471
+ // `crossBlock.handlePointerDown`, which hit-tests the source text, not the rendered view.
472
+ resetForPointerDown(selection, caretMemory, false);
528
473
  void revealSource(revealOffsetAt(e));
529
474
  }
530
- // The revealed source owns the press and has already spent the chord, so a spread the fold
531
- // does not unmount must not re-run either on the way up.
475
+ // A shown source owns the key and has already spent the chord, so a spread that stays
476
+ // mounted must not run either handler again on the way up.
532
477
  const renderProps = {
533
478
  onpointerdown: (e) => {
534
479
  if (!isRevealed())
@@ -543,13 +488,12 @@ export function createEditableLeaf(deps) {
543
488
  void dispatchChord(e);
544
489
  }
545
490
  };
546
- // ── Source surface bundle ────────────────────────────────────────────────────
491
+ // ── Source element props ─────────────────────────────────────────────────────
547
492
  const surfaceHandlers = {
548
493
  tabindex: 0,
549
- role: 'textbox',
550
494
  spellcheck: 'false',
551
495
  oninput: editableSurface.onInput,
552
- onbeforeinput: onBeforeInput,
496
+ onbeforeinput: editableSurface.onBeforeInput,
553
497
  onkeydown: withKeydownVerdict(handleKeydown),
554
498
  oncopy: clipboard.onCopy,
555
499
  oncut: clipboard.onCut,
@@ -559,43 +503,39 @@ export function createEditableLeaf(deps) {
559
503
  oncompositionstart: editableSurface.onCompositionStart,
560
504
  oncompositionend: editableSurface.onCompositionEnd
561
505
  };
562
- // Both modes mirror external raw changes (undo, structural replace) into the source —
563
- // tracked, so it re-runs on raw change. A render-primary edit is ephemeral until blur, so
564
- // nothing else moves the raw mid-edit and the mirror cannot clobber an in-flight one. No
565
- // cleanup, so it never parks focus mid-edit.
506
+ // Mirrors a raw change from outside (undo, a structural replace) into the source; nothing moves
507
+ // a shown render-primary source's raw before blur.
566
508
  const syncAttachment = () => {
567
509
  syncSource();
568
510
  };
569
- // Park focus when the source unmounts. A separate, stable, untracked attachment, so a
570
- // recompute of the spread never fires the park mid-edit.
511
+ // Its own stable attachment, so recomputing the spread never moves focus mid-edit.
571
512
  const parkAttachment = (el) => () => parkFocusOnEditorRoot(el, getEditorRoot());
572
- // The mode splits the rest of the view-lifecycle contract: render-primary's
573
- // `contenteditable` is constant, since reveal never fires in reading mode.
574
- const surfaceProps = mode === 'render-primary'
575
- ? {
576
- ...surfaceHandlers,
577
- contenteditable: 'true',
578
- [createAttachmentKey()]: syncAttachment,
579
- [createAttachmentKey()]: parkAttachment
580
- }
581
- : {
582
- ...surfaceHandlers,
583
- get contenteditable() {
584
- return isReading() ? 'false' : 'true';
585
- },
586
- [createAttachmentKey()]: syncAttachment,
587
- [createAttachmentKey()]: parkAttachment
588
- };
513
+ // One key per attachment, taken once: the spread re-reads the bundle as the list under the
514
+ // caret opens and closes, and Svelte re-runs an attachment only when its function changes.
515
+ const syncKey = createAttachmentKey();
516
+ const parkKey = createAttachmentKey();
517
+ // Built on every read, so the combobox attributes follow the list. A render-primary source is
518
+ // never shown in reading mode, so its `contenteditable` stays true.
519
+ const buildSurfaceProps = () => ({
520
+ ...surfaceHandlers,
521
+ ...editableSurfaceAttributes(deps.getNode(), inlineMenuCombobox(deps.getPath())),
522
+ contenteditable: mode === 'render-primary' || !isReading() ? 'true' : 'false',
523
+ [syncKey]: syncAttachment,
524
+ [parkKey]: parkAttachment
525
+ });
589
526
  return {
590
527
  get sourceText() {
591
528
  return sourceText();
592
529
  },
593
530
  repaintSource,
594
- surfaceProps,
531
+ get surfaceProps() {
532
+ return buildSurfaceProps();
533
+ },
595
534
  renderProps,
596
535
  getPresentationMode,
597
536
  getTheme,
598
537
  getOptions,
538
+ getEditor,
599
539
  focus,
600
540
  parkCaret,
601
541
  focusAtColumn,
@@ -608,21 +548,19 @@ export function createEditableLeaf(deps) {
608
548
  measurePartialRects: (startOffset, endOffset) => {
609
549
  if (isRevealed())
610
550
  return surface.measurePartialRects(startOffset, endOffset);
611
- // Folded render-primary leaf: no source text node to measure, so mirror the
612
- // opaque single-unit container shim and cover the rendered block box for any
613
- // non-empty range (SELECTION_END exceeds every real start, so to-end paints too).
551
+ // A hidden source has no text to measure, so any non-empty range covers the rendered box.
614
552
  if (endOffset <= startOffset)
615
553
  return [];
616
554
  const box = getBlockElByPath(deps.getPath());
617
555
  return box ? [box.getBoundingClientRect()] : [];
618
556
  },
619
- runCommand,
620
557
  insertMarkdown: clipboard.insertMarkdown,
621
558
  reveal: (offset = 0) => {
622
559
  if (mode !== 'render-primary')
623
560
  return Promise.resolve(surface.focus(offset));
624
561
  return isReading() ? Promise.resolve() : revealSource(offset);
625
562
  },
626
- commitSource: (edited) => void commitSource(edited)
563
+ commitSource: (edited) => void commitSource(edited),
564
+ afterSourceCommit
627
565
  };
628
566
  }