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