@voithos-labs/aragonite 0.10.4 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +11 -5
  3. package/dist/a11y-strings.js +60 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +12 -21
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +603 -1126
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +26 -51
  26. package/dist/components/SelectionOverlay.svelte.d.ts +5 -3
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +72 -87
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +29 -34
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +57 -39
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +141 -203
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +45 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +93 -147
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +1 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +8 -6
  102. package/dist/components/blocks/text/click-snap-guard.js +10 -7
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +150 -181
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -108
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +212 -199
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +12 -35
  144. package/dist/components/drag-handle.js +22 -68
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -24
  162. package/dist/components/editor-root-listeners.js +49 -24
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +14 -26
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +30 -35
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +3 -5
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +54 -75
  256. package/dist/core/inline/inline-widgets.js +54 -62
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +31 -15
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -6
  347. package/dist/cursor/height-oracle.js +26 -74
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +14 -15
  365. package/dist/cursor/scrollport.js +7 -13
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -14
  375. package/dist/cursor/visual-lines.js +45 -46
  376. package/dist/cursor/widget-edge-snap.d.ts +10 -15
  377. package/dist/cursor/widget-edge-snap.js +13 -12
  378. package/dist/cursor/widget-offset.d.ts +110 -104
  379. package/dist/cursor/widget-offset.js +344 -179
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +30 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +28 -50
  434. package/dist/editor-actions/focus/focus-landing.d.ts +8 -11
  435. package/dist/editor-actions/focus/focus-landing.js +15 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +54 -82
  465. package/dist/editor-actions/plugin/container.js +105 -188
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +88 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +37 -8
  550. package/dist/plugin.js +100 -77
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +78 -67
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -81
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +51 -45
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +15 -6
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +141 -310
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +78 -84
  695. package/dist/schema/commands.js +152 -117
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +8 -10
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +63 -80
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +92 -125
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +59 -96
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +51 -134
  807. package/dist/selection/dead-space-caret.d.ts +19 -30
  808. package/dist/selection/dead-space-caret.js +70 -88
  809. package/dist/selection/drag-pointer.d.ts +7 -9
  810. package/dist/selection/drag-pointer.js +23 -33
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -40
  816. package/dist/selection/keyboard-extend.js +94 -117
  817. package/dist/selection/multi-click.d.ts +13 -18
  818. package/dist/selection/multi-click.js +32 -38
  819. package/dist/selection/native-bridge.d.ts +29 -39
  820. package/dist/selection/native-bridge.js +78 -127
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +25 -16
  824. package/dist/selection/path-lookup.js +101 -18
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +5 -5
  828. package/dist/selection/pointer-gesture.js +5 -5
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -40
  832. package/dist/selection/primitives.js +57 -67
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -23
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +34 -16
  852. package/dist/selection/selection-drop.js +159 -95
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +60 -53
  864. package/dist/styles/editor.css +201 -143
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +9 -7
  960. package/dist/tree-operations/paste/replacement-parse.js +12 -10
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +327 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +253 -185
  996. package/docs/guide/plugin-guide.md +332 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +12 -16
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/cursor/scroll-hold.d.ts +0 -10
  1015. package/dist/cursor/scroll-hold.js +0 -22
  1016. package/dist/invariants/split-landing.d.ts +0 -8
  1017. package/dist/invariants/split-landing.js +0 -15
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -31
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -78
@@ -1,13 +1,14 @@
1
1
  /**
2
- * DOM renderer for InlineNode trees. Over a widget-free range the fragment's textContent equals
3
- * raw.slice. Atomic widgets break that by design, contributing their own text or none and
4
- * carrying source bytes on `data-source-*`, so a raw offset is recovered only through the shared
5
- * walk (cursor/widget-offset.ts), never by counting textContent. Stated both ways by G2.4.
6
- *
7
- * Which of the spans minted here a mode leaves on screen is `inline/visibility.ts`.
2
+ * DOM renderer for inline node trees. Over a widget-free range the fragment's textContent equals
3
+ * raw.slice. Widgets break that by design, contributing their own text or none and carrying their
4
+ * source bytes on `data-source-*`, so a raw offset is recovered only through the shared DOM
5
+ * traversal (cursor/widget-offset.ts), never by counting textContent (G2.4). Which of the spans
6
+ * built here a mode leaves on screen is `inline/visibility.ts`.
8
7
  */
9
8
  import { buildCoreInlineWidget } from './inline/inline-widgets';
9
+ import { codeSpanFence } from './inline/scan/code-spans';
10
10
  import { isAllowedHrefScheme } from './url-policy';
11
+ import { firstDisplayLine } from './lines';
11
12
  // ── Marker helpers ──────────────────────────────────────────────────────────
12
13
  function markerSpan(text) {
13
14
  const span = document.createElement('span');
@@ -15,6 +16,19 @@ function markerSpan(text) {
15
16
  span.textContent = text;
16
17
  return span;
17
18
  }
19
+ /**
20
+ * A hard break's marker, wrapped in the element the stylesheet draws a return glyph on where the
21
+ * marker's bytes do not show: the wrapper holds no text, so every offset and copy reads the bytes.
22
+ */
23
+ function hardBreakMark(marker) {
24
+ const mark = document.createElement('span');
25
+ mark.className = 'md-hard-break';
26
+ // Trailing spaces are blank even where they paint, so source mode draws the glyph for them too.
27
+ if (marker.textContent?.startsWith(' '))
28
+ mark.setAttribute('data-trailing-spaces', '');
29
+ mark.appendChild(marker);
30
+ return mark;
31
+ }
18
32
  function tagConstruct(el, node, opts) {
19
33
  if (opts.tagConstructMarkers) {
20
34
  el.setAttribute('data-construct-start', String(node.start));
@@ -29,8 +43,8 @@ function sourceSpan(raw, node, className) {
29
43
  span.textContent = raw.slice(node.start, node.end);
30
44
  return span;
31
45
  }
32
- /** The one href funnel for every sink — a consumer's rewrite, then the scheme allowlist; undefined
33
- * reads as "render inert". Exported: the link card's Open button hands over a user-typed URL. */
46
+ /** The one href path every DOM sink goes through: a consumer's rewrite, then the scheme allowlist.
47
+ * Undefined means render inert. */
34
48
  export function resolveHref(opts, url) {
35
49
  if (url === undefined)
36
50
  return undefined;
@@ -43,15 +57,9 @@ export function resolveHref(opts, url) {
43
57
  // ── Inline code ─────────────────────────────────────────────────────────────
44
58
  function renderInlineCode(node, raw, opts) {
45
59
  const frag = document.createDocumentFragment();
46
- // Every span is a slice of raw, never a parsed field that happens to agree — and each is its
47
- // OWN slice: the opening fence is capped at half the node and the closing one read back off
48
- // the tail, so a node nobody parsed (a plugin mint over unfenced bytes) still emits its bytes
49
- // exactly once (G2.4).
50
- const fenceLimit = node.start + Math.floor((node.end - node.start) / 2);
51
- let contentStart = node.start;
52
- while (contentStart < fenceLimit && raw[contentStart] === '`')
53
- contentStart++;
54
- const contentEnd = node.end - (contentStart - node.start);
60
+ const fence = codeSpanFence(node);
61
+ const contentStart = node.start + fence;
62
+ const contentEnd = node.end - fence;
55
63
  frag.appendChild(tagConstruct(markerSpan(raw.slice(node.start, contentStart)), node, opts));
56
64
  const code = document.createElement('code');
57
65
  code.className = 'inline-code-content';
@@ -90,9 +98,8 @@ function openWrapped(node, raw, tag, opts, container) {
90
98
  };
91
99
  }
92
100
  // ── Links ────────────────────────────────────────────────────────────────────
93
- // Markers come from raw.slice: the parsed url/title can differ from the source bytes. Every
94
- // split point is clamped to node.end — a plugin mint need not carry the bytes GFM's own link
95
- // does, and a search running past the node would render the NEXT node's source (G2.4).
101
+ // Markers come from raw.slice, since the parsed url/title can differ from the source bytes. Split
102
+ // points clamp to node.end: a plugin-made node need not carry GFM's own link bytes (G2.4).
96
103
  function openLink(node, raw, opts, container) {
97
104
  const children = node.children ?? [];
98
105
  if (children.length === 0) {
@@ -107,7 +114,7 @@ function openLink(node, raw, opts, container) {
107
114
  }
108
115
  const lastChild = children[children.length - 1];
109
116
  // The close marker splits into the text bracket's `]` and the trailing marker. Reference forms
110
- // get their own `md-ref-label` class so CSS can dim them harder than inline markers.
117
+ // get their own `md-ref-label` class so CSS can style the label as metadata.
111
118
  const closingTextBracket = lastChild.end < node.end && raw[lastChild.end] === ']'
112
119
  ? raw.slice(lastChild.end, lastChild.end + 1)
113
120
  : '';
@@ -150,11 +157,8 @@ function openLink(node, raw, opts, container) {
150
157
  };
151
158
  }
152
159
  // ── Autolinks ────────────────────────────────────────────────────────────────
153
- /**
154
- * The angle form's `<`/`>` are construct syntax, so they render as markers the mode CSS can hide;
155
- * the bare URL/www/email forms are url text throughout. Read off the raw bytes, never `node.url`:
156
- * the bare forms synthesize a url (`http://`, `mailto:`) that is not a slice of the source.
157
- */
160
+ /** The angle form's `<`/`>` render as markers the mode CSS can hide. Read off the raw bytes, never
161
+ * `node.url`, which a bare form may synthesize (`http://`, `mailto:`). */
158
162
  function appendAutolink(node, raw, opts, container) {
159
163
  const href = resolveHref(opts, node.url);
160
164
  const el = document.createElement(href !== undefined ? 'a' : 'span');
@@ -180,9 +184,8 @@ function appendImageSource(node, raw, opts, container) {
180
184
  const altText = node.alt ?? '';
181
185
  const altStart = node.start + 2;
182
186
  const altEnd = altStart + altText.length;
183
- // `alt` locates the split and never supplies text (openLink's rule), and only where it is
184
- // literally those bytes: a minted image's markers need not be a GFM image's. Unlocatable
185
- // falls back to unmarked source, since a construct nobody can decompose would collapse whole.
187
+ // `alt` only locates the split, and only where it is literally those bytes, since a plugin-made
188
+ // image need not be GFM's; an unlocatable one falls back to unmarked source.
186
189
  if (altEnd > node.end || !raw.startsWith(altText, altStart)) {
187
190
  container.appendChild(document.createTextNode(raw.slice(node.start, node.end)));
188
191
  return;
@@ -211,16 +214,10 @@ function renderNode(node, raw, opts, container) {
211
214
  // A text node carries the line ending so textContent equals raw byte-for-byte;
212
215
  // a `<br>` would diverge across browsers.
213
216
  const breakRaw = raw.slice(node.start, node.end);
214
- const nlIdx = breakRaw.indexOf('\n');
215
- // A node carrying no line ending (a plugin mint) is all marker: a -1 here would
216
- // slice from the end and drop bytes.
217
- const lineEndingStart = nlIdx === -1
218
- ? breakRaw.length
219
- : nlIdx > 0 && breakRaw[nlIdx - 1] === '\r'
220
- ? nlIdx - 1
221
- : nlIdx;
217
+ // The marker is the break's first line; a node with no line ending is all marker.
218
+ const lineEndingStart = firstDisplayLine(breakRaw).text.length;
222
219
  if (lineEndingStart > 0) {
223
- container.appendChild(markerSpan(breakRaw.slice(0, lineEndingStart)));
220
+ container.appendChild(hardBreakMark(markerSpan(breakRaw.slice(0, lineEndingStart))));
224
221
  }
225
222
  container.appendChild(document.createTextNode(breakRaw.slice(lineEndingStart)));
226
223
  return null;
@@ -255,10 +252,9 @@ function renderNode(node, raw, opts, container) {
255
252
  case 'entityReference':
256
253
  case 'rawHtml':
257
254
  default:
258
- // An invisible entity is not a widget, so the builder returns null and it keeps its
259
- // literal-source span; anything the registry does not claim falls back the same way,
260
- // mirroring the unknown-block fallback so every byte round-trips.
261
- container.appendChild(buildCoreInlineWidget(node, raw, opts.buildPortalWidget) ??
255
+ // An invisible entity renders no widget and keeps its literal-source span, as does any
256
+ // kind the registry does not own, so every byte round-trips.
257
+ container.appendChild(buildCoreInlineWidget(node, raw, opts.buildPortalWidget, opts.grammar) ??
262
258
  sourceSpan(raw, node, node.kind === 'entityReference'
263
259
  ? 'md-entity'
264
260
  : node.kind === 'rawHtml'
@@ -267,7 +263,7 @@ function renderNode(node, raw, opts, container) {
267
263
  return null;
268
264
  }
269
265
  }
270
- export function renderInlineNodes(nodes, raw, opts = {}) {
266
+ export function renderInlineNodes(nodes, raw, opts) {
271
267
  // Iterative: nesting depth is input-controlled, so per-level recursion overflows the stack and
272
268
  // strands the block in the unhealable fallback. `scanChildren` is iterative for the same reason.
273
269
  const root = {
@@ -288,23 +284,21 @@ export function renderInlineNodes(nodes, raw, opts = {}) {
288
284
  if (child !== null)
289
285
  stack.push(child);
290
286
  }
291
- if (opts.pendingBreakSeat)
292
- paintPendingBreak(nodes, raw, root.content);
287
+ if (opts.pendingBreakAt !== undefined) {
288
+ paintPendingBreak(nodes, raw, opts.pendingBreakAt, root.content);
289
+ }
293
290
  return root.content;
294
291
  }
295
- /**
296
- * `insertHardBreak` at the end of a block writes `\` whose line ending IS the block's trailing
297
- * one, so until the next key supplies the following line CommonMark (and the scanner) read the
298
- * byte as literal text. Left as text it shows as a stray backslash and the caret stays on the
299
- * first line; painted like this the user sees the new line they asked for. A `br` adds no
300
- * textContent, so G1.28 holds; the walk seats offset `length` after the first anchor.
301
- */
302
- function paintPendingBreak(nodes, raw, frag) {
292
+ /** The first of a pending hard break's two anchors, where the new line starts. */
293
+ export const PENDING_BREAK_ANCHOR = 'br[data-caret-anchor="break"]';
294
+ /** A `\` ending the block is a hard break the scanner reads as text until its next line exists;
295
+ * a hidden marker plus two `br` anchors show that line without adding text. */
296
+ function paintPendingBreak(nodes, raw, contentEnd, frag) {
303
297
  const last = nodes[nodes.length - 1];
304
298
  if (!last || last.kind !== 'text' || raw[last.end - 1] !== '\\')
305
299
  return;
306
- const rest = raw.slice(last.end);
307
- if (rest !== '' && rest !== '\n' && rest !== '\r\n')
300
+ // Only the block's own structure may follow the backslash: its line ending, or an underline.
301
+ if (last.end !== contentEnd)
308
302
  return;
309
303
  const tail = frag.lastChild;
310
304
  if (!tail || tail.nodeType !== Node.TEXT_NODE || !tail.textContent?.endsWith('\\'))
@@ -322,11 +316,8 @@ function paintPendingBreak(nodes, raw, frag) {
322
316
  frag.appendChild(anchor);
323
317
  }
324
318
  }
325
- /**
326
- * The leaf containing `offset`, preferring the right node at a boundary; `offset === end` only
327
- * matches the last node. Model-layer, touching no DOM: the DOM counterpart is
328
- * `findDomTextOffsetTarget` in cursor/widget-offset.ts.
329
- */
319
+ /** The leaf containing `offset`, preferring the right node at a boundary; `offset === end` matches
320
+ * only the last node. The DOM side is `findDomTextOffsetTarget` in `cursor/widget-offset.ts`. */
330
321
  export function findNodeAtOffset(nodes, offset) {
331
322
  // Descent never backtracks, the first containing sibling winning its level, so the answer is
332
323
  // the deepest containing node.
@@ -1,33 +1,63 @@
1
- /** Line splitting preserving endings and offsets, plus the trailing-line-ending helpers. */
1
+ /**
2
+ * Line splitting that keeps each line's ending and offsets, and the line-ending rule: a line the
3
+ * editor writes takes the document's ending ({@link documentLineEnding}), and per-line work reads
4
+ * each line's text without its ending ({@link displayLines}). Also GFM's whitespace, the one
5
+ * reading of blank and trimmed text for the parser and the editing code alike.
6
+ */
7
+ import type { DocumentView } from './node-views';
8
+ export type LineEnding = '\n' | '\r\n';
9
+ export declare function isBlankLine(text: string): boolean;
10
+ /** Whether `text` is blank lines only: spaces, tabs and line endings. The emptiness test for any
11
+ * block's text, never `String.trim()`, which also drops a non-breaking space. */
12
+ export declare function isBlankText(text: string): boolean;
13
+ /** A line ending a pattern admits at the end of a line's text: the document's last line can end
14
+ * in a lone `\r`, which the line splitter leaves in the text, and a plugin may pass an ending. */
15
+ export declare const OPTIONAL_LINE_ENDING = "(?:\\r\\n?|\\n)?";
16
+ /** GFM §2.1's whitespace character: space, tab, LF, VT, FF, CR. Narrower than JS `\s`. */
17
+ export declare const WHITESPACE_CHARS = " \\t\\n\\v\\f\\r";
18
+ export declare const WHITESPACE_CLASS = "[ \\t\\n\\v\\f\\r]";
19
+ export declare const WHITESPACE_RUN: RegExp;
20
+ export declare function isWhitespaceChar(ch: string | undefined): boolean;
21
+ /** `text` without GFM whitespace at either end: what the spec means by "trimmed". */
22
+ export declare function trimWhitespace(text: string): string;
2
23
  /** Length of `raw` excluding any trailing line ending (LF or CRLF). */
3
24
  export declare function displayLength(raw: string): number;
4
25
  export declare function trimTrailingLineEnding(raw: string): string;
26
+ /** The ending `raw` actually carries, empty when it has none: {@link trimTrailingLineEnding}'s
27
+ * complement, for code reattaching a block's own bytes. */
28
+ export declare function ownTrailingLineEnding(raw: string): '' | LineEnding;
5
29
  /**
6
- * The ending `raw` actually carries — {@link trimTrailingLineEnding}'s complement, the two
7
- * partitioning `raw`. What {@link trailingLineEnding} answers instead is which ending the
8
- * DOCUMENT uses, so a site reattaching a block's own bytes reads this one (G4.20).
30
+ * The ending every line the editor writes into `doc` takes: the document's first line break, else
31
+ * LF. Read afresh on each call, which scans only up to that first break.
9
32
  */
10
- export declare function ownTrailingLineEnding(raw: string): '' | '\n' | '\r\n';
33
+ export declare function documentLineEnding(doc: DocumentView): LineEnding;
34
+ /** The first line break in `text`, or null when it holds none. In a document with one ending,
35
+ * any break in a block's own bytes is the document's. */
36
+ export declare function firstLineEnding(text: string): LineEnding | null;
37
+ /** The ending `raw` closes with, else `fallback`, usually the document's ending: a block with no
38
+ * ending of its own is the document's last line. */
39
+ export declare function trailingLineEnding(raw: string, fallback: LineEnding): LineEnding;
40
+ /** `text` closed with `ending` when its last line is open: a slice cut from a block would
41
+ * otherwise run into whatever follows it once the bytes stand alone. */
42
+ export declare function terminateLine(text: string, ending: LineEnding): string;
43
+ /** Whether the last line of `text` holds only spaces and tabs, its ending aside. */
44
+ export declare function endsInBlankLine(text: string): boolean;
45
+ /** The first half of a UTF-16 surrogate pair, as a code unit (`charCodeAt`). */
46
+ export declare function isHighSurrogate(unit: number): boolean;
47
+ /** The second half of a UTF-16 surrogate pair, as a code unit (`charCodeAt`). */
48
+ export declare function isLowSurrogate(unit: number): boolean;
11
49
  /**
12
- * `offset` moved off the interior of a surrogate pair, back to the pair's own start. Caret
13
- * offsets are UTF-16 code units, so a cut at one can halve an astral scalar and leave a lone
14
- * surrogate — bytes no UTF-8 encoder round-trips (`TextEncoder` yields U+FFFD) and no inverse
15
- * gesture restores. Scalars only: a grapheme cluster is a rendering question, and answering it
16
- * here would move a caret the author placed between two legitimately separate scalars.
50
+ * `offset` moved off the interior of a surrogate pair, back to the pair's start: a cut there
51
+ * leaves a lone surrogate, which no UTF-8 encoder round-trips. Code points only, not graphemes.
17
52
  */
18
53
  export declare function snapToScalarBoundary(raw: string, offset: number): number;
19
- /**
20
- * The block's authored trailing line ending. Every site that reattaches or mints one reads it
21
- * here (G4.20), so a CRLF-authored block keeps its ending and an unterminated one gets `\n`.
22
- */
23
- export declare function trailingLineEnding(raw: string): '\n' | '\r\n';
24
- /**
25
- * Keep a truncated slice line-terminated, borrowing `sourceRaw`'s own ending (G4.20). A slice
26
- * whose last line stays open swallows whatever follows it once the bytes stand alone.
27
- */
28
- export declare function terminateLine(text: string, sourceRaw: string): string;
29
- /** Paste entry points funnel through here so Windows CRLF does not leak into a note. */
54
+ /** Every paste entry point goes through here, so the paste rules read LF whatever the clipboard
55
+ * held; the paste writes the document's own ending back. */
30
56
  export declare function normalizeLineEndings(text: string): string;
57
+ /** `text` with every line break written as `ending`: how LF text joins a document's own lines. */
58
+ export declare function withLineEnding(text: string, ending: LineEnding): string;
59
+ /** The line break starting at `offset` in `text`, empty when none starts there. */
60
+ export declare function lineEndingAt(text: string, offset: number): '' | LineEnding;
31
61
  export interface ParsedLine {
32
62
  raw: string;
33
63
  text: string;
@@ -36,9 +66,20 @@ export interface ParsedLine {
36
66
  end: number;
37
67
  }
38
68
  export declare function splitLines(source: string): ParsedLine[];
39
- /**
40
- * Re-mint a `ParsedLine[]` after a per-line strip, as the container parsers do when they reparse
41
- * a prefix-stripped body. Recompute, not spread: reusing an input line's offsets after shortening
42
- * its text desyncs the offsets from the bytes.
43
- */
69
+ export interface DisplayLine {
70
+ text: string;
71
+ ending: '' | LineEnding;
72
+ }
73
+ /** A block's display as lines, each apart from its ending. A display always has a last line, empty
74
+ * after a final break, and {@link joinDisplayLines} puts the bytes back exactly. */
75
+ export declare function displayLines(display: string): DisplayLine[];
76
+ /** {@link displayLines}' first line, read without splitting the rest of `text`. */
77
+ export declare function firstDisplayLine(text: string): DisplayLine;
78
+ export declare function joinDisplayLines(lines: readonly DisplayLine[]): string;
79
+ /** Columns of leading indentation, a tab advancing to the next multiple of four (GFM §2.2). */
80
+ export declare function indentColumns(text: string): number;
81
+ /** `text` with up to `columns` columns of indentation removed. A tab the cut splits is written as
82
+ * the spaces it spans, since every later reparse reads the child's raw from column zero. */
83
+ export declare function stripIndentColumns(text: string, columns: number): string;
84
+ /** A `ParsedLine[]` rebuilt after a per-line strip, offsets recomputed from the stripped bytes. */
44
85
  export declare function remapStrippedLines(lines: ParsedLine[], stripLine: (line: ParsedLine, index: number) => string): ParsedLine[];
@@ -1,4 +1,37 @@
1
- /** Line splitting preserving endings and offsets, plus the trailing-line-ending helpers. */
1
+ /**
2
+ * Line splitting that keeps each line's ending and offsets, and the line-ending rule: a line the
3
+ * editor writes takes the document's ending ({@link documentLineEnding}), and per-line work reads
4
+ * each line's text without its ending ({@link displayLines}). Also GFM's whitespace, the one
5
+ * reading of blank and trimmed text for the parser and the editing code alike.
6
+ */
7
+ // ── Markdown whitespace ──────────────────────────────────────────────────────
8
+ /** GFM §2.1: a blank line holds only spaces and tabs; a non-breaking space is content. */
9
+ const NON_BLANK_CHAR = /[^ \t]/;
10
+ export function isBlankLine(text) {
11
+ return !NON_BLANK_CHAR.test(text);
12
+ }
13
+ const BLANK_TEXT = /^(?:[ \t]|\r?\n)*$/;
14
+ /** Whether `text` is blank lines only: spaces, tabs and line endings. The emptiness test for any
15
+ * block's text, never `String.trim()`, which also drops a non-breaking space. */
16
+ export function isBlankText(text) {
17
+ return BLANK_TEXT.test(text);
18
+ }
19
+ /** A line ending a pattern admits at the end of a line's text: the document's last line can end
20
+ * in a lone `\r`, which the line splitter leaves in the text, and a plugin may pass an ending. */
21
+ export const OPTIONAL_LINE_ENDING = '(?:\\r\\n?|\\n)?';
22
+ /** GFM §2.1's whitespace character: space, tab, LF, VT, FF, CR. Narrower than JS `\s`. */
23
+ export const WHITESPACE_CHARS = ' \\t\\n\\v\\f\\r';
24
+ export const WHITESPACE_CLASS = `[${WHITESPACE_CHARS}]`;
25
+ export const WHITESPACE_RUN = new RegExp(`${WHITESPACE_CLASS}+`);
26
+ const WHITESPACE_CHAR = new RegExp(`^${WHITESPACE_CLASS}$`);
27
+ const EDGE_WHITESPACE = new RegExp(`^${WHITESPACE_CLASS}+|${WHITESPACE_CLASS}+$`, 'g');
28
+ export function isWhitespaceChar(ch) {
29
+ return ch !== undefined && WHITESPACE_CHAR.test(ch);
30
+ }
31
+ /** `text` without GFM whitespace at either end: what the spec means by "trimmed". */
32
+ export function trimWhitespace(text) {
33
+ return text.replace(EDGE_WHITESPACE, '');
34
+ }
2
35
  /** Length of `raw` excluding any trailing line ending (LF or CRLF). */
3
36
  export function displayLength(raw) {
4
37
  if (raw.endsWith('\r\n'))
@@ -10,46 +43,96 @@ export function displayLength(raw) {
10
43
  export function trimTrailingLineEnding(raw) {
11
44
  return raw.slice(0, displayLength(raw));
12
45
  }
13
- /**
14
- * The ending `raw` actually carries — {@link trimTrailingLineEnding}'s complement, the two
15
- * partitioning `raw`. What {@link trailingLineEnding} answers instead is which ending the
16
- * DOCUMENT uses, so a site reattaching a block's own bytes reads this one (G4.20).
17
- */
46
+ /** The ending `raw` actually carries, empty when it has none: {@link trimTrailingLineEnding}'s
47
+ * complement, for code reattaching a block's own bytes. */
18
48
  export function ownTrailingLineEnding(raw) {
19
49
  return raw.slice(displayLength(raw));
20
50
  }
51
+ // ── The document's line ending ───────────────────────────────────────────────
21
52
  /**
22
- * `offset` moved off the interior of a surrogate pair, back to the pair's own start. Caret
23
- * offsets are UTF-16 code units, so a cut at one can halve an astral scalar and leave a lone
24
- * surrogate — bytes no UTF-8 encoder round-trips (`TextEncoder` yields U+FFFD) and no inverse
25
- * gesture restores. Scalars only: a grapheme cluster is a rendering question, and answering it
26
- * here would move a caret the author placed between two legitimately separate scalars.
53
+ * The ending every line the editor writes into `doc` takes: the document's first line break, else
54
+ * LF. Read afresh on each call, which scans only up to that first break.
27
55
  */
28
- export function snapToScalarBoundary(raw, offset) {
29
- if (offset <= 0 || offset >= raw.length)
30
- return offset;
31
- const splitsPair = (raw.charCodeAt(offset - 1) & 0xfc00) === 0xd800 &&
32
- (raw.charCodeAt(offset) & 0xfc00) === 0xdc00;
33
- return splitsPair ? offset - 1 : offset;
56
+ export function documentLineEnding(doc) {
57
+ return firstDocumentBreak(doc) ?? '\n';
34
58
  }
35
- /**
36
- * The block's authored trailing line ending. Every site that reattaches or mints one reads it
37
- * here (G4.20), so a CRLF-authored block keeps its ending and an unterminated one gets `\n`.
38
- */
39
- export function trailingLineEnding(raw) {
40
- return raw.endsWith('\r\n') ? '\r\n' : '\n';
59
+ function firstDocumentBreak(doc) {
60
+ let before = '';
61
+ for (const chunk of documentChunks(doc)) {
62
+ const at = chunk.indexOf('\n');
63
+ if (at >= 0)
64
+ return (at > 0 ? chunk[at - 1] : before) === '\r' ? '\r\n' : '\n';
65
+ if (chunk !== '')
66
+ before = chunk[chunk.length - 1];
67
+ }
68
+ return null;
69
+ }
70
+ function* documentChunks(doc) {
71
+ yield doc.prefix;
72
+ for (const child of doc.children) {
73
+ yield child.leadingTrivia ?? '';
74
+ yield child.raw;
75
+ }
76
+ yield doc.suffix;
77
+ }
78
+ /** The first line break in `text`, or null when it holds none. In a document with one ending,
79
+ * any break in a block's own bytes is the document's. */
80
+ export function firstLineEnding(text) {
81
+ const at = text.indexOf('\n');
82
+ if (at < 0)
83
+ return null;
84
+ return text[at - 1] === '\r' ? '\r\n' : '\n';
85
+ }
86
+ /** The ending `raw` closes with, else `fallback`, usually the document's ending: a block with no
87
+ * ending of its own is the document's last line. */
88
+ export function trailingLineEnding(raw, fallback) {
89
+ return ownTrailingLineEnding(raw) || fallback;
90
+ }
91
+ /** `text` closed with `ending` when its last line is open: a slice cut from a block would
92
+ * otherwise run into whatever follows it once the bytes stand alone. */
93
+ export function terminateLine(text, ending) {
94
+ return text.endsWith('\n') ? text : text + ending;
95
+ }
96
+ /** Whether the last line of `text` holds only spaces and tabs, its ending aside. */
97
+ export function endsInBlankLine(text) {
98
+ const body = trimTrailingLineEnding(text);
99
+ return isBlankLine(body.slice(body.lastIndexOf('\n') + 1));
100
+ }
101
+ // ── Scalars ──────────────────────────────────────────────────────────────────
102
+ /** The first half of a UTF-16 surrogate pair, as a code unit (`charCodeAt`). */
103
+ export function isHighSurrogate(unit) {
104
+ return unit >= 0xd800 && unit <= 0xdbff;
105
+ }
106
+ /** The second half of a UTF-16 surrogate pair, as a code unit (`charCodeAt`). */
107
+ export function isLowSurrogate(unit) {
108
+ return unit >= 0xdc00 && unit <= 0xdfff;
41
109
  }
42
110
  /**
43
- * Keep a truncated slice line-terminated, borrowing `sourceRaw`'s own ending (G4.20). A slice
44
- * whose last line stays open swallows whatever follows it once the bytes stand alone.
111
+ * `offset` moved off the interior of a surrogate pair, back to the pair's start: a cut there
112
+ * leaves a lone surrogate, which no UTF-8 encoder round-trips. Code points only, not graphemes.
45
113
  */
46
- export function terminateLine(text, sourceRaw) {
47
- return text.endsWith('\n') ? text : text + trailingLineEnding(sourceRaw);
114
+ export function snapToScalarBoundary(raw, offset) {
115
+ if (offset <= 0 || offset >= raw.length)
116
+ return offset;
117
+ const splitsPair = isHighSurrogate(raw.charCodeAt(offset - 1)) && isLowSurrogate(raw.charCodeAt(offset));
118
+ return splitsPair ? offset - 1 : offset;
48
119
  }
49
- /** Paste entry points funnel through here so Windows CRLF does not leak into a note. */
120
+ // ── Splitting ────────────────────────────────────────────────────────────────
121
+ /** Every paste entry point goes through here, so the paste rules read LF whatever the clipboard
122
+ * held; the paste writes the document's own ending back. */
50
123
  export function normalizeLineEndings(text) {
51
124
  return text.replace(/\r\n/g, '\n');
52
125
  }
126
+ /** `text` with every line break written as `ending`: how LF text joins a document's own lines. */
127
+ export function withLineEnding(text, ending) {
128
+ return text.replace(/\r?\n/g, ending);
129
+ }
130
+ /** The line break starting at `offset` in `text`, empty when none starts there. */
131
+ export function lineEndingAt(text, offset) {
132
+ if (text[offset] === '\n')
133
+ return '\n';
134
+ return text.startsWith('\r\n', offset) ? '\r\n' : '';
135
+ }
53
136
  export function splitLines(source) {
54
137
  const lines = [];
55
138
  let start = 0;
@@ -68,11 +151,59 @@ export function splitLines(source) {
68
151
  }
69
152
  return lines;
70
153
  }
71
- /**
72
- * Re-mint a `ParsedLine[]` after a per-line strip, as the container parsers do when they reparse
73
- * a prefix-stripped body. Recompute, not spread: reusing an input line's offsets after shortening
74
- * its text desyncs the offsets from the bytes.
75
- */
154
+ /** A block's display as lines, each apart from its ending. A display always has a last line, empty
155
+ * after a final break, and {@link joinDisplayLines} puts the bytes back exactly. */
156
+ export function displayLines(display) {
157
+ const lines = splitLines(display).map((line) => ({
158
+ text: line.text,
159
+ ending: line.lineEnding
160
+ }));
161
+ if (display === '' || display.endsWith('\n'))
162
+ lines.push({ text: '', ending: '' });
163
+ return lines;
164
+ }
165
+ /** {@link displayLines}' first line, read without splitting the rest of `text`. */
166
+ export function firstDisplayLine(text) {
167
+ const at = text.indexOf('\n');
168
+ return displayLines(at < 0 ? text : text.slice(0, at + 1))[0];
169
+ }
170
+ export function joinDisplayLines(lines) {
171
+ return lines.map((line) => line.text + line.ending).join('');
172
+ }
173
+ // ── Indentation ──────────────────────────────────────────────────────────────
174
+ /** Columns of leading indentation, a tab advancing to the next multiple of four (GFM §2.2). */
175
+ export function indentColumns(text) {
176
+ let col = 0;
177
+ for (const char of text) {
178
+ if (char === ' ')
179
+ col++;
180
+ else if (char === '\t')
181
+ col += 4 - (col % 4);
182
+ else
183
+ break;
184
+ }
185
+ return col;
186
+ }
187
+ /** `text` with up to `columns` columns of indentation removed. A tab the cut splits is written as
188
+ * the spaces it spans, since every later reparse reads the child's raw from column zero. */
189
+ export function stripIndentColumns(text, columns) {
190
+ const leadLength = text.length - text.replace(/^[ \t]+/, '').length;
191
+ let col = 0;
192
+ let cut = 0;
193
+ while (cut < leadLength) {
194
+ const width = text[cut] === '\t' ? 4 - (col % 4) : 1;
195
+ if (col + width > columns)
196
+ break;
197
+ col += width;
198
+ cut++;
199
+ }
200
+ const straddles = cut < leadLength && col < columns;
201
+ const tabShifts = columns % 4 !== 0 && text.slice(cut, leadLength).includes('\t');
202
+ if (!straddles && !tabShifts)
203
+ return text.slice(cut);
204
+ return ' '.repeat(indentColumns(text) - columns) + text.slice(leadLength);
205
+ }
206
+ /** A `ParsedLine[]` rebuilt after a per-line strip, offsets recomputed from the stripped bytes. */
76
207
  export function remapStrippedLines(lines, stripLine) {
77
208
  let offset = 0;
78
209
  return lines.map((line, index) => {
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Whether a node's metadata is what a parse of its own bytes derives, key by key: the one compare
3
+ * behind every check and re-read that holds metadata to its bytes.
4
+ */
5
+ import type { NodeView } from './node-views';
6
+ /** The first metadata key whose live value differs from the reparse's, described, or null. */
7
+ export declare function describeMetadataDivergence(live: NodeView, reparsed: NodeView): string | null;
8
+ /** A value as a failure message quotes it: strings quoted, everything else as `String` prints it. */
9
+ export declare function showValue(value: unknown): string;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Whether a node's metadata is what a parse of its own bytes derives, key by key: the one compare
3
+ * behind every check and re-read that holds metadata to its bytes.
4
+ */
5
+ /** The first metadata key whose live value differs from the reparse's, described, or null. */
6
+ export function describeMetadataDivergence(live, reparsed) {
7
+ const liveMeta = (live.metadata ?? {});
8
+ const reMeta = (reparsed.metadata ?? {});
9
+ for (const key of new Set([...Object.keys(liveMeta), ...Object.keys(reMeta)])) {
10
+ if (!valuesEqual(liveMeta[key], reMeta[key])) {
11
+ return `${live.kind}.${key}: live ${showValue(liveMeta[key])} != reparsed ${showValue(reMeta[key])}`;
12
+ }
13
+ }
14
+ return null;
15
+ }
16
+ /** A value as a failure message quotes it: strings quoted, everything else as `String` prints it. */
17
+ export function showValue(value) {
18
+ return typeof value === 'string' ? JSON.stringify(value) : String(value);
19
+ }
20
+ function valuesEqual(a, b) {
21
+ if (Array.isArray(a) && Array.isArray(b)) {
22
+ return a.length === b.length && a.every((v, i) => v === b[i]);
23
+ }
24
+ return a === b;
25
+ }
@@ -1,9 +1,9 @@
1
1
  /**
2
- * G1.9 in the type system (G3.8): a snapshot-shared node is read-only on its serialized bytes,
3
- * so a view freezes every byte-carrying field. `childIds`, `childSpans` and `ownerEpoch` are
4
- * editor bookkeeping, not round-trip bytes, and stay writable through a view. The ONE sanctioned
5
- * view-to-mutable door is the unshare seam (`tree-operations/unshare.ts`) plus the commit
6
- * ceremony's owned scope views (G4.13); everywhere else the source-scan lint holds the perimeter.
2
+ * A node shared with an undo snapshot is read-only on its serialized bytes (G1.9), and a view
3
+ * types that: every byte-carrying field is frozen. `childIds`, `childSpans` and `ownerEpoch` are
4
+ * editor bookkeeping, not round-trip bytes, and stay writable. The only casts from a view back to
5
+ * a mutable node are the copy-before-write in `tree-operations/unshare.ts` and the commit
6
+ * sequence's owned views (G4.13); a lint test holds that line everywhere else.
7
7
  */
8
8
  import type { CstNode, Document } from './nodes';
9
9
  type BytesWritableKey = 'childIds' | 'childSpans' | 'ownerEpoch';
@@ -15,7 +15,8 @@ export type BytesView<T> = T extends string | number | boolean | bigint | symbol
15
15
  };
16
16
  export type NodeView = BytesView<CstNode>;
17
17
  export type DocumentView = BytesView<Document>;
18
- /** A spine root the unshare seam accepts: the live document or a caller-owned children wrapper. */
18
+ /** A root the copy-before-write in `tree-operations/unshare.ts` accepts: the live document or a
19
+ * caller-owned children wrapper. */
19
20
  export type NodeParentView = {
20
21
  readonly children: readonly NodeView[];
21
22
  };
@@ -1,8 +1,8 @@
1
1
  /**
2
- * G1.9 in the type system (G3.8): a snapshot-shared node is read-only on its serialized bytes,
3
- * so a view freezes every byte-carrying field. `childIds`, `childSpans` and `ownerEpoch` are
4
- * editor bookkeeping, not round-trip bytes, and stay writable through a view. The ONE sanctioned
5
- * view-to-mutable door is the unshare seam (`tree-operations/unshare.ts`) plus the commit
6
- * ceremony's owned scope views (G4.13); everywhere else the source-scan lint holds the perimeter.
2
+ * A node shared with an undo snapshot is read-only on its serialized bytes (G1.9), and a view
3
+ * types that: every byte-carrying field is frozen. `childIds`, `childSpans` and `ownerEpoch` are
4
+ * editor bookkeeping, not round-trip bytes, and stay writable. The only casts from a view back to
5
+ * a mutable node are the copy-before-write in `tree-operations/unshare.ts` and the commit
6
+ * sequence's owned views (G4.13); a lint test holds that line everywhere else.
7
7
  */
8
8
  export {};