@voithos-labs/aragonite 0.10.3 → 0.10.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/a11y-strings.d.ts +12 -5
- package/dist/a11y-strings.js +61 -5
- package/dist/action-contracts.d.ts +242 -155
- package/dist/action-contracts.js +2 -2
- package/dist/active-editor.d.ts +3 -3
- package/dist/active-editor.js +8 -9
- package/dist/ambient/ambient-dom.d.ts +2 -5
- package/dist/ambient/ambient-dom.js +16 -62
- package/dist/assert.js +6 -5
- package/dist/block-component.d.ts +135 -109
- package/dist/block-component.js +30 -22
- package/dist/block-id.d.ts +6 -10
- package/dist/block-id.js +25 -14
- package/dist/bounded-memo.d.ts +5 -5
- package/dist/bounded-memo.js +6 -6
- package/dist/components/BlockDragHandle.svelte +13 -20
- package/dist/components/BlockHost.svelte +56 -134
- package/dist/components/BlockList.svelte +22 -19
- package/dist/components/DecorationOverlay.svelte +9 -10
- package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
- package/dist/components/Editor.svelte +619 -1089
- package/dist/components/Editor.svelte.d.ts +9 -20
- package/dist/components/GapCaret.svelte +26 -59
- package/dist/components/SelectionOverlay.svelte +36 -67
- package/dist/components/SelectionOverlay.svelte.d.ts +6 -4
- package/dist/components/TailInsert.svelte +8 -55
- package/dist/components/TailInsert.svelte.d.ts +4 -6
- package/dist/components/block-content-selector.d.ts +11 -11
- package/dist/components/block-content-selector.js +11 -11
- package/dist/components/block-el-lookup.d.ts +6 -0
- package/dist/components/block-el-lookup.js +27 -0
- package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
- package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
- package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
- package/dist/components/blocks/code/CodeBlock.svelte +255 -276
- package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
- package/dist/components/blocks/code/CodeBlockRail.svelte +103 -100
- package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
- package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
- package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
- package/dist/components/blocks/code/code-bootstrap.js +35 -28
- package/dist/components/blocks/code/code-context-actions.js +5 -4
- package/dist/components/blocks/code/code-enter.js +2 -2
- package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
- package/dist/components/blocks/code/code-fence-boundary.js +40 -66
- package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
- package/dist/components/blocks/code/code-fence-exit.js +24 -25
- package/dist/components/blocks/code/code-indent.d.ts +2 -2
- package/dist/components/blocks/code/code-indent.js +4 -7
- package/dist/components/blocks/code/code-languages.d.ts +16 -12
- package/dist/components/blocks/code/code-languages.js +58 -32
- package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
- package/dist/components/blocks/code/code-paste-surface.js +9 -18
- package/dist/components/blocks/code/code-renderer.d.ts +21 -5
- package/dist/components/blocks/code/code-renderer.js +90 -125
- package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
- package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
- package/dist/components/blocks/directive/activate-directives.js +18 -13
- package/dist/components/blocks/editable-leaf.d.ts +50 -74
- package/dist/components/blocks/editable-leaf.js +144 -202
- package/dist/components/blocks/editable-surface.d.ts +96 -100
- package/dist/components/blocks/editable-surface.js +101 -109
- package/dist/components/blocks/list/ListBlock.svelte +46 -90
- package/dist/components/blocks/list/ListItemBlock.svelte +99 -144
- package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +3 -0
- package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
- package/dist/components/blocks/list/task-checkbox.js +12 -7
- package/dist/components/blocks/plain-text-backend.d.ts +4 -20
- package/dist/components/blocks/plain-text-backend.js +9 -43
- package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
- package/dist/components/blocks/surface-wiring.svelte.js +15 -34
- package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
- package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
- package/dist/components/blocks/table/TableBlock.svelte +100 -165
- package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
- package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
- package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
- package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
- package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
- package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
- package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
- package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
- package/dist/components/blocks/table/cell-pointer.js +49 -71
- package/dist/components/blocks/table/cell-render.d.ts +24 -29
- package/dist/components/blocks/table/cell-render.js +29 -31
- package/dist/components/blocks/table/selected-cells.d.ts +7 -7
- package/dist/components/blocks/table/selected-cells.js +9 -13
- package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
- package/dist/components/blocks/table/table-caret-at-point.js +5 -5
- package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
- package/dist/components/blocks/table/table-cell-paste.js +27 -43
- package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
- package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
- package/dist/components/blocks/table/table-menu-model.js +6 -10
- package/dist/components/blocks/table/table-navigation.js +2 -2
- package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
- package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
- package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
- package/dist/components/blocks/text/auto-pair-record.js +51 -0
- package/dist/components/blocks/text/click-snap-guard.d.ts +9 -4
- package/dist/components/blocks/text/click-snap-guard.js +16 -5
- package/dist/components/blocks/text/composition-seat.d.ts +17 -14
- package/dist/components/blocks/text/composition-seat.js +11 -11
- package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
- package/dist/components/blocks/text/construct-edge-delete.js +50 -65
- package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
- package/dist/components/blocks/text/construct-reveal.js +13 -14
- package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
- package/dist/components/blocks/text/delimiter-autopair.js +87 -103
- package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
- package/dist/components/blocks/text/edge-policy-dispatch.js +164 -180
- package/dist/components/blocks/text/edge-seat.d.ts +17 -26
- package/dist/components/blocks/text/edge-seat.js +43 -70
- package/dist/components/blocks/text/link-at-point.d.ts +9 -9
- package/dist/components/blocks/text/link-at-point.js +12 -15
- package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
- package/dist/components/blocks/text/live-join-seam.js +75 -112
- package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
- package/dist/components/blocks/text/live-selection-edit.js +32 -105
- package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
- package/dist/components/blocks/text/live-split-rebalance.js +50 -67
- package/dist/components/blocks/text/marker-completion.d.ts +7 -12
- package/dist/components/blocks/text/marker-completion.js +17 -10
- package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
- package/dist/components/blocks/text/pending-mark-insert.js +30 -49
- package/dist/components/blocks/text/screen-diff.d.ts +5 -15
- package/dist/components/blocks/text/screen-diff.js +5 -19
- package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
- package/dist/components/blocks/text/text-clipboard.js +27 -32
- package/dist/components/blocks/text/text-keydown.d.ts +20 -30
- package/dist/components/blocks/text/text-keydown.js +54 -51
- package/dist/components/blocks/text/text-render.d.ts +25 -35
- package/dist/components/blocks/text/text-render.js +82 -61
- package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
- package/dist/components/blocks/text/widget-adjacency.js +17 -17
- package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
- package/dist/components/blocks/text/widget-interaction.js +243 -208
- package/dist/components/blocks/widget-portal.d.ts +20 -29
- package/dist/components/blocks/widget-portal.js +16 -14
- package/dist/components/built-in-blocks.d.ts +3 -4
- package/dist/components/built-in-blocks.js +17 -18
- package/dist/components/drag-handle.d.ts +13 -30
- package/dist/components/drag-handle.js +25 -63
- package/dist/components/editor-built-ins.d.ts +1 -0
- package/dist/components/editor-built-ins.js +16 -0
- package/dist/components/editor-root-clipboard.d.ts +6 -6
- package/dist/components/editor-root-clipboard.js +16 -27
- package/dist/components/editor-root-document-swap.d.ts +49 -0
- package/dist/components/editor-root-document-swap.js +54 -0
- package/dist/components/editor-root-focus.d.ts +5 -4
- package/dist/components/editor-root-focus.js +51 -22
- package/dist/components/editor-root-focused-surface.d.ts +35 -0
- package/dist/components/editor-root-focused-surface.js +65 -0
- package/dist/components/editor-root-geometry.d.ts +15 -24
- package/dist/components/editor-root-geometry.js +27 -31
- package/dist/components/editor-root-gestures.d.ts +39 -0
- package/dist/components/editor-root-gestures.js +189 -0
- package/dist/components/editor-root-keydown.d.ts +10 -25
- package/dist/components/editor-root-keydown.js +19 -43
- package/dist/components/editor-root-listeners.d.ts +22 -31
- package/dist/components/editor-root-listeners.js +49 -46
- package/dist/components/editor-root-menus.d.ts +51 -0
- package/dist/components/editor-root-menus.js +147 -0
- package/dist/components/editor-root-mode-flip.d.ts +16 -11
- package/dist/components/editor-root-mode-flip.js +36 -34
- package/dist/components/editor-root-scroll-host.d.ts +22 -0
- package/dist/components/editor-root-scroll-host.js +34 -0
- package/dist/components/editor-root-test-surface.d.ts +48 -0
- package/dist/components/editor-root-test-surface.js +6 -0
- package/dist/components/image/ImageOverlayHost.svelte +44 -35
- package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
- package/dist/components/image/ImageProperties.svelte +37 -41
- package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
- package/dist/components/image/ImageResizeHandles.svelte +26 -30
- package/dist/components/image/image-crop.d.ts +5 -11
- package/dist/components/image/image-crop.js +5 -11
- package/dist/components/image/image-edit-commit.d.ts +19 -16
- package/dist/components/image/image-edit-commit.js +74 -38
- package/dist/components/image/image-resize.d.ts +2 -5
- package/dist/components/image/image-resize.js +3 -6
- package/dist/components/image/image-widget-editing.d.ts +3 -3
- package/dist/components/image/image-widget-editing.js +9 -9
- package/dist/components/image/widget-dom.d.ts +2 -3
- package/dist/components/image/widget-dom.js +19 -24
- package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
- package/dist/components/image/widget-selection-state.svelte.js +26 -19
- package/dist/components/kind-cue.svelte.d.ts +21 -0
- package/dist/components/kind-cue.svelte.js +35 -0
- package/dist/components/link-card/LinkCard.svelte +115 -64
- package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
- package/dist/components/link-card/LinkCardHost.svelte +42 -33
- package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
- package/dist/components/link-card/link-card-commit.d.ts +16 -19
- package/dist/components/link-card/link-card-commit.js +21 -30
- package/dist/components/link-card/link-card-entry.d.ts +13 -23
- package/dist/components/link-card/link-card-entry.js +16 -24
- package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
- package/dist/components/link-card/link-card-state.svelte.js +2 -2
- package/dist/components/lrd-map-gate.d.ts +4 -11
- package/dist/components/lrd-map-gate.js +5 -11
- package/dist/components/menu/BlockMenu.svelte +20 -81
- package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
- package/dist/components/menu/InlineMenuHost.svelte +191 -0
- package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
- package/dist/components/menu/MenuIcon.svelte +3 -103
- package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
- package/dist/components/menu/SelectionToolbar.svelte +380 -0
- package/dist/components/menu/SelectionToolbar.svelte.d.ts +14 -0
- package/dist/components/menu/clipboard-actions.d.ts +3 -4
- package/dist/components/menu/clipboard-actions.js +3 -4
- package/dist/components/menu/default-context-actions.d.ts +4 -13
- package/dist/components/menu/default-context-actions.js +49 -67
- package/dist/components/menu/flyout-placement.d.ts +2 -2
- package/dist/components/menu/flyout-placement.js +2 -2
- package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
- package/dist/components/menu/menu-presence.svelte.js +19 -0
- package/dist/components/paste-image-arm.d.ts +6 -11
- package/dist/components/paste-image-arm.js +11 -18
- package/dist/components/portal.d.ts +2 -5
- package/dist/components/portal.js +4 -7
- package/dist/core/directive/activate.d.ts +4 -5
- package/dist/core/directive/activate.js +8 -9
- package/dist/core/directive/container-opener.js +13 -12
- package/dist/core/directive/grammar.d.ts +2 -5
- package/dist/core/directive/grammar.js +10 -10
- package/dist/core/directive/kinds.d.ts +4 -7
- package/dist/core/directive/kinds.js +14 -16
- package/dist/core/directive/registry.d.ts +12 -9
- package/dist/core/directive/registry.js +19 -20
- package/dist/core/directive/text-recognizer.d.ts +3 -2
- package/dist/core/directive/text-recognizer.js +5 -9
- package/dist/core/escapable.d.ts +1 -5
- package/dist/core/escapable.js +1 -5
- package/dist/core/inline/backticks.d.ts +3 -4
- package/dist/core/inline/backticks.js +3 -4
- package/dist/core/inline/character-refs.js +2 -1
- package/dist/core/inline/destination-bytes.d.ts +6 -3
- package/dist/core/inline/destination-bytes.js +50 -8
- package/dist/core/inline/entity-widget.d.ts +4 -3
- package/dist/core/inline/entity-widget.js +6 -6
- package/dist/core/inline/format-toggle.d.ts +22 -28
- package/dist/core/inline/format-toggle.js +97 -129
- package/dist/core/inline/html-entities.d.ts +2 -3
- package/dist/core/inline/html-entities.js +2 -3
- package/dist/core/inline/html-tag-grammar.js +6 -2
- package/dist/core/inline/image-dimensions.d.ts +2 -0
- package/dist/core/inline/image-dimensions.js +19 -2
- package/dist/core/inline/image-source-bytes.d.ts +11 -0
- package/dist/core/inline/image-source-bytes.js +71 -0
- package/dist/core/inline/index.d.ts +28 -21
- package/dist/core/inline/index.js +56 -34
- package/dist/core/inline/inline-cache.d.ts +12 -15
- package/dist/core/inline/inline-cache.js +11 -14
- package/dist/core/inline/inline-widgets.d.ts +55 -68
- package/dist/core/inline/inline-widgets.js +55 -58
- package/dist/core/inline/link-destination.d.ts +31 -0
- package/dist/core/inline/link-destination.js +129 -0
- package/dist/core/inline/link-reference-resolver.d.ts +8 -6
- package/dist/core/inline/link-reference-resolver.js +10 -6
- package/dist/core/inline/link-source-bytes.d.ts +31 -0
- package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
- package/dist/core/inline/live-edit/read-back.d.ts +29 -0
- package/dist/core/inline/live-edit/read-back.js +50 -0
- package/dist/core/inline/picture.d.ts +10 -0
- package/dist/core/inline/picture.js +40 -0
- package/dist/core/inline/scan/autolinks.d.ts +7 -8
- package/dist/core/inline/scan/autolinks.js +80 -59
- package/dist/core/inline/scan/brackets.d.ts +2 -2
- package/dist/core/inline/scan/brackets.js +6 -103
- package/dist/core/inline/scan/code-spans.d.ts +4 -0
- package/dist/core/inline/scan/code-spans.js +8 -0
- package/dist/core/inline/scan/emphasis.js +10 -14
- package/dist/core/inline/scan/index.d.ts +3 -1
- package/dist/core/inline/scan/index.js +32 -33
- package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
- package/dist/core/inline/scan/plugin-syntax.js +75 -89
- package/dist/core/inline/scan/scan-state.d.ts +2 -0
- package/dist/core/inline/scan/scan-state.js +1 -0
- package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
- package/dist/core/inline/scan/simple-nodes.js +2 -5
- package/dist/core/inline/scan/triggers.d.ts +17 -0
- package/dist/core/inline/scan/triggers.js +26 -0
- package/dist/core/inline/scan/url.js +8 -10
- package/dist/core/inline/transparency.d.ts +2 -1
- package/dist/core/inline/transparency.js +33 -17
- package/dist/core/inline/visibility.d.ts +30 -49
- package/dist/core/inline/visibility.js +31 -49
- package/dist/core/inline/walk.d.ts +4 -10
- package/dist/core/inline/walk.js +4 -10
- package/dist/core/inline-render.d.ts +22 -27
- package/dist/core/inline-render.js +51 -60
- package/dist/core/lines.d.ts +67 -26
- package/dist/core/lines.js +164 -33
- package/dist/core/metadata-parity.d.ts +9 -0
- package/dist/core/metadata-parity.js +25 -0
- package/dist/core/node-views.d.ts +7 -6
- package/dist/core/node-views.js +5 -5
- package/dist/core/nodes.d.ts +34 -44
- package/dist/core/nodes.js +4 -12
- package/dist/core/parser.d.ts +27 -34
- package/dist/core/parser.js +53 -67
- package/dist/core/parsers/blockquote.d.ts +5 -8
- package/dist/core/parsers/blockquote.js +11 -10
- package/dist/core/parsers/built-in-openers.d.ts +2 -5
- package/dist/core/parsers/built-in-openers.js +5 -8
- package/dist/core/parsers/fence-syntax.d.ts +36 -7
- package/dist/core/parsers/fence-syntax.js +61 -11
- package/dist/core/parsers/fenced-code.d.ts +16 -0
- package/dist/core/parsers/fenced-code.js +16 -15
- package/dist/core/parsers/heading.d.ts +19 -2
- package/dist/core/parsers/heading.js +50 -2
- package/dist/core/parsers/html-block.d.ts +3 -6
- package/dist/core/parsers/html-block.js +10 -11
- package/dist/core/parsers/indented-code.d.ts +1 -1
- package/dist/core/parsers/indented-code.js +2 -8
- package/dist/core/parsers/link-reference.d.ts +5 -3
- package/dist/core/parsers/link-reference.js +116 -120
- package/dist/core/parsers/list.d.ts +12 -5
- package/dist/core/parsers/list.js +53 -36
- package/dist/core/parsers/paragraph.d.ts +3 -3
- package/dist/core/parsers/paragraph.js +14 -5
- package/dist/core/parsers/table-completion.d.ts +2 -5
- package/dist/core/parsers/table-completion.js +7 -10
- package/dist/core/parsers/table.d.ts +8 -8
- package/dist/core/parsers/table.js +23 -26
- package/dist/core/parsers/thematic-break.js +15 -14
- package/dist/core/paths.d.ts +13 -0
- package/dist/core/paths.js +31 -0
- package/dist/core/terminator-escalation.d.ts +0 -7
- package/dist/core/terminator-escalation.js +5 -8
- package/dist/core/url-policy.d.ts +2 -5
- package/dist/core/url-policy.js +8 -12
- package/dist/cursor/caret-memory.d.ts +34 -0
- package/dist/cursor/caret-memory.js +82 -0
- package/dist/cursor/coordinate-spaces.d.ts +26 -19
- package/dist/cursor/coordinate-spaces.js +32 -20
- package/dist/cursor/dom-walk.d.ts +7 -13
- package/dist/cursor/dom-walk.js +7 -13
- package/dist/cursor/edge-affinity.d.ts +7 -35
- package/dist/cursor/edge-affinity.js +13 -44
- package/dist/cursor/focused-caret.d.ts +6 -8
- package/dist/cursor/focused-caret.js +7 -16
- package/dist/cursor/height-model.d.ts +3 -3
- package/dist/cursor/height-model.js +5 -5
- package/dist/cursor/height-oracle.d.ts +10 -7
- package/dist/cursor/height-oracle.js +26 -75
- package/dist/cursor/observe-resize.d.ts +13 -0
- package/dist/cursor/observe-resize.js +43 -0
- package/dist/cursor/overlay-rects.d.ts +2 -5
- package/dist/cursor/overlay-rects.js +2 -5
- package/dist/cursor/overlay-remeasure.d.ts +6 -7
- package/dist/cursor/overlay-remeasure.js +10 -14
- package/dist/cursor/pending-marks.d.ts +7 -9
- package/dist/cursor/pending-marks.js +6 -27
- package/dist/cursor/point-offset.d.ts +16 -10
- package/dist/cursor/point-offset.js +60 -25
- package/dist/cursor/reveal-source.d.ts +7 -11
- package/dist/cursor/reveal-source.js +10 -18
- package/dist/cursor/scroll-ancestors.d.ts +9 -20
- package/dist/cursor/scroll-ancestors.js +14 -26
- package/dist/cursor/scroll-owner.d.ts +92 -0
- package/dist/cursor/scroll-owner.js +283 -0
- package/dist/cursor/scrollport.d.ts +16 -8
- package/dist/cursor/scrollport.js +28 -5
- package/dist/cursor/sticky-column.d.ts +6 -29
- package/dist/cursor/sticky-column.js +6 -49
- package/dist/cursor/sticky-measure.d.ts +14 -9
- package/dist/cursor/sticky-measure.js +99 -49
- package/dist/cursor/surface-backend.d.ts +41 -0
- package/dist/cursor/surface-backend.js +78 -0
- package/dist/cursor/typography-estimates.d.ts +3 -3
- package/dist/cursor/typography-estimates.js +3 -3
- package/dist/cursor/visual-lines.d.ts +25 -13
- package/dist/cursor/visual-lines.js +72 -28
- package/dist/cursor/widget-edge-snap.d.ts +23 -0
- package/dist/cursor/widget-edge-snap.js +39 -0
- package/dist/cursor/widget-offset.d.ts +111 -102
- package/dist/cursor/widget-offset.js +352 -177
- package/dist/debug/diagnostics-report.d.ts +6 -6
- package/dist/debug/diagnostics-report.js +5 -5
- package/dist/debug/dump-tree.js +2 -2
- package/dist/debug/editor-diagnostics.d.ts +15 -0
- package/dist/debug/editor-diagnostics.js +33 -0
- package/dist/debug/inspect.d.ts +2 -2
- package/dist/debug/inspect.js +4 -4
- package/dist/debug/interaction-trace.d.ts +14 -15
- package/dist/debug/interaction-trace.js +19 -20
- package/dist/debug/operations-log.d.ts +1 -1
- package/dist/debug/operations-log.js +1 -1
- package/dist/decorations/buckets.d.ts +6 -12
- package/dist/decorations/buckets.js +4 -11
- package/dist/decorations/decoration-state.svelte.d.ts +2 -3
- package/dist/decorations/decoration-state.svelte.js +24 -26
- package/dist/decorations/island-dom.d.ts +10 -18
- package/dist/decorations/island-dom.js +25 -50
- package/dist/decorations/reserved-attrs.d.ts +6 -8
- package/dist/decorations/reserved-attrs.js +31 -17
- package/dist/decorations/types.d.ts +6 -7
- package/dist/decorations/types.js +2 -1
- package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
- package/dist/decorations/use-block-decorations.svelte.js +71 -0
- package/dist/decorations/widget-dom.d.ts +3 -3
- package/dist/decorations/widget-dom.js +5 -5
- package/dist/dev-warn.d.ts +5 -2
- package/dist/dev-warn.js +16 -4
- package/dist/editor-actions/ancestry-folds.d.ts +9 -14
- package/dist/editor-actions/ancestry-folds.js +13 -18
- package/dist/editor-actions/block-edit-core.d.ts +49 -22
- package/dist/editor-actions/block-edit-core.js +279 -151
- package/dist/editor-actions/block-edit-scope.d.ts +63 -50
- package/dist/editor-actions/block-edit-scope.js +100 -48
- package/dist/editor-actions/block-edit.d.ts +2 -3
- package/dist/editor-actions/block-edit.js +14 -90
- package/dist/editor-actions/commit/history.d.ts +4 -4
- package/dist/editor-actions/commit/history.js +33 -34
- package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
- package/dist/editor-actions/commit/reading-write-gate.js +56 -0
- package/dist/editor-actions/commit/text-batch.d.ts +7 -11
- package/dist/editor-actions/commit/text-batch.js +6 -7
- package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
- package/dist/editor-actions/commit/undo-controller.js +346 -216
- package/dist/editor-actions/container-block-component.d.ts +32 -51
- package/dist/editor-actions/container-block-component.js +66 -92
- package/dist/editor-actions/container-edit.d.ts +4 -2
- package/dist/editor-actions/container-edit.js +14 -44
- package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
- package/dist/editor-actions/container-exit-overrides.js +19 -21
- package/dist/editor-actions/deps.d.ts +25 -32
- package/dist/editor-actions/enter-completion.d.ts +12 -15
- package/dist/editor-actions/enter-completion.js +49 -51
- package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
- package/dist/editor-actions/focus/focus-dispatch.js +33 -52
- package/dist/editor-actions/focus/focus-landing.d.ts +11 -5
- package/dist/editor-actions/focus/focus-landing.js +29 -14
- package/dist/editor-actions/focus/focus.d.ts +3 -2
- package/dist/editor-actions/focus/focus.js +42 -59
- package/dist/editor-actions/index.d.ts +4 -3
- package/dist/editor-actions/index.js +5 -4
- package/dist/editor-actions/inline-range-commit.d.ts +18 -16
- package/dist/editor-actions/inline-range-commit.js +45 -54
- package/dist/editor-actions/leaf-write.d.ts +11 -0
- package/dist/editor-actions/leaf-write.js +102 -0
- package/dist/editor-actions/list-context.d.ts +9 -10
- package/dist/editor-actions/list-context.js +115 -110
- package/dist/editor-actions/list-overrides.d.ts +13 -5
- package/dist/editor-actions/list-overrides.js +36 -12
- package/dist/editor-actions/merge-fallback.d.ts +10 -16
- package/dist/editor-actions/merge-fallback.js +11 -22
- package/dist/editor-actions/nested/container-actions.d.ts +37 -0
- package/dist/editor-actions/nested/container-actions.js +42 -0
- package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
- package/dist/editor-actions/nested/emptied-container.js +5 -0
- package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
- package/dist/editor-actions/nested/nested-actions.js +17 -15
- package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
- package/dist/editor-actions/nested/nested-block-edit.js +40 -134
- package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
- package/dist/editor-actions/nested/nested-focus.js +33 -21
- package/dist/editor-actions/paste-coordinator.d.ts +3 -2
- package/dist/editor-actions/paste-coordinator.js +17 -13
- package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
- package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
- package/dist/editor-actions/plugin/container.d.ts +55 -76
- package/dist/editor-actions/plugin/container.js +105 -186
- package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
- package/dist/editor-actions/plugin/directive-container.js +7 -8
- package/dist/editor-actions/reorder-action.d.ts +7 -12
- package/dist/editor-actions/reorder-action.js +32 -48
- package/dist/editor-actions/reorder-drag.d.ts +12 -8
- package/dist/editor-actions/reorder-drag.js +45 -41
- package/dist/editor-actions/replacement-focus.d.ts +13 -21
- package/dist/editor-actions/replacement-focus.js +32 -33
- package/dist/editor-actions/search-replace.js +71 -67
- package/dist/editor-actions/stored-caret.d.ts +7 -0
- package/dist/editor-actions/stored-caret.js +10 -0
- package/dist/editor-actions/table-context.d.ts +9 -11
- package/dist/editor-actions/table-context.js +70 -93
- package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
- package/dist/editor-actions/unwrap-strategies.js +52 -63
- package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
- package/dist/editor-actions/whole-block-focus-surface.js +43 -53
- package/dist/editor-events.d.ts +25 -29
- package/dist/editor-events.js +17 -28
- package/dist/editor-keys.d.ts +96 -104
- package/dist/editor-keys.js +11 -24
- package/dist/editor-props.d.ts +91 -71
- package/dist/editor-rects.d.ts +23 -34
- package/dist/editor-rects.js +9 -77
- package/dist/env.d.ts +6 -4
- package/dist/env.js +8 -4
- package/dist/index.d.ts +6 -2
- package/dist/index.js +5 -2
- package/dist/inline-menu/inline-menu-session.d.ts +37 -0
- package/dist/inline-menu/inline-menu-session.js +98 -0
- package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
- package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
- package/dist/inline-menu/types.d.ts +77 -0
- package/dist/inline-menu/types.js +7 -0
- package/dist/invariants/child-id-parity.d.ts +23 -0
- package/dist/invariants/child-id-parity.js +39 -0
- package/dist/invariants/commit-paths.d.ts +4 -4
- package/dist/invariants/commit-paths.js +4 -4
- package/dist/invariants/commit-scope.d.ts +4 -4
- package/dist/invariants/commit-scope.js +9 -8
- package/dist/invariants/context-keys.d.ts +2 -5
- package/dist/invariants/context-keys.js +3 -6
- package/dist/invariants/descriptor.d.ts +2 -6
- package/dist/invariants/descriptor.js +2 -6
- package/dist/invariants/inline-transitions.d.ts +9 -16
- package/dist/invariants/inline-transitions.js +10 -18
- package/dist/invariants/install.d.ts +18 -27
- package/dist/invariants/install.js +29 -30
- package/dist/invariants/keeps-a-block.d.ts +7 -0
- package/dist/invariants/keeps-a-block.js +14 -0
- package/dist/invariants/landable-caret.d.ts +5 -7
- package/dist/invariants/landable-caret.js +8 -11
- package/dist/invariants/landing-focus-scroll.d.ts +7 -0
- package/dist/invariants/landing-focus-scroll.js +13 -0
- package/dist/invariants/landing-value.d.ts +13 -0
- package/dist/invariants/landing-value.js +27 -0
- package/dist/invariants/marker-css-parity.d.ts +5 -6
- package/dist/invariants/marker-css-parity.js +11 -12
- package/dist/invariants/measures-in-own-list.d.ts +6 -0
- package/dist/invariants/measures-in-own-list.js +13 -0
- package/dist/invariants/node-shape.d.ts +18 -37
- package/dist/invariants/node-shape.js +123 -79
- package/dist/invariants/open-tail.d.ts +7 -0
- package/dist/invariants/open-tail.js +45 -0
- package/dist/invariants/placement-ends-widget.d.ts +8 -0
- package/dist/invariants/placement-ends-widget.js +13 -0
- package/dist/invariants/registry.d.ts +27 -66
- package/dist/invariants/registry.js +61 -137
- package/dist/invariants/render-fidelity.d.ts +4 -4
- package/dist/invariants/render-fidelity.js +5 -5
- package/dist/invariants/selection-endpoints.d.ts +6 -7
- package/dist/invariants/selection-endpoints.js +18 -16
- package/dist/invariants/single-node-sink.d.ts +4 -5
- package/dist/invariants/single-node-sink.js +4 -5
- package/dist/invariants/snapshot-integrity.d.ts +5 -6
- package/dist/invariants/snapshot-integrity.js +1 -1
- package/dist/invariants/structural-descriptor.d.ts +6 -15
- package/dist/invariants/structural-descriptor.js +6 -15
- package/dist/menu-icons.d.ts +47 -0
- package/dist/menu-icons.js +113 -0
- package/dist/perf/instruments.d.ts +20 -5
- package/dist/perf/instruments.js +35 -15
- package/dist/perf/use-mount-gauge.svelte.js +4 -4
- package/dist/plugin.d.ts +38 -8
- package/dist/plugin.js +102 -74
- package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
- package/dist/plugins/admonitions/admonition-kind.js +12 -10
- package/dist/plugins/admonitions/convert-document.d.ts +5 -5
- package/dist/plugins/admonitions/convert-document.js +8 -7
- package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
- package/dist/plugins/admonitions/gh-alert.js +21 -22
- package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
- package/dist/plugins/admonitions/github-alert-kind.js +28 -37
- package/dist/plugins/admonitions/index.js +2 -2
- package/dist/plugins/admonitions/kinds.d.ts +1 -1
- package/dist/plugins/admonitions/register.js +11 -2
- package/dist/plugins/details/DetailsBlock.svelte +20 -20
- package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
- package/dist/plugins/details/details-disclosure.svelte.js +6 -7
- package/dist/plugins/details/details-kind.d.ts +6 -7
- package/dist/plugins/details/details-kind.js +44 -59
- package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
- package/dist/plugins/emoji/emoji-recognizer.js +7 -14
- package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
- package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
- package/dist/plugins/footnotes/constants.d.ts +2 -0
- package/dist/plugins/footnotes/constants.js +3 -0
- package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
- package/dist/plugins/footnotes/footnote-definition.js +69 -45
- package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
- package/dist/plugins/footnotes/footnote-lookup.js +14 -26
- package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
- package/dist/plugins/footnotes/footnote-numbering.js +22 -31
- package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
- package/dist/plugins/footnotes/footnote-reference.js +8 -13
- package/dist/plugins/footnotes/index.js +2 -3
- package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
- package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
- package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
- package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
- package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
- package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
- package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
- package/dist/plugins/highlight-occurrences/word-char.js +4 -0
- package/dist/plugins/latex/BlockMath.svelte +58 -75
- package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
- package/dist/plugins/latex/MathInline.svelte +10 -9
- package/dist/plugins/latex/flanking.d.ts +1 -0
- package/dist/plugins/latex/flanking.js +3 -0
- package/dist/plugins/latex/index.d.ts +1 -1
- package/dist/plugins/latex/latex-kind.d.ts +4 -4
- package/dist/plugins/latex/latex-kind.js +113 -85
- package/dist/plugins/latex/math-completion.d.ts +1 -1
- package/dist/plugins/latex/math-completion.js +5 -8
- package/dist/plugins/latex/math-layout.d.ts +2 -8
- package/dist/plugins/latex/math-layout.js +0 -9
- package/dist/plugins/latex/math-renderer.d.ts +17 -20
- package/dist/plugins/latex/math-renderer.js +21 -38
- package/dist/plugins/latex/math-source.d.ts +4 -8
- package/dist/plugins/latex/math-source.js +36 -75
- package/dist/plugins/latex/register.d.ts +10 -11
- package/dist/plugins/latex/register.js +24 -10
- package/dist/plugins/latex/renderer.d.ts +9 -10
- package/dist/plugins/latex/renderer.js +9 -24
- package/dist/plugins/mermaid/MermaidBlock.svelte +63 -47
- package/dist/plugins/mermaid/index.js +1 -1
- package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
- package/dist/plugins/mermaid/mermaid-kind.js +30 -47
- package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
- package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
- package/dist/plugins/mermaid/register.d.ts +3 -3
- package/dist/plugins/mermaid/register.js +5 -5
- package/dist/plugins/mermaid/renderer.d.ts +5 -5
- package/dist/plugins/mermaid/renderer.js +8 -11
- package/dist/plugins/parrot/ParrotBlock.svelte +18 -7
- package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
- package/dist/plugins/parrot/parrot-plugin.js +3 -3
- package/dist/plugins/slash-commands/filter.d.ts +23 -0
- package/dist/plugins/slash-commands/filter.js +31 -0
- package/dist/plugins/slash-commands/index.d.ts +2 -0
- package/dist/plugins/slash-commands/index.js +2 -0
- package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
- package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
- package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
- package/dist/plugins/slash-commands/slash-source.js +108 -0
- package/dist/plugins/toc/TocBlock.svelte +23 -22
- package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
- package/dist/plugins/toc/heading-outline.d.ts +7 -12
- package/dist/plugins/toc/heading-outline.js +22 -36
- package/dist/plugins/toc/navigation-queue.d.ts +2 -4
- package/dist/plugins/toc/toc-plugin.d.ts +5 -5
- package/dist/plugins/toc/toc-plugin.js +20 -13
- package/dist/presentation-mode.d.ts +15 -23
- package/dist/presentation-mode.js +19 -25
- package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
- package/dist/reactivity/block-list-state.svelte.js +8 -9
- package/dist/reactivity/block-window.svelte.d.ts +12 -6
- package/dist/reactivity/block-window.svelte.js +44 -17
- package/dist/reactivity/child-list.d.ts +34 -0
- package/dist/reactivity/child-list.js +48 -0
- package/dist/reactivity/content-version.svelte.d.ts +4 -7
- package/dist/reactivity/content-version.svelte.js +3 -5
- package/dist/reactivity/hold-across.d.ts +39 -0
- package/dist/reactivity/hold-across.js +57 -0
- package/dist/reactivity/layout-state.svelte.d.ts +27 -0
- package/dist/reactivity/layout-state.svelte.js +51 -0
- package/dist/reactivity/list-tree.d.ts +39 -0
- package/dist/reactivity/list-tree.js +132 -0
- package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
- package/dist/reactivity/list-windowing.svelte.js +143 -292
- package/dist/reactivity/measure-batch.d.ts +6 -8
- package/dist/reactivity/measure-batch.js +5 -6
- package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
- package/dist/reactivity/publish-ref.svelte.js +21 -85
- package/dist/reactivity/scope-geometry.d.ts +6 -13
- package/dist/reactivity/scope-geometry.js +7 -14
- package/dist/reactivity/state-registry.d.ts +5 -5
- package/dist/reactivity/state-registry.js +11 -15
- package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
- package/dist/reactivity/use-container-windowing.svelte.js +64 -74
- package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
- package/dist/reactivity/use-measured-child.svelte.js +41 -0
- package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
- package/dist/reactivity/use-window-floor.svelte.js +27 -0
- package/dist/reactivity/window-slice.d.ts +4 -4
- package/dist/reactivity/window-slice.js +0 -2
- package/dist/renderer-slot.d.ts +48 -0
- package/dist/renderer-slot.js +85 -0
- package/dist/scan-index.d.ts +4 -4
- package/dist/scan-index.js +4 -4
- package/dist/schema/block-commands.d.ts +69 -54
- package/dist/schema/block-commands.js +91 -104
- package/dist/schema/block-completions.d.ts +16 -19
- package/dist/schema/block-completions.js +25 -32
- package/dist/schema/block-component-registry.d.ts +13 -14
- package/dist/schema/block-component-registry.js +19 -17
- package/dist/schema/block-kind-descriptor.d.ts +234 -168
- package/dist/schema/block-kind-descriptor.js +151 -66
- package/dist/schema/block-openers.d.ts +48 -39
- package/dist/schema/block-openers.js +73 -83
- package/dist/schema/built-in-descriptors.d.ts +3 -5
- package/dist/schema/built-in-descriptors.js +96 -80
- package/dist/schema/child-spans.d.ts +12 -10
- package/dist/schema/child-spans.js +68 -34
- package/dist/schema/closure.d.ts +18 -16
- package/dist/schema/closure.js +24 -14
- package/dist/schema/command-id.d.ts +6 -8
- package/dist/schema/command-id.js +20 -25
- package/dist/schema/commands.d.ts +79 -81
- package/dist/schema/commands.js +156 -116
- package/dist/schema/container-raw.d.ts +51 -11
- package/dist/schema/container-raw.js +143 -14
- package/dist/schema/container-rebuilders.d.ts +17 -15
- package/dist/schema/container-rebuilders.js +30 -22
- package/dist/schema/context-actions.d.ts +25 -13
- package/dist/schema/context-actions.js +32 -17
- package/dist/schema/define-plugin-block.d.ts +8 -6
- package/dist/schema/define-plugin-block.js +6 -4
- package/dist/schema/fenced-code-raw.d.ts +30 -17
- package/dist/schema/fenced-code-raw.js +155 -107
- package/dist/schema/global-commands.d.ts +6 -6
- package/dist/schema/global-commands.js +14 -22
- package/dist/schema/height-estimates.d.ts +31 -0
- package/dist/schema/height-estimates.js +64 -0
- package/dist/schema/inline-construct-policy.d.ts +42 -55
- package/dist/schema/inline-construct-policy.js +36 -35
- package/dist/schema/insert-catalogue.d.ts +30 -0
- package/dist/schema/insert-catalogue.js +95 -0
- package/dist/schema/keybinding-overrides.d.ts +9 -11
- package/dist/schema/keybinding-overrides.js +1 -1
- package/dist/schema/keybindings.d.ts +15 -7
- package/dist/schema/keybindings.js +21 -9
- package/dist/schema/merge-rules.d.ts +5 -7
- package/dist/schema/merge-rules.js +7 -9
- package/dist/schema/opener-priorities.d.ts +4 -4
- package/dist/schema/opener-priorities.js +4 -4
- package/dist/schema/operations.d.ts +9 -11
- package/dist/schema/operations.js +3 -3
- package/dist/schema/page-role.d.ts +14 -0
- package/dist/schema/page-role.js +19 -0
- package/dist/schema/plugin-activation.d.ts +4 -6
- package/dist/schema/plugin-activation.js +12 -10
- package/dist/schema/plugin-editor-context.d.ts +25 -10
- package/dist/schema/plugin-editor-context.js +40 -9
- package/dist/schema/plugin-install.d.ts +49 -17
- package/dist/schema/plugin-install.js +51 -25
- package/dist/schema/plugin-kind.d.ts +12 -8
- package/dist/schema/plugin-kind.js +35 -42
- package/dist/schema/plugin-name.js +3 -3
- package/dist/schema/plugin-registry.d.ts +54 -0
- package/dist/schema/plugin-registry.js +70 -0
- package/dist/schema/reading.d.ts +23 -0
- package/dist/schema/reading.js +7 -0
- package/dist/schema/register-once.d.ts +3 -5
- package/dist/schema/register-once.js +7 -16
- package/dist/schema/registration-checks.d.ts +12 -16
- package/dist/schema/registration-checks.js +35 -51
- package/dist/schema/registration-pairs.d.ts +54 -0
- package/dist/schema/registration-pairs.js +48 -0
- package/dist/schema/registration-pending.d.ts +8 -12
- package/dist/schema/registration-pending.js +9 -9
- package/dist/schema/registry-reset.d.ts +8 -4
- package/dist/schema/registry-reset.js +13 -26
- package/dist/schema/registry-view.d.ts +25 -13
- package/dist/schema/registry-view.js +26 -20
- package/dist/schema/reserved-chords.d.ts +9 -10
- package/dist/schema/reserved-chords.js +73 -78
- package/dist/schema/reserved-chrome.d.ts +12 -11
- package/dist/schema/reserved-chrome.js +15 -11
- package/dist/schema/setext-raw.d.ts +13 -0
- package/dist/schema/setext-raw.js +33 -0
- package/dist/schema/stored-as.d.ts +20 -0
- package/dist/schema/stored-as.js +6 -0
- package/dist/schema/table-cell-raw.d.ts +18 -7
- package/dist/schema/table-cell-raw.js +28 -7
- package/dist/schema/whole-block-unit.d.ts +5 -4
- package/dist/schema/whole-block-unit.js +5 -4
- package/dist/search/document-scan.d.ts +3 -3
- package/dist/search/document-scan.js +2 -2
- package/dist/search/matcher.d.ts +1 -1
- package/dist/search/regex-executor.d.ts +5 -6
- package/dist/search/regex-executor.js +6 -8
- package/dist/search/replace.d.ts +2 -5
- package/dist/search/replace.js +2 -5
- package/dist/search/search-state.svelte.d.ts +5 -5
- package/dist/search/search-state.svelte.js +12 -16
- package/dist/selection/autoscroll.d.ts +6 -9
- package/dist/selection/block-hit-test.d.ts +16 -24
- package/dist/selection/block-hit-test.js +29 -22
- package/dist/selection/caret-doors.d.ts +15 -14
- package/dist/selection/caret-doors.js +37 -26
- package/dist/selection/caret-landing.d.ts +62 -0
- package/dist/selection/caret-landing.js +157 -0
- package/dist/selection/caret-restore.d.ts +17 -10
- package/dist/selection/caret-restore.js +10 -22
- package/dist/selection/caret-target.d.ts +30 -0
- package/dist/selection/caret-target.js +84 -0
- package/dist/selection/char-endpoint-snap.d.ts +6 -10
- package/dist/selection/char-endpoint-snap.js +8 -14
- package/dist/selection/clipboard-text.d.ts +5 -12
- package/dist/selection/clipboard-text.js +69 -172
- package/dist/selection/covered-block.d.ts +6 -8
- package/dist/selection/covered-block.js +8 -19
- package/dist/selection/cross-block/clipboard.d.ts +3 -2
- package/dist/selection/cross-block/clipboard.js +13 -4
- package/dist/selection/cross-block/dispatch.d.ts +47 -43
- package/dist/selection/cross-block/dispatch.js +12 -23
- package/dist/selection/cross-block/format-range.d.ts +18 -21
- package/dist/selection/cross-block/format-range.js +104 -103
- package/dist/selection/cross-block/format-toggle.d.ts +10 -15
- package/dist/selection/cross-block/format-toggle.js +28 -33
- package/dist/selection/cross-block/keydown.d.ts +4 -4
- package/dist/selection/cross-block/keydown.js +93 -152
- package/dist/selection/cross-block/ops.d.ts +19 -34
- package/dist/selection/cross-block/ops.js +110 -95
- package/dist/selection/cross-block/paste.d.ts +2 -3
- package/dist/selection/cross-block/paste.js +61 -104
- package/dist/selection/cross-block/pointer.d.ts +17 -15
- package/dist/selection/cross-block/pointer.js +74 -25
- package/dist/selection/cross-block/type-replace.d.ts +4 -6
- package/dist/selection/cross-block/type-replace.js +53 -146
- package/dist/selection/dead-space-caret.d.ts +20 -28
- package/dist/selection/dead-space-caret.js +79 -87
- package/dist/selection/drag-pointer.d.ts +22 -5
- package/dist/selection/drag-pointer.js +63 -31
- package/dist/selection/gap-caret.d.ts +17 -28
- package/dist/selection/gap-caret.js +14 -26
- package/dist/selection/grid-selection.d.ts +12 -0
- package/dist/selection/grid-selection.js +22 -0
- package/dist/selection/keyboard-extend.d.ts +27 -39
- package/dist/selection/keyboard-extend.js +94 -116
- package/dist/selection/multi-click.d.ts +37 -0
- package/dist/selection/multi-click.js +197 -0
- package/dist/selection/native-bridge.d.ts +30 -37
- package/dist/selection/native-bridge.js +80 -100
- package/dist/selection/nearest-block.d.ts +17 -12
- package/dist/selection/nearest-block.js +37 -18
- package/dist/selection/path-lookup.d.ts +31 -14
- package/dist/selection/path-lookup.js +110 -20
- package/dist/selection/path-math.d.ts +9 -11
- package/dist/selection/path-math.js +5 -7
- package/dist/selection/pointer-gesture.d.ts +9 -0
- package/dist/selection/pointer-gesture.js +11 -0
- package/dist/selection/pointer-session.d.ts +10 -16
- package/dist/selection/pointer-session.js +6 -7
- package/dist/selection/primitives.d.ts +64 -33
- package/dist/selection/primitives.js +61 -53
- package/dist/selection/range-coverage.d.ts +94 -0
- package/dist/selection/range-coverage.js +365 -0
- package/dist/selection/range-delete-ceremony.d.ts +28 -74
- package/dist/selection/range-delete-ceremony.js +100 -141
- package/dist/selection/range-delete-chrome.d.ts +20 -33
- package/dist/selection/range-delete-chrome.js +53 -78
- package/dist/selection/range-delete-table-coverage.d.ts +11 -25
- package/dist/selection/range-delete-table-coverage.js +42 -112
- package/dist/selection/range-delete-table.d.ts +14 -12
- package/dist/selection/range-delete-table.js +106 -310
- package/dist/selection/range-delete.d.ts +18 -19
- package/dist/selection/range-delete.js +83 -123
- package/dist/selection/round-trip-restore.d.ts +18 -0
- package/dist/selection/round-trip-restore.js +19 -0
- package/dist/selection/selection-announcer.d.ts +17 -0
- package/dist/selection/selection-announcer.js +25 -0
- package/dist/selection/selection-description.d.ts +4 -3
- package/dist/selection/selection-description.js +5 -4
- package/dist/selection/selection-drop.d.ts +52 -0
- package/dist/selection/selection-drop.js +317 -0
- package/dist/selection/selection-restore.d.ts +20 -33
- package/dist/selection/selection-restore.js +21 -44
- package/dist/selection/selection-state.svelte.d.ts +50 -42
- package/dist/selection/selection-state.svelte.js +144 -98
- package/dist/selection/shared-keydown.d.ts +22 -27
- package/dist/selection/shared-keydown.js +25 -45
- package/dist/selection/table-endpoint-snap.d.ts +17 -41
- package/dist/selection/table-endpoint-snap.js +54 -80
- package/dist/selection/table-rect-extend.d.ts +3 -6
- package/dist/selection/table-rect-extend.js +19 -14
- package/dist/styles/editor-theme.css +75 -53
- package/dist/styles/editor.css +248 -139
- package/dist/testing/conformance-core.d.ts +50 -18
- package/dist/testing/conformance-core.js +88 -50
- package/dist/testing/container-conformance.d.ts +48 -84
- package/dist/testing/container-conformance.js +159 -285
- package/dist/testing/headless-actions.d.ts +34 -19
- package/dist/testing/headless-actions.js +116 -65
- package/dist/testing/headless-block-list.svelte.d.ts +16 -0
- package/dist/testing/headless-block-list.svelte.js +22 -0
- package/dist/testing/inline-conformance.d.ts +15 -22
- package/dist/testing/inline-conformance.js +131 -148
- package/dist/testing/kind-conformance.d.ts +19 -24
- package/dist/testing/kind-conformance.js +204 -117
- package/dist/testing/kit-reading.d.ts +7 -0
- package/dist/testing/kit-reading.js +16 -0
- package/dist/testing/mount-dom-stubs.d.ts +4 -5
- package/dist/testing/mount-dom-stubs.js +8 -5
- package/dist/testing/parse-convergence.d.ts +10 -10
- package/dist/testing/parse-convergence.js +14 -49
- package/dist/testing.d.ts +13 -9
- package/dist/testing.js +28 -38
- package/dist/tree-operations/blockquote.d.ts +8 -14
- package/dist/tree-operations/blockquote.js +25 -45
- package/dist/tree-operations/chain-rebuild.d.ts +34 -25
- package/dist/tree-operations/chain-rebuild.js +115 -52
- package/dist/tree-operations/children.d.ts +5 -9
- package/dist/tree-operations/children.js +7 -11
- package/dist/tree-operations/cleanup.d.ts +6 -7
- package/dist/tree-operations/cleanup.js +14 -11
- package/dist/tree-operations/clone.js +5 -4
- package/dist/tree-operations/container-lift.d.ts +10 -5
- package/dist/tree-operations/container-lift.js +20 -14
- package/dist/tree-operations/container-offsets.d.ts +22 -0
- package/dist/tree-operations/container-offsets.js +89 -0
- package/dist/tree-operations/content-write.d.ts +52 -29
- package/dist/tree-operations/content-write.js +155 -110
- package/dist/tree-operations/index.d.ts +4 -4
- package/dist/tree-operations/index.js +4 -4
- package/dist/tree-operations/keep-one-block.d.ts +10 -0
- package/dist/tree-operations/keep-one-block.js +19 -0
- package/dist/tree-operations/leaf-range.d.ts +33 -0
- package/dist/tree-operations/leaf-range.js +67 -0
- package/dist/tree-operations/list/empty-check.d.ts +2 -3
- package/dist/tree-operations/list/empty-check.js +4 -4
- package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
- package/dist/tree-operations/list/exit-replacement.js +4 -9
- package/dist/tree-operations/list/item-partition.d.ts +2 -2
- package/dist/tree-operations/list/item-partition.js +2 -2
- package/dist/tree-operations/list/list-builders.d.ts +18 -16
- package/dist/tree-operations/list/list-builders.js +59 -30
- package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
- package/dist/tree-operations/list/ordered-markers.js +7 -16
- package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
- package/dist/tree-operations/list/reconcile-task.js +80 -23
- package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
- package/dist/tree-operations/list/sublist-separator.js +20 -27
- package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
- package/dist/tree-operations/list/task-paragraph.js +54 -0
- package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
- package/dist/tree-operations/list/unwrap-merge.js +44 -79
- package/dist/tree-operations/node-ops.d.ts +30 -52
- package/dist/tree-operations/node-ops.js +152 -218
- package/dist/tree-operations/node-primitives.d.ts +44 -31
- package/dist/tree-operations/node-primitives.js +84 -60
- package/dist/tree-operations/open-tail.d.ts +25 -0
- package/dist/tree-operations/open-tail.js +100 -0
- package/dist/tree-operations/parse-block.d.ts +15 -2
- package/dist/tree-operations/parse-block.js +19 -4
- package/dist/tree-operations/paste/apply.d.ts +7 -8
- package/dist/tree-operations/paste/apply.js +33 -63
- package/dist/tree-operations/paste/body-write.d.ts +8 -6
- package/dist/tree-operations/paste/body-write.js +13 -14
- package/dist/tree-operations/paste/container-match.d.ts +7 -10
- package/dist/tree-operations/paste/container-match.js +76 -58
- package/dist/tree-operations/paste/container-paste.d.ts +3 -3
- package/dist/tree-operations/paste/container-paste.js +3 -3
- package/dist/tree-operations/paste/dispatch.d.ts +26 -29
- package/dist/tree-operations/paste/dispatch.js +68 -53
- package/dist/tree-operations/paste/focus-target.d.ts +11 -14
- package/dist/tree-operations/paste/focus-target.js +13 -18
- package/dist/tree-operations/paste/hooks.d.ts +7 -12
- package/dist/tree-operations/paste/hooks.js +49 -46
- package/dist/tree-operations/paste/line-ending.d.ts +11 -0
- package/dist/tree-operations/paste/line-ending.js +32 -0
- package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
- package/dist/tree-operations/paste/list-absorb.js +17 -19
- package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
- package/dist/tree-operations/paste/list-break-out.js +24 -32
- package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
- package/dist/tree-operations/paste/parent-scope.js +9 -16
- package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
- package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
- package/dist/tree-operations/paste/paste-replacement.js +73 -42
- package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
- package/dist/tree-operations/paste/paste-transforms.js +18 -27
- package/dist/tree-operations/paste/replacement-parse.d.ts +19 -0
- package/dist/tree-operations/paste/replacement-parse.js +24 -0
- package/dist/tree-operations/paste/strategy.d.ts +1 -1
- package/dist/tree-operations/paste/strategy.js +1 -1
- package/dist/tree-operations/paste/table-slice.js +15 -10
- package/dist/tree-operations/paste-surfaces.d.ts +18 -29
- package/dist/tree-operations/paste-surfaces.js +14 -10
- package/dist/tree-operations/path-mutate.d.ts +7 -8
- package/dist/tree-operations/path-mutate.js +4 -4
- package/dist/tree-operations/reorder-unit.d.ts +4 -5
- package/dist/tree-operations/reorder-unit.js +5 -6
- package/dist/tree-operations/reorder.d.ts +7 -9
- package/dist/tree-operations/reorder.js +39 -40
- package/dist/tree-operations/settle.d.ts +42 -53
- package/dist/tree-operations/settle.js +241 -162
- package/dist/tree-operations/sharing.d.ts +5 -5
- package/dist/tree-operations/splice-many.d.ts +5 -5
- package/dist/tree-operations/splice-many.js +5 -5
- package/dist/tree-operations/stored-as.d.ts +13 -0
- package/dist/tree-operations/stored-as.js +48 -0
- package/dist/tree-operations/structural-change.d.ts +11 -15
- package/dist/tree-operations/structural-change.js +10 -14
- package/dist/tree-operations/structural-suffix.d.ts +22 -0
- package/dist/tree-operations/structural-suffix.js +61 -0
- package/dist/tree-operations/sub-table-copy.d.ts +7 -0
- package/dist/tree-operations/sub-table-copy.js +40 -36
- package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
- package/dist/tree-operations/table-grid-clipboard.js +11 -36
- package/dist/tree-operations/table-mutations.d.ts +7 -3
- package/dist/tree-operations/table-mutations.js +45 -9
- package/dist/tree-operations/unshare.d.ts +11 -15
- package/dist/tree-operations/unshare.js +15 -17
- package/dist/undo/manager.js +1 -1
- package/dist/undo/types.d.ts +2 -2
- package/docs/guide/consumer-guide.md +329 -205
- package/docs/guide/directives.md +7 -7
- package/docs/guide/plugin-api.md +267 -183
- package/docs/guide/plugin-guide.md +341 -235
- package/docs/guide/plugin-testing.md +96 -82
- package/package.json +17 -21
- package/dist/ambient/ambient-cursor.d.ts +0 -41
- package/dist/ambient/ambient-cursor.js +0 -120
- package/dist/components/blocks/code/code-paste.d.ts +0 -24
- package/dist/components/blocks/code/code-paste.js +0 -21
- package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
- package/dist/components/blocks/table/cell-clipboard.js +0 -67
- package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
- package/dist/components/blocks/text/hidden-suffix.js +0 -15
- package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
- package/dist/components/image/image-source-bytes.d.ts +0 -15
- package/dist/components/image/image-source-bytes.js +0 -80
- package/dist/cursor/content-offsets.d.ts +0 -29
- package/dist/cursor/content-offsets.js +0 -151
- package/dist/cursor/reveal-anchor.d.ts +0 -30
- package/dist/cursor/reveal-anchor.js +0 -31
- package/dist/invariants/split-landing.d.ts +0 -8
- package/dist/invariants/split-landing.js +0 -15
- package/dist/selection/double-click-trim.d.ts +0 -17
- package/dist/selection/double-click-trim.js +0 -57
- package/dist/tree-operations/list/terminator.d.ts +0 -17
- package/dist/tree-operations/list/terminator.js +0 -60
- package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -29
- package/dist/tree-operations/paste/replace-block-at-parent.js +0 -75
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The inline menu's rules: which source a just-typed trigger opens, where in a line of prose it
|
|
3
|
+
* may open at all, and what an open session's query is now. Pure, so all three are testable
|
|
4
|
+
* without an editor.
|
|
5
|
+
*/
|
|
6
|
+
import { constructContentRange } from '../core/inline';
|
|
7
|
+
import { isInlineWidgetKind } from '../core/inline/inline-widgets';
|
|
8
|
+
import { getInlineConstructPolicy } from '../schema/inline-construct-policy';
|
|
9
|
+
/** The source a just-typed run opens; `from` is where the run began, since a burst of keystrokes
|
|
10
|
+
* arrives as one change. The trigger nearest the caret wins, then the longer, so `[[` beats `[`. */
|
|
11
|
+
export function findOpening(sources, raw, caret, from) {
|
|
12
|
+
const candidates = [];
|
|
13
|
+
for (const source of sources) {
|
|
14
|
+
const length = source.trigger.length;
|
|
15
|
+
// A trigger counts when its last byte was typed in this run, so the second `[` of `[[`
|
|
16
|
+
// opens over a first one that was already there.
|
|
17
|
+
for (let end = Math.max(from + 1, length); end <= caret; end++) {
|
|
18
|
+
if (raw.startsWith(source.trigger, end - length)) {
|
|
19
|
+
candidates.push({ source, start: end - length, end });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
candidates.sort((a, b) => b.end - a.end || b.source.trigger.length - a.source.trigger.length);
|
|
24
|
+
for (const { source, start, end } of candidates) {
|
|
25
|
+
if (source.opensAt && !source.opensAt(raw, start))
|
|
26
|
+
continue;
|
|
27
|
+
if (!acceptsQuery(source, raw.slice(end, caret)))
|
|
28
|
+
continue;
|
|
29
|
+
return { source, start };
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/** Whether a trigger at this offset sits in prose the author is writing, as each construct's
|
|
34
|
+
* policy row declares: a link's text is prose, its destination and a code span are not. */
|
|
35
|
+
export function isProseOffset(nodes, offset, grammar) {
|
|
36
|
+
for (const node of nodes) {
|
|
37
|
+
if (offset < node.start || offset >= node.end)
|
|
38
|
+
continue;
|
|
39
|
+
const extent = proseExtent(node.kind, grammar);
|
|
40
|
+
if (extent === 'none')
|
|
41
|
+
return false;
|
|
42
|
+
if (extent === 'content') {
|
|
43
|
+
const content = constructContentRange(node);
|
|
44
|
+
if (!content || offset < content.start || offset >= content.end)
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return node.children ? isProseOffset(node.children, offset, grammar) : true;
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
// A widget kind with no row (a plugin's formula) shows source, never prose.
|
|
52
|
+
function proseExtent(kind, grammar) {
|
|
53
|
+
const declared = getInlineConstructPolicy(kind)?.prose;
|
|
54
|
+
return declared ?? (isInlineWidgetKind(kind, grammar) ? 'none' : 'all');
|
|
55
|
+
}
|
|
56
|
+
/** Whether the offset sits in a destination opened with `](` and not yet closed: those bytes are
|
|
57
|
+
* text until the `)` lands, so the inline tree has no link to decline. */
|
|
58
|
+
export function isUnclosedDestination(raw, offset) {
|
|
59
|
+
const lineStart = raw.lastIndexOf('\n', offset - 1) + 1;
|
|
60
|
+
for (let i = offset - 1; i >= lineStart; i--) {
|
|
61
|
+
if (raw[i] === ')')
|
|
62
|
+
return false;
|
|
63
|
+
// A `](` with no `[` before it on the line is text, so the scan keeps going back.
|
|
64
|
+
if (raw[i] === '(' && raw[i - 1] === ']' && raw.lastIndexOf('[', i - 2) >= lineStart) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
/** Where the just-typed run began, or null when the change from `previous` to `raw` is anything
|
|
71
|
+
* but bytes inserted to end at the caret (a deletion, a caret move, an edit elsewhere). */
|
|
72
|
+
export function typedRunStart(previous, raw, caret) {
|
|
73
|
+
const length = raw.length - previous.length;
|
|
74
|
+
if (length <= 0 || length > caret)
|
|
75
|
+
return null;
|
|
76
|
+
const from = caret - length;
|
|
77
|
+
return raw.slice(0, from) + raw.slice(caret) === previous ? from : null;
|
|
78
|
+
}
|
|
79
|
+
function acceptsQuery(source, query) {
|
|
80
|
+
return source.accepts ? source.accepts(query) : !/[\r\n]/.test(query);
|
|
81
|
+
}
|
|
82
|
+
/** The open session's query at this caret, or null once the session is over: the trigger is
|
|
83
|
+
* gone, the caret stepped in front of the query, or the source declines what was typed. */
|
|
84
|
+
export function sessionQuery(session, source, raw, caret) {
|
|
85
|
+
const queryStart = session.start + session.triggerLength;
|
|
86
|
+
if (caret < queryStart || caret > raw.length)
|
|
87
|
+
return null;
|
|
88
|
+
if (!raw.startsWith(source.trigger, session.start))
|
|
89
|
+
return null;
|
|
90
|
+
const query = raw.slice(queryStart, caret);
|
|
91
|
+
return acceptsQuery(source, query) ? query : null;
|
|
92
|
+
}
|
|
93
|
+
/** Step the active row, wrapping at both ends; a list of none has no active row. */
|
|
94
|
+
export function stepActive(index, delta, count) {
|
|
95
|
+
if (count === 0)
|
|
96
|
+
return 0;
|
|
97
|
+
return (index + delta + count) % count;
|
|
98
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One editor's inline-menu registry and the single session it can hold open. The session is
|
|
3
|
+
* identity only (source name, path, trigger start); the query and the replaced range are re-read
|
|
4
|
+
* from the live leaf after every edit and caret move, so nothing here can address bytes that moved.
|
|
5
|
+
*/
|
|
6
|
+
import type { DocumentView } from '../core/node-views';
|
|
7
|
+
import type { EditorEvents } from '../editor-events';
|
|
8
|
+
import type { PresentationMode } from '../presentation-mode';
|
|
9
|
+
import type { EditorSelection } from '../selection/primitives';
|
|
10
|
+
import type { InlineMenuItem, InlineMenuRegistry, InlineMenuSource } from './types';
|
|
11
|
+
import type { Reading } from '../schema/reading';
|
|
12
|
+
export interface InlineMenuStateDeps {
|
|
13
|
+
getDoc: () => DocumentView;
|
|
14
|
+
getSelection: () => EditorSelection | null;
|
|
15
|
+
getMode: () => PresentationMode;
|
|
16
|
+
events: EditorEvents;
|
|
17
|
+
/** This instance's id, so two editors on one page never give their lists the same DOM id. */
|
|
18
|
+
editorId: string;
|
|
19
|
+
/** The editor's resolver and grammar, so a trigger inside a construct reads as the render drew it. */
|
|
20
|
+
reading: Reading;
|
|
21
|
+
/** Splice `bytes` over `[start, end)` of the leaf at `path` as one undo entry, caret landing at
|
|
22
|
+
* `caretAfter` so the next key goes there; resolves to whether the leaf holds the bytes. */
|
|
23
|
+
commitRange: (path: number[], start: number, end: number, bytes: string, caretAfter: number) => Promise<boolean>;
|
|
24
|
+
/** One undo entry for a pick and the block its source inserts; `path` and `offset` are where undo
|
|
25
|
+
* puts the caret back when nothing is focused. */
|
|
26
|
+
undoStep: (path: number[], offset: number, run: () => Promise<unknown>) => Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
export interface InlineMenuState {
|
|
29
|
+
registry: InlineMenuRegistry;
|
|
30
|
+
/** The open session's raw range and list, or null. Reactive. */
|
|
31
|
+
getOpen(): InlineMenuOpenView | null;
|
|
32
|
+
/** The list element's DOM id, which `aria-controls` names. */
|
|
33
|
+
readonly listboxId: string;
|
|
34
|
+
/** The DOM id of the row a source gave this item id, which `aria-activedescendant` names. */
|
|
35
|
+
optionId(itemId: string): string;
|
|
36
|
+
/** What the editable at `path` must say about the list showing in it, or null when none is.
|
|
37
|
+
* The editable renders these itself; nothing writes onto its element. Reactive. */
|
|
38
|
+
comboboxFor(path: readonly number[]): InlineMenuCombobox | null;
|
|
39
|
+
move(delta: 1 | -1): void;
|
|
40
|
+
setActive(index: number): void;
|
|
41
|
+
/** Take a baseline for the caret's leaf if none is held; the host calls it at beforeinput,
|
|
42
|
+
* before the input's bytes exist. */
|
|
43
|
+
primeBaseline(): void;
|
|
44
|
+
/** Commit the active row, or the row at `index`. False with no row to commit. */
|
|
45
|
+
commit(index?: number): boolean;
|
|
46
|
+
close(): void;
|
|
47
|
+
dispose(): void;
|
|
48
|
+
}
|
|
49
|
+
/** The ids a focused editable points a screen reader at while an inline menu's list shows in it. */
|
|
50
|
+
export interface InlineMenuCombobox {
|
|
51
|
+
listboxId: string;
|
|
52
|
+
activeOptionId: string;
|
|
53
|
+
}
|
|
54
|
+
export interface InlineMenuOpenView {
|
|
55
|
+
source: InlineMenuSource;
|
|
56
|
+
path: number[];
|
|
57
|
+
start: number;
|
|
58
|
+
end: number;
|
|
59
|
+
query: string;
|
|
60
|
+
items: InlineMenuItem[];
|
|
61
|
+
activeIndex: number;
|
|
62
|
+
}
|
|
63
|
+
export declare function createInlineMenuState(deps: InlineMenuStateDeps): InlineMenuState;
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One editor's inline-menu registry and the single session it can hold open. The session is
|
|
3
|
+
* identity only (source name, path, trigger start); the query and the replaced range are re-read
|
|
4
|
+
* from the live leaf after every edit and caret move, so nothing here can address bytes that moved.
|
|
5
|
+
*/
|
|
6
|
+
import { tick } from 'svelte';
|
|
7
|
+
import { isProseKind } from '../core/inline';
|
|
8
|
+
import { resolvedInlineContent } from '../core/inline/inline-cache';
|
|
9
|
+
import { isGridKind } from '../schema/block-kind-descriptor';
|
|
10
|
+
import { isBlockNode, nodeAt } from '../tree-operations/node-primitives';
|
|
11
|
+
import { findOpening, isProseOffset, isUnclosedDestination, sessionQuery, stepActive, typedRunStart } from './inline-menu-session';
|
|
12
|
+
/** An item id as one DOM-id token, since a source may hand out `Meeting notes`. Every escape is
|
|
13
|
+
* reversible, so two ids a source kept distinct never collide in the page. */
|
|
14
|
+
function asIdToken(id) {
|
|
15
|
+
return id.replace(/[^A-Za-z0-9-]/gu, (char) => `_${char.codePointAt(0).toString(16)}_`);
|
|
16
|
+
}
|
|
17
|
+
/** Whether the leaf at `path` sits in a grid container's row, the way a table cell does. */
|
|
18
|
+
function isGridCell(doc, path) {
|
|
19
|
+
if (path.length < 2)
|
|
20
|
+
return false;
|
|
21
|
+
const parent = nodeAt(doc, path.slice(0, -1));
|
|
22
|
+
return parent !== null && isBlockNode(parent) && isGridKind(parent.kind);
|
|
23
|
+
}
|
|
24
|
+
export function createInlineMenuState(deps) {
|
|
25
|
+
const sources = new Map();
|
|
26
|
+
const listboxId = `${deps.editorId}-inline-menu`;
|
|
27
|
+
// A row is named after its own item, not its place in the list, so the row a narrower query
|
|
28
|
+
// leaves active keeps the id the attribute pointing at it already held.
|
|
29
|
+
const optionId = (itemId) => `${listboxId}-${asIdToken(itemId)}`;
|
|
30
|
+
let session = $state.raw(null);
|
|
31
|
+
/** The open session's path as one string, joined once per session rather than per read. */
|
|
32
|
+
const sessionPathKey = $derived(session === null ? '' : session.path.join());
|
|
33
|
+
let query = $state('');
|
|
34
|
+
let end = $state(0);
|
|
35
|
+
let items = $state.raw([]);
|
|
36
|
+
let activeIndex = $state(0);
|
|
37
|
+
let pendingRead = null;
|
|
38
|
+
/**
|
|
39
|
+
* The caret's leaf as the last read saw it. A trigger is the difference from these bytes, so a
|
|
40
|
+
* caret that merely arrives beside an existing `#` has typed nothing and opens nothing.
|
|
41
|
+
*/
|
|
42
|
+
let seen = null;
|
|
43
|
+
/** Set once a read has been held back, so the next change a caret cannot explain is adopted. */
|
|
44
|
+
let heldBack = false;
|
|
45
|
+
/** True across a write of this menu's own, whose bytes are not the author's typing. */
|
|
46
|
+
let writing = false;
|
|
47
|
+
let scheduled = false;
|
|
48
|
+
let disposed = false;
|
|
49
|
+
function report(error, source) {
|
|
50
|
+
const payload = { origin: 'subscriber', error, context: { source } };
|
|
51
|
+
deps.events.emit('error', payload);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The collapsed caret in a prose leaf, with that leaf: the only place a session lives. Never a
|
|
55
|
+
* table cell, whose line cannot take the blocks a pick may insert.
|
|
56
|
+
*/
|
|
57
|
+
function caretLeaf() {
|
|
58
|
+
const selection = deps.getSelection();
|
|
59
|
+
if (!selection)
|
|
60
|
+
return null;
|
|
61
|
+
const { anchor, focus } = selection;
|
|
62
|
+
if (anchor.cellCoordinate || focus.cellCoordinate)
|
|
63
|
+
return null;
|
|
64
|
+
if (anchor.offset !== focus.offset || anchor.path.join() !== focus.path.join())
|
|
65
|
+
return null;
|
|
66
|
+
const doc = deps.getDoc();
|
|
67
|
+
const leaf = nodeAt(doc, focus.path);
|
|
68
|
+
if (leaf === null || !isBlockNode(leaf) || !isProseKind(leaf.kind))
|
|
69
|
+
return null;
|
|
70
|
+
if (isGridCell(doc, focus.path))
|
|
71
|
+
return null;
|
|
72
|
+
return { path: focus.path, offset: focus.offset, leaf };
|
|
73
|
+
}
|
|
74
|
+
function nodeRaw(path) {
|
|
75
|
+
const leaf = nodeAt(deps.getDoc(), path);
|
|
76
|
+
return leaf !== null && isBlockNode(leaf) ? leaf.raw : '';
|
|
77
|
+
}
|
|
78
|
+
function close() {
|
|
79
|
+
pendingRead?.abort();
|
|
80
|
+
pendingRead = null;
|
|
81
|
+
if (session === null)
|
|
82
|
+
return;
|
|
83
|
+
session = null;
|
|
84
|
+
items = [];
|
|
85
|
+
query = '';
|
|
86
|
+
activeIndex = 0;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The list with at most one row per id. Two rows under one id are one row to the render, which
|
|
90
|
+
* keys on it, so the later one is dropped and the source told rather than left to misdraw.
|
|
91
|
+
*/
|
|
92
|
+
function uniqueRows(list, source) {
|
|
93
|
+
const ids = new Set();
|
|
94
|
+
const kept = [];
|
|
95
|
+
for (const row of list) {
|
|
96
|
+
if (ids.has(row.id))
|
|
97
|
+
continue;
|
|
98
|
+
ids.add(row.id);
|
|
99
|
+
kept.push(row);
|
|
100
|
+
}
|
|
101
|
+
if (kept.length !== list.length) {
|
|
102
|
+
report(new Error(`inlineMenus: source '${source}' offered rows sharing an id; all but the first ` +
|
|
103
|
+
`of each were dropped`), source);
|
|
104
|
+
}
|
|
105
|
+
return kept;
|
|
106
|
+
}
|
|
107
|
+
function read(source, live) {
|
|
108
|
+
pendingRead?.abort();
|
|
109
|
+
const controller = new AbortController();
|
|
110
|
+
pendingRead = controller;
|
|
111
|
+
const isCurrent = () => session === live && !controller.signal.aborted;
|
|
112
|
+
const land = (next) => {
|
|
113
|
+
if (!isCurrent())
|
|
114
|
+
return;
|
|
115
|
+
items = uniqueRows(next, source.name);
|
|
116
|
+
activeIndex = Math.min(activeIndex, Math.max(0, items.length - 1));
|
|
117
|
+
};
|
|
118
|
+
const fail = (error) => {
|
|
119
|
+
if (!isCurrent())
|
|
120
|
+
return;
|
|
121
|
+
report(error, source.name);
|
|
122
|
+
land([]);
|
|
123
|
+
};
|
|
124
|
+
try {
|
|
125
|
+
const result = source.items({
|
|
126
|
+
query,
|
|
127
|
+
path: live.path,
|
|
128
|
+
start: live.start,
|
|
129
|
+
end,
|
|
130
|
+
signal: controller.signal
|
|
131
|
+
});
|
|
132
|
+
// A synchronous list lands in this same turn, so a fast source never paints a frame
|
|
133
|
+
// of the previous query's rows.
|
|
134
|
+
if (Array.isArray(result))
|
|
135
|
+
land(result);
|
|
136
|
+
else
|
|
137
|
+
result.then(land, fail);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
fail(error);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function evaluate() {
|
|
144
|
+
if (disposed)
|
|
145
|
+
return;
|
|
146
|
+
// An editor nobody registered a menu on pays nothing per keystroke.
|
|
147
|
+
if (sources.size === 0 && session === null)
|
|
148
|
+
return;
|
|
149
|
+
const caret = deps.getMode() === 'reading' ? null : caretLeaf();
|
|
150
|
+
const previous = seen;
|
|
151
|
+
seen = caret ? { path: caret.path.join(), raw: caret.leaf.raw } : null;
|
|
152
|
+
if (session !== null) {
|
|
153
|
+
const live = session;
|
|
154
|
+
const source = sources.get(live.source);
|
|
155
|
+
if (!caret || !source || caret.path.join() !== sessionPathKey)
|
|
156
|
+
return close();
|
|
157
|
+
const next = sessionQuery(live, source, caret.leaf.raw, caret.offset);
|
|
158
|
+
if (next === null)
|
|
159
|
+
return close();
|
|
160
|
+
if (next === query && caret.offset === end)
|
|
161
|
+
return;
|
|
162
|
+
query = next;
|
|
163
|
+
end = caret.offset;
|
|
164
|
+
activeIndex = 0;
|
|
165
|
+
read(source, live);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (writing || !caret || !previous || previous.path !== caret.path.join())
|
|
169
|
+
return;
|
|
170
|
+
const from = typedRunStart(previous.raw, caret.leaf.raw, caret.offset);
|
|
171
|
+
if (from === null) {
|
|
172
|
+
// The bytes and the caret can move separately, so the older snapshot is held one more read;
|
|
173
|
+
// a change the next caret still cannot explain is adopted, so `seen` never goes stale.
|
|
174
|
+
const unexplained = previous.raw !== caret.leaf.raw;
|
|
175
|
+
if (unexplained && !heldBack)
|
|
176
|
+
seen = previous;
|
|
177
|
+
heldBack = unexplained && !heldBack;
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
heldBack = false;
|
|
181
|
+
const opening = findOpening(sources.values(), caret.leaf.raw, caret.offset, from);
|
|
182
|
+
if (!opening)
|
|
183
|
+
return;
|
|
184
|
+
const inline = resolvedInlineContent(caret.leaf, deps.reading);
|
|
185
|
+
if (!isProseOffset(inline, opening.start, deps.reading.grammar))
|
|
186
|
+
return;
|
|
187
|
+
if (isUnclosedDestination(caret.leaf.raw, opening.start))
|
|
188
|
+
return;
|
|
189
|
+
begin(opening.source, caret.path, opening.start, caret.offset);
|
|
190
|
+
}
|
|
191
|
+
/** Takes a baseline for a leaf the caret reached with no read in between (a click, Enter onto
|
|
192
|
+
* a new line). Never replaces one: mid-burst, the standing baseline predates the trigger. */
|
|
193
|
+
function primeBaseline() {
|
|
194
|
+
if (disposed || sources.size === 0 || session !== null || writing)
|
|
195
|
+
return;
|
|
196
|
+
const caret = deps.getMode() === 'reading' ? null : caretLeaf();
|
|
197
|
+
if (!caret)
|
|
198
|
+
return;
|
|
199
|
+
const path = caret.path.join();
|
|
200
|
+
if (seen?.path !== path)
|
|
201
|
+
seen = { path, raw: caret.leaf.raw };
|
|
202
|
+
}
|
|
203
|
+
/** After a write of this menu's own: those bytes are not the author's typing. */
|
|
204
|
+
function resnap() {
|
|
205
|
+
const caret = caretLeaf();
|
|
206
|
+
seen = caret ? { path: caret.path.join(), raw: caret.leaf.raw } : null;
|
|
207
|
+
}
|
|
208
|
+
function begin(source, path, start, caret) {
|
|
209
|
+
const typedQuery = sessionQuery({ source: source.name, path, start, triggerLength: source.trigger.length }, source, nodeRaw(path), caret);
|
|
210
|
+
// `open()` may have written a query the source declines: that session is over already.
|
|
211
|
+
if (typedQuery === null)
|
|
212
|
+
return;
|
|
213
|
+
const live = {
|
|
214
|
+
source: source.name,
|
|
215
|
+
path: [...path],
|
|
216
|
+
start,
|
|
217
|
+
triggerLength: source.trigger.length
|
|
218
|
+
};
|
|
219
|
+
session = live;
|
|
220
|
+
// A burst can carry the query's first bytes in with the trigger.
|
|
221
|
+
query = typedQuery;
|
|
222
|
+
end = caret;
|
|
223
|
+
activeIndex = 0;
|
|
224
|
+
items = [];
|
|
225
|
+
read(source, live);
|
|
226
|
+
}
|
|
227
|
+
// Evaluated a tick later, so an edit and its selectionchange are one read. The baseline is
|
|
228
|
+
// taken now, since one event can carry a caret's arrival in a new leaf and its first bytes.
|
|
229
|
+
function schedule() {
|
|
230
|
+
if (disposed || (sources.size === 0 && session === null))
|
|
231
|
+
return;
|
|
232
|
+
primeBaseline();
|
|
233
|
+
if (scheduled)
|
|
234
|
+
return;
|
|
235
|
+
scheduled = true;
|
|
236
|
+
void tick().then(() => {
|
|
237
|
+
scheduled = false;
|
|
238
|
+
evaluate();
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
const unsubscribeEdit = deps.events.on('edit', schedule);
|
|
242
|
+
const unsubscribeSelection = deps.events.on('selectionChange', schedule);
|
|
243
|
+
const unsubscribeMode = deps.events.on('presentationModeChange', schedule);
|
|
244
|
+
async function commitItem(item) {
|
|
245
|
+
const live = session;
|
|
246
|
+
if (!live)
|
|
247
|
+
return;
|
|
248
|
+
// One entry for the pick's own bytes and every block its source writes after them.
|
|
249
|
+
await deps.undoStep(live.path, live.start, () => writePick(live, item));
|
|
250
|
+
}
|
|
251
|
+
async function writePick(live, item) {
|
|
252
|
+
const source = sources.get(live.source);
|
|
253
|
+
const range = { query, path: [...live.path], start: live.start, end };
|
|
254
|
+
close();
|
|
255
|
+
// One leaf's raw must not hold a blank line: the tree would say one paragraph where a
|
|
256
|
+
// reload reads two.
|
|
257
|
+
if (/[\r\n]/.test(item.insert)) {
|
|
258
|
+
report(new Error(`inlineMenus: source '${live.source}' offered an insert with a line break; a pick ` +
|
|
259
|
+
`writes one line of inline bytes, and a block belongs in onCommit`), live.source);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
const caretAfter = range.start + item.insert.length;
|
|
263
|
+
// The write is this menu's own, not a keystroke: bytes ending in a trigger reopen nothing.
|
|
264
|
+
writing = true;
|
|
265
|
+
try {
|
|
266
|
+
// A pick whose bytes never landed has nothing for onCommit to follow.
|
|
267
|
+
if (!(await deps.commitRange(range.path, range.start, range.end, item.insert, caretAfter))) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
// Nobody is waiting on this write, so a refused one has to be reported here or vanish.
|
|
273
|
+
report(error, live.source);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
writing = false;
|
|
278
|
+
resnap();
|
|
279
|
+
}
|
|
280
|
+
try {
|
|
281
|
+
await source?.onCommit?.(item, range);
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
report(error, live.source);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
function open(name, options) {
|
|
288
|
+
const source = sources.get(name);
|
|
289
|
+
const typed = source ? source.trigger + (options?.query ?? '') : '';
|
|
290
|
+
if (!source || deps.getMode() === 'reading' || /[\r\n]/.test(typed))
|
|
291
|
+
return false;
|
|
292
|
+
const caret = caretLeaf();
|
|
293
|
+
if (!caret)
|
|
294
|
+
return false;
|
|
295
|
+
close();
|
|
296
|
+
const start = caret.offset;
|
|
297
|
+
const caretAfter = start + typed.length;
|
|
298
|
+
void (async () => {
|
|
299
|
+
writing = true;
|
|
300
|
+
try {
|
|
301
|
+
if (!(await deps.commitRange(caret.path, start, start, typed, caretAfter)))
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
report(error, name);
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
finally {
|
|
309
|
+
writing = false;
|
|
310
|
+
resnap();
|
|
311
|
+
}
|
|
312
|
+
if (disposed || !sources.has(name))
|
|
313
|
+
return;
|
|
314
|
+
begin(source, caret.path, start, caretAfter);
|
|
315
|
+
})();
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
const registry = {
|
|
319
|
+
addSource(source) {
|
|
320
|
+
if (disposed) {
|
|
321
|
+
throw new Error(`inlineMenus.addSource: this editor is gone, so source '${source.name}' would ` +
|
|
322
|
+
`never open; add it from an onEditor callback and dispose it when that returns`);
|
|
323
|
+
}
|
|
324
|
+
if (sources.has(source.name)) {
|
|
325
|
+
throw new Error(`inlineMenus.addSource: a source named '${source.name}' already exists`);
|
|
326
|
+
}
|
|
327
|
+
if (source.trigger === '' || /[\r\n]/.test(source.trigger)) {
|
|
328
|
+
throw new Error(`inlineMenus.addSource: source '${source.name}' needs a trigger of one line that is ` +
|
|
329
|
+
`not empty; an empty trigger would open on every keystroke`);
|
|
330
|
+
}
|
|
331
|
+
// Nothing read the leaf while no source was registered, so the baseline is from before
|
|
332
|
+
// whatever was typed since; the next event takes a fresh one.
|
|
333
|
+
if (sources.size === 0) {
|
|
334
|
+
seen = null;
|
|
335
|
+
heldBack = false;
|
|
336
|
+
}
|
|
337
|
+
sources.set(source.name, source);
|
|
338
|
+
return {
|
|
339
|
+
dispose: () => {
|
|
340
|
+
if (sources.get(source.name) !== source)
|
|
341
|
+
return;
|
|
342
|
+
sources.delete(source.name);
|
|
343
|
+
if (session?.source === source.name)
|
|
344
|
+
close();
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
},
|
|
348
|
+
open,
|
|
349
|
+
close,
|
|
350
|
+
get isOpen() {
|
|
351
|
+
return session !== null && items.length > 0;
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
return {
|
|
355
|
+
registry,
|
|
356
|
+
listboxId,
|
|
357
|
+
optionId,
|
|
358
|
+
comboboxFor(path) {
|
|
359
|
+
if (session === null || items.length === 0)
|
|
360
|
+
return null;
|
|
361
|
+
if (sessionPathKey !== path.join())
|
|
362
|
+
return null;
|
|
363
|
+
return { listboxId, activeOptionId: optionId(items[activeIndex].id) };
|
|
364
|
+
},
|
|
365
|
+
getOpen() {
|
|
366
|
+
if (session === null)
|
|
367
|
+
return null;
|
|
368
|
+
const source = sources.get(session.source);
|
|
369
|
+
if (!source)
|
|
370
|
+
return null;
|
|
371
|
+
return {
|
|
372
|
+
source,
|
|
373
|
+
path: session.path,
|
|
374
|
+
start: session.start,
|
|
375
|
+
end,
|
|
376
|
+
query,
|
|
377
|
+
items,
|
|
378
|
+
activeIndex
|
|
379
|
+
};
|
|
380
|
+
},
|
|
381
|
+
move(delta) {
|
|
382
|
+
activeIndex = stepActive(activeIndex, delta, items.length);
|
|
383
|
+
},
|
|
384
|
+
setActive(index) {
|
|
385
|
+
if (index >= 0 && index < items.length)
|
|
386
|
+
activeIndex = index;
|
|
387
|
+
},
|
|
388
|
+
commit(index) {
|
|
389
|
+
// Enter can beat the last keystroke's read, and even its deferred edit event; read the
|
|
390
|
+
// leaf now so the pick replaces the query it holds, not the one last read.
|
|
391
|
+
evaluate();
|
|
392
|
+
const item = items[index ?? activeIndex];
|
|
393
|
+
if (!item)
|
|
394
|
+
return false;
|
|
395
|
+
void commitItem(item);
|
|
396
|
+
return true;
|
|
397
|
+
},
|
|
398
|
+
close,
|
|
399
|
+
primeBaseline,
|
|
400
|
+
dispose() {
|
|
401
|
+
disposed = true;
|
|
402
|
+
close();
|
|
403
|
+
sources.clear();
|
|
404
|
+
unsubscribeEdit();
|
|
405
|
+
unsubscribeSelection();
|
|
406
|
+
unsubscribeMode();
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline menus: a list the editor opens under the caret while the author types after a trigger,
|
|
3
|
+
* `#` for a tag or `[[` for a link. The editor owns what a host cannot do from outside without
|
|
4
|
+
* racing it: spotting the trigger as it is typed, holding the navigation keys while the list is
|
|
5
|
+
* up, and replacing the typed range with the pick as one undo entry. A source supplies the rest.
|
|
6
|
+
*/
|
|
7
|
+
import type { Component } from 'svelte';
|
|
8
|
+
import type { MenuIconName } from '../menu-icons';
|
|
9
|
+
export interface InlineMenuItem {
|
|
10
|
+
/** The row's key, unique within one result list. Where two rows share one, the first is kept
|
|
11
|
+
* and the rest are dropped and reported on the `error` event. */
|
|
12
|
+
id: string;
|
|
13
|
+
label: string;
|
|
14
|
+
/** Secondary text painted dim beside the label: a path, a count. */
|
|
15
|
+
detail?: string;
|
|
16
|
+
/** A menu glyph drawn before the label by the default row. */
|
|
17
|
+
icon?: MenuIconName;
|
|
18
|
+
/** The bytes that replace the trigger and the query, the caret after them. One line: a line break
|
|
19
|
+
* is refused and reported, and a block-level insert is `onCommit`'s job. Empty is legal. */
|
|
20
|
+
insert: string;
|
|
21
|
+
}
|
|
22
|
+
export interface InlineMenuQuery {
|
|
23
|
+
/** What the author typed after the trigger, up to the caret. */
|
|
24
|
+
query: string;
|
|
25
|
+
/** The leaf the session lives in. */
|
|
26
|
+
path: readonly number[];
|
|
27
|
+
/** The raw range a pick replaces: the trigger's first byte to the caret. */
|
|
28
|
+
start: number;
|
|
29
|
+
end: number;
|
|
30
|
+
/** Aborted once a later keystroke supersedes this read, or the menu closes. */
|
|
31
|
+
signal: AbortSignal;
|
|
32
|
+
}
|
|
33
|
+
export interface InlineMenuRowProps {
|
|
34
|
+
item: InlineMenuItem;
|
|
35
|
+
active: boolean;
|
|
36
|
+
query: string;
|
|
37
|
+
}
|
|
38
|
+
export interface InlineMenuSource {
|
|
39
|
+
/** Unique per editor; the name `open()` addresses. */
|
|
40
|
+
name: string;
|
|
41
|
+
/**
|
|
42
|
+
* The typed opener, one line and never empty; `addSource` throws otherwise. Where two sources'
|
|
43
|
+
* triggers both end at the caret, the longer wins.
|
|
44
|
+
*/
|
|
45
|
+
trigger: string;
|
|
46
|
+
/** Whether a trigger whose first byte is `raw[pos]` opens (absent: anywhere), so a tag can
|
|
47
|
+
* decline mid-word and `C#` stays text. `open()` never asks. */
|
|
48
|
+
opensAt?(raw: string, pos: number): boolean;
|
|
49
|
+
/** Whether the session outlives this query. Absent means any query without a line break. */
|
|
50
|
+
accepts?(query: string): boolean;
|
|
51
|
+
/** The list for a query. An empty list hides the menu and releases the keys but keeps the
|
|
52
|
+
* session; a rejected promise reads as empty and is reported on the `error` event. */
|
|
53
|
+
items(query: InlineMenuQuery): InlineMenuItem[] | Promise<InlineMenuItem[]>;
|
|
54
|
+
/** Runs after the pick's bytes land, with the caret at `start + insert.length`. Writes made while
|
|
55
|
+
* a returned promise is pending join the pick's undo entry, so await them. */
|
|
56
|
+
onCommit?(item: InlineMenuItem, query: Omit<InlineMenuQuery, 'signal'>): void | Promise<void>;
|
|
57
|
+
/** Paints one row's content in place of the default label and detail. */
|
|
58
|
+
row?: Component<InlineMenuRowProps>;
|
|
59
|
+
}
|
|
60
|
+
export interface InlineMenuSourceHandle {
|
|
61
|
+
dispose(): void;
|
|
62
|
+
}
|
|
63
|
+
export interface InlineMenuOpenOptions {
|
|
64
|
+
/** Typed after the trigger, so the list opens already narrowed. */
|
|
65
|
+
query?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface InlineMenuRegistry {
|
|
68
|
+
addSource(source: InlineMenuSource): InlineMenuSourceHandle;
|
|
69
|
+
/** Types the source's trigger and `options.query` at the caret as one undo entry and opens the
|
|
70
|
+
* menu. False, writing nothing, for an unknown name, reading mode, no prose caret, or a newline. */
|
|
71
|
+
open(name: string, options?: InlineMenuOpenOptions): boolean;
|
|
72
|
+
/** Close the open menu, leaving what was typed. */
|
|
73
|
+
close(): void;
|
|
74
|
+
/** True while a list is on screen, which is also while the editor holds the arrow keys, Enter,
|
|
75
|
+
* Tab and Escape for it. Getter-backed, live. Change signal: the `menuChange` event. */
|
|
76
|
+
readonly isOpen: boolean;
|
|
77
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline menus: a list the editor opens under the caret while the author types after a trigger,
|
|
3
|
+
* `#` for a tag or `[[` for a link. The editor owns what a host cannot do from outside without
|
|
4
|
+
* racing it: spotting the trigger as it is typed, holding the navigation keys while the list is
|
|
5
|
+
* up, and replacing the typed range with the pick as one undo entry. A source supplies the rest.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A keyed container's `childIds` hold one id per child, at every depth: a container whose
|
|
3
|
+
* `children` outgrow its ids hands the keyed each block undefined keys, and the redraw after undo
|
|
4
|
+
* reconciles to something other than the tree. A container that never mounted has no `childIds`
|
|
5
|
+
* yet and passes, unless the caller seeded every container first and asks for `everyKeyed`.
|
|
6
|
+
*/
|
|
7
|
+
import type { NodeView } from '../core/node-views';
|
|
8
|
+
import type { InvariantViolation } from '../assert';
|
|
9
|
+
export interface ChildIdDrift {
|
|
10
|
+
/** Child indices from the checked node down to the container out of step. */
|
|
11
|
+
path: number[];
|
|
12
|
+
kind: string;
|
|
13
|
+
children: number;
|
|
14
|
+
ids: number | undefined;
|
|
15
|
+
/** The kinds from the checked node down, for a message a reader can follow. */
|
|
16
|
+
trail: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ChildIdParityOptions {
|
|
19
|
+
everyKeyed?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function checkChildIdParity(node: NodeView, options?: ChildIdParityOptions): InvariantViolation | null;
|
|
22
|
+
/** Every container under `node` (itself included) whose ids are out of step, in document order. */
|
|
23
|
+
export declare function childIdDrifts(node: NodeView, options?: ChildIdParityOptions, limit?: number): ChildIdDrift[];
|