@voithos-labs/aragonite 0.10.4 → 0.10.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/a11y-strings.d.ts +11 -5
- package/dist/a11y-strings.js +60 -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 +12 -21
- 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 +603 -1126
- package/dist/components/Editor.svelte.d.ts +9 -20
- package/dist/components/GapCaret.svelte +26 -59
- package/dist/components/SelectionOverlay.svelte +26 -51
- package/dist/components/SelectionOverlay.svelte.d.ts +5 -3
- 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 +72 -87
- 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 +29 -34
- 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 +57 -39
- 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 +141 -203
- 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 +45 -90
- package/dist/components/blocks/list/ListItemBlock.svelte +93 -147
- package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +1 -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 +8 -6
- package/dist/components/blocks/text/click-snap-guard.js +10 -7
- 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 +150 -181
- 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 -108
- 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 +212 -199
- 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 +12 -35
- package/dist/components/drag-handle.js +22 -68
- 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 -24
- package/dist/components/editor-root-listeners.js +49 -24
- 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 +14 -26
- 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 +30 -35
- package/dist/components/menu/SelectionToolbar.svelte.d.ts +3 -5
- 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 +54 -75
- package/dist/core/inline/inline-widgets.js +54 -62
- 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 +31 -15
- 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 -6
- package/dist/cursor/height-oracle.js +26 -74
- 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 +14 -15
- package/dist/cursor/scrollport.js +7 -13
- 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 -14
- package/dist/cursor/visual-lines.js +45 -46
- package/dist/cursor/widget-edge-snap.d.ts +10 -15
- package/dist/cursor/widget-edge-snap.js +13 -12
- package/dist/cursor/widget-offset.d.ts +110 -104
- package/dist/cursor/widget-offset.js +344 -179
- 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 +30 -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 +28 -50
- package/dist/editor-actions/focus/focus-landing.d.ts +8 -11
- package/dist/editor-actions/focus/focus-landing.js +15 -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 +54 -82
- package/dist/editor-actions/plugin/container.js +105 -188
- 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 +88 -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 +37 -8
- package/dist/plugin.js +100 -77
- 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 +78 -67
- 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 -81
- 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 +51 -45
- 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 +15 -6
- 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 +141 -310
- 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 +78 -84
- package/dist/schema/commands.js +152 -117
- 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 +8 -10
- 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 +63 -80
- 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 +92 -125
- 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 +59 -96
- 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 +51 -134
- package/dist/selection/dead-space-caret.d.ts +19 -30
- package/dist/selection/dead-space-caret.js +70 -88
- package/dist/selection/drag-pointer.d.ts +7 -9
- package/dist/selection/drag-pointer.js +23 -33
- 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 -40
- package/dist/selection/keyboard-extend.js +94 -117
- package/dist/selection/multi-click.d.ts +13 -18
- package/dist/selection/multi-click.js +32 -38
- package/dist/selection/native-bridge.d.ts +29 -39
- package/dist/selection/native-bridge.js +78 -127
- package/dist/selection/nearest-block.d.ts +17 -12
- package/dist/selection/nearest-block.js +37 -18
- package/dist/selection/path-lookup.d.ts +25 -16
- package/dist/selection/path-lookup.js +101 -18
- package/dist/selection/path-math.d.ts +9 -11
- package/dist/selection/path-math.js +5 -7
- package/dist/selection/pointer-gesture.d.ts +5 -5
- package/dist/selection/pointer-gesture.js +5 -5
- package/dist/selection/pointer-session.d.ts +10 -16
- package/dist/selection/pointer-session.js +6 -7
- package/dist/selection/primitives.d.ts +64 -40
- package/dist/selection/primitives.js +57 -67
- 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 -23
- 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 +34 -16
- package/dist/selection/selection-drop.js +159 -95
- 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 +60 -53
- package/dist/styles/editor.css +201 -143
- 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 +9 -7
- package/dist/tree-operations/paste/replacement-parse.js +12 -10
- 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 +327 -205
- package/docs/guide/directives.md +7 -7
- package/docs/guide/plugin-api.md +253 -185
- package/docs/guide/plugin-guide.md +332 -235
- package/docs/guide/plugin-testing.md +96 -82
- package/package.json +12 -16
- 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/cursor/scroll-hold.d.ts +0 -10
- package/dist/cursor/scroll-hold.js +0 -22
- package/dist/invariants/split-landing.d.ts +0 -8
- package/dist/invariants/split-landing.js +0 -15
- 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 -31
- package/dist/tree-operations/paste/replace-block-at-parent.js +0 -78
|
@@ -1,22 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pure primitives for cross-block selection: types,
|
|
3
|
-
*
|
|
4
|
-
* live in `./path-math`.
|
|
2
|
+
* Pure primitives for cross-block selection: types, overlay classification of a covered range,
|
|
3
|
+
* the delete-commit snapshot rule. Path-level predicates live in `./path-math`.
|
|
5
4
|
*/
|
|
6
|
-
import {
|
|
5
|
+
import { SELECTION_END } from '../block-component';
|
|
6
|
+
import { comparePaths, pathsEqual } from './path-math';
|
|
7
7
|
import { asCellIndex, asRawOffset, docPathFrom } from '../cursor/coordinate-spaces';
|
|
8
8
|
import { devWarn } from '../dev-warn';
|
|
9
|
+
/** A cell endpoint: the grid's path, a row-major cell index, and the flag saying so. */
|
|
10
|
+
export function cellPoint(path, cellIdx) {
|
|
11
|
+
return { path: path.slice(), offset: cellIdx, cellCoordinate: true };
|
|
12
|
+
}
|
|
9
13
|
export function isWholeBlockEndpoint(endpoint) {
|
|
10
14
|
return 'wholeBlock' in endpoint;
|
|
11
15
|
}
|
|
12
|
-
/**
|
|
16
|
+
/** Whether two snapshots name the same selection. The coordinate space counts: the same
|
|
17
|
+
* numbers as a cell index and as a character offset are different positions. */
|
|
18
|
+
export function selectionsEqual(a, b) {
|
|
19
|
+
if (a === null || b === null)
|
|
20
|
+
return a === b;
|
|
21
|
+
return pointsEqual(a.anchor, b.anchor) && pointsEqual(a.focus, b.focus);
|
|
22
|
+
}
|
|
23
|
+
function pointsEqual(a, b) {
|
|
24
|
+
return (a.offset === b.offset && !a.cellCoordinate === !b.cellCoordinate && pathsEqual(a.path, b.path));
|
|
25
|
+
}
|
|
26
|
+
/** Offset as a char index into the leaf's `raw`. Warns in dev on a cell point, but always returns. */
|
|
13
27
|
export function charOffsetOf(point, tag) {
|
|
14
28
|
if (point.cellCoordinate) {
|
|
15
29
|
devWarn(tag, 'char-offset site received a cell-coordinate SelectionPoint', point);
|
|
16
30
|
}
|
|
17
31
|
return asRawOffset(point.offset);
|
|
18
32
|
}
|
|
19
|
-
/** Offset as a row-major table cell index.
|
|
33
|
+
/** Offset as a row-major table cell index. Warns in dev on a char point, but always returns. */
|
|
20
34
|
export function cellIndexOf(point, tag) {
|
|
21
35
|
if (!point.cellCoordinate) {
|
|
22
36
|
devWarn(tag, 'cell-index site received a char-offset SelectionPoint', point);
|
|
@@ -24,13 +38,8 @@ export function cellIndexOf(point, tag) {
|
|
|
24
38
|
return asCellIndex(point.offset);
|
|
25
39
|
}
|
|
26
40
|
// ── Normalization ──────────────────────────────────────────────────────────
|
|
27
|
-
/**
|
|
28
|
-
*
|
|
29
|
-
* consumer barrel as `normalizeSelection`, which is what a host anchors UI to. The offset tiebreak
|
|
30
|
-
* is coordinate-space agnostic: two endpoints sharing a table's path carry row-major CELL indices,
|
|
31
|
-
* whose order IS document order inside that table. A caller with no selection has nothing to
|
|
32
|
-
* order, since `getSelection()` answers null with nothing focused and at a gap caret.
|
|
33
|
-
*/
|
|
41
|
+
/** `{start, end}` in document order: by path, then by offset, which orders cell indices on a
|
|
42
|
+
* shared table path too, since row-major order is document order inside the table. */
|
|
34
43
|
export function normalize(selection) {
|
|
35
44
|
const { anchor, focus } = selection;
|
|
36
45
|
const cmp = comparePaths(anchor.path, focus.path);
|
|
@@ -43,67 +52,48 @@ export function normalize(selection) {
|
|
|
43
52
|
return { start: focus, end: anchor };
|
|
44
53
|
}
|
|
45
54
|
// ── Undo snapshot ──────────────────────────────────────────────────────────
|
|
46
|
-
/**
|
|
47
|
-
export function deleteSnapshot(
|
|
48
|
-
return
|
|
49
|
-
}
|
|
50
|
-
// ── Range walk ─────────────────────────────────────────────────────────────
|
|
51
|
-
/** Every block path strictly between `start` and `end`, at every nesting level. */
|
|
52
|
-
export function walkBetween(doc, start, end) {
|
|
53
|
-
if (comparePaths(start, end) >= 0)
|
|
54
|
-
return [];
|
|
55
|
-
const result = [];
|
|
56
|
-
function visit(node, path) {
|
|
57
|
-
if (isPathBetween(path, start, end)) {
|
|
58
|
-
result.push([...path]);
|
|
59
|
-
}
|
|
60
|
-
if (!node.children)
|
|
61
|
-
return;
|
|
62
|
-
for (let i = 0; i < node.children.length; i++) {
|
|
63
|
-
const childPath = [...path, i];
|
|
64
|
-
// Skip subtrees entirely before start (an ancestor of start still holds it) or after end.
|
|
65
|
-
if (!pathHasPrefix(start, childPath) && comparePaths(childPath, start) < 0)
|
|
66
|
-
continue;
|
|
67
|
-
if (comparePaths(childPath, end) >= 0)
|
|
68
|
-
break;
|
|
69
|
-
visit(node.children[i], childPath);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
visit(doc, []);
|
|
73
|
-
return result;
|
|
55
|
+
/** Where undo puts the caret back after a range delete, when nothing is focused. */
|
|
56
|
+
export function deleteSnapshot(path, offset = 0) {
|
|
57
|
+
return { path: docPathFrom(path), offset };
|
|
74
58
|
}
|
|
75
|
-
/**
|
|
76
|
-
*
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (comparePaths(start.path, end.path) === 0) {
|
|
82
|
-
return comparePaths(path, start.path) === 0 ? 'single-block' : 'outside';
|
|
59
|
+
/** Where a block stands in a covered range, for the overlay: 'single-block' delegates to the
|
|
60
|
+
* browser, and a subtree the range holds whole is 'middle' with nothing inside it painting. */
|
|
61
|
+
export function classifyBlockForSelection(path, coverage) {
|
|
62
|
+
const { start, end } = coverage.range;
|
|
63
|
+
if (pathsEqual(start.path, end.path)) {
|
|
64
|
+
return pathsEqual(path, start.path) ? 'single-block' : 'outside';
|
|
83
65
|
}
|
|
84
|
-
|
|
66
|
+
const root = coverage.rootHolding(path);
|
|
67
|
+
if (root)
|
|
68
|
+
return pathsEqual(root, path) ? 'middle' : 'outside';
|
|
69
|
+
if (coverage.startEdge && pathsEqual(path, start.path))
|
|
85
70
|
return 'start';
|
|
86
|
-
if (
|
|
71
|
+
if (coverage.endEdge && pathsEqual(path, end.path))
|
|
87
72
|
return 'end';
|
|
88
|
-
if (isPathBetween(path, start.path, end.path))
|
|
89
|
-
return 'middle';
|
|
90
73
|
return 'outside';
|
|
91
74
|
}
|
|
92
|
-
/**
|
|
93
|
-
*
|
|
94
|
-
|
|
95
|
-
* a container derives from its markers (a GitHub alert's badge) has no child host to paint it, so
|
|
96
|
-
* the covering block takes the box in one piece and its children paint nothing.
|
|
97
|
-
*/
|
|
98
|
-
export function blockPaintsWholeBox(path, selection, wholeUnitPath) {
|
|
75
|
+
/** Whether the block paints the range over its whole box, so a container's own decoration (an
|
|
76
|
+
* alert's badge), which no child host covers, is painted too; its children then paint nothing. */
|
|
77
|
+
export function blockPaintsWholeBox(path, coverage, wholeUnitPath) {
|
|
99
78
|
if (wholeUnitPath)
|
|
100
79
|
return pathsEqual(path, wholeUnitPath);
|
|
101
|
-
const { start, end } =
|
|
102
|
-
|
|
103
|
-
|
|
80
|
+
const { start, end } = coverage.range;
|
|
81
|
+
if (pathsEqual(start.path, end.path))
|
|
82
|
+
return false;
|
|
83
|
+
const root = coverage.rootHolding(path);
|
|
84
|
+
return root !== null && pathsEqual(root, path);
|
|
85
|
+
}
|
|
86
|
+
/** The end-exclusive offsets an endpoint block measures its highlight between: a kept table
|
|
87
|
+
* edge's cells, or its text from the start or up to the end. */
|
|
88
|
+
export function endpointMeasureSpan(classification, coverage) {
|
|
89
|
+
const { startEdge, endEdge, startCells, endCells } = coverage;
|
|
90
|
+
const from = classification === 'end' ? 0 : (startCells?.from ?? textOffset(startEdge, 0));
|
|
91
|
+
const to = classification === 'start'
|
|
92
|
+
? SELECTION_END
|
|
93
|
+
: (endCells?.to ?? textOffset(endEdge, SELECTION_END));
|
|
94
|
+
return { from, to };
|
|
104
95
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return isPathBetween(path, start, end) && !isStrictAncestorOf(path, end);
|
|
96
|
+
// A cell pair inside one table measures its rectangle, which reads no offset.
|
|
97
|
+
function textOffset(edge, fallback) {
|
|
98
|
+
return edge && !edge.cellCoordinate ? charOffsetOf(edge, 'endpointMeasureSpan') : fallback;
|
|
109
99
|
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a live range covers, decided once from the document so the delete, the copy and the
|
|
3
|
+
* overlay all read one answer. Every reader takes a `CoveredRange`, and only `coverRange` builds
|
|
4
|
+
* one, so no consumer can be handed a pair that skipped the rule; `rangeCoverage` then says which
|
|
5
|
+
* edges the range keeps a part of and which subtrees it holds whole.
|
|
6
|
+
*/
|
|
7
|
+
import type { DocumentView, NodeView } from '../core/node-views';
|
|
8
|
+
import { type SelectionPoint } from './primitives';
|
|
9
|
+
import { type DocPath } from './path-math';
|
|
10
|
+
import { type CellRect } from '../cursor/coordinate-spaces';
|
|
11
|
+
declare const SEAL: unique symbol;
|
|
12
|
+
/** A live range in document order as every reader must see it: table endpoints snapped to whole
|
|
13
|
+
* rows, and each closed container the range takes whole named in `wholeUnits`. */
|
|
14
|
+
export declare class CoveredRange {
|
|
15
|
+
#private;
|
|
16
|
+
readonly start: SelectionPoint;
|
|
17
|
+
readonly end: SelectionPoint;
|
|
18
|
+
/** Collapsed containers taken whole, outermost only, in document order. */
|
|
19
|
+
readonly wholeUnits: readonly DocPath[];
|
|
20
|
+
/** Built by `coverRange` only, which holds the module-private key. */
|
|
21
|
+
constructor(key: typeof SEAL, start: SelectionPoint, end: SelectionPoint, wholeUnits: readonly DocPath[]);
|
|
22
|
+
/** The container in `wholeUnits` holding `path`, or null. */
|
|
23
|
+
unitHolding(path: readonly number[]): DocPath | null;
|
|
24
|
+
}
|
|
25
|
+
/** A half-open run of row-major cell indices inside one table. */
|
|
26
|
+
export interface CellRun {
|
|
27
|
+
readonly from: number;
|
|
28
|
+
readonly to: number;
|
|
29
|
+
}
|
|
30
|
+
/** How much of a table a pair inside it holds: all of it, whole rows or columns, or less. */
|
|
31
|
+
export type GridKind = 'table' | 'row' | 'column' | 'cells';
|
|
32
|
+
/** The cells a pair inside one table holds, as a rectangle, and what that rectangle amounts to. */
|
|
33
|
+
export type GridCoverage = {
|
|
34
|
+
[K in GridKind]: {
|
|
35
|
+
readonly kind: K;
|
|
36
|
+
readonly path: DocPath;
|
|
37
|
+
readonly rect: CellRect;
|
|
38
|
+
};
|
|
39
|
+
}[GridKind];
|
|
40
|
+
/** A same-path pair (a block held whole, a cell rectangle) is returned as is. A closed title row
|
|
41
|
+
* the range starts on, or ends on past its first byte, takes its container whole. */
|
|
42
|
+
export declare function coverRange(doc: DocumentView, a: SelectionPoint, b: SelectionPoint): CoveredRange;
|
|
43
|
+
/** What a covered range holds, read once by the delete, the copy, the format toggle and the
|
|
44
|
+
* overlay. Built by `rangeCoverage` only, so no consumer can be handed a hand-made answer. */
|
|
45
|
+
export declare class RangeCoverage {
|
|
46
|
+
#private;
|
|
47
|
+
readonly range: CoveredRange;
|
|
48
|
+
/** The start block's kept head, from its first byte or cell to the start; null where the
|
|
49
|
+
* range holds the block whole. */
|
|
50
|
+
readonly startEdge: SelectionPoint | null;
|
|
51
|
+
/** The end block's kept tail, from the end to its last byte or cell; null likewise. */
|
|
52
|
+
readonly endEdge: SelectionPoint | null;
|
|
53
|
+
/** Every subtree the range removes whole, outermost only, in document order. */
|
|
54
|
+
readonly wholeRoots: readonly DocPath[];
|
|
55
|
+
/** Every subtree whose bytes the range covers end to end, outermost only: the whole roots and
|
|
56
|
+
* a kept edge at its block's first or last byte, with the containers they complete. */
|
|
57
|
+
readonly coveredWhole: readonly DocPath[];
|
|
58
|
+
/** For a pair inside one table, which of its cells the range holds; null otherwise. */
|
|
59
|
+
readonly grid: GridCoverage | null;
|
|
60
|
+
/** The cells a kept table edge hands to the range, as a half-open row-major run: from the
|
|
61
|
+
* start's cell to the table's end, or from its first cell through the end's. */
|
|
62
|
+
readonly startCells: CellRun | null;
|
|
63
|
+
readonly endCells: CellRun | null;
|
|
64
|
+
/** Built by `rangeCoverage` only, which holds the module-private key. */
|
|
65
|
+
constructor(key: typeof SEAL, range: CoveredRange, fields: CoverageFields);
|
|
66
|
+
/** The whole root holding `path`, or null. */
|
|
67
|
+
rootHolding(path: readonly number[]): DocPath | null;
|
|
68
|
+
/** The subtree in `coveredWhole` holding `path`, or null. */
|
|
69
|
+
coveredRootHolding(path: readonly number[]): DocPath | null;
|
|
70
|
+
}
|
|
71
|
+
/** A text edge always keeps its head or tail, even an empty one; a block with no character
|
|
72
|
+
* position, a table from its first or to its last row, or a whole unit keeps none. */
|
|
73
|
+
export declare function rangeCoverage(doc: DocumentView, range: CoveredRange): RangeCoverage;
|
|
74
|
+
/** Every block path strictly between `start` and `end`, at every nesting level, in document
|
|
75
|
+
* order; an ancestor of `end` counts, since it starts before `end` does. */
|
|
76
|
+
export declare function walkBetween(doc: DocumentView, start: readonly number[], end: readonly number[]): number[][];
|
|
77
|
+
/** A container whose kind reserves its first child as a title row (a details block's summary). */
|
|
78
|
+
export interface ChromeContainer {
|
|
79
|
+
path: number[];
|
|
80
|
+
node: NodeView;
|
|
81
|
+
}
|
|
82
|
+
/** The deepest strict ancestor of `path` whose kind reserves a title row. */
|
|
83
|
+
export declare function nearestChromeContainer(doc: DocumentView, path: readonly number[]): ChromeContainer | null;
|
|
84
|
+
export declare function isChromeChild(container: ChromeContainer, leafPath: readonly number[]): boolean;
|
|
85
|
+
interface CoverageFields {
|
|
86
|
+
startEdge: SelectionPoint | null;
|
|
87
|
+
endEdge: SelectionPoint | null;
|
|
88
|
+
wholeRoots: readonly DocPath[];
|
|
89
|
+
coveredWhole: readonly DocPath[];
|
|
90
|
+
grid: GridCoverage | null;
|
|
91
|
+
startCells: CellRun | null;
|
|
92
|
+
endCells: CellRun | null;
|
|
93
|
+
}
|
|
94
|
+
export {};
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a live range covers, decided once from the document so the delete, the copy and the
|
|
3
|
+
* overlay all read one answer. Every reader takes a `CoveredRange`, and only `coverRange` builds
|
|
4
|
+
* one, so no consumer can be handed a pair that skipped the rule; `rangeCoverage` then says which
|
|
5
|
+
* edges the range keeps a part of and which subtrees it holds whole.
|
|
6
|
+
*/
|
|
7
|
+
import { displayLength } from '../core/lines';
|
|
8
|
+
import { metadataOf } from '../core/nodes';
|
|
9
|
+
import { cellIndexOf, normalize } from './primitives';
|
|
10
|
+
import { snapCrossBlockTableEndpoints } from './table-endpoint-snap';
|
|
11
|
+
import { collapsedContainerHiding } from './path-lookup';
|
|
12
|
+
import { comparePaths, isPathBetween, isPathSubtreeBetween, pathHasPrefix, pathsEqual } from './path-math';
|
|
13
|
+
import { cellRectBounds, docPathFrom } from '../cursor/coordinate-spaces';
|
|
14
|
+
import { isBlockNode, nodeAt } from '../tree-operations/node-primitives';
|
|
15
|
+
import { isBlankParagraph } from '../core/parser';
|
|
16
|
+
import { countsCells, isGridKind, tableCellCount } from '../schema/block-kind-descriptor';
|
|
17
|
+
import { isWholeBlockUnit } from '../schema/whole-block-unit';
|
|
18
|
+
import { isCollapsedContainer, isReservedChromeChild, reservedChromeKindOf } from '../schema/reserved-chrome';
|
|
19
|
+
const SEAL = Symbol('coverRange');
|
|
20
|
+
/** A live range in document order as every reader must see it: table endpoints snapped to whole
|
|
21
|
+
* rows, and each closed container the range takes whole named in `wholeUnits`. */
|
|
22
|
+
export class CoveredRange {
|
|
23
|
+
// Never read: the private field makes the type nominal, so a spread or a literal isn't one.
|
|
24
|
+
// eslint-disable-next-line no-unused-private-class-members
|
|
25
|
+
#covered = true;
|
|
26
|
+
start;
|
|
27
|
+
end;
|
|
28
|
+
/** Collapsed containers taken whole, outermost only, in document order. */
|
|
29
|
+
wholeUnits;
|
|
30
|
+
/** Built by `coverRange` only, which holds the module-private key. */
|
|
31
|
+
constructor(key, start, end, wholeUnits) {
|
|
32
|
+
if (key !== SEAL)
|
|
33
|
+
throw new Error('a CoveredRange is built by coverRange');
|
|
34
|
+
this.start = start;
|
|
35
|
+
this.end = end;
|
|
36
|
+
this.wholeUnits = wholeUnits;
|
|
37
|
+
Object.freeze(this);
|
|
38
|
+
}
|
|
39
|
+
/** The container in `wholeUnits` holding `path`, or null. */
|
|
40
|
+
unitHolding(path) {
|
|
41
|
+
return this.wholeUnits.find((unit) => pathHasPrefix(path, unit)) ?? null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** A same-path pair (a block held whole, a cell rectangle) is returned as is. A closed title row
|
|
45
|
+
* the range starts on, or ends on past its first byte, takes its container whole. */
|
|
46
|
+
export function coverRange(doc, a, b) {
|
|
47
|
+
const ordered = normalize({ anchor: a, focus: b });
|
|
48
|
+
if (pathsEqual(ordered.start.path, ordered.end.path)) {
|
|
49
|
+
return sealed(ordered.start, ordered.end, []);
|
|
50
|
+
}
|
|
51
|
+
const { start, end } = snapCrossBlockTableEndpoints(doc, ordered.start, ordered.end);
|
|
52
|
+
const units = [];
|
|
53
|
+
const startUnit = closedTitleOwner(doc, start.path);
|
|
54
|
+
if (startUnit)
|
|
55
|
+
units.push(startUnit);
|
|
56
|
+
const endUnit = end.offset > 0 ? closedTitleOwner(doc, end.path) : null;
|
|
57
|
+
if (endUnit)
|
|
58
|
+
units.push(endUnit);
|
|
59
|
+
return sealed(start, end, units);
|
|
60
|
+
}
|
|
61
|
+
/** What a covered range holds, read once by the delete, the copy, the format toggle and the
|
|
62
|
+
* overlay. Built by `rangeCoverage` only, so no consumer can be handed a hand-made answer. */
|
|
63
|
+
export class RangeCoverage {
|
|
64
|
+
// Private, so the type is nominal as `CoveredRange` is; keyed so a lookup costs the path's depth.
|
|
65
|
+
#wholeByKey;
|
|
66
|
+
#coveredByKey;
|
|
67
|
+
range;
|
|
68
|
+
/** The start block's kept head, from its first byte or cell to the start; null where the
|
|
69
|
+
* range holds the block whole. */
|
|
70
|
+
startEdge;
|
|
71
|
+
/** The end block's kept tail, from the end to its last byte or cell; null likewise. */
|
|
72
|
+
endEdge;
|
|
73
|
+
/** Every subtree the range removes whole, outermost only, in document order. */
|
|
74
|
+
wholeRoots;
|
|
75
|
+
/** Every subtree whose bytes the range covers end to end, outermost only: the whole roots and
|
|
76
|
+
* a kept edge at its block's first or last byte, with the containers they complete. */
|
|
77
|
+
coveredWhole;
|
|
78
|
+
/** For a pair inside one table, which of its cells the range holds; null otherwise. */
|
|
79
|
+
grid;
|
|
80
|
+
/** The cells a kept table edge hands to the range, as a half-open row-major run: from the
|
|
81
|
+
* start's cell to the table's end, or from its first cell through the end's. */
|
|
82
|
+
startCells;
|
|
83
|
+
endCells;
|
|
84
|
+
/** Built by `rangeCoverage` only, which holds the module-private key. */
|
|
85
|
+
constructor(key, range, fields) {
|
|
86
|
+
if (key !== SEAL)
|
|
87
|
+
throw new Error('a RangeCoverage is built by rangeCoverage');
|
|
88
|
+
this.range = range;
|
|
89
|
+
this.startEdge = fields.startEdge;
|
|
90
|
+
this.endEdge = fields.endEdge;
|
|
91
|
+
this.wholeRoots = fields.wholeRoots;
|
|
92
|
+
this.coveredWhole = fields.coveredWhole;
|
|
93
|
+
this.grid = fields.grid;
|
|
94
|
+
this.startCells = fields.startCells;
|
|
95
|
+
this.endCells = fields.endCells;
|
|
96
|
+
this.#wholeByKey = byKey(fields.wholeRoots);
|
|
97
|
+
this.#coveredByKey = byKey(fields.coveredWhole);
|
|
98
|
+
Object.freeze(this);
|
|
99
|
+
}
|
|
100
|
+
/** The whole root holding `path`, or null. */
|
|
101
|
+
rootHolding(path) {
|
|
102
|
+
return rootAmong(this.#wholeByKey, path);
|
|
103
|
+
}
|
|
104
|
+
/** The subtree in `coveredWhole` holding `path`, or null. */
|
|
105
|
+
coveredRootHolding(path) {
|
|
106
|
+
return rootAmong(this.#coveredByKey, path);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** A text edge always keeps its head or tail, even an empty one; a block with no character
|
|
110
|
+
* position, a table from its first or to its last row, or a whole unit keeps none. */
|
|
111
|
+
export function rangeCoverage(doc, range) {
|
|
112
|
+
const { start, end } = range;
|
|
113
|
+
if (pathsEqual(start.path, end.path)) {
|
|
114
|
+
return new RangeCoverage(SEAL, range, samePathCoverage(doc, start, end));
|
|
115
|
+
}
|
|
116
|
+
const held = walkBetween(doc, start.path, end.path).filter((p) => isPathSubtreeBetween(p, start.path, end.path));
|
|
117
|
+
for (const unit of range.wholeUnits)
|
|
118
|
+
held.push(unit);
|
|
119
|
+
const startHeld = range.unitHolding(start.path) !== null || edgeHeld(doc, start, 'start');
|
|
120
|
+
const endHeld = range.unitHolding(end.path) !== null || endConsumed(doc, range);
|
|
121
|
+
if (startHeld)
|
|
122
|
+
held.push(start.path);
|
|
123
|
+
if (endHeld)
|
|
124
|
+
held.push(end.path);
|
|
125
|
+
// A kept edge still hands over every byte of its block when it sits on that block's edge.
|
|
126
|
+
const covered = held.slice();
|
|
127
|
+
if (!startHeld && edgeCoversBlock(doc, start, 'start'))
|
|
128
|
+
covered.push(start.path);
|
|
129
|
+
if (!endHeld && edgeCoversBlock(doc, end, 'end'))
|
|
130
|
+
covered.push(end.path);
|
|
131
|
+
return new RangeCoverage(SEAL, range, {
|
|
132
|
+
startEdge: startHeld ? null : start,
|
|
133
|
+
endEdge: endHeld ? null : end,
|
|
134
|
+
wholeRoots: outermost(withWholeParents(doc, held)),
|
|
135
|
+
coveredWhole: outermost(withWholeParents(doc, covered)),
|
|
136
|
+
grid: null,
|
|
137
|
+
startCells: startHeld ? null : keptTableRun(doc, start, 'start'),
|
|
138
|
+
endCells: endHeld ? null : keptTableRun(doc, end, 'end')
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/** Every block path strictly between `start` and `end`, at every nesting level, in document
|
|
142
|
+
* order; an ancestor of `end` counts, since it starts before `end` does. */
|
|
143
|
+
export function walkBetween(doc, start, end) {
|
|
144
|
+
if (comparePaths(start, end) >= 0)
|
|
145
|
+
return [];
|
|
146
|
+
const result = [];
|
|
147
|
+
const visit = (node, path) => {
|
|
148
|
+
if (isPathBetween(path, start, end))
|
|
149
|
+
result.push([...path]);
|
|
150
|
+
const children = node.children ?? [];
|
|
151
|
+
for (let i = 0; i < children.length; i++) {
|
|
152
|
+
const childPath = [...path, i];
|
|
153
|
+
// Skip subtrees entirely before start (an ancestor of start still holds it) or after end.
|
|
154
|
+
if (!pathHasPrefix(start, childPath) && comparePaths(childPath, start) < 0)
|
|
155
|
+
continue;
|
|
156
|
+
if (comparePaths(childPath, end) >= 0)
|
|
157
|
+
break;
|
|
158
|
+
visit(children[i], childPath);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
visit(doc, []);
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
/** The deepest strict ancestor of `path` whose kind reserves a title row. */
|
|
165
|
+
export function nearestChromeContainer(doc, path) {
|
|
166
|
+
let found = null;
|
|
167
|
+
let children = doc.children;
|
|
168
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
169
|
+
const node = children[path[i]];
|
|
170
|
+
if (!node)
|
|
171
|
+
break;
|
|
172
|
+
if (reservedChromeKindOf(node.kind) !== undefined)
|
|
173
|
+
found = { path: path.slice(0, i + 1), node };
|
|
174
|
+
children = node.children ?? [];
|
|
175
|
+
}
|
|
176
|
+
return found;
|
|
177
|
+
}
|
|
178
|
+
export function isChromeChild(container, leafPath) {
|
|
179
|
+
return (leafPath.length === container.path.length + 1 &&
|
|
180
|
+
isReservedChromeChild(container.node, leafPath[container.path.length]));
|
|
181
|
+
}
|
|
182
|
+
// ── Internal ────────────────────────────────────────────────────────────────
|
|
183
|
+
function sealed(start, end, wholeUnits) {
|
|
184
|
+
return new CoveredRange(SEAL, start, end, wholeUnits);
|
|
185
|
+
}
|
|
186
|
+
/** The collapsed container whose title row `path` is; null for a row inside another container's
|
|
187
|
+
* hidden body, since the range already covers what follows it. */
|
|
188
|
+
function closedTitleOwner(doc, path) {
|
|
189
|
+
if (path.length < 2)
|
|
190
|
+
return null;
|
|
191
|
+
const ownerPath = path.slice(0, -1);
|
|
192
|
+
const owner = nodeAt(doc, ownerPath);
|
|
193
|
+
if (!owner || !isBlockNode(owner))
|
|
194
|
+
return null;
|
|
195
|
+
if (!isReservedChromeChild(owner, path[path.length - 1]) || !isCollapsedContainer(owner)) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
return collapsedContainerHiding(doc, ownerPath) ? null : docPathFrom(ownerPath);
|
|
199
|
+
}
|
|
200
|
+
function samePathCoverage(doc, start, end) {
|
|
201
|
+
const node = nodeAt(doc, start.path);
|
|
202
|
+
const path = docPathFrom(start.path);
|
|
203
|
+
if (node && isBlockNode(node) && countsCells(node) && start.cellCoordinate) {
|
|
204
|
+
const grid = gridCoverage(node, path, start.offset, end.offset);
|
|
205
|
+
return grid.kind === 'table' ? heldWhole(path, grid) : { ...kept(start, end), grid };
|
|
206
|
+
}
|
|
207
|
+
// A paragraph emptied stays as the blank line between its neighbours; another kind emptied
|
|
208
|
+
// reads back as no block of that kind at all, so it goes.
|
|
209
|
+
const heldAsUnit = node !== null &&
|
|
210
|
+
isBlockNode(node) &&
|
|
211
|
+
start.offset === 0 &&
|
|
212
|
+
end.offset >= displayLength(node.raw) &&
|
|
213
|
+
!isBlankParagraph({ kind: node.kind, raw: '' });
|
|
214
|
+
return heldAsUnit ? heldWhole(path, null) : kept(start, end);
|
|
215
|
+
}
|
|
216
|
+
function kept(start, end) {
|
|
217
|
+
return {
|
|
218
|
+
startEdge: start,
|
|
219
|
+
endEdge: end,
|
|
220
|
+
wholeRoots: [],
|
|
221
|
+
coveredWhole: [],
|
|
222
|
+
grid: null,
|
|
223
|
+
startCells: null,
|
|
224
|
+
endCells: null
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
function heldWhole(path, grid) {
|
|
228
|
+
return {
|
|
229
|
+
startEdge: null,
|
|
230
|
+
endEdge: null,
|
|
231
|
+
wholeRoots: [path],
|
|
232
|
+
coveredWhole: [path],
|
|
233
|
+
grid,
|
|
234
|
+
startCells: null,
|
|
235
|
+
endCells: null
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/** The cells a kept table edge's side of the range spans; null for an edge that isn't a table. */
|
|
239
|
+
function keptTableRun(doc, point, side) {
|
|
240
|
+
const node = nodeAt(doc, point.path);
|
|
241
|
+
if (!node || !isBlockNode(node) || !countsCells(node))
|
|
242
|
+
return null;
|
|
243
|
+
const cell = cellIndexOf(point, 'rangeCoverage:tableEdge');
|
|
244
|
+
return side === 'start' ? { from: cell, to: tableCellCount(node) } : { from: 0, to: cell + 1 };
|
|
245
|
+
}
|
|
246
|
+
/** A whole table beats the row or column that spans it (a one-row or one-column table). */
|
|
247
|
+
function gridCoverage(table, path, a, b) {
|
|
248
|
+
const columnCount = metadataOf(table, 'table').columnCount;
|
|
249
|
+
const rowCount = table.children?.length ?? 0;
|
|
250
|
+
const rect = cellRectBounds(a, b, columnCount);
|
|
251
|
+
const fullWidth = rect.left === 0 && rect.cols === columnCount;
|
|
252
|
+
const fullHeight = rect.top === 0 && rect.rows === rowCount;
|
|
253
|
+
const kind = fullWidth && fullHeight
|
|
254
|
+
? 'table'
|
|
255
|
+
: fullWidth && rect.rows === 1
|
|
256
|
+
? 'row'
|
|
257
|
+
: fullHeight && rect.cols === 1
|
|
258
|
+
? 'column'
|
|
259
|
+
: 'cells';
|
|
260
|
+
return { kind, path, rect };
|
|
261
|
+
}
|
|
262
|
+
/** An edge holds its block whole when nothing of it lies outside the range. A character offset on
|
|
263
|
+
* a plugin grid's own path addresses no cell, so it reads as the grid's edge. */
|
|
264
|
+
function edgeHeld(doc, point, side) {
|
|
265
|
+
const node = nodeAt(doc, point.path);
|
|
266
|
+
if (!node || !isBlockNode(node))
|
|
267
|
+
return false;
|
|
268
|
+
if (countsCells(node)) {
|
|
269
|
+
return point.offset === (side === 'start' ? 0 : tableCellCount(node) - 1);
|
|
270
|
+
}
|
|
271
|
+
if (isGridKind(node.kind))
|
|
272
|
+
return true;
|
|
273
|
+
if (!isWholeBlockUnit(node))
|
|
274
|
+
return false;
|
|
275
|
+
return side === 'start' ? point.offset === 0 : point.offset >= displayLength(node.raw);
|
|
276
|
+
}
|
|
277
|
+
/** A text edge at its block's first byte (a start) or last (an end), so a copy takes the block. */
|
|
278
|
+
function edgeCoversBlock(doc, point, side) {
|
|
279
|
+
if (point.cellCoordinate)
|
|
280
|
+
return false;
|
|
281
|
+
const node = nodeAt(doc, point.path);
|
|
282
|
+
if (!node || !isBlockNode(node))
|
|
283
|
+
return false;
|
|
284
|
+
return side === 'start' ? point.offset === 0 : point.offset >= displayLength(node.raw);
|
|
285
|
+
}
|
|
286
|
+
/** The end holds its block whole as a start does, and also on the last byte of a title-line
|
|
287
|
+
* container's last block with the start outside it, since nothing merges across that edge. */
|
|
288
|
+
function endConsumed(doc, range) {
|
|
289
|
+
const { start, end } = range;
|
|
290
|
+
if (edgeHeld(doc, end, 'end'))
|
|
291
|
+
return true;
|
|
292
|
+
const container = nearestChromeContainer(doc, end.path);
|
|
293
|
+
if (!container || pathHasPrefix(start.path, container.path))
|
|
294
|
+
return false;
|
|
295
|
+
const node = lastChildDescendant(container, end.path);
|
|
296
|
+
return node !== null && 'raw' in node && end.offset >= displayLength(node.raw);
|
|
297
|
+
}
|
|
298
|
+
/** The node at `path` when every step down from the container is a last child, else null. */
|
|
299
|
+
function lastChildDescendant(container, path) {
|
|
300
|
+
let node = container.node;
|
|
301
|
+
for (let i = container.path.length; i < path.length; i++) {
|
|
302
|
+
const children = node.children ?? [];
|
|
303
|
+
if (path[i] !== children.length - 1)
|
|
304
|
+
return null;
|
|
305
|
+
node = children[path[i]];
|
|
306
|
+
}
|
|
307
|
+
return node;
|
|
308
|
+
}
|
|
309
|
+
/** `held` plus every container all of whose children it holds, up to the document, each once. */
|
|
310
|
+
function withWholeParents(doc, held) {
|
|
311
|
+
const all = [];
|
|
312
|
+
const keys = new Set();
|
|
313
|
+
const add = (path) => {
|
|
314
|
+
const key = pathKey(path);
|
|
315
|
+
if (keys.has(key))
|
|
316
|
+
return;
|
|
317
|
+
keys.add(key);
|
|
318
|
+
all.push(path.slice());
|
|
319
|
+
};
|
|
320
|
+
held.forEach(add);
|
|
321
|
+
// Each container counts its held children as they arrive, so it is found whole in one pass.
|
|
322
|
+
const heldChildren = new Map();
|
|
323
|
+
for (let i = 0; i < all.length; i++) {
|
|
324
|
+
const parentPath = all[i].slice(0, -1);
|
|
325
|
+
if (parentPath.length === 0)
|
|
326
|
+
continue;
|
|
327
|
+
const parentKey = pathKey(parentPath);
|
|
328
|
+
let tally = heldChildren.get(parentKey);
|
|
329
|
+
if (!tally) {
|
|
330
|
+
tally = { held: 0, of: nodeAt(doc, parentPath)?.children?.length ?? 0 };
|
|
331
|
+
heldChildren.set(parentKey, tally);
|
|
332
|
+
}
|
|
333
|
+
if (++tally.held === tally.of)
|
|
334
|
+
add(parentPath);
|
|
335
|
+
}
|
|
336
|
+
return all;
|
|
337
|
+
}
|
|
338
|
+
/** The paths no other path holds, each once, in document order. */
|
|
339
|
+
function outermost(paths) {
|
|
340
|
+
const roots = [];
|
|
341
|
+
// Document order puts every path a root holds right behind it, so only the last root can hold one.
|
|
342
|
+
for (const path of paths.slice().sort(comparePaths)) {
|
|
343
|
+
const last = roots.at(-1);
|
|
344
|
+
if (!last || !pathHasPrefix(path, last))
|
|
345
|
+
roots.push(docPathFrom(path));
|
|
346
|
+
}
|
|
347
|
+
return roots;
|
|
348
|
+
}
|
|
349
|
+
function byKey(roots) {
|
|
350
|
+
return new Map(roots.map((root) => [pathKey(root), root]));
|
|
351
|
+
}
|
|
352
|
+
/** The root in `roots` that is `path` or one of its ancestors; roots never nest, so at most one. */
|
|
353
|
+
function rootAmong(roots, path) {
|
|
354
|
+
let key = '';
|
|
355
|
+
for (let depth = 0; depth < path.length; depth++) {
|
|
356
|
+
key = depth === 0 ? `${path[0]}` : `${key}.${path[depth]}`;
|
|
357
|
+
const root = roots.get(key);
|
|
358
|
+
if (root)
|
|
359
|
+
return root;
|
|
360
|
+
}
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
function pathKey(path) {
|
|
364
|
+
return path.join('.');
|
|
365
|
+
}
|