@voithos-labs/aragonite 0.10.3 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +12 -5
  3. package/dist/a11y-strings.js +61 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +13 -20
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +619 -1089
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +36 -67
  26. package/dist/components/SelectionOverlay.svelte.d.ts +6 -4
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +103 -100
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +35 -28
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +58 -32
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +144 -202
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +46 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +99 -144
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +3 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +9 -4
  102. package/dist/components/blocks/text/click-snap-guard.js +16 -5
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +164 -180
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -105
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +243 -208
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +13 -30
  144. package/dist/components/drag-handle.js +25 -63
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -31
  162. package/dist/components/editor-root-listeners.js +49 -46
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +26 -30
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +380 -0
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +14 -0
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +55 -68
  256. package/dist/core/inline/inline-widgets.js +55 -58
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +33 -17
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -7
  347. package/dist/cursor/height-oracle.js +26 -75
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +16 -8
  365. package/dist/cursor/scrollport.js +28 -5
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -13
  375. package/dist/cursor/visual-lines.js +72 -28
  376. package/dist/cursor/widget-edge-snap.d.ts +23 -0
  377. package/dist/cursor/widget-edge-snap.js +39 -0
  378. package/dist/cursor/widget-offset.d.ts +111 -102
  379. package/dist/cursor/widget-offset.js +352 -177
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +31 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +33 -52
  434. package/dist/editor-actions/focus/focus-landing.d.ts +11 -5
  435. package/dist/editor-actions/focus/focus-landing.js +29 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +55 -76
  465. package/dist/editor-actions/plugin/container.js +105 -186
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +91 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +38 -8
  550. package/dist/plugin.js +102 -74
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +113 -85
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -75
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +63 -47
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +18 -7
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +143 -292
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +79 -81
  695. package/dist/schema/commands.js +156 -116
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +9 -11
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +73 -78
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +93 -152
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +61 -104
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +53 -146
  807. package/dist/selection/dead-space-caret.d.ts +20 -28
  808. package/dist/selection/dead-space-caret.js +79 -87
  809. package/dist/selection/drag-pointer.d.ts +22 -5
  810. package/dist/selection/drag-pointer.js +63 -31
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -39
  816. package/dist/selection/keyboard-extend.js +94 -116
  817. package/dist/selection/multi-click.d.ts +37 -0
  818. package/dist/selection/multi-click.js +197 -0
  819. package/dist/selection/native-bridge.d.ts +30 -37
  820. package/dist/selection/native-bridge.js +80 -100
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +31 -14
  824. package/dist/selection/path-lookup.js +110 -20
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +9 -0
  828. package/dist/selection/pointer-gesture.js +11 -0
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -33
  832. package/dist/selection/primitives.js +61 -53
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -19
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +52 -0
  852. package/dist/selection/selection-drop.js +317 -0
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +75 -53
  864. package/dist/styles/editor.css +248 -139
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +19 -0
  960. package/dist/tree-operations/paste/replacement-parse.js +24 -0
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +329 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +267 -183
  996. package/docs/guide/plugin-guide.md +341 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +17 -21
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/invariants/split-landing.d.ts +0 -8
  1015. package/dist/invariants/split-landing.js +0 -15
  1016. package/dist/selection/double-click-trim.d.ts +0 -17
  1017. package/dist/selection/double-click-trim.js +0 -57
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -29
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -75
@@ -1,11 +1,12 @@
1
1
  /**
2
- * The separator settle every splice owes its neighbourhood (syntax-tree.md § Blank lines), the
3
- * seam absorb behind it (editor.md § 8), and the delete primitive built on both. `sharing` owns
4
- * every in-place write (G1.9); the retire census in `lint/separator-write-doors.test.ts` names
5
- * every door here.
2
+ * Recomputes the blank-line separators an edit left stale, merges neighbours that would re-read
3
+ * as one block on reload, and deletes a block on top of both (`docs/design/syntax-tree.md` § Blank
4
+ * lines). Every in-place write goes through `sharing`, so no undo snapshot sees it (G1.9), and
5
+ * `lint/separator-write-doors.test.ts` must list every function here that writes a separator.
6
6
  */
7
- import { isBlankParagraph, parse } from '../core/parser';
8
- import { trailingLineEnding, trimTrailingLineEnding } from '../core/lines';
7
+ import { isBlankParagraph, readBlocks } from '../core/parser';
8
+ import { firstLineEnding, ownTrailingLineEnding, splitLines, trimTrailingLineEnding } from '../core/lines';
9
+ import { tableTakesLine } from '../core/parsers/table';
9
10
  import { devWarn } from '../dev-warn';
10
11
  import { assignChildIdsDeep } from '../block-id';
11
12
  import { tryGetBlockKindDescriptor } from '../schema/block-kind-descriptor';
@@ -13,14 +14,15 @@ import { dropChildSpans } from '../schema/child-spans';
13
14
  import { assertInvariant } from '../assert';
14
15
  import { checkStructuralDescriptor } from '../invariants/structural-descriptor';
15
16
  import { ensureUnsharedChild } from './unshare';
17
+ import { lacksSublistSeparator, settleSublistSeparator } from './list/sublist-separator';
16
18
  import { spliceChildren } from './children';
17
19
  import { spliceMany } from './splice-many';
18
20
  import { applyStructuralChangeToIdsRefs } from './structural-change';
19
21
  import { ensureEditableContainers } from './node-primitives';
20
22
  // ── Separators ──
21
23
  /**
22
- * Settle the separator at `index`: nothing needs one at the body head or below a blank block,
23
- * where the parser would read the extra line as one more empty paragraph.
24
+ * Drop the separator at `index` where nothing needs one: at the body head, or below a blank
25
+ * block, where the parser would read the extra line as one more empty paragraph.
24
26
  */
25
27
  export function clearRedundantSeparator(parent, index, sharing) {
26
28
  retireChildSpans(parent);
@@ -39,8 +41,8 @@ export function clearRedundantSeparator(parent, index, sharing) {
39
41
  absorbWrapPrefix(parent, bodyStart, index, freed);
40
42
  }
41
43
  /**
42
- * A blank block IS a blank line, so it and its follower share ONE separator (G2.13). The
43
- * follower's stands, so a later fill of this slot still finds the follower separated.
44
+ * A blank block is itself a blank line, so it and its follower share one separator (G2.13). The
45
+ * follower's is kept, so filling the blank block later still finds the follower separated.
44
46
  */
45
47
  export function dropDoubledSeparator(parent, index, sharing) {
46
48
  retireChildSpans(parent);
@@ -54,7 +56,7 @@ export function dropDoubledSeparator(parent, index, sharing) {
54
56
  }
55
57
  /**
56
58
  * The separator a block takes back when it stops being blank: its own blank line was what stood
57
- * between it and a non-blank predecessor. Call at the fill.
59
+ * between it and a non-blank predecessor. Call when the block is filled.
58
60
  */
59
61
  export function restoreSeparatorOnFill(parent, index, sharing) {
60
62
  retireChildSpans(parent);
@@ -64,8 +66,8 @@ export function restoreSeparatorOnFill(parent, index, sharing) {
64
66
  mintSeparator(parent, index, sharing);
65
67
  }
66
68
  /**
67
- * The separator the block BELOW a consumed blank line takes back: the same mint minus the
68
- * blank-self guard, declined where its own follower already holds one (G2.13).
69
+ * The separator the block below a consumed blank line takes back, skipped for a blank block whose
70
+ * follower already holds one, since the two share it (G2.13).
69
71
  */
70
72
  export function restoreSeparatorAfterBlank(parent, index, sharing) {
71
73
  retireChildSpans(parent);
@@ -78,9 +80,8 @@ export function restoreSeparatorAfterBlank(parent, index, sharing) {
78
80
  mintSeparator(parent, index, sharing);
79
81
  }
80
82
  /**
81
- * The settle a block turning INTO a blank line owes: the run it joins carries exactly ONE
82
- * separating line across every block in it AND its follower. The line already standing is
83
- * kept; a mint lands at the run's head, the only slot one may take.
83
+ * A block turned blank joins a run that, with its follower, must carry exactly one separating line;
84
+ * a standing line is kept, and a new one goes at the run's head, the only place one may sit.
84
85
  */
85
86
  export function settleSeparatorOnBlank(parent, index, sharing) {
86
87
  retireChildSpans(parent);
@@ -100,13 +101,13 @@ export function settleSeparatorOnBlank(parent, index, sharing) {
100
101
  if (children[i].leadingTrivia !== '')
101
102
  standing.push(i);
102
103
  }
103
- // A chrome line bounding the run beside PROSE eats one line as the wrap's peel
104
- // (`innerPrefix`/`innerSuffix`), on top of the run's own count; an all-blank body owes none.
104
+ // A fence line at either end of the run strips one blank line into `innerPrefix`/`innerSuffix`
105
+ // on top of the run's own count when prose sits on the other side; an all-blank body needs none.
105
106
  const wrap = bodyWrapOf(parent);
106
107
  const slots = wrapSlotsOf(parent);
107
108
  const bodyEnd = children.length - 1;
108
- // A run of two or more that IS the whole body sits against both chrome lines: the reload
109
- // peels a line into each slot before it materializes a block, so it owes BOTH.
109
+ // A run of two or more that is the whole body sits against both fence lines, and the reload
110
+ // strips a line into each of `innerPrefix` and `innerSuffix`, so the run supplies both.
110
111
  const twoPeelBody = !!slots &&
111
112
  wrap?.afterOpenerLine === true &&
112
113
  wrap.beforeCloserLine === true &&
@@ -115,23 +116,24 @@ export function settleSeparatorOnBlank(parent, index, sharing) {
115
116
  start < end;
116
117
  const tailBelowProse = start > bodyStart && end === bodyEnd;
117
118
  if (slots && wrap?.beforeCloserLine && (tailBelowProse || twoPeelBody) && !slots.innerSuffix) {
118
- slots.innerSuffix = trailingLineEnding(children[end].raw);
119
+ // A blank block's bytes are its line ending.
120
+ slots.innerSuffix = ownTrailingLineEnding(children[end].raw);
119
121
  }
120
- // The reverse: a deletion can leave a lone blank as the WHOLE body, where the closer
121
- // peel no longer engages beside the opener's, so the run gives the extra line back.
122
+ // The reverse: beside a lone blank block that is the whole body, the closer strips no line of
123
+ // its own apart from the opener's, so the run gives the extra line back.
122
124
  const loneBlankBody = start === bodyStart && end === bodyEnd && start === end;
123
125
  if (slots && loneBlankBody && slots.innerSuffix && (slots.innerPrefix || standing.length > 0)) {
124
126
  slots.innerSuffix = '';
125
127
  }
126
128
  const headUnderWrap = !!slots && wrap?.afterOpenerLine === true && start === bodyStart && end < bodyEnd;
127
- // A line already standing IS the opener's peel on reload, so taking one as well would add a
128
- // line; a two-peel body's count comes out of the slots, not out of the run.
129
+ // A line already standing is the one the reload strips against the opener, so taking another
130
+ // into `innerPrefix` would add a line; a `twoPeelBody` keeps its lines in the wrap fields.
129
131
  const takesOpenerPeel = twoPeelBody || (headUnderWrap && standing.length === 0);
130
132
  if (slots && takesOpenerPeel && !slots.innerPrefix) {
131
- slots.innerPrefix = trailingLineEnding(children[start].raw);
133
+ slots.innerPrefix = ownTrailingLineEnding(children[start].raw);
132
134
  }
133
- // Under the wrap the run keeps exactly one peel line, in `innerPrefix` or still standing;
134
- // elsewhere a run with no line above it separates from nothing and materializes in full.
135
+ // Under the opener the run keeps exactly one stripped line, in `innerPrefix` or standing;
136
+ // elsewhere a run with nothing above it separates nothing, so every line is a block.
135
137
  let wanted;
136
138
  if (twoPeelBody)
137
139
  wanted = 0;
@@ -151,8 +153,24 @@ export function settleSeparatorOnBlank(parent, index, sharing) {
151
153
  materializeTailSuffix(parent, sharing);
152
154
  }
153
155
  /**
154
- * The give-back twin of {@link settleSeparatorOnBlank}'s closer peel: a tail that stops being
155
- * blank owes the borrowed `innerSuffix` line back, or the wrap emits a line nobody typed.
156
+ * The parser keeps a blank line beside a fence line in `innerPrefix`/`innerSuffix` only when body
157
+ * content sits past it, so an emptied body keeps neither, or it reloads with an extra blank block.
158
+ */
159
+ function dropWrapOfEmptiedBody(parent) {
160
+ const slots = wrapSlotsOf(parent);
161
+ if (!slots || !bodyWrapOf(parent))
162
+ return;
163
+ if ((parent.children?.length ?? 0) > bodyStartIndex(parent))
164
+ return;
165
+ retireChildSpans(parent);
166
+ if (slots.innerPrefix)
167
+ slots.innerPrefix = '';
168
+ if (slots.innerSuffix)
169
+ slots.innerSuffix = '';
170
+ }
171
+ /**
172
+ * A tail block that stops being blank gives back the `innerSuffix` line {@link
173
+ * settleSeparatorOnBlank} lent it, or the container emits a line nobody typed.
156
174
  */
157
175
  export function releaseWrapPeel(parent, index) {
158
176
  retireChildSpans(parent);
@@ -169,43 +187,64 @@ export function releaseWrapPeel(parent, index) {
169
187
  slots.innerSuffix = '';
170
188
  }
171
189
  /**
172
- * The parse folds the document's one trailing blank line into `suffix` only while the tail block
173
- * is non-blank; once the tail turns blank the reload reads that line as its own empty paragraph,
174
- * so the settle materializes it. Document-level slot only. Returns the blocks appended.
190
+ * A body's trailing blank line stays in `suffix`/`innerSuffix` only while the tail block is
191
+ * non-blank; under a blank tail the reload reads it as a paragraph, so it becomes a block here.
175
192
  */
176
193
  function materializeTailSuffix(parent, sharing) {
177
194
  retireChildSpans(parent);
178
195
  const children = parent.children;
179
- const suffix = parent.suffix;
180
- if (!children || !suffix)
196
+ const slot = tailSuffixSlotOf(parent);
197
+ const suffix = slot?.read();
198
+ if (!children || !slot || !suffix)
181
199
  return 0;
182
- // An emptied parent has no tail for the line to fold against, so it is the document's whole
183
- // content and the reload reads it as the one block there is.
200
+ // An emptied parent has no tail block for the line to attach to, so the line is the body's
201
+ // whole content and the reload reads it as the one block there is.
184
202
  if (children.length > 0 && !isBlankParagraph(children[children.length - 1]))
185
203
  return 0;
186
204
  const minted = { kind: 'paragraph', leadingTrivia: '', raw: suffix };
187
205
  if (sharing)
188
206
  sharing.stamp(minted);
189
207
  children.push(minted);
190
- parent.suffix = '';
208
+ slot.clear();
191
209
  return 1;
192
210
  }
193
- // ── The splice settle funnel ──
194
211
  /**
195
- * The settle every splice owes its neighbourhood, then the seam question over the window.
196
- * `removed` is the pre-splice span, the only place was-blank survives a splice; `tracked` rides
197
- * the folds for a door landing a caret in the spliced bytes.
212
+ * Where a body keeps its trailing blank line. A closer line strips a line of its own, which
213
+ * {@link settleSeparatorOnBlank} reconciles, so a body under one has no such slot here.
198
214
  */
199
- function settleSplicedWindow(parent, at, removed, added, change, sharing, tracked) {
215
+ function tailSuffixSlotOf(parent) {
216
+ if (parent.suffix !== undefined) {
217
+ return { read: () => parent.suffix ?? '', clear: () => (parent.suffix = '') };
218
+ }
219
+ const owner = ownerNodeOf(parent);
220
+ const wrap = bodyWrapOf(parent);
221
+ if (!owner || wrap?.beforeCloserLine)
222
+ return undefined;
223
+ // An all-blank body under an opener line gives its first line to the opener on reload, which
224
+ // is the one the trailing line would have added.
225
+ const children = parent.children ?? [];
226
+ const openerTakesLine = wrap?.afterOpenerLine === true &&
227
+ !owner.innerPrefix &&
228
+ children.length > 0 &&
229
+ children.every(isBlankParagraph);
230
+ if (openerTakesLine)
231
+ return undefined;
232
+ return { read: () => owner.innerSuffix ?? '', clear: () => (owner.innerSuffix = '') };
233
+ }
234
+ // ── Settling a spliced window ──
235
+ /** Recompute the separators around a splice, then merge neighbours that now read as one block.
236
+ * `removed` is the only record of which blocks were blank; `tracked` follows the merges. */
237
+ function settleSplicedWindow(parent, at, removed, vacated, added, change, grammar, sharing, tracked) {
200
238
  if (!parent.children)
201
239
  return change;
202
- // Ahead of the arms: `settleSeparatorOnBlank` materializes the tail line itself, so a count
203
- // read after it would leave that growth outside the window the sink reports.
240
+ // Read before the branches below: `settleSeparatorOnBlank` can append the tail line as a
241
+ // block, and a count read after it would leave that growth outside the reported window.
204
242
  const beforeMint = parent.children.length;
205
- handDownVacatedSeparator(parent, at, removed[0]?.leadingTrivia ?? '', sharing);
243
+ handDownVacatedSeparator(parent, at, vacated, sharing);
206
244
  clearRedundantSeparator(parent, at, sharing);
207
245
  if (removed.some(isBlankParagraph)) {
208
- // Both ends: the line was the slot's own AND the one below it stood on.
246
+ // Both ends: the removed blank line was this position's own separator and the one the
247
+ // block below stood on.
209
248
  restoreSeparatorAfterBlank(parent, at, sharing);
210
249
  if (added > 0)
211
250
  restoreSeparatorAfterBlank(parent, at + added, sharing);
@@ -214,18 +253,39 @@ function settleSplicedWindow(parent, at, removed, added, change, sharing, tracke
214
253
  else {
215
254
  settleSeparatorOnBlank(parent, at + Math.max(added - 1, 0), sharing);
216
255
  }
217
- // Unconditional, and the funnel's only home for it: a delete window at the tail probes no
218
- // slot, and the question is about the parent's LAST block.
256
+ settleEmptyMarkerLists(parent, at, added, sharing);
257
+ dropWrapOfEmptiedBody(parent);
258
+ // Unconditional, and only here: a delete window at the tail names no surviving block, and
259
+ // the question is about the parent's last block whatever the window.
219
260
  materializeTailSuffix(parent, sharing);
220
261
  const widened = widenForTailMint(change, beforeMint, parent.children.length);
221
- // The seam question is part of SETTLING, not a rule each door carries, so door N+1 inherits
222
- // it. A byte-shaped write reporting `noop` splices no window and is asked nothing.
223
- return absorbWindowSeams(parent, at, added, at, widened, sharing, tracked,
224
- // A one-slot window names the one block whose bytes changed, which is what lets the seam
225
- // above decline on its first line; a plural one names no single block.
262
+ // Merging neighbours is part of settling, not a rule each caller repeats, so a new caller
263
+ // inherits it. A write that reports `noop` splices no window and is asked nothing.
264
+ const absorbed = absorbWindowSeams(parent, at, added, at, widened, grammar, sharing, tracked,
265
+ // A one-block window names the block whose bytes changed, which lets the join above it be
266
+ // refused on that block's first line alone; a wider window names no single block.
226
267
  added === 1 ? at : undefined).change;
268
+ // The parent's trailing line is asked again: a merge can turn the last block blank, and a
269
+ // blank last block is what makes that line a block of its own.
270
+ const beforeTailMint = parent.children.length;
271
+ materializeTailSuffix(parent, sharing);
272
+ return widenForTailMint(absorbed, beforeTailMint, parent.children.length);
273
+ }
274
+ /**
275
+ * A list landing under a paragraph with an empty first item, or left there by the splice, takes
276
+ * the blank line that keeps it a list; typing writes the same line when it rebuilds the list.
277
+ */
278
+ function settleEmptyMarkerLists(parent, at, added, sharing) {
279
+ for (let i = at; i <= at + added && i < (parent.children?.length ?? 0); i++) {
280
+ if (!lacksSublistSeparator(parent.children, i))
281
+ continue;
282
+ if (sharing)
283
+ ensureUnsharedChild(parent, i, sharing);
284
+ settleSublistSeparator(parent.children, i);
285
+ }
227
286
  }
228
- /** Whoever takes the slot inherits its line, having none of its own ({@link deleteNode}'s rule). */
287
+ /** The block that takes the vacated position inherits its separator when it has none of its own
288
+ * ({@link deleteNode}'s rule). */
229
289
  function handDownVacatedSeparator(parent, at, vacated, sharing) {
230
290
  retireChildSpans(parent);
231
291
  const heir = parent.children?.[at];
@@ -235,23 +295,26 @@ function handDownVacatedSeparator(parent, at, vacated, sharing) {
235
295
  owned.leadingTrivia = vacated;
236
296
  }
237
297
  /**
238
- * The commit ceremony's settle door: derive the spliced window from the change and settle it
239
- * against `before`, the pre-mutate children. Nodes surviving inside the window are not removals,
240
- * so a coarse descriptor over an in-place write settles as one.
298
+ * The commit's entry point: recompute the separators around `change`'s window against `before`,
299
+ * the children before the mutation. A node that survives inside the window counts as kept.
241
300
  */
242
- export function settleSeparator(parent, before, change, sharing, tracked) {
301
+ export function settleSeparator(parent, before, change, grammar, sharing, tracked) {
243
302
  const window = splicedWindow(change);
244
303
  const children = parent.children;
245
304
  if (!window || !children)
246
305
  return change;
247
- // At the funnel's door, ahead of every arm: a window the mutate mis-derived reads `before`
248
- // out of bounds and hands the arms a negative span, which each would clamp into silence.
306
+ // Checked here, before any branch: a window the mutation mis-derived reads `before` out of
307
+ // bounds and hands the branches a negative span, which each would silently clamp.
249
308
  assertInvariant('structural-descriptor', () => checkStructuralDescriptor(change, before.length));
250
309
  const survivors = new Set(children.slice(window.at, window.at + window.added));
251
310
  const removed = before
252
311
  .slice(window.at, window.at + window.removed)
253
312
  .filter((node) => !survivors.has(node));
254
- return settleSplicedWindow(parent, window.at, removed, window.added, change, sharing, tracked);
313
+ // Only a block removed from the window's first position leaves a separator behind there; one
314
+ // absorbed below a surviving block (a forward join) takes its separator with it.
315
+ const first = before[window.at];
316
+ const vacated = first && !survivors.has(first) ? first.leadingTrivia : '';
317
+ return settleSplicedWindow(parent, window.at, removed, vacated, window.added, change, grammar, sharing, tracked);
255
318
  }
256
319
  function splicedWindow(change) {
257
320
  switch (change.op) {
@@ -266,29 +329,28 @@ function splicedWindow(change) {
266
329
  }
267
330
  }
268
331
  /**
269
- * The out-of-commit-scope twin of {@link settleSeparator}, for a container discovered by walking
270
- * the live tree: it splices through the `childIds` door and reads the pre-splice span itself.
332
+ * {@link settleSeparator} for a splice outside a commit scope, into a container found by walking
333
+ * the live tree; `spliceChildren` keeps its `childIds` in step.
271
334
  */
272
- export function spliceChildrenSettled(parent, at, removeCount, replacement, sharing) {
335
+ export function spliceChildrenSettled(parent, at, removeCount, replacement, grammar, sharing) {
273
336
  const children = parent.children;
274
337
  if (!children || at < 0 || at > children.length)
275
338
  return;
276
339
  const removed = children.slice(at, at + removeCount);
277
340
  spliceChildren(parent, at, removeCount, replacement);
278
- // `noop` in, so what comes back describes the SETTLE alone: `spliceChildren` already carried
279
- // the door's own splice into `childIds`, and out of commit scope nothing else publishes.
280
- const settled = settleSplicedWindow(parent, at, removed, replacement.length, { op: 'noop' }, sharing);
341
+ // `noop` goes in so the result describes the fix-up alone: `spliceChildren` already applied
342
+ // this function's own splice to `childIds`, and outside a commit scope nothing else writes them.
343
+ const settled = settleSplicedWindow(parent, at, removed, removed[0]?.leadingTrivia ?? '', replacement.length, { op: 'noop' }, grammar, sharing);
281
344
  const ids = parent.childIds;
282
345
  if (ids)
283
346
  applyStructuralChangeToIdsRefs(settled, ids, new Array(ids.length));
284
347
  }
285
348
  /**
286
- * A splice can leave neighbours whose adjacent bytes re-read as fewer blocks on reload. Absorb
287
- * while the window's own bytes parse to fewer blocks, which is the reload's reading; a blank run
288
- * is transparent to a container's continuation, so the window anchors at the nearest non-blank
289
- * block above the seam, never below `floor`, and cascades.
349
+ * Merge neighbours while their joined bytes reload as fewer blocks or move content into the head;
350
+ * blank lines don't end a container, so the window starts at the nearest non-blank block above.
290
351
  */
291
- export function absorbSeamReading(parent, seamLeft, floor, sharing, tracked, headProbe, onBeforeSplice) {
352
+ export function absorbSeamReading(parent, seamLeft, floor, grammar, sharing, tracked, headProbe, onBeforeSplice) {
353
+ const read = (bytes) => readBlocks(bytes, { grammar, scope: 'fragment' });
292
354
  const children = parent.children;
293
355
  if (seamLeft < 0)
294
356
  return { at: 0, span: 0, eaten: 0, spliced: false };
@@ -299,36 +361,46 @@ export function absorbSeamReading(parent, seamLeft, floor, sharing, tracked, hea
299
361
  let span = seamLeft - at + 1;
300
362
  let eaten = 0;
301
363
  let spliced = false;
302
- // Only the first pass: a fold re-tiles the window, so the probe's absolute index is stale.
364
+ // Only on the first pass: a merge re-divides the window, so the index is stale after one.
303
365
  let probe = headProbe;
304
366
  for (;;) {
305
- // The candidate edge crosses a blank run too: the absorbed content sits on the
306
- // run's far side (a list continues into indented code across any number of blanks).
367
+ // The window's far edge crosses a blank run too: the absorbed content sits on the run's
368
+ // far side (a list continues into indented code across any number of blank lines).
307
369
  let right = at + span;
308
370
  while (right < children.length && isBlankParagraph(children[right]))
309
371
  right++;
310
372
  const window = children.slice(at, Math.min(right + 1, children.length));
311
373
  if (window.length <= span || window.length < 2)
312
374
  break;
313
- // A context-dependent kind has no standalone reading, so its seam is not askable.
375
+ if (separateTableFollower(parent, right, sharing, grammar))
376
+ break;
377
+ // A context-dependent kind has no standalone reading, so a join touching it cannot be asked.
314
378
  if (window.some((node) => tryGetBlockKindDescriptor(node.kind)?.contextDependentKind))
315
379
  break;
316
- if (probe !== undefined && declinesOnHeadLine(window, probe - at))
380
+ if (probe !== undefined && declinesOnHeadLine(window, probe - at, read))
317
381
  break;
318
382
  probe = undefined;
319
- const reparsed = parse(joinedWindowBytes(window, window.length), { scope: 'fragment' });
383
+ const bytes = joinedWindowBytes(window, window.length);
384
+ const reparsed = read(bytes);
320
385
  const blocks = reparsed.children;
321
- if (blocks.length === 0 || blocks.length >= window.length)
386
+ // Content blocks only: the blank lines an absorbed block held come back as blank blocks.
387
+ if (blocks.length === 0 || contentCount(blocks) > contentCount(window))
322
388
  break;
323
- // A fold may PROMOTE the head past what its bytes carry alone (a paragraph under the
389
+ // A count that did not drop is still a merge when the head took content from the block
390
+ // below: a blank run inside that block stays blank blocks while the rest moves up.
391
+ if (blocks.length >= window.length && !headTookContent(blocks[0], window))
392
+ break;
393
+ // A merge may promote the head beyond what its bytes carry alone (a paragraph under the
324
394
  // setext underline below it), so what must survive is the head's own reading, not its kind.
325
- if (blocks[0].kind !== window[0].kind && !readsAsItselfAlone(window[0]))
395
+ if (blocks[0].kind !== window[0].kind && !readsAsItselfAlone(window[0], read))
326
396
  break;
327
397
  onBeforeSplice?.();
328
398
  absorbFragmentPeel(parent, at + window.length, reparsed.suffix, blocks, sharing);
329
399
  blocks[0].leadingTrivia = window[0].leadingTrivia;
400
+ // The window joins two blocks at least, so its bytes hold the document's line ending.
401
+ const lineEnding = firstLineEnding(bytes) ?? '\n';
330
402
  for (const block of blocks) {
331
- ensureEditableContainers(block);
403
+ ensureEditableContainers(block, lineEnding);
332
404
  if (sharing)
333
405
  sharing.stamp(block);
334
406
  assignChildIdsDeep(block);
@@ -343,20 +415,41 @@ export function absorbSeamReading(parent, seamLeft, floor, sharing, tracked, hea
343
415
  return { at, span, eaten, spliced };
344
416
  }
345
417
  /**
346
- * Whether a block's own bytes read back as that block. A structured container's children fail
347
- * this by construction (one list item's bytes read as a LIST), which is how a scope whose
348
- * children a document parse does NOT reproduce declines the seam question.
418
+ * Give a block an edit left right under a table a blank line, or the reload reads its first line
419
+ * as one more row; the edit made the block, so it stays that block.
349
420
  */
350
- function readsAsItselfAlone(node) {
351
- const alone = parse(node.raw, { scope: 'fragment' }).children;
421
+ function separateTableFollower(parent, index, sharing, grammar) {
422
+ const follower = parent.children[index];
423
+ if (parent.children[index - 1]?.kind !== 'table' || follower.leadingTrivia !== '')
424
+ return false;
425
+ // All of the follower's lines, not its first alone: an opener can need a later one to open.
426
+ const lines = splitLines(follower.raw);
427
+ if (lines.length === 0)
428
+ return false;
429
+ if (!tableTakesLine(lines, 0, lines.length, grammar))
430
+ return false;
431
+ retireChildSpans(parent);
432
+ mintSeparator(parent, index, sharing);
433
+ return true;
434
+ }
435
+ const contentCount = (nodes) => nodes.filter((node) => !isBlankParagraph(node)).length;
436
+ /** Whether the reparse moved content into the head: more than the separating blank line, or,
437
+ * for a container, that line alone, since its body reads an indented one as its own. */
438
+ function headTookContent(head, window) {
439
+ const grew = head.raw.length - window[0].raw.length;
440
+ return grew > window[1].leadingTrivia.length || (head.children !== undefined && grew > 0);
441
+ }
442
+ /** Whether a block's own bytes read back as that block. A container's children never do (an
443
+ * item's bytes read as a list), which keeps them out of the merge. */
444
+ function readsAsItselfAlone(node, read) {
445
+ const alone = read(node.raw).children;
352
446
  return alone.length === 1 && alone[0].kind === node.kind;
353
447
  }
354
448
  /**
355
- * Decline-only pre-parse for a window whose LAST member is the block that changed: join the
356
- * others with only that block's first line. Block parsing is a left-to-right line scan, so a
357
- * block opening here opens in the full join too; a pass falls through to the real parse.
449
+ * A cheap refusal for a window ending in the changed block, parsing only that block's first line:
450
+ * block parsing scans lines left to right, so a block that opens here opens in the full join too.
358
451
  */
359
- function declinesOnHeadLine(window, member) {
452
+ function declinesOnHeadLine(window, member, read) {
360
453
  if (member <= 0 || member !== window.length - 1)
361
454
  return false;
362
455
  const raw = window[member].raw;
@@ -364,10 +457,8 @@ function declinesOnHeadLine(window, member) {
364
457
  const joined = joinedWindowBytes(window, member) +
365
458
  window[member].leadingTrivia +
366
459
  (nl < 0 ? raw : raw.slice(0, nl + 1));
367
- return parse(joined, { scope: 'fragment' }).children.length >= window.length;
460
+ return read(joined).children.length >= window.length;
368
461
  }
369
- /** How a fold reads a window: the head's raw, then each of the next `count - 1` members'
370
- * leading trivia and raw. */
371
462
  function joinedWindowBytes(window, count) {
372
463
  let joined = window[0].raw;
373
464
  for (let i = 1; i < count; i++)
@@ -375,8 +466,8 @@ function joinedWindowBytes(window, count) {
375
466
  return joined;
376
467
  }
377
468
  /**
378
- * Where a byte position inside the folded window lands: the fold's own reparse re-tiles the
379
- * joined bytes, and a position past the window only shifts by what the fold ate.
469
+ * Where a byte position inside the merged window ends up: the merge's reparse re-divides the
470
+ * joined bytes, and a position past the window only shifts by the blocks the merge ate.
380
471
  */
381
472
  function retrackThroughFold(tracked, at, window, blocks) {
382
473
  const member = tracked.index - at;
@@ -397,11 +488,8 @@ function retrackThroughFold(tracked, at, window, blocks) {
397
488
  tracked.index = at + landed.index;
398
489
  tracked.offset = landed.offset;
399
490
  }
400
- /**
401
- * Map a post-edit caret offset (in the committed text) to the parsed block it falls in, as a
402
- * local display offset. An offset inside inter-block trivia lands at the next block's start;
403
- * past-the-end clamps to the last.
404
- */
491
+ /** The block a caret offset into the committed bytes falls in, and its offset there. An offset in
492
+ * the blank lines between blocks lands at the next block's start. */
405
493
  export function focusTargetInReplacement(nodes, offset) {
406
494
  let pos = 0;
407
495
  for (let i = 0; i < nodes.length; i++) {
@@ -415,19 +503,15 @@ export function focusTargetInReplacement(nodes, offset) {
415
503
  const last = nodes.length - 1;
416
504
  return { index: last, offset: trimTrailingLineEnding(nodes[last].raw).length };
417
505
  }
418
- /**
419
- * The seam question at every join the splice at `at` disturbed, its window's two edges and the
420
- * joins inside it, since a move can invalidate a join that was already correct. Each fold
421
- * cascades downward. `headProbe` names the one block whose bytes changed, letting each ask
422
- * decline on its first line alone; dropped once anything folds, since its index has moved.
423
- */
424
- export function absorbWindowSeams(parent, at, added, landing, change, sharing, tracked, headProbe, onBeforeSplice) {
506
+ /** Merge across every join the splice at `at` disturbed, the joins inside the window included,
507
+ * since a move can break a join that was correct. `headProbe` names the one changed block. */
508
+ export function absorbWindowSeams(parent, at, added, landing, change, grammar, sharing, tracked, headProbe, onBeforeSplice) {
425
509
  let settled = null;
426
510
  let moved = landing;
427
511
  let seamLeft = at - 1;
428
512
  let last = at + added - 1;
429
513
  while (seamLeft <= last) {
430
- const seam = absorbSeamReading(parent, seamLeft, 0, sharing, tracked, settled ? undefined : headProbe, onBeforeSplice);
514
+ const seam = absorbSeamReading(parent, seamLeft, 0, grammar, sharing, tracked, settled ? undefined : headProbe, onBeforeSplice);
431
515
  if (!seam.spliced) {
432
516
  seamLeft++;
433
517
  continue;
@@ -441,8 +525,8 @@ export function absorbWindowSeams(parent, at, added, landing, change, sharing, t
441
525
  return { change, landing: moved };
442
526
  return { change: foldAbsorbIntoChange(change, settled), landing: moved };
443
527
  }
444
- /** Two folds as ONE window, which is what a change descriptor reports. The walk is left to
445
- * right, so `later` never opens above `earlier`'s post-splice span. */
528
+ /** Two merges as one window, which is what a change descriptor reports. The walk is left to
529
+ * right, so `later` never starts above `earlier`'s post-splice span. */
446
530
  function unionAbsorptions(earlier, later) {
447
531
  return {
448
532
  at: earlier.at,
@@ -451,18 +535,15 @@ function unionAbsorptions(earlier, later) {
451
535
  spliced: true
452
536
  };
453
537
  }
454
- /** Where `index` sits once `seam` folded: a slot inside the absorbed span collapses into it. */
538
+ /** Where `index` sits once `seam` merged: a position inside the absorbed span collapses into it. */
455
539
  function indexAfterAbsorb(index, seam) {
456
540
  if (index < seam.at)
457
541
  return index;
458
542
  const absorbedTo = seam.at + seam.span + seam.eaten;
459
543
  return index >= absorbedTo ? index - seam.eaten : Math.min(index, seam.at + seam.span - 1);
460
544
  }
461
- /**
462
- * The absorbed window folded into the write's own, as the ONE contiguous window the sink
463
- * reports: `count` counts pre-write slots, so the union's span converts back across whatever
464
- * the write itself added or removed.
465
- */
545
+ /** The merged window and the write's own as one contiguous change; `count` counts positions
546
+ * before the write, so the span converts back across what the write added or removed. */
466
547
  function foldAbsorbIntoChange(change, seam) {
467
548
  const absorbedTo = seam.at + seam.span + seam.eaten;
468
549
  if (change.op === 'noop') {
@@ -488,18 +569,15 @@ function foldAbsorbIntoChange(change, seam) {
488
569
  idMap: composeFoldIdMap(change, seam, { lo, count, newCount, written, removed })
489
570
  };
490
571
  }
491
- /**
492
- * Identity through the fold: a slot the absorb did not re-mint still holds the block the change
493
- * put there, so its id composes through both steps instead of resetting. Slot 0 keeps the head
494
- * mapping wherever the walk has none, since a fold EXTENDS its head, kind promotion included.
495
- */
572
+ /** A position the merge did not re-create keeps its block's id through both steps. Position 0
573
+ * always maps to the head, since a merge extends its head, even when it changes its kind. */
496
574
  function composeFoldIdMap(change, seam, window) {
497
575
  const idMap = {};
498
576
  for (let slot = 0; slot < window.newCount; slot++) {
499
577
  const index = window.lo + slot;
500
578
  if (index >= seam.at && index < seam.at + seam.span)
501
579
  continue;
502
- // Back through the fold: a slot past the absorbed span sat `eaten` further down before it.
580
+ // Back through the merge: a position past the absorbed span sat `eaten` further down before it.
503
581
  const spliced = index < seam.at ? index : index + seam.eaten;
504
582
  const old = preChangeIndex(change, spliced, window);
505
583
  if (old === null)
@@ -512,7 +590,8 @@ function composeFoldIdMap(change, seam, window) {
512
590
  idMap[0] = 0;
513
591
  return idMap;
514
592
  }
515
- /** Where `spliced` (a post-change index) stood before the change, or null for a slot it minted. */
593
+ /** Where `spliced` (a post-change index) stood before the change, or null for a block the change
594
+ * created. */
516
595
  function preChangeIndex(change, spliced, window) {
517
596
  if (change.op === 'noop')
518
597
  return spliced;
@@ -523,29 +602,31 @@ function preChangeIndex(change, spliced, window) {
523
602
  const inherited = change.op === 'replace' ? change.idMap?.[spliced - change.at] : undefined;
524
603
  return inherited === undefined ? null : change.at + inherited;
525
604
  }
526
- /**
527
- * Where the fragment parse's peeled trailing blank run goes. At the parent's tail it stays in the
528
- * last block's raw, the single-slot sink's rule; mid-document it joins the follower's run, where
529
- * one line separates and every later one is a block of its own (syntax-tree.md § Blank lines).
530
- */
605
+ /** The fragment parse's trailing blank run stays in the last block's raw at the parent's tail and
606
+ * joins the follower's run elsewhere (`docs/design/syntax-tree.md` § Blank lines). */
531
607
  function absorbFragmentPeel(parent, followerIndex, peel, blocks, sharing) {
532
608
  const follower = parent.children[followerIndex];
533
609
  if (!follower) {
534
610
  blocks[blocks.length - 1].raw += peel;
535
611
  return;
536
612
  }
537
- if (peel === '')
613
+ // Blocks ending blank already hold the run's one separating line, so every line of the
614
+ // follower's own becomes a blank block of the run instead of a second separator.
615
+ const runSeparated = isBlankParagraph(blocks[blocks.length - 1]);
616
+ if (peel === '' && !(runSeparated && follower.leadingTrivia !== ''))
538
617
  return;
539
618
  const lines = blankLinesOf(peel + follower.leadingTrivia);
540
619
  const owned = sharing ? ensureUnsharedChild(parent, followerIndex, sharing) : follower;
541
- owned.leadingTrivia = lines.length > 1 ? '' : lines[0];
542
- for (let i = 1; i < lines.length; i++) {
543
- blocks.push({ kind: 'paragraph', leadingTrivia: i === 1 ? lines[0] : '', raw: lines[i] });
620
+ owned.leadingTrivia = lines.length > 1 || runSeparated ? '' : lines[0];
621
+ const first = runSeparated ? 0 : 1;
622
+ for (let i = first; i < lines.length; i++) {
623
+ const trivia = !runSeparated && i === 1 ? lines[0] : '';
624
+ blocks.push({ kind: 'paragraph', leadingTrivia: trivia, raw: lines[i] });
544
625
  }
545
626
  }
546
627
  /** A blank run split back into the lines it is made of, each keeping its own ending. */
547
628
  const blankLinesOf = (run) => run.match(/[^\n]*\n|[^\n]+$/g) ?? [];
548
- /** The materialized tail reported inside the sink's one contiguous window. */
629
+ /** The tail line that became a block, reported inside the caller's one contiguous window. */
549
630
  export function widenForTailMint(change, before, after) {
550
631
  const grown = after - before;
551
632
  if (grown === 0)
@@ -558,16 +639,18 @@ export function widenForTailMint(change, before, after) {
558
639
  if (change.op === 'replace' && change.at + change.newCount === before) {
559
640
  return { ...change, newCount: change.newCount + grown };
560
641
  }
561
- // A delete that took the tail vacated the slot the mint lands in, so the two are one window.
642
+ // A delete that took the tail vacated the position the new block lands in, so the two are
643
+ // one window.
562
644
  if (change.op === 'delete' && change.at === before) {
563
645
  return { op: 'replace', at: change.at, count: change.count, newCount: grown };
564
646
  }
565
- // The mint landed past a window that does not reach the tail, so no single contiguous
566
- // span describes both; the parallel arrays would drift either way this widened it.
647
+ // The new block landed past a window that does not reach the tail, so no single contiguous
648
+ // span describes both; the parallel id arrays would drift either way this widened it.
567
649
  devWarn('tree-ops', 'a tail suffix materialized outside the reported window');
568
650
  return change;
569
651
  }
570
- /** A blank line off the node's own bytes (G4.20), where one does structural work at all. */
652
+ /** Give the block at `index` a blank line where one separates anything; the line reuses the
653
+ * ending of the block above, which is the document's. */
571
654
  function mintSeparator(parent, index, sharing) {
572
655
  const children = parent.children;
573
656
  if (!children || index <= bodyStartIndex(parent))
@@ -577,49 +660,48 @@ function mintSeparator(parent, index, sharing) {
577
660
  const owned = sharing
578
661
  ? ensureUnsharedChild(parent, index, sharing)
579
662
  : children[index];
580
- owned.leadingTrivia = trailingLineEnding(owned.raw);
663
+ owned.leadingTrivia = ownTrailingLineEnding(children[index - 1].raw);
581
664
  }
582
- /** Reserved chrome is not a body block, so the body window opens past it. */
665
+ /** A container's reserved title child is not a body block, so the body starts past it. */
583
666
  function bodyStartIndex(parent) {
584
667
  return bodyStartFor(ownerKindNameOf(parent));
585
668
  }
586
- /** The container's declared body wrap, whichever shape names the owner. */
669
+ /** The owning container's declared body wrap, whichever parent shape names it. */
587
670
  function bodyWrapOf(parent) {
588
671
  const kind = ownerKindNameOf(parent);
589
672
  if (kind === undefined)
590
673
  return undefined;
591
674
  return tryGetBlockKindDescriptor(kind)?.bodyWrap;
592
675
  }
593
- /** The node carrying the wrap's peel slots: the sink's answer, or the parent when it IS the node. */
676
+ /** The node holding `innerPrefix`/`innerSuffix`: the owner the caller named, or the parent itself
677
+ * when it is a node. */
594
678
  function wrapSlotsOf(parent) {
595
679
  return ownerNodeOf(parent);
596
680
  }
597
- /** The container node these children belong to, where the caller answered for one. */
681
+ /** The container node these children belong to, where the caller named one. */
598
682
  function ownerNodeOf(parent) {
599
683
  return parent.owner ?? ('raw' in parent ? parent : undefined);
600
684
  }
601
685
  /**
602
- * Every settle door rewrites bytes the owner's child spans describe while leaving the children's
603
- * shape alone, so the spans retire at the doors and the next rebuild re-derives them.
686
+ * Every separator write here changes bytes the owner's child spans describe without changing the
687
+ * children's shape, so the spans are dropped here and the next rebuild re-derives them.
604
688
  */
605
689
  function retireChildSpans(parent) {
606
690
  const owner = ownerNodeOf(parent);
607
691
  if (owner)
608
692
  dropChildSpans(owner);
609
693
  }
610
- /** The kind whose body these children are: the sink's answer, or the owner node's own. */
611
- function ownerKindNameOf(parent) {
612
- return 'ownerKind' in parent ? parent.ownerKind : parent.kind;
694
+ /** The kind whose body these children are: the named owner's, or the parent node's own. */
695
+ export function ownerKindNameOf(parent) {
696
+ return 'owner' in parent ? parent.owner?.kind : parent.kind;
613
697
  }
614
698
  function bodyStartFor(kind) {
615
699
  if (kind === undefined)
616
700
  return 0;
617
701
  return tryGetBlockKindDescriptor(kind)?.reservedChrome ? 1 : 0;
618
702
  }
619
- /**
620
- * A chrome-wrapped container's parse peels the blank line against its opener into `innerPrefix`,
621
- * so a separator freed above the body head is that line: hand it over, or the peel eats the head.
622
- */
703
+ /** The parser keeps the blank line after a fenced container's opener in `innerPrefix`, so a
704
+ * separator freed at the body head moves there, or the reload takes the head's own line. */
623
705
  function absorbWrapPrefix(parent, bodyStart, index, freed) {
624
706
  const slots = wrapSlotsOf(parent);
625
707
  if (!slots || (slots.innerPrefix ?? '') !== '')
@@ -631,15 +713,12 @@ function absorbWrapPrefix(parent, bodyStart, index, freed) {
631
713
  return;
632
714
  if (index !== bodyStart && !isBlankParagraph(head))
633
715
  return;
634
- slots.innerPrefix = trailingLineEnding(freed);
716
+ slots.innerPrefix = ownTrailingLineEnding(freed);
635
717
  }
636
718
  // ── Delete ──
637
- /**
638
- * Remove the node at `blockIndex`, leaving the next sibling separated from its new predecessor
639
- * and no more. Takes {@link BodyParentArg} because the settle can hand a freed line to the
640
- * owner's wrap slots; the successor's trivia is the op's only in-place write.
641
- */
642
- export function deleteNode(parent, blockIndex, sharing) {
719
+ /** Remove the node at `blockIndex`, leaving its successor separated once and no more. Takes
720
+ * {@link BodyParentArg} since the fix-up can move a freed line into the owner's `innerPrefix`. */
721
+ export function deleteNode(parent, blockIndex, grammar, sharing, tracked) {
643
722
  if (blockIndex < 0 || blockIndex >= parent.children.length)
644
723
  return { op: 'noop' };
645
724
  const deleted = parent.children[blockIndex];
@@ -653,8 +732,8 @@ export function deleteNode(parent, blockIndex, sharing) {
653
732
  }
654
733
  parent.children.splice(blockIndex, 1);
655
734
  clearRedundantSeparator(parent, blockIndex, sharing);
656
- // BOTH the survivor's edges: the delete puts it beside a new follower, and a merge door that
735
+ // Both of the survivor's edges: the delete puts it beside a new follower, and a merge that
657
736
  // rewrote its bytes can equally have stopped it interrupting the block above.
658
737
  const survivor = Math.max(blockIndex - 1, 0);
659
- return absorbWindowSeams(parent, survivor, blockIndex - survivor, blockIndex, { op: 'delete', at: blockIndex, count: 1 }, sharing).change;
738
+ return absorbWindowSeams(parent, survivor, blockIndex - survivor, blockIndex, { op: 'delete', at: blockIndex, count: 1 }, grammar, sharing, tracked).change;
660
739
  }