@voithos-labs/aragonite 0.10.3 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +12 -5
  3. package/dist/a11y-strings.js +61 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +13 -20
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +619 -1089
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +36 -67
  26. package/dist/components/SelectionOverlay.svelte.d.ts +6 -4
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +103 -100
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +35 -28
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +58 -32
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +144 -202
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +46 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +99 -144
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +3 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +9 -4
  102. package/dist/components/blocks/text/click-snap-guard.js +16 -5
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +164 -180
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -105
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +243 -208
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +13 -30
  144. package/dist/components/drag-handle.js +25 -63
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -31
  162. package/dist/components/editor-root-listeners.js +49 -46
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +26 -30
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +380 -0
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +14 -0
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +55 -68
  256. package/dist/core/inline/inline-widgets.js +55 -58
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +33 -17
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -7
  347. package/dist/cursor/height-oracle.js +26 -75
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +16 -8
  365. package/dist/cursor/scrollport.js +28 -5
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -13
  375. package/dist/cursor/visual-lines.js +72 -28
  376. package/dist/cursor/widget-edge-snap.d.ts +23 -0
  377. package/dist/cursor/widget-edge-snap.js +39 -0
  378. package/dist/cursor/widget-offset.d.ts +111 -102
  379. package/dist/cursor/widget-offset.js +352 -177
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +31 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +33 -52
  434. package/dist/editor-actions/focus/focus-landing.d.ts +11 -5
  435. package/dist/editor-actions/focus/focus-landing.js +29 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +55 -76
  465. package/dist/editor-actions/plugin/container.js +105 -186
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +91 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +38 -8
  550. package/dist/plugin.js +102 -74
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +113 -85
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -75
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +63 -47
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +18 -7
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +143 -292
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +79 -81
  695. package/dist/schema/commands.js +156 -116
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +9 -11
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +73 -78
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +93 -152
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +61 -104
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +53 -146
  807. package/dist/selection/dead-space-caret.d.ts +20 -28
  808. package/dist/selection/dead-space-caret.js +79 -87
  809. package/dist/selection/drag-pointer.d.ts +22 -5
  810. package/dist/selection/drag-pointer.js +63 -31
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -39
  816. package/dist/selection/keyboard-extend.js +94 -116
  817. package/dist/selection/multi-click.d.ts +37 -0
  818. package/dist/selection/multi-click.js +197 -0
  819. package/dist/selection/native-bridge.d.ts +30 -37
  820. package/dist/selection/native-bridge.js +80 -100
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +31 -14
  824. package/dist/selection/path-lookup.js +110 -20
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +9 -0
  828. package/dist/selection/pointer-gesture.js +11 -0
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -33
  832. package/dist/selection/primitives.js +61 -53
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -19
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +52 -0
  852. package/dist/selection/selection-drop.js +317 -0
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +75 -53
  864. package/dist/styles/editor.css +248 -139
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +19 -0
  960. package/dist/tree-operations/paste/replacement-parse.js +24 -0
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +329 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +267 -183
  996. package/docs/guide/plugin-guide.md +341 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +17 -21
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/invariants/split-landing.d.ts +0 -8
  1015. package/dist/invariants/split-landing.js +0 -15
  1016. package/dist/selection/double-click-trim.d.ts +0 -17
  1017. package/dist/selection/double-click-trim.js +0 -57
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -29
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -75
@@ -1,75 +1,124 @@
1
1
  /**
2
- * The fencedCode raw-write rule, declared on the kind as `normalizeRawWrite` and applied at every
3
- * write sink. RESTORE re-appends a closer a truncating write dropped and DROP removes one it
4
- * stranded, ESCALATE grows both runs past a body line that would read as the closer, SANITIZE
5
- * drops backticks from a backtick fence's info string (CommonMark §4.5) — all off the block's OWN
6
- * fence shape, which is why the pass takes a node. An authored open fence is exempt.
2
+ * The rule for writing a fenced block's bytes, declared on the kind as `rawWrite`: it restores or
3
+ * drops fence lines a write broke, grows the marker runs past a body line that would close them,
4
+ * and keeps backticks out of a backtick fence's info string, moving the caret with every byte. A
5
+ * fence the user is still typing (open, `authored`) is left alone.
7
6
  */
8
7
  import { metadataOf } from '../core/nodes';
9
- import { trailingLineEnding, trimTrailingLineEnding } from '../core/lines';
10
- import { escalatedFenceLength, matchFenceClose, matchFenceOpen } from '../core/parsers/fence-syntax';
8
+ import { displayLines, firstDisplayLine, firstLineEnding, joinDisplayLines, ownTrailingLineEnding, trailingLineEnding, trimTrailingLineEnding } from '../core/lines';
9
+ import { escalatedFenceLength, fenceAnatomy, fenceRunLength, matchFenceClose, matchFenceOpen } from '../core/parsers/fence-syntax';
11
10
  // ── Public API ──────────────────────────────────────────────────────────────
12
11
  export function fenceShapeOf(node) {
13
12
  const meta = metadataOf(node, 'fencedCode');
14
13
  return { marker: meta.fenceMarker, length: meta.fenceLength, closed: meta.closed };
15
14
  }
16
- export function reconcileFenceWrite(input) {
17
- const { fence, mode } = input;
18
- if (!fence.closed && mode === 'authored')
19
- return { display: input.display, caret: input.caret };
20
- const unglued = separateGluedCloser(input);
21
- return escalateFenceRuns({ ...input, ...sanitizeInfoString({ ...input, ...unglued }) });
15
+ /** The fence write rule for a kind whose fence shape `shapeOf` reads off the block. */
16
+ export function fenceRawWrite(shapeOf) {
17
+ return {
18
+ normalize: (raw, ctx) => reconcileFenceRaw(raw, 0, shapeOf(ctx.node), ctx).raw,
19
+ mapOffset: (raw, offset, ctx) => reconcileFenceRaw(raw, offset, shapeOf(ctx.node), ctx).offset
20
+ };
21
+ }
22
+ /** The built-in code block's rule, sized by its parsed metadata. */
23
+ export const fencedCodeWrite = fenceRawWrite(fenceShapeOf);
24
+ /**
25
+ * The shape of a fenced block that keeps no fence metadata, read off its own opener line. A
26
+ * plugin kind declares its rule as `fenceRawWrite(fenceShapeOfRaw)`.
27
+ */
28
+ export function fenceShapeOfRaw(node) {
29
+ const anatomy = fenceAnatomy(node.raw);
30
+ return anatomy
31
+ ? { marker: anatomy.marker, length: anatomy.length, closed: anatomy.closed }
32
+ : { marker: '`', length: 3, closed: false };
22
33
  }
23
34
  /**
24
- * A whole fencedCode `raw` made legal — the kind's `normalizeRawWrite`. Literal by
25
- * construction: a sink reaching a node's bytes without its surface is never the author
26
- * typing the block's own syntax. The fence lines reconcile first, so ESCALATE measures a
27
- * body that ends where the closer does.
35
+ * The display text of a fenced block made legal, the caret carried along. The fence lines are
36
+ * fixed before the runs grow, so growing measures a body that ends where the closer does.
28
37
  */
29
- export function normalizeFencedRaw(raw, node) {
30
- const fence = fenceShapeOf(node);
31
- const written = reconcileFenceWrite({
32
- display: reconcileFenceLines(trimTrailingLineEnding(raw), fence, trailingLineEnding(node.raw)),
33
- caret: 0,
34
- fence,
35
- mode: 'literal'
36
- });
37
- return written.display + trailingLineEnding(raw);
38
+ export function reconcileFenceWrite(input) {
39
+ const { mode, ending } = input;
40
+ if (!input.fence.closed && mode === 'authored') {
41
+ return { display: input.display, caret: input.caret };
42
+ }
43
+ const widened = widenedCloser(input);
44
+ const fence = widened?.fence ?? writtenFence(input.display, input.fence, mode);
45
+ const unglued = separateGluedCloser({ ...input, ...widened?.written, fence });
46
+ const lines = reconcileFenceLines(unglued, fence, ending);
47
+ const sanitized = sanitizeInfoString({ ...input, ...lines, fence });
48
+ return escalateFenceRuns({ ...input, ...sanitized, fence });
38
49
  }
39
50
  /**
40
- * The bytes with `info` written onto the opening fence line. Only that span moves, so the
41
- * indent, both marker runs, the body and the closer come through byte-identical. Null when
42
- * line 0 does not read as this block's opener at all.
51
+ * The bytes with `info` written onto the opener line, everything else byte-identical. Null when
52
+ * line 0 does not read as this block's opener.
43
53
  */
44
54
  export function writeFenceInfo(display, info, fence) {
45
- const lineEnd = firstLineEnd(display);
46
- const line = display.slice(0, lineEnd);
47
- const opener = splitOpener(line, fence);
55
+ const first = firstDisplayLine(display);
56
+ const opener = splitOpener(first.text, fence);
48
57
  if (!opener)
49
58
  return null;
50
- // A CRLF separator's `\r` sits inside the line; the info span ends before it.
51
- const infoEnd = lineEnd - (line.endsWith('\r') ? 1 : 0);
52
- return display.slice(0, opener.runEnd) + legalInfo(info, fence) + display.slice(infoEnd);
59
+ return (display.slice(0, opener.runEnd) +
60
+ legalFenceInfo(info, fence.marker) +
61
+ display.slice(first.text.length));
53
62
  }
54
- // ── Internal ────────────────────────────────────────────────────────────────
55
63
  /**
56
- * What the info span may hold: one line, no backtick under a backtick fence (CommonMark §4.5),
57
- * and no leading run of the fence's own marker, which lengthens the fence instead — `~~~` + `~x`
58
- * reparses as a four-tilde run its own closer no longer closes. Dropped rather than declined,
59
- * the rule the typed and pasted routes already share.
64
+ * `info` less what an info string may not hold: a line break, a backtick under a backtick fence,
65
+ * and a leading run of the fence's own marker, which would lengthen the fence (`~~~` plus `~x`).
60
66
  */
61
- function legalInfo(info, fence) {
67
+ export function legalFenceInfo(info, marker) {
62
68
  const oneLine = info.replace(/[\r\n]/g, '');
63
- const kept = fence.marker === '`' ? oneLine.replaceAll('`', '') : oneLine;
69
+ const kept = marker === '`' ? oneLine.replaceAll('`', '') : oneLine;
64
70
  let start = 0;
65
- while (kept[start] === fence.marker)
71
+ while (kept[start] === marker)
66
72
  start++;
67
73
  return kept.slice(start);
68
74
  }
75
+ // ── Internal ────────────────────────────────────────────────────────────────
76
+ /**
77
+ * A whole `raw` through the rule, with an offset into it carried along. The trailing line ending
78
+ * is the written one, else the block's own: an unterminated last block stays unterminated.
79
+ */
80
+ function reconcileFenceRaw(raw, offset, fence, ctx) {
81
+ const ending = trailingLineEnding(ctx.node.raw, ctx.lineEnding);
82
+ const display = trimTrailingLineEnding(raw);
83
+ const tail = ownTrailingLineEnding(raw) || ownTrailingLineEnding(ctx.node.raw);
84
+ const caret = Math.min(offset, display.length);
85
+ const written = reconcileFenceWrite({ display, caret, fence, mode: ctx.mode, ending });
86
+ const intoTail = Math.min(Math.max(offset - display.length, 0), tail.length);
87
+ return { raw: written.display + tail, offset: written.caret + intoTail };
88
+ }
89
+ /**
90
+ * The fence the written bytes carry: a literal write is read as the grammar reads it, so a replace
91
+ * that resized the opener run resizes the fence; typing keeps the block's own run.
92
+ */
93
+ function writtenFence(display, fence, mode) {
94
+ if (mode === 'authored')
95
+ return fence;
96
+ const anatomy = fenceAnatomy(firstDisplayLine(display).text, { marker: fence.marker, length: 3 });
97
+ return anatomy ? { ...fence, length: anatomy.length } : fence;
98
+ }
69
99
  /**
70
- * Split by the block's OWN run length, not by re-scanning the written line: a backtick
71
- * typed at the head of the info string must read as info, not as a longer run.
100
+ * A marker typed or pasted onto the opener's run lengthens the fence, so the closer grows to match:
101
+ * a closer shorter than its opener closes nothing, and the fence would take every block below.
72
102
  */
103
+ function widenedCloser(input) {
104
+ const { display, caret, fence } = input;
105
+ const lines = displayLines(display);
106
+ const opener = fenceAnatomy(lines[0].text, fence);
107
+ const closerIndex = lastCloserIndex(lines, fence);
108
+ if (!opener || opener.length === fence.length || closerIndex < 1)
109
+ return null;
110
+ const closer = lines[closerIndex].text;
111
+ const grow = Math.max(opener.length - fenceRunLength(closer, fence.marker), 0);
112
+ const at = lineStartOffset(display, closerIndex) + /^ */.exec(closer)[0].length;
113
+ return {
114
+ written: {
115
+ display: display.slice(0, at) + fence.marker.repeat(grow) + display.slice(at),
116
+ caret: caret > at ? caret + grow : caret
117
+ },
118
+ fence: { ...fence, length: opener.length }
119
+ };
120
+ }
121
+ /** Split at the fence's known run length, so a marker past it reads as info string. */
73
122
  function splitOpener(line, fence) {
74
123
  const indent = /^ {0,3}/.exec(line)[0];
75
124
  const runEnd = indent.length + fence.length;
@@ -78,83 +127,88 @@ function splitOpener(line, fence) {
78
127
  return { indent, info: line.slice(runEnd), runEnd };
79
128
  }
80
129
  /**
81
- * The block's fence lines against a write that took one of them — an unclosed fence absorbs every
82
- * block below it at the next parse, from either half. With the block's own opener still at line 0
83
- * a missing closer comes back; without it a surviving closer is machinery the write stranded and
84
- * goes. The arms split on {@link ownOpener}, so exactly one can fire.
130
+ * A fence left open swallows every block below it, so a write that removed one fence line gets its
131
+ * closer back (its own opener still on line 0) or loses the closer it stranded.
85
132
  */
86
- function reconcileFenceLines(display, fence, blockEnding) {
133
+ function reconcileFenceLines(written, fence, blockEnding) {
87
134
  if (!fence.closed)
88
- return display;
89
- const lines = display.split('\n');
135
+ return written;
136
+ const lines = displayLines(written.display);
90
137
  const opener = ownOpener(lines, fence);
91
- const reconciled = opener
92
- ? restoredCloser(lines, fence, opener, blockEnding)
93
- : droppedStrandedCloser(lines, fence);
94
- return reconciled ?? display;
138
+ if (!opener)
139
+ return droppedStrandedCloser(lines, fence, written.caret) ?? written;
140
+ const restored = restoredCloser(lines, fence, opener, blockEnding);
141
+ // The closer goes in after every written byte, so no offset moves.
142
+ return restored === null ? written : { display: restored, caret: written.caret };
95
143
  }
96
144
  /**
97
- * Line 0 read as the block's OWN opener: its exact run, and info that is not a longer run. A
98
- * write's only line reading as this fence's CLOSER is not it — an opener never doubles as one,
99
- * and no metadata claims a block to size a fence to.
145
+ * Line 0 read as the block's own opener, at the run {@link writtenFence} sized. A write whose
146
+ * only line reads as this fence's closer is not one: an opener never doubles as a closer.
100
147
  */
101
148
  function ownOpener(lines, fence) {
102
- const opener = splitOpener(lines[0], fence);
103
- if (!opener || opener.info.startsWith(fence.marker))
149
+ const opener = splitOpener(lines[0].text, fence);
150
+ if (!opener)
104
151
  return null;
105
- if (lines.length === 1 && matchFenceClose(lines[0], fence.marker, fence.length))
152
+ if (lines.length === 1 && matchFenceClose(lines[0].text, fence.marker, fence.length))
106
153
  return null;
107
154
  return opener;
108
155
  }
109
156
  /**
110
- * The closer a truncating write dropped, re-appended, or null when one is still there. The ending
111
- * is the BLOCK's, not the written slice's, which may be unterminated (G4.20).
157
+ * Puts back the closer a truncating write dropped, or null when one is still there. The line
158
+ * ending is the block's, not the written slice's, which may have none.
112
159
  */
113
160
  function restoredCloser(lines, fence, opener, blockEnding) {
114
161
  if (lastCloserIndex(lines, fence) !== -1)
115
162
  return null;
116
- return lines.join('\n') + blockEnding + opener.indent + fence.marker.repeat(fence.length);
163
+ const closer = opener.indent + fence.marker.repeat(fence.length);
164
+ return joinDisplayLines(lines) + blockEnding + closer;
117
165
  }
118
166
  /**
119
- * The closer a write left behind after taking the block's own opener — machinery no metadata
120
- * claims, removed rather than kept, since as text it re-opens a fence over the live siblings
121
- * below. Null when there is none, or when an opener above could CLOSE on the run:
122
- * same marker, run no longer than the closer's — a foreign-marker or longer-run open line is
123
- * body text the run never terminated.
167
+ * Drops the closer a write stranded by removing the opener, since as text it would open a fence
168
+ * below. Null when there is none, or a line above opens a same-marker run it would close.
124
169
  */
125
- function droppedStrandedCloser(lines, fence) {
170
+ function droppedStrandedCloser(lines, fence, caret) {
126
171
  const closer = lastCloserIndex(lines, fence, 0);
127
172
  if (closer === -1)
128
173
  return null;
129
- const run = /^ {0,3}([`~]+)/.exec(lines[closer])[1].length;
174
+ const run = /^ {0,3}([`~]+)/.exec(lines[closer].text)[1].length;
130
175
  const claimed = (line) => {
131
- const open = matchFenceOpen(line);
176
+ const open = matchFenceOpen(line.text);
132
177
  return open !== null && open.marker === fence.marker && open.length <= run;
133
178
  };
134
179
  if (lines.slice(0, closer).some(claimed))
135
180
  return null;
136
- return withoutLine(lines, closer);
181
+ return withoutLine(lines, closer, caret);
137
182
  }
138
- /** Splitting on `\n` leaves a CRLF separator's `\r` above; dropping the last line orphans it. */
139
- function withoutLine(lines, index) {
183
+ /**
184
+ * The lines with one removed; dropping the last line takes the ending above it too. A caret inside
185
+ * the removed span lands where the span was.
186
+ */
187
+ function withoutLine(lines, index, caret) {
188
+ let from = lineStartOffset(joinDisplayLines(lines), index);
189
+ let to = from + lines[index].text.length + lines[index].ending.length;
140
190
  const kept = lines.slice(0, index).concat(lines.slice(index + 1));
141
191
  if (index === lines.length - 1 && kept.length > 0) {
142
- kept[kept.length - 1] = kept[kept.length - 1].replace(/\r$/, '');
192
+ const above = kept[kept.length - 1];
193
+ from -= above.ending.length;
194
+ to = from + above.ending.length + lines[index].text.length;
195
+ kept[kept.length - 1] = { ...above, ending: '' };
143
196
  }
144
- return kept.join('\n');
197
+ const moved = caret <= from ? caret : Math.max(from, caret - (to - from));
198
+ return { display: joinDisplayLines(kept), caret: moved };
145
199
  }
146
200
  function sanitizeInfoString(input) {
147
201
  const { display, caret, fence } = input;
148
202
  if (fence.marker !== '`')
149
203
  return { display, caret };
150
- const lineEnd = firstLineEnd(display);
151
- const opener = splitOpener(display.slice(0, lineEnd), fence);
204
+ const first = firstDisplayLine(display);
205
+ const opener = splitOpener(first.text, fence);
152
206
  if (!opener || !opener.info.includes('`'))
153
207
  return { display, caret };
154
208
  const kept = opener.info.replaceAll('`', '');
155
209
  const dropped = countDroppedBefore(opener.info, opener.runEnd, caret);
156
210
  return {
157
- display: opener.indent + fence.marker.repeat(fence.length) + kept + display.slice(lineEnd),
211
+ display: opener.indent + fence.marker.repeat(fence.length) + kept + display.slice(first.text.length),
158
212
  caret: caret - dropped
159
213
  };
160
214
  }
@@ -168,38 +222,35 @@ function countDroppedBefore(info, infoStart, caret) {
168
222
  return dropped;
169
223
  }
170
224
  /**
171
- * Un-glue a closer the write landed on top of. A fence with NO body line — ```` ```\n``` ```` —
172
- * has nothing between its two runs, so the body's only caret seat IS the closer's line start,
173
- * and the first character typed there arrives ahead of the closer run: ```` ```\nAB``` ````,
174
- * which no longer reads as closed and shows the run as body text. The fence says it is closed
175
- * and the display no longer carries a closer line, so the write broke it; the missing line
176
- * ending is what puts it back.
225
+ * Separate a closer the write ran into: text typed at the start of an empty fence's closer line
226
+ * lands in front of the run (```` ```\nAB``` ````), so a line ending goes back before the run.
177
227
  */
178
228
  function separateGluedCloser(input) {
179
229
  const { display, caret, fence } = input;
180
230
  if (!fence.closed)
181
231
  return { display, caret };
182
- const lines = display.split('\n');
232
+ const lines = displayLines(display);
183
233
  // A closer still on its own line needs nothing; so does a display too short to hold one.
184
234
  if (lines.length < 2 || lastCloserIndex(lines, fence) >= 1)
185
235
  return { display, caret };
186
- const run = new RegExp(`[${fence.marker}]{${fence.length},}[ \t]*$`).exec(lines[lines.length - 1]);
187
- // `index === 0` is a bare run that some other rule owns, not a glued one.
236
+ const run = new RegExp(`[${fence.marker}]{${fence.length},}[ \t]*$`).exec(lines[lines.length - 1].text);
237
+ // `index === 0` is a bare run another rule handles, not one the write ran into.
188
238
  if (!run || run.index === 0)
189
239
  return { display, caret };
190
240
  const at = display.length - run[0].length;
191
- const ending = display.includes('\r\n') ? '\r\n' : '\n';
241
+ // Two lines at least, so the display holds the ending the new line takes.
242
+ const ending = firstLineEnding(display) ?? '\n';
192
243
  return {
193
244
  display: display.slice(0, at) + ending + display.slice(at),
194
- // The caret sits at the typed text's end, which is where the ending is inserted: it
195
- // stays put, and only a caret already inside the closer run rides the shift.
245
+ // The caret sits at the end of the typed text, exactly where the line ending goes in: it
246
+ // stays put, and only a caret already inside the closer run moves.
196
247
  caret: caret > at ? caret + ending.length : caret
197
248
  };
198
249
  }
199
250
  function escalateFenceRuns(input) {
200
251
  const { display, caret, fence } = input;
201
- const lines = display.split('\n');
202
- const opener = splitOpener(lines[0], fence);
252
+ const lines = displayLines(display);
253
+ const opener = splitOpener(lines[0].text, fence);
203
254
  if (!opener || lines.length < 2)
204
255
  return { display, caret };
205
256
  // An open fence has no closer line, so a literal write measures everything below
@@ -208,19 +259,20 @@ function escalateFenceRuns(input) {
208
259
  if (fence.closed && closerIndex < 1)
209
260
  return { display, caret };
210
261
  const bodyEnd = closerIndex === -1 ? lines.length : closerIndex;
211
- const body = lines.slice(1, bodyEnd).join('\n');
262
+ const body = joinDisplayLines(lines.slice(1, bodyEnd));
212
263
  const grown = escalatedFenceLength(body, fence.marker, fence.length);
213
264
  const delta = grown - fence.length;
214
265
  if (delta === 0)
215
266
  return { display, caret };
216
267
  const run = fence.marker.repeat(grown);
217
- lines[0] = opener.indent + run + opener.info;
268
+ lines[0] = { ...lines[0], text: opener.indent + run + opener.info };
218
269
  let closerRunStart = -1;
219
270
  if (closerIndex !== -1) {
220
- const closerIndent = /^ {0,3}/.exec(lines[closerIndex])[0];
221
- const tail = lines[closerIndex].slice(closerIndent.length).replace(/^[`~]+/, '');
271
+ const closerText = lines[closerIndex].text;
272
+ const closerIndent = /^ {0,3}/.exec(closerText)[0];
273
+ const tail = closerText.slice(closerIndent.length).replace(/^[`~]+/, '');
222
274
  closerRunStart = lineStartOffset(display, closerIndex) + closerIndent.length;
223
- lines[closerIndex] = closerIndent + run + tail;
275
+ lines[closerIndex] = { ...lines[closerIndex], text: closerIndent + run + tail };
224
276
  }
225
277
  // The run grows in place, so a caret past an insertion point moves with it.
226
278
  let moved = caret;
@@ -228,20 +280,16 @@ function escalateFenceRuns(input) {
228
280
  moved += delta;
229
281
  if (closerRunStart !== -1 && caret > closerRunStart)
230
282
  moved += delta;
231
- return { display: lines.join('\n'), caret: moved };
283
+ return { display: joinDisplayLines(lines), caret: moved };
232
284
  }
233
- /** Last line reading as this fence's closer at or after `from`; line 0 is the opener's slot. */
285
+ /** Last line reading as this fence's closer at or after `from`; line 0 is the opener's line. */
234
286
  function lastCloserIndex(lines, fence, from = 1) {
235
287
  for (let i = lines.length - 1; i >= from; i--) {
236
- if (matchFenceClose(lines[i], fence.marker, fence.length))
288
+ if (matchFenceClose(lines[i].text, fence.marker, fence.length))
237
289
  return i;
238
290
  }
239
291
  return -1;
240
292
  }
241
- function firstLineEnd(display) {
242
- const index = display.indexOf('\n');
243
- return index === -1 ? display.length : index;
244
- }
245
293
  function lineStartOffset(display, lineIndex) {
246
294
  let offset = 0;
247
295
  for (let i = 0; i < lineIndex; i++)
@@ -1,11 +1,11 @@
1
1
  /**
2
- * Plugin-facing global commands: mint a process-wide command id, register a handler receiving
3
- * the dispatching instance's EditorContext, optionally bind a chord in the plugin-global tier
4
- * (last in precedence). Beside block-commands, not in commands.ts, for the same cycle reason —
5
- * commands ← command-id must stay one-directional.
2
+ * Plugin-facing global commands: create a process-wide command id, register a handler that
3
+ * receives the dispatching editor's `EditorContext` and the dispatch's argument, and optionally
4
+ * bind a chord among the plugin-global chords (last in precedence). Beside `block-commands`, not
5
+ * in `commands.ts`, so `commands → command-id` stays one-directional.
6
6
  */
7
7
  import { type PluginCommandId } from './command-id';
8
- import type { EditorContext } from './plugin-install';
9
- export declare function registerGlobalCommand(name: string, handler: (editor: EditorContext) => boolean, opts?: {
8
+ import { type EditorContext } from './plugin-install';
9
+ export declare function registerGlobalCommand(name: string, handler: (editor: EditorContext, arg?: unknown) => boolean, opts?: {
10
10
  chord?: string;
11
11
  }): PluginCommandId;
@@ -1,40 +1,32 @@
1
1
  /**
2
- * Plugin-facing global commands: mint a process-wide command id, register a handler receiving
3
- * the dispatching instance's EditorContext, optionally bind a chord in the plugin-global tier
4
- * (last in precedence). Beside block-commands, not in commands.ts, for the same cycle reason —
5
- * commands ← command-id must stay one-directional.
2
+ * Plugin-facing global commands: create a process-wide command id, register a handler that
3
+ * receives the dispatching editor's `EditorContext` and the dispatch's argument, and optionally
4
+ * bind a chord among the plugin-global chords (last in precedence). Beside `block-commands`, not
5
+ * in `commands.ts`, so `commands → command-id` stays one-directional.
6
6
  */
7
7
  import { mintCommandId } from './command-id';
8
- import { registerCommand, registerPluginGlobalBinding, assertPluginGlobalChordAvailable, warnDeadKeyCommand } from './commands';
9
- import { currentInstallingPlugin } from './plugin-install';
8
+ import { registerCommand, registerPluginGlobalBinding, assertPluginGlobalChordAvailable, globalCommandOwner, runPluginCommand, warnDeadKeyCommand } from './commands';
9
+ import { pluginEditorFor } from './plugin-install';
10
10
  export function registerGlobalCommand(name, handler, opts) {
11
- // Validate the chord BEFORE the mint: a collision must not leave a minted name and a
11
+ // Validate the chord before creating the id: a collision must not leave a created name and a
12
12
  // registered handler behind a failed registration.
13
13
  if (opts?.chord)
14
14
  assertPluginGlobalChordAvailable(opts.chord, name);
15
- const owner = currentInstallingPlugin();
16
- // Owner-attributed: it is what lets a plugin re-mint its own name, and what names the prior
17
- // owner in a cross-plugin collision.
18
- const id = mintCommandId(name, owner);
15
+ const id = mintCommandId(name);
19
16
  registerCommand(id, (ctx) => {
20
17
  if (!ctx.pluginEditor) {
21
18
  warnDeadKeyCommand(id, 'plugin-global');
22
19
  return false;
23
20
  }
24
- // Installed process-wide but absent from this editor's `plugins` prop: inert here, not
25
- // dead, so it must not spend the dead-key diagnostic a truly unreachable id owes.
26
- const editor = ctx.pluginEditor(owner ?? '');
21
+ const owner = globalCommandOwner(id);
22
+ // A global handler takes a context it can't run without, so a missing one declines, and
23
+ // that is inert rather than dead; a block handler runs with `ctx.editor` undefined instead.
24
+ const editor = pluginEditorFor(ctx.pluginEditor, owner);
27
25
  if (!editor)
28
26
  return false;
29
- try {
30
- return handler(editor);
31
- }
32
- catch (error) {
33
- ctx.onCommandError?.({ command: id, plugin: owner ?? undefined, error });
34
- return true;
35
- }
27
+ return runPluginCommand(owner, { command: id }, ctx.onCommandError, () => handler(editor, ctx.arg));
36
28
  });
37
29
  if (opts?.chord)
38
- registerPluginGlobalBinding({ chord: opts.chord, command: id }, owner);
30
+ registerPluginGlobalBinding({ chord: opts.chord, command: id });
39
31
  return id;
40
32
  }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The height guesses windowing uses before a block has been measured, one per shape of block, for
3
+ * the descriptors' `estimateHeight`. Each returns the content height; the estimator adds the
4
+ * block's frame. All are O(1) in the tree: they read `raw` and a child count, never a subtree.
5
+ */
6
+ import type { NodeView } from '../core/node-views';
7
+ /** What an estimate reads besides the block: the editor's width and its type metrics, in px. */
8
+ export interface HeightEstimateEnv {
9
+ width: number;
10
+ /** One wrapped line of prose. */
11
+ lineHeight: number;
12
+ /** One source line of code. */
13
+ codeLineHeight: number;
14
+ /** An average character, for how many fit on a line. */
15
+ avgCharWidth: number;
16
+ /** A block's margin and padding, which the estimator adds once per block. */
17
+ blockChrome: number;
18
+ /** The floor for an image whose alt carries no height. */
19
+ imageBlockMinHeight: number;
20
+ }
21
+ /** Wrapped text, or the images it holds when they stand taller than it. */
22
+ export declare function proseEstimate(node: NodeView, env: HeightEstimateEnv): number;
23
+ /** One line, whatever the bytes: a divider. */
24
+ export declare function singleLineEstimate(_node: NodeView, env: HeightEstimateEnv): number;
25
+ /** One code line per source line: code does not wrap. */
26
+ export declare function sourceLinesEstimate(node: NodeView, env: HeightEstimateEnv): number;
27
+ /**
28
+ * A grid takes the larger of its rows and its source wrapped; any other container the larger of a
29
+ * line per child and its text wrapped, since the first ignores wrapping and the second margins.
30
+ */
31
+ export declare function containerEstimate(node: NodeView, env: HeightEstimateEnv): number;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * The height guesses windowing uses before a block has been measured, one per shape of block, for
3
+ * the descriptors' `estimateHeight`. Each returns the content height; the estimator adds the
4
+ * block's frame. All are O(1) in the tree: they read `raw` and a child count, never a subtree.
5
+ */
6
+ import { parseImageDimensions } from '../core/inline/image-dimensions';
7
+ import { isGridKind } from './block-kind-descriptor';
8
+ const NEWLINE = 10;
9
+ // Any image form, capturing the alt, whose `|WxH` hint sizes the rendered image.
10
+ const IMAGE_ALT = /!\[([^\]]*)\]/g;
11
+ function wrappedLines(length, env) {
12
+ const perLine = Math.max(1, Math.floor(env.width / env.avgCharWidth));
13
+ return Math.max(1, Math.ceil(length / perLine));
14
+ }
15
+ function sourceLines(raw) {
16
+ let n = 1;
17
+ // Code units, not `raw[i]`: the indexed read creates a one-character string per byte.
18
+ for (let i = 0; i < raw.length; i++)
19
+ if (raw.charCodeAt(i) === NEWLINE)
20
+ n++;
21
+ if (raw.endsWith('\n'))
22
+ n--;
23
+ return Math.max(1, n);
24
+ }
25
+ // An image's hinted height, else the floor: an unsized image is not knowable until it decodes.
26
+ function imageHeights(raw, env) {
27
+ let total = 0;
28
+ IMAGE_ALT.lastIndex = 0;
29
+ let m;
30
+ while ((m = IMAGE_ALT.exec(raw)) !== null) {
31
+ total += parseImageDimensions(m[1]).height ?? env.imageBlockMinHeight;
32
+ }
33
+ return total;
34
+ }
35
+ // ── Estimates ───────────────────────────────────────────────────────────────
36
+ /** Wrapped text, or the images it holds when they stand taller than it. */
37
+ export function proseEstimate(node, env) {
38
+ const text = wrappedLines(node.raw.length, env) * env.lineHeight;
39
+ // The substring test first: most prose holds no image, and the alt scan is the costly part.
40
+ if (!node.raw.includes('!['))
41
+ return text;
42
+ // The image heights, the floor included, size the whole block, frame and all.
43
+ return Math.max(text, imageHeights(node.raw, env) - env.blockChrome);
44
+ }
45
+ /** One line, whatever the bytes: a divider. */
46
+ export function singleLineEstimate(_node, env) {
47
+ return env.lineHeight;
48
+ }
49
+ /** One code line per source line: code does not wrap. */
50
+ export function sourceLinesEstimate(node, env) {
51
+ return sourceLines(node.raw) * env.codeLineHeight;
52
+ }
53
+ /**
54
+ * A grid takes the larger of its rows and its source wrapped; any other container the larger of a
55
+ * line per child and its text wrapped, since the first ignores wrapping and the second margins.
56
+ */
57
+ export function containerEstimate(node, env) {
58
+ const wrapped = wrappedLines(node.raw.length, env) * env.lineHeight;
59
+ if (isGridKind(node.kind)) {
60
+ return Math.max(sourceLines(node.raw) * env.lineHeight, wrapped);
61
+ }
62
+ const children = Math.max(1, node.children?.length ?? 1);
63
+ return Math.max(children * (env.lineHeight + env.blockChrome) - env.blockChrome, wrapped);
64
+ }