@voithos-labs/aragonite 0.10.1

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 (900) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +365 -0
  3. package/THIRD-PARTY-NOTICES.md +102 -0
  4. package/dist/a11y-strings.d.ts +46 -0
  5. package/dist/a11y-strings.js +62 -0
  6. package/dist/action-contracts.d.ts +301 -0
  7. package/dist/action-contracts.js +5 -0
  8. package/dist/active-editor.d.ts +16 -0
  9. package/dist/active-editor.js +67 -0
  10. package/dist/ambient/ambient-cursor.d.ts +41 -0
  11. package/dist/ambient/ambient-cursor.js +120 -0
  12. package/dist/ambient/ambient-dom.d.ts +9 -0
  13. package/dist/ambient/ambient-dom.js +102 -0
  14. package/dist/assert.d.ts +6 -0
  15. package/dist/assert.js +17 -0
  16. package/dist/block-component.d.ts +274 -0
  17. package/dist/block-component.js +43 -0
  18. package/dist/block-id.d.ts +14 -0
  19. package/dist/block-id.js +34 -0
  20. package/dist/bounded-memo.d.ts +14 -0
  21. package/dist/bounded-memo.js +32 -0
  22. package/dist/components/BlockDragHandle.svelte +66 -0
  23. package/dist/components/BlockDragHandle.svelte.d.ts +18 -0
  24. package/dist/components/BlockHost.svelte +328 -0
  25. package/dist/components/BlockHost.svelte.d.ts +15 -0
  26. package/dist/components/BlockList.svelte +114 -0
  27. package/dist/components/BlockList.svelte.d.ts +16 -0
  28. package/dist/components/DecorationOverlay.svelte +156 -0
  29. package/dist/components/DecorationOverlay.svelte.d.ts +14 -0
  30. package/dist/components/Editor.svelte +1849 -0
  31. package/dist/components/Editor.svelte.d.ts +49 -0
  32. package/dist/components/GapCaret.svelte +226 -0
  33. package/dist/components/GapCaret.svelte.d.ts +9 -0
  34. package/dist/components/SearchBar.svelte +243 -0
  35. package/dist/components/SearchBar.svelte.d.ts +7 -0
  36. package/dist/components/SelectionOverlay.svelte +171 -0
  37. package/dist/components/SelectionOverlay.svelte.d.ts +14 -0
  38. package/dist/components/block-content-selector.d.ts +12 -0
  39. package/dist/components/block-content-selector.js +12 -0
  40. package/dist/components/blocks/BlockquoteBlock.svelte +32 -0
  41. package/dist/components/blocks/BlockquoteBlock.svelte.d.ts +11 -0
  42. package/dist/components/blocks/ThematicBreakBlock.svelte +156 -0
  43. package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +17 -0
  44. package/dist/components/blocks/code/CodeBlock.svelte +726 -0
  45. package/dist/components/blocks/code/CodeBlock.svelte.d.ts +23 -0
  46. package/dist/components/blocks/code/CodeLanguageChip.svelte +127 -0
  47. package/dist/components/blocks/code/CodeLanguageChip.svelte.d.ts +14 -0
  48. package/dist/components/blocks/code/code-beforeinput.d.ts +30 -0
  49. package/dist/components/blocks/code/code-beforeinput.js +40 -0
  50. package/dist/components/blocks/code/code-bootstrap.d.ts +8 -0
  51. package/dist/components/blocks/code/code-bootstrap.js +54 -0
  52. package/dist/components/blocks/code/code-editing.d.ts +28 -0
  53. package/dist/components/blocks/code/code-editing.js +79 -0
  54. package/dist/components/blocks/code/code-enter.d.ts +22 -0
  55. package/dist/components/blocks/code/code-enter.js +19 -0
  56. package/dist/components/blocks/code/code-fence-boundary.d.ts +77 -0
  57. package/dist/components/blocks/code/code-fence-boundary.js +169 -0
  58. package/dist/components/blocks/code/code-fence-exit.d.ts +24 -0
  59. package/dist/components/blocks/code/code-fence-exit.js +36 -0
  60. package/dist/components/blocks/code/code-indent.d.ts +14 -0
  61. package/dist/components/blocks/code/code-indent.js +87 -0
  62. package/dist/components/blocks/code/code-languages.d.ts +15 -0
  63. package/dist/components/blocks/code/code-languages.js +30 -0
  64. package/dist/components/blocks/code/code-paste-surface.d.ts +6 -0
  65. package/dist/components/blocks/code/code-paste-surface.js +29 -0
  66. package/dist/components/blocks/code/code-paste.d.ts +24 -0
  67. package/dist/components/blocks/code/code-paste.js +21 -0
  68. package/dist/components/blocks/code/code-renderer.d.ts +18 -0
  69. package/dist/components/blocks/code/code-renderer.js +249 -0
  70. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +51 -0
  71. package/dist/components/blocks/directive/DirectiveContainerBlock.svelte.d.ts +11 -0
  72. package/dist/components/blocks/directive/activate-directives.d.ts +7 -0
  73. package/dist/components/blocks/directive/activate-directives.js +23 -0
  74. package/dist/components/blocks/editable-leaf.d.ts +126 -0
  75. package/dist/components/blocks/editable-leaf.js +410 -0
  76. package/dist/components/blocks/editable-surface.d.ts +209 -0
  77. package/dist/components/blocks/editable-surface.js +331 -0
  78. package/dist/components/blocks/list/ListBlock.svelte +162 -0
  79. package/dist/components/blocks/list/ListBlock.svelte.d.ts +11 -0
  80. package/dist/components/blocks/list/ListItemBlock.svelte +324 -0
  81. package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +14 -0
  82. package/dist/components/blocks/list/task-checkbox.d.ts +3 -0
  83. package/dist/components/blocks/list/task-checkbox.js +33 -0
  84. package/dist/components/blocks/plain-text-backend.d.ts +21 -0
  85. package/dist/components/blocks/plain-text-backend.js +47 -0
  86. package/dist/components/blocks/surface-wiring.svelte.d.ts +18 -0
  87. package/dist/components/blocks/surface-wiring.svelte.js +68 -0
  88. package/dist/components/blocks/table/TableActionMenu.svelte +267 -0
  89. package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +15 -0
  90. package/dist/components/blocks/table/TableBlock.svelte +765 -0
  91. package/dist/components/blocks/table/TableBlock.svelte.d.ts +30 -0
  92. package/dist/components/blocks/table/TableCellBlock.svelte +1075 -0
  93. package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +30 -0
  94. package/dist/components/blocks/table/TableGrip.svelte +91 -0
  95. package/dist/components/blocks/table/TableGrip.svelte.d.ts +8 -0
  96. package/dist/components/blocks/table/TableRowBlock.svelte +233 -0
  97. package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +34 -0
  98. package/dist/components/blocks/table/cell-clipboard.d.ts +23 -0
  99. package/dist/components/blocks/table/cell-clipboard.js +34 -0
  100. package/dist/components/blocks/table/cell-keydown-plan.d.ts +37 -0
  101. package/dist/components/blocks/table/cell-keydown-plan.js +66 -0
  102. package/dist/components/blocks/table/cell-pointer.d.ts +58 -0
  103. package/dist/components/blocks/table/cell-pointer.js +153 -0
  104. package/dist/components/blocks/table/cell-render.d.ts +51 -0
  105. package/dist/components/blocks/table/cell-render.js +98 -0
  106. package/dist/components/blocks/table/cell-table-commands.d.ts +12 -0
  107. package/dist/components/blocks/table/cell-table-commands.js +21 -0
  108. package/dist/components/blocks/table/cell-x-mapping.d.ts +6 -0
  109. package/dist/components/blocks/table/cell-x-mapping.js +16 -0
  110. package/dist/components/blocks/table/selected-cells.d.ts +19 -0
  111. package/dist/components/blocks/table/selected-cells.js +35 -0
  112. package/dist/components/blocks/table/table-caret-at-point.d.ts +8 -0
  113. package/dist/components/blocks/table/table-caret-at-point.js +35 -0
  114. package/dist/components/blocks/table/table-cell-paste.d.ts +16 -0
  115. package/dist/components/blocks/table/table-cell-paste.js +75 -0
  116. package/dist/components/blocks/table/table-drag-hit-test.d.ts +5 -0
  117. package/dist/components/blocks/table/table-drag-hit-test.js +20 -0
  118. package/dist/components/blocks/table/table-drop-target.d.ts +1 -0
  119. package/dist/components/blocks/table/table-drop-target.js +16 -0
  120. package/dist/components/blocks/table/table-menu-model.d.ts +52 -0
  121. package/dist/components/blocks/table/table-menu-model.js +78 -0
  122. package/dist/components/blocks/table/table-navigation.d.ts +8 -0
  123. package/dist/components/blocks/table/table-navigation.js +22 -0
  124. package/dist/components/blocks/table/table-reorder-drag.d.ts +78 -0
  125. package/dist/components/blocks/table/table-reorder-drag.js +97 -0
  126. package/dist/components/blocks/text/TextEditableBlock.svelte +1012 -0
  127. package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +33 -0
  128. package/dist/components/blocks/text/click-snap-guard.d.ts +8 -0
  129. package/dist/components/blocks/text/click-snap-guard.js +19 -0
  130. package/dist/components/blocks/text/composition-seat.d.ts +50 -0
  131. package/dist/components/blocks/text/composition-seat.js +65 -0
  132. package/dist/components/blocks/text/construct-edge-delete.d.ts +47 -0
  133. package/dist/components/blocks/text/construct-edge-delete.js +164 -0
  134. package/dist/components/blocks/text/construct-reveal.d.ts +39 -0
  135. package/dist/components/blocks/text/construct-reveal.js +164 -0
  136. package/dist/components/blocks/text/edge-policy-dispatch.d.ts +91 -0
  137. package/dist/components/blocks/text/edge-policy-dispatch.js +457 -0
  138. package/dist/components/blocks/text/edge-seat.d.ts +42 -0
  139. package/dist/components/blocks/text/edge-seat.js +197 -0
  140. package/dist/components/blocks/text/hidden-suffix.d.ts +10 -0
  141. package/dist/components/blocks/text/hidden-suffix.js +15 -0
  142. package/dist/components/blocks/text/link-at-point.d.ts +33 -0
  143. package/dist/components/blocks/text/link-at-point.js +47 -0
  144. package/dist/components/blocks/text/link-source-bytes.d.ts +37 -0
  145. package/dist/components/blocks/text/link-source-bytes.js +161 -0
  146. package/dist/components/blocks/text/live-join-seam.d.ts +15 -0
  147. package/dist/components/blocks/text/live-join-seam.js +327 -0
  148. package/dist/components/blocks/text/live-selection-edit.d.ts +68 -0
  149. package/dist/components/blocks/text/live-selection-edit.js +120 -0
  150. package/dist/components/blocks/text/live-split-rebalance.d.ts +56 -0
  151. package/dist/components/blocks/text/live-split-rebalance.js +239 -0
  152. package/dist/components/blocks/text/marker-completion.d.ts +18 -0
  153. package/dist/components/blocks/text/marker-completion.js +29 -0
  154. package/dist/components/blocks/text/pending-mark-insert.d.ts +37 -0
  155. package/dist/components/blocks/text/pending-mark-insert.js +188 -0
  156. package/dist/components/blocks/text/screen-diff.d.ts +20 -0
  157. package/dist/components/blocks/text/screen-diff.js +39 -0
  158. package/dist/components/blocks/text/text-clipboard.d.ts +70 -0
  159. package/dist/components/blocks/text/text-clipboard.js +131 -0
  160. package/dist/components/blocks/text/text-keydown.d.ts +39 -0
  161. package/dist/components/blocks/text/text-keydown.js +80 -0
  162. package/dist/components/blocks/text/text-render.d.ts +67 -0
  163. package/dist/components/blocks/text/text-render.js +215 -0
  164. package/dist/components/blocks/text/widget-adjacency.d.ts +30 -0
  165. package/dist/components/blocks/text/widget-adjacency.js +68 -0
  166. package/dist/components/blocks/text/widget-interaction.d.ts +90 -0
  167. package/dist/components/blocks/text/widget-interaction.js +591 -0
  168. package/dist/components/blocks/widget-portal.d.ts +54 -0
  169. package/dist/components/blocks/widget-portal.js +136 -0
  170. package/dist/components/built-in-blocks.d.ts +7 -0
  171. package/dist/components/built-in-blocks.js +77 -0
  172. package/dist/components/editor-root-clipboard.d.ts +29 -0
  173. package/dist/components/editor-root-clipboard.js +105 -0
  174. package/dist/components/editor-root-keydown.d.ts +47 -0
  175. package/dist/components/editor-root-keydown.js +88 -0
  176. package/dist/components/editor-root-listeners.d.ts +44 -0
  177. package/dist/components/editor-root-listeners.js +112 -0
  178. package/dist/components/image/ImageOverlayHost.svelte +115 -0
  179. package/dist/components/image/ImageOverlayHost.svelte.d.ts +20 -0
  180. package/dist/components/image/ImageProperties.svelte +153 -0
  181. package/dist/components/image/ImageProperties.svelte.d.ts +14 -0
  182. package/dist/components/image/ImageResizeHandles.svelte +188 -0
  183. package/dist/components/image/ImageResizeHandles.svelte.d.ts +10 -0
  184. package/dist/components/image/image-edit-commit.d.ts +38 -0
  185. package/dist/components/image/image-edit-commit.js +159 -0
  186. package/dist/components/image/image-resize.d.ts +11 -0
  187. package/dist/components/image/image-resize.js +38 -0
  188. package/dist/components/image/image-source-bytes.d.ts +15 -0
  189. package/dist/components/image/image-source-bytes.js +73 -0
  190. package/dist/components/image/image-widget-editing.d.ts +7 -0
  191. package/dist/components/image/image-widget-editing.js +41 -0
  192. package/dist/components/image/widget-dom.d.ts +11 -0
  193. package/dist/components/image/widget-dom.js +110 -0
  194. package/dist/components/image/widget-selection-state.svelte.d.ts +18 -0
  195. package/dist/components/image/widget-selection-state.svelte.js +26 -0
  196. package/dist/components/link-card/LinkCard.svelte +190 -0
  197. package/dist/components/link-card/LinkCard.svelte.d.ts +18 -0
  198. package/dist/components/link-card/LinkCardHost.svelte +181 -0
  199. package/dist/components/link-card/LinkCardHost.svelte.d.ts +25 -0
  200. package/dist/components/link-card/link-card-commit.d.ts +50 -0
  201. package/dist/components/link-card/link-card-commit.js +134 -0
  202. package/dist/components/link-card/link-card-entry.d.ts +39 -0
  203. package/dist/components/link-card/link-card-entry.js +51 -0
  204. package/dist/components/link-card/link-card-state.svelte.d.ts +44 -0
  205. package/dist/components/link-card/link-card-state.svelte.js +46 -0
  206. package/dist/components/lrd-map-gate.d.ts +18 -0
  207. package/dist/components/lrd-map-gate.js +22 -0
  208. package/dist/components/paste-image-arm.d.ts +29 -0
  209. package/dist/components/paste-image-arm.js +61 -0
  210. package/dist/components/portal.d.ts +11 -0
  211. package/dist/components/portal.js +29 -0
  212. package/dist/core/directive/activate.d.ts +8 -0
  213. package/dist/core/directive/activate.js +25 -0
  214. package/dist/core/directive/container-opener.d.ts +7 -0
  215. package/dist/core/directive/container-opener.js +162 -0
  216. package/dist/core/directive/grammar.d.ts +50 -0
  217. package/dist/core/directive/grammar.js +88 -0
  218. package/dist/core/directive/kinds.d.ts +31 -0
  219. package/dist/core/directive/kinds.js +137 -0
  220. package/dist/core/directive/registry.d.ts +39 -0
  221. package/dist/core/directive/registry.js +49 -0
  222. package/dist/core/directive/text-recognizer.d.ts +8 -0
  223. package/dist/core/directive/text-recognizer.js +87 -0
  224. package/dist/core/escapable.d.ts +6 -0
  225. package/dist/core/escapable.js +6 -0
  226. package/dist/core/inline/backticks.d.ts +16 -0
  227. package/dist/core/inline/backticks.js +62 -0
  228. package/dist/core/inline/character-refs.d.ts +7 -0
  229. package/dist/core/inline/character-refs.js +70 -0
  230. package/dist/core/inline/destination-bytes.d.ts +7 -0
  231. package/dist/core/inline/destination-bytes.js +14 -0
  232. package/dist/core/inline/entity-widget.d.ts +11 -0
  233. package/dist/core/inline/entity-widget.js +21 -0
  234. package/dist/core/inline/format-toggle.d.ts +50 -0
  235. package/dist/core/inline/format-toggle.js +533 -0
  236. package/dist/core/inline/html-entities.d.ts +8 -0
  237. package/dist/core/inline/html-entities.js +2134 -0
  238. package/dist/core/inline/html-tag-grammar.d.ts +16 -0
  239. package/dist/core/inline/html-tag-grammar.js +58 -0
  240. package/dist/core/inline/image-dimensions.d.ts +6 -0
  241. package/dist/core/inline/image-dimensions.js +42 -0
  242. package/dist/core/inline/index.d.ts +42 -0
  243. package/dist/core/inline/index.js +77 -0
  244. package/dist/core/inline/inline-cache.d.ts +20 -0
  245. package/dist/core/inline/inline-cache.js +28 -0
  246. package/dist/core/inline/inline-widgets.d.ts +124 -0
  247. package/dist/core/inline/inline-widgets.js +131 -0
  248. package/dist/core/inline/link-reference-resolver.d.ts +21 -0
  249. package/dist/core/inline/link-reference-resolver.js +46 -0
  250. package/dist/core/inline/raw-html-widget.d.ts +10 -0
  251. package/dist/core/inline/raw-html-widget.js +22 -0
  252. package/dist/core/inline/scan/autolinks.d.ts +23 -0
  253. package/dist/core/inline/scan/autolinks.js +354 -0
  254. package/dist/core/inline/scan/brackets.d.ts +11 -0
  255. package/dist/core/inline/scan/brackets.js +284 -0
  256. package/dist/core/inline/scan/code-spans.d.ts +7 -0
  257. package/dist/core/inline/scan/code-spans.js +27 -0
  258. package/dist/core/inline/scan/emphasis.d.ts +10 -0
  259. package/dist/core/inline/scan/emphasis.js +276 -0
  260. package/dist/core/inline/scan/index.d.ts +7 -0
  261. package/dist/core/inline/scan/index.js +176 -0
  262. package/dist/core/inline/scan/plugin-syntax.d.ts +62 -0
  263. package/dist/core/inline/scan/plugin-syntax.js +150 -0
  264. package/dist/core/inline/scan/scan-state.d.ts +47 -0
  265. package/dist/core/inline/scan/scan-state.js +48 -0
  266. package/dist/core/inline/scan/simple-nodes.d.ts +14 -0
  267. package/dist/core/inline/scan/simple-nodes.js +53 -0
  268. package/dist/core/inline/scan/url.d.ts +12 -0
  269. package/dist/core/inline/scan/url.js +82 -0
  270. package/dist/core/inline/transparency.d.ts +8 -0
  271. package/dist/core/inline/transparency.js +39 -0
  272. package/dist/core/inline/visibility.d.ts +81 -0
  273. package/dist/core/inline/visibility.js +144 -0
  274. package/dist/core/inline/walk.d.ts +14 -0
  275. package/dist/core/inline/walk.js +29 -0
  276. package/dist/core/inline-render.d.ts +48 -0
  277. package/dist/core/inline-render.js +322 -0
  278. package/dist/core/lines.d.ts +44 -0
  279. package/dist/core/lines.js +91 -0
  280. package/dist/core/node-views.d.ts +22 -0
  281. package/dist/core/node-views.js +8 -0
  282. package/dist/core/nodes.d.ts +297 -0
  283. package/dist/core/nodes.js +83 -0
  284. package/dist/core/parser.d.ts +68 -0
  285. package/dist/core/parser.js +189 -0
  286. package/dist/core/parsers/blockquote.d.ts +17 -0
  287. package/dist/core/parsers/blockquote.js +69 -0
  288. package/dist/core/parsers/built-in-openers.d.ts +8 -0
  289. package/dist/core/parsers/built-in-openers.js +124 -0
  290. package/dist/core/parsers/fence-syntax.d.ts +24 -0
  291. package/dist/core/parsers/fence-syntax.js +44 -0
  292. package/dist/core/parsers/fenced-code.d.ts +7 -0
  293. package/dist/core/parsers/fenced-code.js +29 -0
  294. package/dist/core/parsers/heading.d.ts +3 -0
  295. package/dist/core/parsers/heading.js +6 -0
  296. package/dist/core/parsers/html-block.d.ts +17 -0
  297. package/dist/core/parsers/html-block.js +94 -0
  298. package/dist/core/parsers/indented-code.d.ts +4 -0
  299. package/dist/core/parsers/indented-code.js +41 -0
  300. package/dist/core/parsers/link-reference.d.ts +7 -0
  301. package/dist/core/parsers/link-reference.js +152 -0
  302. package/dist/core/parsers/list.d.ts +19 -0
  303. package/dist/core/parsers/list.js +133 -0
  304. package/dist/core/parsers/paragraph.d.ts +10 -0
  305. package/dist/core/parsers/paragraph.js +42 -0
  306. package/dist/core/parsers/table-completion.d.ts +13 -0
  307. package/dist/core/parsers/table-completion.js +48 -0
  308. package/dist/core/parsers/table.d.ts +18 -0
  309. package/dist/core/parsers/table.js +110 -0
  310. package/dist/core/parsers/thematic-break.d.ts +1 -0
  311. package/dist/core/parsers/thematic-break.js +19 -0
  312. package/dist/core/serializer.d.ts +15 -0
  313. package/dist/core/serializer.js +11 -0
  314. package/dist/core/terminator-escalation.d.ts +8 -0
  315. package/dist/core/terminator-escalation.js +18 -0
  316. package/dist/core/url-policy.d.ts +14 -0
  317. package/dist/core/url-policy.js +44 -0
  318. package/dist/cursor/content-offsets.d.ts +29 -0
  319. package/dist/cursor/content-offsets.js +151 -0
  320. package/dist/cursor/coordinate-spaces.d.ts +65 -0
  321. package/dist/cursor/coordinate-spaces.js +66 -0
  322. package/dist/cursor/dom-walk.d.ts +18 -0
  323. package/dist/cursor/dom-walk.js +31 -0
  324. package/dist/cursor/edge-affinity.d.ts +44 -0
  325. package/dist/cursor/edge-affinity.js +60 -0
  326. package/dist/cursor/focused-caret.d.ts +10 -0
  327. package/dist/cursor/focused-caret.js +24 -0
  328. package/dist/cursor/height-model.d.ts +24 -0
  329. package/dist/cursor/height-model.js +72 -0
  330. package/dist/cursor/height-oracle.d.ts +24 -0
  331. package/dist/cursor/height-oracle.js +94 -0
  332. package/dist/cursor/overlay-rects.d.ts +8 -0
  333. package/dist/cursor/overlay-rects.js +19 -0
  334. package/dist/cursor/overlay-remeasure.d.ts +17 -0
  335. package/dist/cursor/overlay-remeasure.js +31 -0
  336. package/dist/cursor/pending-marks.d.ts +24 -0
  337. package/dist/cursor/pending-marks.js +36 -0
  338. package/dist/cursor/point-offset.d.ts +21 -0
  339. package/dist/cursor/point-offset.js +48 -0
  340. package/dist/cursor/reveal-anchor.d.ts +30 -0
  341. package/dist/cursor/reveal-anchor.js +31 -0
  342. package/dist/cursor/reveal-source.d.ts +35 -0
  343. package/dist/cursor/reveal-source.js +51 -0
  344. package/dist/cursor/scroll-ancestors.d.ts +28 -0
  345. package/dist/cursor/scroll-ancestors.js +89 -0
  346. package/dist/cursor/scrollport.d.ts +20 -0
  347. package/dist/cursor/scrollport.js +41 -0
  348. package/dist/cursor/sticky-column.d.ts +35 -0
  349. package/dist/cursor/sticky-column.js +64 -0
  350. package/dist/cursor/sticky-measure.d.ts +16 -0
  351. package/dist/cursor/sticky-measure.js +97 -0
  352. package/dist/cursor/typography-estimates.d.ts +21 -0
  353. package/dist/cursor/typography-estimates.js +21 -0
  354. package/dist/cursor/visual-lines.d.ts +25 -0
  355. package/dist/cursor/visual-lines.js +125 -0
  356. package/dist/cursor/widget-offset.d.ts +132 -0
  357. package/dist/cursor/widget-offset.js +543 -0
  358. package/dist/debug/diagnostics-report.d.ts +17 -0
  359. package/dist/debug/diagnostics-report.js +25 -0
  360. package/dist/debug/dump-tree.d.ts +6 -0
  361. package/dist/debug/dump-tree.js +114 -0
  362. package/dist/debug/inspect.d.ts +19 -0
  363. package/dist/debug/inspect.js +116 -0
  364. package/dist/debug/interaction-trace.d.ts +39 -0
  365. package/dist/debug/interaction-trace.js +105 -0
  366. package/dist/debug/operations-log.d.ts +14 -0
  367. package/dist/debug/operations-log.js +30 -0
  368. package/dist/decorations/buckets.d.ts +40 -0
  369. package/dist/decorations/buckets.js +87 -0
  370. package/dist/decorations/decoration-state.svelte.d.ts +20 -0
  371. package/dist/decorations/decoration-state.svelte.js +195 -0
  372. package/dist/decorations/island-dom.d.ts +35 -0
  373. package/dist/decorations/island-dom.js +148 -0
  374. package/dist/decorations/reserved-attrs.d.ts +12 -0
  375. package/dist/decorations/reserved-attrs.js +47 -0
  376. package/dist/decorations/types.d.ts +68 -0
  377. package/dist/decorations/types.js +5 -0
  378. package/dist/decorations/widget-dom.d.ts +15 -0
  379. package/dist/decorations/widget-dom.js +35 -0
  380. package/dist/dev-warn.d.ts +13 -0
  381. package/dist/dev-warn.js +28 -0
  382. package/dist/editor-actions/ancestry-folds.d.ts +32 -0
  383. package/dist/editor-actions/ancestry-folds.js +106 -0
  384. package/dist/editor-actions/block-edit-core.d.ts +29 -0
  385. package/dist/editor-actions/block-edit-core.js +277 -0
  386. package/dist/editor-actions/block-edit-scope.d.ts +79 -0
  387. package/dist/editor-actions/block-edit-scope.js +76 -0
  388. package/dist/editor-actions/block-edit.d.ts +8 -0
  389. package/dist/editor-actions/block-edit.js +111 -0
  390. package/dist/editor-actions/commit/history.d.ts +9 -0
  391. package/dist/editor-actions/commit/history.js +77 -0
  392. package/dist/editor-actions/commit/text-batch.d.ts +34 -0
  393. package/dist/editor-actions/commit/text-batch.js +61 -0
  394. package/dist/editor-actions/commit/undo-controller.d.ts +7 -0
  395. package/dist/editor-actions/commit/undo-controller.js +570 -0
  396. package/dist/editor-actions/container-block-component.d.ts +85 -0
  397. package/dist/editor-actions/container-block-component.js +228 -0
  398. package/dist/editor-actions/container-edit.d.ts +7 -0
  399. package/dist/editor-actions/container-edit.js +49 -0
  400. package/dist/editor-actions/container-exit-overrides.d.ts +16 -0
  401. package/dist/editor-actions/container-exit-overrides.js +38 -0
  402. package/dist/editor-actions/deps.d.ts +60 -0
  403. package/dist/editor-actions/deps.js +1 -0
  404. package/dist/editor-actions/enter-completion.d.ts +25 -0
  405. package/dist/editor-actions/enter-completion.js +76 -0
  406. package/dist/editor-actions/focus/focus-dispatch.d.ts +36 -0
  407. package/dist/editor-actions/focus/focus-dispatch.js +106 -0
  408. package/dist/editor-actions/focus/focus-landing.d.ts +7 -0
  409. package/dist/editor-actions/focus/focus-landing.js +39 -0
  410. package/dist/editor-actions/focus/focus.d.ts +7 -0
  411. package/dist/editor-actions/focus/focus.js +74 -0
  412. package/dist/editor-actions/index.d.ts +15 -0
  413. package/dist/editor-actions/index.js +19 -0
  414. package/dist/editor-actions/inline-range-commit.d.ts +20 -0
  415. package/dist/editor-actions/inline-range-commit.js +63 -0
  416. package/dist/editor-actions/list-context.d.ts +25 -0
  417. package/dist/editor-actions/list-context.js +285 -0
  418. package/dist/editor-actions/list-overrides.d.ts +13 -0
  419. package/dist/editor-actions/list-overrides.js +26 -0
  420. package/dist/editor-actions/merge-fallback.d.ts +19 -0
  421. package/dist/editor-actions/merge-fallback.js +27 -0
  422. package/dist/editor-actions/nested/nested-actions.d.ts +65 -0
  423. package/dist/editor-actions/nested/nested-actions.js +59 -0
  424. package/dist/editor-actions/nested/nested-block-edit.d.ts +10 -0
  425. package/dist/editor-actions/nested/nested-block-edit.js +181 -0
  426. package/dist/editor-actions/nested/nested-focus.d.ts +9 -0
  427. package/dist/editor-actions/nested/nested-focus.js +30 -0
  428. package/dist/editor-actions/paste-coordinator.d.ts +4 -0
  429. package/dist/editor-actions/paste-coordinator.js +20 -0
  430. package/dist/editor-actions/plugin/chrome-leaf.d.ts +25 -0
  431. package/dist/editor-actions/plugin/chrome-leaf.js +80 -0
  432. package/dist/editor-actions/plugin/container.d.ts +137 -0
  433. package/dist/editor-actions/plugin/container.js +351 -0
  434. package/dist/editor-actions/plugin/directive-container.d.ts +13 -0
  435. package/dist/editor-actions/plugin/directive-container.js +31 -0
  436. package/dist/editor-actions/reorder-action.d.ts +17 -0
  437. package/dist/editor-actions/reorder-action.js +104 -0
  438. package/dist/editor-actions/reorder-drag.d.ts +34 -0
  439. package/dist/editor-actions/reorder-drag.js +152 -0
  440. package/dist/editor-actions/replacement-focus.d.ts +27 -0
  441. package/dist/editor-actions/replacement-focus.js +60 -0
  442. package/dist/editor-actions/search-replace.d.ts +6 -0
  443. package/dist/editor-actions/search-replace.js +145 -0
  444. package/dist/editor-actions/table-context.d.ts +34 -0
  445. package/dist/editor-actions/table-context.js +292 -0
  446. package/dist/editor-actions/unwrap-strategies.d.ts +14 -0
  447. package/dist/editor-actions/unwrap-strategies.js +131 -0
  448. package/dist/editor-actions/whole-block-focus-surface.d.ts +51 -0
  449. package/dist/editor-actions/whole-block-focus-surface.js +171 -0
  450. package/dist/editor-events.d.ts +89 -0
  451. package/dist/editor-events.js +96 -0
  452. package/dist/editor-keys.d.ts +197 -0
  453. package/dist/editor-keys.js +40 -0
  454. package/dist/editor-props.d.ts +164 -0
  455. package/dist/editor-props.js +1 -0
  456. package/dist/editor-rects.d.ts +58 -0
  457. package/dist/editor-rects.js +114 -0
  458. package/dist/env.d.ts +12 -0
  459. package/dist/env.js +20 -0
  460. package/dist/index.d.ts +27 -0
  461. package/dist/index.js +19 -0
  462. package/dist/invariants/commit-paths.d.ts +10 -0
  463. package/dist/invariants/commit-paths.js +25 -0
  464. package/dist/invariants/commit-scope.d.ts +9 -0
  465. package/dist/invariants/commit-scope.js +16 -0
  466. package/dist/invariants/context-keys.d.ts +7 -0
  467. package/dist/invariants/context-keys.js +14 -0
  468. package/dist/invariants/descriptor.d.ts +10 -0
  469. package/dist/invariants/descriptor.js +24 -0
  470. package/dist/invariants/inline-transitions.d.ts +23 -0
  471. package/dist/invariants/inline-transitions.js +52 -0
  472. package/dist/invariants/install.d.ts +36 -0
  473. package/dist/invariants/install.js +66 -0
  474. package/dist/invariants/landable-caret.d.ts +12 -0
  475. package/dist/invariants/landable-caret.js +31 -0
  476. package/dist/invariants/marker-css-parity.d.ts +10 -0
  477. package/dist/invariants/marker-css-parity.js +87 -0
  478. package/dist/invariants/node-shape.d.ts +44 -0
  479. package/dist/invariants/node-shape.js +258 -0
  480. package/dist/invariants/registry.d.ts +126 -0
  481. package/dist/invariants/registry.js +349 -0
  482. package/dist/invariants/render-fidelity.d.ts +8 -0
  483. package/dist/invariants/render-fidelity.js +33 -0
  484. package/dist/invariants/selection-endpoints.d.ts +19 -0
  485. package/dist/invariants/selection-endpoints.js +78 -0
  486. package/dist/invariants/single-node-sink.d.ts +9 -0
  487. package/dist/invariants/single-node-sink.js +16 -0
  488. package/dist/invariants/snapshot-integrity.d.ts +17 -0
  489. package/dist/invariants/snapshot-integrity.js +24 -0
  490. package/dist/invariants/split-landing.d.ts +8 -0
  491. package/dist/invariants/split-landing.js +15 -0
  492. package/dist/invariants/structural-descriptor.d.ts +21 -0
  493. package/dist/invariants/structural-descriptor.js +50 -0
  494. package/dist/perf/instruments.d.ts +49 -0
  495. package/dist/perf/instruments.js +154 -0
  496. package/dist/perf/use-mount-gauge.svelte.d.ts +1 -0
  497. package/dist/perf/use-mount-gauge.svelte.js +15 -0
  498. package/dist/plugin.d.ts +102 -0
  499. package/dist/plugin.js +156 -0
  500. package/dist/plugins/admonitions/AdmonitionBlock.svelte +144 -0
  501. package/dist/plugins/admonitions/AdmonitionBlock.svelte.d.ts +11 -0
  502. package/dist/plugins/admonitions/admonition-kind.d.ts +8 -0
  503. package/dist/plugins/admonitions/admonition-kind.js +97 -0
  504. package/dist/plugins/admonitions/convert-document.d.ts +11 -0
  505. package/dist/plugins/admonitions/convert-document.js +39 -0
  506. package/dist/plugins/admonitions/gh-alert.d.ts +13 -0
  507. package/dist/plugins/admonitions/gh-alert.js +83 -0
  508. package/dist/plugins/admonitions/github-alert-kind.d.ts +12 -0
  509. package/dist/plugins/admonitions/github-alert-kind.js +125 -0
  510. package/dist/plugins/admonitions/index.d.ts +6 -0
  511. package/dist/plugins/admonitions/index.js +8 -0
  512. package/dist/plugins/admonitions/kinds.d.ts +26 -0
  513. package/dist/plugins/admonitions/kinds.js +18 -0
  514. package/dist/plugins/admonitions/register.d.ts +7 -0
  515. package/dist/plugins/admonitions/register.js +12 -0
  516. package/dist/plugins/details/DetailsBlock.svelte +129 -0
  517. package/dist/plugins/details/DetailsBlock.svelte.d.ts +11 -0
  518. package/dist/plugins/details/details-disclosure.svelte.d.ts +17 -0
  519. package/dist/plugins/details/details-disclosure.svelte.js +24 -0
  520. package/dist/plugins/details/details-kind.d.ts +25 -0
  521. package/dist/plugins/details/details-kind.js +237 -0
  522. package/dist/plugins/details/index.d.ts +2 -0
  523. package/dist/plugins/details/index.js +2 -0
  524. package/dist/plugins/details/register.d.ts +6 -0
  525. package/dist/plugins/details/register.js +15 -0
  526. package/dist/plugins/emoji/emoji-plugin.d.ts +2 -0
  527. package/dist/plugins/emoji/emoji-plugin.js +10 -0
  528. package/dist/plugins/emoji/emoji-recognizer.d.ts +18 -0
  529. package/dist/plugins/emoji/emoji-recognizer.js +63 -0
  530. package/dist/plugins/emoji/emoji-table.d.ts +1 -0
  531. package/dist/plugins/emoji/emoji-table.js +1919 -0
  532. package/dist/plugins/emoji/index.d.ts +3 -0
  533. package/dist/plugins/emoji/index.js +4 -0
  534. package/dist/plugins/footnotes/FootnoteDefinition.svelte +103 -0
  535. package/dist/plugins/footnotes/FootnoteDefinition.svelte.d.ts +13 -0
  536. package/dist/plugins/footnotes/FootnoteReference.svelte +50 -0
  537. package/dist/plugins/footnotes/FootnoteReference.svelte.d.ts +4 -0
  538. package/dist/plugins/footnotes/constants.d.ts +2 -0
  539. package/dist/plugins/footnotes/constants.js +4 -0
  540. package/dist/plugins/footnotes/footnote-definition.d.ts +14 -0
  541. package/dist/plugins/footnotes/footnote-definition.js +147 -0
  542. package/dist/plugins/footnotes/footnote-lookup.d.ts +9 -0
  543. package/dist/plugins/footnotes/footnote-lookup.js +33 -0
  544. package/dist/plugins/footnotes/footnote-numbering.d.ts +23 -0
  545. package/dist/plugins/footnotes/footnote-numbering.js +78 -0
  546. package/dist/plugins/footnotes/footnote-reference.d.ts +7 -0
  547. package/dist/plugins/footnotes/footnote-reference.js +54 -0
  548. package/dist/plugins/footnotes/footnotes-plugin.d.ts +7 -0
  549. package/dist/plugins/footnotes/footnotes-plugin.js +17 -0
  550. package/dist/plugins/footnotes/index.d.ts +5 -0
  551. package/dist/plugins/footnotes/index.js +6 -0
  552. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +17 -0
  553. package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +31 -0
  554. package/dist/plugins/highlight-occurrences/index.d.ts +1 -0
  555. package/dist/plugins/highlight-occurrences/index.js +1 -0
  556. package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +26 -0
  557. package/dist/plugins/highlight-occurrences/occurrence-source.js +54 -0
  558. package/dist/plugins/highlight-occurrences/occurrences.d.ts +33 -0
  559. package/dist/plugins/highlight-occurrences/occurrences.js +108 -0
  560. package/dist/plugins/latex/BlockMath.svelte +119 -0
  561. package/dist/plugins/latex/BlockMath.svelte.d.ts +21 -0
  562. package/dist/plugins/latex/MathInline.svelte +28 -0
  563. package/dist/plugins/latex/MathInline.svelte.d.ts +4 -0
  564. package/dist/plugins/latex/index.d.ts +3 -0
  565. package/dist/plugins/latex/index.js +4 -0
  566. package/dist/plugins/latex/latex-kind.d.ts +17 -0
  567. package/dist/plugins/latex/latex-kind.js +224 -0
  568. package/dist/plugins/latex/math-completion.d.ts +10 -0
  569. package/dist/plugins/latex/math-completion.js +19 -0
  570. package/dist/plugins/latex/math-renderer.d.ts +26 -0
  571. package/dist/plugins/latex/math-renderer.js +42 -0
  572. package/dist/plugins/latex/register.d.ts +10 -0
  573. package/dist/plugins/latex/register.js +23 -0
  574. package/dist/plugins/latex/renderer.d.ts +13 -0
  575. package/dist/plugins/latex/renderer.js +34 -0
  576. package/dist/plugins/mermaid/MermaidBlock.svelte +572 -0
  577. package/dist/plugins/mermaid/MermaidBlock.svelte.d.ts +11 -0
  578. package/dist/plugins/mermaid/index.d.ts +3 -0
  579. package/dist/plugins/mermaid/index.js +3 -0
  580. package/dist/plugins/mermaid/mermaid-kind.d.ts +38 -0
  581. package/dist/plugins/mermaid/mermaid-kind.js +176 -0
  582. package/dist/plugins/mermaid/mermaid-renderer.d.ts +28 -0
  583. package/dist/plugins/mermaid/mermaid-renderer.js +35 -0
  584. package/dist/plugins/mermaid/register.d.ts +10 -0
  585. package/dist/plugins/mermaid/register.js +20 -0
  586. package/dist/plugins/mermaid/renderer.d.ts +11 -0
  587. package/dist/plugins/mermaid/renderer.js +53 -0
  588. package/dist/plugins/parrot/ParrotBlock.svelte +342 -0
  589. package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +21 -0
  590. package/dist/plugins/parrot/index.d.ts +1 -0
  591. package/dist/plugins/parrot/index.js +2 -0
  592. package/dist/plugins/parrot/parrot-plugin.d.ts +3 -0
  593. package/dist/plugins/parrot/parrot-plugin.js +49 -0
  594. package/dist/plugins/toc/TocBlock.svelte +218 -0
  595. package/dist/plugins/toc/TocBlock.svelte.d.ts +24 -0
  596. package/dist/plugins/toc/heading-outline.d.ts +28 -0
  597. package/dist/plugins/toc/heading-outline.js +65 -0
  598. package/dist/plugins/toc/index.d.ts +2 -0
  599. package/dist/plugins/toc/index.js +2 -0
  600. package/dist/plugins/toc/navigation-queue.d.ts +12 -0
  601. package/dist/plugins/toc/navigation-queue.js +21 -0
  602. package/dist/plugins/toc/toc-plugin.d.ts +16 -0
  603. package/dist/plugins/toc/toc-plugin.js +71 -0
  604. package/dist/presentation-mode.d.ts +32 -0
  605. package/dist/presentation-mode.js +50 -0
  606. package/dist/reactivity/block-list-state.svelte.d.ts +22 -0
  607. package/dist/reactivity/block-list-state.svelte.js +46 -0
  608. package/dist/reactivity/block-window.svelte.d.ts +41 -0
  609. package/dist/reactivity/block-window.svelte.js +93 -0
  610. package/dist/reactivity/content-version.svelte.d.ts +14 -0
  611. package/dist/reactivity/content-version.svelte.js +16 -0
  612. package/dist/reactivity/list-windowing.svelte.d.ts +100 -0
  613. package/dist/reactivity/list-windowing.svelte.js +402 -0
  614. package/dist/reactivity/measure-batch.d.ts +15 -0
  615. package/dist/reactivity/measure-batch.js +18 -0
  616. package/dist/reactivity/publish-ref.svelte.d.ts +54 -0
  617. package/dist/reactivity/publish-ref.svelte.js +128 -0
  618. package/dist/reactivity/scope-geometry.d.ts +18 -0
  619. package/dist/reactivity/scope-geometry.js +29 -0
  620. package/dist/reactivity/state-registry.d.ts +10 -0
  621. package/dist/reactivity/state-registry.js +44 -0
  622. package/dist/reactivity/use-container-windowing.svelte.d.ts +35 -0
  623. package/dist/reactivity/use-container-windowing.svelte.js +95 -0
  624. package/dist/reactivity/window-slice.d.ts +11 -0
  625. package/dist/reactivity/window-slice.js +9 -0
  626. package/dist/scan-index.d.ts +11 -0
  627. package/dist/scan-index.js +27 -0
  628. package/dist/schema/block-commands.d.ts +105 -0
  629. package/dist/schema/block-commands.js +179 -0
  630. package/dist/schema/block-completions.d.ts +33 -0
  631. package/dist/schema/block-completions.js +49 -0
  632. package/dist/schema/block-component-registry.d.ts +33 -0
  633. package/dist/schema/block-component-registry.js +33 -0
  634. package/dist/schema/block-kind-descriptor.d.ts +281 -0
  635. package/dist/schema/block-kind-descriptor.js +187 -0
  636. package/dist/schema/block-openers.d.ts +94 -0
  637. package/dist/schema/block-openers.js +150 -0
  638. package/dist/schema/built-in-descriptors.d.ts +8 -0
  639. package/dist/schema/built-in-descriptors.js +560 -0
  640. package/dist/schema/child-spans.d.ts +25 -0
  641. package/dist/schema/child-spans.js +161 -0
  642. package/dist/schema/closure.d.ts +39 -0
  643. package/dist/schema/closure.js +55 -0
  644. package/dist/schema/command-id.d.ts +20 -0
  645. package/dist/schema/command-id.js +42 -0
  646. package/dist/schema/commands.d.ts +147 -0
  647. package/dist/schema/commands.js +294 -0
  648. package/dist/schema/container-raw.d.ts +21 -0
  649. package/dist/schema/container-raw.js +43 -0
  650. package/dist/schema/container-rebuilders.d.ts +32 -0
  651. package/dist/schema/container-rebuilders.js +95 -0
  652. package/dist/schema/define-plugin-block.d.ts +15 -0
  653. package/dist/schema/define-plugin-block.js +18 -0
  654. package/dist/schema/fenced-code-raw.d.ts +43 -0
  655. package/dist/schema/fenced-code-raw.js +220 -0
  656. package/dist/schema/global-commands.d.ts +11 -0
  657. package/dist/schema/global-commands.js +40 -0
  658. package/dist/schema/inline-construct-policy.d.ts +131 -0
  659. package/dist/schema/inline-construct-policy.js +96 -0
  660. package/dist/schema/keybinding-overrides.d.ts +39 -0
  661. package/dist/schema/keybinding-overrides.js +43 -0
  662. package/dist/schema/keybindings.d.ts +36 -0
  663. package/dist/schema/keybindings.js +75 -0
  664. package/dist/schema/merge-rules.d.ts +28 -0
  665. package/dist/schema/merge-rules.js +57 -0
  666. package/dist/schema/opener-priorities.d.ts +16 -0
  667. package/dist/schema/opener-priorities.js +16 -0
  668. package/dist/schema/operations.d.ts +110 -0
  669. package/dist/schema/operations.js +6 -0
  670. package/dist/schema/plugin-activation.d.ts +13 -0
  671. package/dist/schema/plugin-activation.js +18 -0
  672. package/dist/schema/plugin-editor-context.d.ts +33 -0
  673. package/dist/schema/plugin-editor-context.js +65 -0
  674. package/dist/schema/plugin-install.d.ts +58 -0
  675. package/dist/schema/plugin-install.js +132 -0
  676. package/dist/schema/plugin-kind.d.ts +21 -0
  677. package/dist/schema/plugin-kind.js +86 -0
  678. package/dist/schema/plugin-name.d.ts +1 -0
  679. package/dist/schema/plugin-name.js +7 -0
  680. package/dist/schema/register-once.d.ts +9 -0
  681. package/dist/schema/register-once.js +35 -0
  682. package/dist/schema/registration-checks.d.ts +32 -0
  683. package/dist/schema/registration-checks.js +122 -0
  684. package/dist/schema/registration-pending.d.ts +28 -0
  685. package/dist/schema/registration-pending.js +48 -0
  686. package/dist/schema/registry-reset.d.ts +7 -0
  687. package/dist/schema/registry-reset.js +30 -0
  688. package/dist/schema/registry-view.d.ts +30 -0
  689. package/dist/schema/registry-view.js +39 -0
  690. package/dist/schema/reserved-chords.d.ts +35 -0
  691. package/dist/schema/reserved-chords.js +313 -0
  692. package/dist/schema/reserved-chrome.d.ts +23 -0
  693. package/dist/schema/reserved-chrome.js +33 -0
  694. package/dist/schema/table-cell-raw.d.ts +14 -0
  695. package/dist/schema/table-cell-raw.js +30 -0
  696. package/dist/schema/whole-block-unit.d.ts +8 -0
  697. package/dist/schema/whole-block-unit.js +12 -0
  698. package/dist/search/document-scan.d.ts +22 -0
  699. package/dist/search/document-scan.js +39 -0
  700. package/dist/search/matcher.d.ts +31 -0
  701. package/dist/search/matcher.js +70 -0
  702. package/dist/search/regex-executor.d.ts +41 -0
  703. package/dist/search/regex-executor.js +165 -0
  704. package/dist/search/replace.d.ts +15 -0
  705. package/dist/search/replace.js +29 -0
  706. package/dist/search/search-state.svelte.d.ts +59 -0
  707. package/dist/search/search-state.svelte.js +231 -0
  708. package/dist/selection/autoscroll.d.ts +26 -0
  709. package/dist/selection/autoscroll.js +91 -0
  710. package/dist/selection/block-hit-test.d.ts +37 -0
  711. package/dist/selection/block-hit-test.js +59 -0
  712. package/dist/selection/caret-doors.d.ts +20 -0
  713. package/dist/selection/caret-doors.js +44 -0
  714. package/dist/selection/caret-restore.d.ts +15 -0
  715. package/dist/selection/caret-restore.js +32 -0
  716. package/dist/selection/char-endpoint-snap.d.ts +15 -0
  717. package/dist/selection/char-endpoint-snap.js +39 -0
  718. package/dist/selection/clipboard-text.d.ts +13 -0
  719. package/dist/selection/clipboard-text.js +314 -0
  720. package/dist/selection/cross-block/clipboard.d.ts +14 -0
  721. package/dist/selection/cross-block/clipboard.js +20 -0
  722. package/dist/selection/cross-block/dispatch.d.ts +78 -0
  723. package/dist/selection/cross-block/dispatch.js +57 -0
  724. package/dist/selection/cross-block/format-range.d.ts +38 -0
  725. package/dist/selection/cross-block/format-range.js +193 -0
  726. package/dist/selection/cross-block/format-toggle.d.ts +27 -0
  727. package/dist/selection/cross-block/format-toggle.js +109 -0
  728. package/dist/selection/cross-block/keydown.d.ts +11 -0
  729. package/dist/selection/cross-block/keydown.js +339 -0
  730. package/dist/selection/cross-block/ops.d.ts +56 -0
  731. package/dist/selection/cross-block/ops.js +210 -0
  732. package/dist/selection/cross-block/paste.d.ts +8 -0
  733. package/dist/selection/cross-block/paste.js +156 -0
  734. package/dist/selection/cross-block/pointer.d.ts +19 -0
  735. package/dist/selection/cross-block/pointer.js +80 -0
  736. package/dist/selection/cross-block/type-replace.d.ts +10 -0
  737. package/dist/selection/cross-block/type-replace.js +129 -0
  738. package/dist/selection/dead-space-caret.d.ts +39 -0
  739. package/dist/selection/dead-space-caret.js +173 -0
  740. package/dist/selection/drag-pointer.d.ts +22 -0
  741. package/dist/selection/drag-pointer.js +89 -0
  742. package/dist/selection/gap-caret.d.ts +47 -0
  743. package/dist/selection/gap-caret.js +72 -0
  744. package/dist/selection/keyboard-extend.d.ts +43 -0
  745. package/dist/selection/keyboard-extend.js +257 -0
  746. package/dist/selection/native-bridge.d.ts +47 -0
  747. package/dist/selection/native-bridge.js +204 -0
  748. package/dist/selection/nearest-block.d.ts +43 -0
  749. package/dist/selection/nearest-block.js +73 -0
  750. package/dist/selection/path-lookup.d.ts +32 -0
  751. package/dist/selection/path-lookup.js +132 -0
  752. package/dist/selection/path-math.d.ts +35 -0
  753. package/dist/selection/path-math.js +90 -0
  754. package/dist/selection/pointer-session.d.ts +43 -0
  755. package/dist/selection/pointer-session.js +111 -0
  756. package/dist/selection/primitives.d.ts +75 -0
  757. package/dist/selection/primitives.js +91 -0
  758. package/dist/selection/range-delete-ceremony.d.ts +85 -0
  759. package/dist/selection/range-delete-ceremony.js +197 -0
  760. package/dist/selection/range-delete-chrome.d.ts +39 -0
  761. package/dist/selection/range-delete-chrome.js +105 -0
  762. package/dist/selection/range-delete-table-coverage.d.ts +28 -0
  763. package/dist/selection/range-delete-table-coverage.js +168 -0
  764. package/dist/selection/range-delete-table.d.ts +16 -0
  765. package/dist/selection/range-delete-table.js +347 -0
  766. package/dist/selection/range-delete.d.ts +33 -0
  767. package/dist/selection/range-delete.js +121 -0
  768. package/dist/selection/selection-description.d.ts +7 -0
  769. package/dist/selection/selection-description.js +18 -0
  770. package/dist/selection/selection-restore.d.ts +46 -0
  771. package/dist/selection/selection-restore.js +66 -0
  772. package/dist/selection/selection-state.svelte.d.ts +72 -0
  773. package/dist/selection/selection-state.svelte.js +247 -0
  774. package/dist/selection/shared-keydown.d.ts +61 -0
  775. package/dist/selection/shared-keydown.js +150 -0
  776. package/dist/selection/table-endpoint-snap.d.ts +55 -0
  777. package/dist/selection/table-endpoint-snap.js +143 -0
  778. package/dist/selection/table-rect-extend.d.ts +23 -0
  779. package/dist/selection/table-rect-extend.js +46 -0
  780. package/dist/selection/widget-range-paint.d.ts +12 -0
  781. package/dist/selection/widget-range-paint.js +44 -0
  782. package/dist/styles/editor-theme.css +151 -0
  783. package/dist/styles/editor.css +585 -0
  784. package/dist/testing/conformance-core.d.ts +45 -0
  785. package/dist/testing/conformance-core.js +105 -0
  786. package/dist/testing/container-conformance.d.ts +137 -0
  787. package/dist/testing/container-conformance.js +533 -0
  788. package/dist/testing/headless-actions.d.ts +37 -0
  789. package/dist/testing/headless-actions.js +118 -0
  790. package/dist/testing/inline-conformance.d.ts +50 -0
  791. package/dist/testing/inline-conformance.js +442 -0
  792. package/dist/testing/kind-conformance.d.ts +54 -0
  793. package/dist/testing/kind-conformance.js +325 -0
  794. package/dist/testing/mount-dom-stubs.d.ts +8 -0
  795. package/dist/testing/mount-dom-stubs.js +19 -0
  796. package/dist/testing/parse-convergence.d.ts +14 -0
  797. package/dist/testing/parse-convergence.js +81 -0
  798. package/dist/testing.d.ts +20 -0
  799. package/dist/testing.js +61 -0
  800. package/dist/tree-operations/blockquote.d.ts +18 -0
  801. package/dist/tree-operations/blockquote.js +59 -0
  802. package/dist/tree-operations/children.d.ts +17 -0
  803. package/dist/tree-operations/children.js +56 -0
  804. package/dist/tree-operations/cleanup.d.ts +10 -0
  805. package/dist/tree-operations/cleanup.js +25 -0
  806. package/dist/tree-operations/clone.d.ts +5 -0
  807. package/dist/tree-operations/clone.js +43 -0
  808. package/dist/tree-operations/container-lift.d.ts +9 -0
  809. package/dist/tree-operations/container-lift.js +29 -0
  810. package/dist/tree-operations/index.d.ts +16 -0
  811. package/dist/tree-operations/index.js +14 -0
  812. package/dist/tree-operations/list/empty-check.d.ts +7 -0
  813. package/dist/tree-operations/list/empty-check.js +19 -0
  814. package/dist/tree-operations/list/exit-replacement.d.ts +13 -0
  815. package/dist/tree-operations/list/exit-replacement.js +49 -0
  816. package/dist/tree-operations/list/item-partition.d.ts +13 -0
  817. package/dist/tree-operations/list/item-partition.js +33 -0
  818. package/dist/tree-operations/list/list-builders.d.ts +44 -0
  819. package/dist/tree-operations/list/list-builders.js +129 -0
  820. package/dist/tree-operations/list/ordered-markers.d.ts +36 -0
  821. package/dist/tree-operations/list/ordered-markers.js +114 -0
  822. package/dist/tree-operations/list/reconcile-task.d.ts +12 -0
  823. package/dist/tree-operations/list/reconcile-task.js +47 -0
  824. package/dist/tree-operations/list/sublist-separator.d.ts +13 -0
  825. package/dist/tree-operations/list/sublist-separator.js +34 -0
  826. package/dist/tree-operations/list/terminator.d.ts +17 -0
  827. package/dist/tree-operations/list/terminator.js +60 -0
  828. package/dist/tree-operations/list/unwrap-merge.d.ts +29 -0
  829. package/dist/tree-operations/list/unwrap-merge.js +202 -0
  830. package/dist/tree-operations/node-ops.d.ts +296 -0
  831. package/dist/tree-operations/node-ops.js +1428 -0
  832. package/dist/tree-operations/parse-block.d.ts +3 -0
  833. package/dist/tree-operations/parse-block.js +8 -0
  834. package/dist/tree-operations/paste/apply.d.ts +12 -0
  835. package/dist/tree-operations/paste/apply.js +75 -0
  836. package/dist/tree-operations/paste/body-write.d.ts +19 -0
  837. package/dist/tree-operations/paste/body-write.js +53 -0
  838. package/dist/tree-operations/paste/container-match.d.ts +32 -0
  839. package/dist/tree-operations/paste/container-match.js +238 -0
  840. package/dist/tree-operations/paste/container-paste.d.ts +10 -0
  841. package/dist/tree-operations/paste/container-paste.js +27 -0
  842. package/dist/tree-operations/paste/dispatch.d.ts +61 -0
  843. package/dist/tree-operations/paste/dispatch.js +138 -0
  844. package/dist/tree-operations/paste/find-enclosing-list.d.ts +8 -0
  845. package/dist/tree-operations/paste/find-enclosing-list.js +30 -0
  846. package/dist/tree-operations/paste/focus-target.d.ts +27 -0
  847. package/dist/tree-operations/paste/focus-target.js +40 -0
  848. package/dist/tree-operations/paste/hooks.d.ts +17 -0
  849. package/dist/tree-operations/paste/hooks.js +80 -0
  850. package/dist/tree-operations/paste/list-absorb.d.ts +29 -0
  851. package/dist/tree-operations/paste/list-absorb.js +106 -0
  852. package/dist/tree-operations/paste/list-break-out.d.ts +42 -0
  853. package/dist/tree-operations/paste/list-break-out.js +136 -0
  854. package/dist/tree-operations/paste/parent-scope.d.ts +17 -0
  855. package/dist/tree-operations/paste/parent-scope.js +35 -0
  856. package/dist/tree-operations/paste/paste-deps.d.ts +20 -0
  857. package/dist/tree-operations/paste/paste-deps.js +6 -0
  858. package/dist/tree-operations/paste/paste-replacement.d.ts +8 -0
  859. package/dist/tree-operations/paste/paste-replacement.js +60 -0
  860. package/dist/tree-operations/paste/paste-transforms.d.ts +25 -0
  861. package/dist/tree-operations/paste/paste-transforms.js +72 -0
  862. package/dist/tree-operations/paste/replace-block-at-parent.d.ts +29 -0
  863. package/dist/tree-operations/paste/replace-block-at-parent.js +75 -0
  864. package/dist/tree-operations/paste/strategy.d.ts +9 -0
  865. package/dist/tree-operations/paste/strategy.js +20 -0
  866. package/dist/tree-operations/paste/table-slice.d.ts +10 -0
  867. package/dist/tree-operations/paste/table-slice.js +39 -0
  868. package/dist/tree-operations/paste-surfaces.d.ts +61 -0
  869. package/dist/tree-operations/paste-surfaces.js +15 -0
  870. package/dist/tree-operations/path-mutate.d.ts +12 -0
  871. package/dist/tree-operations/path-mutate.js +20 -0
  872. package/dist/tree-operations/reorder-unit.d.ts +17 -0
  873. package/dist/tree-operations/reorder-unit.js +37 -0
  874. package/dist/tree-operations/reorder.d.ts +13 -0
  875. package/dist/tree-operations/reorder.js +57 -0
  876. package/dist/tree-operations/sharing.d.ts +18 -0
  877. package/dist/tree-operations/sharing.js +14 -0
  878. package/dist/tree-operations/splice-many.d.ts +9 -0
  879. package/dist/tree-operations/splice-many.js +22 -0
  880. package/dist/tree-operations/structural-change.d.ts +65 -0
  881. package/dist/tree-operations/structural-change.js +117 -0
  882. package/dist/tree-operations/sub-table-copy.d.ts +6 -0
  883. package/dist/tree-operations/sub-table-copy.js +43 -0
  884. package/dist/tree-operations/table-mutations.d.ts +17 -0
  885. package/dist/tree-operations/table-mutations.js +101 -0
  886. package/dist/tree-operations/unshare.d.ts +101 -0
  887. package/dist/tree-operations/unshare.js +248 -0
  888. package/dist/undo/manager.d.ts +2 -0
  889. package/dist/undo/manager.js +50 -0
  890. package/dist/undo/types.d.ts +44 -0
  891. package/dist/undo/types.js +7 -0
  892. package/docs/guide/consumer-guide.md +1098 -0
  893. package/docs/guide/directives.md +223 -0
  894. package/docs/guide/plugin-api.md +329 -0
  895. package/docs/guide/plugin-guide/conspiracy.gif +0 -0
  896. package/docs/guide/plugin-guide/parrot-frames.md +209 -0
  897. package/docs/guide/plugin-guide/parrot.gif +0 -0
  898. package/docs/guide/plugin-guide.md +1693 -0
  899. package/docs/guide/plugin-testing.md +463 -0
  900. package/package.json +238 -0
@@ -0,0 +1,726 @@
1
+ <script lang="ts">
2
+ import { getContext, tick } from 'svelte';
3
+ import { type BlockComponent, type StickyColumnDirection } from '../../../block-component';
4
+ import type { NodeView } from '../../../core/node-views';
5
+ import {
6
+ EDITOR_POLICIES_KEY,
7
+ EDITOR_SERVICES_KEY,
8
+ type EditorPolicies,
9
+ type EditorServices
10
+ } from '../../../editor-keys';
11
+ import { asDomTextOffset, asRawOffset } from '../../../cursor/coordinate-spaces';
12
+ import { CONTENT_EMPTY_ATTR, holdsOnlyMarkerChrome } from '../../../cursor/widget-offset';
13
+ import {
14
+ createRangeFromOffsets,
15
+ setCursorOffset,
16
+ getRangeOffsets,
17
+ getSelectionOffsets,
18
+ hasSelection
19
+ } from '../../../cursor/content-offsets';
20
+ import { handleSharedKeydown, handleSharedBeforeInput } from '../../../selection/shared-keydown';
21
+ import {
22
+ createEditableSurface,
23
+ createClipboardHandlers,
24
+ consumePendingRestore
25
+ } from '../editable-surface';
26
+ import { wireSurfaceContexts, useParkFocusOnUnmount } from '../surface-wiring.svelte';
27
+ import { createContentOffsetBackend, anchorTrailingNewline } from '../plain-text-backend';
28
+ import { renderCodeBlock } from './code-renderer';
29
+ import {
30
+ getLineLeadingWhitespace,
31
+ isBetweenEmptyPair,
32
+ isBetweenEmptyBracketPair
33
+ } from './code-editing';
34
+ import { indentLines, dedentLines, type IndentResult } from './code-indent';
35
+ import { computeCodeEnter } from './code-enter';
36
+ import { computeAutoPair } from './code-beforeinput';
37
+ import {
38
+ fenceShapeOf,
39
+ reconcileFenceWrite,
40
+ writeFenceInfo
41
+ } from '../../../schema/fenced-code-raw';
42
+ import { hidesMarkers } from '../../../presentation-mode';
43
+ import CodeLanguageChip from './CodeLanguageChip.svelte';
44
+ import { computeFenceExit } from './code-fence-exit';
45
+ import {
46
+ classifyFenceBoundary,
47
+ clampCaretToBody,
48
+ clampEnterOffsetToBody,
49
+ clampRangeToBody,
50
+ computeFenceRangedEdit,
51
+ crossesFenceBoundary,
52
+ fenceEditSpan,
53
+ isStructureOnlyRange,
54
+ type CodeRange
55
+ } from './code-fence-boundary';
56
+ import { metadataOf, type CstNode } from '../../../core/nodes';
57
+ import { trimTrailingLineEnding, trailingLineEnding } from '../../../core/lines';
58
+ import { pasteDispatch } from '../../../tree-operations/paste/dispatch';
59
+ import { nodeAt, emptyParagraph } from '../../../tree-operations';
60
+ import { type CommandId } from '../../../schema/commands';
61
+ import { reorderRunCommand } from '../../../editor-actions/reorder-action';
62
+
63
+ const ELECTRIC_INDENT_UNIT = '\t';
64
+
65
+ let { node, index, myPath = [] }: { node: NodeView; index: number; myPath?: number[] } = $props();
66
+
67
+ const wiring = wireSurfaceContexts();
68
+ const {
69
+ blockEdit,
70
+ focusActions,
71
+ controller,
72
+ pasteCoordinator,
73
+ stickyColumn,
74
+ edgeAffinity,
75
+ selection,
76
+ getDoc,
77
+ getEditorRoot,
78
+ grammar,
79
+ activePlugins,
80
+ events: editorEvents
81
+ } = wiring.deps;
82
+ const { reorder } = getContext<EditorServices>(EDITOR_SERVICES_KEY);
83
+ const { presentationMode: getPresentationMode, onPasteImage } =
84
+ getContext<EditorPolicies>(EDITOR_POLICIES_KEY);
85
+ const presentationMode = $derived(getPresentationMode?.() ?? 'source');
86
+ const readOnly = $derived(presentationMode === 'reading');
87
+ let el: HTMLDivElement | undefined = $state();
88
+ let composing = $state(false);
89
+ // The walk container's own stamp, kept as state rather than re-derived: it is what
90
+ // decides whether this block paints its fence chrome, and so whether it needs a chip.
91
+ let contentEmpty = $state(false);
92
+ let pendingCursorOffset = $state<number | null>(null);
93
+ let pendingSelection = $state<{ start: number; end: number } | null>(null);
94
+ let lastRenderedRaw = '';
95
+ let preEditOffset = 0;
96
+
97
+ const { backend, getFocusOffset, getTextLen, readText } = createContentOffsetBackend(
98
+ () => el ?? null
99
+ );
100
+
101
+ const editableSurface = createEditableSurface({
102
+ ...wiring.deps,
103
+ getEl: () => el ?? null,
104
+ getAmbientLength: () => 0,
105
+ backend,
106
+ getMyPath: () => myPath,
107
+ getIndex: () => index,
108
+ getComposing: () => composing,
109
+ setComposing: (value) => {
110
+ composing = value;
111
+ },
112
+ getPreEditOffset: () => preEditOffset,
113
+ setPreEditOffset: (offset) => {
114
+ preEditOffset = offset;
115
+ },
116
+ setPendingCursor: (offset) => {
117
+ pendingCursorOffset = offset;
118
+ },
119
+ getPresentationMode,
120
+ getFocusOffset,
121
+ getTextLen,
122
+ readText,
123
+ // Hands back the caret the RECONCILED bytes want: the write seam can grow the
124
+ // fence or drop a character, either of which moves the caret off the DOM's.
125
+ commitInput: (text, preEdit, savedOffset) => commitDisplay(text, preEdit, savedOffset)
126
+ });
127
+
128
+ const crossBlock = editableSurface.crossBlock;
129
+ const sharedCtx = editableSurface.sharedCtx;
130
+
131
+ // ── BlockComponent interface ────────────────────────────────────────
132
+
133
+ export const editable = true;
134
+ export const focusable = true;
135
+
136
+ // Every caret-landing door clamps onto editable content: a caret on a fence line
137
+ // takes keystrokes the fence guard refuses, and a PARKED caret there is as dead as
138
+ // a placed one, so both verbs clamp.
139
+ export function focus(offset: number): void {
140
+ editableSurface.surface.focus(clampCaretToBody(node, offset));
141
+ }
142
+
143
+ export function parkCaret(offset: number): void {
144
+ editableSurface.surface.parkCaret(clampCaretToBody(node, offset));
145
+ }
146
+
147
+ // The column walk resolves against pixels, so it can only be corrected after the
148
+ // fact: re-seat when it lands on a fence line, leave it alone when it doesn't.
149
+ export function focusAtColumn(x: number, from: StickyColumnDirection): void {
150
+ editableSurface.surface.focusAtColumn(x, from);
151
+ const landed = backend.getRaw();
152
+ if (landed === null) return;
153
+ const seated = clampCaretToBody(node, landed);
154
+ if (seated !== landed) backend.setRaw(asRawOffset(seated));
155
+ }
156
+
157
+ export const getCursorOffset = editableSurface.surface.getCursorOffset;
158
+ export const getSelectedText = editableSurface.surface.getSelectedText;
159
+ export const setSelection = editableSurface.surface.setSelection;
160
+ export const measurePartialRects = editableSurface.surface.measurePartialRects;
161
+
162
+ // ── Render pipeline ───────────────────────────────────────────────────────
163
+
164
+ function getDisplayText(): string {
165
+ return trimTrailingLineEnding(node.raw);
166
+ }
167
+
168
+ /**
169
+ * The block's ONE display-commit door: no gesture calls `updateBlockContent` directly (pinned
170
+ * by `lint/code-commit-funnel`). The write seam sits inside rather than at each caller, so
171
+ * every gesture gets fence reconciliation by construction.
172
+ */
173
+ function commitDisplay(display: string, undoAnchor: number, caret: number): number {
174
+ const written = reconcileFenceWrite({
175
+ display,
176
+ caret,
177
+ fence: fenceShapeOf(node),
178
+ mode: 'authored'
179
+ });
180
+ void blockEdit.updateBlockContent(
181
+ index,
182
+ written.display + trailingLineEnding(node.raw),
183
+ undoAnchor
184
+ );
185
+ return written.caret;
186
+ }
187
+
188
+ $effect(() => {
189
+ if (!el) return;
190
+ if (node.raw === lastRenderedRaw && pendingCursorOffset === null && pendingSelection === null)
191
+ return;
192
+
193
+ el.replaceChildren(renderCodeBlock(node));
194
+ anchorTrailingNewline(el);
195
+ const chromeOnly = holdsOnlyMarkerChrome(el);
196
+ el.toggleAttribute(CONTENT_EMPTY_ATTR, chromeOnly);
197
+ contentEmpty = chromeOnly;
198
+ lastRenderedRaw = node.raw;
199
+
200
+ // Restore only while this block still holds focus: an edit reparsing to multiple
201
+ // blocks moves the caret to the split-off sibling, and a blur would otherwise yank
202
+ // the global selection back. The pending fields clear regardless, never re-armed.
203
+ if (pendingSelection !== null) {
204
+ consumePendingRestore(el, pendingSelection, (range) => {
205
+ const domRange = createRangeFromOffsets(
206
+ el!,
207
+ asDomTextOffset(range.start),
208
+ asDomTextOffset(range.end)
209
+ );
210
+ if (!domRange) return;
211
+ const sel = window.getSelection();
212
+ sel?.removeAllRanges();
213
+ sel?.addRange(domRange);
214
+ });
215
+ pendingSelection = null;
216
+ pendingCursorOffset = null;
217
+ } else if (pendingCursorOffset !== null) {
218
+ consumePendingRestore(el, pendingCursorOffset, (offset) =>
219
+ setCursorOffset(el!, asDomTextOffset(offset))
220
+ );
221
+ pendingCursorOffset = null;
222
+ }
223
+ });
224
+
225
+ useParkFocusOnUnmount(() => el ?? null, getEditorRoot);
226
+
227
+ // ── The language chip ─────────────────────────────────────────────────────
228
+
229
+ // The chip stands in for fence chrome the mode paints nothing for, so it shows exactly
230
+ // where that chrome is missing: never in source, never on a block painting its own.
231
+ const showChip = $derived(hidesMarkers(presentationMode) && !contentEmpty);
232
+ const infoString = $derived(metadataOf(node, 'fencedCode').info);
233
+
234
+ // The chip's write: the opener's info span, through the display funnel so the fence rule
235
+ // runs over it, isolated so no typing burst on either side joins its undo entry.
236
+ function commitLanguage(info: string): void {
237
+ // Unchanged or refused bytes are a close, not a write — no entry, no edit event. The seed
238
+ // is `meta.info`, TRIMMED, so a byte test alone lets a bare Enter respell a padded fence.
239
+ if (info === infoString) {
240
+ returnCaretToBody();
241
+ return;
242
+ }
243
+ const display = getDisplayText();
244
+ const written = writeFenceInfo(display, info, fenceShapeOf(node));
245
+ const bodyStart = clampCaretToBody(node, 0);
246
+ if (written !== null && written !== display) {
247
+ controller.isolateUndoEntry(() => commitDisplay(written, bodyStart, bodyStart));
248
+ }
249
+ returnCaretToBody();
250
+ }
251
+
252
+ // This block's own door, not `moveFocus`: the chip is chrome over one block, and a
253
+ // traversal to it stops at the gap above instead. The seat waits for the commit's render.
254
+ function returnCaretToBody(): void {
255
+ void tick().then(() => focus(0));
256
+ }
257
+
258
+ // ── Event handlers ────────────────────────────────────────────────────────
259
+
260
+ const onInput = editableSurface.onInput;
261
+ const onCompositionEnd = editableSurface.onCompositionEnd;
262
+
263
+ // An IME deletes the selection as it starts composing, and beforeinput's
264
+ // insertCompositionText is not cancelable — so a fence-crossing selection shrinks
265
+ // onto its body span here, before the composition owns the surface.
266
+ function onCompositionStart(): void {
267
+ const sel = el ? getSelectionOffsets(el) : null;
268
+ if (sel && crossesFenceBoundary(node, sel)) {
269
+ const span = fenceEditSpan(node, sel);
270
+ setSelection(span.start, span.end);
271
+ }
272
+ editableSurface.onCompositionStart();
273
+ }
274
+
275
+ async function onBeforeInput(e: InputEvent): Promise<void> {
276
+ if (await handleSharedBeforeInput(e, sharedCtx)) return;
277
+ if (guardFenceRangedEdit(e)) return;
278
+ // Soft break: Shift+Enter, and mobile/IME insertLineBreak without a keydown.
279
+ // Gated on !composing so an IME emitting it mid-composition does not sync.
280
+ if (e.inputType === 'insertLineBreak' && !composing && el) {
281
+ e.preventDefault();
282
+ // Mobile/IME paths skip onKeyDown so preEditOffset may be stale; capture fresh.
283
+ const branchPreEditOffset = backend.getRaw() ?? 0;
284
+ const result = computeCodeEnter({
285
+ display: getDisplayText(),
286
+ selection: enterSpliceSpan(currentRange()),
287
+ mode: 'soft',
288
+ ending: trailingLineEnding(node.raw)
289
+ });
290
+ pendingCursorOffset = commitDisplay(result.newText, branchPreEditOffset, result.newCursor);
291
+ return;
292
+ }
293
+ if (composing || e.inputType !== 'insertText' || !el) return;
294
+ const data = e.data;
295
+ if (!data || data.length !== 1) return;
296
+
297
+ const text = getDisplayText();
298
+ const selOffsets = getSelectionOffsets(el);
299
+ const offset = selOffsets ? selOffsets.start : (backend.getRaw() ?? 0);
300
+
301
+ const meta = metadataOf(node, 'fencedCode');
302
+ const result = computeAutoPair({
303
+ text,
304
+ selection: selOffsets ?? { start: offset, end: offset },
305
+ typed: data,
306
+ unclosedBacktickFence: meta.closed === false && meta.fenceMarker === '`'
307
+ });
308
+ if (!result) return;
309
+
310
+ e.preventDefault();
311
+ if (result.kind === 'skip') {
312
+ setCursorOffset(el, asDomTextOffset(result.caretOffset));
313
+ return;
314
+ }
315
+ if (result.kind === 'wrap') {
316
+ // Both endpoints sit inside the body, so whatever the seam inserts ahead of
317
+ // the wrap's start moves its end by the same delta.
318
+ const start = commitDisplay(result.newText, preEditOffset, result.selection.start);
319
+ const shift = start - result.selection.start;
320
+ pendingSelection = { start, end: result.selection.end + shift };
321
+ } else {
322
+ pendingCursorOffset = commitDisplay(result.newText, preEditOffset, result.caretOffset);
323
+ }
324
+ }
325
+
326
+ // ── Fence-crossing edits ──────────────────────────────────────────────────
327
+
328
+ /**
329
+ * Where an Enter-family splice lands (the `code.newline` command and the soft
330
+ * break): a caret clamps out of the fence lines, a selection is replaced on its
331
+ * body span like every other ranged edit here.
332
+ */
333
+ function enterSpliceSpan(range: CodeRange): CodeRange {
334
+ if (range.start !== range.end) return fenceEditSpan(node, range);
335
+ const at = clampEnterOffsetToBody(node, range.start);
336
+ return { start: at, end: at };
337
+ }
338
+
339
+ /**
340
+ * The one guard for every native edit that rewrites a range here — delete,
341
+ * forward-delete, type-over, word delete, drag. One that crosses a fence line is
342
+ * re-sited onto the body rather than left to splice the fence away.
343
+ */
344
+ function guardFenceRangedEdit(e: InputEvent): boolean {
345
+ if (composing || !el) return false;
346
+ const range = pendingEditRange(e, el);
347
+ if (!range || !crossesFenceBoundary(node, range)) return false;
348
+
349
+ e.preventDefault();
350
+ const insert = rangedEditInsertion(e, fenceEditSpan(node, range));
351
+ if (insert === null) return true;
352
+ const edit = computeFenceRangedEdit(node, range, insert);
353
+ if (!edit) return true;
354
+ // Mobile/IME beforeinput arrives without a preceding keydown, so the undo
355
+ // anchor reads fresh rather than trusting preEditOffset (see the soft-break arm).
356
+ pendingCursorOffset = commitDisplay(edit.newText, backend.getRaw() ?? 0, edit.newCursor);
357
+ return true;
358
+ }
359
+
360
+ /**
361
+ * What the pending edit will rewrite. `getTargetRanges()` is the authority — a word
362
+ * delete at a collapsed caret reports the word, not the caret — and is
363
+ * feature-detected because jsdom does not implement it.
364
+ */
365
+ function pendingEditRange(e: InputEvent, surface: HTMLElement): CodeRange | null {
366
+ const targets = typeof e.getTargetRanges === 'function' ? e.getTargetRanges() : [];
367
+ if (targets.length > 0) return getRangeOffsets(surface, targets[0]);
368
+ const selected = getSelectionOffsets(surface);
369
+ if (selected) return selected;
370
+ const caret = backend.getRaw();
371
+ return caret === null ? null : { start: caret, end: caret };
372
+ }
373
+
374
+ /**
375
+ * The text each claimed input type writes over its span: only a payload readable off the event
376
+ * or mintable here is re-sited, every other type is REFUSED (null: prevented, nothing
377
+ * committed). Text riding a `dataTransfer` would reach `parse()` without the paste transforms
378
+ * (G4.11).
379
+ */
380
+ function rangedEditInsertion(e: InputEvent, span: CodeRange): string | null {
381
+ if (e.inputType.startsWith('delete')) return '';
382
+ switch (e.inputType) {
383
+ case 'insertText':
384
+ return e.data ?? '';
385
+ case 'insertLineBreak':
386
+ return trailingLineEnding(node.raw);
387
+ // The keydown path auto-indents (computeCodeEnter 'normal'), and a mobile or
388
+ // IME insertParagraph is the same gesture arriving without a keydown.
389
+ case 'insertParagraph':
390
+ return (
391
+ trailingLineEnding(node.raw) + getLineLeadingWhitespace(getDisplayText(), span.start)
392
+ );
393
+ default:
394
+ return null;
395
+ }
396
+ }
397
+
398
+ async function onKeyDown(e: KeyboardEvent): Promise<void> {
399
+ if (composing) return;
400
+ if (!el) return;
401
+
402
+ preEditOffset = backend.getRaw() ?? 0;
403
+
404
+ if ((await handleSharedKeydown(e, sharedCtx)) || editableSurface.isDetached()) return;
405
+
406
+ if (wiring.dispatchChord(e, { kind: node.kind, runCommand })) return;
407
+ }
408
+
409
+ // ── Commands ────────────────────────────────────────────────────────
410
+
411
+ export function runCommand(id: CommandId): boolean {
412
+ if (reorderRunCommand(id, reorder, () => myPath)) return true;
413
+ switch (id) {
414
+ case 'format.toggleStrong':
415
+ case 'format.toggleEmphasis':
416
+ case 'format.toggleStrikethrough':
417
+ case 'format.toggleCode':
418
+ case 'link.openCard':
419
+ return true; // code blocks carry no inline constructs; swallow to stop the browser default
420
+ case 'code.newline':
421
+ return codeNewline();
422
+ case 'code.indent':
423
+ indentSelection();
424
+ return true;
425
+ case 'code.dedent':
426
+ dedentSelection();
427
+ return true;
428
+ case 'code.backspace':
429
+ return codeBackspace();
430
+ case 'code.delete':
431
+ return codeDelete();
432
+ default:
433
+ return false;
434
+ }
435
+ }
436
+
437
+ function codeBackspace(): boolean {
438
+ if (!el || hasSelection()) return false;
439
+ const offset = backend.getRaw() ?? 0;
440
+ // offset===0 is the universal contract; the classifyFenceBoundary check catches the
441
+ // fence boundary, where a native Backspace would delete the opener's terminating `\n`.
442
+ if (
443
+ offset === 0 ||
444
+ classifyFenceBoundary({ node, offset, forward: false }).kind === 'exitPrev'
445
+ ) {
446
+ focusActions.moveFocus(index - 1, 'end');
447
+ return true;
448
+ }
449
+
450
+ // Pair-delete: remove both halves so the auto-closed companion isn't stranded.
451
+ // A caret inside a backtick fence run reads as a pair, so it declines there.
452
+ const text = getDisplayText();
453
+ const pairSpan = { start: offset - 1, end: offset + 1 };
454
+ if (isBetweenEmptyPair(text, offset) && !crossesFenceBoundary(node, pairSpan)) {
455
+ const newText = text.slice(0, offset - 1) + text.slice(offset + 1);
456
+ pendingCursorOffset = commitDisplay(newText, preEditOffset, offset - 1);
457
+ return true;
458
+ }
459
+ return false;
460
+ }
461
+
462
+ function codeDelete(): boolean {
463
+ if (!el || hasSelection()) return false;
464
+ const offset = backend.getRaw() ?? 0;
465
+ if (classifyFenceBoundary({ node, offset, forward: true }).kind === 'exitNext') {
466
+ // The root's forward asymmetry (past-end appends a paragraph) would strand a
467
+ // spurious block here, so suppress the append; no-op at the true doc end.
468
+ focusActions.moveFocus(index + 1, 'start', { append: false });
469
+ return true;
470
+ }
471
+ return false;
472
+ }
473
+
474
+ // The browser's insertParagraph adds <div>/<br> elements that don't affect
475
+ // textContent, so the CST never sees the edit — handle Enter via the CST path.
476
+ function codeNewline(): boolean {
477
+ if (!el) return false;
478
+ // Read the caret live: cross-block dispatch calls runCommand without an
479
+ // onKeyDown to refresh preEditOffset, so the undo anchor must read fresh.
480
+ const offset = backend.getRaw() ?? 0;
481
+ const text = getDisplayText();
482
+ const meta = metadataOf(node, 'fencedCode');
483
+
484
+ const exit = computeFenceExit({ text, offset, meta });
485
+ if (exit.kind === 'closeAndExit') {
486
+ closeUnclosedFenceAndDescend(exit.newText);
487
+ return true;
488
+ }
489
+ if (exit.kind !== 'none') {
490
+ if (exit.kind === 'exitWithEdit') {
491
+ commitDisplay(exit.newText, offset, offset);
492
+ }
493
+ exitDownward();
494
+ return true;
495
+ }
496
+
497
+ // The undo anchor stays on the true pre-edit caret (`offset`); the splice
498
+ // itself lands wherever the fence lines allow.
499
+ const span = enterSpliceSpan(currentRange());
500
+
501
+ // Electric indent: between an empty bracket pair, expand into three lines with an
502
+ // extra indent on the middle. Quote pairs stay inline; a selection is replaced.
503
+ const ending = trailingLineEnding(node.raw);
504
+ if (span.start === span.end && isBetweenEmptyBracketPair(text, span.start)) {
505
+ const at = span.start;
506
+ const indent = getLineLeadingWhitespace(text, at);
507
+ const inner = indent + ELECTRIC_INDENT_UNIT;
508
+ const newText = text.slice(0, at) + ending + inner + ending + indent + text.slice(at);
509
+ const innerCaret = at + ending.length + inner.length;
510
+ pendingCursorOffset = commitDisplay(newText, offset, innerCaret);
511
+ return true;
512
+ }
513
+
514
+ const enter = computeCodeEnter({
515
+ display: text,
516
+ selection: span,
517
+ mode: 'normal',
518
+ ending
519
+ });
520
+ pendingCursorOffset = commitDisplay(enter.newText, offset, enter.newCursor);
521
+ return true;
522
+ }
523
+
524
+ // A closed-fence Enter-exit lands within the fence's OWN container scope: the next
525
+ // sibling, else a paragraph minted in-scope. Without this a nested last child would
526
+ // delegate the caret outside its container.
527
+ function exitDownward(): void {
528
+ const container = myPath.length > 1 ? nodeAt(getDoc(), myPath.slice(0, -1)) : null;
529
+ const isNestedLastChild = !!container?.children && index === container.children.length - 1;
530
+ if (isNestedLastChild) blockEdit.descendToBody(index);
531
+ else focusActions.moveFocus(index + 1, 'start');
532
+ }
533
+
534
+ // Leaving an unclosed fence downward mints its closer, keeping save→reload from lazy-absorbing
535
+ // the trailing blocks into it. Closer and fresh paragraph land as ONE replaceBlock commit.
536
+ function closeUnclosedFenceAndDescend(closedDisplay: string): void {
537
+ const meta = metadataOf(node, 'fencedCode');
538
+ const lineEnding = trailingLineEnding(node.raw);
539
+ const closedFence: CstNode = {
540
+ kind: 'fencedCode',
541
+ leadingTrivia: '',
542
+ raw: closedDisplay + lineEnding,
543
+ metadata: { ...meta, closed: true }
544
+ };
545
+ // The blank separator line and the paragraph's own line are both pure line
546
+ // ending, so both take the fence's (G4.20) — the same one the closer above got.
547
+ const paragraphBelow = emptyParagraph(lineEnding, lineEnding);
548
+ void blockEdit.replaceBlock(index, [closedFence, paragraphBelow], {
549
+ replacementIndex: 1,
550
+ offset: 0
551
+ });
552
+ }
553
+
554
+ void ({
555
+ editable,
556
+ focusable,
557
+ focus,
558
+ parkCaret,
559
+ getCursorOffset,
560
+ focusAtColumn,
561
+ insertMarkdown,
562
+ runCommand
563
+ } satisfies BlockComponent);
564
+
565
+ function currentRange(): { start: number; end: number } {
566
+ if (!el) return { start: 0, end: 0 };
567
+ const sel = getSelectionOffsets(el);
568
+ if (sel) return sel;
569
+ const cursor = backend.getRaw() ?? 0;
570
+ return { start: cursor, end: cursor };
571
+ }
572
+
573
+ function applyIndentResult(result: IndentResult): void {
574
+ const start = commitDisplay(result.text, result.selection.start, result.selection.start);
575
+ if (result.selection.start === result.selection.end) {
576
+ pendingCursorOffset = start;
577
+ return;
578
+ }
579
+ // Both endpoints sit inside the body, so an escalation inserting at the opener
580
+ // run moves them by the same delta.
581
+ const shift = start - result.selection.start;
582
+ pendingSelection = { start, end: result.selection.end + shift };
583
+ }
584
+
585
+ // Both gestures rewrite whole LINES, so their range clamps out of the fence lines —
586
+ // the multi-line sibling of codeNewline's clampEnterOffsetToBody. `el` is required
587
+ // only because currentRange() reads the DOM selection through it.
588
+ function indentSelection(): void {
589
+ if (!el) return;
590
+ applyIndentResult(indentLines(getDisplayText(), clampRangeToBody(node, currentRange())));
591
+ }
592
+
593
+ function dedentSelection(): void {
594
+ if (!el) return;
595
+ const text = getDisplayText();
596
+ const result = dedentLines(text, clampRangeToBody(node, currentRange()));
597
+ if (result.text === text) return;
598
+ applyIndentResult(result);
599
+ }
600
+
601
+ // ── Pointer + clipboard ─────────────────────────────────────────────
602
+
603
+ function onPointerDown(e: PointerEvent): void {
604
+ void crossBlock.handlePointerDown(e);
605
+ }
606
+
607
+ // Code has no ambient markers, so its DOM-text selection IS its raw slice: copy falls
608
+ // to the seam's visible-selection default, and cut writes that string before deleting.
609
+ const clipboard = createClipboardHandlers({
610
+ stickyColumn,
611
+ edgeAffinity,
612
+ selection,
613
+ getDoc,
614
+ crossBlock,
615
+ isReadOnly: () => readOnly,
616
+ caret: editableSurface.caret,
617
+ events: editorEvents,
618
+ onPasteImage,
619
+ // Copy is verbatim while the delete clamps: the clipboard keeps the literal bytes
620
+ // selected, fence characters included, and only the body half is removed.
621
+ cutTail: (e) => {
622
+ e.clipboardData?.setData('text/plain', window.getSelection()?.toString() ?? '');
623
+ if (!el) return;
624
+ const selOffsets = getSelectionOffsets(el);
625
+ if (!selOffsets) return;
626
+ const edit = computeFenceRangedEdit(node, selOffsets, '');
627
+ if (!edit) return;
628
+ pendingCursorOffset = commitDisplay(edit.newText, edit.newCursor, edit.newCursor);
629
+ },
630
+ pasteTail: async (pastedText) => {
631
+ if (!el) return;
632
+ // Paste refuses where typing refuses: a target confined to fence structure has
633
+ // nothing to paste into. The tree-op owns the splice, so the span goes to it.
634
+ const target = currentRange();
635
+ if (isStructureOnlyRange(node, target)) return;
636
+ const sel = fenceEditSpan(node, target);
637
+ const result = await pasteDispatch(
638
+ {
639
+ pastedText,
640
+ targetPath: myPath,
641
+ offset: sel.start,
642
+ preDelete: sel.start !== sel.end ? { start: sel.start, end: sel.end } : undefined
643
+ },
644
+ {
645
+ doc: getDoc(),
646
+ blockEdit,
647
+ controller: pasteCoordinator,
648
+ grammar,
649
+ activePlugins
650
+ }
651
+ );
652
+
653
+ if (result.inlineCaretOffset !== undefined) {
654
+ pendingCursorOffset = result.inlineCaretOffset;
655
+ }
656
+ }
657
+ });
658
+ const { onCopy, onCut, onPaste } = clipboard;
659
+
660
+ export function insertMarkdown(md: string): boolean {
661
+ return clipboard.insertMarkdown(md);
662
+ }
663
+ </script>
664
+
665
+ <div
666
+ bind:this={el}
667
+ tabindex="0"
668
+ class="code-block"
669
+ contenteditable={readOnly ? 'false' : 'true'}
670
+ aria-readonly={readOnly ? 'true' : undefined}
671
+ role="textbox"
672
+ spellcheck="false"
673
+ oninput={onInput}
674
+ onkeydown={onKeyDown}
675
+ onbeforeinput={onBeforeInput}
676
+ oncopy={onCopy}
677
+ oncut={onCut}
678
+ onpaste={onPaste}
679
+ onpointerdown={onPointerDown}
680
+ oncompositionstart={onCompositionStart}
681
+ oncompositionend={onCompositionEnd}
682
+ ></div>
683
+ <!-- Beside the walk container, never inside it: the render effect replaces that element's
684
+ children on every commit, and the offset walk counts everything that survives there. -->
685
+ {#if showChip}
686
+ <CodeLanguageChip
687
+ info={infoString}
688
+ editable={!readOnly}
689
+ onCommit={commitLanguage}
690
+ onCancel={(returnCaret) => returnCaret && returnCaretToBody()}
691
+ />
692
+ {/if}
693
+
694
+ <style>
695
+ .code-block {
696
+ width: 100%;
697
+ outline: none;
698
+ padding: 12px;
699
+ font-family: var(--font-editor, ui-monospace, monospace);
700
+ font-size: 0.9em;
701
+ line-height: 1.5;
702
+ background: var(--color-bg-secondary, rgba(128, 128, 128, 0.12));
703
+ border: 1px solid var(--color-ui-muted, #a4a4a4);
704
+ border-radius: 4px;
705
+ color: inherit;
706
+ white-space: pre;
707
+ overflow-x: auto;
708
+ overflow-y: hidden;
709
+ tab-size: 4;
710
+ box-sizing: border-box;
711
+ min-height: 1.4em;
712
+ }
713
+
714
+ .code-block:focus {
715
+ border-color: var(--color-accent, #567b67);
716
+ }
717
+
718
+ .code-block :global(.md-marker) {
719
+ opacity: var(--syntax-marker-dim, 0.65);
720
+ }
721
+
722
+ .code-block :global(.md-marker.md-lang) {
723
+ color: var(--color-accent, #567b67);
724
+ opacity: 0.7;
725
+ }
726
+ </style>