@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
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Replacing a range of one leaf, and joining two leaves, the way in-leaf edits and merges
3
+ * write them: cut back to the painted text, off any surrogate pair, and in live mode with the
4
+ * delimiter runs the join strands dropped, typed text included (`docs/design/live-mode.md` § 4.5).
5
+ */
6
+ import { ownTrailingLineEnding, snapToScalarBoundary, trimTrailingLineEnding } from '../core/lines';
7
+ import { getLiveJoinSeamCleaner } from '../schema/inline-construct-policy';
8
+ import { normalizeOwnRaw } from './node-primitives';
9
+ import { cutBeforeSuffix, joinKeepingSuffix } from './structural-suffix';
10
+ /** `[start, end)` of `node` replaced by `typed`, the join cleaned against where `store` keeps it. */
11
+ export function replaceRangeInLeaf(node, range, typed, store) {
12
+ // Only a drawn range can reach bytes the user never saw; a caret insert goes where the caret is.
13
+ const painted = range.start !== range.end && store.reading.hidesDelimitersAtCaret()
14
+ ? { start: cutBeforeSuffix(node, range.start), end: cutBeforeSuffix(node, range.end) }
15
+ : range;
16
+ const start = snapToScalarBoundary(node.raw, painted.start);
17
+ // An inverted range replaces nothing: the text goes in at its start.
18
+ const end = Math.max(start, snapToScalarBoundary(node.raw, painted.end));
19
+ if (start < end) {
20
+ const join = cleanJoin({ node, offset: start }, { node, offset: end }, typed, store, same);
21
+ if (join.cleaned) {
22
+ const { raw, seam } = withTyped(join.joined, typed);
23
+ return { raw, caret: seam + typed.length, range: { start, end }, matchesBrowserEdit: false };
24
+ }
25
+ }
26
+ const display = trimTrailingLineEnding(node.raw);
27
+ return {
28
+ raw: display.slice(0, start) + typed + display.slice(end) + ownTrailingLineEnding(node.raw),
29
+ caret: start + typed.length,
30
+ range: { start, end },
31
+ matchesBrowserEdit: start === range.start && end === range.end
32
+ };
33
+ }
34
+ /** The bytes `head` up to its offset and `tail` from its offset make with `typed` between them,
35
+ * `seam` where `typed` starts. `tail`'s bytes take its kind's write rule, in `lineEnding`. */
36
+ export function joinLeaves(head, tail, typed, store, lineEnding) {
37
+ const writeTail = (bytes) => normalizeOwnRaw(tail.node, bytes, lineEnding);
38
+ return withTyped(cleanJoin(head, tail, typed, store, writeTail).joined, typed);
39
+ }
40
+ /** `join.mergedRaw` minus the delimiter runs the join left unpaired, where the reading hides
41
+ * delimiters. */
42
+ export function cleanJoinedRaw(join) {
43
+ const literal = { raw: join.mergedRaw, seam: join.seam };
44
+ if (!join.store.reading.hidesDelimitersAtCaret())
45
+ return literal;
46
+ return getLiveJoinSeamCleaner()?.(join) ?? literal;
47
+ }
48
+ // ── The join ─────────────────────────────────────────────────────────────────
49
+ function cleanJoin(head, tail, typed, store, writeTail) {
50
+ const merged = joinKeepingSuffix(head.node, head.offset, tail.node, tail.offset, writeTail);
51
+ const joined = cleanJoinedRaw({
52
+ mergedRaw: merged.raw,
53
+ seam: merged.start,
54
+ start: { node: head.node, offset: merged.start },
55
+ end: { node: tail.node, offset: merged.end },
56
+ typed,
57
+ store
58
+ });
59
+ return { joined, cleaned: joined.raw !== merged.raw };
60
+ }
61
+ /** The tail of a range inside one leaf: that leaf's write rule runs once, when the bytes are
62
+ * installed. */
63
+ const same = (bytes) => bytes;
64
+ const withTyped = (join, typed) => ({
65
+ raw: join.raw.slice(0, join.seam) + typed + join.raw.slice(join.seam),
66
+ seam: join.seam
67
+ });
@@ -1,7 +1,6 @@
1
1
  import type { NodeView } from '../../core/node-views';
2
2
  /**
3
- * A list item is "user-empty" when every leaf descendant's raw is blank. Deliberately
4
- * stronger than testing the first child: a shallow check drops trailing content whenever
5
- * the first paragraph happens to be empty.
3
+ * A list item is empty to the user when every leaf's raw is blank; checking only the first child
4
+ * would drop trailing content under an empty first paragraph.
6
5
  */
7
6
  export declare function isItemUserEmpty(item: NodeView): boolean;
@@ -1,7 +1,7 @@
1
+ import { isBlankText } from '../../core/lines';
1
2
  /**
2
- * A list item is "user-empty" when every leaf descendant's raw is blank. Deliberately
3
- * stronger than testing the first child: a shallow check drops trailing content whenever
4
- * the first paragraph happens to be empty.
3
+ * A list item is empty to the user when every leaf's raw is blank; checking only the first child
4
+ * would drop trailing content under an empty first paragraph.
5
5
  */
6
6
  export function isItemUserEmpty(item) {
7
7
  if (!item.children || item.children.length === 0)
@@ -11,7 +11,7 @@ export function isItemUserEmpty(item) {
11
11
  if (!isItemUserEmpty(child))
12
12
  return false;
13
13
  }
14
- else if ((child.raw ?? '').trim() !== '') {
14
+ else if (!isBlankText(child.raw ?? '')) {
15
15
  return false;
16
16
  }
17
17
  }
@@ -1,13 +1,11 @@
1
1
  import type { CstNode } from '../../core/nodes';
2
2
  import type { NodeView } from '../../core/node-views';
3
+ import type { LineEnding } from '../../core/lines';
3
4
  /**
4
- * The parent-level replacement when a list item exits its list, laid out as
5
- * `[firstHalfList?, exitParagraph, ...liftedBlocks, secondHalfList?]`. Matching-type
6
- * nested items rejoin the surviving halves; everything else lifts as a top-level block.
7
- * `paragraphIndex` is the exit paragraph's slot, the caller's focus target. Input is not
8
- * mutated.
5
+ * The replacement when an item exits its list: the list's halves around a fresh exit paragraph at
6
+ * `paragraphIndex`, the item's same-type nested items rejoining the halves and the rest lifted.
9
7
  */
10
- export declare function buildExitReplacement(list: NodeView, itemIndex: number): {
8
+ export declare function buildExitReplacement(list: NodeView, itemIndex: number, lineEnding: LineEnding): {
11
9
  blocks: CstNode[];
12
10
  paragraphIndex: number;
13
11
  };
@@ -1,18 +1,14 @@
1
1
  import { metadataOf } from '../../core/nodes';
2
- import { trailingLineEnding } from '../../core/lines';
3
2
  import { cloneNode } from '../clone';
4
3
  import { emptyParagraph } from '../node-primitives';
5
4
  import { assembleListHalf } from './list-builders';
6
5
  import { partitionItemChildren } from './item-partition';
7
6
  import { orderedBaseOf } from './ordered-markers';
8
7
  /**
9
- * The parent-level replacement when a list item exits its list, laid out as
10
- * `[firstHalfList?, exitParagraph, ...liftedBlocks, secondHalfList?]`. Matching-type
11
- * nested items rejoin the surviving halves; everything else lifts as a top-level block.
12
- * `paragraphIndex` is the exit paragraph's slot, the caller's focus target. Input is not
13
- * mutated.
8
+ * The replacement when an item exits its list: the list's halves around a fresh exit paragraph at
9
+ * `paragraphIndex`, the item's same-type nested items rejoining the halves and the rest lifted.
14
10
  */
15
- export function buildExitReplacement(list, itemIndex) {
11
+ export function buildExitReplacement(list, itemIndex, lineEnding) {
16
12
  const items = list.children ?? [];
17
13
  const exitedItem = items[itemIndex];
18
14
  const parentOrdered = metadataOf(list, 'list')?.ordered ?? false;
@@ -24,8 +20,7 @@ export function buildExitReplacement(list, itemIndex) {
24
20
  const wasFirstItem = itemIndex === 0;
25
21
  const firstHalfItems = wasFirstItem ? [] : [...before, ...promotedItems];
26
22
  const secondHalfItems = wasFirstItem ? [...promotedItems, ...after] : after;
27
- // Every byte this op mints is a line ending, so it takes the list's (G4.20).
28
- const lineEnding = trailingLineEnding(list.raw);
23
+ // Every byte this op creates is a line ending, the document's.
29
24
  const exitParagraph = emptyParagraph('', lineEnding);
30
25
  // Preserve the original list's starting number across the split.
31
26
  const base = orderedBaseOf(items[0]);
@@ -1,6 +1,6 @@
1
1
  /**
2
- * The promote/lift partition U1 and the empty-item exit share: a nested list whose `ordered`
3
- * matches the parent gives its items to the parent level, everything else lifts out as a
2
+ * The partition the first-item unwrap and the empty-item exit share: a nested list whose
3
+ * `ordered` matches the parent gives its items to the parent level, everything else lifts out as a
4
4
  * sibling block. Output is fully owned; the input is not mutated.
5
5
  */
6
6
  import type { CstNode } from '../../core/nodes';
@@ -1,6 +1,6 @@
1
1
  /**
2
- * The promote/lift partition U1 and the empty-item exit share: a nested list whose `ordered`
3
- * matches the parent gives its items to the parent level, everything else lifts out as a
2
+ * The partition the first-item unwrap and the empty-item exit share: a nested list whose
3
+ * `ordered` matches the parent gives its items to the parent level, everything else lifts out as a
4
4
  * sibling block. Output is fully owned; the input is not mutated.
5
5
  */
6
6
  import { metadataOf } from '../../core/nodes';
@@ -1,14 +1,17 @@
1
1
  /** Constructors for list and listItem CST nodes. */
2
2
  import type { CstNode, ListItemMetadata } from '../../core/nodes';
3
3
  import type { NodeView } from '../../core/node-views';
4
+ import { type LineEnding } from '../../core/lines';
5
+ import { type FragmentReader } from './task-paragraph';
6
+ import type { GrammarView } from '../../schema/block-openers';
4
7
  /**
5
8
  * A list node carrying `items`, mirroring `template`'s metadata and affixes and
6
9
  * renumbering ordered markers from `startNumber`. Items are mutated in place.
7
10
  */
8
11
  export declare function assembleListHalf(template: NodeView, items: CstNode[], startNumber: number): CstNode;
9
12
  /**
10
- * A listItem mirroring `template`'s metadata/affixes. `children` are placed verbatim —
11
- * clone before passing if they are still referenced from the source tree.
13
+ * A listItem mirroring `template`'s metadata/affixes. `children` are placed verbatim, so
14
+ * clone them before passing if they are still referenced from the source tree.
12
15
  */
13
16
  export declare function buildListItemWithContent(template: NodeView, children: CstNode[]): CstNode;
14
17
  /**
@@ -17,28 +20,27 @@ export declare function buildListItemWithContent(template: NodeView, children: C
17
20
  */
18
21
  export declare function buildListItem(metadata: ListItemMetadata, children: CstNode[]): CstNode;
19
22
  /**
20
- * A bare list shell with empty raw. Unlike `assembleListHalf` it neither renumbers nor
21
- * rebuilds raw; a live-tree caller owns that and must route it through `sharing` so the
22
- * moved items are unshared before being written (`unshare.ts`).
23
+ * A bare list shell that neither renumbers nor rebuilds raw; a live-tree caller does both through
24
+ * `sharing`, so the moved items are copied before being written.
23
25
  */
24
26
  export declare function buildListShell(ordered: boolean, children: CstNode[]): CstNode;
25
27
  /**
26
- * Slice a leaf's raw at `offset` for a paste-style split, re-parsing each half. One
27
- * leading whitespace is trimmed from the trailing slice, which would otherwise produce
28
- * double-space markers after a word-boundary split. Null on an empty side. `raw` overrides
29
- * the leaf's own bytes, which a paste that ran a delete half first supplies.
28
+ * Split a leaf's raw at `offset` for a paste, each half read as its landing slot reads it, the
29
+ * trailing half losing one leading space or tab so the new marker's space isn't doubled.
30
30
  */
31
- export declare function splitLeafForPaste(leaf: CstNode, offset: number, raw?: string): {
31
+ export declare function splitLeafForPaste(leaf: CstNode, offset: number, ending: LineEnding, raw: string | undefined, read: {
32
+ leading: FragmentReader;
33
+ trailing: FragmentReader;
34
+ }): {
32
35
  leadingNode: CstNode | null;
33
- trailingNode: CstNode | null;
34
- lineEnding: '\n' | '\r\n';
36
+ trailingNodes: CstNode[];
37
+ lineEnding: LineEnding;
35
38
  };
36
39
  /**
37
- * The leading and trailing items replacing `item` when a paste splits it at
38
- * `(innerIndex, offset)`. Either side is null when the caret sits flush against a
39
- * boundary. `targetRaw` overrides the target leaf's bytes, as in `splitLeafForPaste`.
40
+ * The items replacing `item` when a paste splits it at `(innerIndex, offset)`; either is null when
41
+ * the caret sits flush against a boundary.
40
42
  */
41
- export declare function buildSplitItems(item: CstNode, innerIndex: number, offset: number, targetRaw?: string): {
43
+ export declare function buildSplitItems(item: CstNode, innerIndex: number, offset: number, ending: LineEnding, targetRaw: string | undefined, grammar: GrammarView): {
42
44
  leadingItem: CstNode | null;
43
45
  trailingItem: CstNode | null;
44
46
  };
@@ -1,10 +1,14 @@
1
1
  /** Constructors for list and listItem CST nodes. */
2
- import { snapToScalarBoundary, trailingLineEnding, trimTrailingLineEnding } from '../../core/lines';
2
+ import { trailingLineEnding } from '../../core/lines';
3
3
  import { rebuildListItemRaw, rebuildListRaw } from '../../schema/container-rebuilders';
4
4
  import { cloneMetadata, cloneNode } from '../clone';
5
- import { parseFirstBlock } from '../parse-block';
5
+ import { parseCutResidue, parseFirstBlock } from '../parse-block';
6
+ import { cutKeepingStructure } from '../structural-suffix';
6
7
  import { renumberOrderedListFrom } from './ordered-markers';
7
8
  import { assignIds } from '../../block-id';
9
+ import { readBlocks } from '../../core/parser';
10
+ import { emptyParagraph } from '../node-primitives';
11
+ import { fragmentReaderAt } from './task-paragraph';
8
12
  // ── List / item construction ─────────────────────────────────────────────────
9
13
  /**
10
14
  * A list node carrying `items`, mirroring `template`'s metadata and affixes and
@@ -32,8 +36,8 @@ export function assembleListHalf(template, items, startNumber) {
32
36
  return half;
33
37
  }
34
38
  /**
35
- * A listItem mirroring `template`'s metadata/affixes. `children` are placed verbatim —
36
- * clone before passing if they are still referenced from the source tree.
39
+ * A listItem mirroring `template`'s metadata/affixes. `children` are placed verbatim, so
40
+ * clone them before passing if they are still referenced from the source tree.
37
41
  */
38
42
  export function buildListItemWithContent(template, children) {
39
43
  const metadata = template.metadata
@@ -66,9 +70,8 @@ function mintListItem(metadata, innerPrefix, innerSuffix, children) {
66
70
  return item;
67
71
  }
68
72
  /**
69
- * A bare list shell with empty raw. Unlike `assembleListHalf` it neither renumbers nor
70
- * rebuilds raw; a live-tree caller owns that and must route it through `sharing` so the
71
- * moved items are unshared before being written (`unshare.ts`).
73
+ * A bare list shell that neither renumbers nor rebuilds raw; a live-tree caller does both through
74
+ * `sharing`, so the moved items are copied before being written.
72
75
  */
73
76
  export function buildListShell(ordered, children) {
74
77
  const metadata = { ordered };
@@ -83,47 +86,73 @@ export function buildListShell(ordered, children) {
83
86
  }
84
87
  // ── Paste split ──────────────────────────────────────────────────────────────
85
88
  /**
86
- * Slice a leaf's raw at `offset` for a paste-style split, re-parsing each half. One
87
- * leading whitespace is trimmed from the trailing slice, which would otherwise produce
88
- * double-space markers after a word-boundary split. Null on an empty side. `raw` overrides
89
- * the leaf's own bytes, which a paste that ran a delete half first supplies.
89
+ * Split a leaf's raw at `offset` for a paste, each half read as its landing slot reads it, the
90
+ * trailing half losing one leading space or tab so the new marker's space isn't doubled.
90
91
  */
91
- export function splitLeafForPaste(leaf, offset, raw = leaf.raw) {
92
- const lineEnding = trailingLineEnding(raw);
93
- const display = trimTrailingLineEnding(raw);
94
- // Off any scalar interior first: the halves become separate items, so a pair cut here is
95
- // unrecoverable bytes rather than a recoverable edit.
96
- const cut = snapToScalarBoundary(display, offset);
97
- const leadingText = display.slice(0, cut);
98
- const trailingText = display.slice(cut).replace(/^[ \t]/, '');
99
- const leadingNode = leadingText.length > 0 ? parseFirstBlock(leadingText + lineEnding) : null;
100
- const trailingNode = trailingText.length > 0 ? parseFirstBlock(trailingText + lineEnding) : null;
101
- return { leadingNode, trailingNode, lineEnding };
92
+ export function splitLeafForPaste(leaf, offset, ending, raw = leaf.raw, read) {
93
+ const lineEnding = trailingLineEnding(raw, ending);
94
+ const { head: leadingText, rest } = cutKeepingStructure({ ...leaf, raw }, offset);
95
+ const trailingText = rest.replace(/^[ \t]/, '');
96
+ const leadingNode = leadingText.length > 0 ? parseFirstBlock(leadingText + lineEnding, read.leading) : null;
97
+ // The line the cut ended is dropped: the trailing item's marker starts a line of its own.
98
+ const trailingNodes = parseCutResidue(trailingText, lineEnding, read.trailing).blocks;
99
+ return { leadingNode, trailingNodes, lineEnding };
102
100
  }
103
101
  /**
104
- * The leading and trailing items replacing `item` when a paste splits it at
105
- * `(innerIndex, offset)`. Either side is null when the caret sits flush against a
106
- * boundary. `targetRaw` overrides the target leaf's bytes, as in `splitLeafForPaste`.
102
+ * The items replacing `item` when a paste splits it at `(innerIndex, offset)`; either is null when
103
+ * the caret sits flush against a boundary.
107
104
  */
108
- export function buildSplitItems(item, innerIndex, offset, targetRaw) {
105
+ export function buildSplitItems(item, innerIndex, offset, ending, targetRaw, grammar) {
109
106
  if (!item.children)
110
107
  return { leadingItem: null, trailingItem: null };
111
108
  const targetLeaf = item.children[innerIndex];
112
109
  if (!targetLeaf)
113
110
  return { leadingItem: null, trailingItem: null };
114
- const { leadingNode, trailingNode } = splitLeafForPaste(targetLeaf, offset, targetRaw ?? targetLeaf.raw);
111
+ // Both halves keep the item's marker, so the leading one stays at `innerIndex` under it and
112
+ // the trailing one opens its own copy of the item.
113
+ const { leadingNode, trailingNodes, lineEnding } = splitLeafForPaste(targetLeaf, offset, ending, targetRaw ?? targetLeaf.raw, {
114
+ leading: fragmentReaderAt(item, innerIndex, grammar),
115
+ trailing: fragmentReaderAt(item, 0, grammar)
116
+ });
115
117
  const leadingChildren = item.children.slice(0, innerIndex).map(cloneNode);
116
118
  if (leadingNode)
117
119
  leadingChildren.push(leadingNode);
118
120
  const trailingChildren = [];
119
- if (trailingNode)
120
- trailingChildren.push(trailingNode);
121
+ for (const node of trailingNodes)
122
+ trailingChildren.push(node);
121
123
  for (const c of item.children.slice(innerIndex + 1))
122
124
  trailingChildren.push(cloneNode(c));
123
125
  if (trailingChildren[0])
124
126
  trailingChildren[0].leadingTrivia = '';
125
127
  return {
126
128
  leadingItem: leadingChildren.length > 0 ? buildListItemWithContent(item, leadingChildren) : null,
127
- trailingItem: trailingChildren.length > 0 ? buildListItemWithContent(item, trailingChildren) : null
129
+ trailingItem: trailingChildren.length > 0
130
+ ? trailingItemFor(item, trailingChildren, lineEnding, grammar)
131
+ : null
128
132
  };
129
133
  }
134
+ /**
135
+ * The item holding the text after a split, its first block on the marker line unless the reload
136
+ * reads that line otherwise (indented code reads as a wider marker), then below an empty marker.
137
+ */
138
+ function trailingItemFor(template, children, lineEnding, grammar) {
139
+ const onMarkerLine = buildListItemWithContent(template, children);
140
+ if (readsBackAsBuilt(onMarkerLine, grammar))
141
+ return onMarkerLine;
142
+ const belowMarker = buildListItemWithContent(template, [
143
+ emptyParagraph('', lineEnding),
144
+ ...children
145
+ ]);
146
+ return readsBackAsBuilt(belowMarker, grammar) ? belowMarker : onMarkerLine;
147
+ }
148
+ /** Whether `item`'s bytes, read alone, give back one item holding the same blocks. */
149
+ function readsBackAsBuilt(item, grammar) {
150
+ const blocks = readBlocks(item.raw, { grammar, scope: 'fragment' }).children;
151
+ const list = blocks.length === 1 && blocks[0].kind === 'list' ? blocks[0] : null;
152
+ const read = list?.children?.length === 1 ? list.children[0] : null;
153
+ const built = item.children ?? [];
154
+ return (read?.children?.length === built.length &&
155
+ read.children.every((child, i) => child.kind === built[i].kind &&
156
+ child.raw === built[i].raw &&
157
+ child.leadingTrivia === built[i].leadingTrivia));
158
+ }
@@ -9,28 +9,19 @@ export declare function readOrderedSuffix(list: NodeView): string;
9
9
  /** Increment an ordered marker's numeric prefix, preserving its suffix. */
10
10
  export declare function bumpOrderedMarker(marker: string): string;
11
11
  /**
12
- * Renumber an ordered list's items in place from `fromIndex`, preserving marker suffixes.
13
- * `fromIndex = 0` resets the sequence to 1; `renumberOrderedListFrom` owns non-1 bases.
14
- * Every renumbered item's metadata and raw is WRITTEN, so a live-tree caller must pass
15
- * `sharing`; construction-time callers on fresh nodes may omit it.
12
+ * Renumber an ordered list's items from `fromIndex`, keeping marker suffixes. Each item's metadata
13
+ * and raw is written, so a caller on the live tree must pass `sharing`.
16
14
  */
17
15
  export declare function renumberOrderedList(list: CstNode, fromIndex?: number, sharing?: SharingState): void;
18
- /**
19
- * Renumber an ordered list from an arbitrary `base`: seed item 0's marker with `base`
20
- * (suffix-preserving), then continue the sequence from item 1. No-op on unordered or
21
- * childless lists.
22
- */
16
+ /** Renumber an ordered list starting at `base`, keeping marker suffixes. */
23
17
  export declare function renumberOrderedListFrom(list: CstNode, base: number, sharing?: SharingState): void;
24
18
  /**
25
- * Rewrite `item`'s marker style to match `parentList`, templating the suffix from a
26
- * sibling so the destination list's choices are preserved. Numbers stay the caller's
27
- * renumber pass's job: only the glyph and punctuation suffix reconcile here.
19
+ * Rewrite `item`'s marker glyph and suffix to match `parentList`'s first item; the number is left
20
+ * to the caller's renumber pass.
28
21
  */
29
22
  export declare function normalizeItemMarkerToList(item: CstNode, parentList: CstNode): void;
30
23
  /**
31
- * Rewrite pasted items' markers to the enclosing list's style: an unordered list templates
32
- * the bullet glyph, an ordered list continues the sequence from `firstIndex`. Runs BEFORE
33
- * any splice: `$state` wraps entries lazily, so a marker written to a newly-spliced item
34
- * bypasses reactivity.
24
+ * Rewrite pasted items' markers to the enclosing list's style before the splice, since `$state`
25
+ * wraps entries lazily and a marker written to an item already spliced would bypass reactivity.
35
26
  */
36
27
  export declare function templatePastedItemMarkers(items: CstNode[], outer: CstNode, firstIndex: number): void;
@@ -25,10 +25,8 @@ export function bumpOrderedMarker(marker) {
25
25
  return marker.replace(/^(\d+)/, (_, n) => String(Number(n) + 1));
26
26
  }
27
27
  /**
28
- * Renumber an ordered list's items in place from `fromIndex`, preserving marker suffixes.
29
- * `fromIndex = 0` resets the sequence to 1; `renumberOrderedListFrom` owns non-1 bases.
30
- * Every renumbered item's metadata and raw is WRITTEN, so a live-tree caller must pass
31
- * `sharing`; construction-time callers on fresh nodes may omit it.
28
+ * Renumber an ordered list's items from `fromIndex`, keeping marker suffixes. Each item's metadata
29
+ * and raw is written, so a caller on the live tree must pass `sharing`.
32
30
  */
33
31
  export function renumberOrderedList(list, fromIndex = 0, sharing) {
34
32
  if (!list.children)
@@ -44,11 +42,7 @@ export function renumberOrderedList(list, fromIndex = 0, sharing) {
44
42
  rebuildListItemRaw(item);
45
43
  }
46
44
  }
47
- /**
48
- * Renumber an ordered list from an arbitrary `base`: seed item 0's marker with `base`
49
- * (suffix-preserving), then continue the sequence from item 1. No-op on unordered or
50
- * childless lists.
51
- */
45
+ /** Renumber an ordered list starting at `base`, keeping marker suffixes. */
52
46
  export function renumberOrderedListFrom(list, base, sharing) {
53
47
  if (!metadataOf(list, 'list')?.ordered)
54
48
  return;
@@ -62,9 +56,8 @@ export function renumberOrderedListFrom(list, base, sharing) {
62
56
  }
63
57
  // ── Style templating ─────────────────────────────────────────────────────────
64
58
  /**
65
- * Rewrite `item`'s marker style to match `parentList`, templating the suffix from a
66
- * sibling so the destination list's choices are preserved. Numbers stay the caller's
67
- * renumber pass's job: only the glyph and punctuation suffix reconcile here.
59
+ * Rewrite `item`'s marker glyph and suffix to match `parentList`'s first item; the number is left
60
+ * to the caller's renumber pass.
68
61
  */
69
62
  export function normalizeItemMarkerToList(item, parentList) {
70
63
  const parentOrdered = metadataOf(parentList, 'list')?.ordered ?? false;
@@ -88,10 +81,8 @@ export function normalizeItemMarkerToList(item, parentList) {
88
81
  rebuildListItemRaw(item);
89
82
  }
90
83
  /**
91
- * Rewrite pasted items' markers to the enclosing list's style: an unordered list templates
92
- * the bullet glyph, an ordered list continues the sequence from `firstIndex`. Runs BEFORE
93
- * any splice: `$state` wraps entries lazily, so a marker written to a newly-spliced item
94
- * bypasses reactivity.
84
+ * Rewrite pasted items' markers to the enclosing list's style before the splice, since `$state`
85
+ * wraps entries lazily and a marker written to an item already spliced would bypass reactivity.
95
86
  */
96
87
  export function templatePastedItemMarkers(items, outer, firstIndex) {
97
88
  if (outer.kind !== 'list')
@@ -1,12 +1,21 @@
1
1
  /**
2
- * Reconcile listItem task metadata against its first paragraph's raw. The parser stores
3
- * the task marker on the item's metadata, but live typing only mutates `paragraph.raw` —
4
- * so without this, typing `[ ] ` serializes as a task the live CST still calls plain.
2
+ * Keeps a list item's task metadata in step with its first block. The parser keeps the task marker
3
+ * in the item's metadata, but a write changes only the block, so every write into an item's first
4
+ * slot goes through `writeKeepingTaskMarker`, which reconciles the marker with what stands there.
5
5
  */
6
6
  import type { CstNode } from '../../core/nodes';
7
+ import type { NodeView } from '../../core/node-views';
8
+ import type { SharingState } from '../sharing';
9
+ /** Runs `write` against the child at `slot`, then reconciles the owner's task marker with what
10
+ * stands there now. Pass the owner as the tree holds it once any copy before the write is made. */
11
+ export declare function writeKeepingTaskMarker<T>(owner: CstNode | undefined, children: readonly CstNode[], slot: number, sharing: SharingState | undefined, write: () => T): T;
7
12
  /**
8
- * Align the item's task fields with what a fresh parse of its first line would produce.
9
- * On demote the stripped marker bytes are restored into the paragraph raw, so the user's
10
- * content survives.
13
+ * Align the item's task fields with a fresh parse of its first line, putting a demoted marker's
14
+ * bytes back in the paragraph; the marker is dropped only if it stood before the replaced block.
11
15
  */
12
- export declare function reconcileTaskMetadata(listItem: CstNode): void;
16
+ export declare function reconcileTaskMetadata(listItem: CstNode, writtenIndex: number, markerStoodBefore: boolean, sharing?: SharingState): void;
17
+ /**
18
+ * How far back a caret in the first paragraph moves when writing `text` there takes a task marker
19
+ * off its front; read before the write, while the item still holds its current marker.
20
+ */
21
+ export declare function taskMarkerCaretShift(listItem: NodeView, text: string): number;
@@ -1,47 +1,104 @@
1
1
  /**
2
- * Reconcile listItem task metadata against its first paragraph's raw. The parser stores
3
- * the task marker on the item's metadata, but live typing only mutates `paragraph.raw` —
4
- * so without this, typing `[ ] ` serializes as a task the live CST still calls plain.
2
+ * Keeps a list item's task metadata in step with its first block. The parser keeps the task marker
3
+ * in the item's metadata, but a write changes only the block, so every write into an item's first
4
+ * slot goes through `writeKeepingTaskMarker`, which reconciles the marker with what stands there.
5
5
  */
6
6
  import { metadataOf } from '../../core/nodes';
7
- const TASK_REGEX = /^\[( |x|X)\]\s+/;
7
+ import { trimTrailingLineEnding } from '../../core/lines';
8
+ import { matchTaskCheckbox } from '../../core/parsers/list';
9
+ import { ensureUnsharedChild } from '../unshare';
10
+ /** Runs `write` against the child at `slot`, then reconciles the owner's task marker with what
11
+ * stands there now. Pass the owner as the tree holds it once any copy before the write is made. */
12
+ export function writeKeepingTaskMarker(owner, children, slot, sharing, write) {
13
+ // Read before the write, which can put a block there no task marker may stand before.
14
+ const stood = children[slot] !== undefined && taskMarkerMayStandBefore(children[slot]);
15
+ const result = write();
16
+ if (owner)
17
+ reconcileTaskMetadata(owner, slot, stood, sharing);
18
+ return result;
19
+ }
20
+ /** Whether a task marker may stand in front of this block: only its own paragraph (GFM task lists). */
21
+ function taskMarkerMayStandBefore(block) {
22
+ return block.kind === 'paragraph';
23
+ }
8
24
  /**
9
- * Align the item's task fields with what a fresh parse of its first line would produce.
10
- * On demote the stripped marker bytes are restored into the paragraph raw, so the user's
11
- * content survives.
25
+ * Align the item's task fields with a fresh parse of its first line, putting a demoted marker's
26
+ * bytes back in the paragraph; the marker is dropped only if it stood before the replaced block.
12
27
  */
13
- export function reconcileTaskMetadata(listItem) {
14
- if (listItem.kind !== 'listItem')
28
+ export function reconcileTaskMetadata(listItem, writtenIndex, markerStoodBefore, sharing) {
29
+ if (listItem.kind !== 'listItem' || writtenIndex !== 0)
15
30
  return;
16
31
  const firstChild = listItem.children?.[0];
17
- if (!firstChild || firstChild.kind !== 'paragraph')
32
+ if (!firstChild)
18
33
  return;
19
34
  const meta = metadataOf(listItem, 'listItem');
20
35
  if (!meta)
21
36
  return;
22
- const firstLineEnd = firstChild.raw.indexOf('\n');
23
- const firstLineRaw = firstLineEnd === -1 ? firstChild.raw : firstChild.raw.slice(0, firstLineEnd);
24
- const restRaw = firstLineEnd === -1 ? '' : firstChild.raw.slice(firstLineEnd);
25
- const effectiveFirstLine = (meta.taskMarker ?? '') + firstLineRaw;
26
- const match = effectiveFirstLine.match(TASK_REGEX);
37
+ if (firstChild.kind !== 'paragraph') {
38
+ // A task marker stands before a paragraph (GFM § 5.3), so the write that puts a block there
39
+ // the marker cannot stand in front of gives the checkbox up with the paragraph it had.
40
+ if (!meta.taskItem || !markerStoodBefore)
41
+ return;
42
+ if (taskMarkerMayStandBefore(firstChild))
43
+ return;
44
+ meta.taskItem = false;
45
+ meta.taskMarker = null;
46
+ meta.taskChecked = false;
47
+ return;
48
+ }
49
+ const firstLineText = firstLineTextOf(firstChild.raw);
50
+ // The first line's ending stays with the rest of the paragraph.
51
+ const restRaw = firstChild.raw.slice(firstLineText.length);
52
+ const { match, kept } = splitTaskLine(meta, firstLineText);
27
53
  if (match) {
28
- const newTaskMarker = match[0];
29
- const newTaskChecked = match[1].toLowerCase() === 'x';
30
54
  const drift = meta.taskItem !== true ||
31
- meta.taskMarker !== newTaskMarker ||
32
- meta.taskChecked !== newTaskChecked;
55
+ meta.taskMarker !== match.rawMarker ||
56
+ meta.taskChecked !== match.checked;
33
57
  if (drift) {
34
58
  meta.taskItem = true;
35
- meta.taskMarker = newTaskMarker;
36
- meta.taskChecked = newTaskChecked;
37
- firstChild.raw = effectiveFirstLine.slice(newTaskMarker.length) + restRaw;
59
+ meta.taskMarker = match.rawMarker;
60
+ meta.taskChecked = match.checked;
61
+ ownedFirstChild(listItem, sharing).raw = kept + restRaw;
38
62
  }
39
63
  return;
40
64
  }
41
65
  if (meta.taskItem === true || meta.taskMarker !== null) {
42
- firstChild.raw = effectiveFirstLine + restRaw;
66
+ ownedFirstChild(listItem, sharing).raw = kept + restRaw;
43
67
  meta.taskItem = false;
44
68
  meta.taskMarker = null;
45
69
  meta.taskChecked = false;
46
70
  }
47
71
  }
72
+ /**
73
+ * How far back a caret in the first paragraph moves when writing `text` there takes a task marker
74
+ * off its front; read before the write, while the item still holds its current marker.
75
+ */
76
+ export function taskMarkerCaretShift(listItem, text) {
77
+ if (listItem.kind !== 'listItem')
78
+ return 0;
79
+ const meta = metadataOf(listItem, 'listItem');
80
+ if (!meta)
81
+ return 0;
82
+ const firstLineText = firstLineTextOf(text);
83
+ return splitTaskLine(meta, firstLineText).kept.length - firstLineText.length;
84
+ }
85
+ /** The checkbox the item's first line reads as once `firstLineText` stands after the item's
86
+ * current marker, and the text its paragraph keeps: a demoted marker goes back into the text. */
87
+ function splitTaskLine(meta, firstLineText) {
88
+ const line = (meta.taskMarker ?? '') + firstLineText;
89
+ const match = matchTaskCheckbox(line);
90
+ if (match)
91
+ return { match, kept: line.slice(match.rawMarker.length) };
92
+ const demoted = meta.taskItem === true || meta.taskMarker !== null;
93
+ return { match: null, kept: demoted ? line : firstLineText };
94
+ }
95
+ /** The first line of `raw` without its ending. */
96
+ function firstLineTextOf(raw) {
97
+ const end = raw.indexOf('\n');
98
+ return trimTrailingLineEnding(end === -1 ? raw : raw.slice(0, end + 1));
99
+ }
100
+ /** The marker's bytes move between the item's metadata and its first child, so that child is
101
+ * copied out of the undo snapshot before it is written (`unshare.ts` header). */
102
+ function ownedFirstChild(listItem, sharing) {
103
+ return sharing ? ensureUnsharedChild(listItem, 0, sharing) : listItem.children[0];
104
+ }