@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,43 +1,42 @@
1
1
  /**
2
- * Toggle an inline format inside a prose block. Over a SELECTION the direction is parse coverage,
3
- * not edge adjacency: a covered range unapplies (aligned strip, else split, over every covering run
4
- * in turn), overlapping or abutting runs apply over their union, a bare range wraps the core its
5
- * boundary whitespace leaves. Where the mode PAINTS delimiters the strip and the wrap write
6
- * unverified; every other candidate declines unless it verifies. At a COLLAPSED CARET: unwrap the
7
- * span, else drop the empty pair, else insert one (live-mode.md § 4.3). Every write clamps to the
8
- * CONTENT range: a marker in `# ` changes the kind.
2
+ * Toggles an inline mark inside a prose block, and answers whether a range already carries one.
3
+ * The parse decides the direction; in a mode that hides markers a candidate must leave the screen
4
+ * text unchanged (`docs/design/live-mode.md` § 2, and § 4.3 for a collapsed caret). Writes stay
5
+ * inside the content range, since a marker written into `# ` would change the block's kind.
9
6
  */
10
7
  import { recordFormatCoverageRead } from '../../perf/instruments';
11
- import { paintsFocusedMarkers } from '../../presentation-mode';
12
8
  import { getInlineMarkPolicy, listInlineMarks } from '../../schema/inline-construct-policy';
13
- import { constructContentRange, inlineDescendants, parseInline } from './index';
9
+ import { constructContentRange, inlineDescendants, readInline } from './index';
14
10
  import { CONTENT_VISIBILITY, renderedText } from './visibility';
15
- /** Null for a kind whose row declares no mark, or for a press whose every candidate fails its
16
- * verification: the vocabulary lives on the row, so a kind without one has no delimiters this
17
- * seam could write, and a toggle's sound fallback is not writing. */
18
- export function toggleInlineFormat(edit, format, mode) {
11
+ /** Null for a kind whose policy row declares no mark (there are no delimiters to write) and for
12
+ * a toggle whose every candidate fails verification: the safe fallback is to write nothing. */
13
+ export function toggleInlineFormat(edit, format) {
19
14
  const mark = getInlineMarkPolicy(format);
20
15
  if (!mark)
21
16
  return null;
22
17
  const { display, content, selection } = edit;
23
18
  const start = clampToContent(selection.start, content);
24
19
  const end = clampToContent(selection.end, content);
25
- // The same bounds the block itself parses with, so no construct can straddle the structural
20
+ // Parsed with the block's own content bounds, so no construct can straddle the structural
26
21
  // bytes the clamp above keeps the write out of.
27
- const inlines = parseInline(display, content.start, content.end);
22
+ const inlines = readInline(display, content.start, content.end, edit.reading.resolver, edit.reading.grammar);
28
23
  if (start === end)
29
24
  return toggleAtCaret(display, inlines, start, format, mark);
30
- // Painted delimiters are the mode's own answer, so those modes write their candidate unverified.
31
- // The preview rungs paint: this seam only writes into the block those rungs reveal.
32
- const paints = paintsFocusedMarkers(mode ?? 'source');
25
+ // A mode that shows the delimiters writes its candidate unverified: the user sees the markers.
26
+ // The preview modes count as showing them, since a toggle only writes into the focused block.
27
+ const paints = !edit.reading.hidesDelimitersAtCaret();
33
28
  const { from, to, covering } = coveredReading(display, inlines, start, end, format);
34
- // A strip sheds ONE run, so where a second of the same kind covers the selection too, the answer
35
- // is the covering arm's split: stripping there leaves the press's own read still active.
36
- const sole = covering.length > 1 ? null : soleStripCandidate(display, inlines, from, to, format);
29
+ // A strip removes one run, so when a second run of the same kind also covers the selection the
30
+ // split path below handles it: stripping alone would leave the format still active.
31
+ const sole = covering.length > 1
32
+ ? null
33
+ : soleStripCandidate(display, inlines, from, to, format, edit.reading);
37
34
  if (sole)
38
- return paints || preservesScreen(sole, edit, screenOf(display, content)) ? sole : null;
39
- // The flank strip rewrites bytes OUTSIDE the selection, and byte equality can mistake a nested
40
- // run's delimiters for the enclosing one's, so its candidate verifies like the split's.
35
+ return paints || preservesScreen(sole, edit, screenOf(display, content, edit.reading))
36
+ ? sole
37
+ : null;
38
+ // The flank strip rewrites bytes outside the selection, and byte equality can mistake a nested
39
+ // run's delimiters for the enclosing one's, so its candidate is verified like the split's.
41
40
  const enclosing = enclosingSpanOf(inlines, from, to, format);
42
41
  if (enclosing && flanksAreItsMarkers(display, from, to, enclosing)) {
43
42
  const flank = firstFlipVerified([flankStrip(display, from, to, enclosing)], edit, format, 'unapply');
@@ -49,36 +48,34 @@ export function toggleInlineFormat(edit, format, mode) {
49
48
  const union = formatUnionOf(inlines, start, end, format);
50
49
  if (union)
51
50
  return firstFlipVerified(absorbCandidates(display, inlines, union, { start, end }, format, mark), edit, format, 'apply');
52
- // A wrap whose markers do not paint owes split and absorb's coverage check: bytes that re-pair
53
- // against a neighbouring run leave the range unformatted with nothing on screen to say so.
51
+ // A wrap with hidden markers is verified like split and absorb: markers that re-pair with a
52
+ // neighbouring run leave the range unformatted, with nothing on screen to show it.
54
53
  const wrap = wrapCandidate(display, inlines, start, end, mark);
55
54
  if (!wrap)
56
55
  return null;
57
56
  return paints ? wrap : firstFlipVerified([wrap], edit, format, 'apply');
58
57
  }
59
- /** Whether a toggle right now would UNAPPLY — the pressed-state a toolbar paints. The same arms
60
- * the toggle routes by, asked without emitting: a caret inside the construct, a selection
61
- * carrying its own markers, flanked by them, or covered by a same-format construct. */
58
+ /** Whether a toggle right now would unformat, which is the pressed state a toolbar shows. The
59
+ * same checks the toggle routes by, asked without writing anything. */
62
60
  export function isInlineFormatActive(edit, format) {
63
61
  return coverageCarries(coverageOf(edit), format);
64
62
  }
65
- /** The pressed state a result would paint: the same read, over the bytes and range it hands back.
66
- * One home for the after-read, so the seam's own direction check and the ladder guard cannot
67
- * drift on the content-end arithmetic. */
63
+ /** The same read over the bytes and range `result` hands back, kept here so the toggle's direction
64
+ * check and the tests that re-read a result agree on where the content ends. */
68
65
  export function isInlineFormatActiveAfter(edit, result, format) {
69
66
  return isInlineFormatActive({
70
67
  display: result.newDisplay,
71
68
  content: shiftedContent(edit.content, edit.display, result),
72
- selection: { start: result.newSelStart, end: result.newSelEnd }
69
+ selection: { start: result.newSelStart, end: result.newSelEnd },
70
+ reading: edit.reading
73
71
  }, format);
74
72
  }
75
73
  /** Every registered mark the edit's range already carries. */
76
74
  export function activeInlineFormats(edit) {
77
75
  return inlineFormatsCovering(edit, listInlineMarks().map((entry) => entry.kind));
78
76
  }
79
- /** Which of `candidates` the range carries, off ONE parse of the block. A toolbar asks once per
80
- * button on every selection change and every answer is the same walk; taking candidates rather
81
- * than the vocabulary is what lets a range's running intersection stop re-asking ruled-out marks. */
77
+ /** One parse of the block for every candidate. A toolbar asks per button on each selection
78
+ * change, so a caller can leave out marks it has already ruled out. */
82
79
  export function inlineFormatsCovering(edit, candidates) {
83
80
  const coverage = coverageOf(edit);
84
81
  const carried = new Set();
@@ -87,14 +84,16 @@ export function inlineFormatsCovering(edit, candidates) {
87
84
  carried.add(kind);
88
85
  return carried;
89
86
  }
90
- /** The same read, one id at a time, with consecutive asks over one block state sharing the parse:
91
- * a toolbar's buttons arrive as N separate calls, and only the caller knows they are one repaint.
92
- * One slot, since the previous state is dead the moment a keystroke or the caret moves. */
87
+ /** Shares one parse across a toolbar's per-button calls over the same block state. One memo
88
+ * entry only, since a keystroke or a caret move retires the previous state. */
93
89
  export function createInlineFormatActiveMemo() {
90
+ // The resolver is kept apart from the edit because the editor's ref reads it through a getter,
91
+ // so a definition edited elsewhere changes it under the same ref.
94
92
  let slot = null;
95
93
  return (edit, format) => {
96
- if (!slot || !sameEdit(slot.edit, edit))
97
- slot = { edit, coverage: coverageOf(edit) };
94
+ const resolver = edit.reading.resolver;
95
+ if (!slot || slot.resolver !== resolver || !sameEdit(slot.edit, edit))
96
+ slot = { edit, resolver, coverage: coverageOf(edit) };
98
97
  return coverageCarries(slot.coverage, format);
99
98
  };
100
99
  }
@@ -103,9 +102,9 @@ function coverageOf(edit) {
103
102
  const { display, content, selection } = edit;
104
103
  const start = clampToContent(selection.start, content);
105
104
  const end = clampToContent(selection.end, content);
106
- const inlines = parseInline(display, content.start, content.end);
107
- // A selection spanning the whole display is the same parse, byte bounds included — which is
108
- // every middle block of a cross-block range, so the second parse is worth not making.
105
+ const inlines = readInline(display, content.start, content.end, edit.reading.resolver, edit.reading.grammar);
106
+ // A selection spanning the whole display parses the same as the block, and that is every
107
+ // middle block of a cross-block range, so the second parse is skipped.
109
108
  const sliceIsDisplay = start === 0 && end === display.length;
110
109
  return {
111
110
  display,
@@ -116,20 +115,21 @@ function coverageOf(edit) {
116
115
  ? []
117
116
  : sliceIsDisplay
118
117
  ? inlines
119
- : parseInline(display.slice(start, end), 0, end - start)
118
+ : readInline(display.slice(start, end), 0, end - start, edit.reading.resolver, edit.reading.grammar)
120
119
  };
121
120
  }
122
- /** The memo's key: field-wise, where the cross-block sibling composes a string, because the
123
- * display here is the block's whole raw and building a key would cost what the memo saves. */
121
+ /** Field-wise comparison rather than a composed string key: the display is the block's whole raw,
122
+ * and building a key would cost what the memo saves. */
124
123
  function sameEdit(a, b) {
125
124
  return (a.display === b.display &&
126
125
  a.content.start === b.content.start &&
127
126
  a.content.end === b.content.end &&
128
127
  a.selection.start === b.selection.start &&
129
- a.selection.end === b.selection.end);
128
+ a.selection.end === b.selection.end &&
129
+ a.reading.grammar === b.reading.grammar);
130
130
  }
131
- /** The one home for "does this range carry this mark", so every reader asks the same guards —
132
- * including the mark-row test, which a kind with no vocabulary has to fail rather than parse. */
131
+ /** The one place that answers "does this range carry this mark", so every reader applies the same
132
+ * checks, including the policy-row test a kind with no mark must fail without parsing. */
133
133
  function coverageCarries({ display, start, end, inlines, sliceNodes }, format) {
134
134
  if (!getInlineMarkPolicy(format))
135
135
  return false;
@@ -142,11 +142,8 @@ function coverageCarries({ display, start, end, inlines, sliceNodes }, format) {
142
142
  return true;
143
143
  return coveredReading(display, inlines, start, end, format).covering.length > 0;
144
144
  }
145
- /**
146
- * The range an unapply reads, with the runs covering it. A run closes against a word and never
147
- * whitespace, so the wrap leaves a boundary space OUTSIDE the delimiters: a selection reaching
148
- * past a run by whitespace alone is still that run's own, or it could not take its own mark off.
149
- */
145
+ /** A run closes against a word, never whitespace, so a selection reaching past a run by
146
+ * whitespace alone still counts as that run, or it could not take its own mark off. */
150
147
  function coveredReading(display, inlines, start, end, format) {
151
148
  const covering = coveringSpansOf(inlines, start, end, format);
152
149
  if (covering.length > 0)
@@ -160,13 +157,11 @@ function coveredReading(display, inlines, start, end, format) {
160
157
  : { from: start, to: end, covering };
161
158
  }
162
159
  // ── Aligned unapply ──────────────────────────────────────────────────────────
163
- /** The selection carries its own flanking markers (the user selected `**word**`): exactly one
164
- * span covering the whole slice, so the strip can't orphan markers on `**a** **b**`. It rewrites
165
- * only selected bytes, so it keeps the press's literal reading, and it sheds the runs of its own
166
- * kind inside that reading, or a whole-range unapply would leave part of the range formatted. */
167
- function soleStripCandidate(display, inlines, start, end, format) {
160
+ /** For a selection holding its own markers (`**word**`), covered by exactly one span so that
161
+ * `**a** **b**` keeps its markers. Nested same-kind runs go too, or part stays formatted. */
162
+ function soleStripCandidate(display, inlines, start, end, format, reading) {
168
163
  const slice = display.slice(start, end);
169
- const sliceNodes = parseInline(slice, 0, slice.length);
164
+ const sliceNodes = readInline(slice, 0, slice.length, reading.resolver, reading.grammar);
170
165
  const selfSpan = soleSpanOfSelection(sliceNodes, inlines, start, end, format);
171
166
  if (!selfSpan)
172
167
  return null;
@@ -177,9 +172,8 @@ function soleStripCandidate(display, inlines, start, end, format) {
177
172
  newSelEnd: start + unwrapped.length
178
173
  };
179
174
  }
180
- /** Markers outside the selection (`word` inside `*word*`), stripped at the selection's flanks
181
- * rather than the construct's own run, so a `***word***` stack sheds one layer by run
182
- * arithmetic; the construct check is what makes `**word**` toggled to emphasis nest instead. */
175
+ /** Markers just outside the selection (`word` in `*word*`) are cut at the selection's edges, not
176
+ * at the construct's own run, so `***word***` loses one layer. */
183
177
  function flankStrip(display, start, end, span) {
184
178
  const mLen = markerLengthOf(span);
185
179
  return {
@@ -189,12 +183,8 @@ function flankStrip(display, start, end, span) {
189
183
  };
190
184
  }
191
185
  // ── Split unapply ────────────────────────────────────────────────────────────
192
- /**
193
- * The construct re-emitted around the selection: each non-empty half keeps the construct's own
194
- * delimiter run, and a half's boundary whitespace yields a second candidate with it moved outside,
195
- * since the symmetric runs cannot close against a space. The middle sheds the markers of any
196
- * same-format construct it wholly contains, or it would reload still formatted.
197
- */
186
+ /** Each non-empty half keeps its delimiters, plus a candidate with boundary spaces moved out, as a
187
+ * run cannot close on a space. The middle loses nested same-format markers, or stays formatted. */
198
188
  function splitCandidates(display, inlines, span, start, end, format) {
199
189
  const cutStart = Math.max(start, span.contentStart);
200
190
  const cutEnd = Math.min(end, span.contentEnd);
@@ -234,11 +224,8 @@ function halfVariants(text, opener, closer) {
234
224
  ];
235
225
  }
236
226
  // ── Absorb apply ─────────────────────────────────────────────────────────────
237
- /**
238
- * The selection grown over every same-format construct it touches, to a fixed point. Only
239
- * recursive-content constructs join: one holding literal text (a code span) means its delimiters
240
- * are honest content inside any wider span, so merging would rewrite what the reader sees.
241
- */
227
+ /** Grows to a fixed point over the same-format constructs the selection touches. Only ones with
228
+ * children join: inside a wider span a code span's delimiters would show as literal text. */
242
229
  function formatUnionOf(inlines, start, end, format) {
243
230
  const spans = [];
244
231
  for (const node of inlineDescendants(inlines)) {
@@ -267,9 +254,8 @@ function formatUnionOf(inlines, start, end, format) {
267
254
  }
268
255
  return touched ? { start: from, end: to } : null;
269
256
  }
270
- /** The run grows to the union, the SELECTION does not: each endpoint is carried through the
271
- * strip and re-wrap, so a press over half a run leaves that half selected. An endpoint on the
272
- * union's edge keeps the new marker inside the range, as a bare wrap's selection does. */
257
+ /** The run grows to the union but the selection does not: each endpoint is tracked through the
258
+ * strip and re-wrap, so a toggle over half a run leaves that half selected. */
273
259
  function absorbCandidates(display, inlines, union, selected, format, mark) {
274
260
  if (!cutsLandCleanly(inlines, union, union))
275
261
  return [];
@@ -307,10 +293,8 @@ function absorbCandidates(display, inlines, union, selected, format, mark) {
307
293
  out.push(wrapAt(lead, stripped.slice(lead.length, stripped.length - trail.length), trail));
308
294
  return out;
309
295
  }
310
- /** Whether a rewrite of `within` may splice at both `cuts`: each has to land where a byte splice
311
- * can, in a text run or on a construct boundary, never strictly inside another construct's bytes —
312
- * a stranded delimiter re-pairs with whatever run the parse finds next, which can preserve the
313
- * text while reformatting content nobody selected. Split, absorb and the wrap all ask here. */
296
+ /** Each cut must fall in a text run or on a construct boundary: a delimiter stranded inside a
297
+ * construct re-pairs with the next run the parse finds, formatting content nobody selected. */
314
298
  function cutsLandCleanly(inlines, cuts, within) {
315
299
  for (const node of inlineDescendants(inlines)) {
316
300
  if (node.kind === 'text')
@@ -352,7 +336,7 @@ function spliceOutCuts(display, cuts, from, to) {
352
336
  return out + display.slice(at, to);
353
337
  }
354
338
  /** Where a display offset lands in the stripped slice: the cut bytes before it fall away, and an
355
- * offset inside a marker rides to that marker's start. */
339
+ * offset inside a marker moves to that marker's start. */
356
340
  function strippedOffset(cuts, from, offset) {
357
341
  let removed = 0;
358
342
  for (const [cutFrom, cutTo] of cuts)
@@ -361,12 +345,8 @@ function strippedOffset(cuts, from, offset) {
361
345
  return Math.max(0, offset - from - removed);
362
346
  }
363
347
  // ── Wrap ─────────────────────────────────────────────────────────────────────
364
- /**
365
- * The bare wrap, over the selection's trimmed core: markdown opens and closes a run against a word,
366
- * never whitespace, so a boundary space goes to the plain text beside the run, as
367
- * `live-split-rebalance` reads the same problem. Null where nothing survives the trim, or where an
368
- * endpoint is no legal cut: markers spliced into a construct's bytes re-pair.
369
- */
348
+ /** Boundary spaces stay outside the markers, since a run opens and closes against a word. Null
349
+ * when nothing survives the trim or an endpoint would cut into a construct. */
370
350
  function wrapCandidate(display, inlines, start, end, mark) {
371
351
  const core = withoutBoundaryWhitespace(display, start, end);
372
352
  if (!core || !cutsLandCleanly(inlines, core, core))
@@ -384,27 +364,28 @@ function wrapRange(display, start, end, mark) {
384
364
  // ── Verification ─────────────────────────────────────────────────────────────
385
365
  /** A toggle changes formatting, never the text on screen, so the render path's own reading of the
386
366
  * content is what a candidate has to leave unchanged (live-mode.md § 2). */
387
- function screenOf(display, content) {
388
- return renderedText(parseInline(display, content.start, content.end), display, CONTENT_VISIBILITY);
367
+ function screenOf(display, content, reading) {
368
+ return renderedText(readInline(display, content.start, content.end, reading.resolver, reading.grammar), display, CONTENT_VISIBILITY, { grammar: reading.grammar });
389
369
  }
390
370
  function preservesScreen(candidate, edit, shown) {
391
371
  const { display, content } = edit;
392
- return screenOf(candidate.newDisplay, shiftedContent(content, display, candidate)) === shown;
372
+ const shifted = shiftedContent(content, display, candidate);
373
+ return screenOf(candidate.newDisplay, shifted, edit.reading) === shown;
393
374
  }
394
- /** Both checks a candidate owes wherever its own bytes are not the mode's answer: the content text
395
- * unchanged, and the selection's coverage actually flipped — text preservation alone admits a
396
- * nested pair that leaves the range formatted exactly as it was. */
375
+ /** The screen text must be unchanged and the coverage must actually flip: text preservation
376
+ * alone admits a nested pair that leaves the range formatted exactly as it was. */
397
377
  function firstFlipVerified(candidates, edit, format, direction) {
398
378
  const { display, content } = edit;
399
- const shown = screenOf(display, content);
379
+ const shown = screenOf(display, content, edit.reading);
400
380
  return (candidates.find((candidate) => preservesScreen(candidate, edit, shown) &&
401
- coverageFlipped(candidate, shiftedContent(content, display, candidate), format, direction)) ?? null);
381
+ coverageFlipped(candidate, edit, format, direction)) ?? null);
402
382
  }
403
- /** Whether NO same-format run is left overlapping the selection, or one covers it whole — the
404
- * press's direction, asked of the bytes it would write. */
405
- function coverageFlipped(candidate, content, format, direction) {
383
+ /** Whether the toggle's direction holds in the bytes it would write: for apply, a same-format run
384
+ * covers the selection whole; for unapply, none still overlaps it. */
385
+ function coverageFlipped(candidate, edit, format, direction) {
406
386
  const { newDisplay, newSelStart: from, newSelEnd: to } = candidate;
407
- const inlines = parseInline(newDisplay, content.start, content.end);
387
+ const content = shiftedContent(edit.content, edit.display, candidate);
388
+ const inlines = readInline(newDisplay, content.start, content.end, edit.reading.resolver, edit.reading.grammar);
408
389
  if (direction === 'apply')
409
390
  return coveringSpansOf(inlines, from, to, format).length > 0;
410
391
  const spans = [];
@@ -413,7 +394,7 @@ function coverageFlipped(candidate, content, format, direction) {
413
394
  spans.push({ start: node.start, end: node.end });
414
395
  return spans.every((span) => span.end <= from || to <= span.start);
415
396
  }
416
- /** The write clamps into the content, so only its END moves, by what the candidate added. */
397
+ /** The write stays inside the content range, so only its end moves, by what the candidate added. */
417
398
  function shiftedContent(content, display, candidate) {
418
399
  return { start: content.start, end: content.end + candidate.newDisplay.length - display.length };
419
400
  }
@@ -432,10 +413,8 @@ function toggleAtCaret(display, inlines, caret, format, mark) {
432
413
  }
433
414
  const markers = mark.markerBytes;
434
415
  const mLen = markers.length;
435
- // The empty pair the previous press inserted; there is no span to find, since `****` parses as
436
- // literal text. Removal is the exact inverse of the insert below, so the pair must be a run of
437
- // its own: a marker character abutting either side means these are bytes the user wrote, and
438
- // this arm only runs where the mode paints them.
416
+ // An empty pair from a previous toggle, which parses as literal text (`****`). A marker
417
+ // character beside the pair means the user wrote these bytes, so only a lone pair goes.
439
418
  if (isLoneEmptyPair(display, caret, markers)) {
440
419
  return {
441
420
  newDisplay: display.slice(0, caret - mLen) + display.slice(caret + mLen),
@@ -460,8 +439,8 @@ function isLoneEmptyPair(display, caret, markers) {
460
439
  display[start - 1] !== markers[0] &&
461
440
  display[caret + mLen] !== markers[mLen - 1]);
462
441
  }
463
- /** Both delimiters of a construct are the same run, so the bytes its content leaves over split
464
- * evenly — which is how a code span's content-sized fence is read back off the parse. */
442
+ /** Both delimiters of a construct are the same run, so the bytes outside its content split evenly;
443
+ * a code span's fence comes from `codeSpanFence`, through {@link constructContentRange}. */
465
444
  function markerLengthOf(span) {
466
445
  return span.contentStart - span.start;
467
446
  }
@@ -471,11 +450,8 @@ function spanOf(node) {
471
450
  return null;
472
451
  return { start: node.start, end: node.end, contentStart: content.start, contentEnd: content.end };
473
452
  }
474
- /**
475
- * The innermost construct of this kind whose CONTENT covers `[start, end]`, off the FULL-context
476
- * parse: `*word*` carved from `**word**` and from `***word***` read identically in isolation, but
477
- * only the latter sits inside an emphasis span.
478
- */
453
+ /** The innermost, from the block's full parse: `*word*` cut from `**word**` or from `***word***`
454
+ * reads the same alone, but only the latter sits inside an emphasis span. */
479
455
  function enclosingSpanOf(inlines, start, end, format) {
480
456
  let found = null;
481
457
  for (const node of inlineDescendants(inlines)) {
@@ -487,10 +463,8 @@ function enclosingSpanOf(inlines, start, end, format) {
487
463
  }
488
464
  return found;
489
465
  }
490
- /** Every construct of this kind whose WHOLE RANGE covers the selection, peeled of the delimiters
491
- * the selection takes whole — coverage that reaches into the delimiters still reads as "already
492
- * formatted", and where runs of one kind nest, shedding the inner one leaves the outer covering,
493
- * so the split tries each in turn. */
466
+ /** A selection reaching into the delimiters still reads as formatted. Every nested run of the
467
+ * kind is returned, since removing the inner one leaves the outer covering. */
494
468
  function coveringSpansOf(inlines, start, end, format) {
495
469
  const range = peeledToContent(inlines, start, end);
496
470
  const covering = [];
@@ -503,9 +477,8 @@ function coveringSpansOf(inlines, start, end, format) {
503
477
  }
504
478
  return covering;
505
479
  }
506
- /** The range with the delimiters of every construct it takes WHOLE peeled off: a run nests inside
507
- * another kind's bytes (`***ab***` is emphasis around strong), so a range that takes the outer
508
- * construct whole is asking about the content that construct encloses. */
480
+ /** A run can nest inside another kind's bytes (`***ab***` is emphasis around strong), so a range
481
+ * taking the outer construct whole is asking about the content inside it. */
509
482
  function peeledToContent(inlines, start, end) {
510
483
  let from = start;
511
484
  let to = end;
@@ -530,12 +503,8 @@ function spanExactlyOver(inlines, start, end) {
530
503
  }
531
504
  return null;
532
505
  }
533
- /**
534
- * The selection read as exactly one span of this kind — standalone AND in the block's own parse,
535
- * which is the only reading a strip may act on: `*bold*` carved out of `**bold**` is emphasis alone
536
- * while the block holds none, and shedding one delimiter layer there lands on a run of the same
537
- * kind. Offsets come back in SLICE space, where the strip splices.
538
- */
506
+ /** Both parses must agree before a strip: `*bold*` cut from `**bold**` is emphasis alone but not
507
+ * in the block. Offsets are relative to the slice, where the strip splices. */
539
508
  function soleSpanOfSelection(sliceNodes, inlines, start, end, format) {
540
509
  const span = soleSpanIn(sliceNodes, end - start, format);
541
510
  if (!span)
@@ -569,9 +538,8 @@ function leadingWs(text) {
569
538
  function trailingWs(text) {
570
539
  return /\s*$/.exec(text)[0];
571
540
  }
572
- /** A range minus its boundary whitespace, null once nothing is left. One home for the trim, so the
573
- * wrap here and the cross-block decomposition that trims before it ever asks
574
- * (`selection/cross-block/format-range.ts`) cannot disagree about where a run may close. */
541
+ /** Shared with the cross-block path (`selection/cross-block/format-range.ts`) so the two agree
542
+ * on where a run may close. Null when nothing is left. */
575
543
  export function withoutBoundaryWhitespace(display, from, to) {
576
544
  let start = from;
577
545
  let end = to;
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * HTML5 named-entity table per CommonMark §2.5, vendored from
3
3
  * https://html.spec.whatwg.org/entities.json (WHATWG HTML Standard, CC BY 4.0; see
4
- * THIRD-PARTY-NOTICES.md). To regenerate: keep only entries whose key ends with `;`
5
- * (CommonMark requires it), then map key-without-`&`/`;` to the whole `characters` field,
6
- * which is multi-codepoint for some entries.
4
+ * THIRD-PARTY-NOTICES.md). To regenerate: keep only keys ending in `;`, as CommonMark requires,
5
+ * and map each key without `&`/`;` to its whole `characters` field (some are multi-codepoint).
7
6
  */
8
7
  export declare const HTML5_NAMED_ENTITIES: Readonly<Record<string, string>>;
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * HTML5 named-entity table per CommonMark §2.5, vendored from
3
3
  * https://html.spec.whatwg.org/entities.json (WHATWG HTML Standard, CC BY 4.0; see
4
- * THIRD-PARTY-NOTICES.md). To regenerate: keep only entries whose key ends with `;`
5
- * (CommonMark requires it), then map key-without-`&`/`;` to the whole `characters` field,
6
- * which is multi-codepoint for some entries.
4
+ * THIRD-PARTY-NOTICES.md). To regenerate: keep only keys ending in `;`, as CommonMark requires,
5
+ * and map each key without `&`/`;` to its whole `characters` field (some are multi-codepoint).
7
6
  */
8
7
  export const HTML5_NAMED_ENTITIES = Object.freeze({
9
8
  AElig: 'Æ',
@@ -4,8 +4,12 @@
4
4
  * The tag sources are exported so the block parser anchors them at line scope rather than
5
5
  * keeping a copy that could drift.
6
6
  */
7
- const OPEN_TAG = /<[A-Za-z][A-Za-z0-9-]*(?:\s+[a-zA-Z_:][a-zA-Z0-9_.:-]*(?:\s*=\s*(?:[^\s"'=<>`]+|"[^"]*"|'[^']*'))?)*\s*\/?>/;
8
- const CLOSE_TAG = /<\/[A-Za-z][A-Za-z0-9-]*\s*>/;
7
+ import { WHITESPACE_CHARS, WHITESPACE_CLASS } from '../lines';
8
+ // `W` is GFM whitespace (§2.1), so a non-breaking space inside a tag makes it no tag.
9
+ const W = WHITESPACE_CLASS;
10
+ const UNQUOTED_VALUE = `[^${WHITESPACE_CHARS}"'=<>\`]+`;
11
+ const OPEN_TAG = new RegExp(`<[A-Za-z][A-Za-z0-9-]*(?:${W}+[a-zA-Z_:][a-zA-Z0-9_.:-]*(?:${W}*=${W}*(?:${UNQUOTED_VALUE}|"[^"]*"|'[^']*'))?)*${W}*\\/?>`);
12
+ const CLOSE_TAG = new RegExp(`<\\/[A-Za-z][A-Za-z0-9-]*${W}*>`);
9
13
  /** Open tag `<name (attrs)* /?>` (CommonMark §6.6), unanchored source. */
10
14
  export const OPEN_TAG_SOURCE = OPEN_TAG.source;
11
15
  /** Close tag `</name>` with optional whitespace before `>`, unanchored source. */
@@ -7,3 +7,5 @@ export interface ParsedImageAlt {
7
7
  crop: ImageCrop | undefined;
8
8
  }
9
9
  export declare function parseImageDimensions(alt: string): ParsedImageAlt;
10
+ /** The suffix `parseImageDimensions` reads back as these values; empty for no width. */
11
+ export declare function buildDimSuffix(width: number | undefined, height: number | undefined, crop: ImageCrop | undefined): string;
@@ -1,11 +1,13 @@
1
- // `|N` / `|NxM` is an Obsidian extension, not part of GFM. The `@X,Y[,Z]` tail on the `NxM`
2
- // form is this editor's own: the pan and zoom of the image inside that frame.
1
+ // The size hint at the end of an image's alt text, read and written here. `|N` / `|NxM` is an
2
+ // Obsidian extension, not part of GFM; the `@X,Y[,Z]` tail on the `NxM` form is this editor's
3
+ // own: the pan and zoom of the image inside that frame.
3
4
  const MAX_DIMENSION = 10000;
4
5
  export const MAX_CROP_ZOOM = 4;
5
6
  // The longest decodable suffix, `|10000x10000@100,100,4.00`. Bounding the pipe search to that
6
7
  // tail keeps nested-label floods linear.
7
8
  const MAX_SUFFIX_SEARCH = 26;
8
9
  const NO_HINT = { width: undefined, height: undefined, crop: undefined };
10
+ // ── Reading ─────────────────────────────────────────────────────────────────
9
11
  export function parseImageDimensions(alt) {
10
12
  const lastPipe = boundedLastPipe(alt);
11
13
  const dims = lastPipe === -1 ? null : parseDimensionSuffix(alt.slice(lastPipe + 1));
@@ -76,3 +78,18 @@ function parseStrictInt(s) {
76
78
  return null;
77
79
  return n;
78
80
  }
81
+ // ── Writing ─────────────────────────────────────────────────────────────────
82
+ /** The suffix `parseImageDimensions` reads back as these values; empty for no width. */
83
+ export function buildDimSuffix(width, height, crop) {
84
+ if (width === undefined)
85
+ return '';
86
+ if (height === undefined)
87
+ return `|${width}`;
88
+ return `|${width}x${height}${crop ? buildCropTail(crop) : ''}`;
89
+ }
90
+ /** The pan in whole percents, then the zoom to two decimals, left out at 1. */
91
+ function buildCropTail(crop) {
92
+ const z = Math.round(crop.z * 100) / 100;
93
+ const zoom = z === 1 ? '' : `,${String(z)}`;
94
+ return `@${Math.round(crop.x)},${Math.round(crop.y)}${zoom}`;
95
+ }
@@ -0,0 +1,11 @@
1
+ import type { ImageFields, InlineNode } from '../nodes';
2
+ /** Bytes to splice over `image`'s range, or null when the edit is refused. A node a plugin's
3
+ * syntax owns is written by its `rewriteImage` hook (`docs/design/plugin-contract.md`). */
4
+ export declare function buildImageEditBytes(image: InlineNode, blockRaw: string, fields: ImageFields): string | null;
5
+ /** Only the optional keys the node holds, so a rebuild adds no field the source lacked and
6
+ * repeated resizes leave the alt text unchanged. */
7
+ export declare function imageFieldsFromInline(image: InlineNode): ImageFields;
8
+ export declare function sameImageFields(a: ImageFields, b: ImageFields): boolean;
9
+ /** The inverse of the built-in grammar; call `buildImageEditBytes`, which decides whether the
10
+ * bytes are GFM's to write. */
11
+ export declare function buildImageSourceBytes(fields: ImageFields): string;
@@ -0,0 +1,71 @@
1
+ // Where an image edit becomes bytes: the one function every image write goes through, and
2
+ // below it the GFM serializer, which nothing else may call.
3
+ import { encodeDestination, escapeTitle } from './destination-bytes';
4
+ import { buildDimSuffix } from './image-dimensions';
5
+ import { devWarn } from '../../dev-warn';
6
+ // ── Where the bytes are written ─────────────────────────────────────────────
7
+ /** Bytes to splice over `image`'s range, or null when the edit is refused. A node a plugin's
8
+ * syntax owns is written by its `rewriteImage` hook (`docs/design/plugin-contract.md`). */
9
+ export function buildImageEditBytes(image, blockRaw, fields) {
10
+ const claim = image.syntaxClaim;
11
+ if (!claim)
12
+ return buildImageSourceBytes(fields);
13
+ const bytes = claim.rewriteImage?.(blockRaw.slice(image.start, image.end), fields) ?? null;
14
+ if (bytes === null) {
15
+ devWarn('image-edit', `declined: the "${claim.prefix}" inline syntax handler owns these bytes and ` +
16
+ `${claim.rewriteImage ? 'its rewriteImage hook cannot represent this edit' : 'registered no rewriteImage hook'}`, fields);
17
+ }
18
+ return bytes;
19
+ }
20
+ /** Only the optional keys the node holds, so a rebuild adds no field the source lacked and
21
+ * repeated resizes leave the alt text unchanged. */
22
+ export function imageFieldsFromInline(image) {
23
+ return {
24
+ alt: image.alt ?? '',
25
+ url: image.url ?? '',
26
+ ...(image.title !== undefined ? { title: image.title } : {}),
27
+ ...(image.width !== undefined ? { width: image.width } : {}),
28
+ ...(image.height !== undefined ? { height: image.height } : {}),
29
+ ...(image.crop !== undefined ? { crop: image.crop } : {}),
30
+ ...(image.label !== undefined ? { label: image.label } : {})
31
+ };
32
+ }
33
+ export function sameImageFields(a, b) {
34
+ return (a.alt === b.alt &&
35
+ a.url === b.url &&
36
+ a.title === b.title &&
37
+ a.width === b.width &&
38
+ a.height === b.height &&
39
+ a.label === b.label &&
40
+ a.crop?.x === b.crop?.x &&
41
+ a.crop?.y === b.crop?.y &&
42
+ a.crop?.z === b.crop?.z);
43
+ }
44
+ // ── The GFM serializer ──────────────────────────────────────────────────────
45
+ /** The inverse of the built-in grammar; call `buildImageEditBytes`, which decides whether the
46
+ * bytes are GFM's to write. */
47
+ export function buildImageSourceBytes(fields) {
48
+ const dimSuffix = buildDimSuffix(fields.width, fields.height, fields.crop);
49
+ const altSegment = escapeAlt(fields.alt) + dimSuffix;
50
+ // A reference image's url and title belong to its link reference definition.
51
+ if (fields.label !== undefined) {
52
+ return `![${altSegment}][${fields.label}]`;
53
+ }
54
+ const titleSegment = fields.title !== undefined ? ` "${escapeTitle(fields.title)}"` : '';
55
+ return `![${altSegment}](${encodeDestination(fields.url)}${titleSegment})`;
56
+ }
57
+ // Alt text keeps the label's bytes as written: a bare bracket is escaped so it can't end the
58
+ // label, and an existing backslash pair passes through so repeated commits never double it.
59
+ function escapeAlt(alt) {
60
+ let out = '';
61
+ for (let i = 0; i < alt.length; i++) {
62
+ const ch = alt[i];
63
+ if (ch === '\\' && i + 1 < alt.length) {
64
+ out += ch + alt[i + 1];
65
+ i++;
66
+ continue;
67
+ }
68
+ out += ch === '[' || ch === ']' || ch === '\\' ? '\\' + ch : ch;
69
+ }
70
+ return out;
71
+ }