@voithos-labs/aragonite 0.10.3 → 0.10.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/a11y-strings.d.ts +12 -5
- package/dist/a11y-strings.js +61 -5
- package/dist/action-contracts.d.ts +242 -155
- package/dist/action-contracts.js +2 -2
- package/dist/active-editor.d.ts +3 -3
- package/dist/active-editor.js +8 -9
- package/dist/ambient/ambient-dom.d.ts +2 -5
- package/dist/ambient/ambient-dom.js +16 -62
- package/dist/assert.js +6 -5
- package/dist/block-component.d.ts +135 -109
- package/dist/block-component.js +30 -22
- package/dist/block-id.d.ts +6 -10
- package/dist/block-id.js +25 -14
- package/dist/bounded-memo.d.ts +5 -5
- package/dist/bounded-memo.js +6 -6
- package/dist/components/BlockDragHandle.svelte +13 -20
- package/dist/components/BlockHost.svelte +56 -134
- package/dist/components/BlockList.svelte +22 -19
- package/dist/components/DecorationOverlay.svelte +9 -10
- package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
- package/dist/components/Editor.svelte +619 -1089
- package/dist/components/Editor.svelte.d.ts +9 -20
- package/dist/components/GapCaret.svelte +26 -59
- package/dist/components/SelectionOverlay.svelte +36 -67
- package/dist/components/SelectionOverlay.svelte.d.ts +6 -4
- package/dist/components/TailInsert.svelte +8 -55
- package/dist/components/TailInsert.svelte.d.ts +4 -6
- package/dist/components/block-content-selector.d.ts +11 -11
- package/dist/components/block-content-selector.js +11 -11
- package/dist/components/block-el-lookup.d.ts +6 -0
- package/dist/components/block-el-lookup.js +27 -0
- package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
- package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
- package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
- package/dist/components/blocks/code/CodeBlock.svelte +255 -276
- package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
- package/dist/components/blocks/code/CodeBlockRail.svelte +103 -100
- package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
- package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
- package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
- package/dist/components/blocks/code/code-bootstrap.js +35 -28
- package/dist/components/blocks/code/code-context-actions.js +5 -4
- package/dist/components/blocks/code/code-enter.js +2 -2
- package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
- package/dist/components/blocks/code/code-fence-boundary.js +40 -66
- package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
- package/dist/components/blocks/code/code-fence-exit.js +24 -25
- package/dist/components/blocks/code/code-indent.d.ts +2 -2
- package/dist/components/blocks/code/code-indent.js +4 -7
- package/dist/components/blocks/code/code-languages.d.ts +16 -12
- package/dist/components/blocks/code/code-languages.js +58 -32
- package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
- package/dist/components/blocks/code/code-paste-surface.js +9 -18
- package/dist/components/blocks/code/code-renderer.d.ts +21 -5
- package/dist/components/blocks/code/code-renderer.js +90 -125
- package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
- package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
- package/dist/components/blocks/directive/activate-directives.js +18 -13
- package/dist/components/blocks/editable-leaf.d.ts +50 -74
- package/dist/components/blocks/editable-leaf.js +144 -202
- package/dist/components/blocks/editable-surface.d.ts +96 -100
- package/dist/components/blocks/editable-surface.js +101 -109
- package/dist/components/blocks/list/ListBlock.svelte +46 -90
- package/dist/components/blocks/list/ListItemBlock.svelte +99 -144
- package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +3 -0
- package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
- package/dist/components/blocks/list/task-checkbox.js +12 -7
- package/dist/components/blocks/plain-text-backend.d.ts +4 -20
- package/dist/components/blocks/plain-text-backend.js +9 -43
- package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
- package/dist/components/blocks/surface-wiring.svelte.js +15 -34
- package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
- package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
- package/dist/components/blocks/table/TableBlock.svelte +100 -165
- package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
- package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
- package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
- package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
- package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
- package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
- package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
- package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
- package/dist/components/blocks/table/cell-pointer.js +49 -71
- package/dist/components/blocks/table/cell-render.d.ts +24 -29
- package/dist/components/blocks/table/cell-render.js +29 -31
- package/dist/components/blocks/table/selected-cells.d.ts +7 -7
- package/dist/components/blocks/table/selected-cells.js +9 -13
- package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
- package/dist/components/blocks/table/table-caret-at-point.js +5 -5
- package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
- package/dist/components/blocks/table/table-cell-paste.js +27 -43
- package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
- package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
- package/dist/components/blocks/table/table-menu-model.js +6 -10
- package/dist/components/blocks/table/table-navigation.js +2 -2
- package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
- package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
- package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
- package/dist/components/blocks/text/auto-pair-record.js +51 -0
- package/dist/components/blocks/text/click-snap-guard.d.ts +9 -4
- package/dist/components/blocks/text/click-snap-guard.js +16 -5
- package/dist/components/blocks/text/composition-seat.d.ts +17 -14
- package/dist/components/blocks/text/composition-seat.js +11 -11
- package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
- package/dist/components/blocks/text/construct-edge-delete.js +50 -65
- package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
- package/dist/components/blocks/text/construct-reveal.js +13 -14
- package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
- package/dist/components/blocks/text/delimiter-autopair.js +87 -103
- package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
- package/dist/components/blocks/text/edge-policy-dispatch.js +164 -180
- package/dist/components/blocks/text/edge-seat.d.ts +17 -26
- package/dist/components/blocks/text/edge-seat.js +43 -70
- package/dist/components/blocks/text/link-at-point.d.ts +9 -9
- package/dist/components/blocks/text/link-at-point.js +12 -15
- package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
- package/dist/components/blocks/text/live-join-seam.js +75 -112
- package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
- package/dist/components/blocks/text/live-selection-edit.js +32 -105
- package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
- package/dist/components/blocks/text/live-split-rebalance.js +50 -67
- package/dist/components/blocks/text/marker-completion.d.ts +7 -12
- package/dist/components/blocks/text/marker-completion.js +17 -10
- package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
- package/dist/components/blocks/text/pending-mark-insert.js +30 -49
- package/dist/components/blocks/text/screen-diff.d.ts +5 -15
- package/dist/components/blocks/text/screen-diff.js +5 -19
- package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
- package/dist/components/blocks/text/text-clipboard.js +27 -32
- package/dist/components/blocks/text/text-keydown.d.ts +20 -30
- package/dist/components/blocks/text/text-keydown.js +54 -51
- package/dist/components/blocks/text/text-render.d.ts +25 -35
- package/dist/components/blocks/text/text-render.js +82 -61
- package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
- package/dist/components/blocks/text/widget-adjacency.js +17 -17
- package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
- package/dist/components/blocks/text/widget-interaction.js +243 -208
- package/dist/components/blocks/widget-portal.d.ts +20 -29
- package/dist/components/blocks/widget-portal.js +16 -14
- package/dist/components/built-in-blocks.d.ts +3 -4
- package/dist/components/built-in-blocks.js +17 -18
- package/dist/components/drag-handle.d.ts +13 -30
- package/dist/components/drag-handle.js +25 -63
- package/dist/components/editor-built-ins.d.ts +1 -0
- package/dist/components/editor-built-ins.js +16 -0
- package/dist/components/editor-root-clipboard.d.ts +6 -6
- package/dist/components/editor-root-clipboard.js +16 -27
- package/dist/components/editor-root-document-swap.d.ts +49 -0
- package/dist/components/editor-root-document-swap.js +54 -0
- package/dist/components/editor-root-focus.d.ts +5 -4
- package/dist/components/editor-root-focus.js +51 -22
- package/dist/components/editor-root-focused-surface.d.ts +35 -0
- package/dist/components/editor-root-focused-surface.js +65 -0
- package/dist/components/editor-root-geometry.d.ts +15 -24
- package/dist/components/editor-root-geometry.js +27 -31
- package/dist/components/editor-root-gestures.d.ts +39 -0
- package/dist/components/editor-root-gestures.js +189 -0
- package/dist/components/editor-root-keydown.d.ts +10 -25
- package/dist/components/editor-root-keydown.js +19 -43
- package/dist/components/editor-root-listeners.d.ts +22 -31
- package/dist/components/editor-root-listeners.js +49 -46
- package/dist/components/editor-root-menus.d.ts +51 -0
- package/dist/components/editor-root-menus.js +147 -0
- package/dist/components/editor-root-mode-flip.d.ts +16 -11
- package/dist/components/editor-root-mode-flip.js +36 -34
- package/dist/components/editor-root-scroll-host.d.ts +22 -0
- package/dist/components/editor-root-scroll-host.js +34 -0
- package/dist/components/editor-root-test-surface.d.ts +48 -0
- package/dist/components/editor-root-test-surface.js +6 -0
- package/dist/components/image/ImageOverlayHost.svelte +44 -35
- package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
- package/dist/components/image/ImageProperties.svelte +37 -41
- package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
- package/dist/components/image/ImageResizeHandles.svelte +26 -30
- package/dist/components/image/image-crop.d.ts +5 -11
- package/dist/components/image/image-crop.js +5 -11
- package/dist/components/image/image-edit-commit.d.ts +19 -16
- package/dist/components/image/image-edit-commit.js +74 -38
- package/dist/components/image/image-resize.d.ts +2 -5
- package/dist/components/image/image-resize.js +3 -6
- package/dist/components/image/image-widget-editing.d.ts +3 -3
- package/dist/components/image/image-widget-editing.js +9 -9
- package/dist/components/image/widget-dom.d.ts +2 -3
- package/dist/components/image/widget-dom.js +19 -24
- package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
- package/dist/components/image/widget-selection-state.svelte.js +26 -19
- package/dist/components/kind-cue.svelte.d.ts +21 -0
- package/dist/components/kind-cue.svelte.js +35 -0
- package/dist/components/link-card/LinkCard.svelte +115 -64
- package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
- package/dist/components/link-card/LinkCardHost.svelte +42 -33
- package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
- package/dist/components/link-card/link-card-commit.d.ts +16 -19
- package/dist/components/link-card/link-card-commit.js +21 -30
- package/dist/components/link-card/link-card-entry.d.ts +13 -23
- package/dist/components/link-card/link-card-entry.js +16 -24
- package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
- package/dist/components/link-card/link-card-state.svelte.js +2 -2
- package/dist/components/lrd-map-gate.d.ts +4 -11
- package/dist/components/lrd-map-gate.js +5 -11
- package/dist/components/menu/BlockMenu.svelte +20 -81
- package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
- package/dist/components/menu/InlineMenuHost.svelte +191 -0
- package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
- package/dist/components/menu/MenuIcon.svelte +3 -103
- package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
- package/dist/components/menu/SelectionToolbar.svelte +380 -0
- package/dist/components/menu/SelectionToolbar.svelte.d.ts +14 -0
- package/dist/components/menu/clipboard-actions.d.ts +3 -4
- package/dist/components/menu/clipboard-actions.js +3 -4
- package/dist/components/menu/default-context-actions.d.ts +4 -13
- package/dist/components/menu/default-context-actions.js +49 -67
- package/dist/components/menu/flyout-placement.d.ts +2 -2
- package/dist/components/menu/flyout-placement.js +2 -2
- package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
- package/dist/components/menu/menu-presence.svelte.js +19 -0
- package/dist/components/paste-image-arm.d.ts +6 -11
- package/dist/components/paste-image-arm.js +11 -18
- package/dist/components/portal.d.ts +2 -5
- package/dist/components/portal.js +4 -7
- package/dist/core/directive/activate.d.ts +4 -5
- package/dist/core/directive/activate.js +8 -9
- package/dist/core/directive/container-opener.js +13 -12
- package/dist/core/directive/grammar.d.ts +2 -5
- package/dist/core/directive/grammar.js +10 -10
- package/dist/core/directive/kinds.d.ts +4 -7
- package/dist/core/directive/kinds.js +14 -16
- package/dist/core/directive/registry.d.ts +12 -9
- package/dist/core/directive/registry.js +19 -20
- package/dist/core/directive/text-recognizer.d.ts +3 -2
- package/dist/core/directive/text-recognizer.js +5 -9
- package/dist/core/escapable.d.ts +1 -5
- package/dist/core/escapable.js +1 -5
- package/dist/core/inline/backticks.d.ts +3 -4
- package/dist/core/inline/backticks.js +3 -4
- package/dist/core/inline/character-refs.js +2 -1
- package/dist/core/inline/destination-bytes.d.ts +6 -3
- package/dist/core/inline/destination-bytes.js +50 -8
- package/dist/core/inline/entity-widget.d.ts +4 -3
- package/dist/core/inline/entity-widget.js +6 -6
- package/dist/core/inline/format-toggle.d.ts +22 -28
- package/dist/core/inline/format-toggle.js +97 -129
- package/dist/core/inline/html-entities.d.ts +2 -3
- package/dist/core/inline/html-entities.js +2 -3
- package/dist/core/inline/html-tag-grammar.js +6 -2
- package/dist/core/inline/image-dimensions.d.ts +2 -0
- package/dist/core/inline/image-dimensions.js +19 -2
- package/dist/core/inline/image-source-bytes.d.ts +11 -0
- package/dist/core/inline/image-source-bytes.js +71 -0
- package/dist/core/inline/index.d.ts +28 -21
- package/dist/core/inline/index.js +56 -34
- package/dist/core/inline/inline-cache.d.ts +12 -15
- package/dist/core/inline/inline-cache.js +11 -14
- package/dist/core/inline/inline-widgets.d.ts +55 -68
- package/dist/core/inline/inline-widgets.js +55 -58
- package/dist/core/inline/link-destination.d.ts +31 -0
- package/dist/core/inline/link-destination.js +129 -0
- package/dist/core/inline/link-reference-resolver.d.ts +8 -6
- package/dist/core/inline/link-reference-resolver.js +10 -6
- package/dist/core/inline/link-source-bytes.d.ts +31 -0
- package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
- package/dist/core/inline/live-edit/read-back.d.ts +29 -0
- package/dist/core/inline/live-edit/read-back.js +50 -0
- package/dist/core/inline/picture.d.ts +10 -0
- package/dist/core/inline/picture.js +40 -0
- package/dist/core/inline/scan/autolinks.d.ts +7 -8
- package/dist/core/inline/scan/autolinks.js +80 -59
- package/dist/core/inline/scan/brackets.d.ts +2 -2
- package/dist/core/inline/scan/brackets.js +6 -103
- package/dist/core/inline/scan/code-spans.d.ts +4 -0
- package/dist/core/inline/scan/code-spans.js +8 -0
- package/dist/core/inline/scan/emphasis.js +10 -14
- package/dist/core/inline/scan/index.d.ts +3 -1
- package/dist/core/inline/scan/index.js +32 -33
- package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
- package/dist/core/inline/scan/plugin-syntax.js +75 -89
- package/dist/core/inline/scan/scan-state.d.ts +2 -0
- package/dist/core/inline/scan/scan-state.js +1 -0
- package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
- package/dist/core/inline/scan/simple-nodes.js +2 -5
- package/dist/core/inline/scan/triggers.d.ts +17 -0
- package/dist/core/inline/scan/triggers.js +26 -0
- package/dist/core/inline/scan/url.js +8 -10
- package/dist/core/inline/transparency.d.ts +2 -1
- package/dist/core/inline/transparency.js +33 -17
- package/dist/core/inline/visibility.d.ts +30 -49
- package/dist/core/inline/visibility.js +31 -49
- package/dist/core/inline/walk.d.ts +4 -10
- package/dist/core/inline/walk.js +4 -10
- package/dist/core/inline-render.d.ts +22 -27
- package/dist/core/inline-render.js +51 -60
- package/dist/core/lines.d.ts +67 -26
- package/dist/core/lines.js +164 -33
- package/dist/core/metadata-parity.d.ts +9 -0
- package/dist/core/metadata-parity.js +25 -0
- package/dist/core/node-views.d.ts +7 -6
- package/dist/core/node-views.js +5 -5
- package/dist/core/nodes.d.ts +34 -44
- package/dist/core/nodes.js +4 -12
- package/dist/core/parser.d.ts +27 -34
- package/dist/core/parser.js +53 -67
- package/dist/core/parsers/blockquote.d.ts +5 -8
- package/dist/core/parsers/blockquote.js +11 -10
- package/dist/core/parsers/built-in-openers.d.ts +2 -5
- package/dist/core/parsers/built-in-openers.js +5 -8
- package/dist/core/parsers/fence-syntax.d.ts +36 -7
- package/dist/core/parsers/fence-syntax.js +61 -11
- package/dist/core/parsers/fenced-code.d.ts +16 -0
- package/dist/core/parsers/fenced-code.js +16 -15
- package/dist/core/parsers/heading.d.ts +19 -2
- package/dist/core/parsers/heading.js +50 -2
- package/dist/core/parsers/html-block.d.ts +3 -6
- package/dist/core/parsers/html-block.js +10 -11
- package/dist/core/parsers/indented-code.d.ts +1 -1
- package/dist/core/parsers/indented-code.js +2 -8
- package/dist/core/parsers/link-reference.d.ts +5 -3
- package/dist/core/parsers/link-reference.js +116 -120
- package/dist/core/parsers/list.d.ts +12 -5
- package/dist/core/parsers/list.js +53 -36
- package/dist/core/parsers/paragraph.d.ts +3 -3
- package/dist/core/parsers/paragraph.js +14 -5
- package/dist/core/parsers/table-completion.d.ts +2 -5
- package/dist/core/parsers/table-completion.js +7 -10
- package/dist/core/parsers/table.d.ts +8 -8
- package/dist/core/parsers/table.js +23 -26
- package/dist/core/parsers/thematic-break.js +15 -14
- package/dist/core/paths.d.ts +13 -0
- package/dist/core/paths.js +31 -0
- package/dist/core/terminator-escalation.d.ts +0 -7
- package/dist/core/terminator-escalation.js +5 -8
- package/dist/core/url-policy.d.ts +2 -5
- package/dist/core/url-policy.js +8 -12
- package/dist/cursor/caret-memory.d.ts +34 -0
- package/dist/cursor/caret-memory.js +82 -0
- package/dist/cursor/coordinate-spaces.d.ts +26 -19
- package/dist/cursor/coordinate-spaces.js +32 -20
- package/dist/cursor/dom-walk.d.ts +7 -13
- package/dist/cursor/dom-walk.js +7 -13
- package/dist/cursor/edge-affinity.d.ts +7 -35
- package/dist/cursor/edge-affinity.js +13 -44
- package/dist/cursor/focused-caret.d.ts +6 -8
- package/dist/cursor/focused-caret.js +7 -16
- package/dist/cursor/height-model.d.ts +3 -3
- package/dist/cursor/height-model.js +5 -5
- package/dist/cursor/height-oracle.d.ts +10 -7
- package/dist/cursor/height-oracle.js +26 -75
- package/dist/cursor/observe-resize.d.ts +13 -0
- package/dist/cursor/observe-resize.js +43 -0
- package/dist/cursor/overlay-rects.d.ts +2 -5
- package/dist/cursor/overlay-rects.js +2 -5
- package/dist/cursor/overlay-remeasure.d.ts +6 -7
- package/dist/cursor/overlay-remeasure.js +10 -14
- package/dist/cursor/pending-marks.d.ts +7 -9
- package/dist/cursor/pending-marks.js +6 -27
- package/dist/cursor/point-offset.d.ts +16 -10
- package/dist/cursor/point-offset.js +60 -25
- package/dist/cursor/reveal-source.d.ts +7 -11
- package/dist/cursor/reveal-source.js +10 -18
- package/dist/cursor/scroll-ancestors.d.ts +9 -20
- package/dist/cursor/scroll-ancestors.js +14 -26
- package/dist/cursor/scroll-owner.d.ts +92 -0
- package/dist/cursor/scroll-owner.js +283 -0
- package/dist/cursor/scrollport.d.ts +16 -8
- package/dist/cursor/scrollport.js +28 -5
- package/dist/cursor/sticky-column.d.ts +6 -29
- package/dist/cursor/sticky-column.js +6 -49
- package/dist/cursor/sticky-measure.d.ts +14 -9
- package/dist/cursor/sticky-measure.js +99 -49
- package/dist/cursor/surface-backend.d.ts +41 -0
- package/dist/cursor/surface-backend.js +78 -0
- package/dist/cursor/typography-estimates.d.ts +3 -3
- package/dist/cursor/typography-estimates.js +3 -3
- package/dist/cursor/visual-lines.d.ts +25 -13
- package/dist/cursor/visual-lines.js +72 -28
- package/dist/cursor/widget-edge-snap.d.ts +23 -0
- package/dist/cursor/widget-edge-snap.js +39 -0
- package/dist/cursor/widget-offset.d.ts +111 -102
- package/dist/cursor/widget-offset.js +352 -177
- package/dist/debug/diagnostics-report.d.ts +6 -6
- package/dist/debug/diagnostics-report.js +5 -5
- package/dist/debug/dump-tree.js +2 -2
- package/dist/debug/editor-diagnostics.d.ts +15 -0
- package/dist/debug/editor-diagnostics.js +33 -0
- package/dist/debug/inspect.d.ts +2 -2
- package/dist/debug/inspect.js +4 -4
- package/dist/debug/interaction-trace.d.ts +14 -15
- package/dist/debug/interaction-trace.js +19 -20
- package/dist/debug/operations-log.d.ts +1 -1
- package/dist/debug/operations-log.js +1 -1
- package/dist/decorations/buckets.d.ts +6 -12
- package/dist/decorations/buckets.js +4 -11
- package/dist/decorations/decoration-state.svelte.d.ts +2 -3
- package/dist/decorations/decoration-state.svelte.js +24 -26
- package/dist/decorations/island-dom.d.ts +10 -18
- package/dist/decorations/island-dom.js +25 -50
- package/dist/decorations/reserved-attrs.d.ts +6 -8
- package/dist/decorations/reserved-attrs.js +31 -17
- package/dist/decorations/types.d.ts +6 -7
- package/dist/decorations/types.js +2 -1
- package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
- package/dist/decorations/use-block-decorations.svelte.js +71 -0
- package/dist/decorations/widget-dom.d.ts +3 -3
- package/dist/decorations/widget-dom.js +5 -5
- package/dist/dev-warn.d.ts +5 -2
- package/dist/dev-warn.js +16 -4
- package/dist/editor-actions/ancestry-folds.d.ts +9 -14
- package/dist/editor-actions/ancestry-folds.js +13 -18
- package/dist/editor-actions/block-edit-core.d.ts +49 -22
- package/dist/editor-actions/block-edit-core.js +279 -151
- package/dist/editor-actions/block-edit-scope.d.ts +63 -50
- package/dist/editor-actions/block-edit-scope.js +100 -48
- package/dist/editor-actions/block-edit.d.ts +2 -3
- package/dist/editor-actions/block-edit.js +14 -90
- package/dist/editor-actions/commit/history.d.ts +4 -4
- package/dist/editor-actions/commit/history.js +33 -34
- package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
- package/dist/editor-actions/commit/reading-write-gate.js +56 -0
- package/dist/editor-actions/commit/text-batch.d.ts +7 -11
- package/dist/editor-actions/commit/text-batch.js +6 -7
- package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
- package/dist/editor-actions/commit/undo-controller.js +346 -216
- package/dist/editor-actions/container-block-component.d.ts +32 -51
- package/dist/editor-actions/container-block-component.js +66 -92
- package/dist/editor-actions/container-edit.d.ts +4 -2
- package/dist/editor-actions/container-edit.js +14 -44
- package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
- package/dist/editor-actions/container-exit-overrides.js +19 -21
- package/dist/editor-actions/deps.d.ts +25 -32
- package/dist/editor-actions/enter-completion.d.ts +12 -15
- package/dist/editor-actions/enter-completion.js +49 -51
- package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
- package/dist/editor-actions/focus/focus-dispatch.js +33 -52
- package/dist/editor-actions/focus/focus-landing.d.ts +11 -5
- package/dist/editor-actions/focus/focus-landing.js +29 -14
- package/dist/editor-actions/focus/focus.d.ts +3 -2
- package/dist/editor-actions/focus/focus.js +42 -59
- package/dist/editor-actions/index.d.ts +4 -3
- package/dist/editor-actions/index.js +5 -4
- package/dist/editor-actions/inline-range-commit.d.ts +18 -16
- package/dist/editor-actions/inline-range-commit.js +45 -54
- package/dist/editor-actions/leaf-write.d.ts +11 -0
- package/dist/editor-actions/leaf-write.js +102 -0
- package/dist/editor-actions/list-context.d.ts +9 -10
- package/dist/editor-actions/list-context.js +115 -110
- package/dist/editor-actions/list-overrides.d.ts +13 -5
- package/dist/editor-actions/list-overrides.js +36 -12
- package/dist/editor-actions/merge-fallback.d.ts +10 -16
- package/dist/editor-actions/merge-fallback.js +11 -22
- package/dist/editor-actions/nested/container-actions.d.ts +37 -0
- package/dist/editor-actions/nested/container-actions.js +42 -0
- package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
- package/dist/editor-actions/nested/emptied-container.js +5 -0
- package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
- package/dist/editor-actions/nested/nested-actions.js +17 -15
- package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
- package/dist/editor-actions/nested/nested-block-edit.js +40 -134
- package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
- package/dist/editor-actions/nested/nested-focus.js +33 -21
- package/dist/editor-actions/paste-coordinator.d.ts +3 -2
- package/dist/editor-actions/paste-coordinator.js +17 -13
- package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
- package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
- package/dist/editor-actions/plugin/container.d.ts +55 -76
- package/dist/editor-actions/plugin/container.js +105 -186
- package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
- package/dist/editor-actions/plugin/directive-container.js +7 -8
- package/dist/editor-actions/reorder-action.d.ts +7 -12
- package/dist/editor-actions/reorder-action.js +32 -48
- package/dist/editor-actions/reorder-drag.d.ts +12 -8
- package/dist/editor-actions/reorder-drag.js +45 -41
- package/dist/editor-actions/replacement-focus.d.ts +13 -21
- package/dist/editor-actions/replacement-focus.js +32 -33
- package/dist/editor-actions/search-replace.js +71 -67
- package/dist/editor-actions/stored-caret.d.ts +7 -0
- package/dist/editor-actions/stored-caret.js +10 -0
- package/dist/editor-actions/table-context.d.ts +9 -11
- package/dist/editor-actions/table-context.js +70 -93
- package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
- package/dist/editor-actions/unwrap-strategies.js +52 -63
- package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
- package/dist/editor-actions/whole-block-focus-surface.js +43 -53
- package/dist/editor-events.d.ts +25 -29
- package/dist/editor-events.js +17 -28
- package/dist/editor-keys.d.ts +96 -104
- package/dist/editor-keys.js +11 -24
- package/dist/editor-props.d.ts +91 -71
- package/dist/editor-rects.d.ts +23 -34
- package/dist/editor-rects.js +9 -77
- package/dist/env.d.ts +6 -4
- package/dist/env.js +8 -4
- package/dist/index.d.ts +6 -2
- package/dist/index.js +5 -2
- package/dist/inline-menu/inline-menu-session.d.ts +37 -0
- package/dist/inline-menu/inline-menu-session.js +98 -0
- package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
- package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
- package/dist/inline-menu/types.d.ts +77 -0
- package/dist/inline-menu/types.js +7 -0
- package/dist/invariants/child-id-parity.d.ts +23 -0
- package/dist/invariants/child-id-parity.js +39 -0
- package/dist/invariants/commit-paths.d.ts +4 -4
- package/dist/invariants/commit-paths.js +4 -4
- package/dist/invariants/commit-scope.d.ts +4 -4
- package/dist/invariants/commit-scope.js +9 -8
- package/dist/invariants/context-keys.d.ts +2 -5
- package/dist/invariants/context-keys.js +3 -6
- package/dist/invariants/descriptor.d.ts +2 -6
- package/dist/invariants/descriptor.js +2 -6
- package/dist/invariants/inline-transitions.d.ts +9 -16
- package/dist/invariants/inline-transitions.js +10 -18
- package/dist/invariants/install.d.ts +18 -27
- package/dist/invariants/install.js +29 -30
- package/dist/invariants/keeps-a-block.d.ts +7 -0
- package/dist/invariants/keeps-a-block.js +14 -0
- package/dist/invariants/landable-caret.d.ts +5 -7
- package/dist/invariants/landable-caret.js +8 -11
- package/dist/invariants/landing-focus-scroll.d.ts +7 -0
- package/dist/invariants/landing-focus-scroll.js +13 -0
- package/dist/invariants/landing-value.d.ts +13 -0
- package/dist/invariants/landing-value.js +27 -0
- package/dist/invariants/marker-css-parity.d.ts +5 -6
- package/dist/invariants/marker-css-parity.js +11 -12
- package/dist/invariants/measures-in-own-list.d.ts +6 -0
- package/dist/invariants/measures-in-own-list.js +13 -0
- package/dist/invariants/node-shape.d.ts +18 -37
- package/dist/invariants/node-shape.js +123 -79
- package/dist/invariants/open-tail.d.ts +7 -0
- package/dist/invariants/open-tail.js +45 -0
- package/dist/invariants/placement-ends-widget.d.ts +8 -0
- package/dist/invariants/placement-ends-widget.js +13 -0
- package/dist/invariants/registry.d.ts +27 -66
- package/dist/invariants/registry.js +61 -137
- package/dist/invariants/render-fidelity.d.ts +4 -4
- package/dist/invariants/render-fidelity.js +5 -5
- package/dist/invariants/selection-endpoints.d.ts +6 -7
- package/dist/invariants/selection-endpoints.js +18 -16
- package/dist/invariants/single-node-sink.d.ts +4 -5
- package/dist/invariants/single-node-sink.js +4 -5
- package/dist/invariants/snapshot-integrity.d.ts +5 -6
- package/dist/invariants/snapshot-integrity.js +1 -1
- package/dist/invariants/structural-descriptor.d.ts +6 -15
- package/dist/invariants/structural-descriptor.js +6 -15
- package/dist/menu-icons.d.ts +47 -0
- package/dist/menu-icons.js +113 -0
- package/dist/perf/instruments.d.ts +20 -5
- package/dist/perf/instruments.js +35 -15
- package/dist/perf/use-mount-gauge.svelte.js +4 -4
- package/dist/plugin.d.ts +38 -8
- package/dist/plugin.js +102 -74
- package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
- package/dist/plugins/admonitions/admonition-kind.js +12 -10
- package/dist/plugins/admonitions/convert-document.d.ts +5 -5
- package/dist/plugins/admonitions/convert-document.js +8 -7
- package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
- package/dist/plugins/admonitions/gh-alert.js +21 -22
- package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
- package/dist/plugins/admonitions/github-alert-kind.js +28 -37
- package/dist/plugins/admonitions/index.js +2 -2
- package/dist/plugins/admonitions/kinds.d.ts +1 -1
- package/dist/plugins/admonitions/register.js +11 -2
- package/dist/plugins/details/DetailsBlock.svelte +20 -20
- package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
- package/dist/plugins/details/details-disclosure.svelte.js +6 -7
- package/dist/plugins/details/details-kind.d.ts +6 -7
- package/dist/plugins/details/details-kind.js +44 -59
- package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
- package/dist/plugins/emoji/emoji-recognizer.js +7 -14
- package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
- package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
- package/dist/plugins/footnotes/constants.d.ts +2 -0
- package/dist/plugins/footnotes/constants.js +3 -0
- package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
- package/dist/plugins/footnotes/footnote-definition.js +69 -45
- package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
- package/dist/plugins/footnotes/footnote-lookup.js +14 -26
- package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
- package/dist/plugins/footnotes/footnote-numbering.js +22 -31
- package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
- package/dist/plugins/footnotes/footnote-reference.js +8 -13
- package/dist/plugins/footnotes/index.js +2 -3
- package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
- package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
- package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
- package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
- package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
- package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
- package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
- package/dist/plugins/highlight-occurrences/word-char.js +4 -0
- package/dist/plugins/latex/BlockMath.svelte +58 -75
- package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
- package/dist/plugins/latex/MathInline.svelte +10 -9
- package/dist/plugins/latex/flanking.d.ts +1 -0
- package/dist/plugins/latex/flanking.js +3 -0
- package/dist/plugins/latex/index.d.ts +1 -1
- package/dist/plugins/latex/latex-kind.d.ts +4 -4
- package/dist/plugins/latex/latex-kind.js +113 -85
- package/dist/plugins/latex/math-completion.d.ts +1 -1
- package/dist/plugins/latex/math-completion.js +5 -8
- package/dist/plugins/latex/math-layout.d.ts +2 -8
- package/dist/plugins/latex/math-layout.js +0 -9
- package/dist/plugins/latex/math-renderer.d.ts +17 -20
- package/dist/plugins/latex/math-renderer.js +21 -38
- package/dist/plugins/latex/math-source.d.ts +4 -8
- package/dist/plugins/latex/math-source.js +36 -75
- package/dist/plugins/latex/register.d.ts +10 -11
- package/dist/plugins/latex/register.js +24 -10
- package/dist/plugins/latex/renderer.d.ts +9 -10
- package/dist/plugins/latex/renderer.js +9 -24
- package/dist/plugins/mermaid/MermaidBlock.svelte +63 -47
- package/dist/plugins/mermaid/index.js +1 -1
- package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
- package/dist/plugins/mermaid/mermaid-kind.js +30 -47
- package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
- package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
- package/dist/plugins/mermaid/register.d.ts +3 -3
- package/dist/plugins/mermaid/register.js +5 -5
- package/dist/plugins/mermaid/renderer.d.ts +5 -5
- package/dist/plugins/mermaid/renderer.js +8 -11
- package/dist/plugins/parrot/ParrotBlock.svelte +18 -7
- package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
- package/dist/plugins/parrot/parrot-plugin.js +3 -3
- package/dist/plugins/slash-commands/filter.d.ts +23 -0
- package/dist/plugins/slash-commands/filter.js +31 -0
- package/dist/plugins/slash-commands/index.d.ts +2 -0
- package/dist/plugins/slash-commands/index.js +2 -0
- package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
- package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
- package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
- package/dist/plugins/slash-commands/slash-source.js +108 -0
- package/dist/plugins/toc/TocBlock.svelte +23 -22
- package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
- package/dist/plugins/toc/heading-outline.d.ts +7 -12
- package/dist/plugins/toc/heading-outline.js +22 -36
- package/dist/plugins/toc/navigation-queue.d.ts +2 -4
- package/dist/plugins/toc/toc-plugin.d.ts +5 -5
- package/dist/plugins/toc/toc-plugin.js +20 -13
- package/dist/presentation-mode.d.ts +15 -23
- package/dist/presentation-mode.js +19 -25
- package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
- package/dist/reactivity/block-list-state.svelte.js +8 -9
- package/dist/reactivity/block-window.svelte.d.ts +12 -6
- package/dist/reactivity/block-window.svelte.js +44 -17
- package/dist/reactivity/child-list.d.ts +34 -0
- package/dist/reactivity/child-list.js +48 -0
- package/dist/reactivity/content-version.svelte.d.ts +4 -7
- package/dist/reactivity/content-version.svelte.js +3 -5
- package/dist/reactivity/hold-across.d.ts +39 -0
- package/dist/reactivity/hold-across.js +57 -0
- package/dist/reactivity/layout-state.svelte.d.ts +27 -0
- package/dist/reactivity/layout-state.svelte.js +51 -0
- package/dist/reactivity/list-tree.d.ts +39 -0
- package/dist/reactivity/list-tree.js +132 -0
- package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
- package/dist/reactivity/list-windowing.svelte.js +143 -292
- package/dist/reactivity/measure-batch.d.ts +6 -8
- package/dist/reactivity/measure-batch.js +5 -6
- package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
- package/dist/reactivity/publish-ref.svelte.js +21 -85
- package/dist/reactivity/scope-geometry.d.ts +6 -13
- package/dist/reactivity/scope-geometry.js +7 -14
- package/dist/reactivity/state-registry.d.ts +5 -5
- package/dist/reactivity/state-registry.js +11 -15
- package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
- package/dist/reactivity/use-container-windowing.svelte.js +64 -74
- package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
- package/dist/reactivity/use-measured-child.svelte.js +41 -0
- package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
- package/dist/reactivity/use-window-floor.svelte.js +27 -0
- package/dist/reactivity/window-slice.d.ts +4 -4
- package/dist/reactivity/window-slice.js +0 -2
- package/dist/renderer-slot.d.ts +48 -0
- package/dist/renderer-slot.js +85 -0
- package/dist/scan-index.d.ts +4 -4
- package/dist/scan-index.js +4 -4
- package/dist/schema/block-commands.d.ts +69 -54
- package/dist/schema/block-commands.js +91 -104
- package/dist/schema/block-completions.d.ts +16 -19
- package/dist/schema/block-completions.js +25 -32
- package/dist/schema/block-component-registry.d.ts +13 -14
- package/dist/schema/block-component-registry.js +19 -17
- package/dist/schema/block-kind-descriptor.d.ts +234 -168
- package/dist/schema/block-kind-descriptor.js +151 -66
- package/dist/schema/block-openers.d.ts +48 -39
- package/dist/schema/block-openers.js +73 -83
- package/dist/schema/built-in-descriptors.d.ts +3 -5
- package/dist/schema/built-in-descriptors.js +96 -80
- package/dist/schema/child-spans.d.ts +12 -10
- package/dist/schema/child-spans.js +68 -34
- package/dist/schema/closure.d.ts +18 -16
- package/dist/schema/closure.js +24 -14
- package/dist/schema/command-id.d.ts +6 -8
- package/dist/schema/command-id.js +20 -25
- package/dist/schema/commands.d.ts +79 -81
- package/dist/schema/commands.js +156 -116
- package/dist/schema/container-raw.d.ts +51 -11
- package/dist/schema/container-raw.js +143 -14
- package/dist/schema/container-rebuilders.d.ts +17 -15
- package/dist/schema/container-rebuilders.js +30 -22
- package/dist/schema/context-actions.d.ts +25 -13
- package/dist/schema/context-actions.js +32 -17
- package/dist/schema/define-plugin-block.d.ts +8 -6
- package/dist/schema/define-plugin-block.js +6 -4
- package/dist/schema/fenced-code-raw.d.ts +30 -17
- package/dist/schema/fenced-code-raw.js +155 -107
- package/dist/schema/global-commands.d.ts +6 -6
- package/dist/schema/global-commands.js +14 -22
- package/dist/schema/height-estimates.d.ts +31 -0
- package/dist/schema/height-estimates.js +64 -0
- package/dist/schema/inline-construct-policy.d.ts +42 -55
- package/dist/schema/inline-construct-policy.js +36 -35
- package/dist/schema/insert-catalogue.d.ts +30 -0
- package/dist/schema/insert-catalogue.js +95 -0
- package/dist/schema/keybinding-overrides.d.ts +9 -11
- package/dist/schema/keybinding-overrides.js +1 -1
- package/dist/schema/keybindings.d.ts +15 -7
- package/dist/schema/keybindings.js +21 -9
- package/dist/schema/merge-rules.d.ts +5 -7
- package/dist/schema/merge-rules.js +7 -9
- package/dist/schema/opener-priorities.d.ts +4 -4
- package/dist/schema/opener-priorities.js +4 -4
- package/dist/schema/operations.d.ts +9 -11
- package/dist/schema/operations.js +3 -3
- package/dist/schema/page-role.d.ts +14 -0
- package/dist/schema/page-role.js +19 -0
- package/dist/schema/plugin-activation.d.ts +4 -6
- package/dist/schema/plugin-activation.js +12 -10
- package/dist/schema/plugin-editor-context.d.ts +25 -10
- package/dist/schema/plugin-editor-context.js +40 -9
- package/dist/schema/plugin-install.d.ts +49 -17
- package/dist/schema/plugin-install.js +51 -25
- package/dist/schema/plugin-kind.d.ts +12 -8
- package/dist/schema/plugin-kind.js +35 -42
- package/dist/schema/plugin-name.js +3 -3
- package/dist/schema/plugin-registry.d.ts +54 -0
- package/dist/schema/plugin-registry.js +70 -0
- package/dist/schema/reading.d.ts +23 -0
- package/dist/schema/reading.js +7 -0
- package/dist/schema/register-once.d.ts +3 -5
- package/dist/schema/register-once.js +7 -16
- package/dist/schema/registration-checks.d.ts +12 -16
- package/dist/schema/registration-checks.js +35 -51
- package/dist/schema/registration-pairs.d.ts +54 -0
- package/dist/schema/registration-pairs.js +48 -0
- package/dist/schema/registration-pending.d.ts +8 -12
- package/dist/schema/registration-pending.js +9 -9
- package/dist/schema/registry-reset.d.ts +8 -4
- package/dist/schema/registry-reset.js +13 -26
- package/dist/schema/registry-view.d.ts +25 -13
- package/dist/schema/registry-view.js +26 -20
- package/dist/schema/reserved-chords.d.ts +9 -10
- package/dist/schema/reserved-chords.js +73 -78
- package/dist/schema/reserved-chrome.d.ts +12 -11
- package/dist/schema/reserved-chrome.js +15 -11
- package/dist/schema/setext-raw.d.ts +13 -0
- package/dist/schema/setext-raw.js +33 -0
- package/dist/schema/stored-as.d.ts +20 -0
- package/dist/schema/stored-as.js +6 -0
- package/dist/schema/table-cell-raw.d.ts +18 -7
- package/dist/schema/table-cell-raw.js +28 -7
- package/dist/schema/whole-block-unit.d.ts +5 -4
- package/dist/schema/whole-block-unit.js +5 -4
- package/dist/search/document-scan.d.ts +3 -3
- package/dist/search/document-scan.js +2 -2
- package/dist/search/matcher.d.ts +1 -1
- package/dist/search/regex-executor.d.ts +5 -6
- package/dist/search/regex-executor.js +6 -8
- package/dist/search/replace.d.ts +2 -5
- package/dist/search/replace.js +2 -5
- package/dist/search/search-state.svelte.d.ts +5 -5
- package/dist/search/search-state.svelte.js +12 -16
- package/dist/selection/autoscroll.d.ts +6 -9
- package/dist/selection/block-hit-test.d.ts +16 -24
- package/dist/selection/block-hit-test.js +29 -22
- package/dist/selection/caret-doors.d.ts +15 -14
- package/dist/selection/caret-doors.js +37 -26
- package/dist/selection/caret-landing.d.ts +62 -0
- package/dist/selection/caret-landing.js +157 -0
- package/dist/selection/caret-restore.d.ts +17 -10
- package/dist/selection/caret-restore.js +10 -22
- package/dist/selection/caret-target.d.ts +30 -0
- package/dist/selection/caret-target.js +84 -0
- package/dist/selection/char-endpoint-snap.d.ts +6 -10
- package/dist/selection/char-endpoint-snap.js +8 -14
- package/dist/selection/clipboard-text.d.ts +5 -12
- package/dist/selection/clipboard-text.js +69 -172
- package/dist/selection/covered-block.d.ts +6 -8
- package/dist/selection/covered-block.js +8 -19
- package/dist/selection/cross-block/clipboard.d.ts +3 -2
- package/dist/selection/cross-block/clipboard.js +13 -4
- package/dist/selection/cross-block/dispatch.d.ts +47 -43
- package/dist/selection/cross-block/dispatch.js +12 -23
- package/dist/selection/cross-block/format-range.d.ts +18 -21
- package/dist/selection/cross-block/format-range.js +104 -103
- package/dist/selection/cross-block/format-toggle.d.ts +10 -15
- package/dist/selection/cross-block/format-toggle.js +28 -33
- package/dist/selection/cross-block/keydown.d.ts +4 -4
- package/dist/selection/cross-block/keydown.js +93 -152
- package/dist/selection/cross-block/ops.d.ts +19 -34
- package/dist/selection/cross-block/ops.js +110 -95
- package/dist/selection/cross-block/paste.d.ts +2 -3
- package/dist/selection/cross-block/paste.js +61 -104
- package/dist/selection/cross-block/pointer.d.ts +17 -15
- package/dist/selection/cross-block/pointer.js +74 -25
- package/dist/selection/cross-block/type-replace.d.ts +4 -6
- package/dist/selection/cross-block/type-replace.js +53 -146
- package/dist/selection/dead-space-caret.d.ts +20 -28
- package/dist/selection/dead-space-caret.js +79 -87
- package/dist/selection/drag-pointer.d.ts +22 -5
- package/dist/selection/drag-pointer.js +63 -31
- package/dist/selection/gap-caret.d.ts +17 -28
- package/dist/selection/gap-caret.js +14 -26
- package/dist/selection/grid-selection.d.ts +12 -0
- package/dist/selection/grid-selection.js +22 -0
- package/dist/selection/keyboard-extend.d.ts +27 -39
- package/dist/selection/keyboard-extend.js +94 -116
- package/dist/selection/multi-click.d.ts +37 -0
- package/dist/selection/multi-click.js +197 -0
- package/dist/selection/native-bridge.d.ts +30 -37
- package/dist/selection/native-bridge.js +80 -100
- package/dist/selection/nearest-block.d.ts +17 -12
- package/dist/selection/nearest-block.js +37 -18
- package/dist/selection/path-lookup.d.ts +31 -14
- package/dist/selection/path-lookup.js +110 -20
- package/dist/selection/path-math.d.ts +9 -11
- package/dist/selection/path-math.js +5 -7
- package/dist/selection/pointer-gesture.d.ts +9 -0
- package/dist/selection/pointer-gesture.js +11 -0
- package/dist/selection/pointer-session.d.ts +10 -16
- package/dist/selection/pointer-session.js +6 -7
- package/dist/selection/primitives.d.ts +64 -33
- package/dist/selection/primitives.js +61 -53
- package/dist/selection/range-coverage.d.ts +94 -0
- package/dist/selection/range-coverage.js +365 -0
- package/dist/selection/range-delete-ceremony.d.ts +28 -74
- package/dist/selection/range-delete-ceremony.js +100 -141
- package/dist/selection/range-delete-chrome.d.ts +20 -33
- package/dist/selection/range-delete-chrome.js +53 -78
- package/dist/selection/range-delete-table-coverage.d.ts +11 -25
- package/dist/selection/range-delete-table-coverage.js +42 -112
- package/dist/selection/range-delete-table.d.ts +14 -12
- package/dist/selection/range-delete-table.js +106 -310
- package/dist/selection/range-delete.d.ts +18 -19
- package/dist/selection/range-delete.js +83 -123
- package/dist/selection/round-trip-restore.d.ts +18 -0
- package/dist/selection/round-trip-restore.js +19 -0
- package/dist/selection/selection-announcer.d.ts +17 -0
- package/dist/selection/selection-announcer.js +25 -0
- package/dist/selection/selection-description.d.ts +4 -3
- package/dist/selection/selection-description.js +5 -4
- package/dist/selection/selection-drop.d.ts +52 -0
- package/dist/selection/selection-drop.js +317 -0
- package/dist/selection/selection-restore.d.ts +20 -33
- package/dist/selection/selection-restore.js +21 -44
- package/dist/selection/selection-state.svelte.d.ts +50 -42
- package/dist/selection/selection-state.svelte.js +144 -98
- package/dist/selection/shared-keydown.d.ts +22 -27
- package/dist/selection/shared-keydown.js +25 -45
- package/dist/selection/table-endpoint-snap.d.ts +17 -41
- package/dist/selection/table-endpoint-snap.js +54 -80
- package/dist/selection/table-rect-extend.d.ts +3 -6
- package/dist/selection/table-rect-extend.js +19 -14
- package/dist/styles/editor-theme.css +75 -53
- package/dist/styles/editor.css +248 -139
- package/dist/testing/conformance-core.d.ts +50 -18
- package/dist/testing/conformance-core.js +88 -50
- package/dist/testing/container-conformance.d.ts +48 -84
- package/dist/testing/container-conformance.js +159 -285
- package/dist/testing/headless-actions.d.ts +34 -19
- package/dist/testing/headless-actions.js +116 -65
- package/dist/testing/headless-block-list.svelte.d.ts +16 -0
- package/dist/testing/headless-block-list.svelte.js +22 -0
- package/dist/testing/inline-conformance.d.ts +15 -22
- package/dist/testing/inline-conformance.js +131 -148
- package/dist/testing/kind-conformance.d.ts +19 -24
- package/dist/testing/kind-conformance.js +204 -117
- package/dist/testing/kit-reading.d.ts +7 -0
- package/dist/testing/kit-reading.js +16 -0
- package/dist/testing/mount-dom-stubs.d.ts +4 -5
- package/dist/testing/mount-dom-stubs.js +8 -5
- package/dist/testing/parse-convergence.d.ts +10 -10
- package/dist/testing/parse-convergence.js +14 -49
- package/dist/testing.d.ts +13 -9
- package/dist/testing.js +28 -38
- package/dist/tree-operations/blockquote.d.ts +8 -14
- package/dist/tree-operations/blockquote.js +25 -45
- package/dist/tree-operations/chain-rebuild.d.ts +34 -25
- package/dist/tree-operations/chain-rebuild.js +115 -52
- package/dist/tree-operations/children.d.ts +5 -9
- package/dist/tree-operations/children.js +7 -11
- package/dist/tree-operations/cleanup.d.ts +6 -7
- package/dist/tree-operations/cleanup.js +14 -11
- package/dist/tree-operations/clone.js +5 -4
- package/dist/tree-operations/container-lift.d.ts +10 -5
- package/dist/tree-operations/container-lift.js +20 -14
- package/dist/tree-operations/container-offsets.d.ts +22 -0
- package/dist/tree-operations/container-offsets.js +89 -0
- package/dist/tree-operations/content-write.d.ts +52 -29
- package/dist/tree-operations/content-write.js +155 -110
- package/dist/tree-operations/index.d.ts +4 -4
- package/dist/tree-operations/index.js +4 -4
- package/dist/tree-operations/keep-one-block.d.ts +10 -0
- package/dist/tree-operations/keep-one-block.js +19 -0
- package/dist/tree-operations/leaf-range.d.ts +33 -0
- package/dist/tree-operations/leaf-range.js +67 -0
- package/dist/tree-operations/list/empty-check.d.ts +2 -3
- package/dist/tree-operations/list/empty-check.js +4 -4
- package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
- package/dist/tree-operations/list/exit-replacement.js +4 -9
- package/dist/tree-operations/list/item-partition.d.ts +2 -2
- package/dist/tree-operations/list/item-partition.js +2 -2
- package/dist/tree-operations/list/list-builders.d.ts +18 -16
- package/dist/tree-operations/list/list-builders.js +59 -30
- package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
- package/dist/tree-operations/list/ordered-markers.js +7 -16
- package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
- package/dist/tree-operations/list/reconcile-task.js +80 -23
- package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
- package/dist/tree-operations/list/sublist-separator.js +20 -27
- package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
- package/dist/tree-operations/list/task-paragraph.js +54 -0
- package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
- package/dist/tree-operations/list/unwrap-merge.js +44 -79
- package/dist/tree-operations/node-ops.d.ts +30 -52
- package/dist/tree-operations/node-ops.js +152 -218
- package/dist/tree-operations/node-primitives.d.ts +44 -31
- package/dist/tree-operations/node-primitives.js +84 -60
- package/dist/tree-operations/open-tail.d.ts +25 -0
- package/dist/tree-operations/open-tail.js +100 -0
- package/dist/tree-operations/parse-block.d.ts +15 -2
- package/dist/tree-operations/parse-block.js +19 -4
- package/dist/tree-operations/paste/apply.d.ts +7 -8
- package/dist/tree-operations/paste/apply.js +33 -63
- package/dist/tree-operations/paste/body-write.d.ts +8 -6
- package/dist/tree-operations/paste/body-write.js +13 -14
- package/dist/tree-operations/paste/container-match.d.ts +7 -10
- package/dist/tree-operations/paste/container-match.js +76 -58
- package/dist/tree-operations/paste/container-paste.d.ts +3 -3
- package/dist/tree-operations/paste/container-paste.js +3 -3
- package/dist/tree-operations/paste/dispatch.d.ts +26 -29
- package/dist/tree-operations/paste/dispatch.js +68 -53
- package/dist/tree-operations/paste/focus-target.d.ts +11 -14
- package/dist/tree-operations/paste/focus-target.js +13 -18
- package/dist/tree-operations/paste/hooks.d.ts +7 -12
- package/dist/tree-operations/paste/hooks.js +49 -46
- package/dist/tree-operations/paste/line-ending.d.ts +11 -0
- package/dist/tree-operations/paste/line-ending.js +32 -0
- package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
- package/dist/tree-operations/paste/list-absorb.js +17 -19
- package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
- package/dist/tree-operations/paste/list-break-out.js +24 -32
- package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
- package/dist/tree-operations/paste/parent-scope.js +9 -16
- package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
- package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
- package/dist/tree-operations/paste/paste-replacement.js +73 -42
- package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
- package/dist/tree-operations/paste/paste-transforms.js +18 -27
- package/dist/tree-operations/paste/replacement-parse.d.ts +19 -0
- package/dist/tree-operations/paste/replacement-parse.js +24 -0
- package/dist/tree-operations/paste/strategy.d.ts +1 -1
- package/dist/tree-operations/paste/strategy.js +1 -1
- package/dist/tree-operations/paste/table-slice.js +15 -10
- package/dist/tree-operations/paste-surfaces.d.ts +18 -29
- package/dist/tree-operations/paste-surfaces.js +14 -10
- package/dist/tree-operations/path-mutate.d.ts +7 -8
- package/dist/tree-operations/path-mutate.js +4 -4
- package/dist/tree-operations/reorder-unit.d.ts +4 -5
- package/dist/tree-operations/reorder-unit.js +5 -6
- package/dist/tree-operations/reorder.d.ts +7 -9
- package/dist/tree-operations/reorder.js +39 -40
- package/dist/tree-operations/settle.d.ts +42 -53
- package/dist/tree-operations/settle.js +241 -162
- package/dist/tree-operations/sharing.d.ts +5 -5
- package/dist/tree-operations/splice-many.d.ts +5 -5
- package/dist/tree-operations/splice-many.js +5 -5
- package/dist/tree-operations/stored-as.d.ts +13 -0
- package/dist/tree-operations/stored-as.js +48 -0
- package/dist/tree-operations/structural-change.d.ts +11 -15
- package/dist/tree-operations/structural-change.js +10 -14
- package/dist/tree-operations/structural-suffix.d.ts +22 -0
- package/dist/tree-operations/structural-suffix.js +61 -0
- package/dist/tree-operations/sub-table-copy.d.ts +7 -0
- package/dist/tree-operations/sub-table-copy.js +40 -36
- package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
- package/dist/tree-operations/table-grid-clipboard.js +11 -36
- package/dist/tree-operations/table-mutations.d.ts +7 -3
- package/dist/tree-operations/table-mutations.js +45 -9
- package/dist/tree-operations/unshare.d.ts +11 -15
- package/dist/tree-operations/unshare.js +15 -17
- package/dist/undo/manager.js +1 -1
- package/dist/undo/types.d.ts +2 -2
- package/docs/guide/consumer-guide.md +329 -205
- package/docs/guide/directives.md +7 -7
- package/docs/guide/plugin-api.md +267 -183
- package/docs/guide/plugin-guide.md +341 -235
- package/docs/guide/plugin-testing.md +96 -82
- package/package.json +17 -21
- package/dist/ambient/ambient-cursor.d.ts +0 -41
- package/dist/ambient/ambient-cursor.js +0 -120
- package/dist/components/blocks/code/code-paste.d.ts +0 -24
- package/dist/components/blocks/code/code-paste.js +0 -21
- package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
- package/dist/components/blocks/table/cell-clipboard.js +0 -67
- package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
- package/dist/components/blocks/text/hidden-suffix.js +0 -15
- package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
- package/dist/components/image/image-source-bytes.d.ts +0 -15
- package/dist/components/image/image-source-bytes.js +0 -80
- package/dist/cursor/content-offsets.d.ts +0 -29
- package/dist/cursor/content-offsets.js +0 -151
- package/dist/cursor/reveal-anchor.d.ts +0 -30
- package/dist/cursor/reveal-anchor.js +0 -31
- package/dist/invariants/split-landing.d.ts +0 -8
- package/dist/invariants/split-landing.js +0 -15
- package/dist/selection/double-click-trim.d.ts +0 -17
- package/dist/selection/double-click-trim.js +0 -57
- package/dist/tree-operations/list/terminator.d.ts +0 -17
- package/dist/tree-operations/list/terminator.js +0 -60
- package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -29
- package/dist/tree-operations/paste/replace-block-at-parent.js +0 -75
|
@@ -1,32 +1,195 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
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,
|
|
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
|
-
/**
|
|
15
|
-
*
|
|
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
|
|
19
|
-
* so the
|
|
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
|
-
*
|
|
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
|
-
//
|
|
29
|
-
//
|
|
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
|
|
41
|
-
// pixel, so the walk reports
|
|
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
|
|
48
|
-
//
|
|
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
|
-
/**
|
|
57
|
-
*
|
|
58
|
-
export function
|
|
59
|
-
|
|
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
|
-
*
|
|
66
|
-
* `
|
|
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
|
|
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
|
-
//
|
|
79
|
-
// beside it
|
|
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
|
|
89
|
-
//
|
|
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
|
-
|
|
262
|
+
if (prefix && last && prefix.contains(last.node))
|
|
263
|
+
last = positionAfterPrefix(container, prefix);
|
|
264
|
+
return last && { position: last, inTextAtTarget: false };
|
|
96
265
|
}
|
|
97
|
-
/**
|
|
98
|
-
*
|
|
99
|
-
* widget adds 0 chars to textContent, so a range inside one yields no client rect and
|
|
100
|
-
* callers that must cover it (search highlight, cross-block selection) take its bounding
|
|
101
|
-
* box. A widget's position is its running walk offset, never a compare of `data-source-*`
|
|
102
|
-
* against the ambient-adjusted argument.
|
|
103
|
-
*/
|
|
266
|
+
/** The atomic inline widgets intersecting the DOM-walk range [start, end): a widget adds no text,
|
|
267
|
+
* so a caller covering it takes its bounding box. Positions are walk offsets, never `data-source-*`. */
|
|
104
268
|
export function widgetsIntersectingRange(container, start, end) {
|
|
105
269
|
const out = [];
|
|
106
270
|
for (const seg of walkSegments(container, null)) {
|
|
@@ -111,18 +275,34 @@ export function widgetsIntersectingRange(container, start, end) {
|
|
|
111
275
|
}
|
|
112
276
|
return out;
|
|
113
277
|
}
|
|
114
|
-
/**
|
|
278
|
+
/** The walk's text with marker text and widget bytes blanked to spaces, at the walk's own
|
|
279
|
+
* offsets: what a rule that reads words (double- and triple-click) sees as content. */
|
|
280
|
+
export function maskedWalkText(container) {
|
|
281
|
+
let out = '';
|
|
282
|
+
for (const seg of walkSegments(container, null)) {
|
|
283
|
+
const content = seg.kind === 'text' && markerRootOf(seg.node, container) === null;
|
|
284
|
+
out += content ? (seg.node.textContent ?? '') : ' '.repeat(seg.len);
|
|
285
|
+
}
|
|
286
|
+
return out;
|
|
287
|
+
}
|
|
288
|
+
/** Whether any visible text in `container` ends past `from`: a caret there has a box of its own,
|
|
289
|
+
* which a block of widgets alone never offers. */
|
|
290
|
+
export function holdsTextPast(container, from) {
|
|
291
|
+
for (const seg of landingSegments(container, markerHidingMode(container))) {
|
|
292
|
+
if (seg.kind === 'text' && seg.len > 0 && seg.start + seg.len > from)
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
/** Total walk length of `container`: its one-past-end walk position. */
|
|
115
298
|
export function containerDomTextLength(container) {
|
|
116
299
|
let count = 0;
|
|
117
300
|
for (const seg of walkSegments(container, null))
|
|
118
301
|
count += seg.len;
|
|
119
302
|
return asDomTextOffset(count);
|
|
120
303
|
}
|
|
121
|
-
/**
|
|
122
|
-
*
|
|
123
|
-
* offset sits in text or exactly on a boundary. Island application snaps replace
|
|
124
|
-
* boundaries outward with this — a text-position range cannot split an atomic widget.
|
|
125
|
-
*/
|
|
304
|
+
/** The DOM-walk span of the atomic widget strictly containing `offset`, or null in text or on a
|
|
305
|
+
* boundary. A replace decoration snaps outward with it, since a range cannot split a widget. */
|
|
126
306
|
export function widgetSpanContainingOffset(container, offset) {
|
|
127
307
|
for (const seg of walkSegments(container, null)) {
|
|
128
308
|
if (seg.start > offset)
|
|
@@ -196,12 +376,15 @@ export function createRangeAtDomTextOffsets(container, start, end) {
|
|
|
196
376
|
return range;
|
|
197
377
|
}
|
|
198
378
|
// ── Hidden marker runs ───────────────────────────────────────────────────────
|
|
199
|
-
/**
|
|
200
|
-
*
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
379
|
+
/** The text length of a block's trailing structure span (`BLOCK_SUFFIX_ATTR`) where the mode
|
|
380
|
+
* hides it, else 0: bytes a range the user drew cannot have meant to take. */
|
|
381
|
+
export function hiddenSuffixLength(el) {
|
|
382
|
+
// Not always the last child: a pending hard break's anchors follow a closing run.
|
|
383
|
+
const text = el.querySelector(`:scope > [${BLOCK_SUFFIX_ATTR}]`)?.firstChild ?? null;
|
|
384
|
+
return text && isHiddenMarkerText(text, el) ? (text.textContent?.length ?? 0) : 0;
|
|
385
|
+
}
|
|
386
|
+
/** Whether `node` is marker text the mode's CSS paints nothing for, decided from the families in
|
|
387
|
+
* `core/inline/visibility.ts`, not layout; that file and `styles/editor.css` change together. */
|
|
205
388
|
export function isHiddenMarkerText(node, container) {
|
|
206
389
|
if (node.nodeType !== Node.TEXT_NODE || !container.contains(node))
|
|
207
390
|
return false;
|
|
@@ -215,54 +398,35 @@ export function isHiddenMarkerText(node, container) {
|
|
|
215
398
|
}
|
|
216
399
|
return false;
|
|
217
400
|
}
|
|
218
|
-
/**
|
|
219
|
-
*
|
|
220
|
-
* element-level form of {@link isHiddenMarkerText}, for a walk that treats such a span as
|
|
221
|
-
* opaque instead of descending into it.
|
|
222
|
-
*/
|
|
401
|
+
/** The element form of {@link isHiddenMarkerText}, for a walk that treats such a span as opaque
|
|
402
|
+
* instead of descending into it. */
|
|
223
403
|
export function isHiddenMarkerRoot(el, container) {
|
|
224
404
|
if (el === container || !container.contains(el))
|
|
225
405
|
return false;
|
|
226
406
|
const mode = markerHidingMode(container);
|
|
227
407
|
return mode !== null && hidesOwnText(el, mode, chromeStandsAloneUnder(container, mode));
|
|
228
408
|
}
|
|
229
|
-
/**
|
|
230
|
-
*
|
|
231
|
-
* in the focused block — neither its own structural prefix (`## `, a fence, a setext underline)
|
|
232
|
-
* nor an inline construct's delimiters. An unstamped container is styled source, which paints.
|
|
233
|
-
*/
|
|
409
|
+
/** `hidesDelimitersAtCaret` read from the DOM: whether this container's mode paints no marker in
|
|
410
|
+
* the focused block. No mode attribute means styled source, which paints. */
|
|
234
411
|
export function revealsNoMarkers(container) {
|
|
235
412
|
const mode = markerHidingMode(container);
|
|
236
|
-
return mode !== null &&
|
|
413
|
+
return mode !== null && hidesDelimitersAtCaret(mode);
|
|
237
414
|
}
|
|
238
|
-
/**
|
|
239
|
-
*
|
|
240
|
-
* so a rewrite seam needs no marker vocabulary of its own. Chrome standing over no content PAINTS
|
|
241
|
-
* (live-mode.md § 4.1), and a seam holding a license over unseen bytes has nothing to claim there.
|
|
242
|
-
* An unmounted surface reads as source, where nothing hides and no rewrite has a run to move.
|
|
243
|
-
*/
|
|
415
|
+
/** How this container's bytes read on screen, its mode plus its content-empty attribute, so a text
|
|
416
|
+
* rewrite needs no marker knowledge of its own. An unmounted block reads as source. */
|
|
244
417
|
export function screenVisibilityOf(container) {
|
|
245
418
|
return screenVisibility(container === null ? 'source' : (markerHidingMode(container) ?? 'source'), { chromePaints: container instanceof Element && chromeStampPaints(container) });
|
|
246
419
|
}
|
|
247
|
-
/**
|
|
248
|
-
*
|
|
249
|
-
* `data-content-empty` AND holds focus. The seat is for a caret, so a stamped block nobody is in
|
|
250
|
-
* keeps its chrome hidden and reads as the empty construct it is. Focus containment rather than
|
|
251
|
-
* `:focus-within`, so a selector engine without that pseudo-class (jsdom's) reads the same answer.
|
|
252
|
-
*/
|
|
420
|
+
/** The stylesheet's condition for painting an empty construct's markers: `data-content-empty`
|
|
421
|
+
* plus focus inside, read by containment because jsdom lacks `:focus-within`. */
|
|
253
422
|
function chromeStampPaints(container) {
|
|
254
423
|
if (!container.hasAttribute(CONTENT_EMPTY_ATTR))
|
|
255
424
|
return false;
|
|
256
425
|
const active = container.ownerDocument.activeElement;
|
|
257
426
|
return active !== null && container.contains(active);
|
|
258
427
|
}
|
|
259
|
-
/**
|
|
260
|
-
*
|
|
261
|
-
* ambient island holds no landable position, so the bound moves past it. Block-edge gates read
|
|
262
|
-
* these rather than 0 / walk length, which a mode painting no marker makes unreachable — a gate
|
|
263
|
-
* testing an offset no keystroke can produce is a dead key. An ALL-hidden container (an empty
|
|
264
|
-
* fence) has no landable offset and answers `{len, len}`, making every `offset <= start` gate true.
|
|
265
|
-
*/
|
|
428
|
+
/** The first and last walk offsets a caret can sit at, past hidden marker runs and the marker
|
|
429
|
+
* prefix; the checks at a block's edge read these. All-hidden text answers `{len, len}`. */
|
|
266
430
|
export function landableDomTextBounds(container) {
|
|
267
431
|
let start = 0;
|
|
268
432
|
let end = 0;
|
|
@@ -272,9 +436,16 @@ export function landableDomTextBounds(container) {
|
|
|
272
436
|
if (seg.len === 0)
|
|
273
437
|
continue;
|
|
274
438
|
const stop = seg.start + seg.len;
|
|
275
|
-
// An atomic widget and a decoration
|
|
276
|
-
// enter either, but
|
|
277
|
-
if (seg.kind === 'opaque'
|
|
439
|
+
// An atomic widget and a decoration widget are opaque, not unreachable: the caret may not
|
|
440
|
+
// enter either, but each of their boundaries is a position of its own.
|
|
441
|
+
if (seg.kind === 'opaque' && seg.hidden && seg.first.hasAttribute(BLOCK_SUFFIX_ATTR)) {
|
|
442
|
+
// Nothing past a block's trailing structure is text, and an emptied block's caret
|
|
443
|
+
// sits before that structure.
|
|
444
|
+
if (!landed)
|
|
445
|
+
end = start;
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
if (seg.kind === 'opaque' ? seg.hidden : inMarkerPrefix(seg.node, container)) {
|
|
278
449
|
if (!landed)
|
|
279
450
|
start = stop;
|
|
280
451
|
continue;
|
|
@@ -283,14 +454,20 @@ export function landableDomTextBounds(container) {
|
|
|
283
454
|
end = stop;
|
|
284
455
|
lastText = seg.kind === 'text' ? seg.node : null;
|
|
285
456
|
}
|
|
286
|
-
// The
|
|
287
|
-
//
|
|
288
|
-
// caret is stuck on the empty line. A caret anchor gives that line its paint and keeps it.
|
|
457
|
+
// The browser puts no caret after the last text's final `\n`, so an end check reading that
|
|
458
|
+
// position would never fire; a caret anchor paints the line and keeps the position.
|
|
289
459
|
if (lastText?.textContent?.endsWith('\n') && !followedByCaretAnchor(lastText, container)) {
|
|
290
460
|
end -= 1;
|
|
291
461
|
}
|
|
292
462
|
return { start: asDomTextOffset(start), end: asDomTextOffset(Math.max(start, end)) };
|
|
293
463
|
}
|
|
464
|
+
/** A `<br>` that gives the caret a line nothing else paints, adding no text. `role` tells the walks
|
|
465
|
+
* a hidden fence closer line (`closer`) from a pending hard break's line (`break`). */
|
|
466
|
+
export function createCaretAnchor(role = '') {
|
|
467
|
+
const anchor = document.createElement('br');
|
|
468
|
+
anchor.dataset.caretAnchor = role;
|
|
469
|
+
return anchor;
|
|
470
|
+
}
|
|
294
471
|
/** Whether the next painted node after `text`, at any depth above it, is a caret anchor. */
|
|
295
472
|
function followedByCaretAnchor(text, root) {
|
|
296
473
|
for (let node = text; node && node !== root; node = node.parentNode) {
|
|
@@ -303,19 +480,8 @@ function followedByCaretAnchor(text, root) {
|
|
|
303
480
|
}
|
|
304
481
|
return false;
|
|
305
482
|
}
|
|
306
|
-
/**
|
|
307
|
-
*
|
|
308
|
-
* empty-construct override paints. The stamp condition the render path writes as
|
|
309
|
-
* `data-content-empty` and the walk reads back — computed WITHOUT reading the stamp, or each
|
|
310
|
-
* render would flip the previous one's answer. Membership and paintability are separate
|
|
311
|
-
* questions: a reference label is chrome that stays hidden, so it is not content standing behind
|
|
312
|
-
* the stamp, and it is not the paint the stamp promises either.
|
|
313
|
-
*/
|
|
314
|
-
/**
|
|
315
|
-
* The container's bytes outside its marker chrome — what a painted source holds as CONTENT,
|
|
316
|
-
* whatever the mode paints. A fence with an empty body answers whitespace; the leaf reads that
|
|
317
|
-
* as "nothing here a Backspace could mean but the block".
|
|
318
|
-
*/
|
|
483
|
+
/** The container's bytes outside its markers, whatever the mode paints. An empty fence body answers
|
|
484
|
+
* whitespace: nothing for Backspace to delete but the block itself. */
|
|
319
485
|
export function chromeFreeText(container) {
|
|
320
486
|
let text = '';
|
|
321
487
|
for (const seg of walkSegments(container, null)) {
|
|
@@ -327,6 +493,8 @@ export function chromeFreeText(container) {
|
|
|
327
493
|
}
|
|
328
494
|
return text;
|
|
329
495
|
}
|
|
496
|
+
/** Whether every byte is marker text, with a span the empty-construct override paints: the
|
|
497
|
+
* `data-content-empty` condition, computed without reading the attribute it sets. */
|
|
330
498
|
export function holdsOnlyMarkerChrome(container) {
|
|
331
499
|
let chrome = false;
|
|
332
500
|
for (const seg of walkSegments(container, null)) {
|
|
@@ -339,19 +507,15 @@ export function holdsOnlyMarkerChrome(container) {
|
|
|
339
507
|
chrome ||= familyPaintsAlone(marker.family);
|
|
340
508
|
continue;
|
|
341
509
|
}
|
|
342
|
-
// The
|
|
343
|
-
//
|
|
344
|
-
if (!
|
|
510
|
+
// The container's marker prefix keeps its box in every mode, so it neither hides the block
|
|
511
|
+
// nor counts as content: a `- ` with an empty child holds a caret and needs no attribute.
|
|
512
|
+
if (!inMarkerPrefix(seg.node, container))
|
|
345
513
|
return false;
|
|
346
514
|
}
|
|
347
515
|
return chrome;
|
|
348
516
|
}
|
|
349
|
-
/**
|
|
350
|
-
*
|
|
351
|
-
* caret position has a pixel of its own. `invariants/landable-caret.ts` refuses this shape at the
|
|
352
|
-
* focus seam — an empty container (landable at offset 0) and one fronted by the ambient island are
|
|
353
|
-
* not it.
|
|
354
|
-
*/
|
|
517
|
+
/** Whether every walk segment is a hidden marker run, so no caret position has a pixel of its own;
|
|
518
|
+
* `invariants/landable-caret.ts` refuses this shape when focus lands. */
|
|
355
519
|
export function paintsNoLandableContent(container) {
|
|
356
520
|
let hidden = false;
|
|
357
521
|
for (const seg of landingSegments(container, markerHidingMode(container))) {
|
|
@@ -363,33 +527,27 @@ export function paintsNoLandableContent(container) {
|
|
|
363
527
|
}
|
|
364
528
|
return hidden;
|
|
365
529
|
}
|
|
366
|
-
/**
|
|
367
|
-
*
|
|
368
|
-
|
|
369
|
-
* reads: the arrow exits, the cross-block collapse, and the block-entry seat all ask the same
|
|
370
|
-
* question and must not answer it three ways.
|
|
371
|
-
*/
|
|
372
|
-
export function landableRawBounds(el, ambientLength) {
|
|
530
|
+
/** {@link landableDomTextBounds} in raw offsets, or null where the markers paint and all of raw is
|
|
531
|
+
* reachable. Every caret check and placement reads this one answer. */
|
|
532
|
+
export function landableRawBounds(el) {
|
|
373
533
|
if (!revealsNoMarkers(el))
|
|
374
534
|
return null;
|
|
375
535
|
const bounds = landableDomTextBounds(el);
|
|
536
|
+
const prefixLength = markerPrefixLength(el);
|
|
376
537
|
return {
|
|
377
|
-
start: toClampedRawOffset(bounds.start,
|
|
378
|
-
end: toClampedRawOffset(bounds.end,
|
|
538
|
+
start: toClampedRawOffset(bounds.start, prefixLength),
|
|
539
|
+
end: toClampedRawOffset(bounds.end, prefixLength)
|
|
379
540
|
};
|
|
380
541
|
}
|
|
381
|
-
/** Clamp a caret offset into
|
|
382
|
-
export function clampToLandableRaw(el, offset
|
|
383
|
-
const bounds = landableRawBounds(el
|
|
542
|
+
/** Clamp a caret offset into the range the caret can sit in; a no-op wherever the markers paint. */
|
|
543
|
+
export function clampToLandableRaw(el, offset) {
|
|
544
|
+
const bounds = landableRawBounds(el);
|
|
384
545
|
if (!bounds)
|
|
385
546
|
return offset;
|
|
386
547
|
return Math.min(Math.max(offset, bounds.start), bounds.end);
|
|
387
548
|
}
|
|
388
|
-
/**
|
|
389
|
-
*
|
|
390
|
-
* island) instead of sitting in text: no text node holds it, so the engine's Home seats the
|
|
391
|
-
* caret past the island and the block's start needs an owned door.
|
|
392
|
-
*/
|
|
549
|
+
/** Whether the first caret position abuts an opaque widget rather than sitting in text: no text
|
|
550
|
+
* node holds it, so the browser's Home skips the widget and the editor places the caret itself. */
|
|
393
551
|
export function landableStartAbutsIsland(container) {
|
|
394
552
|
for (const seg of landingSegments(container, markerHidingMode(container))) {
|
|
395
553
|
if (seg.len === 0)
|
|
@@ -399,29 +557,29 @@ export function landableStartAbutsIsland(container) {
|
|
|
399
557
|
continue;
|
|
400
558
|
return true;
|
|
401
559
|
}
|
|
402
|
-
if (
|
|
560
|
+
if (inMarkerPrefix(seg.node, container))
|
|
403
561
|
continue;
|
|
404
562
|
return false;
|
|
405
563
|
}
|
|
406
564
|
return false;
|
|
407
565
|
}
|
|
408
|
-
/** Whether `node` is an atomic inline widget's element
|
|
409
|
-
*
|
|
566
|
+
/** Whether `node` is an atomic inline widget's element, which every walk treats as opaque. Checks
|
|
567
|
+
* the attribute rather than a selector because every walk asks this per node. */
|
|
410
568
|
export function isAtomicInlineWidget(node) {
|
|
411
569
|
return node.nodeType === Node.ELEMENT_NODE && node.hasAttribute(WIDGET_ATTR);
|
|
412
570
|
}
|
|
413
571
|
// ── Internal ─────────────────────────────────────────────────────────────────
|
|
414
572
|
const FOCUSED_HOST_SELECTOR = '.block-host[data-focused]';
|
|
415
|
-
/** The editor root's
|
|
416
|
-
*
|
|
573
|
+
/** The editor root's mode when it hides markers; null in source mode, which sets no attribute,
|
|
574
|
+
* and for a detached build with no root to read. */
|
|
417
575
|
function markerHidingMode(container) {
|
|
418
576
|
if (!(container instanceof Element))
|
|
419
577
|
return null;
|
|
420
578
|
const mode = asPresentationMode(container.closest('[data-presentation]')?.getAttribute('data-presentation'));
|
|
421
579
|
return hidesMarkers(mode) ? mode : null;
|
|
422
580
|
}
|
|
423
|
-
/**
|
|
424
|
-
* that decides what the
|
|
581
|
+
/** The nearest ancestor between `node` and `root` whose own text is a marker, with the family
|
|
582
|
+
* that decides what the empty-container override does with it. */
|
|
425
583
|
function markerRootOf(node, root) {
|
|
426
584
|
for (let el = node.parentElement; el && el !== root; el = el.parentElement) {
|
|
427
585
|
const family = markerFamilyOf(el);
|
|
@@ -430,29 +588,27 @@ function markerRootOf(node, root) {
|
|
|
430
588
|
}
|
|
431
589
|
return null;
|
|
432
590
|
}
|
|
433
|
-
/** Whether `root` carries the content-empty
|
|
591
|
+
/** Whether `root` carries the content-empty attribute under a mode that paints its markers. */
|
|
434
592
|
function chromeStandsAloneUnder(root, mode) {
|
|
435
593
|
if (mode === null || !(root instanceof Element))
|
|
436
594
|
return false;
|
|
437
595
|
return screenVisibility(mode, { chromePaints: chromeStampPaints(root) }).chromePaints;
|
|
438
596
|
}
|
|
439
597
|
/**
|
|
440
|
-
* Whether `node` is inside the
|
|
441
|
-
*
|
|
442
|
-
* decoration) has a real raw offset on each side, so only this one joins the unreachable prefix.
|
|
598
|
+
* Whether `node` is inside the container's marker prefix, the one inert span whose far side is raw
|
|
599
|
+
* offset 0. Every other opaque span (a widget, a decoration) has a real raw offset on each side.
|
|
443
600
|
*/
|
|
444
|
-
function
|
|
601
|
+
function inMarkerPrefix(node, root) {
|
|
445
602
|
for (let el = node.parentElement; el && el !== root; el = el.parentElement) {
|
|
446
|
-
if (
|
|
603
|
+
if (isMarkerPrefixSpan(el))
|
|
447
604
|
return true;
|
|
448
|
-
}
|
|
449
605
|
}
|
|
450
606
|
return false;
|
|
451
607
|
}
|
|
452
608
|
function hidesOwnText(el, mode, chromePaints) {
|
|
453
609
|
const family = markerFamilyOf(el);
|
|
454
|
-
// The shared rule first (the stylesheet's `[data-content-empty]` override
|
|
455
|
-
// reveal
|
|
610
|
+
// The shared rule first (the stylesheet's `[data-content-empty]` override included); the
|
|
611
|
+
// reveal branches below depend on per-span DOM state that only this side can see.
|
|
456
612
|
if (family === null || !familyHidesText(family, screenVisibility(mode, { chromePaints })))
|
|
457
613
|
return false;
|
|
458
614
|
if (mode !== 'preview-block' && mode !== 'preview-inline')
|
|
@@ -461,8 +617,8 @@ function hidesOwnText(el, mode, chromePaints) {
|
|
|
461
617
|
return true;
|
|
462
618
|
if (mode === 'preview-block')
|
|
463
619
|
return false;
|
|
464
|
-
// preview-inline's
|
|
465
|
-
//
|
|
620
|
+
// preview-inline's reveal rule is scoped to `.md-marker`, so a reference label reveals by
|
|
621
|
+
// class alone; fence lines are whole-block markers and reveal with block focus.
|
|
466
622
|
if (el.classList.contains('md-fence-line'))
|
|
467
623
|
return false;
|
|
468
624
|
if (el.classList.contains('md-ref-label'))
|
|
@@ -481,8 +637,8 @@ function snapOutOfRun(container, offset, side, mode) {
|
|
|
481
637
|
}
|
|
482
638
|
return asDomTextOffset(offset);
|
|
483
639
|
}
|
|
484
|
-
/** The
|
|
485
|
-
*
|
|
640
|
+
/** The DOM position beside a span the caret may not enter. Prefers an adjacent text node, since
|
|
641
|
+
* Chromium drops beforeinput at element-level offsets between two widgets. */
|
|
486
642
|
function positionBeside(el, side) {
|
|
487
643
|
const parent = el.parentNode;
|
|
488
644
|
if (!parent)
|
|
@@ -492,28 +648,38 @@ function positionBeside(el, side) {
|
|
|
492
648
|
return { node: sibling, offset: side === 'before' ? (sibling.textContent?.length ?? 0) : 0 };
|
|
493
649
|
}
|
|
494
650
|
const idx = Array.prototype.indexOf.call(parent.childNodes, el);
|
|
495
|
-
// A pending hard break's first anchor
|
|
496
|
-
// the
|
|
651
|
+
// A pending hard break's first anchor ends the marker's line, so the position past the marker is
|
|
652
|
+
// the next line's start, after that anchor.
|
|
497
653
|
if (side === 'after' && isBreakAnchor(sibling))
|
|
498
654
|
return { node: parent, offset: idx + 2 };
|
|
655
|
+
if (side === 'before' && isBreakAnchor(sibling) && isBreakAnchor(sibling.previousSibling)) {
|
|
656
|
+
return { node: parent, offset: idx - 1 };
|
|
657
|
+
}
|
|
499
658
|
return { node: parent, offset: side === 'before' ? idx : idx + 1 };
|
|
500
659
|
}
|
|
660
|
+
/** Whether two neighbouring hidden runs are a block's marker span and its trailing structure. */
|
|
661
|
+
function prefixMeetsSuffix(from, to) {
|
|
662
|
+
return from.hasAttribute(BLOCK_PREFIX_ATTR) && to.hasAttribute(BLOCK_SUFFIX_ATTR);
|
|
663
|
+
}
|
|
664
|
+
/** Whether a pending hard break's anchor stands between two sibling spans. */
|
|
665
|
+
function breakAnchorBetween(from, to) {
|
|
666
|
+
for (let node = from.nextSibling; node && node !== to; node = node.nextSibling) {
|
|
667
|
+
if (isBreakAnchor(node))
|
|
668
|
+
return true;
|
|
669
|
+
}
|
|
670
|
+
return false;
|
|
671
|
+
}
|
|
501
672
|
function isBreakAnchor(node) {
|
|
502
673
|
return (node instanceof HTMLElement && node.tagName === 'BR' && node.dataset.caretAnchor === 'break');
|
|
503
674
|
}
|
|
504
|
-
/**
|
|
505
|
-
*
|
|
506
|
-
* length, an atomic widget its raw source length (never descended), any other element is
|
|
507
|
-
* transparent. Hidden marker text counts exactly like visible text — hiding is CSS-only so the
|
|
508
|
-
* coordinate space survives it — and carries the span that hides it. Offsets stay plain numbers;
|
|
509
|
-
* consumers mint the `DomTextOffset` brand.
|
|
510
|
-
*/
|
|
675
|
+
/** The segments every walk reader shares: text counts its length, an atomic widget its raw source
|
|
676
|
+
* length, any other element nothing. Hidden marker text counts too, with the span that hides it. */
|
|
511
677
|
function* walkSegments(root, mode) {
|
|
512
678
|
let count = 0;
|
|
513
679
|
// One read per walk, not one `closest` per element: every caller passes the walk container.
|
|
514
680
|
const chromePaints = chromeStandsAloneUnder(root, mode);
|
|
515
681
|
const stack = [];
|
|
516
|
-
//
|
|
682
|
+
// Pushed in reverse so pop order is source order, which `count` advances along.
|
|
517
683
|
const pushChildren = (parent, hiddenRoot) => {
|
|
518
684
|
const children = parent.childNodes;
|
|
519
685
|
for (let i = children.length - 1; i >= 0; i--)
|
|
@@ -540,23 +706,32 @@ function* walkSegments(root, mode) {
|
|
|
540
706
|
pushChildren(el, hiddenRoot ?? (mode !== null && hidesOwnText(el, mode, chromePaints) ? el : null));
|
|
541
707
|
}
|
|
542
708
|
}
|
|
543
|
-
/**
|
|
709
|
+
/** A new opaque span is one element, its own first and last, until a run extends it. */
|
|
544
710
|
function opaqueSegment(el, start, len, hidden) {
|
|
545
711
|
return { kind: 'opaque', hidden, first: el, last: el, start, len };
|
|
546
712
|
}
|
|
547
|
-
/**
|
|
548
|
-
*
|
|
549
|
-
* atomic widgets, plus MAXIMAL runs of hidden marker text, coalesced because snapping out of
|
|
550
|
-
* one hidden span into the next would still leave the caret in unpainted text.
|
|
551
|
-
*/
|
|
713
|
+
/** The walk as the caret sees it: text it can sit in, and opaque spans it may not enter. Adjacent
|
|
714
|
+
* hidden spans merge, since snapping from one into the next still leaves the caret unpainted. */
|
|
552
715
|
function* landingSegments(root, mode) {
|
|
553
716
|
let run = null;
|
|
554
717
|
for (const seg of walkSegments(root, mode)) {
|
|
555
|
-
// A
|
|
556
|
-
// spans, and splitting the run there would
|
|
718
|
+
// A node contributing nothing cannot end a run: Chromium leaves empty text nodes between
|
|
719
|
+
// spans, and splitting the run there would create a caret position nothing paints.
|
|
557
720
|
if (run && seg.len === 0)
|
|
558
721
|
continue;
|
|
559
722
|
if (seg.kind === 'text' && seg.hiddenRoot !== null) {
|
|
723
|
+
// A pending hard break's anchors start a line between two hidden runs (the break's
|
|
724
|
+
// backslash, a setext underline), and the caret sits at that line's start.
|
|
725
|
+
if (run && breakAnchorBetween(run.last, seg.hiddenRoot)) {
|
|
726
|
+
yield run;
|
|
727
|
+
run = null;
|
|
728
|
+
}
|
|
729
|
+
// An emptied heading's text sits between its marker and its closing run, where the
|
|
730
|
+
// caret goes, so the two hidden runs stay apart.
|
|
731
|
+
if (run && prefixMeetsSuffix(run.last, seg.hiddenRoot)) {
|
|
732
|
+
yield run;
|
|
733
|
+
run = null;
|
|
734
|
+
}
|
|
560
735
|
if (run) {
|
|
561
736
|
run.len += seg.len;
|
|
562
737
|
run.last = seg.hiddenRoot;
|