@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
|
@@ -3,24 +3,24 @@
|
|
|
3
3
|
* values are invariant to vertical scrolling inside the editor.
|
|
4
4
|
*/
|
|
5
5
|
import { asDomTextOffset, asViewportX, toEditorX, toViewportX } from './coordinate-spaces';
|
|
6
|
-
import { containerDomTextLength,
|
|
7
|
-
import { firstUsefulRect } from './visual-lines';
|
|
8
|
-
// Half a line height of padding on each side of the probe line — wide enough for
|
|
9
|
-
// ascender/descender variation, narrow enough to exclude the neighbouring line.
|
|
10
|
-
const LINE_BAND_TOLERANCE = 0.5;
|
|
6
|
+
import { containerDomTextLength, domTextOffsetAtNode, findDomTextLanding, holdsTextPast, widgetSpanContainingOffset } from './widget-offset';
|
|
7
|
+
import { firstUsefulRect, neighbourCaretRect, sameLineTolerance } from './visual-lines';
|
|
11
8
|
export function getCurrentCursorEditorRelativeX(el) {
|
|
12
9
|
const sel = window.getSelection();
|
|
13
10
|
if (!sel || sel.rangeCount === 0)
|
|
14
11
|
return null;
|
|
15
12
|
const range = sel.getRangeAt(0);
|
|
16
|
-
const rect = firstUsefulRect(range);
|
|
13
|
+
const rect = firstUsefulRect(range) ?? neighbourCaretRect(range);
|
|
17
14
|
const viewportX = asViewportX(rect ? rect.left : el.getBoundingClientRect().left);
|
|
18
15
|
return toEditorX(viewportX, editorLeftOf(el));
|
|
19
16
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
/** The caret's box at a DOM-walk offset, under the offset the caret would really take; a position
|
|
18
|
+
* beside a widget borrows the widget's near edge. Null where the offset measures to nothing. */
|
|
19
|
+
export function caretBoxAt(container, offset) {
|
|
20
|
+
const landing = findDomTextLanding(container, offset);
|
|
21
|
+
if (!landing)
|
|
23
22
|
return null;
|
|
23
|
+
const pos = landing.position;
|
|
24
24
|
const range = document.createRange();
|
|
25
25
|
try {
|
|
26
26
|
range.setStart(pos.node, pos.offset);
|
|
@@ -29,58 +29,68 @@ export function getOffsetRect(container, offset) {
|
|
|
29
29
|
return null;
|
|
30
30
|
}
|
|
31
31
|
range.collapse(true);
|
|
32
|
-
|
|
32
|
+
const measured = firstUsefulRect(range);
|
|
33
|
+
const rect = measured ?? neighbourCaretRect(range);
|
|
34
|
+
if (!rect)
|
|
35
|
+
return null;
|
|
36
|
+
return {
|
|
37
|
+
offset: landing.inTextAtTarget ? offset : domTextOffsetAtNode(container, pos.node, pos.offset),
|
|
38
|
+
rect,
|
|
39
|
+
borrowed: measured === null
|
|
40
|
+
};
|
|
33
41
|
}
|
|
34
|
-
/**
|
|
35
|
-
*
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
* transparent (their collapsed ranges return null rects); `minOffset` excludes the
|
|
39
|
-
* ambient-marker prefix.
|
|
40
|
-
*/
|
|
41
|
-
export function findOffsetNearestX(container, editorRelativeX, from, minOffset = asDomTextOffset(0)) {
|
|
42
|
-
const totalLen = containerDomTextLength(container);
|
|
42
|
+
/** The offset on the first or last caret-bearing line nearest `editorRelativeX`, by linear scan
|
|
43
|
+
* since BiDi rect lefts are non-monotonic. `minOffset` and `maxOffset` bound the answer. */
|
|
44
|
+
export function findOffsetNearestX(container, editorRelativeX, from, minOffset = asDomTextOffset(0), maxOffset) {
|
|
45
|
+
const totalLen = Math.min(maxOffset ?? Infinity, containerDomTextLength(container));
|
|
43
46
|
if (totalLen <= minOffset)
|
|
44
47
|
return minOffset;
|
|
45
48
|
const targetViewportX = toViewportX(editorRelativeX, editorLeftOf(container));
|
|
46
|
-
// Only offsets near the probed edge can be the answer, so walk inward and stop
|
|
47
|
-
//
|
|
48
|
-
// this identical to a full scan at O(lines-near-edge) instead of O(raw length).
|
|
49
|
+
// Only offsets near the probed edge can be the answer, so walk inward and stop past it: the
|
|
50
|
+
// band filter below discards anything further regardless.
|
|
49
51
|
const forward = from === 'above';
|
|
50
|
-
const
|
|
52
|
+
const tolerance = sameLineTolerance(container);
|
|
53
|
+
const owned = createEdgeTracker(forward, (first) => STOP_AFTER_LINES * lineHeightOf(first));
|
|
54
|
+
// A caret beside a widget shows nothing, so a borrowed box sets the edge only in a block made
|
|
55
|
+
// of widgets alone, where offsets run line by line and the walk can stop past the edge's band.
|
|
56
|
+
const borrowed = holdsTextPast(container, minOffset)
|
|
57
|
+
? null
|
|
58
|
+
: createEdgeTracker(forward, () => tolerance);
|
|
59
|
+
const walkEndsAt = (probe) => {
|
|
60
|
+
if (!probe.borrowed)
|
|
61
|
+
return owned.passes(probe.rect);
|
|
62
|
+
// Once text has set the edge, a widget box as far past it ends the walk as a text box would.
|
|
63
|
+
return owned.edge ? owned.isPast(probe.rect) : (borrowed?.passes(probe.rect) ?? false);
|
|
64
|
+
};
|
|
51
65
|
const candidates = [];
|
|
52
|
-
// The probed edge's own line: min top (above) / max bottom (below), first candidate wins a tie.
|
|
53
|
-
let edgeRect = null;
|
|
54
|
-
let lineH = 0;
|
|
55
66
|
for (let k = 0; k <= totalLen - minOffset; k++) {
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
67
|
+
const target = asDomTextOffset(forward ? minOffset + k : totalLen - k);
|
|
68
|
+
// Every offset inside a widget lands beside it, where one of its boundaries measures: skip
|
|
69
|
+
// to the far boundary so the widget costs one probe.
|
|
70
|
+
const inside = widgetSpanContainingOffset(container, target);
|
|
71
|
+
if (inside) {
|
|
72
|
+
k = (forward ? inside.end - minOffset : totalLen - inside.start) - 1;
|
|
59
73
|
continue;
|
|
60
|
-
if (lineH === 0)
|
|
61
|
-
lineH = Math.max(1, rect.bottom - rect.top);
|
|
62
|
-
if (edgeRect) {
|
|
63
|
-
const distancePastEdge = forward ? rect.top - edgeRect.top : edgeRect.bottom - rect.bottom;
|
|
64
|
-
if (distancePastEdge > STOP_AFTER_LINES * lineH)
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
candidates.push({ offset, rect });
|
|
68
|
-
if (!edgeRect || (forward ? rect.top < edgeRect.top : rect.bottom > edgeRect.bottom)) {
|
|
69
|
-
edgeRect = rect;
|
|
70
74
|
}
|
|
75
|
+
const probe = caretBoxAt(container, target);
|
|
76
|
+
if (!probe)
|
|
77
|
+
continue;
|
|
78
|
+
if (walkEndsAt(probe))
|
|
79
|
+
break;
|
|
80
|
+
candidates.push(probe);
|
|
71
81
|
}
|
|
72
|
-
if (
|
|
82
|
+
if (candidates.length === 0)
|
|
73
83
|
return minOffset;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
const
|
|
78
|
-
|
|
84
|
+
// A block made of widgets alone has no line with a box of its own, and the widget edges are
|
|
85
|
+
// the only positions its caret can take.
|
|
86
|
+
const pool = owned.edge ? candidates.filter((probe) => !probe.borrowed) : candidates;
|
|
87
|
+
const edgeLine = owned.edge ?? edgeLineOf(pool, forward);
|
|
88
|
+
// Which offsets share the edge line: boxes ending within four fifths of the block's line
|
|
89
|
+
// height of it, which holds a tall widget on the line with a few pixels to spare over the gap.
|
|
90
|
+
let bestOffset = pool[0].offset;
|
|
79
91
|
let bestDelta = Infinity;
|
|
80
|
-
for (const { offset, rect } of
|
|
81
|
-
if (rect.
|
|
82
|
-
continue;
|
|
83
|
-
if (rect.bottom < lineTop - tolerance)
|
|
92
|
+
for (const { offset, rect } of pool) {
|
|
93
|
+
if (Math.abs(rect.bottom - edgeLine.bottom) > tolerance)
|
|
84
94
|
continue;
|
|
85
95
|
const delta = Math.abs(rect.left - targetViewportX);
|
|
86
96
|
if (delta < bestDelta) {
|
|
@@ -91,6 +101,46 @@ export function findOffsetNearestX(container, editorRelativeX, from, minOffset =
|
|
|
91
101
|
return bestOffset;
|
|
92
102
|
}
|
|
93
103
|
// ── Internal ─────────────────────────────────────────────────────────────────
|
|
104
|
+
const STOP_AFTER_LINES = 3;
|
|
105
|
+
/** The probed edge's line as an inward walk sees it, and whether a box has gone further past it
|
|
106
|
+
* than `allowance` (read off the first box) allows. Distances are between bottoms. */
|
|
107
|
+
function createEdgeTracker(forward, allowance) {
|
|
108
|
+
let edge = null;
|
|
109
|
+
let limit = 0;
|
|
110
|
+
const isPast = (rect) => {
|
|
111
|
+
if (!edge)
|
|
112
|
+
return false;
|
|
113
|
+
return (forward ? rect.bottom - edge.bottom : edge.bottom - rect.bottom) > limit;
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
get edge() {
|
|
117
|
+
return edge;
|
|
118
|
+
},
|
|
119
|
+
/** Reads the box against the edge without letting it move the edge. */
|
|
120
|
+
isPast,
|
|
121
|
+
/** Takes the box as the edge when it is the first, or sits nearer the edge than it. */
|
|
122
|
+
passes(rect) {
|
|
123
|
+
if (!edge) {
|
|
124
|
+
edge = rect;
|
|
125
|
+
limit = allowance(rect);
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
if (isPast(rect))
|
|
129
|
+
return true;
|
|
130
|
+
if (forward ? rect.top < edge.top : rect.bottom > edge.bottom)
|
|
131
|
+
edge = rect;
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function lineHeightOf(rect) {
|
|
137
|
+
return Math.max(1, rect.bottom - rect.top);
|
|
138
|
+
}
|
|
139
|
+
/** The box on the probed edge's line: the highest top (above) or the lowest bottom (below), the
|
|
140
|
+
* first of equals winning. */
|
|
141
|
+
function edgeLineOf(probes, forward) {
|
|
142
|
+
return probes.reduce((held, probe) => (forward ? probe.rect.top < held.top : probe.rect.bottom > held.bottom) ? probe.rect : held, probes[0].rect);
|
|
143
|
+
}
|
|
94
144
|
function editorLeftOf(el) {
|
|
95
145
|
const editor = el.closest('.editor');
|
|
96
146
|
return editor ? editor.getBoundingClientRect().left : 0;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caret reads and writes for an editable block element, in raw offsets, over the one offset walk
|
|
3
|
+
* in `widget-offset.ts`. Every editable surface (prose, code, table cell, plugin leaf) builds one.
|
|
4
|
+
* Reads answer only while the element holds focus.
|
|
5
|
+
*/
|
|
6
|
+
import { type RawOffset } from './coordinate-spaces';
|
|
7
|
+
import { type CaretClamp } from './widget-offset';
|
|
8
|
+
export interface SurfaceBackendDeps {
|
|
9
|
+
getEl: () => HTMLElement | null;
|
|
10
|
+
/** Where the user meant the caret, in raw units, when the browser holds no usable range: Chromium
|
|
11
|
+
* drops an element-level caret beside an atomic widget across an event-loop yield. */
|
|
12
|
+
getSnapTarget?: () => number | null;
|
|
13
|
+
}
|
|
14
|
+
/** The caret calls the editable-surface factory needs from a block. */
|
|
15
|
+
export interface CursorBackend {
|
|
16
|
+
/** Raw offset of the caret (the range start), or null when the element does not hold focus. */
|
|
17
|
+
getRaw(): RawOffset | null;
|
|
18
|
+
/** Place a collapsed caret; `clamp` says whether the offset may move onto a position the
|
|
19
|
+
* caret can reach. */
|
|
20
|
+
setRaw(offset: RawOffset, placement: {
|
|
21
|
+
clamp: CaretClamp;
|
|
22
|
+
}): void;
|
|
23
|
+
}
|
|
24
|
+
export interface SurfaceBackend extends CursorBackend {
|
|
25
|
+
/** Raw offset of the selection's moving end, or null when it sits outside the element. */
|
|
26
|
+
getFocusOffset(): RawOffset | null;
|
|
27
|
+
/** Raw offsets of the selection's start and end, or null for a caret or an unfocused element. */
|
|
28
|
+
getRawSelection(): {
|
|
29
|
+
start: RawOffset;
|
|
30
|
+
end: RawOffset;
|
|
31
|
+
} | null;
|
|
32
|
+
/** Raw offsets of an arbitrary range inside the element: an InputEvent's target range, which a
|
|
33
|
+
* word delete reports at a collapsed caret, so the selection cannot answer it. */
|
|
34
|
+
rawRangeOf(range: AbstractRange): {
|
|
35
|
+
start: RawOffset;
|
|
36
|
+
end: RawOffset;
|
|
37
|
+
} | null;
|
|
38
|
+
/** Move a focused caret that sits inside the marker prefix to raw 0, just past the prefix. */
|
|
39
|
+
clampOutOfMarkerPrefix(): void;
|
|
40
|
+
}
|
|
41
|
+
export declare function createSurfaceBackend(deps: SurfaceBackendDeps): SurfaceBackend;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caret reads and writes for an editable block element, in raw offsets, over the one offset walk
|
|
3
|
+
* in `widget-offset.ts`. Every editable surface (prose, code, table cell, plugin leaf) builds one.
|
|
4
|
+
* Reads answer only while the element holds focus.
|
|
5
|
+
*/
|
|
6
|
+
import { asRawOffset } from './coordinate-spaces';
|
|
7
|
+
import { domTextOffsetAtNode, markerPrefixLength, markerPrefixOf, placeCaretAtRaw, rawOffsetAt, rawSelectionFocus } from './widget-offset';
|
|
8
|
+
export function createSurfaceBackend(deps) {
|
|
9
|
+
function snapTargetRaw() {
|
|
10
|
+
const target = deps.getSnapTarget?.() ?? null;
|
|
11
|
+
return target === null ? null : asRawOffset(target);
|
|
12
|
+
}
|
|
13
|
+
function getRaw() {
|
|
14
|
+
const live = readLiveRange(deps.getEl());
|
|
15
|
+
if (live.state === 'inactive')
|
|
16
|
+
return null;
|
|
17
|
+
// A dropped range, or one bounced into the read-only prefix: the snap target holds where the
|
|
18
|
+
// user meant the caret.
|
|
19
|
+
if (live.state === 'dropped' || live.inPrefix(live.range.startContainer))
|
|
20
|
+
return snapTargetRaw();
|
|
21
|
+
return rawOffsetAt(live.el, live.range.startContainer, live.range.startOffset);
|
|
22
|
+
}
|
|
23
|
+
function setRaw(offset, placement) {
|
|
24
|
+
const el = deps.getEl();
|
|
25
|
+
if (el)
|
|
26
|
+
placeCaretAtRaw(el, offset, placement);
|
|
27
|
+
}
|
|
28
|
+
function getFocusOffset() {
|
|
29
|
+
const el = deps.getEl();
|
|
30
|
+
return el ? rawSelectionFocus(el) : null;
|
|
31
|
+
}
|
|
32
|
+
function getRawSelection() {
|
|
33
|
+
const live = readLiveRange(deps.getEl());
|
|
34
|
+
if (live.state !== 'live' || live.collapsed)
|
|
35
|
+
return null;
|
|
36
|
+
// No snap-target fallback: one caret intent cannot stand in for one end of a pair, and an
|
|
37
|
+
// endpoint inside the prefix already reads as raw 0.
|
|
38
|
+
return rawEndpointsOf(live.el, live.range);
|
|
39
|
+
}
|
|
40
|
+
function rawRangeOf(range) {
|
|
41
|
+
const el = deps.getEl();
|
|
42
|
+
if (!el || !el.contains(range.startContainer) || !el.contains(range.endContainer))
|
|
43
|
+
return null;
|
|
44
|
+
return rawEndpointsOf(el, range);
|
|
45
|
+
}
|
|
46
|
+
function clampOutOfMarkerPrefix() {
|
|
47
|
+
const live = readLiveRange(deps.getEl());
|
|
48
|
+
if (live.state !== 'live' || !live.collapsed)
|
|
49
|
+
return;
|
|
50
|
+
const { startContainer, startOffset } = live.range;
|
|
51
|
+
const walk = domTextOffsetAtNode(live.el, startContainer, startOffset);
|
|
52
|
+
if (walk < markerPrefixLength(live.el))
|
|
53
|
+
placeCaretAtRaw(live.el, 0, { clamp: 'exact' });
|
|
54
|
+
}
|
|
55
|
+
return { getRaw, setRaw, getFocusOffset, getRawSelection, rawRangeOf, clampOutOfMarkerPrefix };
|
|
56
|
+
}
|
|
57
|
+
// ── Internal ────────────────────────────────────────────────────────────────
|
|
58
|
+
function rawEndpointsOf(el, range) {
|
|
59
|
+
return {
|
|
60
|
+
start: rawOffsetAt(el, range.startContainer, range.startOffset),
|
|
61
|
+
end: rawOffsetAt(el, range.endContainer, range.endOffset)
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function readLiveRange(el) {
|
|
65
|
+
if (!el || document.activeElement !== el)
|
|
66
|
+
return { state: 'inactive' };
|
|
67
|
+
const sel = window.getSelection();
|
|
68
|
+
if (!sel || sel.rangeCount === 0)
|
|
69
|
+
return { state: 'dropped' };
|
|
70
|
+
const prefix = markerPrefixOf(el);
|
|
71
|
+
return {
|
|
72
|
+
state: 'live',
|
|
73
|
+
el,
|
|
74
|
+
range: sel.getRangeAt(0),
|
|
75
|
+
collapsed: sel.isCollapsed,
|
|
76
|
+
inPrefix: (node) => prefix !== null && prefix.contains(node)
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Empirical pixel estimates of the editor font's line box, measured at
|
|
3
3
|
* {@link ESTIMATE_BASE_FONT_SIZE} and shared by `height-oracle.ts` and `visual-lines.ts`.
|
|
4
4
|
* Character width has no CSS number to derive from, so the set is mirrored by hand at one scale.
|
|
5
|
-
* The editor's type scale is font-relative, so
|
|
6
|
-
* font size
|
|
5
|
+
* The editor's type scale is font-relative, so callers scale these by the root's live computed
|
|
6
|
+
* font size; an estimate calibrated for one scale can miss the windowing threshold entirely.
|
|
7
7
|
*/
|
|
8
8
|
/** The computed root font size the estimates below were measured at. */
|
|
9
9
|
export declare const ESTIMATE_BASE_FONT_SIZE = 16;
|
|
@@ -14,7 +14,7 @@ export declare const HEIGHT_ESTIMATES: {
|
|
|
14
14
|
readonly blockChrome: 16;
|
|
15
15
|
readonly imageBlockMinHeight: 200;
|
|
16
16
|
};
|
|
17
|
-
/** Fallback for a `normal` computed `lineHeight` (parses to NaN)
|
|
17
|
+
/** Fallback for a `normal` computed `lineHeight` (parses to NaN): a generic line box,
|
|
18
18
|
* independent of the per-kind estimates above. */
|
|
19
19
|
export declare const FALLBACK_LINE_HEIGHT = 20;
|
|
20
20
|
/** Fallback content width when no editor element is measurable yet (pre-mount, jsdom). */
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Empirical pixel estimates of the editor font's line box, measured at
|
|
3
3
|
* {@link ESTIMATE_BASE_FONT_SIZE} and shared by `height-oracle.ts` and `visual-lines.ts`.
|
|
4
4
|
* Character width has no CSS number to derive from, so the set is mirrored by hand at one scale.
|
|
5
|
-
* The editor's type scale is font-relative, so
|
|
6
|
-
* font size
|
|
5
|
+
* The editor's type scale is font-relative, so callers scale these by the root's live computed
|
|
6
|
+
* font size; an estimate calibrated for one scale can miss the windowing threshold entirely.
|
|
7
7
|
*/
|
|
8
8
|
/** The computed root font size the estimates below were measured at. */
|
|
9
9
|
export const ESTIMATE_BASE_FONT_SIZE = 16;
|
|
@@ -14,7 +14,7 @@ export const HEIGHT_ESTIMATES = {
|
|
|
14
14
|
blockChrome: 16, // px of margin/padding per block
|
|
15
15
|
imageBlockMinHeight: 200 // px floor for an image-bearing paragraph
|
|
16
16
|
};
|
|
17
|
-
/** Fallback for a `normal` computed `lineHeight` (parses to NaN)
|
|
17
|
+
/** Fallback for a `normal` computed `lineHeight` (parses to NaN): a generic line box,
|
|
18
18
|
* independent of the per-kind estimates above. */
|
|
19
19
|
export const FALLBACK_LINE_HEIGHT = 20;
|
|
20
20
|
/** Fallback content width when no editor element is measurable yet (pre-mount, jsdom). */
|
|
@@ -1,26 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Whether the cursor sits on the first or last visual line of a wrapping element
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* so the edge line is measured around real text, and a rect-less caret reads the box it sits
|
|
6
|
-
* against.
|
|
2
|
+
* Whether the cursor sits on the first or last visual line of a wrapping element, by comparing
|
|
3
|
+
* the cursor's line box with the edge line's. A caret beside a non-text child measures to
|
|
4
|
+
* nothing, so it borrows the box it sits against; that box and the line tolerance live here.
|
|
7
5
|
*/
|
|
8
6
|
/** The first rect that can position a caret: the leading client rect when it has real
|
|
9
7
|
* height, else the bounding rect. `widthTolerant` also accepts a zero-height rect with width. */
|
|
10
8
|
export declare function firstUsefulRect(range: Range, widthTolerant?: boolean): DOMRect | null;
|
|
11
9
|
export declare function getRangeTop(range: Range): number | null;
|
|
10
|
+
/** The box a caret sits in: what the line comparisons and the sticky column both read of it. */
|
|
11
|
+
export interface CaretRect {
|
|
12
|
+
/** The caret's x. For a caret borrowing a widget's box, the edge it sits on. */
|
|
13
|
+
left: number;
|
|
14
|
+
top: number;
|
|
15
|
+
bottom: number;
|
|
16
|
+
}
|
|
17
|
+
/** The box a caret with no rect of its own borrows: the widget it precedes, else the one it follows.
|
|
18
|
+
* Null off an element-level position, or when the neighbour measures to nothing. */
|
|
19
|
+
export declare function neighbourCaretRect(range: Range): CaretRect | null;
|
|
20
|
+
/** How far apart two carets' boxes may sit and still read as one visual line: under one line of
|
|
21
|
+
* the element's own leading, so sub/superscript or inline-image jitter is not a new line. */
|
|
22
|
+
export declare function sameLineTolerance(el: HTMLElement): number;
|
|
12
23
|
/** Non-collapsed ranges reliably return rects where collapsed ones don't. */
|
|
13
24
|
export declare function getCharRangeTop(container: Node, offset: number, atEnd: boolean): number | null;
|
|
14
25
|
/** Skips non-text children (dimmed marker spans) that would otherwise leave the block's
|
|
15
26
|
* first line unmeasurable, and hidden marker text, which measures to no rect at all. */
|
|
16
27
|
export declare function findFirstTextNode(root: Node): Text | null;
|
|
17
28
|
export declare function findLastTextNode(root: Node): Text | null;
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
*/
|
|
25
|
-
export declare function isAtFirstVisualLine(el: HTMLElement, fallbackOffset: number,
|
|
26
|
-
export declare function isAtLastVisualLine(el: HTMLElement, fallbackOffset: number,
|
|
29
|
+
/** The first and last offsets a caret can sit at in a block, which a hidden run moves inward. */
|
|
30
|
+
export interface CaretBounds {
|
|
31
|
+
start: number;
|
|
32
|
+
end: number;
|
|
33
|
+
}
|
|
34
|
+
/** True if the selection in `el` sits on the first visual line, or holds no range. `fallbackOffset`
|
|
35
|
+
* answers without a live range, which Chromium drops beside widgets across event-loop yields. */
|
|
36
|
+
export declare function isAtFirstVisualLine(el: HTMLElement, fallbackOffset: number, bounds: CaretBounds): boolean;
|
|
37
|
+
export declare function isAtLastVisualLine(el: HTMLElement, fallbackOffset: number, bounds: CaretBounds): boolean;
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Whether the cursor sits on the first or last visual line of a wrapping element
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* so the edge line is measured around real text, and a rect-less caret reads the box it sits
|
|
6
|
-
* against.
|
|
2
|
+
* Whether the cursor sits on the first or last visual line of a wrapping element, by comparing
|
|
3
|
+
* the cursor's line box with the edge line's. A caret beside a non-text child measures to
|
|
4
|
+
* nothing, so it borrows the box it sits against; that box and the line tolerance live here.
|
|
7
5
|
*/
|
|
8
6
|
import { domDescendants } from './dom-walk';
|
|
9
7
|
import { FALLBACK_LINE_HEIGHT } from './typography-estimates';
|
|
10
8
|
import { isHiddenMarkerText } from './widget-offset';
|
|
11
|
-
// Fraction of a line height within which the cursor Y counts as the boundary line
|
|
12
|
-
//
|
|
9
|
+
// Fraction of a line height within which the cursor Y counts as the boundary line; under one
|
|
10
|
+
// line, so sub/superscript or inline-image jitter doesn't read as a different line.
|
|
13
11
|
const SAME_LINE_TOLERANCE = 0.8;
|
|
14
12
|
/** The first rect that can position a caret: the leading client rect when it has real
|
|
15
13
|
* height, else the bounding rect. `widthTolerant` also accepts a zero-height rect with width. */
|
|
@@ -25,6 +23,22 @@ export function firstUsefulRect(range, widthTolerant = true) {
|
|
|
25
23
|
export function getRangeTop(range) {
|
|
26
24
|
return firstUsefulRect(range, false)?.top ?? null;
|
|
27
25
|
}
|
|
26
|
+
/** The box a caret with no rect of its own borrows: the widget it precedes, else the one it follows.
|
|
27
|
+
* Null off an element-level position, or when the neighbour measures to nothing. */
|
|
28
|
+
export function neighbourCaretRect(range) {
|
|
29
|
+
const container = range.startContainer;
|
|
30
|
+
if (container.nodeType !== Node.ELEMENT_NODE)
|
|
31
|
+
return null;
|
|
32
|
+
const children = container.childNodes;
|
|
33
|
+
return (nodeCaretRect(children[range.startOffset], false) ??
|
|
34
|
+
nodeCaretRect(children[range.startOffset - 1], true));
|
|
35
|
+
}
|
|
36
|
+
/** How far apart two carets' boxes may sit and still read as one visual line: under one line of
|
|
37
|
+
* the element's own leading, so sub/superscript or inline-image jitter is not a new line. */
|
|
38
|
+
export function sameLineTolerance(el) {
|
|
39
|
+
const lineHeight = parseFloat(getComputedStyle(el).lineHeight) || FALLBACK_LINE_HEIGHT;
|
|
40
|
+
return lineHeight * SAME_LINE_TOLERANCE;
|
|
41
|
+
}
|
|
28
42
|
/** Non-collapsed ranges reliably return rects where collapsed ones don't. */
|
|
29
43
|
export function getCharRangeTop(container, offset, atEnd) {
|
|
30
44
|
try {
|
|
@@ -52,16 +66,11 @@ export function findFirstTextNode(root) {
|
|
|
52
66
|
export function findLastTextNode(root) {
|
|
53
67
|
return measurableText(root, containerOf(root), true);
|
|
54
68
|
}
|
|
55
|
-
/**
|
|
56
|
-
*
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
* first LANDABLE offset, which a leading hidden run moves off raw 0.
|
|
61
|
-
*/
|
|
62
|
-
export function isAtFirstVisualLine(el, fallbackOffset, contentStart) {
|
|
63
|
-
return isAtEdgeVisualLine(el, () => fallbackOffset <= contentStart, {
|
|
64
|
-
isEmpty: (el.textContent ?? '').length === 0,
|
|
69
|
+
/** True if the selection in `el` sits on the first visual line, or holds no range. `fallbackOffset`
|
|
70
|
+
* answers without a live range, which Chromium drops beside widgets across event-loop yields. */
|
|
71
|
+
export function isAtFirstVisualLine(el, fallbackOffset, bounds) {
|
|
72
|
+
return isAtEdgeVisualLine(el, () => fallbackOffset <= bounds.start, {
|
|
73
|
+
isEmpty: bounds.start === bounds.end,
|
|
65
74
|
toStart: true,
|
|
66
75
|
boundaryTop: () => {
|
|
67
76
|
const firstText = findFirstTextNode(el);
|
|
@@ -70,9 +79,9 @@ export function isAtFirstVisualLine(el, fallbackOffset, contentStart) {
|
|
|
70
79
|
}
|
|
71
80
|
});
|
|
72
81
|
}
|
|
73
|
-
export function isAtLastVisualLine(el, fallbackOffset,
|
|
74
|
-
return isAtEdgeVisualLine(el, () => fallbackOffset >=
|
|
75
|
-
isEmpty:
|
|
82
|
+
export function isAtLastVisualLine(el, fallbackOffset, bounds) {
|
|
83
|
+
return isAtEdgeVisualLine(el, () => fallbackOffset >= bounds.end, {
|
|
84
|
+
isEmpty: bounds.start === bounds.end,
|
|
76
85
|
toStart: false,
|
|
77
86
|
boundaryTop: () => {
|
|
78
87
|
const lastText = findLastTextNode(el);
|
|
@@ -82,8 +91,7 @@ export function isAtLastVisualLine(el, fallbackOffset, contentEnd) {
|
|
|
82
91
|
});
|
|
83
92
|
}
|
|
84
93
|
// ── Internal ────────────────────────────────────────────────────────────────
|
|
85
|
-
/** The shared skeleton of the two edge predicates: `fallback` answers where geometry cannot
|
|
86
|
-
* dropped range, a caret no box can be found for, an unmeasurable boundary line — and
|
|
94
|
+
/** The shared skeleton of the two edge predicates: `fallback` answers where geometry cannot, and
|
|
87
95
|
* `boundaryTop` measures the edge line each side's own way. */
|
|
88
96
|
function isAtEdgeVisualLine(el, fallback, edge) {
|
|
89
97
|
const sel = window.getSelection();
|
|
@@ -92,16 +100,15 @@ function isAtEdgeVisualLine(el, fallback, edge) {
|
|
|
92
100
|
if (edge.isEmpty)
|
|
93
101
|
return true;
|
|
94
102
|
const cursorRange = sel.getRangeAt(0);
|
|
95
|
-
const
|
|
96
|
-
const tolerance = lineHeight * SAME_LINE_TOLERANCE;
|
|
103
|
+
const tolerance = sameLineTolerance(el);
|
|
97
104
|
const cursorTop = getRangeTop(cursorRange);
|
|
98
105
|
if (cursorTop === null) {
|
|
99
106
|
if (!cursorRange.collapsed)
|
|
100
107
|
return true;
|
|
101
|
-
// A caret beside an atomic
|
|
102
|
-
// of its own: it
|
|
103
|
-
const band =
|
|
104
|
-
const contents =
|
|
108
|
+
// A caret beside an atomic widget sits at an element-level position and measures to no rect
|
|
109
|
+
// of its own: it borrows the widget's box, and is at the edge line when nothing reaches past.
|
|
110
|
+
const band = neighbourCaretRect(cursorRange);
|
|
111
|
+
const contents = contentsRect(el);
|
|
105
112
|
if (!band || !contents)
|
|
106
113
|
return fallback();
|
|
107
114
|
return edge.toStart
|
|
@@ -113,36 +120,28 @@ function isAtEdgeVisualLine(el, fallback, edge) {
|
|
|
113
120
|
return fallback();
|
|
114
121
|
return Math.abs(cursorTop - edgeTop) < tolerance;
|
|
115
122
|
}
|
|
116
|
-
|
|
117
|
-
* one it follows. Null where the caret is not at an element-level position. */
|
|
118
|
-
function neighbourBand(range) {
|
|
119
|
-
const container = range.startContainer;
|
|
120
|
-
if (container.nodeType !== Node.ELEMENT_NODE)
|
|
121
|
-
return null;
|
|
122
|
-
const children = container.childNodes;
|
|
123
|
-
return (nodeBand(children[range.startOffset], false) ?? nodeBand(children[range.startOffset - 1], true));
|
|
124
|
-
}
|
|
125
|
-
function nodeBand(node, fromEnd) {
|
|
123
|
+
function nodeCaretRect(node, fromEnd) {
|
|
126
124
|
if (!node)
|
|
127
125
|
return null;
|
|
128
126
|
const range = document.createRange();
|
|
129
127
|
range.selectNode(node);
|
|
130
128
|
// A node that wraps has one rect per line, and the caret touches the line on its own side.
|
|
131
129
|
const rects = range.getClientRects();
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
return bandOf(rects[fromEnd ? rects.length - 1 : 0]);
|
|
130
|
+
const rect = rects.length === 0 ? range.getBoundingClientRect() : rects[fromEnd ? rects.length - 1 : 0];
|
|
131
|
+
return caretRectOf(rect, fromEnd);
|
|
135
132
|
}
|
|
136
133
|
function contentsRange(el) {
|
|
137
134
|
const range = document.createRange();
|
|
138
135
|
range.selectNodeContents(el);
|
|
139
136
|
return range;
|
|
140
137
|
}
|
|
141
|
-
function
|
|
142
|
-
return
|
|
138
|
+
function contentsRect(el) {
|
|
139
|
+
return caretRectOf(contentsRange(el).getBoundingClientRect(), false);
|
|
143
140
|
}
|
|
144
|
-
function
|
|
145
|
-
|
|
141
|
+
function caretRectOf(rect, fromEnd) {
|
|
142
|
+
if (rect.height <= 0)
|
|
143
|
+
return null;
|
|
144
|
+
return { left: fromEnd ? rect.right : rect.left, top: rect.top, bottom: rect.bottom };
|
|
146
145
|
}
|
|
147
146
|
/** The boundary line's collapsed-contents fallback measurement. */
|
|
148
147
|
function collapsedContentsTop(el, toStart) {
|
|
@@ -150,7 +149,7 @@ function collapsedContentsTop(el, toStart) {
|
|
|
150
149
|
range.collapse(toStart);
|
|
151
150
|
return getRangeTop(range);
|
|
152
151
|
}
|
|
153
|
-
/**
|
|
152
|
+
/** Deciding whether text is a hidden marker needs the walk container; a bare text-node root has none. */
|
|
154
153
|
function containerOf(root) {
|
|
155
154
|
return root instanceof HTMLElement ? root : null;
|
|
156
155
|
}
|
|
@@ -1,28 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Which atomic
|
|
3
|
-
* measures
|
|
4
|
-
* one
|
|
5
|
-
* that selects whole declines and keeps its own click handling.
|
|
2
|
+
* Which atomic inline widget's raw edge a point lands on: the nearest edge among the widgets the
|
|
3
|
+
* caller measures. A point on a widget that behaves like a character names the edge on its side;
|
|
4
|
+
* one on a widget that selects whole declines, leaving that widget's own click handling.
|
|
6
5
|
*/
|
|
7
6
|
export interface WidgetEdgeCandidate {
|
|
8
|
-
/** The
|
|
7
|
+
/** The widget's own raw source span; the caret goes at one end or the other. */
|
|
9
8
|
start: number;
|
|
10
9
|
end: number;
|
|
11
10
|
rect: Pick<DOMRect, 'left' | 'right' | 'top' | 'bottom'>;
|
|
12
|
-
/** The kind
|
|
13
|
-
* selecting the
|
|
11
|
+
/** The kind behaves as one character, so a click on it names an edge by side rather than
|
|
12
|
+
* selecting the widget whole. */
|
|
14
13
|
seatsInside: boolean;
|
|
15
14
|
}
|
|
16
15
|
export interface WidgetEdgeSeat {
|
|
17
16
|
offset: number;
|
|
18
|
-
/** The
|
|
19
|
-
*
|
|
17
|
+
/** The click landed on the widget itself. The browser would put the caret in the text
|
|
18
|
+
* beside it, and that caret is no reason to drop this snap. */
|
|
20
19
|
inside: boolean;
|
|
21
20
|
}
|
|
22
|
-
/**
|
|
23
|
-
*
|
|
24
|
-
* inside an island that selects whole, whose own click handling owns it, or with no island to
|
|
25
|
-
* either side. A null `y` is a point with no line to compare against, so vertical distance drops
|
|
26
|
-
* out and horizontal containment alone reads as inside.
|
|
27
|
-
*/
|
|
21
|
+
/** The raw offset a point snaps to, ties in document order. Null inside a widget that selects whole
|
|
22
|
+
* (its own click handling owns it) or with no widget; a null `y` compares columns alone. */
|
|
28
23
|
export declare function nearestWidgetEdgeSeat(candidates: Iterable<WidgetEdgeCandidate>, x: number, y: number | null): WidgetEdgeSeat | null;
|