@voithos-labs/aragonite 0.10.3 → 0.10.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/a11y-strings.d.ts +12 -5
- package/dist/a11y-strings.js +61 -5
- package/dist/action-contracts.d.ts +242 -155
- package/dist/action-contracts.js +2 -2
- package/dist/active-editor.d.ts +3 -3
- package/dist/active-editor.js +8 -9
- package/dist/ambient/ambient-dom.d.ts +2 -5
- package/dist/ambient/ambient-dom.js +16 -62
- package/dist/assert.js +6 -5
- package/dist/block-component.d.ts +135 -109
- package/dist/block-component.js +30 -22
- package/dist/block-id.d.ts +6 -10
- package/dist/block-id.js +25 -14
- package/dist/bounded-memo.d.ts +5 -5
- package/dist/bounded-memo.js +6 -6
- package/dist/components/BlockDragHandle.svelte +13 -20
- package/dist/components/BlockHost.svelte +56 -134
- package/dist/components/BlockList.svelte +22 -19
- package/dist/components/DecorationOverlay.svelte +9 -10
- package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
- package/dist/components/Editor.svelte +619 -1089
- package/dist/components/Editor.svelte.d.ts +9 -20
- package/dist/components/GapCaret.svelte +26 -59
- package/dist/components/SelectionOverlay.svelte +36 -67
- package/dist/components/SelectionOverlay.svelte.d.ts +6 -4
- package/dist/components/TailInsert.svelte +8 -55
- package/dist/components/TailInsert.svelte.d.ts +4 -6
- package/dist/components/block-content-selector.d.ts +11 -11
- package/dist/components/block-content-selector.js +11 -11
- package/dist/components/block-el-lookup.d.ts +6 -0
- package/dist/components/block-el-lookup.js +27 -0
- package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
- package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
- package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
- package/dist/components/blocks/code/CodeBlock.svelte +255 -276
- package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
- package/dist/components/blocks/code/CodeBlockRail.svelte +103 -100
- package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
- package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
- package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
- package/dist/components/blocks/code/code-bootstrap.js +35 -28
- package/dist/components/blocks/code/code-context-actions.js +5 -4
- package/dist/components/blocks/code/code-enter.js +2 -2
- package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
- package/dist/components/blocks/code/code-fence-boundary.js +40 -66
- package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
- package/dist/components/blocks/code/code-fence-exit.js +24 -25
- package/dist/components/blocks/code/code-indent.d.ts +2 -2
- package/dist/components/blocks/code/code-indent.js +4 -7
- package/dist/components/blocks/code/code-languages.d.ts +16 -12
- package/dist/components/blocks/code/code-languages.js +58 -32
- package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
- package/dist/components/blocks/code/code-paste-surface.js +9 -18
- package/dist/components/blocks/code/code-renderer.d.ts +21 -5
- package/dist/components/blocks/code/code-renderer.js +90 -125
- package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
- package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
- package/dist/components/blocks/directive/activate-directives.js +18 -13
- package/dist/components/blocks/editable-leaf.d.ts +50 -74
- package/dist/components/blocks/editable-leaf.js +144 -202
- package/dist/components/blocks/editable-surface.d.ts +96 -100
- package/dist/components/blocks/editable-surface.js +101 -109
- package/dist/components/blocks/list/ListBlock.svelte +46 -90
- package/dist/components/blocks/list/ListItemBlock.svelte +99 -144
- package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +3 -0
- package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
- package/dist/components/blocks/list/task-checkbox.js +12 -7
- package/dist/components/blocks/plain-text-backend.d.ts +4 -20
- package/dist/components/blocks/plain-text-backend.js +9 -43
- package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
- package/dist/components/blocks/surface-wiring.svelte.js +15 -34
- package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
- package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
- package/dist/components/blocks/table/TableBlock.svelte +100 -165
- package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
- package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
- package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
- package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
- package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
- package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
- package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
- package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
- package/dist/components/blocks/table/cell-pointer.js +49 -71
- package/dist/components/blocks/table/cell-render.d.ts +24 -29
- package/dist/components/blocks/table/cell-render.js +29 -31
- package/dist/components/blocks/table/selected-cells.d.ts +7 -7
- package/dist/components/blocks/table/selected-cells.js +9 -13
- package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
- package/dist/components/blocks/table/table-caret-at-point.js +5 -5
- package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
- package/dist/components/blocks/table/table-cell-paste.js +27 -43
- package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
- package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
- package/dist/components/blocks/table/table-menu-model.js +6 -10
- package/dist/components/blocks/table/table-navigation.js +2 -2
- package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
- package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
- package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
- package/dist/components/blocks/text/auto-pair-record.js +51 -0
- package/dist/components/blocks/text/click-snap-guard.d.ts +9 -4
- package/dist/components/blocks/text/click-snap-guard.js +16 -5
- package/dist/components/blocks/text/composition-seat.d.ts +17 -14
- package/dist/components/blocks/text/composition-seat.js +11 -11
- package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
- package/dist/components/blocks/text/construct-edge-delete.js +50 -65
- package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
- package/dist/components/blocks/text/construct-reveal.js +13 -14
- package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
- package/dist/components/blocks/text/delimiter-autopair.js +87 -103
- package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
- package/dist/components/blocks/text/edge-policy-dispatch.js +164 -180
- package/dist/components/blocks/text/edge-seat.d.ts +17 -26
- package/dist/components/blocks/text/edge-seat.js +43 -70
- package/dist/components/blocks/text/link-at-point.d.ts +9 -9
- package/dist/components/blocks/text/link-at-point.js +12 -15
- package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
- package/dist/components/blocks/text/live-join-seam.js +75 -112
- package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
- package/dist/components/blocks/text/live-selection-edit.js +32 -105
- package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
- package/dist/components/blocks/text/live-split-rebalance.js +50 -67
- package/dist/components/blocks/text/marker-completion.d.ts +7 -12
- package/dist/components/blocks/text/marker-completion.js +17 -10
- package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
- package/dist/components/blocks/text/pending-mark-insert.js +30 -49
- package/dist/components/blocks/text/screen-diff.d.ts +5 -15
- package/dist/components/blocks/text/screen-diff.js +5 -19
- package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
- package/dist/components/blocks/text/text-clipboard.js +27 -32
- package/dist/components/blocks/text/text-keydown.d.ts +20 -30
- package/dist/components/blocks/text/text-keydown.js +54 -51
- package/dist/components/blocks/text/text-render.d.ts +25 -35
- package/dist/components/blocks/text/text-render.js +82 -61
- package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
- package/dist/components/blocks/text/widget-adjacency.js +17 -17
- package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
- package/dist/components/blocks/text/widget-interaction.js +243 -208
- package/dist/components/blocks/widget-portal.d.ts +20 -29
- package/dist/components/blocks/widget-portal.js +16 -14
- package/dist/components/built-in-blocks.d.ts +3 -4
- package/dist/components/built-in-blocks.js +17 -18
- package/dist/components/drag-handle.d.ts +13 -30
- package/dist/components/drag-handle.js +25 -63
- package/dist/components/editor-built-ins.d.ts +1 -0
- package/dist/components/editor-built-ins.js +16 -0
- package/dist/components/editor-root-clipboard.d.ts +6 -6
- package/dist/components/editor-root-clipboard.js +16 -27
- package/dist/components/editor-root-document-swap.d.ts +49 -0
- package/dist/components/editor-root-document-swap.js +54 -0
- package/dist/components/editor-root-focus.d.ts +5 -4
- package/dist/components/editor-root-focus.js +51 -22
- package/dist/components/editor-root-focused-surface.d.ts +35 -0
- package/dist/components/editor-root-focused-surface.js +65 -0
- package/dist/components/editor-root-geometry.d.ts +15 -24
- package/dist/components/editor-root-geometry.js +27 -31
- package/dist/components/editor-root-gestures.d.ts +39 -0
- package/dist/components/editor-root-gestures.js +189 -0
- package/dist/components/editor-root-keydown.d.ts +10 -25
- package/dist/components/editor-root-keydown.js +19 -43
- package/dist/components/editor-root-listeners.d.ts +22 -31
- package/dist/components/editor-root-listeners.js +49 -46
- package/dist/components/editor-root-menus.d.ts +51 -0
- package/dist/components/editor-root-menus.js +147 -0
- package/dist/components/editor-root-mode-flip.d.ts +16 -11
- package/dist/components/editor-root-mode-flip.js +36 -34
- package/dist/components/editor-root-scroll-host.d.ts +22 -0
- package/dist/components/editor-root-scroll-host.js +34 -0
- package/dist/components/editor-root-test-surface.d.ts +48 -0
- package/dist/components/editor-root-test-surface.js +6 -0
- package/dist/components/image/ImageOverlayHost.svelte +44 -35
- package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
- package/dist/components/image/ImageProperties.svelte +37 -41
- package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
- package/dist/components/image/ImageResizeHandles.svelte +26 -30
- package/dist/components/image/image-crop.d.ts +5 -11
- package/dist/components/image/image-crop.js +5 -11
- package/dist/components/image/image-edit-commit.d.ts +19 -16
- package/dist/components/image/image-edit-commit.js +74 -38
- package/dist/components/image/image-resize.d.ts +2 -5
- package/dist/components/image/image-resize.js +3 -6
- package/dist/components/image/image-widget-editing.d.ts +3 -3
- package/dist/components/image/image-widget-editing.js +9 -9
- package/dist/components/image/widget-dom.d.ts +2 -3
- package/dist/components/image/widget-dom.js +19 -24
- package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
- package/dist/components/image/widget-selection-state.svelte.js +26 -19
- package/dist/components/kind-cue.svelte.d.ts +21 -0
- package/dist/components/kind-cue.svelte.js +35 -0
- package/dist/components/link-card/LinkCard.svelte +115 -64
- package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
- package/dist/components/link-card/LinkCardHost.svelte +42 -33
- package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
- package/dist/components/link-card/link-card-commit.d.ts +16 -19
- package/dist/components/link-card/link-card-commit.js +21 -30
- package/dist/components/link-card/link-card-entry.d.ts +13 -23
- package/dist/components/link-card/link-card-entry.js +16 -24
- package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
- package/dist/components/link-card/link-card-state.svelte.js +2 -2
- package/dist/components/lrd-map-gate.d.ts +4 -11
- package/dist/components/lrd-map-gate.js +5 -11
- package/dist/components/menu/BlockMenu.svelte +20 -81
- package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
- package/dist/components/menu/InlineMenuHost.svelte +191 -0
- package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
- package/dist/components/menu/MenuIcon.svelte +3 -103
- package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
- package/dist/components/menu/SelectionToolbar.svelte +380 -0
- package/dist/components/menu/SelectionToolbar.svelte.d.ts +14 -0
- package/dist/components/menu/clipboard-actions.d.ts +3 -4
- package/dist/components/menu/clipboard-actions.js +3 -4
- package/dist/components/menu/default-context-actions.d.ts +4 -13
- package/dist/components/menu/default-context-actions.js +49 -67
- package/dist/components/menu/flyout-placement.d.ts +2 -2
- package/dist/components/menu/flyout-placement.js +2 -2
- package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
- package/dist/components/menu/menu-presence.svelte.js +19 -0
- package/dist/components/paste-image-arm.d.ts +6 -11
- package/dist/components/paste-image-arm.js +11 -18
- package/dist/components/portal.d.ts +2 -5
- package/dist/components/portal.js +4 -7
- package/dist/core/directive/activate.d.ts +4 -5
- package/dist/core/directive/activate.js +8 -9
- package/dist/core/directive/container-opener.js +13 -12
- package/dist/core/directive/grammar.d.ts +2 -5
- package/dist/core/directive/grammar.js +10 -10
- package/dist/core/directive/kinds.d.ts +4 -7
- package/dist/core/directive/kinds.js +14 -16
- package/dist/core/directive/registry.d.ts +12 -9
- package/dist/core/directive/registry.js +19 -20
- package/dist/core/directive/text-recognizer.d.ts +3 -2
- package/dist/core/directive/text-recognizer.js +5 -9
- package/dist/core/escapable.d.ts +1 -5
- package/dist/core/escapable.js +1 -5
- package/dist/core/inline/backticks.d.ts +3 -4
- package/dist/core/inline/backticks.js +3 -4
- package/dist/core/inline/character-refs.js +2 -1
- package/dist/core/inline/destination-bytes.d.ts +6 -3
- package/dist/core/inline/destination-bytes.js +50 -8
- package/dist/core/inline/entity-widget.d.ts +4 -3
- package/dist/core/inline/entity-widget.js +6 -6
- package/dist/core/inline/format-toggle.d.ts +22 -28
- package/dist/core/inline/format-toggle.js +97 -129
- package/dist/core/inline/html-entities.d.ts +2 -3
- package/dist/core/inline/html-entities.js +2 -3
- package/dist/core/inline/html-tag-grammar.js +6 -2
- package/dist/core/inline/image-dimensions.d.ts +2 -0
- package/dist/core/inline/image-dimensions.js +19 -2
- package/dist/core/inline/image-source-bytes.d.ts +11 -0
- package/dist/core/inline/image-source-bytes.js +71 -0
- package/dist/core/inline/index.d.ts +28 -21
- package/dist/core/inline/index.js +56 -34
- package/dist/core/inline/inline-cache.d.ts +12 -15
- package/dist/core/inline/inline-cache.js +11 -14
- package/dist/core/inline/inline-widgets.d.ts +55 -68
- package/dist/core/inline/inline-widgets.js +55 -58
- package/dist/core/inline/link-destination.d.ts +31 -0
- package/dist/core/inline/link-destination.js +129 -0
- package/dist/core/inline/link-reference-resolver.d.ts +8 -6
- package/dist/core/inline/link-reference-resolver.js +10 -6
- package/dist/core/inline/link-source-bytes.d.ts +31 -0
- package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
- package/dist/core/inline/live-edit/read-back.d.ts +29 -0
- package/dist/core/inline/live-edit/read-back.js +50 -0
- package/dist/core/inline/picture.d.ts +10 -0
- package/dist/core/inline/picture.js +40 -0
- package/dist/core/inline/scan/autolinks.d.ts +7 -8
- package/dist/core/inline/scan/autolinks.js +80 -59
- package/dist/core/inline/scan/brackets.d.ts +2 -2
- package/dist/core/inline/scan/brackets.js +6 -103
- package/dist/core/inline/scan/code-spans.d.ts +4 -0
- package/dist/core/inline/scan/code-spans.js +8 -0
- package/dist/core/inline/scan/emphasis.js +10 -14
- package/dist/core/inline/scan/index.d.ts +3 -1
- package/dist/core/inline/scan/index.js +32 -33
- package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
- package/dist/core/inline/scan/plugin-syntax.js +75 -89
- package/dist/core/inline/scan/scan-state.d.ts +2 -0
- package/dist/core/inline/scan/scan-state.js +1 -0
- package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
- package/dist/core/inline/scan/simple-nodes.js +2 -5
- package/dist/core/inline/scan/triggers.d.ts +17 -0
- package/dist/core/inline/scan/triggers.js +26 -0
- package/dist/core/inline/scan/url.js +8 -10
- package/dist/core/inline/transparency.d.ts +2 -1
- package/dist/core/inline/transparency.js +33 -17
- package/dist/core/inline/visibility.d.ts +30 -49
- package/dist/core/inline/visibility.js +31 -49
- package/dist/core/inline/walk.d.ts +4 -10
- package/dist/core/inline/walk.js +4 -10
- package/dist/core/inline-render.d.ts +22 -27
- package/dist/core/inline-render.js +51 -60
- package/dist/core/lines.d.ts +67 -26
- package/dist/core/lines.js +164 -33
- package/dist/core/metadata-parity.d.ts +9 -0
- package/dist/core/metadata-parity.js +25 -0
- package/dist/core/node-views.d.ts +7 -6
- package/dist/core/node-views.js +5 -5
- package/dist/core/nodes.d.ts +34 -44
- package/dist/core/nodes.js +4 -12
- package/dist/core/parser.d.ts +27 -34
- package/dist/core/parser.js +53 -67
- package/dist/core/parsers/blockquote.d.ts +5 -8
- package/dist/core/parsers/blockquote.js +11 -10
- package/dist/core/parsers/built-in-openers.d.ts +2 -5
- package/dist/core/parsers/built-in-openers.js +5 -8
- package/dist/core/parsers/fence-syntax.d.ts +36 -7
- package/dist/core/parsers/fence-syntax.js +61 -11
- package/dist/core/parsers/fenced-code.d.ts +16 -0
- package/dist/core/parsers/fenced-code.js +16 -15
- package/dist/core/parsers/heading.d.ts +19 -2
- package/dist/core/parsers/heading.js +50 -2
- package/dist/core/parsers/html-block.d.ts +3 -6
- package/dist/core/parsers/html-block.js +10 -11
- package/dist/core/parsers/indented-code.d.ts +1 -1
- package/dist/core/parsers/indented-code.js +2 -8
- package/dist/core/parsers/link-reference.d.ts +5 -3
- package/dist/core/parsers/link-reference.js +116 -120
- package/dist/core/parsers/list.d.ts +12 -5
- package/dist/core/parsers/list.js +53 -36
- package/dist/core/parsers/paragraph.d.ts +3 -3
- package/dist/core/parsers/paragraph.js +14 -5
- package/dist/core/parsers/table-completion.d.ts +2 -5
- package/dist/core/parsers/table-completion.js +7 -10
- package/dist/core/parsers/table.d.ts +8 -8
- package/dist/core/parsers/table.js +23 -26
- package/dist/core/parsers/thematic-break.js +15 -14
- package/dist/core/paths.d.ts +13 -0
- package/dist/core/paths.js +31 -0
- package/dist/core/terminator-escalation.d.ts +0 -7
- package/dist/core/terminator-escalation.js +5 -8
- package/dist/core/url-policy.d.ts +2 -5
- package/dist/core/url-policy.js +8 -12
- package/dist/cursor/caret-memory.d.ts +34 -0
- package/dist/cursor/caret-memory.js +82 -0
- package/dist/cursor/coordinate-spaces.d.ts +26 -19
- package/dist/cursor/coordinate-spaces.js +32 -20
- package/dist/cursor/dom-walk.d.ts +7 -13
- package/dist/cursor/dom-walk.js +7 -13
- package/dist/cursor/edge-affinity.d.ts +7 -35
- package/dist/cursor/edge-affinity.js +13 -44
- package/dist/cursor/focused-caret.d.ts +6 -8
- package/dist/cursor/focused-caret.js +7 -16
- package/dist/cursor/height-model.d.ts +3 -3
- package/dist/cursor/height-model.js +5 -5
- package/dist/cursor/height-oracle.d.ts +10 -7
- package/dist/cursor/height-oracle.js +26 -75
- package/dist/cursor/observe-resize.d.ts +13 -0
- package/dist/cursor/observe-resize.js +43 -0
- package/dist/cursor/overlay-rects.d.ts +2 -5
- package/dist/cursor/overlay-rects.js +2 -5
- package/dist/cursor/overlay-remeasure.d.ts +6 -7
- package/dist/cursor/overlay-remeasure.js +10 -14
- package/dist/cursor/pending-marks.d.ts +7 -9
- package/dist/cursor/pending-marks.js +6 -27
- package/dist/cursor/point-offset.d.ts +16 -10
- package/dist/cursor/point-offset.js +60 -25
- package/dist/cursor/reveal-source.d.ts +7 -11
- package/dist/cursor/reveal-source.js +10 -18
- package/dist/cursor/scroll-ancestors.d.ts +9 -20
- package/dist/cursor/scroll-ancestors.js +14 -26
- package/dist/cursor/scroll-owner.d.ts +92 -0
- package/dist/cursor/scroll-owner.js +283 -0
- package/dist/cursor/scrollport.d.ts +16 -8
- package/dist/cursor/scrollport.js +28 -5
- package/dist/cursor/sticky-column.d.ts +6 -29
- package/dist/cursor/sticky-column.js +6 -49
- package/dist/cursor/sticky-measure.d.ts +14 -9
- package/dist/cursor/sticky-measure.js +99 -49
- package/dist/cursor/surface-backend.d.ts +41 -0
- package/dist/cursor/surface-backend.js +78 -0
- package/dist/cursor/typography-estimates.d.ts +3 -3
- package/dist/cursor/typography-estimates.js +3 -3
- package/dist/cursor/visual-lines.d.ts +25 -13
- package/dist/cursor/visual-lines.js +72 -28
- package/dist/cursor/widget-edge-snap.d.ts +23 -0
- package/dist/cursor/widget-edge-snap.js +39 -0
- package/dist/cursor/widget-offset.d.ts +111 -102
- package/dist/cursor/widget-offset.js +352 -177
- package/dist/debug/diagnostics-report.d.ts +6 -6
- package/dist/debug/diagnostics-report.js +5 -5
- package/dist/debug/dump-tree.js +2 -2
- package/dist/debug/editor-diagnostics.d.ts +15 -0
- package/dist/debug/editor-diagnostics.js +33 -0
- package/dist/debug/inspect.d.ts +2 -2
- package/dist/debug/inspect.js +4 -4
- package/dist/debug/interaction-trace.d.ts +14 -15
- package/dist/debug/interaction-trace.js +19 -20
- package/dist/debug/operations-log.d.ts +1 -1
- package/dist/debug/operations-log.js +1 -1
- package/dist/decorations/buckets.d.ts +6 -12
- package/dist/decorations/buckets.js +4 -11
- package/dist/decorations/decoration-state.svelte.d.ts +2 -3
- package/dist/decorations/decoration-state.svelte.js +24 -26
- package/dist/decorations/island-dom.d.ts +10 -18
- package/dist/decorations/island-dom.js +25 -50
- package/dist/decorations/reserved-attrs.d.ts +6 -8
- package/dist/decorations/reserved-attrs.js +31 -17
- package/dist/decorations/types.d.ts +6 -7
- package/dist/decorations/types.js +2 -1
- package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
- package/dist/decorations/use-block-decorations.svelte.js +71 -0
- package/dist/decorations/widget-dom.d.ts +3 -3
- package/dist/decorations/widget-dom.js +5 -5
- package/dist/dev-warn.d.ts +5 -2
- package/dist/dev-warn.js +16 -4
- package/dist/editor-actions/ancestry-folds.d.ts +9 -14
- package/dist/editor-actions/ancestry-folds.js +13 -18
- package/dist/editor-actions/block-edit-core.d.ts +49 -22
- package/dist/editor-actions/block-edit-core.js +279 -151
- package/dist/editor-actions/block-edit-scope.d.ts +63 -50
- package/dist/editor-actions/block-edit-scope.js +100 -48
- package/dist/editor-actions/block-edit.d.ts +2 -3
- package/dist/editor-actions/block-edit.js +14 -90
- package/dist/editor-actions/commit/history.d.ts +4 -4
- package/dist/editor-actions/commit/history.js +33 -34
- package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
- package/dist/editor-actions/commit/reading-write-gate.js +56 -0
- package/dist/editor-actions/commit/text-batch.d.ts +7 -11
- package/dist/editor-actions/commit/text-batch.js +6 -7
- package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
- package/dist/editor-actions/commit/undo-controller.js +346 -216
- package/dist/editor-actions/container-block-component.d.ts +32 -51
- package/dist/editor-actions/container-block-component.js +66 -92
- package/dist/editor-actions/container-edit.d.ts +4 -2
- package/dist/editor-actions/container-edit.js +14 -44
- package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
- package/dist/editor-actions/container-exit-overrides.js +19 -21
- package/dist/editor-actions/deps.d.ts +25 -32
- package/dist/editor-actions/enter-completion.d.ts +12 -15
- package/dist/editor-actions/enter-completion.js +49 -51
- package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
- package/dist/editor-actions/focus/focus-dispatch.js +33 -52
- package/dist/editor-actions/focus/focus-landing.d.ts +11 -5
- package/dist/editor-actions/focus/focus-landing.js +29 -14
- package/dist/editor-actions/focus/focus.d.ts +3 -2
- package/dist/editor-actions/focus/focus.js +42 -59
- package/dist/editor-actions/index.d.ts +4 -3
- package/dist/editor-actions/index.js +5 -4
- package/dist/editor-actions/inline-range-commit.d.ts +18 -16
- package/dist/editor-actions/inline-range-commit.js +45 -54
- package/dist/editor-actions/leaf-write.d.ts +11 -0
- package/dist/editor-actions/leaf-write.js +102 -0
- package/dist/editor-actions/list-context.d.ts +9 -10
- package/dist/editor-actions/list-context.js +115 -110
- package/dist/editor-actions/list-overrides.d.ts +13 -5
- package/dist/editor-actions/list-overrides.js +36 -12
- package/dist/editor-actions/merge-fallback.d.ts +10 -16
- package/dist/editor-actions/merge-fallback.js +11 -22
- package/dist/editor-actions/nested/container-actions.d.ts +37 -0
- package/dist/editor-actions/nested/container-actions.js +42 -0
- package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
- package/dist/editor-actions/nested/emptied-container.js +5 -0
- package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
- package/dist/editor-actions/nested/nested-actions.js +17 -15
- package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
- package/dist/editor-actions/nested/nested-block-edit.js +40 -134
- package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
- package/dist/editor-actions/nested/nested-focus.js +33 -21
- package/dist/editor-actions/paste-coordinator.d.ts +3 -2
- package/dist/editor-actions/paste-coordinator.js +17 -13
- package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
- package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
- package/dist/editor-actions/plugin/container.d.ts +55 -76
- package/dist/editor-actions/plugin/container.js +105 -186
- package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
- package/dist/editor-actions/plugin/directive-container.js +7 -8
- package/dist/editor-actions/reorder-action.d.ts +7 -12
- package/dist/editor-actions/reorder-action.js +32 -48
- package/dist/editor-actions/reorder-drag.d.ts +12 -8
- package/dist/editor-actions/reorder-drag.js +45 -41
- package/dist/editor-actions/replacement-focus.d.ts +13 -21
- package/dist/editor-actions/replacement-focus.js +32 -33
- package/dist/editor-actions/search-replace.js +71 -67
- package/dist/editor-actions/stored-caret.d.ts +7 -0
- package/dist/editor-actions/stored-caret.js +10 -0
- package/dist/editor-actions/table-context.d.ts +9 -11
- package/dist/editor-actions/table-context.js +70 -93
- package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
- package/dist/editor-actions/unwrap-strategies.js +52 -63
- package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
- package/dist/editor-actions/whole-block-focus-surface.js +43 -53
- package/dist/editor-events.d.ts +25 -29
- package/dist/editor-events.js +17 -28
- package/dist/editor-keys.d.ts +96 -104
- package/dist/editor-keys.js +11 -24
- package/dist/editor-props.d.ts +91 -71
- package/dist/editor-rects.d.ts +23 -34
- package/dist/editor-rects.js +9 -77
- package/dist/env.d.ts +6 -4
- package/dist/env.js +8 -4
- package/dist/index.d.ts +6 -2
- package/dist/index.js +5 -2
- package/dist/inline-menu/inline-menu-session.d.ts +37 -0
- package/dist/inline-menu/inline-menu-session.js +98 -0
- package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
- package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
- package/dist/inline-menu/types.d.ts +77 -0
- package/dist/inline-menu/types.js +7 -0
- package/dist/invariants/child-id-parity.d.ts +23 -0
- package/dist/invariants/child-id-parity.js +39 -0
- package/dist/invariants/commit-paths.d.ts +4 -4
- package/dist/invariants/commit-paths.js +4 -4
- package/dist/invariants/commit-scope.d.ts +4 -4
- package/dist/invariants/commit-scope.js +9 -8
- package/dist/invariants/context-keys.d.ts +2 -5
- package/dist/invariants/context-keys.js +3 -6
- package/dist/invariants/descriptor.d.ts +2 -6
- package/dist/invariants/descriptor.js +2 -6
- package/dist/invariants/inline-transitions.d.ts +9 -16
- package/dist/invariants/inline-transitions.js +10 -18
- package/dist/invariants/install.d.ts +18 -27
- package/dist/invariants/install.js +29 -30
- package/dist/invariants/keeps-a-block.d.ts +7 -0
- package/dist/invariants/keeps-a-block.js +14 -0
- package/dist/invariants/landable-caret.d.ts +5 -7
- package/dist/invariants/landable-caret.js +8 -11
- package/dist/invariants/landing-focus-scroll.d.ts +7 -0
- package/dist/invariants/landing-focus-scroll.js +13 -0
- package/dist/invariants/landing-value.d.ts +13 -0
- package/dist/invariants/landing-value.js +27 -0
- package/dist/invariants/marker-css-parity.d.ts +5 -6
- package/dist/invariants/marker-css-parity.js +11 -12
- package/dist/invariants/measures-in-own-list.d.ts +6 -0
- package/dist/invariants/measures-in-own-list.js +13 -0
- package/dist/invariants/node-shape.d.ts +18 -37
- package/dist/invariants/node-shape.js +123 -79
- package/dist/invariants/open-tail.d.ts +7 -0
- package/dist/invariants/open-tail.js +45 -0
- package/dist/invariants/placement-ends-widget.d.ts +8 -0
- package/dist/invariants/placement-ends-widget.js +13 -0
- package/dist/invariants/registry.d.ts +27 -66
- package/dist/invariants/registry.js +61 -137
- package/dist/invariants/render-fidelity.d.ts +4 -4
- package/dist/invariants/render-fidelity.js +5 -5
- package/dist/invariants/selection-endpoints.d.ts +6 -7
- package/dist/invariants/selection-endpoints.js +18 -16
- package/dist/invariants/single-node-sink.d.ts +4 -5
- package/dist/invariants/single-node-sink.js +4 -5
- package/dist/invariants/snapshot-integrity.d.ts +5 -6
- package/dist/invariants/snapshot-integrity.js +1 -1
- package/dist/invariants/structural-descriptor.d.ts +6 -15
- package/dist/invariants/structural-descriptor.js +6 -15
- package/dist/menu-icons.d.ts +47 -0
- package/dist/menu-icons.js +113 -0
- package/dist/perf/instruments.d.ts +20 -5
- package/dist/perf/instruments.js +35 -15
- package/dist/perf/use-mount-gauge.svelte.js +4 -4
- package/dist/plugin.d.ts +38 -8
- package/dist/plugin.js +102 -74
- package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
- package/dist/plugins/admonitions/admonition-kind.js +12 -10
- package/dist/plugins/admonitions/convert-document.d.ts +5 -5
- package/dist/plugins/admonitions/convert-document.js +8 -7
- package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
- package/dist/plugins/admonitions/gh-alert.js +21 -22
- package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
- package/dist/plugins/admonitions/github-alert-kind.js +28 -37
- package/dist/plugins/admonitions/index.js +2 -2
- package/dist/plugins/admonitions/kinds.d.ts +1 -1
- package/dist/plugins/admonitions/register.js +11 -2
- package/dist/plugins/details/DetailsBlock.svelte +20 -20
- package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
- package/dist/plugins/details/details-disclosure.svelte.js +6 -7
- package/dist/plugins/details/details-kind.d.ts +6 -7
- package/dist/plugins/details/details-kind.js +44 -59
- package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
- package/dist/plugins/emoji/emoji-recognizer.js +7 -14
- package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
- package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
- package/dist/plugins/footnotes/constants.d.ts +2 -0
- package/dist/plugins/footnotes/constants.js +3 -0
- package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
- package/dist/plugins/footnotes/footnote-definition.js +69 -45
- package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
- package/dist/plugins/footnotes/footnote-lookup.js +14 -26
- package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
- package/dist/plugins/footnotes/footnote-numbering.js +22 -31
- package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
- package/dist/plugins/footnotes/footnote-reference.js +8 -13
- package/dist/plugins/footnotes/index.js +2 -3
- package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
- package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
- package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
- package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
- package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
- package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
- package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
- package/dist/plugins/highlight-occurrences/word-char.js +4 -0
- package/dist/plugins/latex/BlockMath.svelte +58 -75
- package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
- package/dist/plugins/latex/MathInline.svelte +10 -9
- package/dist/plugins/latex/flanking.d.ts +1 -0
- package/dist/plugins/latex/flanking.js +3 -0
- package/dist/plugins/latex/index.d.ts +1 -1
- package/dist/plugins/latex/latex-kind.d.ts +4 -4
- package/dist/plugins/latex/latex-kind.js +113 -85
- package/dist/plugins/latex/math-completion.d.ts +1 -1
- package/dist/plugins/latex/math-completion.js +5 -8
- package/dist/plugins/latex/math-layout.d.ts +2 -8
- package/dist/plugins/latex/math-layout.js +0 -9
- package/dist/plugins/latex/math-renderer.d.ts +17 -20
- package/dist/plugins/latex/math-renderer.js +21 -38
- package/dist/plugins/latex/math-source.d.ts +4 -8
- package/dist/plugins/latex/math-source.js +36 -75
- package/dist/plugins/latex/register.d.ts +10 -11
- package/dist/plugins/latex/register.js +24 -10
- package/dist/plugins/latex/renderer.d.ts +9 -10
- package/dist/plugins/latex/renderer.js +9 -24
- package/dist/plugins/mermaid/MermaidBlock.svelte +63 -47
- package/dist/plugins/mermaid/index.js +1 -1
- package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
- package/dist/plugins/mermaid/mermaid-kind.js +30 -47
- package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
- package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
- package/dist/plugins/mermaid/register.d.ts +3 -3
- package/dist/plugins/mermaid/register.js +5 -5
- package/dist/plugins/mermaid/renderer.d.ts +5 -5
- package/dist/plugins/mermaid/renderer.js +8 -11
- package/dist/plugins/parrot/ParrotBlock.svelte +18 -7
- package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
- package/dist/plugins/parrot/parrot-plugin.js +3 -3
- package/dist/plugins/slash-commands/filter.d.ts +23 -0
- package/dist/plugins/slash-commands/filter.js +31 -0
- package/dist/plugins/slash-commands/index.d.ts +2 -0
- package/dist/plugins/slash-commands/index.js +2 -0
- package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
- package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
- package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
- package/dist/plugins/slash-commands/slash-source.js +108 -0
- package/dist/plugins/toc/TocBlock.svelte +23 -22
- package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
- package/dist/plugins/toc/heading-outline.d.ts +7 -12
- package/dist/plugins/toc/heading-outline.js +22 -36
- package/dist/plugins/toc/navigation-queue.d.ts +2 -4
- package/dist/plugins/toc/toc-plugin.d.ts +5 -5
- package/dist/plugins/toc/toc-plugin.js +20 -13
- package/dist/presentation-mode.d.ts +15 -23
- package/dist/presentation-mode.js +19 -25
- package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
- package/dist/reactivity/block-list-state.svelte.js +8 -9
- package/dist/reactivity/block-window.svelte.d.ts +12 -6
- package/dist/reactivity/block-window.svelte.js +44 -17
- package/dist/reactivity/child-list.d.ts +34 -0
- package/dist/reactivity/child-list.js +48 -0
- package/dist/reactivity/content-version.svelte.d.ts +4 -7
- package/dist/reactivity/content-version.svelte.js +3 -5
- package/dist/reactivity/hold-across.d.ts +39 -0
- package/dist/reactivity/hold-across.js +57 -0
- package/dist/reactivity/layout-state.svelte.d.ts +27 -0
- package/dist/reactivity/layout-state.svelte.js +51 -0
- package/dist/reactivity/list-tree.d.ts +39 -0
- package/dist/reactivity/list-tree.js +132 -0
- package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
- package/dist/reactivity/list-windowing.svelte.js +143 -292
- package/dist/reactivity/measure-batch.d.ts +6 -8
- package/dist/reactivity/measure-batch.js +5 -6
- package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
- package/dist/reactivity/publish-ref.svelte.js +21 -85
- package/dist/reactivity/scope-geometry.d.ts +6 -13
- package/dist/reactivity/scope-geometry.js +7 -14
- package/dist/reactivity/state-registry.d.ts +5 -5
- package/dist/reactivity/state-registry.js +11 -15
- package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
- package/dist/reactivity/use-container-windowing.svelte.js +64 -74
- package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
- package/dist/reactivity/use-measured-child.svelte.js +41 -0
- package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
- package/dist/reactivity/use-window-floor.svelte.js +27 -0
- package/dist/reactivity/window-slice.d.ts +4 -4
- package/dist/reactivity/window-slice.js +0 -2
- package/dist/renderer-slot.d.ts +48 -0
- package/dist/renderer-slot.js +85 -0
- package/dist/scan-index.d.ts +4 -4
- package/dist/scan-index.js +4 -4
- package/dist/schema/block-commands.d.ts +69 -54
- package/dist/schema/block-commands.js +91 -104
- package/dist/schema/block-completions.d.ts +16 -19
- package/dist/schema/block-completions.js +25 -32
- package/dist/schema/block-component-registry.d.ts +13 -14
- package/dist/schema/block-component-registry.js +19 -17
- package/dist/schema/block-kind-descriptor.d.ts +234 -168
- package/dist/schema/block-kind-descriptor.js +151 -66
- package/dist/schema/block-openers.d.ts +48 -39
- package/dist/schema/block-openers.js +73 -83
- package/dist/schema/built-in-descriptors.d.ts +3 -5
- package/dist/schema/built-in-descriptors.js +96 -80
- package/dist/schema/child-spans.d.ts +12 -10
- package/dist/schema/child-spans.js +68 -34
- package/dist/schema/closure.d.ts +18 -16
- package/dist/schema/closure.js +24 -14
- package/dist/schema/command-id.d.ts +6 -8
- package/dist/schema/command-id.js +20 -25
- package/dist/schema/commands.d.ts +79 -81
- package/dist/schema/commands.js +156 -116
- package/dist/schema/container-raw.d.ts +51 -11
- package/dist/schema/container-raw.js +143 -14
- package/dist/schema/container-rebuilders.d.ts +17 -15
- package/dist/schema/container-rebuilders.js +30 -22
- package/dist/schema/context-actions.d.ts +25 -13
- package/dist/schema/context-actions.js +32 -17
- package/dist/schema/define-plugin-block.d.ts +8 -6
- package/dist/schema/define-plugin-block.js +6 -4
- package/dist/schema/fenced-code-raw.d.ts +30 -17
- package/dist/schema/fenced-code-raw.js +155 -107
- package/dist/schema/global-commands.d.ts +6 -6
- package/dist/schema/global-commands.js +14 -22
- package/dist/schema/height-estimates.d.ts +31 -0
- package/dist/schema/height-estimates.js +64 -0
- package/dist/schema/inline-construct-policy.d.ts +42 -55
- package/dist/schema/inline-construct-policy.js +36 -35
- package/dist/schema/insert-catalogue.d.ts +30 -0
- package/dist/schema/insert-catalogue.js +95 -0
- package/dist/schema/keybinding-overrides.d.ts +9 -11
- package/dist/schema/keybinding-overrides.js +1 -1
- package/dist/schema/keybindings.d.ts +15 -7
- package/dist/schema/keybindings.js +21 -9
- package/dist/schema/merge-rules.d.ts +5 -7
- package/dist/schema/merge-rules.js +7 -9
- package/dist/schema/opener-priorities.d.ts +4 -4
- package/dist/schema/opener-priorities.js +4 -4
- package/dist/schema/operations.d.ts +9 -11
- package/dist/schema/operations.js +3 -3
- package/dist/schema/page-role.d.ts +14 -0
- package/dist/schema/page-role.js +19 -0
- package/dist/schema/plugin-activation.d.ts +4 -6
- package/dist/schema/plugin-activation.js +12 -10
- package/dist/schema/plugin-editor-context.d.ts +25 -10
- package/dist/schema/plugin-editor-context.js +40 -9
- package/dist/schema/plugin-install.d.ts +49 -17
- package/dist/schema/plugin-install.js +51 -25
- package/dist/schema/plugin-kind.d.ts +12 -8
- package/dist/schema/plugin-kind.js +35 -42
- package/dist/schema/plugin-name.js +3 -3
- package/dist/schema/plugin-registry.d.ts +54 -0
- package/dist/schema/plugin-registry.js +70 -0
- package/dist/schema/reading.d.ts +23 -0
- package/dist/schema/reading.js +7 -0
- package/dist/schema/register-once.d.ts +3 -5
- package/dist/schema/register-once.js +7 -16
- package/dist/schema/registration-checks.d.ts +12 -16
- package/dist/schema/registration-checks.js +35 -51
- package/dist/schema/registration-pairs.d.ts +54 -0
- package/dist/schema/registration-pairs.js +48 -0
- package/dist/schema/registration-pending.d.ts +8 -12
- package/dist/schema/registration-pending.js +9 -9
- package/dist/schema/registry-reset.d.ts +8 -4
- package/dist/schema/registry-reset.js +13 -26
- package/dist/schema/registry-view.d.ts +25 -13
- package/dist/schema/registry-view.js +26 -20
- package/dist/schema/reserved-chords.d.ts +9 -10
- package/dist/schema/reserved-chords.js +73 -78
- package/dist/schema/reserved-chrome.d.ts +12 -11
- package/dist/schema/reserved-chrome.js +15 -11
- package/dist/schema/setext-raw.d.ts +13 -0
- package/dist/schema/setext-raw.js +33 -0
- package/dist/schema/stored-as.d.ts +20 -0
- package/dist/schema/stored-as.js +6 -0
- package/dist/schema/table-cell-raw.d.ts +18 -7
- package/dist/schema/table-cell-raw.js +28 -7
- package/dist/schema/whole-block-unit.d.ts +5 -4
- package/dist/schema/whole-block-unit.js +5 -4
- package/dist/search/document-scan.d.ts +3 -3
- package/dist/search/document-scan.js +2 -2
- package/dist/search/matcher.d.ts +1 -1
- package/dist/search/regex-executor.d.ts +5 -6
- package/dist/search/regex-executor.js +6 -8
- package/dist/search/replace.d.ts +2 -5
- package/dist/search/replace.js +2 -5
- package/dist/search/search-state.svelte.d.ts +5 -5
- package/dist/search/search-state.svelte.js +12 -16
- package/dist/selection/autoscroll.d.ts +6 -9
- package/dist/selection/block-hit-test.d.ts +16 -24
- package/dist/selection/block-hit-test.js +29 -22
- package/dist/selection/caret-doors.d.ts +15 -14
- package/dist/selection/caret-doors.js +37 -26
- package/dist/selection/caret-landing.d.ts +62 -0
- package/dist/selection/caret-landing.js +157 -0
- package/dist/selection/caret-restore.d.ts +17 -10
- package/dist/selection/caret-restore.js +10 -22
- package/dist/selection/caret-target.d.ts +30 -0
- package/dist/selection/caret-target.js +84 -0
- package/dist/selection/char-endpoint-snap.d.ts +6 -10
- package/dist/selection/char-endpoint-snap.js +8 -14
- package/dist/selection/clipboard-text.d.ts +5 -12
- package/dist/selection/clipboard-text.js +69 -172
- package/dist/selection/covered-block.d.ts +6 -8
- package/dist/selection/covered-block.js +8 -19
- package/dist/selection/cross-block/clipboard.d.ts +3 -2
- package/dist/selection/cross-block/clipboard.js +13 -4
- package/dist/selection/cross-block/dispatch.d.ts +47 -43
- package/dist/selection/cross-block/dispatch.js +12 -23
- package/dist/selection/cross-block/format-range.d.ts +18 -21
- package/dist/selection/cross-block/format-range.js +104 -103
- package/dist/selection/cross-block/format-toggle.d.ts +10 -15
- package/dist/selection/cross-block/format-toggle.js +28 -33
- package/dist/selection/cross-block/keydown.d.ts +4 -4
- package/dist/selection/cross-block/keydown.js +93 -152
- package/dist/selection/cross-block/ops.d.ts +19 -34
- package/dist/selection/cross-block/ops.js +110 -95
- package/dist/selection/cross-block/paste.d.ts +2 -3
- package/dist/selection/cross-block/paste.js +61 -104
- package/dist/selection/cross-block/pointer.d.ts +17 -15
- package/dist/selection/cross-block/pointer.js +74 -25
- package/dist/selection/cross-block/type-replace.d.ts +4 -6
- package/dist/selection/cross-block/type-replace.js +53 -146
- package/dist/selection/dead-space-caret.d.ts +20 -28
- package/dist/selection/dead-space-caret.js +79 -87
- package/dist/selection/drag-pointer.d.ts +22 -5
- package/dist/selection/drag-pointer.js +63 -31
- package/dist/selection/gap-caret.d.ts +17 -28
- package/dist/selection/gap-caret.js +14 -26
- package/dist/selection/grid-selection.d.ts +12 -0
- package/dist/selection/grid-selection.js +22 -0
- package/dist/selection/keyboard-extend.d.ts +27 -39
- package/dist/selection/keyboard-extend.js +94 -116
- package/dist/selection/multi-click.d.ts +37 -0
- package/dist/selection/multi-click.js +197 -0
- package/dist/selection/native-bridge.d.ts +30 -37
- package/dist/selection/native-bridge.js +80 -100
- package/dist/selection/nearest-block.d.ts +17 -12
- package/dist/selection/nearest-block.js +37 -18
- package/dist/selection/path-lookup.d.ts +31 -14
- package/dist/selection/path-lookup.js +110 -20
- package/dist/selection/path-math.d.ts +9 -11
- package/dist/selection/path-math.js +5 -7
- package/dist/selection/pointer-gesture.d.ts +9 -0
- package/dist/selection/pointer-gesture.js +11 -0
- package/dist/selection/pointer-session.d.ts +10 -16
- package/dist/selection/pointer-session.js +6 -7
- package/dist/selection/primitives.d.ts +64 -33
- package/dist/selection/primitives.js +61 -53
- package/dist/selection/range-coverage.d.ts +94 -0
- package/dist/selection/range-coverage.js +365 -0
- package/dist/selection/range-delete-ceremony.d.ts +28 -74
- package/dist/selection/range-delete-ceremony.js +100 -141
- package/dist/selection/range-delete-chrome.d.ts +20 -33
- package/dist/selection/range-delete-chrome.js +53 -78
- package/dist/selection/range-delete-table-coverage.d.ts +11 -25
- package/dist/selection/range-delete-table-coverage.js +42 -112
- package/dist/selection/range-delete-table.d.ts +14 -12
- package/dist/selection/range-delete-table.js +106 -310
- package/dist/selection/range-delete.d.ts +18 -19
- package/dist/selection/range-delete.js +83 -123
- package/dist/selection/round-trip-restore.d.ts +18 -0
- package/dist/selection/round-trip-restore.js +19 -0
- package/dist/selection/selection-announcer.d.ts +17 -0
- package/dist/selection/selection-announcer.js +25 -0
- package/dist/selection/selection-description.d.ts +4 -3
- package/dist/selection/selection-description.js +5 -4
- package/dist/selection/selection-drop.d.ts +52 -0
- package/dist/selection/selection-drop.js +317 -0
- package/dist/selection/selection-restore.d.ts +20 -33
- package/dist/selection/selection-restore.js +21 -44
- package/dist/selection/selection-state.svelte.d.ts +50 -42
- package/dist/selection/selection-state.svelte.js +144 -98
- package/dist/selection/shared-keydown.d.ts +22 -27
- package/dist/selection/shared-keydown.js +25 -45
- package/dist/selection/table-endpoint-snap.d.ts +17 -41
- package/dist/selection/table-endpoint-snap.js +54 -80
- package/dist/selection/table-rect-extend.d.ts +3 -6
- package/dist/selection/table-rect-extend.js +19 -14
- package/dist/styles/editor-theme.css +75 -53
- package/dist/styles/editor.css +248 -139
- package/dist/testing/conformance-core.d.ts +50 -18
- package/dist/testing/conformance-core.js +88 -50
- package/dist/testing/container-conformance.d.ts +48 -84
- package/dist/testing/container-conformance.js +159 -285
- package/dist/testing/headless-actions.d.ts +34 -19
- package/dist/testing/headless-actions.js +116 -65
- package/dist/testing/headless-block-list.svelte.d.ts +16 -0
- package/dist/testing/headless-block-list.svelte.js +22 -0
- package/dist/testing/inline-conformance.d.ts +15 -22
- package/dist/testing/inline-conformance.js +131 -148
- package/dist/testing/kind-conformance.d.ts +19 -24
- package/dist/testing/kind-conformance.js +204 -117
- package/dist/testing/kit-reading.d.ts +7 -0
- package/dist/testing/kit-reading.js +16 -0
- package/dist/testing/mount-dom-stubs.d.ts +4 -5
- package/dist/testing/mount-dom-stubs.js +8 -5
- package/dist/testing/parse-convergence.d.ts +10 -10
- package/dist/testing/parse-convergence.js +14 -49
- package/dist/testing.d.ts +13 -9
- package/dist/testing.js +28 -38
- package/dist/tree-operations/blockquote.d.ts +8 -14
- package/dist/tree-operations/blockquote.js +25 -45
- package/dist/tree-operations/chain-rebuild.d.ts +34 -25
- package/dist/tree-operations/chain-rebuild.js +115 -52
- package/dist/tree-operations/children.d.ts +5 -9
- package/dist/tree-operations/children.js +7 -11
- package/dist/tree-operations/cleanup.d.ts +6 -7
- package/dist/tree-operations/cleanup.js +14 -11
- package/dist/tree-operations/clone.js +5 -4
- package/dist/tree-operations/container-lift.d.ts +10 -5
- package/dist/tree-operations/container-lift.js +20 -14
- package/dist/tree-operations/container-offsets.d.ts +22 -0
- package/dist/tree-operations/container-offsets.js +89 -0
- package/dist/tree-operations/content-write.d.ts +52 -29
- package/dist/tree-operations/content-write.js +155 -110
- package/dist/tree-operations/index.d.ts +4 -4
- package/dist/tree-operations/index.js +4 -4
- package/dist/tree-operations/keep-one-block.d.ts +10 -0
- package/dist/tree-operations/keep-one-block.js +19 -0
- package/dist/tree-operations/leaf-range.d.ts +33 -0
- package/dist/tree-operations/leaf-range.js +67 -0
- package/dist/tree-operations/list/empty-check.d.ts +2 -3
- package/dist/tree-operations/list/empty-check.js +4 -4
- package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
- package/dist/tree-operations/list/exit-replacement.js +4 -9
- package/dist/tree-operations/list/item-partition.d.ts +2 -2
- package/dist/tree-operations/list/item-partition.js +2 -2
- package/dist/tree-operations/list/list-builders.d.ts +18 -16
- package/dist/tree-operations/list/list-builders.js +59 -30
- package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
- package/dist/tree-operations/list/ordered-markers.js +7 -16
- package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
- package/dist/tree-operations/list/reconcile-task.js +80 -23
- package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
- package/dist/tree-operations/list/sublist-separator.js +20 -27
- package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
- package/dist/tree-operations/list/task-paragraph.js +54 -0
- package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
- package/dist/tree-operations/list/unwrap-merge.js +44 -79
- package/dist/tree-operations/node-ops.d.ts +30 -52
- package/dist/tree-operations/node-ops.js +152 -218
- package/dist/tree-operations/node-primitives.d.ts +44 -31
- package/dist/tree-operations/node-primitives.js +84 -60
- package/dist/tree-operations/open-tail.d.ts +25 -0
- package/dist/tree-operations/open-tail.js +100 -0
- package/dist/tree-operations/parse-block.d.ts +15 -2
- package/dist/tree-operations/parse-block.js +19 -4
- package/dist/tree-operations/paste/apply.d.ts +7 -8
- package/dist/tree-operations/paste/apply.js +33 -63
- package/dist/tree-operations/paste/body-write.d.ts +8 -6
- package/dist/tree-operations/paste/body-write.js +13 -14
- package/dist/tree-operations/paste/container-match.d.ts +7 -10
- package/dist/tree-operations/paste/container-match.js +76 -58
- package/dist/tree-operations/paste/container-paste.d.ts +3 -3
- package/dist/tree-operations/paste/container-paste.js +3 -3
- package/dist/tree-operations/paste/dispatch.d.ts +26 -29
- package/dist/tree-operations/paste/dispatch.js +68 -53
- package/dist/tree-operations/paste/focus-target.d.ts +11 -14
- package/dist/tree-operations/paste/focus-target.js +13 -18
- package/dist/tree-operations/paste/hooks.d.ts +7 -12
- package/dist/tree-operations/paste/hooks.js +49 -46
- package/dist/tree-operations/paste/line-ending.d.ts +11 -0
- package/dist/tree-operations/paste/line-ending.js +32 -0
- package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
- package/dist/tree-operations/paste/list-absorb.js +17 -19
- package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
- package/dist/tree-operations/paste/list-break-out.js +24 -32
- package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
- package/dist/tree-operations/paste/parent-scope.js +9 -16
- package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
- package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
- package/dist/tree-operations/paste/paste-replacement.js +73 -42
- package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
- package/dist/tree-operations/paste/paste-transforms.js +18 -27
- package/dist/tree-operations/paste/replacement-parse.d.ts +19 -0
- package/dist/tree-operations/paste/replacement-parse.js +24 -0
- package/dist/tree-operations/paste/strategy.d.ts +1 -1
- package/dist/tree-operations/paste/strategy.js +1 -1
- package/dist/tree-operations/paste/table-slice.js +15 -10
- package/dist/tree-operations/paste-surfaces.d.ts +18 -29
- package/dist/tree-operations/paste-surfaces.js +14 -10
- package/dist/tree-operations/path-mutate.d.ts +7 -8
- package/dist/tree-operations/path-mutate.js +4 -4
- package/dist/tree-operations/reorder-unit.d.ts +4 -5
- package/dist/tree-operations/reorder-unit.js +5 -6
- package/dist/tree-operations/reorder.d.ts +7 -9
- package/dist/tree-operations/reorder.js +39 -40
- package/dist/tree-operations/settle.d.ts +42 -53
- package/dist/tree-operations/settle.js +241 -162
- package/dist/tree-operations/sharing.d.ts +5 -5
- package/dist/tree-operations/splice-many.d.ts +5 -5
- package/dist/tree-operations/splice-many.js +5 -5
- package/dist/tree-operations/stored-as.d.ts +13 -0
- package/dist/tree-operations/stored-as.js +48 -0
- package/dist/tree-operations/structural-change.d.ts +11 -15
- package/dist/tree-operations/structural-change.js +10 -14
- package/dist/tree-operations/structural-suffix.d.ts +22 -0
- package/dist/tree-operations/structural-suffix.js +61 -0
- package/dist/tree-operations/sub-table-copy.d.ts +7 -0
- package/dist/tree-operations/sub-table-copy.js +40 -36
- package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
- package/dist/tree-operations/table-grid-clipboard.js +11 -36
- package/dist/tree-operations/table-mutations.d.ts +7 -3
- package/dist/tree-operations/table-mutations.js +45 -9
- package/dist/tree-operations/unshare.d.ts +11 -15
- package/dist/tree-operations/unshare.js +15 -17
- package/dist/undo/manager.js +1 -1
- package/dist/undo/types.d.ts +2 -2
- package/docs/guide/consumer-guide.md +329 -205
- package/docs/guide/directives.md +7 -7
- package/docs/guide/plugin-api.md +267 -183
- package/docs/guide/plugin-guide.md +341 -235
- package/docs/guide/plugin-testing.md +96 -82
- package/package.json +17 -21
- package/dist/ambient/ambient-cursor.d.ts +0 -41
- package/dist/ambient/ambient-cursor.js +0 -120
- package/dist/components/blocks/code/code-paste.d.ts +0 -24
- package/dist/components/blocks/code/code-paste.js +0 -21
- package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
- package/dist/components/blocks/table/cell-clipboard.js +0 -67
- package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
- package/dist/components/blocks/text/hidden-suffix.js +0 -15
- package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
- package/dist/components/image/image-source-bytes.d.ts +0 -15
- package/dist/components/image/image-source-bytes.js +0 -80
- package/dist/cursor/content-offsets.d.ts +0 -29
- package/dist/cursor/content-offsets.js +0 -151
- package/dist/cursor/reveal-anchor.d.ts +0 -30
- package/dist/cursor/reveal-anchor.js +0 -31
- package/dist/invariants/split-landing.d.ts +0 -8
- package/dist/invariants/split-landing.js +0 -15
- package/dist/selection/double-click-trim.d.ts +0 -17
- package/dist/selection/double-click-trim.js +0 -57
- package/dist/tree-operations/list/terminator.d.ts +0 -17
- package/dist/tree-operations/list/terminator.js +0 -60
- package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -29
- package/dist/tree-operations/paste/replace-block-at-parent.js +0 -75
|
@@ -1,27 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Inline-widget interaction for
|
|
3
|
-
*
|
|
4
|
-
* consumed the event, so the component can interleave them
|
|
2
|
+
* Inline-widget interaction for the prose editable elements (the text block and the table cell):
|
|
3
|
+
* selecting a widget, showing its source, and the keydown and click handlers around both. Each
|
|
4
|
+
* keydown handler returns whether it consumed the event, so the component can interleave them
|
|
5
|
+
* with the shared pipeline.
|
|
5
6
|
*/
|
|
6
7
|
import { tick } from 'svelte';
|
|
7
8
|
import { resolvedInlineContent } from '../../../core/inline/inline-cache';
|
|
8
|
-
import { flattenInlineWidgets, getInlineWidgetEditing, isWidgetActivationClick } from '../../../core/inline/inline-widgets';
|
|
9
|
+
import { flattenInlineWidgets, getInlineWidgetEditing, isCharacterLikeWidget, isWidgetActivationClick } from '../../../core/inline/inline-widgets';
|
|
9
10
|
import { isVerticallyTransparentNode } from '../../../core/inline/transparency';
|
|
10
11
|
import { trimTrailingLineEnding, trailingLineEnding } from '../../../core/lines';
|
|
11
|
-
import { asRawOffset
|
|
12
|
-
import {
|
|
12
|
+
import { asRawOffset } from '../../../cursor/coordinate-spaces';
|
|
13
|
+
import { extendSelectionToRaw as extendSelectionToRawIn, rawOffsetAt, rawSelectionFocus, selectRawRange } from '../../../cursor/widget-offset';
|
|
13
14
|
import { createSourceReveal } from '../../../cursor/reveal-source';
|
|
15
|
+
import { nearestWidgetEdgeSeat } from '../../../cursor/widget-edge-snap';
|
|
14
16
|
import { traceRevealOpen, traceRevealFold } from '../../../debug/interaction-trace';
|
|
15
17
|
import { assertInvariant } from '../../../assert';
|
|
16
|
-
import { caretIsInTextContent, hasModifier, isPlainTypingKey } from './click-snap-guard';
|
|
18
|
+
import { caretIsInTextContent, hasModifier, isPlainTypingKey, surfaceHoldsRange } from './click-snap-guard';
|
|
17
19
|
import { findWidgetNodeByStart, findFirstEdgeWidget, findLastEdgeWidget, rawHasNoTextBefore, rawHasNoTextAfter, widgetElByStart } from './widget-adjacency';
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
import { replaceRangeInLeaf } from '../../../tree-operations/leaf-range';
|
|
21
|
+
/** The widget edge a selected widget hands a caret-moving key off from, or null for any other key. */
|
|
22
|
+
function caretMoveEdge(key) {
|
|
23
|
+
switch (key) {
|
|
24
|
+
case 'ArrowUp':
|
|
25
|
+
case 'Home':
|
|
26
|
+
case 'PageUp':
|
|
27
|
+
return 'start';
|
|
28
|
+
case 'ArrowDown':
|
|
29
|
+
case 'End':
|
|
30
|
+
case 'PageDown':
|
|
31
|
+
return 'end';
|
|
32
|
+
default:
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** The shown source is tinted with the CSS Custom Highlight API because offset reads need it to
|
|
37
|
+
* stay a bare text node. Without the API (jsdom, an old browser) it shows untinted. */
|
|
25
38
|
const REVEAL_HIGHLIGHT = 'md-inline-reveal';
|
|
26
39
|
const washRanges = new WeakMap();
|
|
27
40
|
function revealHighlight() {
|
|
@@ -51,35 +64,43 @@ function unwashRevealedSource(node) {
|
|
|
51
64
|
washRanges.delete(node);
|
|
52
65
|
revealHighlight()?.delete(range);
|
|
53
66
|
}
|
|
67
|
+
/** Replace a selected widget's bytes with `text` in one undoable write and put the caret after
|
|
68
|
+
* `text`, since with the widget gone the browser has no caret to keep. */
|
|
69
|
+
export async function replaceSelectedWidget(deps, widget, preSelectOffset, text, mode) {
|
|
70
|
+
const edit = replaceRangeInLeaf(deps.node, widget, text, deps.storedAs());
|
|
71
|
+
const write = deps.blockEdit.updateBlockContent(deps.index, edit.raw, mode, preSelectOffset, edit.caret);
|
|
72
|
+
// Before the write's render, so the caret and the new bytes land in one flush.
|
|
73
|
+
if (write.admitted)
|
|
74
|
+
deps.setPendingCursor(write.caret);
|
|
75
|
+
deps.widgetSelection.clear();
|
|
76
|
+
await write;
|
|
77
|
+
// The render that places the caret, so a caller awaiting the insert finds the caret there.
|
|
78
|
+
await tick();
|
|
79
|
+
}
|
|
54
80
|
export function createWidgetInteraction(deps) {
|
|
55
|
-
const isReading = () => deps.
|
|
81
|
+
const isReading = () => deps.reading.mode() === 'reading';
|
|
56
82
|
// Resolver-aware so widget detection matches the render path's view; a mismatch
|
|
57
83
|
// around reference-style image widgets breaks cursor and clipboard offsets.
|
|
58
84
|
function inlinesOf(node) {
|
|
59
|
-
return resolvedInlineContent(node, deps.
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
*
|
|
65
|
-
* scanned the flat list simply did not see it. `> *… $L/9 \times 10^{20}$ …*` is the case
|
|
66
|
-
* that surfaced it: the quote's whole text is one emphasis node, so nothing inside it was
|
|
67
|
-
* ever clickable.
|
|
68
|
-
*/
|
|
85
|
+
return resolvedInlineContent(node, deps.reading);
|
|
86
|
+
}
|
|
87
|
+
const widgetEditing = (kind) => getInlineWidgetEditing(kind, deps.reading.grammar);
|
|
88
|
+
const characterLike = (kind) => isCharacterLikeWidget(kind, deps.reading.grammar);
|
|
89
|
+
/** Every widget in this block, nested ones included: a construct wrapping a widget (emphasis
|
|
90
|
+
* around a formula, a link around an image) hides it from the top-level inline list. */
|
|
69
91
|
function widgetsOf() {
|
|
70
|
-
return flattenInlineWidgets(inlinesOf(deps.node), deps.node.raw);
|
|
92
|
+
return flattenInlineWidgets(inlinesOf(deps.node), deps.node.raw, deps.reading.grammar);
|
|
71
93
|
}
|
|
72
94
|
let revealState = null;
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
// so a lookup can return the OTHER instance and `replaceWith` would MOVE it.
|
|
95
|
+
// Kept outside the record to survive `resetReveal` for the async restore. The exact element
|
|
96
|
+
// is kept because two byte-identical widgets share a pool key, so a lookup could return the other.
|
|
76
97
|
let activeSourceNode = null;
|
|
77
98
|
let revealedWidget = null;
|
|
78
|
-
// The offset
|
|
79
|
-
// restore must not read it as a formula closing around the caret and
|
|
99
|
+
// The offset left behind when a source was last hidden, which lies inside that construct:
|
|
100
|
+
// the restore must not read it as a formula closing around the caret and show it again.
|
|
80
101
|
let foldParkedCaret = null;
|
|
81
|
-
// Every
|
|
82
|
-
// with
|
|
102
|
+
// Every way of hiding a source is private to this module and checked by all its callers,
|
|
103
|
+
// so hiding with none shown means a caller skipped the check or a flag leaked (G1.26).
|
|
83
104
|
function assertFoldTargetsActiveReveal(entry) {
|
|
84
105
|
assertInvariant('reveal-transition', () => revealState
|
|
85
106
|
? null
|
|
@@ -93,19 +114,18 @@ export function createWidgetInteraction(deps) {
|
|
|
93
114
|
activeSourceNode = null;
|
|
94
115
|
revealedWidget = null;
|
|
95
116
|
}
|
|
96
|
-
// The
|
|
97
|
-
//
|
|
98
|
-
// restore that still needs them.
|
|
117
|
+
// The swap handles are left alone: cancel resets the record before awaiting the restore,
|
|
118
|
+
// which still needs them.
|
|
99
119
|
function resetReveal() {
|
|
100
120
|
revealState = null;
|
|
101
121
|
deps.setRevealing(false);
|
|
102
122
|
}
|
|
103
123
|
async function startReveal(widget, caretBefore, atSourceOffset = 0) {
|
|
104
|
-
// Every
|
|
124
|
+
// Every way in comes through here, so this is the only reading-mode check needed.
|
|
105
125
|
if (isReading())
|
|
106
126
|
return;
|
|
107
|
-
// The
|
|
108
|
-
//
|
|
127
|
+
// The wait for the caret spans only microtasks and the synchronous focus dispatch, so a
|
|
128
|
+
// re-entry can only come from this call chain itself (G1.26).
|
|
109
129
|
assertInvariant('reveal-transition', () => revealState?.settling
|
|
110
130
|
? {
|
|
111
131
|
code: 'start-during-settle',
|
|
@@ -118,7 +138,7 @@ export function createWidgetInteraction(deps) {
|
|
|
118
138
|
const start = widget.start;
|
|
119
139
|
const end = widget.end;
|
|
120
140
|
const source = deps.node.raw.slice(start, end);
|
|
121
|
-
//
|
|
141
|
+
// Swapping the span is the whole mechanism: the opaque widget becomes a text node.
|
|
122
142
|
const kernel = createSourceReveal({
|
|
123
143
|
get container() {
|
|
124
144
|
return deps.getEl();
|
|
@@ -132,7 +152,6 @@ export function createWidgetInteraction(deps) {
|
|
|
132
152
|
get source() {
|
|
133
153
|
return source;
|
|
134
154
|
},
|
|
135
|
-
getAmbientLength: deps.getAmbientLength,
|
|
136
155
|
isRevealed: () => activeSourceNode !== null,
|
|
137
156
|
showSource: () => {
|
|
138
157
|
const container = deps.getEl();
|
|
@@ -163,15 +182,14 @@ export function createWidgetInteraction(deps) {
|
|
|
163
182
|
await kernel.reveal(atSourceOffset);
|
|
164
183
|
}
|
|
165
184
|
finally {
|
|
166
|
-
// `finally`, not a plain clear: a
|
|
167
|
-
//
|
|
185
|
+
// `finally`, not a plain clear: a flag stuck true would disable the escape check for
|
|
186
|
+
// the rest of the block's life. Null-checked, since hiding mid-await already cleared it.
|
|
168
187
|
if (revealState)
|
|
169
188
|
revealState.settling = false;
|
|
170
189
|
}
|
|
171
190
|
}
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
// ALWAYS folds: a null read as "nothing to wait for" would let a seam splice stale bytes.
|
|
191
|
+
// Always hides, even with nothing to write: a null read as "nothing to wait for" would let a
|
|
192
|
+
// caller splice stale bytes. The caret lands on the source node's current trailing edge.
|
|
175
193
|
function commitReveal(reason = 'commit', caretOverride) {
|
|
176
194
|
assertFoldTargetsActiveReveal('commitReveal');
|
|
177
195
|
if (!revealState)
|
|
@@ -184,43 +202,42 @@ export function createWidgetInteraction(deps) {
|
|
|
184
202
|
const sourceNode = activeSourceNode;
|
|
185
203
|
const editedDisplay = deps.readRawText();
|
|
186
204
|
const caretAfter = caretOverride ??
|
|
187
|
-
(el && sourceNode
|
|
188
|
-
? toClampedRawOffset(domTextOffsetAtNode(el, sourceNode, sourceNode.length), deps.getAmbientLength())
|
|
189
|
-
: active.widgetEnd);
|
|
205
|
+
(el && sourceNode ? rawOffsetAt(el, sourceNode, sourceNode.length) : active.widgetEnd);
|
|
190
206
|
const { caretBefore, originalDisplay } = active;
|
|
191
|
-
// The reactive re-render rebuilds the
|
|
192
|
-
// DOM
|
|
207
|
+
// The reactive re-render rebuilds the widget, so drop the swap handles without
|
|
208
|
+
// restoring the DOM, then run the teardown.
|
|
193
209
|
if (sourceNode)
|
|
194
210
|
unwashRevealedSource(sourceNode);
|
|
195
211
|
activeSourceNode = null;
|
|
196
212
|
revealedWidget = null;
|
|
197
213
|
resetReveal();
|
|
198
|
-
|
|
199
|
-
//
|
|
200
|
-
// undo entry, so the user's next Ctrl+Z would revert nothing instead of their
|
|
201
|
-
// prior action. The pending-cursor set alone re-renders from the untouched CST.
|
|
214
|
+
// No edit, so no write: a write that changes nothing still pushes an undo entry, and the
|
|
215
|
+
// next Ctrl+Z would spend itself on nothing.
|
|
202
216
|
if (editedDisplay === originalDisplay) {
|
|
217
|
+
foldParkedCaret = caretAfter;
|
|
203
218
|
deps.setPendingCursor(caretAfter);
|
|
204
219
|
return { caret: caretAfter, settled: tick() };
|
|
205
220
|
}
|
|
206
|
-
const write = deps.blockEdit.updateBlockContent(deps.index, editedDisplay + trailingLineEnding(deps.node.raw), caretBefore, caretAfter);
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
221
|
+
const write = deps.blockEdit.updateBlockContent(deps.index, editedDisplay + trailingLineEnding(deps.node.raw, deps.getLineEnding()), 'authored', caretBefore, caretAfter);
|
|
222
|
+
// A refused write leaves the bytes as the reveal found them, where the caret began.
|
|
223
|
+
const caret = write.admitted ? write.caret : caretBefore;
|
|
224
|
+
foldParkedCaret = caret;
|
|
225
|
+
deps.setPendingCursor(caret);
|
|
226
|
+
return { caret, settled: settleWrite(write) };
|
|
227
|
+
}
|
|
228
|
+
// A rejection is swallowed: the commit rethrows only in dev builds, and a dev-only throw must
|
|
229
|
+
// not cancel the gesture in progress.
|
|
213
230
|
async function settleWrite(write) {
|
|
214
231
|
try {
|
|
215
232
|
await write;
|
|
216
233
|
}
|
|
217
234
|
catch {
|
|
218
|
-
// reported
|
|
235
|
+
// reported where the commit happens
|
|
219
236
|
}
|
|
220
237
|
await tick();
|
|
221
238
|
}
|
|
222
|
-
// Discard the
|
|
223
|
-
// a
|
|
239
|
+
// Discard the temporary edit and rebuild the original widget from the untouched raw:
|
|
240
|
+
// a change of view only, so no undo entry.
|
|
224
241
|
async function cancelReveal() {
|
|
225
242
|
assertFoldTargetsActiveReveal('cancelReveal');
|
|
226
243
|
if (!revealState)
|
|
@@ -228,25 +245,46 @@ export function createWidgetInteraction(deps) {
|
|
|
228
245
|
const active = revealState;
|
|
229
246
|
traceRevealFold('cancel');
|
|
230
247
|
const { kernel } = active;
|
|
231
|
-
// Reset
|
|
232
|
-
//
|
|
233
|
-
// re-enter mid-swap. The restore reads the swap handles kept outside the record.
|
|
248
|
+
// Reset before the await: `replaceWith` fires `selectionchange`, and a live record would
|
|
249
|
+
// let the escape check re-enter mid-swap.
|
|
234
250
|
resetReveal();
|
|
235
251
|
await kernel.commit();
|
|
236
252
|
}
|
|
237
|
-
//
|
|
238
|
-
//
|
|
253
|
+
// No caret is written, because the click that left owns it. A selected range is read in raw
|
|
254
|
+
// offsets and put back after the rebuild, which would otherwise leave its end inside a widget.
|
|
239
255
|
function foldRevealNoEdit(reason = 'no-edit') {
|
|
240
256
|
assertFoldTargetsActiveReveal('foldRevealNoEdit');
|
|
241
257
|
if (!revealState)
|
|
242
258
|
return;
|
|
243
259
|
traceRevealFold(reason);
|
|
260
|
+
const span = liveRangeInBlock();
|
|
244
261
|
resetReveal();
|
|
245
262
|
restoreRenderedWidget();
|
|
263
|
+
if (span)
|
|
264
|
+
void restoreRangeInBlock(span);
|
|
246
265
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
266
|
+
/** The live selection in raw offsets, when it is a range with both ends inside this block. */
|
|
267
|
+
function liveRangeInBlock() {
|
|
268
|
+
const el = deps.getEl();
|
|
269
|
+
const sel = window.getSelection();
|
|
270
|
+
if (!el || !sel || sel.rangeCount === 0 || sel.isCollapsed)
|
|
271
|
+
return null;
|
|
272
|
+
const range = sel.getRangeAt(0);
|
|
273
|
+
if (!el.contains(range.startContainer) || !el.contains(range.endContainer))
|
|
274
|
+
return null;
|
|
275
|
+
return {
|
|
276
|
+
start: rawOffsetAt(el, range.startContainer, range.startOffset),
|
|
277
|
+
end: rawOffsetAt(el, range.endContainer, range.endOffset)
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
async function restoreRangeInBlock(span) {
|
|
281
|
+
await tick();
|
|
282
|
+
const el = deps.getEl();
|
|
283
|
+
if (el)
|
|
284
|
+
selectRawRange(el, span.start, span.end);
|
|
285
|
+
}
|
|
286
|
+
// Compared by raw offset, bounds included: a caret at the source's edge may sit in the
|
|
287
|
+
// neighbouring text node, which a node comparison would misread as leaving.
|
|
250
288
|
function selectionEscapedSource() {
|
|
251
289
|
if (!revealState || !activeSourceNode || revealState.settling)
|
|
252
290
|
return false;
|
|
@@ -263,17 +301,15 @@ export function createWidgetInteraction(deps) {
|
|
|
263
301
|
return false;
|
|
264
302
|
if (activeSourceNode.contains(anchorNode) || activeSourceNode.contains(focusNode))
|
|
265
303
|
return false;
|
|
266
|
-
const
|
|
267
|
-
const sourceStart = toClampedRawOffset(domTextOffsetAtNode(el, activeSourceNode, 0), ambient);
|
|
304
|
+
const sourceStart = rawOffsetAt(el, activeSourceNode, 0);
|
|
268
305
|
const sourceEnd = sourceStart + activeSourceNode.length;
|
|
269
|
-
const anchorOff =
|
|
270
|
-
const focusOff =
|
|
306
|
+
const anchorOff = rawOffsetAt(el, anchorNode, sel.anchorOffset);
|
|
307
|
+
const focusOff = rawOffsetAt(el, focusNode, sel.focusOffset);
|
|
271
308
|
const inSource = (o) => o >= sourceStart && o <= sourceEnd;
|
|
272
309
|
return !inSource(anchorOff) && !inSource(focusOff);
|
|
273
310
|
}
|
|
274
|
-
//
|
|
275
|
-
// before its flag
|
|
276
|
-
// rejects. The latch survives the very exit it triggers, so `resetReveal` never clears it.
|
|
311
|
+
// The escape is re-checked after a tick: entering a cross-block selection clears the browser
|
|
312
|
+
// selection before its flag is set. `resetReveal` leaves `foldCheckQueued`, which outlives it.
|
|
277
313
|
let foldCheckQueued = false;
|
|
278
314
|
function foldRevealIfSelectionEscaped() {
|
|
279
315
|
if (foldCheckQueued || !selectionEscapedSource())
|
|
@@ -296,52 +332,48 @@ export function createWidgetInteraction(deps) {
|
|
|
296
332
|
commitReveal('selection-escape');
|
|
297
333
|
})();
|
|
298
334
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* What the pointer is actually over, asked of the DOM rather than of a rectangle. An
|
|
303
|
-
* island's border box is not what the reader sees: a KaTeX render (a superscript, a
|
|
304
|
-
* fraction) paints ABOVE and BELOW its own box, so a click on the visible glyphs missed
|
|
305
|
-
* the rect by a pixel or two and the widget looked inert to the mouse while the keyboard
|
|
306
|
-
* reached it fine. `elementFromPoint` has no such gap — it answers with whatever is
|
|
307
|
-
* painted at the point, overflow included.
|
|
308
|
-
*/
|
|
335
|
+
/** The widget under the pointer, asked of the DOM rather than of a rectangle: a KaTeX render
|
|
336
|
+
* draws past its own border box, and `elementFromPoint` counts that overflow. */
|
|
309
337
|
function revealWidgetFromDom(el, x, y) {
|
|
310
|
-
//
|
|
311
|
-
// answer there — the same shape as `getTargetRanges`' detection on the code surface.
|
|
338
|
+
// jsdom has no hit testing; the rectangle scan in `hitTestRevealWidget` answers there.
|
|
312
339
|
if (typeof document.elementFromPoint !== 'function')
|
|
313
340
|
return null;
|
|
314
341
|
const at = document.elementFromPoint(x, y);
|
|
315
342
|
const island = at instanceof Element ? at.closest('[data-inline-widget][data-source-start]') : null;
|
|
316
|
-
//
|
|
343
|
+
// The point may sit over another block's widget entirely.
|
|
317
344
|
if (!island || !el.contains(island))
|
|
318
345
|
return null;
|
|
319
346
|
const start = Number(island.getAttribute('data-source-start'));
|
|
320
347
|
if (!Number.isInteger(start))
|
|
321
348
|
return null;
|
|
322
|
-
const inline = widgetsOf().find((n) => n.start === start &&
|
|
349
|
+
const inline = widgetsOf().find((n) => n.start === start && widgetEditing(n.kind)?.revealSource);
|
|
323
350
|
return inline ? { inline } : null;
|
|
324
351
|
}
|
|
325
|
-
/**
|
|
326
|
-
*
|
|
327
|
-
* its delimiters, so typing continues the construct rather than escaping it. A kind naming no
|
|
328
|
-
* span keeps the leading edge: guessing an end from its parsed text put a footnote's caret
|
|
329
|
-
* past its bracket.
|
|
330
|
-
*/
|
|
352
|
+
/** Where a click on a widget puts the caret when the kind maps no point: the end of its content
|
|
353
|
+
* span, inside the delimiters, so typing continues the construct. No span keeps the leading edge. */
|
|
331
354
|
function insideEndOffset(inline) {
|
|
332
355
|
const source = deps.node.raw.slice(inline.start, inline.end);
|
|
333
|
-
const span =
|
|
356
|
+
const span = widgetEditing(inline.kind)?.revealContentSpan?.(source);
|
|
334
357
|
return span && span.end >= 0 && span.end <= source.length ? span.end : 0;
|
|
335
358
|
}
|
|
359
|
+
/** The offset a click names inside a widget's source. Read against the layout from before
|
|
360
|
+
* any source was hidden: hiding one reflows the line, and the point then means nothing. */
|
|
361
|
+
function seatFromPoint(el, inline, x, y) {
|
|
362
|
+
const widget = widgetElByStart(el, inline.start);
|
|
363
|
+
const atPoint = widgetEditing(inline.kind)?.revealOffsetAtPoint;
|
|
364
|
+
if (!widget || !atPoint)
|
|
365
|
+
return null;
|
|
366
|
+
const source = deps.node.raw.slice(inline.start, inline.end);
|
|
367
|
+
const seat = atPoint(widget, source, x, y);
|
|
368
|
+
return seat === null ? null : Math.max(0, Math.min(seat, source.length));
|
|
369
|
+
}
|
|
336
370
|
function hitTestRevealWidget(el, x, y) {
|
|
337
371
|
const painted = revealWidgetFromDom(el, x, y);
|
|
338
372
|
if (painted)
|
|
339
373
|
return painted;
|
|
340
|
-
//
|
|
341
|
-
// under it): the original box test, which still covers a widget that paints inside
|
|
342
|
-
// its own bounds.
|
|
374
|
+
// The box test, for a point the DOM cannot answer, such as a synthetic call.
|
|
343
375
|
for (const inline of widgetsOf()) {
|
|
344
|
-
if (!
|
|
376
|
+
if (!widgetEditing(inline.kind)?.revealSource)
|
|
345
377
|
continue;
|
|
346
378
|
const widget = widgetElByStart(el, inline.start);
|
|
347
379
|
if (!widget)
|
|
@@ -357,12 +389,18 @@ export function createWidgetInteraction(deps) {
|
|
|
357
389
|
const el = deps.getEl();
|
|
358
390
|
return el !== null && hitTestRevealWidget(el, x, y) !== null;
|
|
359
391
|
}
|
|
360
|
-
|
|
361
|
-
|
|
392
|
+
function islandDragAnchor(x, y) {
|
|
393
|
+
const el = deps.getEl();
|
|
394
|
+
if (!el)
|
|
395
|
+
return null;
|
|
396
|
+
const seat = nearestWidgetEdgeSeat(measuredWidgets(el, dragsFromIsland), x, y);
|
|
397
|
+
return seat?.inside ? seat.offset : null;
|
|
398
|
+
}
|
|
399
|
+
// Selecting the whole token belongs to the double-click that opened the source, and nothing
|
|
400
|
+
// in the second click's own shape tells it apart from a later one inside that source.
|
|
362
401
|
let revealOpenedByLastClick = false;
|
|
363
|
-
//
|
|
364
|
-
//
|
|
365
|
-
// re-locate by OFFSET, because an edited commit shifts raw positions by its delta.
|
|
402
|
+
// The target is resolved before hiding the current source, which reflows the line the click was
|
|
403
|
+
// read against, then found again by offset, since a committed edit shifts raw positions.
|
|
366
404
|
async function revealFromClick(clickX, clickY) {
|
|
367
405
|
const el = deps.getEl();
|
|
368
406
|
if (!el)
|
|
@@ -370,12 +408,11 @@ export function createWidgetInteraction(deps) {
|
|
|
370
408
|
const hit = hitTestRevealWidget(el, clickX, clickY);
|
|
371
409
|
if (!hit)
|
|
372
410
|
return;
|
|
411
|
+
const seat = seatFromPoint(el, hit.inline, clickX, clickY);
|
|
373
412
|
let targetStart = hit.inline.start;
|
|
374
413
|
if (revealState) {
|
|
375
414
|
const active = revealState;
|
|
376
|
-
const revealedStart = activeSourceNode === null
|
|
377
|
-
? Number.POSITIVE_INFINITY
|
|
378
|
-
: toClampedRawOffset(domTextOffsetAtNode(el, activeSourceNode, 0), deps.getAmbientLength());
|
|
415
|
+
const revealedStart = activeSourceNode === null ? Number.POSITIVE_INFINITY : rawOffsetAt(el, activeSourceNode, 0);
|
|
379
416
|
const rawBefore = deps.node.raw.length;
|
|
380
417
|
if (deps.readRawText() === active.originalDisplay) {
|
|
381
418
|
foldRevealNoEdit();
|
|
@@ -386,20 +423,15 @@ export function createWidgetInteraction(deps) {
|
|
|
386
423
|
targetStart += deps.node.raw.length - rawBefore;
|
|
387
424
|
}
|
|
388
425
|
}
|
|
389
|
-
const target = widgetsOf().find((n) => n.start === targetStart &&
|
|
426
|
+
const target = widgetsOf().find((n) => n.start === targetStart && widgetEditing(n.kind)?.revealSource);
|
|
390
427
|
if (!target)
|
|
391
428
|
return;
|
|
392
429
|
el.focus();
|
|
393
430
|
revealOpenedByLastClick = true;
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Take the whole revealed token; declines unless the double-click landed on it. Keyed off the
|
|
400
|
-
* point, not the selection: the root's second-press word select runs before this click and
|
|
401
|
-
* may have moved the selection off the source.
|
|
402
|
-
*/
|
|
431
|
+
void startReveal(target, target.start, seat ?? insideEndOffset(target));
|
|
432
|
+
}
|
|
433
|
+
/** Select the whole shown token if the double-click landed on it. Decided from the point: the
|
|
434
|
+
* editor root's word-select runs first and may have moved the selection off the source. */
|
|
403
435
|
function selectRevealedSource(x, y) {
|
|
404
436
|
const source = activeSourceNode;
|
|
405
437
|
if (!revealState || !source || y === null)
|
|
@@ -417,9 +449,8 @@ export function createWidgetInteraction(deps) {
|
|
|
417
449
|
function isRevealing() {
|
|
418
450
|
return revealState !== null;
|
|
419
451
|
}
|
|
420
|
-
//
|
|
421
|
-
//
|
|
422
|
-
// mutates, so one Enter both commits the edit and splits.
|
|
452
|
+
// Enter is left to the block's split command, which hides the source before it writes, so one
|
|
453
|
+
// Enter both commits the edit and splits.
|
|
423
454
|
async function handleRevealingKeydown(e) {
|
|
424
455
|
if (!revealState)
|
|
425
456
|
return false;
|
|
@@ -430,16 +461,14 @@ export function createWidgetInteraction(deps) {
|
|
|
430
461
|
}
|
|
431
462
|
return false;
|
|
432
463
|
}
|
|
433
|
-
//
|
|
434
|
-
//
|
|
435
|
-
// (the escape fold carries the same rule in `selectionEscapedSource`).
|
|
464
|
+
// A cross-block drag keeps the source shown, so its rectangles measure real text and no
|
|
465
|
+
// endpoint in it is stranded (`selectionEscapedSource` holds the same rule).
|
|
436
466
|
function commitRevealOnBlur() {
|
|
437
467
|
if (revealState && !deps.isCrossBlock())
|
|
438
468
|
commitReveal('blur');
|
|
439
469
|
}
|
|
440
|
-
//
|
|
441
|
-
//
|
|
442
|
-
// element-level edge would land the paste at offset 0 — and the write's completion.
|
|
470
|
+
// The committed caret is returned because a caret left on an element-level edge would land a
|
|
471
|
+
// paste at offset 0.
|
|
443
472
|
function foldRevealBeforeMutation(caretAfter) {
|
|
444
473
|
if (!revealState)
|
|
445
474
|
return null;
|
|
@@ -448,22 +477,22 @@ export function createWidgetInteraction(deps) {
|
|
|
448
477
|
function isVerticallyTransparent() {
|
|
449
478
|
// Resolver-free, matching the off-window keyboard-extend path, so the vertical-skip
|
|
450
479
|
// decision is uniform everywhere. Other widget reads stay resolver-aware.
|
|
451
|
-
return isVerticallyTransparentNode(deps.node);
|
|
480
|
+
return isVerticallyTransparentNode(deps.node, deps.reading.grammar);
|
|
452
481
|
}
|
|
453
482
|
async function handleSelectedWidgetKeydown(e) {
|
|
454
483
|
const node = deps.node;
|
|
455
484
|
const selectedWidget = deps.widgetSelection.getSelected();
|
|
456
485
|
if (selectedWidget === null)
|
|
457
486
|
return false;
|
|
458
|
-
const widget = findWidgetNodeByStart(selectedWidget.sourceStart, inlinesOf(node), node.raw);
|
|
487
|
+
const widget = findWidgetNodeByStart(selectedWidget.sourceStart, inlinesOf(node), node.raw, deps.reading.grammar);
|
|
459
488
|
const widgetIsHere = widget !== null && deps.widgetSelection.isSelected(deps.myPath, selectedWidget.sourceStart);
|
|
460
489
|
if (!widgetIsHere)
|
|
461
490
|
return false;
|
|
462
|
-
// The kind's editing policy
|
|
463
|
-
// of `[![alt][ref]][repo]` is the resolved
|
|
464
|
-
const inline = flattenInlineWidgets(inlinesOf(node), node.raw).find((n) => n.start === widget.start);
|
|
491
|
+
// The kind's editing policy takes its own keys first. Flattened so the nested image
|
|
492
|
+
// of `[![alt][ref]][repo]` is the widget resolved.
|
|
493
|
+
const inline = flattenInlineWidgets(inlinesOf(node), node.raw, deps.reading.grammar).find((n) => n.start === widget.start);
|
|
465
494
|
if (inline) {
|
|
466
|
-
const policy =
|
|
495
|
+
const policy = widgetEditing(inline.kind);
|
|
467
496
|
const consumed = policy?.onSelectedKey?.(e, {
|
|
468
497
|
node,
|
|
469
498
|
inline,
|
|
@@ -472,23 +501,22 @@ export function createWidgetInteraction(deps) {
|
|
|
472
501
|
index: deps.index,
|
|
473
502
|
preSelectOffset: selectedWidget.preSelectOffset,
|
|
474
503
|
editorContentWidth: deps.getEditorContentWidth(),
|
|
475
|
-
presentationMode: deps.
|
|
476
|
-
updateContent: (newRaw, caretBefore, caretAfter) => void deps.blockEdit.updateBlockContent(deps.index, newRaw, caretBefore, caretAfter)
|
|
504
|
+
presentationMode: deps.reading.mode(),
|
|
505
|
+
updateContent: (newRaw, caretBefore, caretAfter) => void deps.blockEdit.updateBlockContent(deps.index, newRaw, 'authored', caretBefore, caretAfter)
|
|
477
506
|
});
|
|
478
507
|
if (consumed)
|
|
479
508
|
return true;
|
|
480
509
|
}
|
|
481
|
-
//
|
|
482
|
-
//
|
|
483
|
-
// shared-pipeline arm would read offset 0 and move focus to a block that isn't there.
|
|
510
|
+
// A modified chord goes on to the keymap dispatch, which owns undo and redo. Arrows stop here:
|
|
511
|
+
// selecting cleared the browser range, so a later handler would read offset 0.
|
|
484
512
|
if (hasModifier(e)) {
|
|
485
513
|
if (!e.key.startsWith('Arrow'))
|
|
486
514
|
return false;
|
|
487
515
|
e.preventDefault();
|
|
488
516
|
return true;
|
|
489
517
|
}
|
|
490
|
-
//
|
|
491
|
-
// for plain Arrow.
|
|
518
|
+
// Consumed even by a kind that handles no Shift+Arrow: stepping out is reserved
|
|
519
|
+
// for a plain Arrow.
|
|
492
520
|
if (e.shiftKey && (e.key === 'ArrowLeft' || e.key === 'ArrowRight')) {
|
|
493
521
|
e.preventDefault();
|
|
494
522
|
return true;
|
|
@@ -504,27 +532,27 @@ export function createWidgetInteraction(deps) {
|
|
|
504
532
|
await deps.focusActions.moveFocus(deps.index + (left ? -1 : 1), left ? 'end' : 'start');
|
|
505
533
|
}
|
|
506
534
|
else {
|
|
507
|
-
deps.cursor.setRaw(asRawOffset(left ? widget.start : widget.end));
|
|
535
|
+
deps.cursor.setRaw(asRawOffset(left ? widget.start : widget.end), { clamp: 'reachable' });
|
|
508
536
|
deps.widgetSelection.clear();
|
|
509
537
|
}
|
|
510
538
|
return true;
|
|
511
539
|
}
|
|
512
|
-
// A vertical arrow
|
|
513
|
-
//
|
|
514
|
-
|
|
515
|
-
|
|
540
|
+
// A vertical arrow, Home, End and the page keys are shared moves that need a real caret to
|
|
541
|
+
// read: put one at the edge the key leaves from and decline, so the move runs from there.
|
|
542
|
+
const moveEdge = e.shiftKey ? null : caretMoveEdge(e.key);
|
|
543
|
+
if (moveEdge) {
|
|
544
|
+
deps.cursor.setRaw(asRawOffset(moveEdge === 'start' ? widget.start : widget.end), {
|
|
545
|
+
clamp: 'reachable'
|
|
546
|
+
});
|
|
516
547
|
deps.widgetSelection.clear();
|
|
517
548
|
return false;
|
|
518
549
|
}
|
|
519
|
-
// Reading mode still
|
|
520
|
-
//
|
|
521
|
-
// actually was when selection took over.
|
|
550
|
+
// Reading mode still consumes the key, since a selected widget owns its keys, but writes
|
|
551
|
+
// nothing.
|
|
522
552
|
const spliceWidget = (text) => {
|
|
523
553
|
if (isReading())
|
|
524
554
|
return;
|
|
525
|
-
|
|
526
|
-
void deps.blockEdit.updateBlockContent(deps.index, newRaw, selectedWidget.preSelectOffset, widget.start + text.length);
|
|
527
|
-
deps.widgetSelection.clear();
|
|
555
|
+
void replaceSelectedWidget(deps, widget, selectedWidget.preSelectOffset, text, 'authored');
|
|
528
556
|
};
|
|
529
557
|
if (e.key === 'Backspace' || e.key === 'Delete') {
|
|
530
558
|
e.preventDefault();
|
|
@@ -533,7 +561,7 @@ export function createWidgetInteraction(deps) {
|
|
|
533
561
|
}
|
|
534
562
|
if (e.key === 'Escape') {
|
|
535
563
|
e.preventDefault();
|
|
536
|
-
deps.cursor.setRaw(asRawOffset(widget.end));
|
|
564
|
+
deps.cursor.setRaw(asRawOffset(widget.end), { clamp: 'reachable' });
|
|
537
565
|
deps.widgetSelection.clear();
|
|
538
566
|
return true;
|
|
539
567
|
}
|
|
@@ -542,15 +570,14 @@ export function createWidgetInteraction(deps) {
|
|
|
542
570
|
spliceWidget(e.key);
|
|
543
571
|
return true;
|
|
544
572
|
}
|
|
545
|
-
// Every remaining key is
|
|
546
|
-
//
|
|
547
|
-
// editor's chain, and the browser's default would still mutate behind the CST.
|
|
573
|
+
// Every remaining key is consumed and its default prevented, since the browser's default
|
|
574
|
+
// would still edit behind the CST.
|
|
548
575
|
e.preventDefault();
|
|
549
576
|
return true;
|
|
550
577
|
}
|
|
551
578
|
function handleShiftArrowIntoWidget(e) {
|
|
552
|
-
// While source is
|
|
553
|
-
// editable text: let
|
|
579
|
+
// While a source is shown the CST still reports an atomic widget, but the DOM holds
|
|
580
|
+
// editable text: let the browser's selection run over it, not past a widget that is gone.
|
|
554
581
|
if (revealState)
|
|
555
582
|
return false;
|
|
556
583
|
const el = deps.getEl();
|
|
@@ -565,12 +592,11 @@ export function createWidgetInteraction(deps) {
|
|
|
565
592
|
extendSelectionToRaw(widgetExt);
|
|
566
593
|
return true;
|
|
567
594
|
}
|
|
568
|
-
// The
|
|
569
|
-
//
|
|
570
|
-
// target and the undo / pre-select anchor.
|
|
595
|
+
// The one place the show-source-or-select choice is made. `fromTrailingEdge` sets both where
|
|
596
|
+
// the caret goes in the source and the undo anchor.
|
|
571
597
|
function enterWidget(widget, fromTrailingEdge) {
|
|
572
598
|
const enteredOffset = fromTrailingEdge ? widget.end : widget.start;
|
|
573
|
-
if (
|
|
599
|
+
if (widgetEditing(widget.kind)?.revealSource) {
|
|
574
600
|
const atSourceOffset = fromTrailingEdge ? widget.end - widget.start : 0;
|
|
575
601
|
void startReveal(widget, enteredOffset, atSourceOffset);
|
|
576
602
|
}
|
|
@@ -592,7 +618,7 @@ export function createWidgetInteraction(deps) {
|
|
|
592
618
|
const widget = widgetsOf().find((w) => w.start < offset && offset < w.end);
|
|
593
619
|
if (!widget)
|
|
594
620
|
return false;
|
|
595
|
-
const editing =
|
|
621
|
+
const editing = widgetEditing(widget.kind);
|
|
596
622
|
if (!editing?.revealSource || !editing.revealContentSpan)
|
|
597
623
|
return false;
|
|
598
624
|
const at = offset - widget.start;
|
|
@@ -607,8 +633,8 @@ export function createWidgetInteraction(deps) {
|
|
|
607
633
|
if (inlines.length === 0)
|
|
608
634
|
return false;
|
|
609
635
|
const target = side === 'start'
|
|
610
|
-
? findFirstEdgeWidget(inlines, deps.node.raw)
|
|
611
|
-
: findLastEdgeWidget(inlines, deps.node.raw);
|
|
636
|
+
? findFirstEdgeWidget(inlines, deps.node.raw, deps.reading.grammar)
|
|
637
|
+
: findLastEdgeWidget(inlines, deps.node.raw, deps.reading.grammar);
|
|
612
638
|
if (!target)
|
|
613
639
|
return false;
|
|
614
640
|
// Focus the contenteditable so subsequent keys route to this block's handler.
|
|
@@ -618,58 +644,74 @@ export function createWidgetInteraction(deps) {
|
|
|
618
644
|
}
|
|
619
645
|
function snapClickToWidgetEdge(clickX, clickY, press = {}) {
|
|
620
646
|
deps.setSnapTarget(null);
|
|
621
|
-
const
|
|
622
|
-
// Every double-click
|
|
623
|
-
//
|
|
624
|
-
if (
|
|
647
|
+
const clickCount = press.clickCount ?? 1;
|
|
648
|
+
// Every double-click starts with a single click, so that first click is where the flag
|
|
649
|
+
// is set and any flag left over from an earlier gesture is cleared.
|
|
650
|
+
if (clickCount === 1)
|
|
625
651
|
revealOpenedByLastClick = false;
|
|
626
652
|
const el = deps.getEl();
|
|
627
653
|
if (!el || clickX === null)
|
|
628
654
|
return;
|
|
629
|
-
//
|
|
630
|
-
//
|
|
631
|
-
if (clickY !== null) {
|
|
632
|
-
const hit = hitTestRevealWidget(el, clickX, clickY);
|
|
655
|
+
// A third click selects the block (`selection/multi-click.ts`), and showing a source under
|
|
656
|
+
// it would place a caret over the range it just painted.
|
|
657
|
+
if (clickY !== null && clickCount < 3) {
|
|
658
|
+
const hit = press.moved ? null : hitTestRevealWidget(el, clickX, clickY);
|
|
633
659
|
if (hit) {
|
|
634
660
|
// Returns rather than falls through: the edge-snap below would focus this block and
|
|
635
661
|
// place a caret, stealing back what the widget's own navigation just landed.
|
|
636
|
-
if (
|
|
637
|
-
isWidgetActivationClick(press.modified ?? false, deps.
|
|
662
|
+
if (widgetEditing(hit.inline.kind)?.claimsActivationClick &&
|
|
663
|
+
isWidgetActivationClick(press.modified ?? false, deps.reading.mode())) {
|
|
638
664
|
return;
|
|
639
665
|
}
|
|
640
666
|
void revealFromClick(clickX, clickY);
|
|
641
667
|
return;
|
|
642
668
|
}
|
|
643
669
|
}
|
|
644
|
-
// The first click of a double-click
|
|
645
|
-
//
|
|
646
|
-
if (
|
|
670
|
+
// The first click of a double-click showed the source, and the browser's word rule would take
|
|
671
|
+
// `[` or `$` alone, so the second click selects the whole token.
|
|
672
|
+
if (clickCount === 2 && revealOpenedByLastClick && selectRevealedSource(clickX, clickY))
|
|
647
673
|
return;
|
|
648
|
-
//
|
|
649
|
-
|
|
674
|
+
// The snap below places a caret, so it does nothing while this block shows a selected
|
|
675
|
+
// range, which it would collapse; `clampOutOfMarkerPrefix` already holds that rule.
|
|
676
|
+
const live = window.getSelection();
|
|
677
|
+
if (surfaceHoldsRange(el, live))
|
|
650
678
|
return;
|
|
679
|
+
const seat = nearestWidgetEdgeSeat(measuredWidgets(el), clickX, clickY);
|
|
680
|
+
if (seat === null)
|
|
681
|
+
return;
|
|
682
|
+
// A click beside a widget leaves a visible caret alone; a click on one cannot, since the
|
|
683
|
+
// browser answers that hit test with a position in the neighbouring text.
|
|
684
|
+
if (!seat.inside && caretIsInTextContent(el, live))
|
|
685
|
+
return;
|
|
686
|
+
el.focus();
|
|
687
|
+
deps.cursor.setRaw(asRawOffset(seat.offset), { clamp: 'reachable' });
|
|
688
|
+
// `setRaw` may have landed in a trailing text node, where the browser draws a caret.
|
|
689
|
+
if (!caretIsInTextContent(el, window.getSelection()))
|
|
690
|
+
deps.setSnapTarget(seat.offset);
|
|
691
|
+
}
|
|
692
|
+
function* measuredWidgets(el, seatsInside = characterLike) {
|
|
651
693
|
for (const inline of widgetsOf()) {
|
|
652
694
|
const widget = widgetElByStart(el, inline.start);
|
|
653
|
-
if (
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
deps.cursor.setRaw(asRawOffset(snapTo));
|
|
661
|
-
// `setRaw`'s walker may have landed in a trailing text node, where native renders.
|
|
662
|
-
if (!caretIsInTextContent(el, window.getSelection())) {
|
|
663
|
-
deps.setSnapTarget(snapTo);
|
|
695
|
+
if (widget) {
|
|
696
|
+
yield {
|
|
697
|
+
start: inline.start,
|
|
698
|
+
end: inline.end,
|
|
699
|
+
rect: widget.getBoundingClientRect(),
|
|
700
|
+
seatsInside: seatsInside(inline.kind)
|
|
701
|
+
};
|
|
664
702
|
}
|
|
665
|
-
return;
|
|
666
703
|
}
|
|
667
704
|
}
|
|
705
|
+
/** Which inline widgets a drag may start inside: a kind with a pointer gesture of its own (an
|
|
706
|
+
* image's resize handles) owns its press. */
|
|
707
|
+
function dragsFromIsland(kind) {
|
|
708
|
+
return characterLike(kind) || widgetEditing(kind)?.revealSource === true;
|
|
709
|
+
}
|
|
668
710
|
function widgetExtensionTarget(key) {
|
|
669
711
|
const el = deps.getEl();
|
|
670
712
|
if (!el)
|
|
671
713
|
return null;
|
|
672
|
-
const focus =
|
|
714
|
+
const focus = rawSelectionFocus(el);
|
|
673
715
|
if (focus === null)
|
|
674
716
|
return null;
|
|
675
717
|
for (const inline of widgetsOf()) {
|
|
@@ -684,16 +726,8 @@ export function createWidgetInteraction(deps) {
|
|
|
684
726
|
}
|
|
685
727
|
function extendSelectionToRaw(rawOffset) {
|
|
686
728
|
const el = deps.getEl();
|
|
687
|
-
if (
|
|
688
|
-
|
|
689
|
-
const sel = window.getSelection();
|
|
690
|
-
if (!sel || sel.rangeCount === 0)
|
|
691
|
-
return;
|
|
692
|
-
const target = toDomTextOffset(asRawOffset(rawOffset), deps.getAmbientLength());
|
|
693
|
-
const range = createRangeAtDomTextOffsets(el, target, target);
|
|
694
|
-
if (!range)
|
|
695
|
-
return;
|
|
696
|
-
sel.extend(range.endContainer, range.endOffset);
|
|
729
|
+
if (el)
|
|
730
|
+
extendSelectionToRawIn(el, rawOffset);
|
|
697
731
|
}
|
|
698
732
|
return {
|
|
699
733
|
isVerticallyTransparent,
|
|
@@ -708,6 +742,7 @@ export function createWidgetInteraction(deps) {
|
|
|
708
742
|
commitRevealOnBlur,
|
|
709
743
|
foldRevealBeforeMutation,
|
|
710
744
|
foldRevealIfSelectionEscaped,
|
|
711
|
-
isPointOnRevealWidget
|
|
745
|
+
isPointOnRevealWidget,
|
|
746
|
+
islandDragAnchor
|
|
712
747
|
};
|
|
713
748
|
}
|