@voithos-labs/aragonite 0.10.4 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +11 -5
  3. package/dist/a11y-strings.js +60 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +12 -21
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +603 -1126
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +26 -51
  26. package/dist/components/SelectionOverlay.svelte.d.ts +5 -3
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +72 -87
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +29 -34
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +57 -39
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +141 -203
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +45 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +93 -147
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +1 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +8 -6
  102. package/dist/components/blocks/text/click-snap-guard.js +10 -7
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +150 -181
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -108
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +212 -199
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +12 -35
  144. package/dist/components/drag-handle.js +22 -68
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -24
  162. package/dist/components/editor-root-listeners.js +49 -24
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +14 -26
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +30 -35
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +3 -5
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +54 -75
  256. package/dist/core/inline/inline-widgets.js +54 -62
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +31 -15
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -6
  347. package/dist/cursor/height-oracle.js +26 -74
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +14 -15
  365. package/dist/cursor/scrollport.js +7 -13
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -14
  375. package/dist/cursor/visual-lines.js +45 -46
  376. package/dist/cursor/widget-edge-snap.d.ts +10 -15
  377. package/dist/cursor/widget-edge-snap.js +13 -12
  378. package/dist/cursor/widget-offset.d.ts +110 -104
  379. package/dist/cursor/widget-offset.js +344 -179
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +30 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +28 -50
  434. package/dist/editor-actions/focus/focus-landing.d.ts +8 -11
  435. package/dist/editor-actions/focus/focus-landing.js +15 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +54 -82
  465. package/dist/editor-actions/plugin/container.js +105 -188
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +88 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +37 -8
  550. package/dist/plugin.js +100 -77
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +78 -67
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -81
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +51 -45
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +15 -6
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +141 -310
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +78 -84
  695. package/dist/schema/commands.js +152 -117
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +8 -10
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +63 -80
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +92 -125
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +59 -96
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +51 -134
  807. package/dist/selection/dead-space-caret.d.ts +19 -30
  808. package/dist/selection/dead-space-caret.js +70 -88
  809. package/dist/selection/drag-pointer.d.ts +7 -9
  810. package/dist/selection/drag-pointer.js +23 -33
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -40
  816. package/dist/selection/keyboard-extend.js +94 -117
  817. package/dist/selection/multi-click.d.ts +13 -18
  818. package/dist/selection/multi-click.js +32 -38
  819. package/dist/selection/native-bridge.d.ts +29 -39
  820. package/dist/selection/native-bridge.js +78 -127
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +25 -16
  824. package/dist/selection/path-lookup.js +101 -18
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +5 -5
  828. package/dist/selection/pointer-gesture.js +5 -5
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -40
  832. package/dist/selection/primitives.js +57 -67
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -23
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +34 -16
  852. package/dist/selection/selection-drop.js +159 -95
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +60 -53
  864. package/dist/styles/editor.css +201 -143
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +9 -7
  960. package/dist/tree-operations/paste/replacement-parse.js +12 -10
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +327 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +253 -185
  996. package/docs/guide/plugin-guide.md +332 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +12 -16
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/cursor/scroll-hold.d.ts +0 -10
  1015. package/dist/cursor/scroll-hold.js +0 -22
  1016. package/dist/invariants/split-landing.d.ts +0 -8
  1017. package/dist/invariants/split-landing.js +0 -15
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -31
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -78
@@ -1,67 +1,75 @@
1
1
  /**
2
- * G4.3 — container conformance kit, published at `@voithos-labs/aragonite/testing`. Register your kind, then
3
- * point the kit at it with fixtures plus a coverage matrix declaring per invariant whether it
4
- * asserts or is excused (never a silent skip; a thin reason fails the run). Which answer a
5
- * container owes each cell is in the plugin guide's "Conformance-testing a container". Asserted
6
- * checks drive the real per-kind action path, stopping at the nested-action default and at a DOM.
2
+ * The container conformance kit, published at `@voithos-labs/aragonite/testing`. Register your
3
+ * kind, then run the kit with fixtures and a coverage table saying, per invariant, whether the cell
4
+ * asserts or is excused; a thin excuse fails the run. What each cell expects:
5
+ * `docs/guide/plugin-testing.md` § The container checkup.
7
6
  */
8
- import { splitLines, trailingLineEnding } from '../core/lines';
7
+ import { documentLineEnding, splitLines, trailingLineEnding } from '../core/lines';
9
8
  import { parse } from '../core/parser';
9
+ import { ancestorsOf } from '../core/paths';
10
10
  import { createContainerEditActions } from '../editor-actions/container-edit';
11
11
  import { createUndoController } from '../editor-actions/commit/undo-controller';
12
- import { createListContext } from '../editor-actions/list-context';
13
12
  import { createStandardNestedActions } from '../editor-actions/nested/nested-actions';
14
13
  import { createNestedFocus } from '../editor-actions/nested/nested-focus';
15
- import { createTableMutationsContext } from '../editor-actions/table-context';
16
14
  import { firstChildUnwrapStrategies, middleChildUnwrapStrategies } from '../editor-actions/unwrap-strategies';
17
15
  import { isDirectiveKind } from '../core/directive/registry';
18
- import { isBlockOpenerRegistered } from '../schema/block-openers';
19
- import { getBlockKindDescriptor } from '../schema/block-kind-descriptor';
16
+ import { defaultGrammarView, isBlockOpenerRegistered } from '../schema/block-openers';
17
+ import { kitReading } from './kit-reading';
18
+ import { getBlockKindDescriptor, isGridDescriptor } from '../schema/block-kind-descriptor';
20
19
  import { rebuildContainerRawIfContainer } from '../schema/container-raw';
21
20
  import { createSharingState } from '../tree-operations/sharing';
22
- import { rebuildUnsharedAncestry } from '../tree-operations/chain-rebuild';
21
+ import { rebuildUnsharedAncestry, rebuildUnsharedChain } from '../tree-operations/chain-rebuild';
22
+ import { walkUnsharing } from '../tree-operations/unshare';
23
23
  import { assertParseConverged } from './parse-convergence';
24
- import { createHeadlessActions, mountBlockListState, recordingFocus, stubBlockEdit, stubStickyColumn } from './headless-actions';
25
- import { assert, assertExemptionDocumented, assertIndices, assertIs, assertRebuildIsParseCanonical, assertReasonDocumented, fail, findFirstOfKind, firstChildOfKind, nodeAtPath, pathPassesThroughKind } from './conformance-core';
26
- /**
27
- * The kit's cells as data, so every sweep runs the same set: {@link runContainerConformance} and
28
- * the registry-derived built-in sweep both iterate this rather than listing cells by hand, which
29
- * is what makes cell N+1 unmissable at either caller.
30
- */
24
+ import { mountBlockListState } from './headless-block-list.svelte';
25
+ import { createHeadlessActions, recordingFocus, stubBlockEdit, stubCaretMemory } from './headless-actions';
26
+ import { assert, assertIndices, assertIs, assertRebuildIsParseCanonical, assertReasonDocumented, fail, findFirstOfKind, nodeAtPath, pathPassesThroughKind, runCells, subjectNode, subjectPath } from './conformance-core';
27
+ /** The kit's cells as data, so {@link runContainerConformance} and the built-in sweep run the
28
+ * same set; `titleRow` and `declarations` declare no coverage and always run. */
31
29
  export const CONTAINER_CONFORMANCE_CELLS = [
32
30
  {
33
31
  cell: 'localIndex',
34
- coverage: (profile) => profile.localIndex,
35
- run: (kind, profile) => getBlockKindDescriptor(kind).containerContract === 'grid'
36
- ? checkGridLocalIndexAddressing()
37
- : checkStripLocalIndexAddressing(profile)
32
+ coverage: ({ profile }) => profile.localIndex,
33
+ run: ({ kind, profile }) => isGridDescriptor(getBlockKindDescriptor(kind))
34
+ ? driverOf(kind, profile, 'gridLocalIndex', 'a grid op')()
35
+ : checkStripLocalIndexAddressing(kind, profile)
36
+ },
37
+ {
38
+ cell: 'ancestry',
39
+ coverage: ({ profile }) => profile.ancestry,
40
+ run: ({ kind, profile }) => checkInnermostFirstAncestry(kind, profile)
38
41
  },
39
- { cell: 'ancestry', coverage: (profile) => profile.ancestry, run: checkInnermostFirstAncestry },
40
42
  {
41
43
  cell: 'multiScope',
42
- coverage: (profile) => profile.multiScope,
43
- run: checkOneUndoPerMultiScope
44
+ coverage: ({ profile }) => profile.multiScope,
45
+ run: ({ kind, profile }) => driverOf(kind, profile, 'multiScope', 'an op spanning two scopes')()
44
46
  },
45
47
  {
46
48
  cell: 'focusBubble',
47
- coverage: (profile) => profile.focusBubble,
48
- run: checkFocusBubbleTermination
49
+ coverage: ({ profile }) => profile.focusBubble,
50
+ run: ({ kind, profile }) => checkFocusBubbleTermination(kind, profile)
49
51
  },
50
52
  {
51
53
  cell: 'terminatorCollision',
52
- coverage: (profile) => profile.terminatorCollision,
53
- run: checkTerminatorCollision
54
+ coverage: ({ profile }) => profile.terminatorCollision,
55
+ run: ({ kind, profile }) => checkTerminatorCollision(kind, profile),
56
+ falsify: ({ kind }) => refuseExcusedCollision(kind)
54
57
  },
55
- { cell: 'declarations', coverage: () => ({ mode: 'assert' }), run: checkDeclarationSanity }
58
+ {
59
+ cell: 'titleRow',
60
+ run: ({ kind }) => checkTitleRowFeedsNoMetadata(kind)
61
+ },
62
+ {
63
+ cell: 'declarations',
64
+ run: ({ kind, profile }) => checkDeclarationSanity(kind, profile)
65
+ }
56
66
  ];
57
- /** The cells whose coverage a profile declares — `declarations` is the kit's, not the author's. */
58
- const BEHAVIORAL_CELLS = CONTAINER_CONFORMANCE_CELLS.filter((c) => c.cell !== 'declarations');
59
67
  /**
60
- * A profile owes at least one asserting behavioral cell. `declarations` is excluded on purpose:
61
- * it asserts for every kind, so counting it would let an all-excused profile clear the floor.
68
+ * A profile must assert at least one cell it declares. `declarations` doesn't count: it asserts
69
+ * for every kind, so counting it would let a profile that excuses everything pass.
62
70
  */
63
71
  export function assertProfileCoverageFloor(kind, profile) {
64
- const asserts = BEHAVIORAL_CELLS.filter((c) => c.coverage(profile).mode === 'assert');
72
+ const asserts = CONTAINER_CONFORMANCE_CELLS.filter((c) => c.coverage?.({ kind, profile }).mode === 'assert');
65
73
  if (asserts.length > 0) {
66
74
  assert(profile.wholeProfileExemption === undefined, `${kind} declares a wholeProfileExemption while ${asserts.length} behavioral cell(s) assert`);
67
75
  return;
@@ -76,42 +84,30 @@ export function assertProfileCoverageFloor(kind, profile) {
76
84
  * `Error` naming every failed cell.
77
85
  */
78
86
  export async function runContainerConformance(kind, profile) {
79
- const cells = [];
80
- const failures = [];
87
+ const earlier = [];
81
88
  try {
82
89
  assertProfileCoverageFloor(kind, profile);
83
90
  }
84
91
  catch (error) {
85
- failures.push(`coverageFloor: ${error.message}`);
86
- }
87
- for (const { cell, coverage: read, run } of CONTAINER_CONFORMANCE_CELLS) {
88
- const coverage = read(profile);
89
- try {
90
- if (coverage.mode === 'assert') {
91
- await run(kind, profile);
92
- cells.push({ cell, status: 'asserted' });
93
- }
94
- else {
95
- assertExemptionDocumented(coverage, `${kind} ${cell}`);
96
- cells.push({ cell, status: coverage.mode, reason: coverage.reason });
97
- }
98
- }
99
- catch (error) {
100
- failures.push(`${cell}: ${error.message}`);
101
- }
102
- }
103
- if (failures.length > 0) {
104
- throw new Error(`container conformance failed for "${kind}":\n - ${failures.join('\n - ')}`);
92
+ earlier.push(`coverageFloor: ${error.message}`);
105
93
  }
94
+ const cells = await runCells(CONTAINER_CONFORMANCE_CELLS,
95
+ // A published profile never supplies drivers: no published API can perform their ops.
96
+ { kind, profile: { ...profile, drivers: undefined } }, { subject: kind, heading: `container conformance failed for "${kind}"` }, earlier);
106
97
  return { kind, cells };
107
98
  }
108
99
  // ── (a) local-index addressing ───────────────────────────────────────────────
109
- /**
110
- * Assert the addressed child is the one that mutated (by content) and that the emitted
111
- * path is the chain of LOCAL indices. The non-first / non-zero setup is what
112
- * discriminates local from global addressing; at chain [0,0] child 0 the two coincide.
113
- */
114
- export async function checkStripLocalIndexAddressing(profile) {
100
+ function driverOf(kind, profile, driver, op) {
101
+ const run = profile.drivers?.[driver];
102
+ if (run)
103
+ return run;
104
+ const cell = driver === 'gridLocalIndex' ? 'localIndex' : 'multiScope';
105
+ fail(`"${kind}" asserts ${cell}, but the kit drives ${op} only for the built-in kinds that own ` +
106
+ `one, so declare it boundary (or exempt, when the kind owns no such op)`);
107
+ }
108
+ /** Asserts the addressed child is the one removed and the emitted path is the chain of local
109
+ * indices; the fixture avoids chain [0,0] child 0, where local and global indices coincide. */
110
+ export async function checkStripLocalIndexAddressing(kind, profile) {
115
111
  const fixture = profile.localIndexFixture;
116
112
  if (!fixture)
117
113
  fail('localIndex asserts but the profile carries no localIndexFixture');
@@ -120,6 +116,7 @@ export async function checkStripLocalIndexAddressing(profile) {
120
116
  assert(targetChild > 0 || containerChain.some((idx) => idx > 0), 'localIndexFixture must edit a non-first child or descend through a non-zero chain position (else the local-vs-global check is vacuous)');
121
117
  const outer = parse(fixture.source).children[0];
122
118
  const { deps, doc, events } = createHeadlessActions([outer]);
119
+ const kindNode = subjectNode(doc, kind, containerChain, 'localIndexFixture');
123
120
  const controller = createUndoController(deps);
124
121
  const rootContainerEdit = createContainerEditActions(deps, controller);
125
122
  let parentBundle = null;
@@ -136,9 +133,8 @@ export async function checkStripLocalIndexAddressing(profile) {
136
133
  },
137
134
  path: containerChain.slice(0, depth + 1)
138
135
  },
139
- stickyColumn: stubStickyColumn(),
140
- getPresentationMode: undefined,
141
- linkRef: undefined,
136
+ caretMemory: stubCaretMemory(),
137
+ reading: kitReading(),
142
138
  parent: {
143
139
  blockEdit: parentBundle?.blockEdit ?? stubBlockEdit(),
144
140
  focus: parentBundle?.focus ?? recordingFocus(),
@@ -150,83 +146,23 @@ export async function checkStripLocalIndexAddressing(profile) {
150
146
  if (depth < containerChain.length - 1)
151
147
  node = node.children[containerChain[depth + 1]];
152
148
  }
153
- const kindNode = node;
154
149
  assert(kindNode.children.length > 1, 'kind node has ≥2 children to target a non-first one');
155
150
  const targetMarker = kindNode.children[targetChild].raw;
156
151
  const seen = [];
157
152
  events.on('edit', (e) => seen.push(e));
158
- await parentBundle.blockEdit.deleteBlock(targetChild);
159
- // The commit replaced the spine's nodes — re-resolve through the live doc.
160
- const liveKind = nodeAtPath(doc, containerChain);
153
+ await parentBundle.blockEdit.deleteBlock(targetChild, 'keyless');
154
+ // The commit replaced the ancestor nodes, so resolve again through the live document.
155
+ const liveKind = subjectNode(doc, kind, containerChain, 'the document after the delete');
161
156
  const remaining = (liveKind.children ?? []).map((c) => c.raw);
162
157
  assert(!remaining.includes(targetMarker), `local index ${targetChild} was the child removed`);
163
158
  const editEvent = seen.find((e) => e.op === 'delete');
164
159
  assert(editEvent, 'a delete edit event fired');
165
160
  assertIndices(editEvent.path.slice(0, containerChain.length), containerChain, 'path is the local-index chain');
166
161
  assertIs(editEvent.path.at(-1), targetChild, 'path ends at the targeted local child index');
167
- // Convergence, not byte round-trip (which is a tautology here): a local-index op
168
- // leaving a stale container raw or a divergent shape fires.
162
+ // Compared against a fresh parse, not byte round-trip, which is trivially true here: this
163
+ // catches an op that left the container's raw stale or its shape different.
169
164
  assertParseConverged(doc, 'doc converges after a local-index op');
170
165
  }
171
- /**
172
- * Grid local addressing: a table column op addresses cells by (rowIdx, colIdx) and emits
173
- * the table's own local path. The leading paragraph keeps the table at a non-zero doc
174
- * index, so a flat global offset would not coincide with the local one.
175
- */
176
- export async function checkGridLocalIndexAddressing() {
177
- const parsed = parse('lead para\n\n| h1 | h2 |\n| --- | --- |\n| a | b |\n');
178
- assertIs(parsed.children[1].kind, 'table', 'table at non-zero doc index');
179
- const { ctx, deps, doc, events } = mountTableMutations(parsed.children, 1);
180
- const seen = [];
181
- events.on('edit', (e) => seen.push(e));
182
- // Pinning the new cell's POSITION by content is what proves cells are addressed by
183
- // local col index rather than appended at the end.
184
- await ctx.insertColumnRight(0);
185
- const liveTable = deps.doc.children[1];
186
- for (const row of liveTable.children) {
187
- const cells = row.children.map((c) => c.raw);
188
- assertIs(cells.length, 3, 'every row gained one cell');
189
- assert(cells[0] !== '', 'column 0 unchanged');
190
- assertIs(cells[1], '', 'new empty cell landed at the addressed colIdx 1');
191
- assert(cells[2] !== '', 'original second cell shifted to colIdx 2');
192
- }
193
- const editEvent = seen.find((e) => e.op === 'tableInsertColumn');
194
- assert(editEvent, 'tableInsertColumn edit event fired');
195
- assertIndices(editEvent.path, [1], 'column op emits the table’s own local path');
196
- // The strip twin's oracle, which the grid arm went without: a column op leaving a stale
197
- // table raw or a row the delimiter no longer describes fires here, not at a byte round-trip.
198
- assertParseConverged(doc, 'doc converges after a grid column op');
199
- }
200
- /** The table-mutations mount both grid cells share: headless deps, controller, row states, ctx. */
201
- function mountTableMutations(children, tableIndex) {
202
- const table = children[tableIndex];
203
- const { deps, doc, events } = createHeadlessActions(children);
204
- const controller = createUndoController(deps);
205
- const rootContainerEdit = createContainerEditActions(deps, controller);
206
- const rowsState = mountBlockListState(() => table);
207
- // commitColumnEdit resolves each row via expectStateForNode — register them.
208
- for (const row of table.children)
209
- mountBlockListState(() => row);
210
- const ctx = createTableMutationsContext({
211
- get node() {
212
- return table;
213
- },
214
- get myPath() {
215
- return [tableIndex];
216
- },
217
- get rowsState() {
218
- return rowsState;
219
- },
220
- get focusedCell() {
221
- return { rowIdx: 0, colIdx: 0 };
222
- },
223
- parentContainerEdit: rootContainerEdit,
224
- controller,
225
- focusCell: () => { },
226
- announceReorder: () => { }
227
- });
228
- return { ctx, deps, doc, events };
229
- }
230
166
  // ── (b) innermost-first ancestry rebuild ─────────────────────────────────────
231
167
  export function checkInnermostFirstAncestry(kind, profile) {
232
168
  const { source, leafPath } = profile.deepNesting;
@@ -237,16 +173,13 @@ export function checkInnermostFirstAncestry(kind, profile) {
237
173
  assert(!leaf.children, 'leaf is editable (no children)');
238
174
  const marker = `zzmark-${kind}`;
239
175
  leaf.raw = marker + '\n';
240
- // Fresh sharing state, no fold sink and the global grammar: this probe asserts raw propagation
241
- // only, and a kit owning neither ids nor refs can reconcile no parent-scope splice.
242
- rebuildUnsharedAncestry(doc, leafPath, createSharingState(), null, undefined);
176
+ // Fresh sharing state, no merge callback and the global grammar: the check covers only raw
177
+ // propagation, and the kit owns no ids to reconcile a splice with.
178
+ rebuildUnsharedAncestry(doc, leafPath, createSharingState(), null, defaultGrammarView);
243
179
  assert(root.raw.includes(marker), `root raw reflects the deep leaf edit through "${kind}"`);
244
180
  }
245
- /**
246
- * Mutation probe proving the ancestry check is non-vacuous: a reversed (outer→inner)
247
- * rebuild leaves the root stale for a strip/opaque container. Returns false for a
248
- * container that re-derives its whole subtree (grid), which is why grid excuses ancestry.
249
- */
181
+ /** Shows the ancestry check can fail: an outer-to-inner rebuild leaves a strip or opaque root
182
+ * stale. False for a grid, which re-derives its whole subtree and so excuses ancestry. */
250
183
  export function reversedAncestryLeavesRootStale(profile) {
251
184
  const { source, leafPath } = profile.deepNesting;
252
185
  const doc = parse(source);
@@ -254,88 +187,19 @@ export function reversedAncestryLeavesRootStale(profile) {
254
187
  const leaf = nodeAtPath(doc, leafPath);
255
188
  const marker = 'reversed-mark';
256
189
  leaf.raw = marker + '\n';
257
- const ancestors = [];
258
- let cur = doc;
259
- for (let depth = 0; depth < leafPath.length - 1; depth++) {
260
- cur = cur.children[leafPath[depth]];
261
- ancestors.push(cur);
262
- }
263
190
  // Outermost-first: each ancestor rebuilt before its descendants are fresh.
264
- for (const a of ancestors)
265
- rebuildContainerRawIfContainer(a);
191
+ for (const ancestor of ancestorsOf(doc, leafPath))
192
+ rebuildContainerRawIfContainer(ancestor);
266
193
  return !root.raw.includes(marker);
267
194
  }
268
- // ── (c) one undo entry per multi-scope op ────────────────────────────────────
269
- /**
270
- * A multi-scope op is kind-specific: it drives through the kind's own context, not a
271
- * generic bundle, so only the built-ins that own one are dispatched here.
272
- */
273
- export async function checkOneUndoPerMultiScope(kind) {
274
- if (kind === 'list')
275
- return checkListIndentOneUndo();
276
- if (kind === 'table')
277
- return checkTableColumnOneUndo();
278
- fail(`"${kind}" asserts multiScope but the kit drives no multi-scope op for it — ` +
279
- `declare the cell exempt if the kind owns no ≥2-scope op`);
280
- }
281
- async function checkListIndentOneUndo() {
282
- // Indenting item 1 under item 0 spans outer-list + the new nested-list scope.
283
- const list = firstChildOfKind('- alpha\n- beta\n', 'list');
284
- const { deps } = createHeadlessActions([list]);
285
- const controller = createUndoController(deps);
286
- const listState = mountBlockListState(() => list);
287
- // indentItem reaches into prevItem (item 0) via expectStateForNode — register each item.
288
- for (const item of list.children)
289
- mountBlockListState(() => item);
290
- const ctx = createListContext({
291
- scope: {
292
- get index() {
293
- return 0;
294
- },
295
- get node() {
296
- return list;
297
- },
298
- get path() {
299
- return [0];
300
- }
301
- },
302
- state: listState,
303
- parentBlockEdit: stubBlockEdit(),
304
- parentFocus: recordingFocus(),
305
- parentListContext: undefined,
306
- controller,
307
- getPresentationMode: undefined,
308
- linkRef: undefined
309
- });
310
- const before = deps.undoManager.getStacks().undo.length;
311
- await ctx.indentItem(1);
312
- const after = deps.undoManager.getStacks().undo.length;
313
- assertIs(after - before, 1, 'list indentItem (multi-scope) pushes exactly ONE undo entry');
314
- assertIs(deps.doc.children[0].children.length, 1, 'item 1 was indented out of the outer list');
315
- assertParseConverged(deps.doc, 'doc converges after a multi-scope strip op');
316
- }
317
- async function checkTableColumnOneUndo() {
318
- const table = firstChildOfKind('| h1 | h2 |\n| --- | --- |\n| a | b |\n| c | d |\n', 'table');
319
- const { ctx, deps } = mountTableMutations([table], 0);
320
- const before = deps.undoManager.getStacks().undo.length;
321
- await ctx.insertColumnRight(0);
322
- const after = deps.undoManager.getStacks().undo.length;
323
- assertIs(after - before, 1, 'table insertColumn (multi-scope) pushes exactly ONE undo entry');
324
- assertParseConverged(deps.doc, 'doc converges after a multi-scope grid op');
325
- }
326
195
  // ── (d) focus-bubble termination at root ─────────────────────────────────────
327
- /**
328
- * Bubble an out-of-range ArrowUp through a real 2-level chain (kind-under-test → strip
329
- * outer at its own top edge → recording root) and assert it reaches the root exactly
330
- * once. Driving the kind's own bundle rather than `dispatchMoveFocus` is what catches a
331
- * container whose focus wiring re-enters or double-escapes.
332
- */
196
+ /** Bubbles an out-of-range ArrowUp through the kind's own focus bundle, under a blockquote at its
197
+ * top edge, and asserts the root sees it once, catching wiring that re-enters or escapes twice. */
333
198
  export async function checkFocusBubbleTermination(kind, profile) {
334
199
  const source = profile.focusSource;
335
200
  if (!source)
336
201
  fail('focusBubble asserts but the profile carries no focusSource');
337
- const innerNode = findFirstOfKind(parse(source), kind);
338
- assert(innerNode, `focusSource contains a "${kind}" node`);
202
+ const innerNode = subjectNode(parse(source), kind, 'first', 'focusSource');
339
203
  assert((innerNode.children?.length ?? 0) > 0, `"${kind}" node has children`);
340
204
  const rootFocus = recordingFocus();
341
205
  const focusRung = (node, index, focus) => createNestedFocus(mountBlockListState(() => node), {
@@ -344,9 +208,8 @@ export async function checkFocusBubbleTermination(kind, profile) {
344
208
  return node;
345
209
  },
346
210
  path: [index],
347
- stickyColumn: stubStickyColumn(),
348
- getPresentationMode: undefined,
349
- linkRef: undefined,
211
+ caretMemory: stubCaretMemory(),
212
+ reading: kitReading(),
350
213
  parent: { blockEdit: stubBlockEdit(), focus, containerEdit: {} }
351
214
  });
352
215
  // At its own top edge, so moveFocus(-1) must delegate to root rather than re-enter.
@@ -363,22 +226,17 @@ export async function checkFocusBubbleTermination(kind, profile) {
363
226
  assertIs(bubbled[1], 'end', 'root received the bubbled position');
364
227
  }
365
228
  // ── (f) terminator collision ─────────────────────────────────────────────────
366
- /**
367
- * Write a terminator-shaped line into the container's body through `bodyWrite` (the door the
368
- * commit path uses) and require the live tree to still converge with a fresh parse. Convergence
369
- * is the oracle, not byte round-trip: `serialize(parse(s)) === s` holds throughout a collision
370
- * while the container silently stops containing what it says it does. A childless container
371
- * (body in metadata) seats the same bytes through the fixture's own `writeBody`.
372
- */
229
+ /** Writes a terminator-shaped body line through `bodyWrite`, as the commit path does, and requires
230
+ * the tree to match a fresh parse, since byte round-trip holds even through a collision. */
373
231
  export function checkTerminatorCollision(kind, profile) {
374
232
  const fixture = profile.terminatorCollisionFixture;
375
233
  if (!fixture)
376
234
  fail('terminatorCollision asserts but the profile carries no terminatorCollisionFixture');
377
235
  const doc = parse(fixture.source);
378
- const node = doc.children[0];
379
- assertIs(node?.kind, kind, 'terminatorCollisionFixture source opens with a node of the kind');
236
+ const node = subjectNode(doc, kind, [0], 'terminatorCollisionFixture');
380
237
  const bodyWrite = getBlockKindDescriptor(kind).bodyWrite;
381
- const body = bodyWrite ? bodyWrite.normalize(fixture.bodyRaw) : fixture.bodyRaw;
238
+ const ctx = { node, mode: 'literal', lineEnding: documentLineEnding(doc) };
239
+ const body = bodyWrite ? bodyWrite.normalize(fixture.bodyRaw, ctx) : fixture.bodyRaw;
382
240
  const children = node.children ?? [];
383
241
  const before = node.raw;
384
242
  if (children.length > 0) {
@@ -391,30 +249,60 @@ export function checkTerminatorCollision(kind, profile) {
391
249
  }
392
250
  fixture.writeBody(node, body);
393
251
  }
394
- rebuildContainerRawIfContainer(node);
395
- // Without this the cell passes over a container the write never reached, which is how a
396
- // mis-seated childless body would read as surviving a collision it never saw.
252
+ // Through the chain rebuild a commit runs, which also re-reads the container's metadata.
253
+ rebuildUnsharedAncestry(doc, [0], createSharingState(), null, defaultGrammarView);
254
+ // Without this the cell passes on a container the write never reached, which is how a body
255
+ // written to the wrong place would look like it survived a collision it never saw.
397
256
  assert(node.raw !== before, `the fixture body reached "${kind}"'s own bytes`);
398
257
  assertParseConverged(doc, `${kind} survives a body line reproducing its terminator`);
399
258
  }
259
+ /** An opaque container wraps its body between its own marker lines, so a body line can reproduce
260
+ * its closer whatever it declares; a declared `bodyWrite` is tested on any contract. */
261
+ function refuseExcusedCollision(kind) {
262
+ const descriptor = getBlockKindDescriptor(kind);
263
+ if (descriptor.containerContract !== 'opaque' && !descriptor.bodyWrite)
264
+ return;
265
+ fail(`${kind} ${descriptor.bodyWrite ? 'declares container.bodyWrite' : 'is an opaque container'}, ` +
266
+ `and a body line reproducing its terminator truncates it, so assert terminatorCollision ` +
267
+ `with a fixture whose body does`);
268
+ }
269
+ // ── (g) title row feeds no metadata ──────────────────────────────────────────
270
+ /** Written into the title row; distinctive enough that no fixture's title is it already. */
271
+ const TITLE_PROBE = 'probe title';
272
+ /** A title keystroke skips an opaque container's metadata re-read, so the row is written through
273
+ * that keystroke's rebuild and the tree has to match a fresh parse, every metadata key included. */
274
+ export function checkTitleRowFeedsNoMetadata(kind) {
275
+ const descriptor = getBlockKindDescriptor(kind);
276
+ const chromeKind = descriptor.reservedChrome?.kind;
277
+ if (descriptor.containerContract !== 'opaque' || chromeKind === undefined) {
278
+ return {
279
+ status: 'exempt',
280
+ detail: `"${kind}" has no title row whose keystrokes skip the metadata re-read`
281
+ };
282
+ }
283
+ const fixture = descriptor.conformanceFixture;
284
+ if (fixture === undefined) {
285
+ fail(`${kind} declares a title row but carries no conformanceFixture to write it in`);
286
+ }
287
+ const doc = parse(fixture);
288
+ const leafPath = [...subjectPath(doc, kind, 'first', `${kind} conformanceFixture`), 0];
289
+ const title = nodeAtPath(doc, leafPath);
290
+ assertIs(title.kind, chromeKind, `${kind} conformanceFixture opens a "${kind}" with its title row`);
291
+ const leafPreviousRaw = title.raw;
292
+ title.raw = TITLE_PROBE + trailingLineEnding(title.raw, documentLineEnding(doc));
293
+ const sharing = createSharingState();
294
+ const chain = walkUnsharing(doc, leafPath, sharing, false);
295
+ rebuildUnsharedChain(doc, chain, sharing, null, defaultGrammarView, {
296
+ path: leafPath,
297
+ leafPreviousRaw
298
+ });
299
+ assertParseConverged(doc, `${kind} after a keystroke in its title row`);
300
+ }
400
301
  // ── (e) declaration sanity ───────────────────────────────────────────────────
401
- /**
402
- * Hold the kind to its schema declarations. A declared `unwrapRole` must name implemented
403
- * strategies because the nested dispatcher indexes them unguarded, and a capability whose only
404
- * job is a cell's repair may not ship behind that cell's excuse.
405
- */
302
+ /** Holds the kind to its declarations: an `unwrapRole` names implemented strategies, which the
303
+ * nested dispatcher indexes unguarded. */
406
304
  export function checkDeclarationSanity(kind, profile) {
407
305
  const descriptor = getBlockKindDescriptor(kind);
408
- // Grammatical, not declared: an opaque container wraps its body between chrome lines of its
409
- // own, so a body line CAN reproduce its closer whether or not the kind declares the repair.
410
- // The bodyWrite arm stays because a declared repair must be probed on any contract.
411
- const owesCollisionAnswer = descriptor.containerContract === 'opaque' || !!descriptor.bodyWrite;
412
- if (owesCollisionAnswer && profile.terminatorCollision.mode !== 'assert') {
413
- fail(`${kind} ${descriptor.bodyWrite ? 'declares container.bodyWrite' : 'is an opaque container'} ` +
414
- `but its profile marks terminatorCollision "${profile.terminatorCollision.mode}" — a body ` +
415
- `line reproducing the terminator truncates the container, so assert the cell with a ` +
416
- `fixture whose body does`);
417
- }
418
306
  const role = descriptor.unwrapRole;
419
307
  if (role) {
420
308
  assertIs(typeof firstChildUnwrapStrategies[role.firstChildBackspace], 'function', `${kind} first-child unwrap strategy "${role.firstChildBackspace}" is implemented`);
@@ -427,40 +315,33 @@ export function checkDeclarationSanity(kind, profile) {
427
315
  assertIs(typeof descriptor.containerPaste.siblingAbsorb, 'boolean', `${kind} containerPaste.siblingAbsorb is boolean`);
428
316
  }
429
317
  assertIs(typeof descriptor.rebuildRaw, 'function', `${kind} declares rebuildRaw`);
430
- const node = findFirstOfKind(parse(profile.deepNesting.source), kind);
431
- assert(node, `deepNesting fixture contains a "${kind}" node`);
318
+ const node = subjectNode(parse(profile.deepNesting.source), kind, 'first', 'deepNesting');
432
319
  assertRebuildIsParseCanonical(descriptor, node, kind);
433
320
  assertHintedRebuildMatchesFull(kind, descriptor, node);
434
321
  assertBodyWrapMatchesParse(kind, descriptor);
435
322
  assertContentStartSpaceIsRebuilt(kind, descriptor);
436
323
  }
437
- /**
438
- * `rebuildRaw`'s changed-child hint is a shortcut, never a different answer: the same children
439
- * rebuilt with and without it are the same bytes. A rebuilder that ignores the hint passes here
440
- * by construction, which is what makes the argument optional to adopt.
441
- */
324
+ /** `rebuildRaw`'s changed-child hint is a shortcut, never a different answer: the same children
325
+ * rebuilt with and without it give the same bytes. */
442
326
  function assertHintedRebuildMatchesFull(kind, descriptor, node) {
443
327
  const children = node.children;
444
328
  if (!children?.length)
445
329
  return;
446
330
  const index = children.length - 1;
447
331
  const previousRaw = children[index].raw;
448
- // Doubling keeps whatever line shape the fixture's own child had; one operand, so the
449
- // cross-node join census still reads this as a kind re-emitting its own bytes.
332
+ // Doubling keeps the child's own line shape, and with one operand the cross-node join check
333
+ // still reads it as the kind re-emitting its own bytes.
450
334
  children[index].raw = previousRaw.repeat(2);
451
335
  descriptor.rebuildRaw(node, { index, previousRaw });
452
336
  const hinted = node.raw;
453
337
  descriptor.rebuildRaw(node);
454
338
  assertIs(hinted, node.raw, `${kind} rebuildRaw writes the same bytes for a changed-child hint as for a full rebuild`);
455
339
  }
456
- /** The content a probe writes into a body child; distinctive enough that no fixture line ends
457
- * in it by accident. */
340
+ /** The content these checks write into a body child, distinctive enough that no fixture line
341
+ * ends in it by accident. */
458
342
  const CONTENT_START_PROBE = 'probe';
459
- /**
460
- * `container.contentStartSpace` consumes the user's space, so it is byte-honest only where the
461
- * rebuild mints that space back on a content line. A declarer whose rebuild does not eats the
462
- * keystroke instead of deferring it.
463
- */
343
+ /** `container.contentStartSpace` swallows the user's space, so the rebuild must write it back on a
344
+ * content line or the keystroke is lost. */
464
345
  function assertContentStartSpaceIsRebuilt(kind, descriptor) {
465
346
  if (descriptor.contentStartSpace !== 'complete-marker')
466
347
  return;
@@ -468,12 +349,13 @@ function assertContentStartSpaceIsRebuilt(kind, descriptor) {
468
349
  if (fixture === undefined) {
469
350
  fail(`${kind} declares container.contentStartSpace but carries no conformanceFixture to probe`);
470
351
  }
471
- const node = parse(fixture).children.find((child) => child.kind === kind);
472
- assert(node?.children?.length, `${kind} conformanceFixture opens a "${kind}" with a body child`);
473
- // The LAST child, so a reserved-chrome head (a title, a summary) stays in place: its own line
474
- // already carries the opener's space, and rebuilding over it would answer for the wrong line.
352
+ const doc = parse(fixture);
353
+ const node = subjectNode(doc, kind, 'first', `${kind} conformanceFixture`);
354
+ assert(node.children?.length, `${kind} conformanceFixture opens a "${kind}" with a body child`);
355
+ // The last child, so a reserved title child (a heading, a summary) stays put: its own line
356
+ // already carries the opener's space, and rebuilding over it would test the wrong line.
475
357
  const last = node.children[node.children.length - 1];
476
- last.raw = CONTENT_START_PROBE + (trailingLineEnding(last.raw) || '\n');
358
+ last.raw = CONTENT_START_PROBE + trailingLineEnding(last.raw, documentLineEnding(doc));
477
359
  descriptor.rebuildRaw(node);
478
360
  const lines = splitLines(node.raw)
479
361
  .map((line) => line.text)
@@ -484,13 +366,10 @@ function assertContentStartSpaceIsRebuilt(kind, descriptor) {
484
366
  `child holding "${CONTENT_START_PROBE}" — the consumed space is only deferred where the ` +
485
367
  `rebuild re-emits the marker's own trailing space on a content line`);
486
368
  }
487
- /**
488
- * `container.bodyWrap` is probed, never trusted: the separator settle reads it to decide whether
489
- * a freed blank line belongs to the wrap, and a kind whose parse disagrees loses its body head
490
- * on reload (`tree-operations/settle.clearRedundantSeparator`).
491
- */
369
+ /** `container.bodyWrap` is tested, not trusted: `clearRedundantSeparator` reads it to place a freed
370
+ * blank line, and a kind whose parse disagrees loses the start of its body on reload. */
492
371
  function assertBodyWrapMatchesParse(kind, descriptor) {
493
- if (descriptor.containerContract === 'grid')
372
+ if (isGridDescriptor(descriptor))
494
373
  return;
495
374
  const fixture = descriptor.conformanceFixture;
496
375
  if (fixture === undefined) {
@@ -498,28 +377,23 @@ function assertBodyWrapMatchesParse(kind, descriptor) {
498
377
  `the declaration in both directions, so every non-grid container needs a fixture ` +
499
378
  `whose top level opens a "${kind}" carrying a body`);
500
379
  }
501
- // A kind with no standalone recognizer (listItem) can only ever be nested, so it is probed
502
- // where the fixture puts it; openers alone misread directive kinds, whose recognizer is the
503
- // shared `:::`.
380
+ // A kind with no recognizer of its own (listItem) is tested where the fixture nests it; a
381
+ // directive kind's recognizer is the shared `:::`, which the opener registry does not list.
504
382
  const doc = parse(fixture);
505
383
  const opensAtTop = isBlockOpenerRegistered(kind) || isDirectiveKind(kind);
506
- const node = opensAtTop
507
- ? doc.children.find((child) => child.kind === kind)
508
- : findFirstOfKind(doc, kind);
509
- assert(node, `${kind} conformanceFixture must ${opensAtTop ? 'open' : 'carry'} a "${kind}"` +
510
- `${opensAtTop ? ' at the top level' : ''} — the bodyWrap probe rebuilds and reparses that ` +
511
- `node, and a fixture without one would skip it silently while the declarations cell reads ` +
512
- `asserted`);
513
- // A container that keeps its body in metadata parses childless, so there is no body child for a
514
- // blank line to peel off — the probe has nothing to run and the declaration must be absent,
515
- // since a wrap the parse can never perform would tell the separator settle a falsehood.
384
+ const path = subjectPath(doc, kind, 'first', `${kind} conformanceFixture`);
385
+ assert(!opensAtTop || path.length === 1, `${kind} conformanceFixture must open a "${kind}" at the top level — the bodyWrap probe ` +
386
+ `rebuilds that node and reparses its bytes as a document of their own`);
387
+ const node = nodeAtPath(doc, path);
388
+ // A container whose body lives in metadata parses childless, so it has no wrap to test and
389
+ // must declare none: the blank-line fix-up would trust a wrap the parse never performs.
516
390
  if (!node.children?.length) {
517
391
  assertIs(descriptor.bodyWrap?.afterOpenerLine, undefined, `${kind} parses childless (its body lives in metadata), so a blank line against its ` +
518
392
  `opener belongs to that body — drop the container.bodyWrap declaration`);
519
393
  return;
520
394
  }
521
395
  const expected = node.children.length;
522
- const ending = trailingLineEnding(node.raw) || '\n';
396
+ const ending = trailingLineEnding(node.raw, documentLineEnding(doc));
523
397
  node.innerPrefix = '';
524
398
  descriptor.rebuildRaw(node);
525
399
  const withoutPrefix = node.raw;