@voithos-labs/aragonite 0.10.3 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +12 -5
  3. package/dist/a11y-strings.js +61 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +13 -20
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +619 -1089
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +36 -67
  26. package/dist/components/SelectionOverlay.svelte.d.ts +6 -4
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +103 -100
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +35 -28
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +58 -32
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +144 -202
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +46 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +99 -144
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +3 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +9 -4
  102. package/dist/components/blocks/text/click-snap-guard.js +16 -5
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +164 -180
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -105
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +243 -208
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +13 -30
  144. package/dist/components/drag-handle.js +25 -63
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -31
  162. package/dist/components/editor-root-listeners.js +49 -46
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +26 -30
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +380 -0
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +14 -0
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +55 -68
  256. package/dist/core/inline/inline-widgets.js +55 -58
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +33 -17
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -7
  347. package/dist/cursor/height-oracle.js +26 -75
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +16 -8
  365. package/dist/cursor/scrollport.js +28 -5
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -13
  375. package/dist/cursor/visual-lines.js +72 -28
  376. package/dist/cursor/widget-edge-snap.d.ts +23 -0
  377. package/dist/cursor/widget-edge-snap.js +39 -0
  378. package/dist/cursor/widget-offset.d.ts +111 -102
  379. package/dist/cursor/widget-offset.js +352 -177
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +31 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +33 -52
  434. package/dist/editor-actions/focus/focus-landing.d.ts +11 -5
  435. package/dist/editor-actions/focus/focus-landing.js +29 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +55 -76
  465. package/dist/editor-actions/plugin/container.js +105 -186
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +91 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +38 -8
  550. package/dist/plugin.js +102 -74
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +113 -85
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -75
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +63 -47
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +18 -7
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +143 -292
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +79 -81
  695. package/dist/schema/commands.js +156 -116
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +9 -11
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +73 -78
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +93 -152
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +61 -104
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +53 -146
  807. package/dist/selection/dead-space-caret.d.ts +20 -28
  808. package/dist/selection/dead-space-caret.js +79 -87
  809. package/dist/selection/drag-pointer.d.ts +22 -5
  810. package/dist/selection/drag-pointer.js +63 -31
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -39
  816. package/dist/selection/keyboard-extend.js +94 -116
  817. package/dist/selection/multi-click.d.ts +37 -0
  818. package/dist/selection/multi-click.js +197 -0
  819. package/dist/selection/native-bridge.d.ts +30 -37
  820. package/dist/selection/native-bridge.js +80 -100
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +31 -14
  824. package/dist/selection/path-lookup.js +110 -20
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +9 -0
  828. package/dist/selection/pointer-gesture.js +11 -0
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -33
  832. package/dist/selection/primitives.js +61 -53
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -19
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +52 -0
  852. package/dist/selection/selection-drop.js +317 -0
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +75 -53
  864. package/dist/styles/editor.css +248 -139
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +19 -0
  960. package/dist/tree-operations/paste/replacement-parse.js +24 -0
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +329 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +267 -183
  996. package/docs/guide/plugin-guide.md +341 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +17 -21
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/invariants/split-landing.d.ts +0 -8
  1015. package/dist/invariants/split-landing.js +0 -15
  1016. package/dist/selection/double-click-trim.d.ts +0 -17
  1017. package/dist/selection/double-click-trim.js +0 -57
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -29
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -75
@@ -1,101 +1,94 @@
1
1
  /**
2
- * The generic per-kind conformance battery — the executable half of the closure matrix.
3
- * Registering a block kind enrolls it: one cell per `ClosureColumn`, derived from the
4
- * kind's `closure` block and `conformanceFixture`. A cell is executed only where its
5
- * mechanism is headlessly observable; everything else is recorded as `boundary` or
6
- * `exempt`, never stubbed green. Runner-agnostic — plain `Error`s, no runner import.
2
+ * The generic per-kind conformance battery: registering a block kind enrolls it, one cell per
3
+ * `ClosureColumn` plus the raw-write cell, read from its descriptor and `conformanceFixture`. A
4
+ * cell runs only where headless code can observe what it checks; the rest is reported `boundary`
5
+ * or `exempt`, never stubbed green.
7
6
  */
8
- import { displayLength, trimTrailingLineEnding } from '../core/lines';
7
+ import { displayLength, documentLineEnding, ownTrailingLineEnding, trimTrailingLineEnding } from '../core/lines';
9
8
  import { parse } from '../core/parser';
10
9
  import { serialize } from '../core/serializer';
11
- import { getBlockKindDescriptor } from '../schema/block-kind-descriptor';
10
+ import { CLOSURE_COLUMNS } from '../schema/closure';
11
+ import { getBlockKindDescriptor, isGridDescriptor } from '../schema/block-kind-descriptor';
12
12
  import { isMergeEligible } from '../schema/merge-rules';
13
13
  import { isWholeBlockUnit } from '../schema/whole-block-unit';
14
14
  import { collectCrossBlockText } from '../selection/clipboard-text';
15
+ import { coverRange, rangeCoverage } from '../selection/range-coverage';
15
16
  import { createSelectionState } from '../selection/selection-state.svelte';
16
17
  import { pathsEqual } from '../selection/path-math';
17
18
  import { scanDocument } from '../search/document-scan';
18
19
  import { compileMatcher } from '../search/matcher';
19
20
  import { createBlockEditActions } from '../editor-actions/block-edit';
20
21
  import { createUndoController } from '../editor-actions/commit/undo-controller';
21
- import { assert, assertIs, assertReasonDocumented, assertRebuildIsParseCanonical, fail, findFirstPathOfKind, nodeAtPath } from './conformance-core';
22
+ import { assert, assertIs, assertRebuildIsParseCanonical, fail, nodeAtPath, runCells, show, subjectNode, subjectPath } from './conformance-core';
23
+ import { installOwnRaw } from '../tree-operations/node-primitives';
24
+ import { defaultGrammarView } from '../schema/block-openers';
22
25
  import { createHeadlessActions } from './headless-actions';
23
- // ── Runner ───────────────────────────────────────────────────────────────────
24
- const CLOSURE_ORDER = [
25
- 'roundTrip',
26
- 'focus',
27
- 'mergeBackspace',
28
- 'selectionPaint',
29
- 'searchPaint',
30
- 'reorder',
31
- 'undo',
32
- 'clipboard',
33
- 'simOracle'
34
- ];
26
+ import { assertParseConverged } from './parse-convergence';
35
27
  /**
36
- * Execute every headless closure cell for `kind`, or throw an `Error` naming each failed
37
- * cell. A `conformanceFixture` parsing to no node of the kind fails the run outright.
28
+ * Runs every headless closure cell for `kind`, or throws an `Error` naming each failed cell. A
29
+ * `conformanceFixture` that parses to no node of the kind fails the run outright.
38
30
  */
39
31
  export async function runKindConformance(kind, profile = {}) {
40
32
  const descriptor = getBlockKindDescriptor(kind);
41
- const ctx = buildContext(kind, descriptor);
42
- const cells = [];
43
- const failures = [];
44
- for (const column of CLOSURE_ORDER) {
45
- const cell = descriptor.closure[column];
46
- try {
33
+ const run = { kind, descriptor, parsed: buildContext(kind, descriptor) };
34
+ const columns = Object.keys(CLOSURE_COLUMNS);
35
+ const cells = [
36
+ ...columns.map((column) => {
47
37
  const custom = profile.cells?.[column]?.check;
48
- const result = custom
49
- ? await runCustomCheck(kind, column, cell, custom, ctx)
50
- : await executeCell(column, cell, kind, descriptor, ctx);
51
- if (result.status === 'exempt') {
52
- assertReasonDocumented(result.detail, `${kind} ${column} exempt reason`);
53
- }
54
- cells.push({ column, mode: cell.mode, ...result });
55
- }
56
- catch (error) {
57
- failures.push(`${column}: ${error.message}`);
58
- }
59
- }
60
- if (failures.length > 0) {
61
- fail(`kind conformance failed for "${kind}":\n - ${failures.join('\n - ')}`);
62
- }
63
- return { kind, cells };
38
+ return {
39
+ cell: column,
40
+ run: custom
41
+ ? () => runCustomCheck(column, custom, run)
42
+ : () => executeCell(column, descriptor.closure[column], run)
43
+ };
44
+ }),
45
+ { cell: 'rawWrite', run: execRawWrite }
46
+ ];
47
+ const reports = await runCells(cells, run, {
48
+ subject: kind,
49
+ heading: `kind conformance failed for "${kind}"`
50
+ });
51
+ return {
52
+ kind,
53
+ cells: reports.map((report) => report.cell === 'rawWrite'
54
+ ? report
55
+ : { ...report, mode: descriptor.closure[report.cell].mode })
56
+ };
64
57
  }
65
58
  function buildContext(kind, descriptor) {
66
59
  const fixture = descriptor.conformanceFixture;
67
60
  if (fixture === undefined)
68
61
  return null;
69
62
  const doc = parse(fixture);
70
- const nodePath = findFirstPathOfKind(doc, kind);
71
- if (!nodePath) {
72
- fail(`kind conformance failed for "${kind}": conformanceFixture parses to no "${kind}" node`);
73
- }
74
- // The one place every executor receives the fixture, so the position contract they drive
75
- // `doc.children[0]` on (undo deletes it, the byte-slice copy sweeps from it) is settled here.
63
+ const nodePath = subjectPath(doc, kind, 'first', `kind conformance failed for "${kind}": conformanceFixture`);
64
+ // Every check receives the fixture here, so the rule they rely on (the node at
65
+ // `doc.children[0]`) is enforced once: undo deletes it and the byte-slice copy starts from it.
76
66
  if (nodePath[0] !== 0) {
77
67
  fail(`kind conformance failed for "${kind}": conformanceFixture must open with the "${kind}" ` +
78
68
  `block (found under top-level index ${nodePath[0]}) — the kit drives the fixture's first ` +
79
69
  `block and rides its own sentinel beside it`);
80
70
  }
81
- return { kind, descriptor, fixture, doc, node: nodeAtPath(doc, nodePath), nodePath };
71
+ return { kind, fixture, doc, node: nodeAtPath(doc, nodePath), nodePath };
82
72
  }
83
- async function runCustomCheck(kind, column, cell, check, ctx) {
84
- // On any mode but `implemented` a custom check contradicts the declaration and would
85
- // silence the declared-mode executor, so reverting a profiled cell's mode goes red.
86
- if (cell.mode !== 'implemented') {
73
+ async function runCustomCheck(column, check, { kind, descriptor, parsed }) {
74
+ const mode = descriptor.closure[column].mode;
75
+ // In any mode but `implemented` a custom check contradicts the declaration and would silence
76
+ // the check that mode would run, so changing a profiled cell's mode back fails.
77
+ if (mode !== 'implemented') {
87
78
  fail(`profile supplies a "${column}" check for "${kind}", but its declared mode is ` +
88
- `"${cell.mode}" — a custom check is only valid on an 'implemented' cell`);
79
+ `"${mode}" — a custom check is only valid on an 'implemented' cell`);
89
80
  }
90
- if (!ctx) {
81
+ if (!parsed) {
91
82
  fail(`profile supplies a "${column}" check but "${kind}" has no conformanceFixture to run it over`);
92
83
  }
93
- await check(ctx);
94
- return { status: 'executed', detail: 'profile custom check' };
84
+ await check(parsed);
85
+ return 'profile custom check';
95
86
  }
96
87
  // ── Cell executors ─────────────────────────────────────────────────────────
97
- const BROWSER_SWEEP = 'browser cell — executed in the browser sweep';
98
- async function executeCell(column, cell, kind, descriptor, ctx) {
88
+ // aragonite's own e2e sweep runs these for the kinds its repository registers, never a plugin's.
89
+ const BROWSER_ONLY = 'browser-only cell, for a browser test of your own';
90
+ const NO_FIXTURE = 'no conformanceFixture, so unchecked: declare one for the kit to parse';
91
+ async function executeCell(column, cell, { kind, descriptor, parsed: ctx }) {
99
92
  switch (column) {
100
93
  case 'roundTrip':
101
94
  return execRoundTrip(kind, descriptor, ctx);
@@ -108,16 +101,16 @@ async function executeCell(column, cell, kind, descriptor, ctx) {
108
101
  case 'clipboard':
109
102
  return execClipboard(cell, ctx);
110
103
  case 'focus':
111
- return { status: 'boundary', detail: `native caret / focus policy — ${BROWSER_SWEEP}` };
104
+ return { status: 'boundary', detail: `native caret / focus policy: ${BROWSER_ONLY}` };
112
105
  case 'selectionPaint':
113
- return { status: 'boundary', detail: `selection cover paint — ${BROWSER_SWEEP}` };
106
+ return { status: 'boundary', detail: `selection cover paint: ${BROWSER_ONLY}` };
114
107
  case 'reorder':
115
108
  return execReorder(cell);
116
109
  case 'simOracle':
117
110
  return {
118
111
  status: 'boundary',
119
- detail: 'note-taking simulation under the corruption oracles — run by the platform sweep ' +
120
- 'over the kinds it enrolls, never by this runner'
112
+ detail: 'note-taking simulation under the corruption checks: run by aragonite over the ' +
113
+ 'kinds its own repository registers, never by this runner'
121
114
  };
122
115
  }
123
116
  }
@@ -125,28 +118,23 @@ function execRoundTrip(kind, descriptor, ctx) {
125
118
  if (!ctx) {
126
119
  return {
127
120
  status: 'boundary',
128
- detail: `no conformanceFixture — round-trip runs in the ${BROWSER_SWEEP}`
121
+ detail: `round-trip: ${NO_FIXTURE}`
129
122
  };
130
123
  }
131
124
  assertIs(serialize(parse(ctx.fixture)), ctx.fixture, `serialize(parse(fixture)) round-trips for "${kind}"`);
132
125
  if (descriptor.rebuildRaw) {
133
- const first = rebuildRawOf(kind, ctx.fixture, descriptor);
134
- const second = rebuildRawOf(kind, ctx.fixture, descriptor);
126
+ const first = rebuildRawOf(ctx, descriptor);
127
+ const second = rebuildRawOf(ctx, descriptor);
135
128
  assertIs(first, second, `"${kind}" rebuildRaw is deterministic`);
136
- assertRebuildIsParseCanonical(descriptor, nodeAtPath(parse(ctx.fixture), ctx.nodePath), `"${kind}"`);
137
- return {
138
- status: 'executed',
139
- detail: descriptor.containerContract === 'grid'
140
- ? 'byte round-trip + rebuildRaw determinism'
141
- : 'byte round-trip + rebuildRaw parse-identity + determinism'
142
- };
129
+ assertRebuildIsParseCanonical(descriptor, freshSubject(ctx), `"${kind}"`);
130
+ return isGridDescriptor(descriptor)
131
+ ? 'byte round-trip + rebuildRaw determinism'
132
+ : 'byte round-trip + rebuildRaw parse-identity + determinism';
143
133
  }
144
- return { status: 'executed', detail: 'byte round-trip' };
134
+ return 'byte round-trip';
145
135
  }
146
- /**
147
- * An independent restatement of the merge-role → Backspace-merge table
148
- * (docs/design/editor.md); re-deriving it from `isMergeEligible` would be vacuous.
149
- */
136
+ /** An independent restatement of the merge-role table (`docs/design/editor.md` § Merge
137
+ * eligibility: roles, not pairs); derived from `isMergeEligible` it would test nothing. */
150
138
  const MERGE_ROLE_EXPECTATION = {
151
139
  prose: { currentIntoProse: true, prevForProse: true, self: true },
152
140
  'prose-absorber': { currentIntoProse: false, prevForProse: true, self: false },
@@ -159,11 +147,11 @@ function execMergeBackspace(kind, role) {
159
147
  assertIs(isMergeEligible('paragraph', kind), expected.currentIntoProse, `"${kind}" (${role}) Backspace-merges as the current block into a prose predecessor`);
160
148
  assertIs(isMergeEligible(kind, 'paragraph'), expected.prevForProse, `"${kind}" (${role}) absorbs a following prose block`);
161
149
  assertIs(isMergeEligible(kind, kind), expected.self, `"${kind}" (${role}) self-merge eligibility`);
162
- return { status: 'executed', detail: `mergeRole=${role} eligibility` };
150
+ return `mergeRole=${role} eligibility`;
163
151
  }
164
152
  function execSearchPaint(cell, ctx) {
165
153
  if (cell.mode !== 'not-supported') {
166
- return { status: 'boundary', detail: `search-match mark overlay — ${BROWSER_SWEEP}` };
154
+ return { status: 'boundary', detail: `search-match mark overlay: ${BROWSER_ONLY}` };
167
155
  }
168
156
  if (!ctx)
169
157
  return { status: 'exempt', detail: cell.reason };
@@ -173,19 +161,19 @@ function execSearchPaint(cell, ctx) {
173
161
  const compiled = compileMatcher(needle, { caseSensitive: true, wholeWord: false, regex: false });
174
162
  if (!compiled.ok)
175
163
  return { status: 'exempt', detail: cell.reason };
176
- // Non-vacuity: the needle IS present in the raw, so no match can only mean the scan
177
- // deliberately skips this non-searchable kind.
164
+ // The needle is present in the raw, so no match can only mean the search deliberately
165
+ // skips this non-searchable kind.
178
166
  assert(compiled.matcher.findAll(ctx.node.raw).length > 0, `needle "${needle}" is present in the "${ctx.kind}" raw`);
179
167
  const hits = scanDocument(ctx.doc, compiled.matcher).filter((m) => pathsEqual(m.path, ctx.nodePath));
180
168
  assertIs(hits.length, 0, `the document scan finds no match in the non-searchable "${ctx.kind}"`);
181
- return { status: 'executed', detail: 'document scan finds no match (degradation)' };
169
+ return 'document scan finds no match (degradation)';
182
170
  }
183
171
  function execReorder(cell) {
184
172
  if (cell.mode === 'not-supported')
185
173
  return { status: 'exempt', detail: cell.reason };
186
174
  return {
187
175
  status: 'boundary',
188
- detail: `block reorder is an Alt+Arrow / drag gesture — ${BROWSER_SWEEP}`
176
+ detail: `block reorder is an Alt+Arrow / drag gesture: ${BROWSER_ONLY}`
189
177
  };
190
178
  }
191
179
  async function execUndo(cell, ctx) {
@@ -194,25 +182,27 @@ async function execUndo(cell, ctx) {
194
182
  if (cell.mode === 'implemented') {
195
183
  return {
196
184
  status: 'boundary',
197
- detail: `kind-specific undo mechanism — supply a profile check or run it in the ${BROWSER_SWEEP}`
185
+ detail: `kind-specific undo mechanism: supply a profile check or cover it in a browser test`
198
186
  };
199
187
  }
200
188
  if (!ctx)
201
189
  return {
202
190
  status: 'boundary',
203
- detail: `no conformanceFixture — undo depth runs in the ${BROWSER_SWEEP}`
191
+ detail: `undo depth: ${NO_FIXTURE}`
204
192
  };
205
193
  const doc = parse(ctx.fixture + '\n\nundo sentinel\n');
206
194
  assert(doc.children.length > 1, `the kit's trailing sentinel parses beside the "${ctx.kind}" fixture rather than being ` +
207
195
  `swallowed by it, so there is a second block to delete`);
208
- const { deps } = createHeadlessActions(doc.children);
196
+ // Block 0 is the one deleted, so the kind has to still sit under it with the sentinel added.
197
+ subjectPath(doc, ctx.kind, ctx.nodePath, 'conformanceFixture with the undo sentinel');
198
+ const { deps } = createHeadlessActions(doc);
209
199
  const controller = createUndoController(deps);
210
200
  const blockEdit = createBlockEditActions(deps, controller);
211
201
  const before = deps.undoManager.getStacks().undo.length;
212
- await blockEdit.deleteBlock(0);
202
+ await blockEdit.deleteBlock(0, 'keyless');
213
203
  const after = deps.undoManager.getStacks().undo.length;
214
204
  assertIs(after - before, 1, `one structural op pushes exactly one undo entry over the "${ctx.kind}" fixture`);
215
- return { status: 'executed', detail: 'one structural op → one undo entry' };
205
+ return 'one structural op → one undo entry';
216
206
  }
217
207
  function execClipboard(cell, ctx) {
218
208
  if (cell.mode === 'not-supported')
@@ -220,45 +210,61 @@ function execClipboard(cell, ctx) {
220
210
  if (cell.mode === 'implemented') {
221
211
  return {
222
212
  status: 'boundary',
223
- detail: `kind-specific clipboard mechanism — supply a profile check or run it in the ${BROWSER_SWEEP}`
213
+ detail: `kind-specific clipboard mechanism: supply a profile check or cover it in a browser test`
224
214
  };
225
215
  }
226
216
  if (!ctx)
227
217
  return {
228
218
  status: 'boundary',
229
- detail: `no conformanceFixture — copy runs in the ${BROWSER_SWEEP}`
219
+ detail: `copy: ${NO_FIXTURE}`
230
220
  };
231
221
  if (ctx.nodePath.length !== 1) {
232
222
  return {
233
223
  status: 'boundary',
234
- detail: 'nested kind — copied as part of its container; the enclosing container cell covers its bytes'
224
+ detail: 'nested kind: copied as part of its container; the enclosing container cell covers its bytes'
235
225
  };
236
226
  }
237
227
  checkCopyIsRawByteSlice(ctx.kind, ctx.fixture);
238
- return { status: 'executed', detail: 'copy is a raw byte slice (no synthesis)' };
228
+ return 'copy is a raw byte slice (no synthesis)';
229
+ }
230
+ function execRawWrite({ kind, descriptor, parsed: ctx }) {
231
+ const hasTopLevelFixture = ctx !== null && ctx.nodePath.length === 1;
232
+ if (!descriptor.rawWrite) {
233
+ if (!hasTopLevelFixture) {
234
+ return {
235
+ status: 'exempt',
236
+ detail: 'declares no rawWrite and has no top-level conformanceFixture to cut'
237
+ };
238
+ }
239
+ checkClosingCutNeedsNoRule(kind, ctx.fixture);
240
+ return 'declares no rawWrite, and the closing line cut leaves the next block its own';
241
+ }
242
+ if (!hasTopLevelFixture) {
243
+ return {
244
+ status: 'boundary',
245
+ detail: 'declares rawWrite but has no top-level conformanceFixture to write over'
246
+ };
247
+ }
248
+ checkLeafRawWrite(kind, ctx.fixture);
249
+ return 'five writes, each idempotent, leaving the next block its own, caret map agreeing';
239
250
  }
240
251
  // ── Exported executors (direct-drive for regression tests) ───────────────────
241
252
  const TRAILING_SENTINEL = '\n\nclipboard sentinel\n';
242
253
  const LEADING_SENTINEL = 'clipboard lead\n\n';
243
- /**
244
- * Assert the default cross-block copy over `kind`'s fixture carries its bytes with no
245
- * kind-specific synthesis, at BOTH endpoint roles — the honest meaning of
246
- * `clipboard: inherit-default`. Endpoints ride the real selection funnel, so the expectation is
247
- * the contract, never a re-derivation of the slice under test. Fixture contract: `fixture`
248
- * parses to `kind` at `children[0]`; the kit adds its sentinel block on the sweeping side.
249
- */
254
+ /** Asserts the default cross-block copy over `kind`'s fixture is a raw byte slice at both endpoint
255
+ * roles, which is what `clipboard: inherit-default` means; the fixture opens with `kind`. */
250
256
  export function checkCopyIsRawByteSlice(kind, fixture) {
251
- assertIs(parse(fixture).children[0]?.kind, kind, `"${kind}" is the top-level copy subject: a conformanceFixture must parse to its kind ` +
252
- `at children[0], and the kit adds its own sentinel block on the sweeping side`);
257
+ subjectNode(parse(fixture), kind, [0], `the copy fixture (a conformanceFixture must parse to its kind at children[0], and the kit ` +
258
+ `adds its own sentinel block on the sweeping side)`);
253
259
  checkCopyFromKind(kind, fixture);
254
260
  checkCopyIntoKind(kind, fixture);
255
261
  }
256
- /** The kind as the range START: its tail, then the sentinel's head. */
262
+ /** The kind as the start of the range: its tail, then the sentinel's head. */
257
263
  function checkCopyFromKind(kind, fixture) {
258
264
  const doc = parse(fixture + TRAILING_SENTINEL);
259
265
  const lastIndex = doc.children.length - 1;
260
266
  assert(lastIndex >= 1, 'fixture + sentinel yields a second block to copy across');
261
- const kindNode = doc.children[0];
267
+ const kindNode = subjectNode(doc, kind, [0], 'the copy fixture');
262
268
  const sentinel = doc.children[lastIndex];
263
269
  const startOffset = interiorOffset(kindNode);
264
270
  const endOffset = displayLength(sentinel.raw);
@@ -269,13 +275,14 @@ function checkCopyFromKind(kind, fixture) {
269
275
  sentinel.leadingTrivia +
270
276
  sentinel.raw.slice(0, endOffset), `"${kind}" copy is a raw byte slice — no kind-specific synthesis`);
271
277
  }
272
- /** The kind as the range END, the role a start-only check never exercises. */
278
+ /** The kind as the end of the range, the role a start-only check never exercises. */
273
279
  function checkCopyIntoKind(kind, fixture) {
274
280
  const doc = parse(LEADING_SENTINEL + fixture);
275
- const kindIndex = doc.children.length - 1;
281
+ // Counted from the end, since a fixture may carry blocks after its kind.
282
+ const kindIndex = doc.children.length - parse(fixture).children.length;
276
283
  assert(kindIndex >= 1, 'sentinel + fixture yields a block to copy across from');
277
284
  const sentinel = doc.children[0];
278
- const kindNode = doc.children[kindIndex];
285
+ const kindNode = subjectNode(doc, kind, [kindIndex], 'the copy fixture after the sentinel');
279
286
  const startOffset = interiorOffset(sentinel);
280
287
  const copied = copyThroughFunnel(doc, { path: [0], offset: startOffset }, { path: [kindIndex], offset: interiorOffset(kindNode) });
281
288
  const head = isWholeBlockUnit(kindNode)
@@ -293,26 +300,27 @@ function bytesBetween(children, from, to) {
293
300
  .map((node) => node.leadingTrivia + node.raw)
294
301
  .join('');
295
302
  }
296
- /**
297
- * The production mint→store→slice chain: endpoints normalize in `SelectionState` exactly as a
298
- * gesture's would, so a kind whose offsets the funnel rewrites is copied as the editor copies it.
299
- */
303
+ /** Copies through the production selection code, so a kind whose endpoints `SelectionState`
304
+ * normalizes is copied the way the editor copies it. */
300
305
  function copyThroughFunnel(doc, anchor, focus) {
301
306
  const selection = createSelectionState({ getDoc: () => doc });
302
307
  selection.enterCrossBlock(anchor, focus);
303
308
  const { start, end } = selection;
304
309
  if (!start || !end)
305
310
  fail('the selection funnel refused the cross-block endpoint pair');
306
- return collectCrossBlockText(doc, start, end);
311
+ return collectCrossBlockText(doc, rangeCoverage(doc, coverRange(doc, start, end)));
307
312
  }
308
313
  /** An offset strictly inside the block, so a kind that snaps its endpoints is seen doing it. */
309
314
  function interiorOffset(node) {
310
315
  return displayLength(node.raw) > 1 ? 1 : 0;
311
316
  }
312
317
  // ── Internal helpers ─────────────────────────────────────────────────────────
313
- function rebuildRawOf(kind, fixture, descriptor) {
314
- const doc = parse(fixture);
315
- const node = nodeAtPath(doc, findFirstPathOfKind(doc, kind));
318
+ /** The kind's node in a fresh parse of the fixture, for a check that writes to it. */
319
+ function freshSubject(ctx) {
320
+ return subjectNode(parse(ctx.fixture), ctx.kind, ctx.nodePath, 'conformanceFixture');
321
+ }
322
+ function rebuildRawOf(ctx, descriptor) {
323
+ const node = freshSubject(ctx);
316
324
  descriptor.rebuildRaw(node);
317
325
  return node.raw;
318
326
  }
@@ -323,3 +331,82 @@ function firstVisibleChar(raw) {
323
331
  }
324
332
  return null;
325
333
  }
334
+ const RAW_WRITE_SENTINEL = 'raw write sentinel\n';
335
+ function fixtureLines(fixture) {
336
+ const ending = ownTrailingLineEnding(fixture) || '\n';
337
+ const lines = trimTrailingLineEnding(fixture).split(ending);
338
+ return { ending, lines, closingCut: lines.slice(0, -1).join(ending) + ending };
339
+ }
340
+ /**
341
+ * For a kind with no `rawWrite`: the fixture with its closing line cut must not absorb
342
+ * the block after it, or a range delete over the closer turns the document below into its body.
343
+ */
344
+ function checkClosingCutNeedsNoRule(kind, fixture) {
345
+ const { ending, closingCut } = fixtureLines(fixture);
346
+ const following = parse(closingCut + ending + RAW_WRITE_SENTINEL).children.at(-1);
347
+ if (following?.raw === RAW_WRITE_SENTINEL)
348
+ return;
349
+ fail(`"${kind}" declares no rawWrite, and the closing line cut (${show(closingCut)}) ` +
350
+ `swallows the next block (${show(RAW_WRITE_SENTINEL)}): declare rawWrite to ` +
351
+ `put the closer back`);
352
+ }
353
+ /** Drives five writes over `kind`'s fixture through its `rawWrite` rule; each result must be a
354
+ * fixed point of the rule, leave the next block its own, and have an agreeing caret map. */
355
+ export function checkLeafRawWrite(kind, fixture, rule = getBlockKindDescriptor(kind).rawWrite) {
356
+ if (!rule)
357
+ fail(`"${kind}" declares no rawWrite to drive`);
358
+ const { ending, lines, closingCut } = fixtureLines(fixture);
359
+ const writes = [
360
+ ['the closing line cut', closingCut, lines.length > 2],
361
+ ['everything past the first line cut', lines[0] + ending, false],
362
+ ['an empty write', '', false]
363
+ ];
364
+ if (lines.length > 1) {
365
+ const closer = lines[lines.length - 1];
366
+ const closerInBody = [lines[0], closer, ...lines.slice(1)];
367
+ writes.push(['the first line cut', lines.slice(1).join(ending) + ending, false], ['the closing line copied into the body', closerInBody.join(ending) + ending, false]);
368
+ }
369
+ for (const [label, written, keepsKind] of writes) {
370
+ const doc = parse(fixture + ending + RAW_WRITE_SENTINEL);
371
+ const node = subjectNode(doc, kind, [0], 'the rawWrite fixture');
372
+ const ctx = { node, mode: 'literal', lineEnding: documentLineEnding(doc) };
373
+ const legal = rule.normalize(written, ctx);
374
+ assertIs(rule.normalize(legal, ctx), legal, `"${kind}" rule is idempotent on ${label}`);
375
+ checkCaretMap(`"${kind}" caret map on ${label}`, written, legal, (offset) => rule.mapOffset(written, offset, ctx));
376
+ const following = parse(legal + ending + RAW_WRITE_SENTINEL).children.at(-1);
377
+ assertIs(following?.raw, RAW_WRITE_SENTINEL, `"${kind}" after ${label} (${show(legal)}) leaves the next block its own`);
378
+ if (!keepsKind)
379
+ continue;
380
+ const reparsed = parse(legal).children;
381
+ assertIs(reparsed[0]?.kind, kind, `"${kind}" stays its kind after ${label}`);
382
+ installOwnRaw(node, legal, defaultGrammarView);
383
+ assertParseConverged(doc, `"${kind}" written in place after ${label}`);
384
+ }
385
+ }
386
+ /** A caret map agrees with its rule when offsets stay ordered and in range, one before every
387
+ * change stays, and one after every change moves by the length the rule added or dropped. */
388
+ function checkCaretMap(label, written, legal, mapOffset) {
389
+ const shorter = Math.min(written.length, legal.length);
390
+ let prefix = 0;
391
+ while (prefix < shorter && written[prefix] === legal[prefix])
392
+ prefix++;
393
+ let suffix = 0;
394
+ while (suffix < shorter - prefix &&
395
+ written[written.length - 1 - suffix] === legal[legal.length - 1 - suffix]) {
396
+ suffix++;
397
+ }
398
+ const grown = legal.length - written.length;
399
+ let previous = 0;
400
+ for (let offset = 0; offset <= written.length; offset++) {
401
+ const mapped = mapOffset(offset);
402
+ const at = `${label} at ${offset} (${show(written)} to ${show(legal)})`;
403
+ assert(mapped >= previous && mapped <= legal.length, `${at}: ${mapped} is out of order`);
404
+ previous = mapped;
405
+ if (written === legal || offset < prefix) {
406
+ assertIs(mapped, offset, `${at} stays, since the rule changed nothing before it`);
407
+ }
408
+ else if (offset > written.length - suffix) {
409
+ assertIs(mapped, offset + grown, `${at} moves by what the rule changed before it`);
410
+ }
411
+ }
412
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The reading a kit gives the editor parts it builds without mounting an editor: every installed
3
+ * plugin's syntax, no link-reference definitions, and a mode the caller may set.
4
+ */
5
+ import { type PresentationMode } from '../presentation-mode';
6
+ import type { Reading } from '../schema/reading';
7
+ export declare function kitReading(mode?: () => PresentationMode): Reading;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The reading a kit gives the editor parts it builds without mounting an editor: every installed
3
+ * plugin's syntax, no link-reference definitions, and a mode the caller may set.
4
+ */
5
+ import { hidesDelimitersAtCaret } from '../presentation-mode';
6
+ import { defaultGrammarView } from '../schema/block-openers';
7
+ export function kitReading(mode = () => 'source') {
8
+ return {
9
+ grammar: defaultGrammarView,
10
+ resolver: undefined,
11
+ resolverSignature: '',
12
+ resolverEpoch: 0,
13
+ mode,
14
+ hidesDelimitersAtCaret: () => hidesDelimitersAtCaret(mode())
15
+ };
16
+ }
@@ -1,8 +1,7 @@
1
1
  /**
2
- * Install the jsdom gaps a mounted editor hits — the block-height `ResizeObserver` and the
3
- * reveal's `scrollIntoView` — once, before the first mount. Each lands only where absent, so a
4
- * runner supplying a real one keeps it and the call is inert in a browser. Windowing activates
5
- * on ESTIMATED height in either scroll mode, so keep fixture documents small if a test asserts
6
- * on a block being mounted; jsdom reports a zero viewport and mounts only the first few.
2
+ * Fills the jsdom gaps a mounted editor hits (`ResizeObserver`, `scrollIntoView`, a range's
3
+ * rects) where they are missing; call once before the first mount. jsdom's viewport has no
4
+ * height, so only a few blocks mount: keep fixture documents small when a test asserts a block is
5
+ * mounted.
7
6
  */
8
7
  export declare function installEditorDomStubsForTests(): void;
@@ -4,11 +4,10 @@ class NoopResizeObserver {
4
4
  disconnect() { }
5
5
  }
6
6
  /**
7
- * Install the jsdom gaps a mounted editor hits — the block-height `ResizeObserver` and the
8
- * reveal's `scrollIntoView` — once, before the first mount. Each lands only where absent, so a
9
- * runner supplying a real one keeps it and the call is inert in a browser. Windowing activates
10
- * on ESTIMATED height in either scroll mode, so keep fixture documents small if a test asserts
11
- * on a block being mounted; jsdom reports a zero viewport and mounts only the first few.
7
+ * Fills the jsdom gaps a mounted editor hits (`ResizeObserver`, `scrollIntoView`, a range's
8
+ * rects) where they are missing; call once before the first mount. jsdom's viewport has no
9
+ * height, so only a few blocks mount: keep fixture documents small when a test asserts a block is
10
+ * mounted.
12
11
  */
13
12
  export function installEditorDomStubsForTests() {
14
13
  const globals = globalThis;
@@ -16,4 +15,8 @@ export function installEditorDomStubsForTests() {
16
15
  if (typeof Element !== 'undefined' && !Element.prototype.scrollIntoView) {
17
16
  Element.prototype.scrollIntoView = () => { };
18
17
  }
18
+ if (typeof Range !== 'undefined' && !Range.prototype.getClientRects) {
19
+ Range.prototype.getClientRects = () => [];
20
+ Range.prototype.getBoundingClientRect = () => new DOMRect();
21
+ }
19
22
  }
@@ -1,14 +1,14 @@
1
1
  /**
2
- * The parse-convergence oracle. A byte round-trip after a mutation is a tautology (G2.1 makes
3
- * `serialize∘parse` identity), so this compares the LIVE tree against `parse(serialize(live))`
4
- * STRUCTURALLY instead: kinds, children shape, and parse-derived metadata. The comparison is
5
- * exact: the parser materializes blank lines as blocks, so an empty paragraph reparses as itself.
6
- * The reparse uses the ambient grammar, so an unregistered kind reads as a false divergence.
2
+ * Compares the live tree's structure (kinds, children, every metadata key) with a fresh parse
3
+ * of its own bytes; a byte round-trip would pass trivially, since `serialize(parse(s)) === s` for
4
+ * every input. `parseConverges` and `describeConvergence` take the editor's `grammar` when it
5
+ * has one; `assertParseConverged` reads with the default grammar.
7
6
  */
8
7
  import type { Document } from '../core/nodes';
9
- /** True when the live tree converges structurally with a fresh parse of its serialization. */
10
- export declare function parseConverges(doc: Document): boolean;
11
- /** The FIRST structural divergence from `parse(serialize(doc))`, or null when converged. */
12
- export declare function describeConvergence(doc: Document): string | null;
13
- /** Assert convergence, throwing a plain `Error` (runner-agnostic) on divergence. */
8
+ import type { GrammarView } from '../schema/block-openers';
9
+ /** True when the live tree matches a fresh parse of its own serialization, structurally. */
10
+ export declare function parseConverges(doc: Document, grammar?: GrammarView): boolean;
11
+ /** The first structural difference from `parse(serialize(doc))`, or null when they match. */
12
+ export declare function describeConvergence(doc: Document, grammar?: GrammarView): string | null;
13
+ /** Asserts the two match, throwing a plain `Error` on a difference so any runner can use it. */
14
14
  export declare function assertParseConverged(doc: Document, label?: string): void;