@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,32 +1,195 @@
1
1
  /**
2
- * The single DOM Range ↔ raw offset translation point (`docs/design/editor.md`). Atomic
3
- * inline widgets contribute their raw bytes via data-source-start / data-source-end
4
- * without contributing to textContent; the walk sums text-node lengths — a leading
5
- * ambient marker span's text included — plus widget raw lengths, so walk positions are
6
- * `DomTextOffset` and `ambient/ambient-cursor.ts` owns the ± ambientLength step to raw.
2
+ * The one place a DOM position is translated to a raw offset and back, and the one place a caret
3
+ * is written from a raw offset (`docs/design/editor.md`). The walk offset (`DomTextOffset`) sums
4
+ * text-node lengths, the leading marker prefix's text included, plus each atomic widget's source
5
+ * length. A raw offset is that minus the prefix length, which this module reads off the DOM.
7
6
  */
8
- import { asPresentationMode, hidesMarkers, paintsFocusedMarkers } from '../presentation-mode';
7
+ import { asPresentationMode, hidesMarkers, hidesDelimitersAtCaret } from '../presentation-mode';
9
8
  import { widgetSourceRange } from '../core/inline/inline-widgets';
10
- import { familyHidesText, familyPaintsAlone, markerFamilyOf, screenVisibility } from '../core/inline/visibility';
11
- import { asDomTextOffset, toClampedRawOffset } from './coordinate-spaces';
9
+ import { familyHidesText, familyPaintsAlone, isMarkerPrefixSpan, markerFamilyOf, screenVisibility } from '../core/inline/visibility';
10
+ import { asDomTextOffset, asRawOffset, toClampedRawOffset, toDomTextOffset } from './coordinate-spaces';
12
11
  import { domDescendants } from './dom-walk';
12
+ // ── Raw offsets and the caret ────────────────────────────────────────────────
13
+ /** Marks the span holding a block's bytes past its content: a setext underline, or an ATX
14
+ * heading's closing run. Its value is `after-prefix` when the block also drew a prefix span. */
15
+ export const BLOCK_SUFFIX_ATTR = 'data-block-suffix';
16
+ /** Marks the span holding a block's own marker before its content, a heading's `# `. */
17
+ export const BLOCK_PREFIX_ATTR = 'data-block-prefix';
18
+ /**
19
+ * The container's leading marker prefix span (`- `, `> `), or null. Empty text nodes before it
20
+ * are skipped, since Chromium leaves them behind and they hold no offset.
21
+ */
22
+ export function markerPrefixOf(container) {
23
+ let first = container.firstChild;
24
+ while (first?.nodeType === Node.TEXT_NODE && (first.textContent ?? '') === '') {
25
+ first = first.nextSibling;
26
+ }
27
+ return first instanceof HTMLElement && isMarkerPrefixSpan(first) ? first : null;
28
+ }
29
+ /** The marker prefix's walk length: what a raw offset adds to become a walk offset. */
30
+ export function markerPrefixLength(container) {
31
+ return markerPrefixOf(container)?.textContent?.length ?? 0;
32
+ }
33
+ /** The raw offset of a live `(node, offset)` DOM position in `el`; a position inside the marker
34
+ * prefix reads as raw 0. */
35
+ export function rawOffsetAt(el, node, offset) {
36
+ return rawOfWalkOffset(el, domTextOffsetAtNode(el, node, offset));
37
+ }
38
+ /** A raw offset in `container` as a walk offset. */
39
+ export function walkOffsetOfRaw(container, raw) {
40
+ return toDomTextOffset(asRawOffset(raw), markerPrefixLength(container));
41
+ }
42
+ /** A walk offset in `container` as a raw offset; one inside the marker prefix reads as raw 0. */
43
+ export function rawOfWalkOffset(container, walk) {
44
+ return toClampedRawOffset(walk, markerPrefixLength(container));
45
+ }
46
+ /** The raw bytes `el` shows, its marker prefix left out: what a prose block reads back as its text.
47
+ * `suffix` is the block's structural suffix as rendered; empty when only that is left. */
48
+ export function rawTextOfContent(el, raw, suffix) {
49
+ const prefix = markerPrefixOf(el);
50
+ let out = '';
51
+ let holdsMoreThanSuffix = false;
52
+ for (const child of Array.from(el.childNodes)) {
53
+ if (child === prefix)
54
+ continue;
55
+ const text = rawTextOfNode(child, raw);
56
+ if (child instanceof Element && child.hasAttribute(BLOCK_SUFFIX_ATTR)) {
57
+ // A key typed over the whole text lands at the start of the structure span.
58
+ const typed = text.endsWith(suffix) ? text.slice(0, text.length - suffix.length) : '';
59
+ out += typed;
60
+ if (typed)
61
+ holdsMoreThanSuffix = true;
62
+ if (suffixOutlivesEdit(el, child))
63
+ out += text.slice(typed.length);
64
+ continue;
65
+ }
66
+ out += text;
67
+ if (text)
68
+ holdsMoreThanSuffix = true;
69
+ }
70
+ // A heading's closing run or a setext underline belongs to the text above it, so a read
71
+ // holding nothing else is an emptied block.
72
+ return holdsMoreThanSuffix ? out : '';
73
+ }
74
+ // A heading's closing run goes with a hidden `#` marker the browser dropped, since the user saw
75
+ // neither; a shown run stays unless it was selected too.
76
+ function suffixOutlivesEdit(el, suffix) {
77
+ if (suffix.getAttribute(BLOCK_SUFFIX_ATTR) !== 'after-prefix')
78
+ return true;
79
+ const prefix = el.querySelector(`:scope > [${BLOCK_PREFIX_ATTR}]`);
80
+ return (prefix?.textContent ?? '') !== '' || !isHiddenMarkerRoot(suffix, el);
81
+ }
82
+ /** Raw offset of the live selection's focus inside `el`, or null when there is no selection or
83
+ * its focus sits outside `el`. */
84
+ export function rawSelectionFocus(el) {
85
+ const sel = window.getSelection();
86
+ if (!sel || sel.focusNode === null || !el.contains(sel.focusNode))
87
+ return null;
88
+ return rawOffsetAt(el, sel.focusNode, sel.focusOffset);
89
+ }
90
+ /** Put a collapsed caret at raw offset `raw` in `el`, the one caret writer. Raw 0 lands just after
91
+ * a marker prefix span, since Chromium bounces a caret placed before it. False when refused. */
92
+ export function placeCaretAtRaw(el, raw, { clamp }) {
93
+ const at = clamp === 'reachable' ? clampToLandableRaw(el, Math.max(0, raw)) : raw;
94
+ const point = caretPointAtRaw(el, at);
95
+ return writeSelection(point, point);
96
+ }
97
+ /**
98
+ * Select raw `[anchor, focus]` in `el`, backward when the focus comes first. An endpoint at raw 0
99
+ * behind a marker prefix lands after the span, as a caret does.
100
+ */
101
+ export function selectRawRange(el, anchor, focus) {
102
+ return writeSelection(caretPointAtRaw(el, anchor), caretPointAtRaw(el, focus));
103
+ }
104
+ /** Move the live selection's focus to raw `raw` in `el`, keeping its anchor. */
105
+ export function extendSelectionToRaw(el, raw) {
106
+ const sel = window.getSelection();
107
+ if (!sel || sel.rangeCount === 0 || sel.anchorNode === null)
108
+ return false;
109
+ return writeSelection({ node: sel.anchorNode, offset: sel.anchorOffset }, caretPointAtRaw(el, raw));
110
+ }
111
+ /** Select `el`'s content past its marker prefix and short of a hidden structural suffix (the first
112
+ * Ctrl+A, a triple click). With no content, the whole contents, marker included. */
113
+ export function selectSurfaceContent(el) {
114
+ const suffix = hiddenSuffixLength(el);
115
+ const contentLength = containerDomTextLength(el) - markerPrefixLength(el) - suffix;
116
+ if ((markerPrefixOf(el) || suffix > 0) && contentLength > 0) {
117
+ return selectRawRange(el, 0, contentLength);
118
+ }
119
+ const range = document.createRange();
120
+ range.selectNodeContents(el);
121
+ return writeSelection({ node: range.startContainer, offset: range.startOffset }, { node: range.endContainer, offset: range.endOffset });
122
+ }
123
+ /** A DOM Range over raw `[start, end)` for measuring or decorating; caret writes use {@link
124
+ * placeCaretAtRaw}. From raw 0 it starts after the marker prefix span, holding whole elements. */
125
+ export function rawRangeToDomRange(container, start, end) {
126
+ const range = createRangeAtDomTextOffsets(container, walkOffsetOfRaw(container, start), walkOffsetOfRaw(container, end));
127
+ const prefix = markerPrefixOf(container);
128
+ if (!range || !prefix || start > 0)
129
+ return range;
130
+ range.setStartAfter(prefix);
131
+ if (end <= 0)
132
+ range.collapse(true);
133
+ return range;
134
+ }
135
+ /** Where a caret at raw `raw` goes in the DOM: the end of an empty container's contents when the
136
+ * walk finds no position at all. */
137
+ function caretPointAtRaw(el, raw) {
138
+ const pos = findDomTextOffsetTarget(el, walkOffsetOfRaw(el, Math.max(0, raw)));
139
+ return pos ?? { node: el, offset: el.childNodes.length };
140
+ }
141
+ /**
142
+ * Raw 0 behind a marker prefix: the first text after the span, which has real rects where the
143
+ * spot after the span may not, unless that text is a hidden marker run, which paints nothing.
144
+ */
145
+ function positionAfterPrefix(container, prefix) {
146
+ const textAfter = firstTextNodeAfter(prefix);
147
+ const hidden = textAfter !== null &&
148
+ container instanceof HTMLElement &&
149
+ isHiddenMarkerText(textAfter, container);
150
+ if (textAfter && !hidden)
151
+ return { node: textAfter, offset: 0 };
152
+ const parent = prefix.parentNode;
153
+ return { node: parent, offset: Array.prototype.indexOf.call(parent.childNodes, prefix) + 1 };
154
+ }
155
+ function writeSelection(anchor, focus) {
156
+ const sel = window.getSelection();
157
+ if (!sel)
158
+ return false;
159
+ try {
160
+ sel.setBaseAndExtent(anchor.node, anchor.offset, focus.node, focus.offset);
161
+ }
162
+ catch {
163
+ return false;
164
+ }
165
+ return true;
166
+ }
167
+ /** The first non-empty text node after `node` in document order, stopping at an atomic widget,
168
+ * whose bytes lie between the two. */
169
+ function firstTextNodeAfter(node) {
170
+ for (let sibling = node.nextSibling; sibling; sibling = sibling.nextSibling) {
171
+ if (isAtomicInlineWidget(sibling))
172
+ return null;
173
+ for (const current of domDescendants(sibling)) {
174
+ if (current.nodeType === Node.TEXT_NODE && (current.textContent?.length ?? 0) > 0) {
175
+ return current;
176
+ }
177
+ }
178
+ }
179
+ return null;
180
+ }
13
181
  const WIDGET_ATTR = 'data-inline-widget';
14
- /** The stamp a block surface writes on its walk container while {@link holdsOnlyMarkerChrome}
15
- * holds. Both consumers of the hiding rule — this walk and `styles/editor.css` — read it.
16
- * Written in every mode on purpose: it is a content fact, so a flip never finds it stale. */
182
+ /** Written on the editable element while {@link holdsOnlyMarkerChrome} holds, and read by this walk
183
+ * and `styles/editor.css`. Written in every mode, so a mode switch never finds it stale. */
17
184
  export const CONTENT_EMPTY_ATTR = 'data-content-empty';
18
- /** The class the preview-inline reveal trigger stamps and this walk's hiding rule reads. One home,
19
- * so the stamping and classifying sides cannot drift. */
185
+ /** The class the preview-inline reveal trigger sets and this walk's hiding rule reads, defined
186
+ * once so the two sides cannot drift. */
20
187
  export const CONSTRUCT_REVEAL_CLASS = 'md-construct-reveal';
21
- /**
22
- * Walk-space offset of a live `(node, offset)` DOM position. A position inside an atomic
23
- * widget snaps to that widget's own walk boundary (browsers do rebind carets into these
24
- * contenteditable=false islands); an unreachable one reads as end-of-walk, so callers that
25
- * must distinguish "not mine" guard containment first.
26
- */
188
+ /** The DOM-walk offset of a live `(node, offset)` position. One inside an atomic widget snaps to its
189
+ * boundary; one outside the container reads as the walk's end, so check containment first. */
27
190
  export function domTextOffsetAtNode(container, node, offset) {
28
- // No landmark outside the container: document order against a disconnected tree is
29
- // implementation-specific, so such a position reads as end-of-walk instead.
191
+ // Document order against a node outside the container is browser-specific, so such a
192
+ // position reads as the end of the walk instead.
30
193
  const boundary = container.contains(node) ? positionBoundary(node, offset) : null;
31
194
  const mode = markerHidingMode(container);
32
195
  let total = 0;
@@ -37,15 +200,15 @@ export function domTextOffsetAtNode(container, node, offset) {
37
200
  }
38
201
  if (segNode === node) {
39
202
  const at = seg.start + offset;
40
- // A hidden run is opaque like a widget: its interior positions all paint at one
41
- // pixel, so the walk reports the boundary the position leans toward instead.
203
+ // A run of hidden marker text is opaque like a widget: every position inside it paints
204
+ // at one pixel, so the walk reports whichever boundary the position leans toward.
42
205
  if (seg.kind === 'text' && seg.hiddenRoot !== null) {
43
206
  return snapOutOfRun(container, at, offset === 0 ? 'before' : 'after', mode);
44
207
  }
45
208
  return asDomTextOffset(at);
46
209
  }
47
- // An element-level position resolves to a segment's start, which a coalesced run makes
48
- // as interior as a text position — it leans backward, so it snaps that way.
210
+ // An element-level position resolves to a segment's start, which can sit inside a merged
211
+ // hidden run just like a text position; it leans backward, so it snaps that way.
49
212
  if (boundary && startsAtOrAfter(segNode, boundary)) {
50
213
  return snapOutOfRun(container, seg.start, 'before', mode);
51
214
  }
@@ -53,54 +216,55 @@ export function domTextOffsetAtNode(container, node, offset) {
53
216
  }
54
217
  return asDomTextOffset(total);
55
218
  }
56
- /** Raw offset of the live selection's focus inside `el` through the walk above, or null when
57
- * there is no selection or its focus is anchored outside `el`. */
58
- export function selectionFocusWalkOffset(el, ambientLength) {
59
- const sel = window.getSelection();
60
- if (!sel || sel.focusNode === null || !el.contains(sel.focusNode))
61
- return null;
62
- return toClampedRawOffset(domTextOffsetAtNode(el, sel.focusNode, sel.focusOffset), ambientLength);
219
+ /** A DOM-walk offset back to a live `(node, offset)` position, the DOM side of `findNodeAtOffset`
220
+ * in `core/inline-render.ts`. Works on a detached fragment the same way. */
221
+ export function findDomTextOffsetTarget(container, target) {
222
+ return findDomTextLanding(container, target)?.position ?? null;
63
223
  }
64
224
  /**
65
- * Walk-space offset → live `(node, offset)` DOM position. The model-layer counterpart is
66
- * `findNodeAtOffset` in `core/inline-render.ts`. Accepts a detached fragment (island
67
- * application walks builds in progress) with the same arithmetic as a live block element.
225
+ * {@link findDomTextOffsetTarget}, also saying whether the position sits in visible text at
226
+ * `target` itself, whose walk offset is then `target` with no second walk to read it back.
68
227
  */
69
- export function findDomTextOffsetTarget(container, target) {
228
+ export function findDomTextLanding(container, target) {
229
+ // The marker prefix is read-only and Chromium bounces a caret out in front of it, so every
230
+ // target up to its far edge resolves past it, where raw 0 sits.
231
+ const prefix = markerPrefixOf(container);
232
+ const prefixLength = prefix?.textContent?.length ?? 0;
233
+ if (prefix && target <= prefixLength) {
234
+ return { position: positionAfterPrefix(container, prefix), inTextAtTarget: false };
235
+ }
70
236
  let last = null;
71
237
  for (const seg of landingSegments(container, markerHidingMode(container))) {
72
238
  if (seg.kind === 'text') {
73
- if (seg.start + seg.len >= target)
74
- return { node: seg.node, offset: target - seg.start };
239
+ if (seg.start + seg.len >= target) {
240
+ return { position: { node: seg.node, offset: target - seg.start }, inTextAtTarget: true };
241
+ }
75
242
  last = { node: seg.node, offset: seg.len };
76
243
  continue;
77
244
  }
78
- // An opaque span holds no landable position, so a target at either boundary resolves
79
- // beside it. The walk offset is preserved: only the DOM spelling of it changes.
245
+ // The caret cannot sit inside an opaque span, so a target at either boundary resolves to
246
+ // the position beside it; the walk offset is unchanged, only its DOM spelling differs.
80
247
  if (seg.start === target) {
81
248
  const before = positionBeside(seg.first, 'before');
82
249
  if (before)
83
- return before;
250
+ return { position: before, inTextAtTarget: false };
84
251
  }
85
252
  const after = positionBeside(seg.last, 'after');
86
253
  if (!after)
87
254
  continue;
88
- // Chromium canonicalizes the slot after a HIDDEN run upstream across it, so a byte typed
89
- // there lands before the run; text starting at the target is the position that keeps it.
255
+ // Chromium moves a caret placed after a hidden run to before it, so a byte typed there
256
+ // would land before the run; the text node starting at the target is the position that keeps it.
90
257
  if (seg.start + seg.len > target || (seg.start + seg.len === target && !seg.hidden)) {
91
- return after;
258
+ return { position: after, inTextAtTarget: false };
92
259
  }
93
260
  last = after;
94
261
  }
95
- return last;
262
+ if (prefix && last && prefix.contains(last.node))
263
+ last = positionAfterPrefix(container, prefix);
264
+ return last && { position: last, inTextAtTarget: false };
96
265
  }
97
- /**
98
- * Atomic inline widgets in `container` intersecting the walk-space range [start, end). A
99
- * widget adds 0 chars to textContent, so a range inside one yields no client rect and
100
- * callers that must cover it (search highlight, cross-block selection) take its bounding
101
- * box. A widget's position is its running walk offset, never a compare of `data-source-*`
102
- * against the ambient-adjusted argument.
103
- */
266
+ /** The atomic inline widgets intersecting the DOM-walk range [start, end): a widget adds no text,
267
+ * so a caller covering it takes its bounding box. Positions are walk offsets, never `data-source-*`. */
104
268
  export function widgetsIntersectingRange(container, start, end) {
105
269
  const out = [];
106
270
  for (const seg of walkSegments(container, null)) {
@@ -111,18 +275,34 @@ export function widgetsIntersectingRange(container, start, end) {
111
275
  }
112
276
  return out;
113
277
  }
114
- /** Total walk length of `container` — its one-past-end walk position. */
278
+ /** The walk's text with marker text and widget bytes blanked to spaces, at the walk's own
279
+ * offsets: what a rule that reads words (double- and triple-click) sees as content. */
280
+ export function maskedWalkText(container) {
281
+ let out = '';
282
+ for (const seg of walkSegments(container, null)) {
283
+ const content = seg.kind === 'text' && markerRootOf(seg.node, container) === null;
284
+ out += content ? (seg.node.textContent ?? '') : ' '.repeat(seg.len);
285
+ }
286
+ return out;
287
+ }
288
+ /** Whether any visible text in `container` ends past `from`: a caret there has a box of its own,
289
+ * which a block of widgets alone never offers. */
290
+ export function holdsTextPast(container, from) {
291
+ for (const seg of landingSegments(container, markerHidingMode(container))) {
292
+ if (seg.kind === 'text' && seg.len > 0 && seg.start + seg.len > from)
293
+ return true;
294
+ }
295
+ return false;
296
+ }
297
+ /** Total walk length of `container`: its one-past-end walk position. */
115
298
  export function containerDomTextLength(container) {
116
299
  let count = 0;
117
300
  for (const seg of walkSegments(container, null))
118
301
  count += seg.len;
119
302
  return asDomTextOffset(count);
120
303
  }
121
- /**
122
- * Walk-space span of the atomic widget strictly containing `offset`, or null when the
123
- * offset sits in text or exactly on a boundary. Island application snaps replace
124
- * boundaries outward with this — a text-position range cannot split an atomic widget.
125
- */
304
+ /** The DOM-walk span of the atomic widget strictly containing `offset`, or null in text or on a
305
+ * boundary. A replace decoration snaps outward with it, since a range cannot split a widget. */
126
306
  export function widgetSpanContainingOffset(container, offset) {
127
307
  for (const seg of walkSegments(container, null)) {
128
308
  if (seg.start > offset)
@@ -196,12 +376,15 @@ export function createRangeAtDomTextOffsets(container, start, end) {
196
376
  return range;
197
377
  }
198
378
  // ── Hidden marker runs ───────────────────────────────────────────────────────
199
- /**
200
- * Whether `node` is text the mode CSS paints nothing for — a marker span's own text under a
201
- * marker-hiding mode with no reveal on it. Detected structurally against the families in
202
- * `core/inline/visibility.ts`, never by layout: a `getComputedStyle` per keystroke is not
203
- * affordable, so that vocabulary and `styles/editor.css` move together.
204
- */
379
+ /** The text length of a block's trailing structure span (`BLOCK_SUFFIX_ATTR`) where the mode
380
+ * hides it, else 0: bytes a range the user drew cannot have meant to take. */
381
+ export function hiddenSuffixLength(el) {
382
+ // Not always the last child: a pending hard break's anchors follow a closing run.
383
+ const text = el.querySelector(`:scope > [${BLOCK_SUFFIX_ATTR}]`)?.firstChild ?? null;
384
+ return text && isHiddenMarkerText(text, el) ? (text.textContent?.length ?? 0) : 0;
385
+ }
386
+ /** Whether `node` is marker text the mode's CSS paints nothing for, decided from the families in
387
+ * `core/inline/visibility.ts`, not layout; that file and `styles/editor.css` change together. */
205
388
  export function isHiddenMarkerText(node, container) {
206
389
  if (node.nodeType !== Node.TEXT_NODE || !container.contains(node))
207
390
  return false;
@@ -215,54 +398,35 @@ export function isHiddenMarkerText(node, container) {
215
398
  }
216
399
  return false;
217
400
  }
218
- /**
219
- * Whether `el`'s OWN text is marker text the container's mode paints nothing for — the
220
- * element-level form of {@link isHiddenMarkerText}, for a walk that treats such a span as
221
- * opaque instead of descending into it.
222
- */
401
+ /** The element form of {@link isHiddenMarkerText}, for a walk that treats such a span as opaque
402
+ * instead of descending into it. */
223
403
  export function isHiddenMarkerRoot(el, container) {
224
404
  if (el === container || !container.contains(el))
225
405
  return false;
226
406
  const mode = markerHidingMode(container);
227
407
  return mode !== null && hidesOwnText(el, mode, chromeStandsAloneUnder(container, mode));
228
408
  }
229
- /**
230
- * The DOM-reading twin of `paintsFocusedMarkers`: whether this container's mode paints NO marker
231
- * in the focused block — neither its own structural prefix (`## `, a fence, a setext underline)
232
- * nor an inline construct's delimiters. An unstamped container is styled source, which paints.
233
- */
409
+ /** `hidesDelimitersAtCaret` read from the DOM: whether this container's mode paints no marker in
410
+ * the focused block. No mode attribute means styled source, which paints. */
234
411
  export function revealsNoMarkers(container) {
235
412
  const mode = markerHidingMode(container);
236
- return mode !== null && !paintsFocusedMarkers(mode);
413
+ return mode !== null && hidesDelimitersAtCaret(mode);
237
414
  }
238
- /**
239
- * How this container's bytes read on screen: its mode and its content-empty stamp, resolved here
240
- * so a rewrite seam needs no marker vocabulary of its own. Chrome standing over no content PAINTS
241
- * (live-mode.md § 4.1), and a seam holding a license over unseen bytes has nothing to claim there.
242
- * An unmounted surface reads as source, where nothing hides and no rewrite has a run to move.
243
- */
415
+ /** How this container's bytes read on screen, its mode plus its content-empty attribute, so a text
416
+ * rewrite needs no marker knowledge of its own. An unmounted block reads as source. */
244
417
  export function screenVisibilityOf(container) {
245
418
  return screenVisibility(container === null ? 'source' : (markerHidingMode(container) ?? 'source'), { chromePaints: container instanceof Element && chromeStampPaints(container) });
246
419
  }
247
- /**
248
- * The stamp's own condition, as `styles/editor.css` states it: the container carries
249
- * `data-content-empty` AND holds focus. The seat is for a caret, so a stamped block nobody is in
250
- * keeps its chrome hidden and reads as the empty construct it is. Focus containment rather than
251
- * `:focus-within`, so a selector engine without that pseudo-class (jsdom's) reads the same answer.
252
- */
420
+ /** The stylesheet's condition for painting an empty construct's markers: `data-content-empty`
421
+ * plus focus inside, read by containment because jsdom lacks `:focus-within`. */
253
422
  function chromeStampPaints(container) {
254
423
  if (!container.hasAttribute(CONTENT_EMPTY_ATTR))
255
424
  return false;
256
425
  const active = container.ownerDocument.activeElement;
257
426
  return active !== null && container.contains(active);
258
427
  }
259
- /**
260
- * The extreme walk offsets a caret can occupy in `container`: a hidden marker run or the leading
261
- * ambient island holds no landable position, so the bound moves past it. Block-edge gates read
262
- * these rather than 0 / walk length, which a mode painting no marker makes unreachable — a gate
263
- * testing an offset no keystroke can produce is a dead key. An ALL-hidden container (an empty
264
- * fence) has no landable offset and answers `{len, len}`, making every `offset <= start` gate true.
265
- */
428
+ /** The first and last walk offsets a caret can sit at, past hidden marker runs and the marker
429
+ * prefix; the checks at a block's edge read these. All-hidden text answers `{len, len}`. */
266
430
  export function landableDomTextBounds(container) {
267
431
  let start = 0;
268
432
  let end = 0;
@@ -272,9 +436,16 @@ export function landableDomTextBounds(container) {
272
436
  if (seg.len === 0)
273
437
  continue;
274
438
  const stop = seg.start + seg.len;
275
- // An atomic widget and a decoration island are opaque, not unreachable: the caret may not
276
- // enter either, but both of their boundaries are positions of their own.
277
- if (seg.kind === 'opaque' ? seg.hidden : inAmbientIsland(seg.node, container)) {
439
+ // An atomic widget and a decoration widget are opaque, not unreachable: the caret may not
440
+ // enter either, but each of their boundaries is a position of its own.
441
+ if (seg.kind === 'opaque' && seg.hidden && seg.first.hasAttribute(BLOCK_SUFFIX_ATTR)) {
442
+ // Nothing past a block's trailing structure is text, and an emptied block's caret
443
+ // sits before that structure.
444
+ if (!landed)
445
+ end = start;
446
+ break;
447
+ }
448
+ if (seg.kind === 'opaque' ? seg.hidden : inMarkerPrefix(seg.node, container)) {
278
449
  if (!landed)
279
450
  start = stop;
280
451
  continue;
@@ -283,14 +454,20 @@ export function landableDomTextBounds(container) {
283
454
  end = stop;
284
455
  lastText = seg.kind === 'text' ? seg.node : null;
285
456
  }
286
- // The position after the last landable run's final `\n` is the start of a line nothing
287
- // paints: the engine seats no caret there, so an end gate reading it never fires and the
288
- // caret is stuck on the empty line. A caret anchor gives that line its paint and keeps it.
457
+ // The browser puts no caret after the last text's final `\n`, so an end check reading that
458
+ // position would never fire; a caret anchor paints the line and keeps the position.
289
459
  if (lastText?.textContent?.endsWith('\n') && !followedByCaretAnchor(lastText, container)) {
290
460
  end -= 1;
291
461
  }
292
462
  return { start: asDomTextOffset(start), end: asDomTextOffset(Math.max(start, end)) };
293
463
  }
464
+ /** A `<br>` that gives the caret a line nothing else paints, adding no text. `role` tells the walks
465
+ * a hidden fence closer line (`closer`) from a pending hard break's line (`break`). */
466
+ export function createCaretAnchor(role = '') {
467
+ const anchor = document.createElement('br');
468
+ anchor.dataset.caretAnchor = role;
469
+ return anchor;
470
+ }
294
471
  /** Whether the next painted node after `text`, at any depth above it, is a caret anchor. */
295
472
  function followedByCaretAnchor(text, root) {
296
473
  for (let node = text; node && node !== root; node = node.parentNode) {
@@ -303,19 +480,8 @@ function followedByCaretAnchor(text, root) {
303
480
  }
304
481
  return false;
305
482
  }
306
- /**
307
- * Whether every byte `container` holds is marker chrome, at least one span of it a family the
308
- * empty-construct override paints. The stamp condition the render path writes as
309
- * `data-content-empty` and the walk reads back — computed WITHOUT reading the stamp, or each
310
- * render would flip the previous one's answer. Membership and paintability are separate
311
- * questions: a reference label is chrome that stays hidden, so it is not content standing behind
312
- * the stamp, and it is not the paint the stamp promises either.
313
- */
314
- /**
315
- * The container's bytes outside its marker chrome — what a painted source holds as CONTENT,
316
- * whatever the mode paints. A fence with an empty body answers whitespace; the leaf reads that
317
- * as "nothing here a Backspace could mean but the block".
318
- */
483
+ /** The container's bytes outside its markers, whatever the mode paints. An empty fence body answers
484
+ * whitespace: nothing for Backspace to delete but the block itself. */
319
485
  export function chromeFreeText(container) {
320
486
  let text = '';
321
487
  for (const seg of walkSegments(container, null)) {
@@ -327,6 +493,8 @@ export function chromeFreeText(container) {
327
493
  }
328
494
  return text;
329
495
  }
496
+ /** Whether every byte is marker text, with a span the empty-construct override paints: the
497
+ * `data-content-empty` condition, computed without reading the attribute it sets. */
330
498
  export function holdsOnlyMarkerChrome(container) {
331
499
  let chrome = false;
332
500
  for (const seg of walkSegments(container, null)) {
@@ -339,19 +507,15 @@ export function holdsOnlyMarkerChrome(container) {
339
507
  chrome ||= familyPaintsAlone(marker.family);
340
508
  continue;
341
509
  }
342
- // The ambient island keeps its box in every mode, so it neither hides the block nor
343
- // stands in for content: a `- ` with an empty child is landable and needs no stamp.
344
- if (!inAmbientIsland(seg.node, container))
510
+ // The container's marker prefix keeps its box in every mode, so it neither hides the block
511
+ // nor counts as content: a `- ` with an empty child holds a caret and needs no attribute.
512
+ if (!inMarkerPrefix(seg.node, container))
345
513
  return false;
346
514
  }
347
515
  return chrome;
348
516
  }
349
- /**
350
- * Whether the mode paints NOTHING landable here: every walk segment is a hidden marker run, so no
351
- * caret position has a pixel of its own. `invariants/landable-caret.ts` refuses this shape at the
352
- * focus seam — an empty container (landable at offset 0) and one fronted by the ambient island are
353
- * not it.
354
- */
517
+ /** Whether every walk segment is a hidden marker run, so no caret position has a pixel of its own;
518
+ * `invariants/landable-caret.ts` refuses this shape when focus lands. */
355
519
  export function paintsNoLandableContent(container) {
356
520
  let hidden = false;
357
521
  for (const seg of landingSegments(container, markerHidingMode(container))) {
@@ -363,33 +527,27 @@ export function paintsNoLandableContent(container) {
363
527
  }
364
528
  return hidden;
365
529
  }
366
- /**
367
- * {@link landableDomTextBounds} in the caret's own raw space, or null where the mode paints its
368
- * markers and the whole raw span is reachable. The one home every caret gate and caret DOOR
369
- * reads: the arrow exits, the cross-block collapse, and the block-entry seat all ask the same
370
- * question and must not answer it three ways.
371
- */
372
- export function landableRawBounds(el, ambientLength) {
530
+ /** {@link landableDomTextBounds} in raw offsets, or null where the markers paint and all of raw is
531
+ * reachable. Every caret check and placement reads this one answer. */
532
+ export function landableRawBounds(el) {
373
533
  if (!revealsNoMarkers(el))
374
534
  return null;
375
535
  const bounds = landableDomTextBounds(el);
536
+ const prefixLength = markerPrefixLength(el);
376
537
  return {
377
- start: toClampedRawOffset(bounds.start, ambientLength),
378
- end: toClampedRawOffset(bounds.end, ambientLength)
538
+ start: toClampedRawOffset(bounds.start, prefixLength),
539
+ end: toClampedRawOffset(bounds.end, prefixLength)
379
540
  };
380
541
  }
381
- /** Clamp a caret offset into `el`'s landable range — identity wherever the markers paint. */
382
- export function clampToLandableRaw(el, offset, ambientLength) {
383
- const bounds = landableRawBounds(el, ambientLength);
542
+ /** Clamp a caret offset into the range the caret can sit in; a no-op wherever the markers paint. */
543
+ export function clampToLandableRaw(el, offset) {
544
+ const bounds = landableRawBounds(el);
384
545
  if (!bounds)
385
546
  return offset;
386
547
  return Math.min(Math.max(offset, bounds.start), bounds.end);
387
548
  }
388
- /**
389
- * Whether the first landable position abuts an opaque island (an atomic widget, a decoration
390
- * island) instead of sitting in text: no text node holds it, so the engine's Home seats the
391
- * caret past the island and the block's start needs an owned door.
392
- */
549
+ /** Whether the first caret position abuts an opaque widget rather than sitting in text: no text
550
+ * node holds it, so the browser's Home skips the widget and the editor places the caret itself. */
393
551
  export function landableStartAbutsIsland(container) {
394
552
  for (const seg of landingSegments(container, markerHidingMode(container))) {
395
553
  if (seg.len === 0)
@@ -399,29 +557,29 @@ export function landableStartAbutsIsland(container) {
399
557
  continue;
400
558
  return true;
401
559
  }
402
- if (inAmbientIsland(seg.node, container))
560
+ if (inMarkerPrefix(seg.node, container))
403
561
  continue;
404
562
  return false;
405
563
  }
406
564
  return false;
407
565
  }
408
- /** Whether `node` is an atomic inline widget's element — the island every walk treats as opaque.
409
- * The attribute rather than the selector: every walk asks this per node. */
566
+ /** Whether `node` is an atomic inline widget's element, which every walk treats as opaque. Checks
567
+ * the attribute rather than a selector because every walk asks this per node. */
410
568
  export function isAtomicInlineWidget(node) {
411
569
  return node.nodeType === Node.ELEMENT_NODE && node.hasAttribute(WIDGET_ATTR);
412
570
  }
413
571
  // ── Internal ─────────────────────────────────────────────────────────────────
414
572
  const FOCUSED_HOST_SELECTOR = '.block-host[data-focused]';
415
- /** The editor root's effective mode when it hides markers; null in source mode, which
416
- * stamps no attribute, and for a detached build with no root to read. */
573
+ /** The editor root's mode when it hides markers; null in source mode, which sets no attribute,
574
+ * and for a detached build with no root to read. */
417
575
  function markerHidingMode(container) {
418
576
  if (!(container instanceof Element))
419
577
  return null;
420
578
  const mode = asPresentationMode(container.closest('[data-presentation]')?.getAttribute('data-presentation'));
421
579
  return hidesMarkers(mode) ? mode : null;
422
580
  }
423
- /** Nearest ancestor between `node` and `root` whose own text is marker chrome, with the family
424
- * that decides what the stamped-container override does with it. */
581
+ /** The nearest ancestor between `node` and `root` whose own text is a marker, with the family
582
+ * that decides what the empty-container override does with it. */
425
583
  function markerRootOf(node, root) {
426
584
  for (let el = node.parentElement; el && el !== root; el = el.parentElement) {
427
585
  const family = markerFamilyOf(el);
@@ -430,29 +588,27 @@ function markerRootOf(node, root) {
430
588
  }
431
589
  return null;
432
590
  }
433
- /** Whether `root` carries the content-empty stamp under a mode that paints it. */
591
+ /** Whether `root` carries the content-empty attribute under a mode that paints its markers. */
434
592
  function chromeStandsAloneUnder(root, mode) {
435
593
  if (mode === null || !(root instanceof Element))
436
594
  return false;
437
595
  return screenVisibility(mode, { chromePaints: chromeStampPaints(root) }).chromePaints;
438
596
  }
439
597
  /**
440
- * Whether `node` is inside the leading ambient marker island — a container's `- ` / `1. ` prefix,
441
- * the one inert island whose far side IS raw 0. Every other opaque island (a widget, a
442
- * decoration) has a real raw offset on each side, so only this one joins the unreachable prefix.
598
+ * Whether `node` is inside the container's marker prefix, the one inert span whose far side is raw
599
+ * offset 0. Every other opaque span (a widget, a decoration) has a real raw offset on each side.
443
600
  */
444
- function inAmbientIsland(node, root) {
601
+ function inMarkerPrefix(node, root) {
445
602
  for (let el = node.parentElement; el && el !== root; el = el.parentElement) {
446
- if (el.classList.contains('md-marker') && el.getAttribute('contenteditable') === 'false') {
603
+ if (isMarkerPrefixSpan(el))
447
604
  return true;
448
- }
449
605
  }
450
606
  return false;
451
607
  }
452
608
  function hidesOwnText(el, mode, chromePaints) {
453
609
  const family = markerFamilyOf(el);
454
- // The shared rule first (the stylesheet's `[data-content-empty]` override among it); the
455
- // reveal arms below are per-span DOM state, which only this side of the model can see.
610
+ // The shared rule first (the stylesheet's `[data-content-empty]` override included); the
611
+ // reveal branches below depend on per-span DOM state that only this side can see.
456
612
  if (family === null || !familyHidesText(family, screenVisibility(mode, { chromePaints })))
457
613
  return false;
458
614
  if (mode !== 'preview-block' && mode !== 'preview-inline')
@@ -461,8 +617,8 @@ function hidesOwnText(el, mode, chromePaints) {
461
617
  return true;
462
618
  if (mode === 'preview-block')
463
619
  return false;
464
- // preview-inline's unstamped-reveal arm is scoped to `.md-marker`, so a ref label reveals
465
- // by class alone; fence lines are whole-block markers and reveal with block focus.
620
+ // preview-inline's reveal rule is scoped to `.md-marker`, so a reference label reveals by
621
+ // class alone; fence lines are whole-block markers and reveal with block focus.
466
622
  if (el.classList.contains('md-fence-line'))
467
623
  return false;
468
624
  if (el.classList.contains('md-ref-label'))
@@ -481,8 +637,8 @@ function snapOutOfRun(container, offset, side, mode) {
481
637
  }
482
638
  return asDomTextOffset(offset);
483
639
  }
484
- /** The landable DOM position beside a span the caret may not enter. Prefers an adjacent
485
- * text node — Chromium drops beforeinput at element-level offsets between two islands. */
640
+ /** The DOM position beside a span the caret may not enter. Prefers an adjacent text node, since
641
+ * Chromium drops beforeinput at element-level offsets between two widgets. */
486
642
  function positionBeside(el, side) {
487
643
  const parent = el.parentNode;
488
644
  if (!parent)
@@ -492,28 +648,38 @@ function positionBeside(el, side) {
492
648
  return { node: sibling, offset: side === 'before' ? (sibling.textContent?.length ?? 0) : 0 };
493
649
  }
494
650
  const idx = Array.prototype.indexOf.call(parent.childNodes, el);
495
- // A pending hard break's first anchor (`inline-render.ts`) ends the line the marker sat on;
496
- // the seat past the marker is the start of the next one, which is after that anchor.
651
+ // A pending hard break's first anchor ends the marker's line, so the position past the marker is
652
+ // the next line's start, after that anchor.
497
653
  if (side === 'after' && isBreakAnchor(sibling))
498
654
  return { node: parent, offset: idx + 2 };
655
+ if (side === 'before' && isBreakAnchor(sibling) && isBreakAnchor(sibling.previousSibling)) {
656
+ return { node: parent, offset: idx - 1 };
657
+ }
499
658
  return { node: parent, offset: side === 'before' ? idx : idx + 1 };
500
659
  }
660
+ /** Whether two neighbouring hidden runs are a block's marker span and its trailing structure. */
661
+ function prefixMeetsSuffix(from, to) {
662
+ return from.hasAttribute(BLOCK_PREFIX_ATTR) && to.hasAttribute(BLOCK_SUFFIX_ATTR);
663
+ }
664
+ /** Whether a pending hard break's anchor stands between two sibling spans. */
665
+ function breakAnchorBetween(from, to) {
666
+ for (let node = from.nextSibling; node && node !== to; node = node.nextSibling) {
667
+ if (isBreakAnchor(node))
668
+ return true;
669
+ }
670
+ return false;
671
+ }
501
672
  function isBreakAnchor(node) {
502
673
  return (node instanceof HTMLElement && node.tagName === 'BR' && node.dataset.caretAnchor === 'break');
503
674
  }
504
- /**
505
- * The classification every walk-space consumer shares: a text node contributes its textContent
506
- * length, an atomic widget its raw source length (never descended), any other element is
507
- * transparent. Hidden marker text counts exactly like visible text — hiding is CSS-only so the
508
- * coordinate space survives it — and carries the span that hides it. Offsets stay plain numbers;
509
- * consumers mint the `DomTextOffset` brand.
510
- */
675
+ /** The segments every walk reader shares: text counts its length, an atomic widget its raw source
676
+ * length, any other element nothing. Hidden marker text counts too, with the span that hides it. */
511
677
  function* walkSegments(root, mode) {
512
678
  let count = 0;
513
679
  // One read per walk, not one `closest` per element: every caller passes the walk container.
514
680
  const chromePaints = chromeStandsAloneUnder(root, mode);
515
681
  const stack = [];
516
- // Reversed push, so pop order is source order — which `count` advances along.
682
+ // Pushed in reverse so pop order is source order, which `count` advances along.
517
683
  const pushChildren = (parent, hiddenRoot) => {
518
684
  const children = parent.childNodes;
519
685
  for (let i = children.length - 1; i >= 0; i--)
@@ -540,23 +706,32 @@ function* walkSegments(root, mode) {
540
706
  pushChildren(el, hiddenRoot ?? (mode !== null && hidesOwnText(el, mode, chromePaints) ? el : null));
541
707
  }
542
708
  }
543
- /** An opaque span at birth: one element, so it is its own first and last until a run extends it. */
709
+ /** A new opaque span is one element, its own first and last, until a run extends it. */
544
710
  function opaqueSegment(el, start, len, hidden) {
545
711
  return { kind: 'opaque', hidden, first: el, last: el, start, len };
546
712
  }
547
- /**
548
- * The same walk as the caret sees it: landable text, and opaque spans it may not enter —
549
- * atomic widgets, plus MAXIMAL runs of hidden marker text, coalesced because snapping out of
550
- * one hidden span into the next would still leave the caret in unpainted text.
551
- */
713
+ /** The walk as the caret sees it: text it can sit in, and opaque spans it may not enter. Adjacent
714
+ * hidden spans merge, since snapping from one into the next still leaves the caret unpainted. */
552
715
  function* landingSegments(root, mode) {
553
716
  let run = null;
554
717
  for (const seg of walkSegments(root, mode)) {
555
- // A zero-contribution node cannot end a run: Chromium leaves empty text nodes between
556
- // spans, and splitting the run there would mint a landable seam nothing paints.
718
+ // A node contributing nothing cannot end a run: Chromium leaves empty text nodes between
719
+ // spans, and splitting the run there would create a caret position nothing paints.
557
720
  if (run && seg.len === 0)
558
721
  continue;
559
722
  if (seg.kind === 'text' && seg.hiddenRoot !== null) {
723
+ // A pending hard break's anchors start a line between two hidden runs (the break's
724
+ // backslash, a setext underline), and the caret sits at that line's start.
725
+ if (run && breakAnchorBetween(run.last, seg.hiddenRoot)) {
726
+ yield run;
727
+ run = null;
728
+ }
729
+ // An emptied heading's text sits between its marker and its closing run, where the
730
+ // caret goes, so the two hidden runs stay apart.
731
+ if (run && prefixMeetsSuffix(run.last, seg.hiddenRoot)) {
732
+ yield run;
733
+ run = null;
734
+ }
560
735
  if (run) {
561
736
  run.len += seg.len;
562
737
  run.last = seg.hiddenRoot;