@voithos-labs/aragonite 0.10.4 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +2 -2
  2. package/dist/a11y-strings.d.ts +11 -5
  3. package/dist/a11y-strings.js +60 -5
  4. package/dist/action-contracts.d.ts +242 -155
  5. package/dist/action-contracts.js +2 -2
  6. package/dist/active-editor.d.ts +3 -3
  7. package/dist/active-editor.js +8 -9
  8. package/dist/ambient/ambient-dom.d.ts +2 -5
  9. package/dist/ambient/ambient-dom.js +16 -62
  10. package/dist/assert.js +6 -5
  11. package/dist/block-component.d.ts +135 -109
  12. package/dist/block-component.js +30 -22
  13. package/dist/block-id.d.ts +6 -10
  14. package/dist/block-id.js +25 -14
  15. package/dist/bounded-memo.d.ts +5 -5
  16. package/dist/bounded-memo.js +6 -6
  17. package/dist/components/BlockDragHandle.svelte +12 -21
  18. package/dist/components/BlockHost.svelte +56 -134
  19. package/dist/components/BlockList.svelte +22 -19
  20. package/dist/components/DecorationOverlay.svelte +9 -10
  21. package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
  22. package/dist/components/Editor.svelte +603 -1126
  23. package/dist/components/Editor.svelte.d.ts +9 -20
  24. package/dist/components/GapCaret.svelte +26 -59
  25. package/dist/components/SelectionOverlay.svelte +26 -51
  26. package/dist/components/SelectionOverlay.svelte.d.ts +5 -3
  27. package/dist/components/TailInsert.svelte +8 -55
  28. package/dist/components/TailInsert.svelte.d.ts +4 -6
  29. package/dist/components/block-content-selector.d.ts +11 -11
  30. package/dist/components/block-content-selector.js +11 -11
  31. package/dist/components/block-el-lookup.d.ts +6 -0
  32. package/dist/components/block-el-lookup.js +27 -0
  33. package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
  34. package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
  35. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
  36. package/dist/components/blocks/code/CodeBlock.svelte +255 -276
  37. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
  38. package/dist/components/blocks/code/CodeBlockRail.svelte +72 -87
  39. package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
  40. package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
  41. package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
  42. package/dist/components/blocks/code/code-bootstrap.js +29 -34
  43. package/dist/components/blocks/code/code-context-actions.js +5 -4
  44. package/dist/components/blocks/code/code-enter.js +2 -2
  45. package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
  46. package/dist/components/blocks/code/code-fence-boundary.js +40 -66
  47. package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
  48. package/dist/components/blocks/code/code-fence-exit.js +24 -25
  49. package/dist/components/blocks/code/code-indent.d.ts +2 -2
  50. package/dist/components/blocks/code/code-indent.js +4 -7
  51. package/dist/components/blocks/code/code-languages.d.ts +16 -12
  52. package/dist/components/blocks/code/code-languages.js +57 -39
  53. package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
  54. package/dist/components/blocks/code/code-paste-surface.js +9 -18
  55. package/dist/components/blocks/code/code-renderer.d.ts +21 -5
  56. package/dist/components/blocks/code/code-renderer.js +90 -125
  57. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
  58. package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
  59. package/dist/components/blocks/directive/activate-directives.js +18 -13
  60. package/dist/components/blocks/editable-leaf.d.ts +50 -74
  61. package/dist/components/blocks/editable-leaf.js +141 -203
  62. package/dist/components/blocks/editable-surface.d.ts +96 -100
  63. package/dist/components/blocks/editable-surface.js +101 -109
  64. package/dist/components/blocks/list/ListBlock.svelte +45 -90
  65. package/dist/components/blocks/list/ListItemBlock.svelte +93 -147
  66. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +1 -0
  67. package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
  68. package/dist/components/blocks/list/task-checkbox.js +12 -7
  69. package/dist/components/blocks/plain-text-backend.d.ts +4 -20
  70. package/dist/components/blocks/plain-text-backend.js +9 -43
  71. package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
  72. package/dist/components/blocks/surface-wiring.svelte.js +15 -34
  73. package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
  74. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
  75. package/dist/components/blocks/table/TableBlock.svelte +100 -165
  76. package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
  77. package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
  78. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
  79. package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
  80. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
  81. package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
  82. package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
  83. package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
  84. package/dist/components/blocks/table/cell-pointer.js +49 -71
  85. package/dist/components/blocks/table/cell-render.d.ts +24 -29
  86. package/dist/components/blocks/table/cell-render.js +29 -31
  87. package/dist/components/blocks/table/selected-cells.d.ts +7 -7
  88. package/dist/components/blocks/table/selected-cells.js +9 -13
  89. package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
  90. package/dist/components/blocks/table/table-caret-at-point.js +5 -5
  91. package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
  92. package/dist/components/blocks/table/table-cell-paste.js +27 -43
  93. package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
  94. package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
  95. package/dist/components/blocks/table/table-menu-model.js +6 -10
  96. package/dist/components/blocks/table/table-navigation.js +2 -2
  97. package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
  98. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
  99. package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
  100. package/dist/components/blocks/text/auto-pair-record.js +51 -0
  101. package/dist/components/blocks/text/click-snap-guard.d.ts +8 -6
  102. package/dist/components/blocks/text/click-snap-guard.js +10 -7
  103. package/dist/components/blocks/text/composition-seat.d.ts +17 -14
  104. package/dist/components/blocks/text/composition-seat.js +11 -11
  105. package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
  106. package/dist/components/blocks/text/construct-edge-delete.js +50 -65
  107. package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
  108. package/dist/components/blocks/text/construct-reveal.js +13 -14
  109. package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
  110. package/dist/components/blocks/text/delimiter-autopair.js +87 -103
  111. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
  112. package/dist/components/blocks/text/edge-policy-dispatch.js +150 -181
  113. package/dist/components/blocks/text/edge-seat.d.ts +17 -26
  114. package/dist/components/blocks/text/edge-seat.js +43 -70
  115. package/dist/components/blocks/text/link-at-point.d.ts +9 -9
  116. package/dist/components/blocks/text/link-at-point.js +12 -15
  117. package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
  118. package/dist/components/blocks/text/live-join-seam.js +75 -112
  119. package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
  120. package/dist/components/blocks/text/live-selection-edit.js +32 -108
  121. package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
  122. package/dist/components/blocks/text/live-split-rebalance.js +50 -67
  123. package/dist/components/blocks/text/marker-completion.d.ts +7 -12
  124. package/dist/components/blocks/text/marker-completion.js +17 -10
  125. package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
  126. package/dist/components/blocks/text/pending-mark-insert.js +30 -49
  127. package/dist/components/blocks/text/screen-diff.d.ts +5 -15
  128. package/dist/components/blocks/text/screen-diff.js +5 -19
  129. package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
  130. package/dist/components/blocks/text/text-clipboard.js +27 -32
  131. package/dist/components/blocks/text/text-keydown.d.ts +20 -30
  132. package/dist/components/blocks/text/text-keydown.js +54 -51
  133. package/dist/components/blocks/text/text-render.d.ts +25 -35
  134. package/dist/components/blocks/text/text-render.js +82 -61
  135. package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
  136. package/dist/components/blocks/text/widget-adjacency.js +17 -17
  137. package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
  138. package/dist/components/blocks/text/widget-interaction.js +212 -199
  139. package/dist/components/blocks/widget-portal.d.ts +20 -29
  140. package/dist/components/blocks/widget-portal.js +16 -14
  141. package/dist/components/built-in-blocks.d.ts +3 -4
  142. package/dist/components/built-in-blocks.js +17 -18
  143. package/dist/components/drag-handle.d.ts +12 -35
  144. package/dist/components/drag-handle.js +22 -68
  145. package/dist/components/editor-built-ins.d.ts +1 -0
  146. package/dist/components/editor-built-ins.js +16 -0
  147. package/dist/components/editor-root-clipboard.d.ts +6 -6
  148. package/dist/components/editor-root-clipboard.js +16 -27
  149. package/dist/components/editor-root-document-swap.d.ts +49 -0
  150. package/dist/components/editor-root-document-swap.js +54 -0
  151. package/dist/components/editor-root-focus.d.ts +5 -4
  152. package/dist/components/editor-root-focus.js +51 -22
  153. package/dist/components/editor-root-focused-surface.d.ts +35 -0
  154. package/dist/components/editor-root-focused-surface.js +65 -0
  155. package/dist/components/editor-root-geometry.d.ts +15 -24
  156. package/dist/components/editor-root-geometry.js +27 -31
  157. package/dist/components/editor-root-gestures.d.ts +39 -0
  158. package/dist/components/editor-root-gestures.js +189 -0
  159. package/dist/components/editor-root-keydown.d.ts +10 -25
  160. package/dist/components/editor-root-keydown.js +19 -43
  161. package/dist/components/editor-root-listeners.d.ts +22 -24
  162. package/dist/components/editor-root-listeners.js +49 -24
  163. package/dist/components/editor-root-menus.d.ts +51 -0
  164. package/dist/components/editor-root-menus.js +147 -0
  165. package/dist/components/editor-root-mode-flip.d.ts +16 -11
  166. package/dist/components/editor-root-mode-flip.js +36 -34
  167. package/dist/components/editor-root-scroll-host.d.ts +22 -0
  168. package/dist/components/editor-root-scroll-host.js +34 -0
  169. package/dist/components/editor-root-test-surface.d.ts +48 -0
  170. package/dist/components/editor-root-test-surface.js +6 -0
  171. package/dist/components/image/ImageOverlayHost.svelte +44 -35
  172. package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
  173. package/dist/components/image/ImageProperties.svelte +37 -41
  174. package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
  175. package/dist/components/image/ImageResizeHandles.svelte +14 -26
  176. package/dist/components/image/image-crop.d.ts +5 -11
  177. package/dist/components/image/image-crop.js +5 -11
  178. package/dist/components/image/image-edit-commit.d.ts +19 -16
  179. package/dist/components/image/image-edit-commit.js +74 -38
  180. package/dist/components/image/image-resize.d.ts +2 -5
  181. package/dist/components/image/image-resize.js +3 -6
  182. package/dist/components/image/image-widget-editing.d.ts +3 -3
  183. package/dist/components/image/image-widget-editing.js +9 -9
  184. package/dist/components/image/widget-dom.d.ts +2 -3
  185. package/dist/components/image/widget-dom.js +19 -24
  186. package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
  187. package/dist/components/image/widget-selection-state.svelte.js +26 -19
  188. package/dist/components/kind-cue.svelte.d.ts +21 -0
  189. package/dist/components/kind-cue.svelte.js +35 -0
  190. package/dist/components/link-card/LinkCard.svelte +115 -64
  191. package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
  192. package/dist/components/link-card/LinkCardHost.svelte +42 -33
  193. package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
  194. package/dist/components/link-card/link-card-commit.d.ts +16 -19
  195. package/dist/components/link-card/link-card-commit.js +21 -30
  196. package/dist/components/link-card/link-card-entry.d.ts +13 -23
  197. package/dist/components/link-card/link-card-entry.js +16 -24
  198. package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
  199. package/dist/components/link-card/link-card-state.svelte.js +2 -2
  200. package/dist/components/lrd-map-gate.d.ts +4 -11
  201. package/dist/components/lrd-map-gate.js +5 -11
  202. package/dist/components/menu/BlockMenu.svelte +20 -81
  203. package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
  204. package/dist/components/menu/InlineMenuHost.svelte +191 -0
  205. package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
  206. package/dist/components/menu/MenuIcon.svelte +3 -103
  207. package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
  208. package/dist/components/menu/SelectionToolbar.svelte +30 -35
  209. package/dist/components/menu/SelectionToolbar.svelte.d.ts +3 -5
  210. package/dist/components/menu/clipboard-actions.d.ts +3 -4
  211. package/dist/components/menu/clipboard-actions.js +3 -4
  212. package/dist/components/menu/default-context-actions.d.ts +4 -13
  213. package/dist/components/menu/default-context-actions.js +49 -67
  214. package/dist/components/menu/flyout-placement.d.ts +2 -2
  215. package/dist/components/menu/flyout-placement.js +2 -2
  216. package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
  217. package/dist/components/menu/menu-presence.svelte.js +19 -0
  218. package/dist/components/paste-image-arm.d.ts +6 -11
  219. package/dist/components/paste-image-arm.js +11 -18
  220. package/dist/components/portal.d.ts +2 -5
  221. package/dist/components/portal.js +4 -7
  222. package/dist/core/directive/activate.d.ts +4 -5
  223. package/dist/core/directive/activate.js +8 -9
  224. package/dist/core/directive/container-opener.js +13 -12
  225. package/dist/core/directive/grammar.d.ts +2 -5
  226. package/dist/core/directive/grammar.js +10 -10
  227. package/dist/core/directive/kinds.d.ts +4 -7
  228. package/dist/core/directive/kinds.js +14 -16
  229. package/dist/core/directive/registry.d.ts +12 -9
  230. package/dist/core/directive/registry.js +19 -20
  231. package/dist/core/directive/text-recognizer.d.ts +3 -2
  232. package/dist/core/directive/text-recognizer.js +5 -9
  233. package/dist/core/escapable.d.ts +1 -5
  234. package/dist/core/escapable.js +1 -5
  235. package/dist/core/inline/backticks.d.ts +3 -4
  236. package/dist/core/inline/backticks.js +3 -4
  237. package/dist/core/inline/character-refs.js +2 -1
  238. package/dist/core/inline/destination-bytes.d.ts +6 -3
  239. package/dist/core/inline/destination-bytes.js +50 -8
  240. package/dist/core/inline/entity-widget.d.ts +4 -3
  241. package/dist/core/inline/entity-widget.js +6 -6
  242. package/dist/core/inline/format-toggle.d.ts +22 -28
  243. package/dist/core/inline/format-toggle.js +97 -129
  244. package/dist/core/inline/html-entities.d.ts +2 -3
  245. package/dist/core/inline/html-entities.js +2 -3
  246. package/dist/core/inline/html-tag-grammar.js +6 -2
  247. package/dist/core/inline/image-dimensions.d.ts +2 -0
  248. package/dist/core/inline/image-dimensions.js +19 -2
  249. package/dist/core/inline/image-source-bytes.d.ts +11 -0
  250. package/dist/core/inline/image-source-bytes.js +71 -0
  251. package/dist/core/inline/index.d.ts +28 -21
  252. package/dist/core/inline/index.js +56 -34
  253. package/dist/core/inline/inline-cache.d.ts +12 -15
  254. package/dist/core/inline/inline-cache.js +11 -14
  255. package/dist/core/inline/inline-widgets.d.ts +54 -75
  256. package/dist/core/inline/inline-widgets.js +54 -62
  257. package/dist/core/inline/link-destination.d.ts +31 -0
  258. package/dist/core/inline/link-destination.js +129 -0
  259. package/dist/core/inline/link-reference-resolver.d.ts +8 -6
  260. package/dist/core/inline/link-reference-resolver.js +10 -6
  261. package/dist/core/inline/link-source-bytes.d.ts +31 -0
  262. package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
  263. package/dist/core/inline/live-edit/read-back.d.ts +29 -0
  264. package/dist/core/inline/live-edit/read-back.js +50 -0
  265. package/dist/core/inline/picture.d.ts +10 -0
  266. package/dist/core/inline/picture.js +40 -0
  267. package/dist/core/inline/scan/autolinks.d.ts +7 -8
  268. package/dist/core/inline/scan/autolinks.js +80 -59
  269. package/dist/core/inline/scan/brackets.d.ts +2 -2
  270. package/dist/core/inline/scan/brackets.js +6 -103
  271. package/dist/core/inline/scan/code-spans.d.ts +4 -0
  272. package/dist/core/inline/scan/code-spans.js +8 -0
  273. package/dist/core/inline/scan/emphasis.js +10 -14
  274. package/dist/core/inline/scan/index.d.ts +3 -1
  275. package/dist/core/inline/scan/index.js +32 -33
  276. package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
  277. package/dist/core/inline/scan/plugin-syntax.js +75 -89
  278. package/dist/core/inline/scan/scan-state.d.ts +2 -0
  279. package/dist/core/inline/scan/scan-state.js +1 -0
  280. package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
  281. package/dist/core/inline/scan/simple-nodes.js +2 -5
  282. package/dist/core/inline/scan/triggers.d.ts +17 -0
  283. package/dist/core/inline/scan/triggers.js +26 -0
  284. package/dist/core/inline/scan/url.js +8 -10
  285. package/dist/core/inline/transparency.d.ts +2 -1
  286. package/dist/core/inline/transparency.js +31 -15
  287. package/dist/core/inline/visibility.d.ts +30 -49
  288. package/dist/core/inline/visibility.js +31 -49
  289. package/dist/core/inline/walk.d.ts +4 -10
  290. package/dist/core/inline/walk.js +4 -10
  291. package/dist/core/inline-render.d.ts +22 -27
  292. package/dist/core/inline-render.js +51 -60
  293. package/dist/core/lines.d.ts +67 -26
  294. package/dist/core/lines.js +164 -33
  295. package/dist/core/metadata-parity.d.ts +9 -0
  296. package/dist/core/metadata-parity.js +25 -0
  297. package/dist/core/node-views.d.ts +7 -6
  298. package/dist/core/node-views.js +5 -5
  299. package/dist/core/nodes.d.ts +34 -44
  300. package/dist/core/nodes.js +4 -12
  301. package/dist/core/parser.d.ts +27 -34
  302. package/dist/core/parser.js +53 -67
  303. package/dist/core/parsers/blockquote.d.ts +5 -8
  304. package/dist/core/parsers/blockquote.js +11 -10
  305. package/dist/core/parsers/built-in-openers.d.ts +2 -5
  306. package/dist/core/parsers/built-in-openers.js +5 -8
  307. package/dist/core/parsers/fence-syntax.d.ts +36 -7
  308. package/dist/core/parsers/fence-syntax.js +61 -11
  309. package/dist/core/parsers/fenced-code.d.ts +16 -0
  310. package/dist/core/parsers/fenced-code.js +16 -15
  311. package/dist/core/parsers/heading.d.ts +19 -2
  312. package/dist/core/parsers/heading.js +50 -2
  313. package/dist/core/parsers/html-block.d.ts +3 -6
  314. package/dist/core/parsers/html-block.js +10 -11
  315. package/dist/core/parsers/indented-code.d.ts +1 -1
  316. package/dist/core/parsers/indented-code.js +2 -8
  317. package/dist/core/parsers/link-reference.d.ts +5 -3
  318. package/dist/core/parsers/link-reference.js +116 -120
  319. package/dist/core/parsers/list.d.ts +12 -5
  320. package/dist/core/parsers/list.js +53 -36
  321. package/dist/core/parsers/paragraph.d.ts +3 -3
  322. package/dist/core/parsers/paragraph.js +14 -5
  323. package/dist/core/parsers/table-completion.d.ts +2 -5
  324. package/dist/core/parsers/table-completion.js +7 -10
  325. package/dist/core/parsers/table.d.ts +8 -8
  326. package/dist/core/parsers/table.js +23 -26
  327. package/dist/core/parsers/thematic-break.js +15 -14
  328. package/dist/core/paths.d.ts +13 -0
  329. package/dist/core/paths.js +31 -0
  330. package/dist/core/terminator-escalation.d.ts +0 -7
  331. package/dist/core/terminator-escalation.js +5 -8
  332. package/dist/core/url-policy.d.ts +2 -5
  333. package/dist/core/url-policy.js +8 -12
  334. package/dist/cursor/caret-memory.d.ts +34 -0
  335. package/dist/cursor/caret-memory.js +82 -0
  336. package/dist/cursor/coordinate-spaces.d.ts +26 -19
  337. package/dist/cursor/coordinate-spaces.js +32 -20
  338. package/dist/cursor/dom-walk.d.ts +7 -13
  339. package/dist/cursor/dom-walk.js +7 -13
  340. package/dist/cursor/edge-affinity.d.ts +7 -35
  341. package/dist/cursor/edge-affinity.js +13 -44
  342. package/dist/cursor/focused-caret.d.ts +6 -8
  343. package/dist/cursor/focused-caret.js +7 -16
  344. package/dist/cursor/height-model.d.ts +3 -3
  345. package/dist/cursor/height-model.js +5 -5
  346. package/dist/cursor/height-oracle.d.ts +10 -6
  347. package/dist/cursor/height-oracle.js +26 -74
  348. package/dist/cursor/observe-resize.d.ts +13 -0
  349. package/dist/cursor/observe-resize.js +43 -0
  350. package/dist/cursor/overlay-rects.d.ts +2 -5
  351. package/dist/cursor/overlay-rects.js +2 -5
  352. package/dist/cursor/overlay-remeasure.d.ts +6 -7
  353. package/dist/cursor/overlay-remeasure.js +10 -14
  354. package/dist/cursor/pending-marks.d.ts +7 -9
  355. package/dist/cursor/pending-marks.js +6 -27
  356. package/dist/cursor/point-offset.d.ts +16 -10
  357. package/dist/cursor/point-offset.js +60 -25
  358. package/dist/cursor/reveal-source.d.ts +7 -11
  359. package/dist/cursor/reveal-source.js +10 -18
  360. package/dist/cursor/scroll-ancestors.d.ts +9 -20
  361. package/dist/cursor/scroll-ancestors.js +14 -26
  362. package/dist/cursor/scroll-owner.d.ts +92 -0
  363. package/dist/cursor/scroll-owner.js +283 -0
  364. package/dist/cursor/scrollport.d.ts +14 -15
  365. package/dist/cursor/scrollport.js +7 -13
  366. package/dist/cursor/sticky-column.d.ts +6 -29
  367. package/dist/cursor/sticky-column.js +6 -49
  368. package/dist/cursor/sticky-measure.d.ts +14 -9
  369. package/dist/cursor/sticky-measure.js +99 -49
  370. package/dist/cursor/surface-backend.d.ts +41 -0
  371. package/dist/cursor/surface-backend.js +78 -0
  372. package/dist/cursor/typography-estimates.d.ts +3 -3
  373. package/dist/cursor/typography-estimates.js +3 -3
  374. package/dist/cursor/visual-lines.d.ts +25 -14
  375. package/dist/cursor/visual-lines.js +45 -46
  376. package/dist/cursor/widget-edge-snap.d.ts +10 -15
  377. package/dist/cursor/widget-edge-snap.js +13 -12
  378. package/dist/cursor/widget-offset.d.ts +110 -104
  379. package/dist/cursor/widget-offset.js +344 -179
  380. package/dist/debug/diagnostics-report.d.ts +6 -6
  381. package/dist/debug/diagnostics-report.js +5 -5
  382. package/dist/debug/dump-tree.js +2 -2
  383. package/dist/debug/editor-diagnostics.d.ts +15 -0
  384. package/dist/debug/editor-diagnostics.js +33 -0
  385. package/dist/debug/inspect.d.ts +2 -2
  386. package/dist/debug/inspect.js +4 -4
  387. package/dist/debug/interaction-trace.d.ts +14 -15
  388. package/dist/debug/interaction-trace.js +19 -20
  389. package/dist/debug/operations-log.d.ts +1 -1
  390. package/dist/debug/operations-log.js +1 -1
  391. package/dist/decorations/buckets.d.ts +6 -12
  392. package/dist/decorations/buckets.js +4 -11
  393. package/dist/decorations/decoration-state.svelte.d.ts +2 -3
  394. package/dist/decorations/decoration-state.svelte.js +24 -26
  395. package/dist/decorations/island-dom.d.ts +10 -18
  396. package/dist/decorations/island-dom.js +25 -50
  397. package/dist/decorations/reserved-attrs.d.ts +6 -8
  398. package/dist/decorations/reserved-attrs.js +30 -17
  399. package/dist/decorations/types.d.ts +6 -7
  400. package/dist/decorations/types.js +2 -1
  401. package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
  402. package/dist/decorations/use-block-decorations.svelte.js +71 -0
  403. package/dist/decorations/widget-dom.d.ts +3 -3
  404. package/dist/decorations/widget-dom.js +5 -5
  405. package/dist/dev-warn.d.ts +5 -2
  406. package/dist/dev-warn.js +16 -4
  407. package/dist/editor-actions/ancestry-folds.d.ts +9 -14
  408. package/dist/editor-actions/ancestry-folds.js +13 -18
  409. package/dist/editor-actions/block-edit-core.d.ts +49 -22
  410. package/dist/editor-actions/block-edit-core.js +279 -151
  411. package/dist/editor-actions/block-edit-scope.d.ts +63 -50
  412. package/dist/editor-actions/block-edit-scope.js +100 -48
  413. package/dist/editor-actions/block-edit.d.ts +2 -3
  414. package/dist/editor-actions/block-edit.js +14 -90
  415. package/dist/editor-actions/commit/history.d.ts +4 -4
  416. package/dist/editor-actions/commit/history.js +33 -34
  417. package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
  418. package/dist/editor-actions/commit/reading-write-gate.js +56 -0
  419. package/dist/editor-actions/commit/text-batch.d.ts +7 -11
  420. package/dist/editor-actions/commit/text-batch.js +6 -7
  421. package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
  422. package/dist/editor-actions/commit/undo-controller.js +346 -216
  423. package/dist/editor-actions/container-block-component.d.ts +32 -51
  424. package/dist/editor-actions/container-block-component.js +66 -92
  425. package/dist/editor-actions/container-edit.d.ts +4 -2
  426. package/dist/editor-actions/container-edit.js +14 -44
  427. package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
  428. package/dist/editor-actions/container-exit-overrides.js +19 -21
  429. package/dist/editor-actions/deps.d.ts +25 -32
  430. package/dist/editor-actions/enter-completion.d.ts +12 -15
  431. package/dist/editor-actions/enter-completion.js +49 -51
  432. package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
  433. package/dist/editor-actions/focus/focus-dispatch.js +28 -50
  434. package/dist/editor-actions/focus/focus-landing.d.ts +8 -11
  435. package/dist/editor-actions/focus/focus-landing.js +15 -14
  436. package/dist/editor-actions/focus/focus.d.ts +3 -2
  437. package/dist/editor-actions/focus/focus.js +42 -59
  438. package/dist/editor-actions/index.d.ts +4 -3
  439. package/dist/editor-actions/index.js +5 -4
  440. package/dist/editor-actions/inline-range-commit.d.ts +18 -16
  441. package/dist/editor-actions/inline-range-commit.js +45 -54
  442. package/dist/editor-actions/leaf-write.d.ts +11 -0
  443. package/dist/editor-actions/leaf-write.js +102 -0
  444. package/dist/editor-actions/list-context.d.ts +9 -10
  445. package/dist/editor-actions/list-context.js +115 -110
  446. package/dist/editor-actions/list-overrides.d.ts +13 -5
  447. package/dist/editor-actions/list-overrides.js +36 -12
  448. package/dist/editor-actions/merge-fallback.d.ts +10 -16
  449. package/dist/editor-actions/merge-fallback.js +11 -22
  450. package/dist/editor-actions/nested/container-actions.d.ts +37 -0
  451. package/dist/editor-actions/nested/container-actions.js +42 -0
  452. package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
  453. package/dist/editor-actions/nested/emptied-container.js +5 -0
  454. package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
  455. package/dist/editor-actions/nested/nested-actions.js +17 -15
  456. package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
  457. package/dist/editor-actions/nested/nested-block-edit.js +40 -134
  458. package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
  459. package/dist/editor-actions/nested/nested-focus.js +33 -21
  460. package/dist/editor-actions/paste-coordinator.d.ts +3 -2
  461. package/dist/editor-actions/paste-coordinator.js +17 -13
  462. package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
  463. package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
  464. package/dist/editor-actions/plugin/container.d.ts +54 -82
  465. package/dist/editor-actions/plugin/container.js +105 -188
  466. package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
  467. package/dist/editor-actions/plugin/directive-container.js +7 -8
  468. package/dist/editor-actions/reorder-action.d.ts +7 -12
  469. package/dist/editor-actions/reorder-action.js +32 -48
  470. package/dist/editor-actions/reorder-drag.d.ts +12 -8
  471. package/dist/editor-actions/reorder-drag.js +45 -41
  472. package/dist/editor-actions/replacement-focus.d.ts +13 -21
  473. package/dist/editor-actions/replacement-focus.js +32 -33
  474. package/dist/editor-actions/search-replace.js +71 -67
  475. package/dist/editor-actions/stored-caret.d.ts +7 -0
  476. package/dist/editor-actions/stored-caret.js +10 -0
  477. package/dist/editor-actions/table-context.d.ts +9 -11
  478. package/dist/editor-actions/table-context.js +70 -93
  479. package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
  480. package/dist/editor-actions/unwrap-strategies.js +52 -63
  481. package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
  482. package/dist/editor-actions/whole-block-focus-surface.js +43 -53
  483. package/dist/editor-events.d.ts +25 -29
  484. package/dist/editor-events.js +17 -28
  485. package/dist/editor-keys.d.ts +96 -104
  486. package/dist/editor-keys.js +11 -24
  487. package/dist/editor-props.d.ts +88 -71
  488. package/dist/editor-rects.d.ts +23 -34
  489. package/dist/editor-rects.js +9 -77
  490. package/dist/env.d.ts +6 -4
  491. package/dist/env.js +8 -4
  492. package/dist/index.d.ts +6 -2
  493. package/dist/index.js +5 -2
  494. package/dist/inline-menu/inline-menu-session.d.ts +37 -0
  495. package/dist/inline-menu/inline-menu-session.js +98 -0
  496. package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
  497. package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
  498. package/dist/inline-menu/types.d.ts +77 -0
  499. package/dist/inline-menu/types.js +7 -0
  500. package/dist/invariants/child-id-parity.d.ts +23 -0
  501. package/dist/invariants/child-id-parity.js +39 -0
  502. package/dist/invariants/commit-paths.d.ts +4 -4
  503. package/dist/invariants/commit-paths.js +4 -4
  504. package/dist/invariants/commit-scope.d.ts +4 -4
  505. package/dist/invariants/commit-scope.js +9 -8
  506. package/dist/invariants/context-keys.d.ts +2 -5
  507. package/dist/invariants/context-keys.js +3 -6
  508. package/dist/invariants/descriptor.d.ts +2 -6
  509. package/dist/invariants/descriptor.js +2 -6
  510. package/dist/invariants/inline-transitions.d.ts +9 -16
  511. package/dist/invariants/inline-transitions.js +10 -18
  512. package/dist/invariants/install.d.ts +18 -27
  513. package/dist/invariants/install.js +29 -30
  514. package/dist/invariants/keeps-a-block.d.ts +7 -0
  515. package/dist/invariants/keeps-a-block.js +14 -0
  516. package/dist/invariants/landable-caret.d.ts +5 -7
  517. package/dist/invariants/landable-caret.js +8 -11
  518. package/dist/invariants/landing-focus-scroll.d.ts +7 -0
  519. package/dist/invariants/landing-focus-scroll.js +13 -0
  520. package/dist/invariants/landing-value.d.ts +13 -0
  521. package/dist/invariants/landing-value.js +27 -0
  522. package/dist/invariants/marker-css-parity.d.ts +5 -6
  523. package/dist/invariants/marker-css-parity.js +11 -12
  524. package/dist/invariants/measures-in-own-list.d.ts +6 -0
  525. package/dist/invariants/measures-in-own-list.js +13 -0
  526. package/dist/invariants/node-shape.d.ts +18 -37
  527. package/dist/invariants/node-shape.js +123 -79
  528. package/dist/invariants/open-tail.d.ts +7 -0
  529. package/dist/invariants/open-tail.js +45 -0
  530. package/dist/invariants/placement-ends-widget.d.ts +8 -0
  531. package/dist/invariants/placement-ends-widget.js +13 -0
  532. package/dist/invariants/registry.d.ts +27 -66
  533. package/dist/invariants/registry.js +61 -137
  534. package/dist/invariants/render-fidelity.d.ts +4 -4
  535. package/dist/invariants/render-fidelity.js +5 -5
  536. package/dist/invariants/selection-endpoints.d.ts +6 -7
  537. package/dist/invariants/selection-endpoints.js +18 -16
  538. package/dist/invariants/single-node-sink.d.ts +4 -5
  539. package/dist/invariants/single-node-sink.js +4 -5
  540. package/dist/invariants/snapshot-integrity.d.ts +5 -6
  541. package/dist/invariants/snapshot-integrity.js +1 -1
  542. package/dist/invariants/structural-descriptor.d.ts +6 -15
  543. package/dist/invariants/structural-descriptor.js +6 -15
  544. package/dist/menu-icons.d.ts +47 -0
  545. package/dist/menu-icons.js +113 -0
  546. package/dist/perf/instruments.d.ts +20 -5
  547. package/dist/perf/instruments.js +35 -15
  548. package/dist/perf/use-mount-gauge.svelte.js +4 -4
  549. package/dist/plugin.d.ts +37 -8
  550. package/dist/plugin.js +100 -77
  551. package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
  552. package/dist/plugins/admonitions/admonition-kind.js +12 -10
  553. package/dist/plugins/admonitions/convert-document.d.ts +5 -5
  554. package/dist/plugins/admonitions/convert-document.js +8 -7
  555. package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
  556. package/dist/plugins/admonitions/gh-alert.js +21 -22
  557. package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
  558. package/dist/plugins/admonitions/github-alert-kind.js +28 -37
  559. package/dist/plugins/admonitions/index.js +2 -2
  560. package/dist/plugins/admonitions/kinds.d.ts +1 -1
  561. package/dist/plugins/admonitions/register.js +11 -2
  562. package/dist/plugins/details/DetailsBlock.svelte +20 -20
  563. package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
  564. package/dist/plugins/details/details-disclosure.svelte.js +6 -7
  565. package/dist/plugins/details/details-kind.d.ts +6 -7
  566. package/dist/plugins/details/details-kind.js +44 -59
  567. package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
  568. package/dist/plugins/emoji/emoji-recognizer.js +7 -14
  569. package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
  570. package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
  571. package/dist/plugins/footnotes/constants.d.ts +2 -0
  572. package/dist/plugins/footnotes/constants.js +3 -0
  573. package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
  574. package/dist/plugins/footnotes/footnote-definition.js +69 -45
  575. package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
  576. package/dist/plugins/footnotes/footnote-lookup.js +14 -26
  577. package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
  578. package/dist/plugins/footnotes/footnote-numbering.js +22 -31
  579. package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
  580. package/dist/plugins/footnotes/footnote-reference.js +8 -13
  581. package/dist/plugins/footnotes/index.js +2 -3
  582. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
  583. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
  584. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
  585. package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
  586. package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
  587. package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
  588. package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
  589. package/dist/plugins/highlight-occurrences/word-char.js +4 -0
  590. package/dist/plugins/latex/BlockMath.svelte +58 -75
  591. package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
  592. package/dist/plugins/latex/MathInline.svelte +10 -9
  593. package/dist/plugins/latex/flanking.d.ts +1 -0
  594. package/dist/plugins/latex/flanking.js +3 -0
  595. package/dist/plugins/latex/index.d.ts +1 -1
  596. package/dist/plugins/latex/latex-kind.d.ts +4 -4
  597. package/dist/plugins/latex/latex-kind.js +78 -67
  598. package/dist/plugins/latex/math-completion.d.ts +1 -1
  599. package/dist/plugins/latex/math-completion.js +5 -8
  600. package/dist/plugins/latex/math-layout.d.ts +2 -8
  601. package/dist/plugins/latex/math-layout.js +0 -9
  602. package/dist/plugins/latex/math-renderer.d.ts +17 -20
  603. package/dist/plugins/latex/math-renderer.js +21 -38
  604. package/dist/plugins/latex/math-source.d.ts +4 -8
  605. package/dist/plugins/latex/math-source.js +36 -81
  606. package/dist/plugins/latex/register.d.ts +10 -11
  607. package/dist/plugins/latex/register.js +24 -10
  608. package/dist/plugins/latex/renderer.d.ts +9 -10
  609. package/dist/plugins/latex/renderer.js +9 -24
  610. package/dist/plugins/mermaid/MermaidBlock.svelte +51 -45
  611. package/dist/plugins/mermaid/index.js +1 -1
  612. package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
  613. package/dist/plugins/mermaid/mermaid-kind.js +30 -47
  614. package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
  615. package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
  616. package/dist/plugins/mermaid/register.d.ts +3 -3
  617. package/dist/plugins/mermaid/register.js +5 -5
  618. package/dist/plugins/mermaid/renderer.d.ts +5 -5
  619. package/dist/plugins/mermaid/renderer.js +8 -11
  620. package/dist/plugins/parrot/ParrotBlock.svelte +15 -6
  621. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
  622. package/dist/plugins/parrot/parrot-plugin.js +3 -3
  623. package/dist/plugins/slash-commands/filter.d.ts +23 -0
  624. package/dist/plugins/slash-commands/filter.js +31 -0
  625. package/dist/plugins/slash-commands/index.d.ts +2 -0
  626. package/dist/plugins/slash-commands/index.js +2 -0
  627. package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
  628. package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
  629. package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
  630. package/dist/plugins/slash-commands/slash-source.js +108 -0
  631. package/dist/plugins/toc/TocBlock.svelte +23 -22
  632. package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
  633. package/dist/plugins/toc/heading-outline.d.ts +7 -12
  634. package/dist/plugins/toc/heading-outline.js +22 -36
  635. package/dist/plugins/toc/navigation-queue.d.ts +2 -4
  636. package/dist/plugins/toc/toc-plugin.d.ts +5 -5
  637. package/dist/plugins/toc/toc-plugin.js +20 -13
  638. package/dist/presentation-mode.d.ts +15 -23
  639. package/dist/presentation-mode.js +19 -25
  640. package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
  641. package/dist/reactivity/block-list-state.svelte.js +8 -9
  642. package/dist/reactivity/block-window.svelte.d.ts +12 -6
  643. package/dist/reactivity/block-window.svelte.js +44 -17
  644. package/dist/reactivity/child-list.d.ts +34 -0
  645. package/dist/reactivity/child-list.js +48 -0
  646. package/dist/reactivity/content-version.svelte.d.ts +4 -7
  647. package/dist/reactivity/content-version.svelte.js +3 -5
  648. package/dist/reactivity/hold-across.d.ts +39 -0
  649. package/dist/reactivity/hold-across.js +57 -0
  650. package/dist/reactivity/layout-state.svelte.d.ts +27 -0
  651. package/dist/reactivity/layout-state.svelte.js +51 -0
  652. package/dist/reactivity/list-tree.d.ts +39 -0
  653. package/dist/reactivity/list-tree.js +132 -0
  654. package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
  655. package/dist/reactivity/list-windowing.svelte.js +141 -310
  656. package/dist/reactivity/measure-batch.d.ts +6 -8
  657. package/dist/reactivity/measure-batch.js +5 -6
  658. package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
  659. package/dist/reactivity/publish-ref.svelte.js +21 -85
  660. package/dist/reactivity/scope-geometry.d.ts +6 -13
  661. package/dist/reactivity/scope-geometry.js +7 -14
  662. package/dist/reactivity/state-registry.d.ts +5 -5
  663. package/dist/reactivity/state-registry.js +11 -15
  664. package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
  665. package/dist/reactivity/use-container-windowing.svelte.js +64 -74
  666. package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
  667. package/dist/reactivity/use-measured-child.svelte.js +41 -0
  668. package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
  669. package/dist/reactivity/use-window-floor.svelte.js +27 -0
  670. package/dist/reactivity/window-slice.d.ts +4 -4
  671. package/dist/reactivity/window-slice.js +0 -2
  672. package/dist/renderer-slot.d.ts +48 -0
  673. package/dist/renderer-slot.js +85 -0
  674. package/dist/scan-index.d.ts +4 -4
  675. package/dist/scan-index.js +4 -4
  676. package/dist/schema/block-commands.d.ts +69 -54
  677. package/dist/schema/block-commands.js +91 -104
  678. package/dist/schema/block-completions.d.ts +16 -19
  679. package/dist/schema/block-completions.js +25 -32
  680. package/dist/schema/block-component-registry.d.ts +13 -14
  681. package/dist/schema/block-component-registry.js +19 -17
  682. package/dist/schema/block-kind-descriptor.d.ts +234 -168
  683. package/dist/schema/block-kind-descriptor.js +151 -66
  684. package/dist/schema/block-openers.d.ts +48 -39
  685. package/dist/schema/block-openers.js +73 -83
  686. package/dist/schema/built-in-descriptors.d.ts +3 -5
  687. package/dist/schema/built-in-descriptors.js +96 -80
  688. package/dist/schema/child-spans.d.ts +12 -10
  689. package/dist/schema/child-spans.js +68 -34
  690. package/dist/schema/closure.d.ts +18 -16
  691. package/dist/schema/closure.js +24 -14
  692. package/dist/schema/command-id.d.ts +6 -8
  693. package/dist/schema/command-id.js +20 -25
  694. package/dist/schema/commands.d.ts +78 -84
  695. package/dist/schema/commands.js +152 -117
  696. package/dist/schema/container-raw.d.ts +51 -11
  697. package/dist/schema/container-raw.js +143 -14
  698. package/dist/schema/container-rebuilders.d.ts +17 -15
  699. package/dist/schema/container-rebuilders.js +30 -22
  700. package/dist/schema/context-actions.d.ts +25 -13
  701. package/dist/schema/context-actions.js +32 -17
  702. package/dist/schema/define-plugin-block.d.ts +8 -6
  703. package/dist/schema/define-plugin-block.js +6 -4
  704. package/dist/schema/fenced-code-raw.d.ts +30 -17
  705. package/dist/schema/fenced-code-raw.js +155 -107
  706. package/dist/schema/global-commands.d.ts +6 -6
  707. package/dist/schema/global-commands.js +14 -22
  708. package/dist/schema/height-estimates.d.ts +31 -0
  709. package/dist/schema/height-estimates.js +64 -0
  710. package/dist/schema/inline-construct-policy.d.ts +42 -55
  711. package/dist/schema/inline-construct-policy.js +36 -35
  712. package/dist/schema/insert-catalogue.d.ts +30 -0
  713. package/dist/schema/insert-catalogue.js +95 -0
  714. package/dist/schema/keybinding-overrides.d.ts +9 -11
  715. package/dist/schema/keybinding-overrides.js +1 -1
  716. package/dist/schema/keybindings.d.ts +15 -7
  717. package/dist/schema/keybindings.js +21 -9
  718. package/dist/schema/merge-rules.d.ts +5 -7
  719. package/dist/schema/merge-rules.js +7 -9
  720. package/dist/schema/opener-priorities.d.ts +4 -4
  721. package/dist/schema/opener-priorities.js +4 -4
  722. package/dist/schema/operations.d.ts +8 -10
  723. package/dist/schema/operations.js +3 -3
  724. package/dist/schema/page-role.d.ts +14 -0
  725. package/dist/schema/page-role.js +19 -0
  726. package/dist/schema/plugin-activation.d.ts +4 -6
  727. package/dist/schema/plugin-activation.js +12 -10
  728. package/dist/schema/plugin-editor-context.d.ts +25 -10
  729. package/dist/schema/plugin-editor-context.js +40 -9
  730. package/dist/schema/plugin-install.d.ts +49 -17
  731. package/dist/schema/plugin-install.js +51 -25
  732. package/dist/schema/plugin-kind.d.ts +12 -8
  733. package/dist/schema/plugin-kind.js +35 -42
  734. package/dist/schema/plugin-name.js +3 -3
  735. package/dist/schema/plugin-registry.d.ts +54 -0
  736. package/dist/schema/plugin-registry.js +70 -0
  737. package/dist/schema/reading.d.ts +23 -0
  738. package/dist/schema/reading.js +7 -0
  739. package/dist/schema/register-once.d.ts +3 -5
  740. package/dist/schema/register-once.js +7 -16
  741. package/dist/schema/registration-checks.d.ts +12 -16
  742. package/dist/schema/registration-checks.js +35 -51
  743. package/dist/schema/registration-pairs.d.ts +54 -0
  744. package/dist/schema/registration-pairs.js +48 -0
  745. package/dist/schema/registration-pending.d.ts +8 -12
  746. package/dist/schema/registration-pending.js +9 -9
  747. package/dist/schema/registry-reset.d.ts +8 -4
  748. package/dist/schema/registry-reset.js +13 -26
  749. package/dist/schema/registry-view.d.ts +25 -13
  750. package/dist/schema/registry-view.js +26 -20
  751. package/dist/schema/reserved-chords.d.ts +9 -10
  752. package/dist/schema/reserved-chords.js +63 -80
  753. package/dist/schema/reserved-chrome.d.ts +12 -11
  754. package/dist/schema/reserved-chrome.js +15 -11
  755. package/dist/schema/setext-raw.d.ts +13 -0
  756. package/dist/schema/setext-raw.js +33 -0
  757. package/dist/schema/stored-as.d.ts +20 -0
  758. package/dist/schema/stored-as.js +6 -0
  759. package/dist/schema/table-cell-raw.d.ts +18 -7
  760. package/dist/schema/table-cell-raw.js +28 -7
  761. package/dist/schema/whole-block-unit.d.ts +5 -4
  762. package/dist/schema/whole-block-unit.js +5 -4
  763. package/dist/search/document-scan.d.ts +3 -3
  764. package/dist/search/document-scan.js +2 -2
  765. package/dist/search/matcher.d.ts +1 -1
  766. package/dist/search/regex-executor.d.ts +5 -6
  767. package/dist/search/regex-executor.js +6 -8
  768. package/dist/search/replace.d.ts +2 -5
  769. package/dist/search/replace.js +2 -5
  770. package/dist/search/search-state.svelte.d.ts +5 -5
  771. package/dist/search/search-state.svelte.js +12 -16
  772. package/dist/selection/autoscroll.d.ts +6 -9
  773. package/dist/selection/block-hit-test.d.ts +16 -24
  774. package/dist/selection/block-hit-test.js +29 -22
  775. package/dist/selection/caret-doors.d.ts +15 -14
  776. package/dist/selection/caret-doors.js +37 -26
  777. package/dist/selection/caret-landing.d.ts +62 -0
  778. package/dist/selection/caret-landing.js +157 -0
  779. package/dist/selection/caret-restore.d.ts +17 -10
  780. package/dist/selection/caret-restore.js +10 -22
  781. package/dist/selection/caret-target.d.ts +30 -0
  782. package/dist/selection/caret-target.js +84 -0
  783. package/dist/selection/char-endpoint-snap.d.ts +6 -10
  784. package/dist/selection/char-endpoint-snap.js +8 -14
  785. package/dist/selection/clipboard-text.d.ts +5 -12
  786. package/dist/selection/clipboard-text.js +69 -172
  787. package/dist/selection/covered-block.d.ts +6 -8
  788. package/dist/selection/covered-block.js +8 -19
  789. package/dist/selection/cross-block/clipboard.d.ts +3 -2
  790. package/dist/selection/cross-block/clipboard.js +13 -4
  791. package/dist/selection/cross-block/dispatch.d.ts +47 -43
  792. package/dist/selection/cross-block/dispatch.js +12 -23
  793. package/dist/selection/cross-block/format-range.d.ts +18 -21
  794. package/dist/selection/cross-block/format-range.js +104 -103
  795. package/dist/selection/cross-block/format-toggle.d.ts +10 -15
  796. package/dist/selection/cross-block/format-toggle.js +28 -33
  797. package/dist/selection/cross-block/keydown.d.ts +4 -4
  798. package/dist/selection/cross-block/keydown.js +92 -125
  799. package/dist/selection/cross-block/ops.d.ts +19 -34
  800. package/dist/selection/cross-block/ops.js +110 -95
  801. package/dist/selection/cross-block/paste.d.ts +2 -3
  802. package/dist/selection/cross-block/paste.js +59 -96
  803. package/dist/selection/cross-block/pointer.d.ts +17 -15
  804. package/dist/selection/cross-block/pointer.js +74 -25
  805. package/dist/selection/cross-block/type-replace.d.ts +4 -6
  806. package/dist/selection/cross-block/type-replace.js +51 -134
  807. package/dist/selection/dead-space-caret.d.ts +19 -30
  808. package/dist/selection/dead-space-caret.js +70 -88
  809. package/dist/selection/drag-pointer.d.ts +7 -9
  810. package/dist/selection/drag-pointer.js +23 -33
  811. package/dist/selection/gap-caret.d.ts +17 -28
  812. package/dist/selection/gap-caret.js +14 -26
  813. package/dist/selection/grid-selection.d.ts +12 -0
  814. package/dist/selection/grid-selection.js +22 -0
  815. package/dist/selection/keyboard-extend.d.ts +27 -40
  816. package/dist/selection/keyboard-extend.js +94 -117
  817. package/dist/selection/multi-click.d.ts +13 -18
  818. package/dist/selection/multi-click.js +32 -38
  819. package/dist/selection/native-bridge.d.ts +29 -39
  820. package/dist/selection/native-bridge.js +78 -127
  821. package/dist/selection/nearest-block.d.ts +17 -12
  822. package/dist/selection/nearest-block.js +37 -18
  823. package/dist/selection/path-lookup.d.ts +25 -16
  824. package/dist/selection/path-lookup.js +101 -18
  825. package/dist/selection/path-math.d.ts +9 -11
  826. package/dist/selection/path-math.js +5 -7
  827. package/dist/selection/pointer-gesture.d.ts +5 -5
  828. package/dist/selection/pointer-gesture.js +5 -5
  829. package/dist/selection/pointer-session.d.ts +10 -16
  830. package/dist/selection/pointer-session.js +6 -7
  831. package/dist/selection/primitives.d.ts +64 -40
  832. package/dist/selection/primitives.js +57 -67
  833. package/dist/selection/range-coverage.d.ts +94 -0
  834. package/dist/selection/range-coverage.js +365 -0
  835. package/dist/selection/range-delete-ceremony.d.ts +28 -74
  836. package/dist/selection/range-delete-ceremony.js +100 -141
  837. package/dist/selection/range-delete-chrome.d.ts +20 -33
  838. package/dist/selection/range-delete-chrome.js +53 -78
  839. package/dist/selection/range-delete-table-coverage.d.ts +11 -25
  840. package/dist/selection/range-delete-table-coverage.js +42 -112
  841. package/dist/selection/range-delete-table.d.ts +14 -12
  842. package/dist/selection/range-delete-table.js +106 -310
  843. package/dist/selection/range-delete.d.ts +18 -23
  844. package/dist/selection/range-delete.js +83 -123
  845. package/dist/selection/round-trip-restore.d.ts +18 -0
  846. package/dist/selection/round-trip-restore.js +19 -0
  847. package/dist/selection/selection-announcer.d.ts +17 -0
  848. package/dist/selection/selection-announcer.js +25 -0
  849. package/dist/selection/selection-description.d.ts +4 -3
  850. package/dist/selection/selection-description.js +5 -4
  851. package/dist/selection/selection-drop.d.ts +34 -16
  852. package/dist/selection/selection-drop.js +159 -95
  853. package/dist/selection/selection-restore.d.ts +20 -33
  854. package/dist/selection/selection-restore.js +21 -44
  855. package/dist/selection/selection-state.svelte.d.ts +50 -42
  856. package/dist/selection/selection-state.svelte.js +144 -98
  857. package/dist/selection/shared-keydown.d.ts +22 -27
  858. package/dist/selection/shared-keydown.js +25 -45
  859. package/dist/selection/table-endpoint-snap.d.ts +17 -41
  860. package/dist/selection/table-endpoint-snap.js +54 -80
  861. package/dist/selection/table-rect-extend.d.ts +3 -6
  862. package/dist/selection/table-rect-extend.js +19 -14
  863. package/dist/styles/editor-theme.css +60 -53
  864. package/dist/styles/editor.css +201 -143
  865. package/dist/testing/conformance-core.d.ts +50 -18
  866. package/dist/testing/conformance-core.js +88 -50
  867. package/dist/testing/container-conformance.d.ts +48 -84
  868. package/dist/testing/container-conformance.js +159 -285
  869. package/dist/testing/headless-actions.d.ts +34 -19
  870. package/dist/testing/headless-actions.js +116 -65
  871. package/dist/testing/headless-block-list.svelte.d.ts +16 -0
  872. package/dist/testing/headless-block-list.svelte.js +22 -0
  873. package/dist/testing/inline-conformance.d.ts +15 -22
  874. package/dist/testing/inline-conformance.js +131 -148
  875. package/dist/testing/kind-conformance.d.ts +19 -24
  876. package/dist/testing/kind-conformance.js +204 -117
  877. package/dist/testing/kit-reading.d.ts +7 -0
  878. package/dist/testing/kit-reading.js +16 -0
  879. package/dist/testing/mount-dom-stubs.d.ts +4 -5
  880. package/dist/testing/mount-dom-stubs.js +8 -5
  881. package/dist/testing/parse-convergence.d.ts +10 -10
  882. package/dist/testing/parse-convergence.js +14 -49
  883. package/dist/testing.d.ts +13 -9
  884. package/dist/testing.js +28 -38
  885. package/dist/tree-operations/blockquote.d.ts +8 -14
  886. package/dist/tree-operations/blockquote.js +25 -45
  887. package/dist/tree-operations/chain-rebuild.d.ts +34 -25
  888. package/dist/tree-operations/chain-rebuild.js +115 -52
  889. package/dist/tree-operations/children.d.ts +5 -9
  890. package/dist/tree-operations/children.js +7 -11
  891. package/dist/tree-operations/cleanup.d.ts +6 -7
  892. package/dist/tree-operations/cleanup.js +14 -11
  893. package/dist/tree-operations/clone.js +5 -4
  894. package/dist/tree-operations/container-lift.d.ts +10 -5
  895. package/dist/tree-operations/container-lift.js +20 -14
  896. package/dist/tree-operations/container-offsets.d.ts +22 -0
  897. package/dist/tree-operations/container-offsets.js +89 -0
  898. package/dist/tree-operations/content-write.d.ts +52 -29
  899. package/dist/tree-operations/content-write.js +155 -110
  900. package/dist/tree-operations/index.d.ts +4 -4
  901. package/dist/tree-operations/index.js +4 -4
  902. package/dist/tree-operations/keep-one-block.d.ts +10 -0
  903. package/dist/tree-operations/keep-one-block.js +19 -0
  904. package/dist/tree-operations/leaf-range.d.ts +33 -0
  905. package/dist/tree-operations/leaf-range.js +67 -0
  906. package/dist/tree-operations/list/empty-check.d.ts +2 -3
  907. package/dist/tree-operations/list/empty-check.js +4 -4
  908. package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
  909. package/dist/tree-operations/list/exit-replacement.js +4 -9
  910. package/dist/tree-operations/list/item-partition.d.ts +2 -2
  911. package/dist/tree-operations/list/item-partition.js +2 -2
  912. package/dist/tree-operations/list/list-builders.d.ts +18 -16
  913. package/dist/tree-operations/list/list-builders.js +59 -30
  914. package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
  915. package/dist/tree-operations/list/ordered-markers.js +7 -16
  916. package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
  917. package/dist/tree-operations/list/reconcile-task.js +80 -23
  918. package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
  919. package/dist/tree-operations/list/sublist-separator.js +20 -27
  920. package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
  921. package/dist/tree-operations/list/task-paragraph.js +54 -0
  922. package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
  923. package/dist/tree-operations/list/unwrap-merge.js +44 -79
  924. package/dist/tree-operations/node-ops.d.ts +30 -52
  925. package/dist/tree-operations/node-ops.js +152 -218
  926. package/dist/tree-operations/node-primitives.d.ts +44 -31
  927. package/dist/tree-operations/node-primitives.js +84 -60
  928. package/dist/tree-operations/open-tail.d.ts +25 -0
  929. package/dist/tree-operations/open-tail.js +100 -0
  930. package/dist/tree-operations/parse-block.d.ts +15 -2
  931. package/dist/tree-operations/parse-block.js +19 -4
  932. package/dist/tree-operations/paste/apply.d.ts +7 -8
  933. package/dist/tree-operations/paste/apply.js +33 -63
  934. package/dist/tree-operations/paste/body-write.d.ts +8 -6
  935. package/dist/tree-operations/paste/body-write.js +13 -14
  936. package/dist/tree-operations/paste/container-match.d.ts +7 -10
  937. package/dist/tree-operations/paste/container-match.js +76 -58
  938. package/dist/tree-operations/paste/container-paste.d.ts +3 -3
  939. package/dist/tree-operations/paste/container-paste.js +3 -3
  940. package/dist/tree-operations/paste/dispatch.d.ts +26 -29
  941. package/dist/tree-operations/paste/dispatch.js +68 -53
  942. package/dist/tree-operations/paste/focus-target.d.ts +11 -14
  943. package/dist/tree-operations/paste/focus-target.js +13 -18
  944. package/dist/tree-operations/paste/hooks.d.ts +7 -12
  945. package/dist/tree-operations/paste/hooks.js +49 -46
  946. package/dist/tree-operations/paste/line-ending.d.ts +11 -0
  947. package/dist/tree-operations/paste/line-ending.js +32 -0
  948. package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
  949. package/dist/tree-operations/paste/list-absorb.js +17 -19
  950. package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
  951. package/dist/tree-operations/paste/list-break-out.js +24 -32
  952. package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
  953. package/dist/tree-operations/paste/parent-scope.js +9 -16
  954. package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
  955. package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
  956. package/dist/tree-operations/paste/paste-replacement.js +73 -42
  957. package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
  958. package/dist/tree-operations/paste/paste-transforms.js +18 -27
  959. package/dist/tree-operations/paste/replacement-parse.d.ts +9 -7
  960. package/dist/tree-operations/paste/replacement-parse.js +12 -10
  961. package/dist/tree-operations/paste/strategy.d.ts +1 -1
  962. package/dist/tree-operations/paste/strategy.js +1 -1
  963. package/dist/tree-operations/paste/table-slice.js +15 -10
  964. package/dist/tree-operations/paste-surfaces.d.ts +18 -29
  965. package/dist/tree-operations/paste-surfaces.js +14 -10
  966. package/dist/tree-operations/path-mutate.d.ts +7 -8
  967. package/dist/tree-operations/path-mutate.js +4 -4
  968. package/dist/tree-operations/reorder-unit.d.ts +4 -5
  969. package/dist/tree-operations/reorder-unit.js +5 -6
  970. package/dist/tree-operations/reorder.d.ts +7 -9
  971. package/dist/tree-operations/reorder.js +39 -40
  972. package/dist/tree-operations/settle.d.ts +42 -53
  973. package/dist/tree-operations/settle.js +241 -162
  974. package/dist/tree-operations/sharing.d.ts +5 -5
  975. package/dist/tree-operations/splice-many.d.ts +5 -5
  976. package/dist/tree-operations/splice-many.js +5 -5
  977. package/dist/tree-operations/stored-as.d.ts +13 -0
  978. package/dist/tree-operations/stored-as.js +48 -0
  979. package/dist/tree-operations/structural-change.d.ts +11 -15
  980. package/dist/tree-operations/structural-change.js +10 -14
  981. package/dist/tree-operations/structural-suffix.d.ts +22 -0
  982. package/dist/tree-operations/structural-suffix.js +61 -0
  983. package/dist/tree-operations/sub-table-copy.d.ts +7 -0
  984. package/dist/tree-operations/sub-table-copy.js +40 -36
  985. package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
  986. package/dist/tree-operations/table-grid-clipboard.js +11 -36
  987. package/dist/tree-operations/table-mutations.d.ts +7 -3
  988. package/dist/tree-operations/table-mutations.js +45 -9
  989. package/dist/tree-operations/unshare.d.ts +11 -15
  990. package/dist/tree-operations/unshare.js +15 -17
  991. package/dist/undo/manager.js +1 -1
  992. package/dist/undo/types.d.ts +2 -2
  993. package/docs/guide/consumer-guide.md +327 -205
  994. package/docs/guide/directives.md +7 -7
  995. package/docs/guide/plugin-api.md +253 -185
  996. package/docs/guide/plugin-guide.md +332 -235
  997. package/docs/guide/plugin-testing.md +96 -82
  998. package/package.json +12 -16
  999. package/dist/ambient/ambient-cursor.d.ts +0 -41
  1000. package/dist/ambient/ambient-cursor.js +0 -120
  1001. package/dist/components/blocks/code/code-paste.d.ts +0 -24
  1002. package/dist/components/blocks/code/code-paste.js +0 -21
  1003. package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
  1004. package/dist/components/blocks/table/cell-clipboard.js +0 -67
  1005. package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
  1006. package/dist/components/blocks/text/hidden-suffix.js +0 -15
  1007. package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
  1008. package/dist/components/image/image-source-bytes.d.ts +0 -15
  1009. package/dist/components/image/image-source-bytes.js +0 -80
  1010. package/dist/cursor/content-offsets.d.ts +0 -29
  1011. package/dist/cursor/content-offsets.js +0 -151
  1012. package/dist/cursor/reveal-anchor.d.ts +0 -30
  1013. package/dist/cursor/reveal-anchor.js +0 -31
  1014. package/dist/cursor/scroll-hold.d.ts +0 -10
  1015. package/dist/cursor/scroll-hold.js +0 -22
  1016. package/dist/invariants/split-landing.d.ts +0 -8
  1017. package/dist/invariants/split-landing.js +0 -15
  1018. package/dist/tree-operations/list/terminator.d.ts +0 -17
  1019. package/dist/tree-operations/list/terminator.js +0 -60
  1020. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -31
  1021. package/dist/tree-operations/paste/replace-block-at-parent.js +0 -78
@@ -1,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,8 +275,8 @@ export function widgetsIntersectingRange(container, start, end) {
111
275
  }
112
276
  return out;
113
277
  }
114
- /** The walk's text with marker chrome and widget bytes blanked to spaces, at the walk's own
115
- * offsets: what a rule reading words (the multi-click ladder) sees as content. */
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. */
116
280
  export function maskedWalkText(container) {
117
281
  let out = '';
118
282
  for (const seg of walkSegments(container, null)) {
@@ -121,18 +285,24 @@ export function maskedWalkText(container) {
121
285
  }
122
286
  return out;
123
287
  }
124
- /** Total walk length of `container` — its one-past-end walk position. */
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. */
125
298
  export function containerDomTextLength(container) {
126
299
  let count = 0;
127
300
  for (const seg of walkSegments(container, null))
128
301
  count += seg.len;
129
302
  return asDomTextOffset(count);
130
303
  }
131
- /**
132
- * Walk-space span of the atomic widget strictly containing `offset`, or null when the
133
- * offset sits in text or exactly on a boundary. Island application snaps replace
134
- * boundaries outward with this — a text-position range cannot split an atomic widget.
135
- */
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. */
136
306
  export function widgetSpanContainingOffset(container, offset) {
137
307
  for (const seg of walkSegments(container, null)) {
138
308
  if (seg.start > offset)
@@ -206,12 +376,15 @@ export function createRangeAtDomTextOffsets(container, start, end) {
206
376
  return range;
207
377
  }
208
378
  // ── Hidden marker runs ───────────────────────────────────────────────────────
209
- /**
210
- * Whether `node` is text the mode CSS paints nothing for — a marker span's own text under a
211
- * marker-hiding mode with no reveal on it. Detected structurally against the families in
212
- * `core/inline/visibility.ts`, never by layout: a `getComputedStyle` per keystroke is not
213
- * affordable, so that vocabulary and `styles/editor.css` move together.
214
- */
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. */
215
388
  export function isHiddenMarkerText(node, container) {
216
389
  if (node.nodeType !== Node.TEXT_NODE || !container.contains(node))
217
390
  return false;
@@ -225,54 +398,35 @@ export function isHiddenMarkerText(node, container) {
225
398
  }
226
399
  return false;
227
400
  }
228
- /**
229
- * Whether `el`'s OWN text is marker text the container's mode paints nothing for — the
230
- * element-level form of {@link isHiddenMarkerText}, for a walk that treats such a span as
231
- * opaque instead of descending into it.
232
- */
401
+ /** The element form of {@link isHiddenMarkerText}, for a walk that treats such a span as opaque
402
+ * instead of descending into it. */
233
403
  export function isHiddenMarkerRoot(el, container) {
234
404
  if (el === container || !container.contains(el))
235
405
  return false;
236
406
  const mode = markerHidingMode(container);
237
407
  return mode !== null && hidesOwnText(el, mode, chromeStandsAloneUnder(container, mode));
238
408
  }
239
- /**
240
- * The DOM-reading twin of `paintsFocusedMarkers`: whether this container's mode paints NO marker
241
- * in the focused block — neither its own structural prefix (`## `, a fence, a setext underline)
242
- * nor an inline construct's delimiters. An unstamped container is styled source, which paints.
243
- */
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. */
244
411
  export function revealsNoMarkers(container) {
245
412
  const mode = markerHidingMode(container);
246
- return mode !== null && !paintsFocusedMarkers(mode);
413
+ return mode !== null && hidesDelimitersAtCaret(mode);
247
414
  }
248
- /**
249
- * How this container's bytes read on screen: its mode and its content-empty stamp, resolved here
250
- * so a rewrite seam needs no marker vocabulary of its own. Chrome standing over no content PAINTS
251
- * (live-mode.md § 4.1), and a seam holding a license over unseen bytes has nothing to claim there.
252
- * An unmounted surface reads as source, where nothing hides and no rewrite has a run to move.
253
- */
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. */
254
417
  export function screenVisibilityOf(container) {
255
418
  return screenVisibility(container === null ? 'source' : (markerHidingMode(container) ?? 'source'), { chromePaints: container instanceof Element && chromeStampPaints(container) });
256
419
  }
257
- /**
258
- * The stamp's own condition, as `styles/editor.css` states it: the container carries
259
- * `data-content-empty` AND holds focus. The seat is for a caret, so a stamped block nobody is in
260
- * keeps its chrome hidden and reads as the empty construct it is. Focus containment rather than
261
- * `:focus-within`, so a selector engine without that pseudo-class (jsdom's) reads the same answer.
262
- */
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`. */
263
422
  function chromeStampPaints(container) {
264
423
  if (!container.hasAttribute(CONTENT_EMPTY_ATTR))
265
424
  return false;
266
425
  const active = container.ownerDocument.activeElement;
267
426
  return active !== null && container.contains(active);
268
427
  }
269
- /**
270
- * The extreme walk offsets a caret can occupy in `container`: a hidden marker run or the leading
271
- * ambient island holds no landable position, so the bound moves past it. Block-edge gates read
272
- * these rather than 0 / walk length, which a mode painting no marker makes unreachable — a gate
273
- * testing an offset no keystroke can produce is a dead key. An ALL-hidden container (an empty
274
- * fence) has no landable offset and answers `{len, len}`, making every `offset <= start` gate true.
275
- */
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}`. */
276
430
  export function landableDomTextBounds(container) {
277
431
  let start = 0;
278
432
  let end = 0;
@@ -282,9 +436,16 @@ export function landableDomTextBounds(container) {
282
436
  if (seg.len === 0)
283
437
  continue;
284
438
  const stop = seg.start + seg.len;
285
- // An atomic widget and a decoration island are opaque, not unreachable: the caret may not
286
- // enter either, but both of their boundaries are positions of their own.
287
- 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)) {
288
449
  if (!landed)
289
450
  start = stop;
290
451
  continue;
@@ -293,14 +454,20 @@ export function landableDomTextBounds(container) {
293
454
  end = stop;
294
455
  lastText = seg.kind === 'text' ? seg.node : null;
295
456
  }
296
- // The position after the last landable run's final `\n` is the start of a line nothing
297
- // paints: the engine seats no caret there, so an end gate reading it never fires and the
298
- // 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.
299
459
  if (lastText?.textContent?.endsWith('\n') && !followedByCaretAnchor(lastText, container)) {
300
460
  end -= 1;
301
461
  }
302
462
  return { start: asDomTextOffset(start), end: asDomTextOffset(Math.max(start, end)) };
303
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
+ }
304
471
  /** Whether the next painted node after `text`, at any depth above it, is a caret anchor. */
305
472
  function followedByCaretAnchor(text, root) {
306
473
  for (let node = text; node && node !== root; node = node.parentNode) {
@@ -313,19 +480,8 @@ function followedByCaretAnchor(text, root) {
313
480
  }
314
481
  return false;
315
482
  }
316
- /**
317
- * Whether every byte `container` holds is marker chrome, at least one span of it a family the
318
- * empty-construct override paints. The stamp condition the render path writes as
319
- * `data-content-empty` and the walk reads back — computed WITHOUT reading the stamp, or each
320
- * render would flip the previous one's answer. Membership and paintability are separate
321
- * questions: a reference label is chrome that stays hidden, so it is not content standing behind
322
- * the stamp, and it is not the paint the stamp promises either.
323
- */
324
- /**
325
- * The container's bytes outside its marker chrome — what a painted source holds as CONTENT,
326
- * whatever the mode paints. A fence with an empty body answers whitespace; the leaf reads that
327
- * as "nothing here a Backspace could mean but the block".
328
- */
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. */
329
485
  export function chromeFreeText(container) {
330
486
  let text = '';
331
487
  for (const seg of walkSegments(container, null)) {
@@ -337,6 +493,8 @@ export function chromeFreeText(container) {
337
493
  }
338
494
  return text;
339
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. */
340
498
  export function holdsOnlyMarkerChrome(container) {
341
499
  let chrome = false;
342
500
  for (const seg of walkSegments(container, null)) {
@@ -349,19 +507,15 @@ export function holdsOnlyMarkerChrome(container) {
349
507
  chrome ||= familyPaintsAlone(marker.family);
350
508
  continue;
351
509
  }
352
- // The ambient island keeps its box in every mode, so it neither hides the block nor
353
- // stands in for content: a `- ` with an empty child is landable and needs no stamp.
354
- 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))
355
513
  return false;
356
514
  }
357
515
  return chrome;
358
516
  }
359
- /**
360
- * Whether the mode paints NOTHING landable here: every walk segment is a hidden marker run, so no
361
- * caret position has a pixel of its own. `invariants/landable-caret.ts` refuses this shape at the
362
- * focus seam — an empty container (landable at offset 0) and one fronted by the ambient island are
363
- * not it.
364
- */
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. */
365
519
  export function paintsNoLandableContent(container) {
366
520
  let hidden = false;
367
521
  for (const seg of landingSegments(container, markerHidingMode(container))) {
@@ -373,33 +527,27 @@ export function paintsNoLandableContent(container) {
373
527
  }
374
528
  return hidden;
375
529
  }
376
- /**
377
- * {@link landableDomTextBounds} in the caret's own raw space, or null where the mode paints its
378
- * markers and the whole raw span is reachable. The one home every caret gate and caret DOOR
379
- * reads: the arrow exits, the cross-block collapse, and the block-entry seat all ask the same
380
- * question and must not answer it three ways.
381
- */
382
- 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) {
383
533
  if (!revealsNoMarkers(el))
384
534
  return null;
385
535
  const bounds = landableDomTextBounds(el);
536
+ const prefixLength = markerPrefixLength(el);
386
537
  return {
387
- start: toClampedRawOffset(bounds.start, ambientLength),
388
- end: toClampedRawOffset(bounds.end, ambientLength)
538
+ start: toClampedRawOffset(bounds.start, prefixLength),
539
+ end: toClampedRawOffset(bounds.end, prefixLength)
389
540
  };
390
541
  }
391
- /** Clamp a caret offset into `el`'s landable range — identity wherever the markers paint. */
392
- export function clampToLandableRaw(el, offset, ambientLength) {
393
- 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);
394
545
  if (!bounds)
395
546
  return offset;
396
547
  return Math.min(Math.max(offset, bounds.start), bounds.end);
397
548
  }
398
- /**
399
- * Whether the first landable position abuts an opaque island (an atomic widget, a decoration
400
- * island) instead of sitting in text: no text node holds it, so the engine's Home seats the
401
- * caret past the island and the block's start needs an owned door.
402
- */
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. */
403
551
  export function landableStartAbutsIsland(container) {
404
552
  for (const seg of landingSegments(container, markerHidingMode(container))) {
405
553
  if (seg.len === 0)
@@ -409,29 +557,29 @@ export function landableStartAbutsIsland(container) {
409
557
  continue;
410
558
  return true;
411
559
  }
412
- if (inAmbientIsland(seg.node, container))
560
+ if (inMarkerPrefix(seg.node, container))
413
561
  continue;
414
562
  return false;
415
563
  }
416
564
  return false;
417
565
  }
418
- /** Whether `node` is an atomic inline widget's element — the island every walk treats as opaque.
419
- * 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. */
420
568
  export function isAtomicInlineWidget(node) {
421
569
  return node.nodeType === Node.ELEMENT_NODE && node.hasAttribute(WIDGET_ATTR);
422
570
  }
423
571
  // ── Internal ─────────────────────────────────────────────────────────────────
424
572
  const FOCUSED_HOST_SELECTOR = '.block-host[data-focused]';
425
- /** The editor root's effective mode when it hides markers; null in source mode, which
426
- * 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. */
427
575
  function markerHidingMode(container) {
428
576
  if (!(container instanceof Element))
429
577
  return null;
430
578
  const mode = asPresentationMode(container.closest('[data-presentation]')?.getAttribute('data-presentation'));
431
579
  return hidesMarkers(mode) ? mode : null;
432
580
  }
433
- /** Nearest ancestor between `node` and `root` whose own text is marker chrome, with the family
434
- * 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. */
435
583
  function markerRootOf(node, root) {
436
584
  for (let el = node.parentElement; el && el !== root; el = el.parentElement) {
437
585
  const family = markerFamilyOf(el);
@@ -440,29 +588,27 @@ function markerRootOf(node, root) {
440
588
  }
441
589
  return null;
442
590
  }
443
- /** 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. */
444
592
  function chromeStandsAloneUnder(root, mode) {
445
593
  if (mode === null || !(root instanceof Element))
446
594
  return false;
447
595
  return screenVisibility(mode, { chromePaints: chromeStampPaints(root) }).chromePaints;
448
596
  }
449
597
  /**
450
- * Whether `node` is inside the leading ambient marker island — a container's `- ` / `1. ` prefix,
451
- * the one inert island whose far side IS raw 0. Every other opaque island (a widget, a
452
- * 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.
453
600
  */
454
- function inAmbientIsland(node, root) {
601
+ function inMarkerPrefix(node, root) {
455
602
  for (let el = node.parentElement; el && el !== root; el = el.parentElement) {
456
- if (el.classList.contains('md-marker') && el.getAttribute('contenteditable') === 'false') {
603
+ if (isMarkerPrefixSpan(el))
457
604
  return true;
458
- }
459
605
  }
460
606
  return false;
461
607
  }
462
608
  function hidesOwnText(el, mode, chromePaints) {
463
609
  const family = markerFamilyOf(el);
464
- // The shared rule first (the stylesheet's `[data-content-empty]` override among it); the
465
- // 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.
466
612
  if (family === null || !familyHidesText(family, screenVisibility(mode, { chromePaints })))
467
613
  return false;
468
614
  if (mode !== 'preview-block' && mode !== 'preview-inline')
@@ -471,8 +617,8 @@ function hidesOwnText(el, mode, chromePaints) {
471
617
  return true;
472
618
  if (mode === 'preview-block')
473
619
  return false;
474
- // preview-inline's unstamped-reveal arm is scoped to `.md-marker`, so a ref label reveals
475
- // 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.
476
622
  if (el.classList.contains('md-fence-line'))
477
623
  return false;
478
624
  if (el.classList.contains('md-ref-label'))
@@ -491,8 +637,8 @@ function snapOutOfRun(container, offset, side, mode) {
491
637
  }
492
638
  return asDomTextOffset(offset);
493
639
  }
494
- /** The landable DOM position beside a span the caret may not enter. Prefers an adjacent
495
- * 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. */
496
642
  function positionBeside(el, side) {
497
643
  const parent = el.parentNode;
498
644
  if (!parent)
@@ -502,28 +648,38 @@ function positionBeside(el, side) {
502
648
  return { node: sibling, offset: side === 'before' ? (sibling.textContent?.length ?? 0) : 0 };
503
649
  }
504
650
  const idx = Array.prototype.indexOf.call(parent.childNodes, el);
505
- // A pending hard break's first anchor (`inline-render.ts`) ends the line the marker sat on;
506
- // 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.
507
653
  if (side === 'after' && isBreakAnchor(sibling))
508
654
  return { node: parent, offset: idx + 2 };
655
+ if (side === 'before' && isBreakAnchor(sibling) && isBreakAnchor(sibling.previousSibling)) {
656
+ return { node: parent, offset: idx - 1 };
657
+ }
509
658
  return { node: parent, offset: side === 'before' ? idx : idx + 1 };
510
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
+ }
511
672
  function isBreakAnchor(node) {
512
673
  return (node instanceof HTMLElement && node.tagName === 'BR' && node.dataset.caretAnchor === 'break');
513
674
  }
514
- /**
515
- * The classification every walk-space consumer shares: a text node contributes its textContent
516
- * length, an atomic widget its raw source length (never descended), any other element is
517
- * transparent. Hidden marker text counts exactly like visible text — hiding is CSS-only so the
518
- * coordinate space survives it — and carries the span that hides it. Offsets stay plain numbers;
519
- * consumers mint the `DomTextOffset` brand.
520
- */
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. */
521
677
  function* walkSegments(root, mode) {
522
678
  let count = 0;
523
679
  // One read per walk, not one `closest` per element: every caller passes the walk container.
524
680
  const chromePaints = chromeStandsAloneUnder(root, mode);
525
681
  const stack = [];
526
- // 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.
527
683
  const pushChildren = (parent, hiddenRoot) => {
528
684
  const children = parent.childNodes;
529
685
  for (let i = children.length - 1; i >= 0; i--)
@@ -550,23 +706,32 @@ function* walkSegments(root, mode) {
550
706
  pushChildren(el, hiddenRoot ?? (mode !== null && hidesOwnText(el, mode, chromePaints) ? el : null));
551
707
  }
552
708
  }
553
- /** 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. */
554
710
  function opaqueSegment(el, start, len, hidden) {
555
711
  return { kind: 'opaque', hidden, first: el, last: el, start, len };
556
712
  }
557
- /**
558
- * The same walk as the caret sees it: landable text, and opaque spans it may not enter —
559
- * atomic widgets, plus MAXIMAL runs of hidden marker text, coalesced because snapping out of
560
- * one hidden span into the next would still leave the caret in unpainted text.
561
- */
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. */
562
715
  function* landingSegments(root, mode) {
563
716
  let run = null;
564
717
  for (const seg of walkSegments(root, mode)) {
565
- // A zero-contribution node cannot end a run: Chromium leaves empty text nodes between
566
- // 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.
567
720
  if (run && seg.len === 0)
568
721
  continue;
569
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
+ }
570
735
  if (run) {
571
736
  run.len += seg.len;
572
737
  run.last = seg.hiddenRoot;