@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,50 +1,73 @@
1
1
  /**
2
- * The content write: every byte that enters a node crosses `updateNodeContent`, the sole
3
- * re-parse transfer funnel (editor.md § 6, § 8), and the container twin that re-derives a
4
- * container's kind from its rebuilt raw.
2
+ * The content write: every byte that enters a node goes through `updateNodeContent` after
3
+ * `legalizeWrite` makes it legal for its position. Also re-derives a container's kind from its
4
+ * rebuilt raw (`docs/design/editor.md` § Structural operations).
5
5
  */
6
- import type { AnyBlockKind, CstNode } from '../core/nodes';
7
- import type { NodeView } from '../core/node-views';
6
+ import type { CstNode } from '../core/nodes';
7
+ import type { DocumentView, NodeView } from '../core/node-views';
8
8
  import { type GrammarView } from '../schema/block-openers';
9
+ import { type BytesReading } from '../schema/container-raw';
10
+ import { type LineEnding } from '../core/lines';
11
+ import { type WriteMode } from '../schema/block-kind-descriptor';
9
12
  import type { SharingState } from './sharing';
10
13
  import { type StructuralChange } from './structural-change';
11
- import { type BodyParentArg, type NodeParent } from './node-primitives';
12
- /** What a content write settled: its change widened by every fold, and the offset the written
13
- * text starts at inside that change's window (nonzero once a fold above absorbed it). */
14
+ import { type BodyParent, type BodyParentArg, type NodeParent } from './node-primitives';
15
+ declare const legalWrite: unique symbol;
16
+ /**
17
+ * Text made legal as a block's bytes by {@link legalizeWrite}, the one place that builds it, so
18
+ * a write that carries one has passed the kind's rule and its container's exactly once.
19
+ */
20
+ export interface LegalWrite {
21
+ readonly text: string;
22
+ /** Where an offset into the text as the writer wrote it lands in the stored `text`. */
23
+ storedOffset(offset: number): number;
24
+ readonly [legalWrite]: true;
25
+ }
26
+ /** What {@link legalizeWrite} reads of a block's parent: its container and line ending. */
27
+ export type WriteTarget = {
28
+ readonly children: readonly NodeView[];
29
+ readonly owner: NodeView | undefined;
30
+ readonly lineEnding: LineEnding;
31
+ } | DocumentView;
32
+ /**
33
+ * `text` made legal as the bytes of the block at `index`: its kind's `rawWrite`, then the
34
+ * container's `bodyWrite`, both reading the tree as it stands before the write.
35
+ */
36
+ export declare function legalizeWrite(parent: WriteTarget, index: number, text: string, mode: WriteMode): LegalWrite;
37
+ /** Writes `text` over the leaf at `index` in place, made legal for its position, for a write that
38
+ * moves no block (a format toggle's marks); the caller copies the chain first and rebuilds it. */
39
+ export declare function rewriteLeafInPlace(parent: BodyParent, index: number, text: string, grammar: GrammarView, sharing: SharingState): void;
40
+ /** What a content write produced once its neighbours were fixed up: its change widened by every
41
+ * merge, and the offset the written text starts at inside that change's window (nonzero once a
42
+ * merge above absorbed it). */
14
43
  export interface SettledContent {
15
44
  change: StructuralChange;
16
45
  textStart: number;
17
46
  }
18
47
  /**
19
- * Update raw and re-parse. A kind change mints the reparsed block into the slot rather than
20
- * reassigning `kind` in place, and multi-block text mints every parsed block; only a same-kind
21
- * single-block edit writes in place, so routine typing keeps the node's object identity.
48
+ * Write and reparse the block; only a same-kind single-block edit writes in place, so typing keeps
49
+ * the node's identity. A plain string is made legal here; a {@link LegalWrite} already is.
22
50
  */
23
- export declare function updateNodeContent(parent: BodyParentArg, blockIndex: number, text: string, grammar?: GrammarView, sharing?: SharingState): SettledContent;
51
+ export declare function updateNodeContent(parent: BodyParentArg, blockIndex: number, text: string | LegalWrite, grammar: GrammarView, sharing?: SharingState): SettledContent;
24
52
  /**
25
53
  * Refresh a node in place from its own reparse, keeping its object identity. The id resync is
26
54
  * unconditional: the reparse can change the child count while the caller reports `noop`.
27
55
  */
28
56
  export declare function adoptReparsedFields(target: CstNode, parsed: CstNode | undefined): void;
57
+ /** Whether the grammar in effect still leaves `NEXT_PROSE_LINE` an ordinary paragraph. */
58
+ export declare function probeLineOpensAsProse(grammar: GrammarView): boolean;
29
59
  /**
30
- * What the grammar opens `line` as, read in isolation: asked of the opener registry and never
31
- * a kind list, so a kind registered later is covered the day it registers.
32
- */
33
- export declare function lineOpensAs(line: string, grammar?: GrammarView): AnyBlockKind;
34
- /** Whether the ambient grammar still leaves `NEXT_PROSE_LINE` an ordinary paragraph. */
35
- export declare function probeLineOpensAsProse(grammar?: GrammarView): boolean;
36
- /**
37
- * Re-derive the container at `index` from its own (already rebuilt) raw, replacing it in the
38
- * slot when that raw now opens as a different kind (editor.md § 8). Eligibility is the opener
39
- * registry: registering an opener is exactly the claim that `parse(raw)` reproduces the kind.
40
- */
41
- export declare function reclassifyContainer(parent: NodeParent, index: number, grammar?: GrammarView): CstNode | null;
42
- /**
43
- * Where a caret at `offset` in the written text lands once {@link updateNodeContent}'s folds
44
- * settled: an absorb ABOVE leaves the predecessor holding the bytes, so the slot the gesture
45
- * named is gone and the offset carries what that predecessor put in front of it.
60
+ * Replace the container at `index` when its rebuilt raw parses as a different kind; only a kind
61
+ * with an opener qualifies, since registering one claims `readBlocks(raw)` reproduces the kind.
46
62
  */
47
- export declare function settledCaretTarget(settled: SettledContent, at: number, offset: number, children: readonly NodeView[]): {
63
+ export declare function reclassifyContainer(parent: NodeParent, index: number, grammar: GrammarView): CstNode | null;
64
+ /** The container at `index` replaced by what its bytes read as, when its position holds that: the
65
+ * same kind over other children, or one block of another kind that has an opener. */
66
+ export declare function installReading(parent: NodeParent, index: number, reading: BytesReading, grammar: GrammarView): CstNode | null;
67
+ /** Where a caret at `offset` in the written text ends up after {@link updateNodeContent}'s merges:
68
+ * the block holding it and its offset there, counting what a merge above put in front. */
69
+ export declare function settledCaretPosition(settled: SettledContent, at: number, offset: number, children: readonly NodeView[]): {
48
70
  index: number;
49
71
  offset: number;
50
72
  };
73
+ export {};
@@ -1,65 +1,115 @@
1
1
  /**
2
- * The content write: every byte that enters a node crosses `updateNodeContent`, the sole
3
- * re-parse transfer funnel (editor.md § 6, § 8), and the container twin that re-derives a
4
- * container's kind from its rebuilt raw.
2
+ * The content write: every byte that enters a node goes through `updateNodeContent` after
3
+ * `legalizeWrite` makes it legal for its position. Also re-derives a container's kind from its
4
+ * rebuilt raw (`docs/design/editor.md` § Structural operations).
5
5
  */
6
- import { isBlankParagraph, parse } from '../core/parser';
6
+ import { isBlankParagraph } from '../core/parser';
7
7
  import { escalatedFenceLength, matchFenceOpen } from '../core/parsers/fence-syntax';
8
8
  import { isBlockOpenerRegistered } from '../schema/block-openers';
9
- import { trailingLineEnding } from '../core/lines';
10
- import { assignChildIdsDeep } from '../block-id';
11
- import { perfEnabled, recordContainerKindReparse } from '../perf/instruments';
12
- import { getBlockKindDescriptor, tryGetBlockKindDescriptor } from '../schema/block-kind-descriptor';
9
+ import { lineOpensAs, parseContainerRaw, rebuildContainerRaw } from '../schema/container-raw';
10
+ import { displayLines, documentLineEnding, firstLineEnding, joinDisplayLines, ownTrailingLineEnding } from '../core/lines';
11
+ import { assignChildIdsDeep, idsAcrossReread } from '../block-id';
12
+ import { getBlockKindDescriptor, mustHoldChild, tryGetBlockKindDescriptor } from '../schema/block-kind-descriptor';
13
13
  import { resyncChildIds } from './children';
14
14
  import { spliceMany } from './splice-many';
15
15
  import { replacePreservingFirst } from './structural-change';
16
- import { NEXT_PROSE_LINE, ensureEditableContainers, forBody, writeOwnRaw } from './node-primitives';
16
+ import { taskMarkerCaretShift, writeKeepingTaskMarker } from './list/reconcile-task';
17
+ import { fragmentReaderAt } from './list/task-paragraph';
18
+ import { NEXT_PROSE_LINE, ensureEditableContainers, installOwnRaw, parentLineEnding } from './node-primitives';
17
19
  import { absorbWindowSeams, focusTargetInReplacement, releaseWrapPeel, restoreSeparatorAfterBlank, restoreSeparatorOnFill, settleSeparatorOnBlank, widenForTailMint } from './settle';
18
20
  /**
19
- * Update raw and re-parse. A kind change mints the reparsed block into the slot rather than
20
- * reassigning `kind` in place, and multi-block text mints every parsed block; only a same-kind
21
- * single-block edit writes in place, so routine typing keeps the node's object identity.
21
+ * `text` made legal as the bytes of the block at `index`: its kind's `rawWrite`, then the
22
+ * container's `bodyWrite`, both reading the tree as it stands before the write.
23
+ */
24
+ export function legalizeWrite(parent, index, text, mode) {
25
+ const node = parent.children[index];
26
+ const owner = 'owner' in parent ? parent.owner : undefined;
27
+ const lineEnding = 'lineEnding' in parent ? parent.lineEnding : documentLineEnding(parent);
28
+ const ownRule = tryGetBlockKindDescriptor(node.kind)?.rawWrite;
29
+ const ownCtx = { node, mode, lineEnding };
30
+ const own = ownRule ? ownRule.normalize(text, ownCtx) : text;
31
+ const bodyRule = owner ? tryGetBlockKindDescriptor(owner.kind)?.bodyWrite : undefined;
32
+ // A child's bytes are never the container's own syntax, so the body rule reads them as content.
33
+ const bodyCtx = owner && { node: owner, mode: 'literal', lineEnding };
34
+ const stored = bodyRule && bodyCtx ? bodyRule.normalize(own, bodyCtx) : own;
35
+ // A list item takes a typed task marker out of its first paragraph, or gives one back.
36
+ const markerShift = index === 0 && owner ? taskMarkerCaretShift(owner, stored) : 0;
37
+ const storedOffset = (offset) => {
38
+ const inOwn = ownRule ? ownRule.mapOffset(text, offset, ownCtx) : offset;
39
+ const inBody = bodyRule && bodyCtx ? bodyRule.mapOffset(own, inOwn, bodyCtx) : inOwn;
40
+ return Math.max(inBody + markerShift, 0);
41
+ };
42
+ return { text: stored, storedOffset };
43
+ }
44
+ /** Writes `text` over the leaf at `index` in place, made legal for its position, for a write that
45
+ * moves no block (a format toggle's marks); the caller copies the chain first and rebuilds it. */
46
+ export function rewriteLeafInPlace(parent, index, text, grammar, sharing) {
47
+ const legal = legalizeWrite(parent, index, text, 'literal');
48
+ writeKeepingTaskMarker(parent.owner, parent.children, index, sharing, () => installOwnRaw(parent.children[index], legal.text, grammar));
49
+ }
50
+ /**
51
+ * Write and reparse the block; only a same-kind single-block edit writes in place, so typing keeps
52
+ * the node's identity. A plain string is made legal here; a {@link LegalWrite} already is.
22
53
  */
23
54
  export function updateNodeContent(parent, blockIndex, text, grammar, sharing) {
55
+ const legal = typeof text === 'string' ? legalizeWrite(parent, blockIndex, text, 'literal').text : text.text;
56
+ // Reconciled before the container's raw rebuild writes the list item's marker.
57
+ const owner = 'owner' in parent ? parent.owner : undefined;
58
+ return writeKeepingTaskMarker(owner, parent.children, blockIndex, sharing, () => writeAndSettleContent(parent, blockIndex, legal, grammar, sharing));
59
+ }
60
+ function writeAndSettleContent(parent, blockIndex, text, grammar, sharing) {
24
61
  const wasBlank = isBlankParagraph(parent.children[blockIndex]);
62
+ const indentMoved = leadingIndent(parent.children[blockIndex].raw) !== leadingIndent(text);
25
63
  const change = writeParsedContent(parent, blockIndex, text, grammar);
26
64
  const lastWritten = lastMintedIndex(change, blockIndex);
27
- // One blank line served BOTH sides: it separated this block from the one above and stood in
28
- // as the separator of the block beneath it. Ending it owes each their own.
65
+ // One blank line served both sides: it separated this block from the one above and stood in
66
+ // as the separator of the block beneath it. Filling it gives each side its own.
29
67
  if (wasBlank && !isBlankParagraph(parent.children[blockIndex])) {
30
68
  restoreSeparatorOnFill(parent, blockIndex, sharing);
31
69
  restoreSeparatorAfterBlank(parent, followerIndexAfter(change, blockIndex), sharing);
32
70
  releaseWrapPeel(parent, lastWritten);
33
- return settleWriteSeams(parent, blockIndex, lastWritten, change, sharing);
71
+ return settleWriteSeams(parent, blockIndex, lastWritten, change, sharing, grammar);
34
72
  }
35
- // The reverse transition: the block IS the separating line now, so the run it joins gives
36
- // back the second one. The last block minted is the one that meets the follower.
73
+ // The reverse transition: the block is the separating line now, so the run it joins gives
74
+ // back the second one. The last block created is the one that meets the follower.
37
75
  if (!wasBlank && isBlankParagraph(parent.children[lastWritten])) {
38
76
  const settled = parent.children.length;
39
77
  settleSeparatorOnBlank(parent, lastWritten, sharing);
40
78
  const widened = widenForTailMint(change, settled, parent.children.length);
41
- return settleWriteSeams(parent, blockIndex, lastWritten, widened, sharing);
79
+ return settleWriteSeams(parent, blockIndex, lastWritten, widened, sharing, grammar);
42
80
  }
43
- // Same-kind typing INSIDE content must never pay a neighbour reparse.
44
- if (change.op === 'noop')
81
+ // Same-kind typing skips the neighbour reparse unless the first line's indent moved, a blank line
82
+ // stays blank, or this block or the one above reads the lines below it (editor.md § 8).
83
+ if (change.op === 'noop' && !wasBlank && !indentMoved && !readerBeside(parent, blockIndex)) {
45
84
  return { change, textStart: 0 };
46
- return settleWriteSeams(parent, blockIndex, lastWritten, change, sharing);
85
+ }
86
+ return settleWriteSeams(parent, blockIndex, lastWritten, change, sharing, grammar);
87
+ }
88
+ const leadingIndent = (text) => /^[ \t]*/.exec(text)[0];
89
+ const readsFollowingLines = (node) => node !== undefined && tryGetBlockKindDescriptor(node.kind)?.readsFollowingLines === true;
90
+ /** Whether the written block or the one right above it reads the lines below it with no blank
91
+ * line between, where a write that kept its kind can still move the join. */
92
+ function readerBeside(parent, blockIndex) {
93
+ const { children } = parent;
94
+ const below = children[blockIndex + 1];
95
+ return ((children[blockIndex].leadingTrivia === '' && readsFollowingLines(children[blockIndex - 1])) ||
96
+ (below?.leadingTrivia === '' && readsFollowingLines(children[blockIndex])));
47
97
  }
48
98
  /**
49
- * Ask every join the write disturbed and report where the written text ended up: an absorb
50
- * ABOVE leaves the predecessor standing, so its bytes now sit in front of the text.
99
+ * Merge across every join the write disturbed, and report where the written text ended up, since
100
+ * a merge into the block above puts that block's bytes in front of it.
51
101
  */
52
- function settleWriteSeams(parent, blockIndex, lastWritten, change, sharing) {
102
+ function settleWriteSeams(parent, blockIndex, lastWritten, change, sharing, grammar) {
53
103
  const tracked = { index: blockIndex, offset: 0 };
54
- const settled = absorbWindowSeams(parent, blockIndex, lastWritten - blockIndex + 1, blockIndex, change, sharing, tracked);
104
+ const settled = absorbWindowSeams(parent, blockIndex, lastWritten - blockIndex + 1, blockIndex, change, grammar, sharing, tracked);
55
105
  return {
56
106
  change: settled.change,
57
107
  textStart: textOffsetInWindow(parent.children, settled.change, tracked)
58
108
  };
59
109
  }
60
110
  /**
61
- * The tracked position as an offset in the settled window's committed text, the space every
62
- * caret door measures in, where the head block's own leading trivia is outside the window.
111
+ * The tracked position as an offset in the window's committed text, the space every caret
112
+ * placement measures in, where the head block's own leading blank lines are outside the window.
63
113
  */
64
114
  function textOffsetInWindow(children, change, tracked) {
65
115
  const at = change.op === 'noop' ? tracked.index : change.at;
@@ -74,49 +124,45 @@ function textOffsetInWindow(children, change, tracked) {
74
124
  function followerIndexAfter(change, blockIndex) {
75
125
  return change.op === 'replace' ? change.at + change.newCount : blockIndex + 1;
76
126
  }
77
- /** The last block the write left in the slot: a multi-block reparse mints past the first. */
127
+ /** The last block the write left in the position: a multi-block reparse creates blocks past
128
+ * the first. */
78
129
  function lastMintedIndex(change, blockIndex) {
79
130
  return change.op === 'replace' ? change.at + change.newCount - 1 : blockIndex;
80
131
  }
81
132
  /**
82
- * The written bytes parsed, with the construct they leave OPEN closed off first: an unterminated
83
- * construct reads every block below it as its body at the next parse, and the seam settle would
84
- * converge the live tree to exactly that reading.
133
+ * The written bytes parsed, with a construct they leave open closed first, or the next parse and
134
+ * the neighbour merge would read every block below it as its body.
85
135
  */
86
- function closeWrittenConstruct(parent, blockIndex, text, oldKind, grammar) {
87
- // Fragment scope: this is one block's bytes, whatever its position, so a position-scoped
88
- // kind must not mint here.
89
- const parsed = parse(text, { grammar, scope: 'fragment' });
136
+ function closeWrittenConstruct(parent, blockIndex, text, oldKind, read) {
137
+ const parsed = read(text);
90
138
  if (blockIndex + 1 >= parent.children.length)
91
139
  return { text, parsed };
92
140
  if (parsed.children.length === 1 && parsed.children[0].kind === oldKind)
93
141
  return { text, parsed };
94
- const terminator = openConstructTerminator(text, parsed.children, grammar);
142
+ const terminator = openConstructTerminator(text, parsed.children, read);
95
143
  if (!terminator)
96
144
  return { text, parsed };
97
145
  const closed = text + terminator;
98
- return { text: closed, parsed: parse(closed, { grammar, scope: 'fragment' }) };
146
+ return { text: closed, parsed: read(closed) };
99
147
  }
100
148
  /**
101
- * The terminator written bytes owe when their last construct absorbs to EOF, asked of the grammar
102
- * rather than a kind list. Null when the bytes terminate themselves, or when no fence opener
103
- * explains the absorb (the one family whose closer its opener determines).
149
+ * The closing line the bytes need when their last construct runs to end of file; null when they
150
+ * close themselves, or no fence opener explains the run.
104
151
  */
105
- function openConstructTerminator(text, blocks, grammar) {
106
- // The terminator is a line of its own, so bytes whose last line is still open have none to
107
- // append to (G4.20's unterminated tail slice, which absorbs nothing while it stands alone).
108
- if (!text.endsWith('\n') || blocks.length === 0)
152
+ function openConstructTerminator(text, blocks, read) {
153
+ // The closer is a line of its own, so bytes whose last line is unterminated have nowhere to
154
+ // put one: an unterminated tail slice absorbs nothing while it stands alone.
155
+ const ending = ownTrailingLineEnding(text);
156
+ if (ending === '' || blocks.length === 0)
109
157
  return null;
110
- const ending = trailingLineEnding(text);
111
- const probe = parse(text + ending + NEXT_PROSE_LINE + ending, { grammar, scope: 'fragment' });
158
+ const probe = read(text + ending + NEXT_PROSE_LINE + ending);
112
159
  if (probe.children.length !== blocks.length)
113
160
  return null;
114
- const raw = blocks[blocks.length - 1].raw;
115
- const nl = raw.indexOf('\n');
116
- const opener = matchFenceOpen(nl < 0 ? raw : raw.slice(0, nl));
161
+ const [openerLine, ...bodyLines] = displayLines(blocks[blocks.length - 1].raw);
162
+ const opener = matchFenceOpen(openerLine.text);
117
163
  if (!opener)
118
164
  return null;
119
- const body = nl < 0 ? '' : raw.slice(nl + 1);
165
+ const body = joinDisplayLines(bodyLines);
120
166
  const run = escalatedFenceLength(body, opener.marker, opener.length);
121
167
  return opener.indent + opener.marker.repeat(run) + ending;
122
168
  }
@@ -124,34 +170,32 @@ function writeParsedContent(parent, blockIndex, text, grammar) {
124
170
  const node = parent.children[blockIndex];
125
171
  const oldKind = node.kind;
126
172
  const oldDescriptor = getBlockKindDescriptor(oldKind);
127
- // Ahead of every reparse below, so a write lands on the kind its committed bytes
128
- // describe, not the kind the pre-escape text would parse to (`bodyWrite`).
129
- const bodyText = forBody(parent, text);
130
- // A context-dependent kind has no standalone recognizer, so reparsing would downgrade it:
131
- // keep the kind and write raw through its own legality pass.
173
+ const lineEnding = parentLineEnding(parent);
174
+ // A context-dependent kind has no standalone recognizer, so reparsing would downgrade it.
132
175
  if (oldDescriptor.contextDependentKind) {
133
- writeOwnRaw(node, bodyText, grammar);
176
+ installOwnRaw(node, text, grammar);
134
177
  return { op: 'noop' };
135
178
  }
136
- const { text: newText, parsed: reparsed } = closeWrittenConstruct(parent, blockIndex, bodyText, oldKind, grammar);
179
+ const { text: newText, parsed: reparsed } = closeWrittenConstruct(parent, blockIndex, text, oldKind, fragmentReaderAt('owner' in parent ? parent.owner : undefined, blockIndex, grammar));
137
180
  const parsed = reparsed.children;
138
181
  const first = parsed[0];
139
182
  // A marker-consuming container (a GitHub alert) needs its raw rebuilt from the backfilled
140
- // body, or G1.1 stale-raw fires.
183
+ // body, or raw and children disagree (G1.1).
141
184
  const firstBackfilled = !!first && isEmptyEditableContainer(first);
142
185
  if (first)
143
- ensureEditableContainers(first);
144
- // Text-leading blanks fold into the first block's raw (the single-block shape); the
145
- // rest keep their own trivia.
186
+ ensureEditableContainers(first, lineEnding);
187
+ // Blank lines at the start of the text go into the first block's raw (as in the single-block
188
+ // case); the rest keep their own separators.
146
189
  if (parsed.length > 1) {
147
190
  const rest = parsed.slice(1);
148
191
  for (const sibling of rest)
149
- ensureEditableContainers(sibling);
192
+ ensureEditableContainers(sibling, lineEnding);
150
193
  first.raw = first.leadingTrivia + first.raw;
151
194
  first.leadingTrivia = node.leadingTrivia;
152
195
  if (firstBackfilled)
153
- reconcileBackfilledRaw(first);
154
- // The peeled line has no follower inside the splice, so it stays in raw.
196
+ rebuildContainerRaw(first, grammar);
197
+ // The trailing blank line the parse split off has no follower inside the splice, so it
198
+ // stays in raw.
155
199
  rest[rest.length - 1].raw += reparsed.suffix;
156
200
  spliceMany(parent.children, blockIndex, 1, parsed);
157
201
  return replacePreservingFirst(blockIndex, 1, parsed.length);
@@ -163,14 +207,14 @@ function writeParsedContent(parent, blockIndex, text, grammar) {
163
207
  node.raw = newText;
164
208
  adoptReparsedFields(node, first);
165
209
  if (firstBackfilled)
166
- reconcileBackfilledRaw(node);
210
+ rebuildContainerRaw(node, grammar);
167
211
  return { op: 'noop' };
168
212
  }
169
213
  const replacement = first ?? { kind: 'paragraph', leadingTrivia: '', raw: newText };
170
214
  replacement.raw = newText;
171
215
  replacement.leadingTrivia = node.leadingTrivia;
172
216
  if (firstBackfilled)
173
- reconcileBackfilledRaw(replacement);
217
+ rebuildContainerRaw(replacement, grammar);
174
218
  parent.children.splice(blockIndex, 1, replacement);
175
219
  return replacePreservingFirst(blockIndex, 1, 1);
176
220
  }
@@ -186,71 +230,72 @@ export function adoptReparsedFields(target, parsed) {
186
230
  target.innerPrefix = parsed?.innerPrefix;
187
231
  target.innerSuffix = parsed?.innerSuffix;
188
232
  }
189
- /** A container `ensureEditableContainers` will backfill; read BEFORE the backfill runs. */
233
+ /** A container `ensureEditableContainers` will backfill; read before the backfill runs. */
190
234
  function isEmptyEditableContainer(node) {
191
- const d = getBlockKindDescriptor(node.kind);
192
- return d.isContainer && d.blockFocus !== 'whole-block' && (node.children?.length ?? 0) === 0;
193
- }
194
- /**
195
- * Sync a just-backfilled container's `raw` to its synthesized body. Needed only for a
196
- * marker-consuming container whose typed raw lacks a blank body line (`> [!TYPE]`).
197
- */
198
- function reconcileBackfilledRaw(node) {
199
- getBlockKindDescriptor(node.kind).rebuildRaw?.(node);
235
+ return mustHoldChild(node.kind) && (node.children?.length ?? 0) === 0;
200
236
  }
201
237
  // ── Container kind re-derivation ──
202
- /**
203
- * What the grammar opens `line` as, read in isolation: asked of the opener registry and never
204
- * a kind list, so a kind registered later is covered the day it registers.
205
- */
206
- export function lineOpensAs(line, grammar) {
207
- return parse(`${line}\n`, { grammar, scope: 'fragment' }).children[0]?.kind ?? 'paragraph';
208
- }
209
- /** Whether the ambient grammar still leaves `NEXT_PROSE_LINE` an ordinary paragraph. */
238
+ /** Whether the grammar in effect still leaves `NEXT_PROSE_LINE` an ordinary paragraph. */
210
239
  export function probeLineOpensAsProse(grammar) {
211
240
  return lineOpensAs(NEXT_PROSE_LINE, grammar) === 'paragraph';
212
241
  }
213
242
  /**
214
- * Re-derive the container at `index` from its own (already rebuilt) raw, replacing it in the
215
- * slot when that raw now opens as a different kind (editor.md § 8). Eligibility is the opener
216
- * registry: registering an opener is exactly the claim that `parse(raw)` reproduces the kind.
243
+ * Replace the container at `index` when its rebuilt raw parses as a different kind; only a kind
244
+ * with an opener qualifies, since registering one claims `readBlocks(raw)` reproduces the kind.
217
245
  */
218
246
  export function reclassifyContainer(parent, index, grammar) {
219
247
  const node = parent.children[index];
220
- if (!node)
248
+ if (!node || !tryGetBlockKindDescriptor(node.kind)?.isContainer)
249
+ return null;
250
+ if (!isBlockOpenerRegistered(node.kind))
251
+ return null;
252
+ return replaceWithParse(parent, index, parseContainerRaw(node.raw, grammar), grammar);
253
+ }
254
+ /** The container at `index` replaced by what its bytes read as, when its position holds that: the
255
+ * same kind over other children, or one block of another kind that has an opener. */
256
+ export function installReading(parent, index, reading, grammar) {
257
+ const node = parent.children[index];
258
+ if (!node || reading.outcome === 'kept')
221
259
  return null;
222
- const descriptor = tryGetBlockKindDescriptor(node.kind);
223
- if (!descriptor?.isContainer || !isBlockOpenerRegistered(node.kind))
260
+ if (reading.outcome === 'reread') {
261
+ // A child the re-read left alone keeps its id, so the block there stays mounted.
262
+ const children = reading.node.children ?? [];
263
+ reading.node.childIds = idsAcrossReread(node.children ?? [], node.childIds, children);
264
+ return installReplacement(parent, index, reading.node, grammar);
265
+ }
266
+ if (!isBlockOpenerRegistered(node.kind))
224
267
  return null;
225
- if (perfEnabled())
226
- recordContainerKindReparse();
227
- const parsed = parse(node.raw, { grammar, scope: 'fragment' }).children;
228
- // A container's raw is one block by construction; a multi-block reparse means bytes
229
- // this seam has no slot for, left to the gesture that owns the mutation.
230
- if (parsed.length !== 1 || parsed[0].kind === node.kind)
268
+ return replaceWithParse(parent, index, reading.blocks, grammar);
269
+ }
270
+ function replaceWithParse(parent, index, parsed, grammar) {
271
+ // A container's raw is one block by construction; a multi-block reparse means bytes this
272
+ // function has no position for, left to the edit that owns the mutation.
273
+ if (parsed.length !== 1 || parsed[0].kind === parent.children[index].kind)
231
274
  return null;
232
- const replacement = parsed[0];
275
+ return installReplacement(parent, index, parsed[0], grammar);
276
+ }
277
+ function installReplacement(parent, index, replacement, grammar) {
278
+ const node = parent.children[index];
233
279
  const backfilled = isEmptyEditableContainer(replacement);
234
- ensureEditableContainers(replacement);
235
- // The slot's trivia is authoritative, so restore the bytes before overwriting it or
236
- // anything the parse split off the front vanishes with it.
280
+ // A container spanning lines holds the document's ending in its bytes; only a one-line
281
+ // container, the last line of a document, falls back to LF.
282
+ ensureEditableContainers(replacement, firstLineEnding(node.raw) ?? '\n');
283
+ // The position's own `leadingTrivia` is authoritative, so restore the bytes before
284
+ // overwriting it or anything the parse split off the front vanishes with it.
237
285
  replacement.raw = node.raw;
238
286
  replacement.leadingTrivia = node.leadingTrivia;
239
287
  if (backfilled)
240
- reconcileBackfilledRaw(replacement);
241
- // A freshly-parsed node carries no childIds and this swap publishes under the slot's
242
- // reused component instance, so undefined keys would reach the nested keyed `{#each}`.
288
+ rebuildContainerRaw(replacement, grammar);
289
+ // A freshly parsed node carries no `childIds`, and the swap reuses the position's component,
290
+ // so undefined keys would reach its nested keyed `{#each}`.
243
291
  assignChildIdsDeep(replacement);
244
292
  parent.children[index] = replacement;
245
- // Write-then-re-read (tree-operations/unshare.ts header).
293
+ // Write, then re-read through the tree (`unshare.ts` header).
246
294
  return parent.children[index];
247
295
  }
248
- /**
249
- * Where a caret at `offset` in the written text lands once {@link updateNodeContent}'s folds
250
- * settled: an absorb ABOVE leaves the predecessor holding the bytes, so the slot the gesture
251
- * named is gone and the offset carries what that predecessor put in front of it.
252
- */
253
- export function settledCaretTarget(settled, at, offset, children) {
296
+ /** Where a caret at `offset` in the written text ends up after {@link updateNodeContent}'s merges:
297
+ * the block holding it and its offset there, counting what a merge above put in front. */
298
+ export function settledCaretPosition(settled, at, offset, children) {
254
299
  const { change, textStart } = settled;
255
300
  if (change.op !== 'replace')
256
301
  return { index: at, offset };
@@ -3,14 +3,14 @@ export { nodeAt, emptyParagraph, paragraphNode, ensureEditableContainers, normal
3
3
  export { deleteNode, focusTargetInReplacement, restoreSeparatorOnFill, dropDoubledSeparator } from './settle';
4
4
  export { updateNodeContent, reclassifyContainer } from './content-write';
5
5
  export type { MergeIntoPrevResult, MergeResult, SplitResult } from './node-ops';
6
- export { splitNode, assertSplitLanding, assertSingleNodeSink, mergeWithNext, mergeIntoPrevDeepLeaf } from './node-ops';
6
+ export { splitNode, assertSingleNodeSink, mergeWithNext, mergeIntoPrevDeepLeaf } from './node-ops';
7
7
  export { unwrapFirstItemFromList, mergeListItemIntoPrevious } from './list/unwrap-merge';
8
8
  export { renumberOrderedList, normalizeItemMarkerToList } from './list/ordered-markers';
9
9
  export { isItemUserEmpty } from './list/empty-check';
10
10
  export { buildExitReplacement } from './list/exit-replacement';
11
- export { reconcileTaskMetadata } from './list/reconcile-task';
12
- export { unwrapFirstChildFromQuote } from './blockquote';
13
- export { liftFirstChildKeepingContainer } from './container-lift';
11
+ export { writeKeepingTaskMarker } from './list/reconcile-task';
12
+ export { plainQuote } from './blockquote';
13
+ export { liftFirstChild, sameContainer } from './container-lift';
14
14
  export { insertEmptyRow, insertEmptyColumn, deleteRow, deleteColumn, cycleAlignment } from './table-mutations';
15
15
  export { copyRectangleAsSubTable } from './sub-table-copy';
16
16
  export type { CellPos } from './sub-table-copy';
@@ -1,14 +1,14 @@
1
1
  export { nodeAt, emptyParagraph, paragraphNode, ensureEditableContainers, normalizeReplacementTrivia } from './node-primitives';
2
2
  export { deleteNode, focusTargetInReplacement, restoreSeparatorOnFill, dropDoubledSeparator } from './settle';
3
3
  export { updateNodeContent, reclassifyContainer } from './content-write';
4
- export { splitNode, assertSplitLanding, assertSingleNodeSink, mergeWithNext, mergeIntoPrevDeepLeaf } from './node-ops';
4
+ export { splitNode, assertSingleNodeSink, mergeWithNext, mergeIntoPrevDeepLeaf } from './node-ops';
5
5
  export { unwrapFirstItemFromList, mergeListItemIntoPrevious } from './list/unwrap-merge';
6
6
  export { renumberOrderedList, normalizeItemMarkerToList } from './list/ordered-markers';
7
7
  export { isItemUserEmpty } from './list/empty-check';
8
8
  export { buildExitReplacement } from './list/exit-replacement';
9
- export { reconcileTaskMetadata } from './list/reconcile-task';
10
- export { unwrapFirstChildFromQuote } from './blockquote';
11
- export { liftFirstChildKeepingContainer } from './container-lift';
9
+ export { writeKeepingTaskMarker } from './list/reconcile-task';
10
+ export { plainQuote } from './blockquote';
11
+ export { liftFirstChild, sameContainer } from './container-lift';
12
12
  export { insertEmptyRow, insertEmptyColumn, deleteRow, deleteColumn, cycleAlignment } from './table-mutations';
13
13
  export { copyRectangleAsSubTable } from './sub-table-copy';
14
14
  export { cascadeCleanupEmptyAncestors } from './cleanup';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The document always holds a block: a structural commit that leaves it none gives it one empty
3
+ * paragraph. The commit runs this step in both its branches, so no edit writes that paragraph.
4
+ */
5
+ import type { StructuralChange } from './structural-change';
6
+ import type { SharingState } from './sharing';
7
+ import { type BodyParent } from './node-primitives';
8
+ /** When `body` (the document's) has no children, gives it the empty paragraph and returns `change`
9
+ * widened to cover it; `body.lineEnding` was read before the edit, so the paragraph keeps it. */
10
+ export declare function keepOneBlock(body: BodyParent, change: StructuralChange, sharing: SharingState): StructuralChange;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The document always holds a block: a structural commit that leaves it none gives it one empty
3
+ * paragraph. The commit runs this step in both its branches, so no edit writes that paragraph.
4
+ */
5
+ import { emptyParagraph } from './node-primitives';
6
+ /** When `body` (the document's) has no children, gives it the empty paragraph and returns `change`
7
+ * widened to cover it; `body.lineEnding` was read before the edit, so the paragraph keeps it. */
8
+ export function keepOneBlock(body, change, sharing) {
9
+ if (body.children.length > 0)
10
+ return change;
11
+ const filler = emptyParagraph('', body.lineEnding);
12
+ sharing.stamp(filler);
13
+ body.children.push(filler);
14
+ // With nothing left, the change's window started at 0 and held every block there was.
15
+ const removed = change.op === 'delete' || change.op === 'replace' ? change.count : 0;
16
+ return removed === 0
17
+ ? { op: 'insert', at: 0, count: 1 }
18
+ : { op: 'replace', at: 0, count: removed, newCount: 1 };
19
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Replacing a range of one leaf, and joining two leaves, the way in-leaf edits and merges
3
+ * write them: cut back to the painted text, off any surrogate pair, and in live mode with the
4
+ * delimiter runs the join strands dropped, typed text included (`docs/design/live-mode.md` § 4.5).
5
+ */
6
+ import type { NodeView } from '../core/node-views';
7
+ import { type LineEnding } from '../core/lines';
8
+ import { type CleanedJoin, type JoinEndpoint, type JoinSeam } from '../schema/inline-construct-policy';
9
+ import type { StoredAs } from '../schema/stored-as';
10
+ export interface LeafRangeEdit {
11
+ /** The leaf's bytes after the edit, trailing line ending included. */
12
+ raw: string;
13
+ caret: number;
14
+ /** The range replaced: a drawn one cut back to the painted text, and off any surrogate pair. */
15
+ range: {
16
+ start: number;
17
+ end: number;
18
+ };
19
+ /** Whether `raw` is the range asked for spliced with nothing moved or cleaned, the edit the
20
+ * browser makes itself, grapheme and IME handling included. */
21
+ matchesBrowserEdit: boolean;
22
+ }
23
+ /** `[start, end)` of `node` replaced by `typed`, the join cleaned against where `store` keeps it. */
24
+ export declare function replaceRangeInLeaf(node: NodeView, range: {
25
+ start: number;
26
+ end: number;
27
+ }, typed: string, store: StoredAs): LeafRangeEdit;
28
+ /** The bytes `head` up to its offset and `tail` from its offset make with `typed` between them,
29
+ * `seam` where `typed` starts. `tail`'s bytes take its kind's write rule, in `lineEnding`. */
30
+ export declare function joinLeaves(head: JoinEndpoint, tail: JoinEndpoint, typed: string, store: StoredAs, lineEnding: LineEnding): CleanedJoin;
31
+ /** `join.mergedRaw` minus the delimiter runs the join left unpaired, where the reading hides
32
+ * delimiters. */
33
+ export declare function cleanJoinedRaw(join: JoinSeam): CleanedJoin;