@voithos-labs/aragonite 0.10.1
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/LICENSE +661 -0
- package/README.md +365 -0
- package/THIRD-PARTY-NOTICES.md +102 -0
- package/dist/a11y-strings.d.ts +46 -0
- package/dist/a11y-strings.js +62 -0
- package/dist/action-contracts.d.ts +301 -0
- package/dist/action-contracts.js +5 -0
- package/dist/active-editor.d.ts +16 -0
- package/dist/active-editor.js +67 -0
- package/dist/ambient/ambient-cursor.d.ts +41 -0
- package/dist/ambient/ambient-cursor.js +120 -0
- package/dist/ambient/ambient-dom.d.ts +9 -0
- package/dist/ambient/ambient-dom.js +102 -0
- package/dist/assert.d.ts +6 -0
- package/dist/assert.js +17 -0
- package/dist/block-component.d.ts +274 -0
- package/dist/block-component.js +43 -0
- package/dist/block-id.d.ts +14 -0
- package/dist/block-id.js +34 -0
- package/dist/bounded-memo.d.ts +14 -0
- package/dist/bounded-memo.js +32 -0
- package/dist/components/BlockDragHandle.svelte +66 -0
- package/dist/components/BlockDragHandle.svelte.d.ts +18 -0
- package/dist/components/BlockHost.svelte +328 -0
- package/dist/components/BlockHost.svelte.d.ts +15 -0
- package/dist/components/BlockList.svelte +114 -0
- package/dist/components/BlockList.svelte.d.ts +16 -0
- package/dist/components/DecorationOverlay.svelte +156 -0
- package/dist/components/DecorationOverlay.svelte.d.ts +14 -0
- package/dist/components/Editor.svelte +1849 -0
- package/dist/components/Editor.svelte.d.ts +49 -0
- package/dist/components/GapCaret.svelte +226 -0
- package/dist/components/GapCaret.svelte.d.ts +9 -0
- package/dist/components/SearchBar.svelte +243 -0
- package/dist/components/SearchBar.svelte.d.ts +7 -0
- package/dist/components/SelectionOverlay.svelte +171 -0
- package/dist/components/SelectionOverlay.svelte.d.ts +14 -0
- package/dist/components/block-content-selector.d.ts +12 -0
- package/dist/components/block-content-selector.js +12 -0
- package/dist/components/blocks/BlockquoteBlock.svelte +32 -0
- package/dist/components/blocks/BlockquoteBlock.svelte.d.ts +11 -0
- package/dist/components/blocks/ThematicBreakBlock.svelte +156 -0
- package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +17 -0
- package/dist/components/blocks/code/CodeBlock.svelte +726 -0
- package/dist/components/blocks/code/CodeBlock.svelte.d.ts +23 -0
- package/dist/components/blocks/code/CodeLanguageChip.svelte +127 -0
- package/dist/components/blocks/code/CodeLanguageChip.svelte.d.ts +14 -0
- package/dist/components/blocks/code/code-beforeinput.d.ts +30 -0
- package/dist/components/blocks/code/code-beforeinput.js +40 -0
- package/dist/components/blocks/code/code-bootstrap.d.ts +8 -0
- package/dist/components/blocks/code/code-bootstrap.js +54 -0
- package/dist/components/blocks/code/code-editing.d.ts +28 -0
- package/dist/components/blocks/code/code-editing.js +79 -0
- package/dist/components/blocks/code/code-enter.d.ts +22 -0
- package/dist/components/blocks/code/code-enter.js +19 -0
- package/dist/components/blocks/code/code-fence-boundary.d.ts +77 -0
- package/dist/components/blocks/code/code-fence-boundary.js +169 -0
- package/dist/components/blocks/code/code-fence-exit.d.ts +24 -0
- package/dist/components/blocks/code/code-fence-exit.js +36 -0
- package/dist/components/blocks/code/code-indent.d.ts +14 -0
- package/dist/components/blocks/code/code-indent.js +87 -0
- package/dist/components/blocks/code/code-languages.d.ts +15 -0
- package/dist/components/blocks/code/code-languages.js +30 -0
- package/dist/components/blocks/code/code-paste-surface.d.ts +6 -0
- package/dist/components/blocks/code/code-paste-surface.js +29 -0
- package/dist/components/blocks/code/code-paste.d.ts +24 -0
- package/dist/components/blocks/code/code-paste.js +21 -0
- package/dist/components/blocks/code/code-renderer.d.ts +18 -0
- package/dist/components/blocks/code/code-renderer.js +249 -0
- package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +51 -0
- package/dist/components/blocks/directive/DirectiveContainerBlock.svelte.d.ts +11 -0
- package/dist/components/blocks/directive/activate-directives.d.ts +7 -0
- package/dist/components/blocks/directive/activate-directives.js +23 -0
- package/dist/components/blocks/editable-leaf.d.ts +126 -0
- package/dist/components/blocks/editable-leaf.js +410 -0
- package/dist/components/blocks/editable-surface.d.ts +209 -0
- package/dist/components/blocks/editable-surface.js +331 -0
- package/dist/components/blocks/list/ListBlock.svelte +162 -0
- package/dist/components/blocks/list/ListBlock.svelte.d.ts +11 -0
- package/dist/components/blocks/list/ListItemBlock.svelte +324 -0
- package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +14 -0
- package/dist/components/blocks/list/task-checkbox.d.ts +3 -0
- package/dist/components/blocks/list/task-checkbox.js +33 -0
- package/dist/components/blocks/plain-text-backend.d.ts +21 -0
- package/dist/components/blocks/plain-text-backend.js +47 -0
- package/dist/components/blocks/surface-wiring.svelte.d.ts +18 -0
- package/dist/components/blocks/surface-wiring.svelte.js +68 -0
- package/dist/components/blocks/table/TableActionMenu.svelte +267 -0
- package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +15 -0
- package/dist/components/blocks/table/TableBlock.svelte +765 -0
- package/dist/components/blocks/table/TableBlock.svelte.d.ts +30 -0
- package/dist/components/blocks/table/TableCellBlock.svelte +1075 -0
- package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +30 -0
- package/dist/components/blocks/table/TableGrip.svelte +91 -0
- package/dist/components/blocks/table/TableGrip.svelte.d.ts +8 -0
- package/dist/components/blocks/table/TableRowBlock.svelte +233 -0
- package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +34 -0
- package/dist/components/blocks/table/cell-clipboard.d.ts +23 -0
- package/dist/components/blocks/table/cell-clipboard.js +34 -0
- package/dist/components/blocks/table/cell-keydown-plan.d.ts +37 -0
- package/dist/components/blocks/table/cell-keydown-plan.js +66 -0
- package/dist/components/blocks/table/cell-pointer.d.ts +58 -0
- package/dist/components/blocks/table/cell-pointer.js +153 -0
- package/dist/components/blocks/table/cell-render.d.ts +51 -0
- package/dist/components/blocks/table/cell-render.js +98 -0
- package/dist/components/blocks/table/cell-table-commands.d.ts +12 -0
- package/dist/components/blocks/table/cell-table-commands.js +21 -0
- package/dist/components/blocks/table/cell-x-mapping.d.ts +6 -0
- package/dist/components/blocks/table/cell-x-mapping.js +16 -0
- package/dist/components/blocks/table/selected-cells.d.ts +19 -0
- package/dist/components/blocks/table/selected-cells.js +35 -0
- package/dist/components/blocks/table/table-caret-at-point.d.ts +8 -0
- package/dist/components/blocks/table/table-caret-at-point.js +35 -0
- package/dist/components/blocks/table/table-cell-paste.d.ts +16 -0
- package/dist/components/blocks/table/table-cell-paste.js +75 -0
- package/dist/components/blocks/table/table-drag-hit-test.d.ts +5 -0
- package/dist/components/blocks/table/table-drag-hit-test.js +20 -0
- package/dist/components/blocks/table/table-drop-target.d.ts +1 -0
- package/dist/components/blocks/table/table-drop-target.js +16 -0
- package/dist/components/blocks/table/table-menu-model.d.ts +52 -0
- package/dist/components/blocks/table/table-menu-model.js +78 -0
- package/dist/components/blocks/table/table-navigation.d.ts +8 -0
- package/dist/components/blocks/table/table-navigation.js +22 -0
- package/dist/components/blocks/table/table-reorder-drag.d.ts +78 -0
- package/dist/components/blocks/table/table-reorder-drag.js +97 -0
- package/dist/components/blocks/text/TextEditableBlock.svelte +1012 -0
- package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +33 -0
- package/dist/components/blocks/text/click-snap-guard.d.ts +8 -0
- package/dist/components/blocks/text/click-snap-guard.js +19 -0
- package/dist/components/blocks/text/composition-seat.d.ts +50 -0
- package/dist/components/blocks/text/composition-seat.js +65 -0
- package/dist/components/blocks/text/construct-edge-delete.d.ts +47 -0
- package/dist/components/blocks/text/construct-edge-delete.js +164 -0
- package/dist/components/blocks/text/construct-reveal.d.ts +39 -0
- package/dist/components/blocks/text/construct-reveal.js +164 -0
- package/dist/components/blocks/text/edge-policy-dispatch.d.ts +91 -0
- package/dist/components/blocks/text/edge-policy-dispatch.js +457 -0
- package/dist/components/blocks/text/edge-seat.d.ts +42 -0
- package/dist/components/blocks/text/edge-seat.js +197 -0
- package/dist/components/blocks/text/hidden-suffix.d.ts +10 -0
- package/dist/components/blocks/text/hidden-suffix.js +15 -0
- package/dist/components/blocks/text/link-at-point.d.ts +33 -0
- package/dist/components/blocks/text/link-at-point.js +47 -0
- package/dist/components/blocks/text/link-source-bytes.d.ts +37 -0
- package/dist/components/blocks/text/link-source-bytes.js +161 -0
- package/dist/components/blocks/text/live-join-seam.d.ts +15 -0
- package/dist/components/blocks/text/live-join-seam.js +327 -0
- package/dist/components/blocks/text/live-selection-edit.d.ts +68 -0
- package/dist/components/blocks/text/live-selection-edit.js +120 -0
- package/dist/components/blocks/text/live-split-rebalance.d.ts +56 -0
- package/dist/components/blocks/text/live-split-rebalance.js +239 -0
- package/dist/components/blocks/text/marker-completion.d.ts +18 -0
- package/dist/components/blocks/text/marker-completion.js +29 -0
- package/dist/components/blocks/text/pending-mark-insert.d.ts +37 -0
- package/dist/components/blocks/text/pending-mark-insert.js +188 -0
- package/dist/components/blocks/text/screen-diff.d.ts +20 -0
- package/dist/components/blocks/text/screen-diff.js +39 -0
- package/dist/components/blocks/text/text-clipboard.d.ts +70 -0
- package/dist/components/blocks/text/text-clipboard.js +131 -0
- package/dist/components/blocks/text/text-keydown.d.ts +39 -0
- package/dist/components/blocks/text/text-keydown.js +80 -0
- package/dist/components/blocks/text/text-render.d.ts +67 -0
- package/dist/components/blocks/text/text-render.js +215 -0
- package/dist/components/blocks/text/widget-adjacency.d.ts +30 -0
- package/dist/components/blocks/text/widget-adjacency.js +68 -0
- package/dist/components/blocks/text/widget-interaction.d.ts +90 -0
- package/dist/components/blocks/text/widget-interaction.js +591 -0
- package/dist/components/blocks/widget-portal.d.ts +54 -0
- package/dist/components/blocks/widget-portal.js +136 -0
- package/dist/components/built-in-blocks.d.ts +7 -0
- package/dist/components/built-in-blocks.js +77 -0
- package/dist/components/editor-root-clipboard.d.ts +29 -0
- package/dist/components/editor-root-clipboard.js +105 -0
- package/dist/components/editor-root-keydown.d.ts +47 -0
- package/dist/components/editor-root-keydown.js +88 -0
- package/dist/components/editor-root-listeners.d.ts +44 -0
- package/dist/components/editor-root-listeners.js +112 -0
- package/dist/components/image/ImageOverlayHost.svelte +115 -0
- package/dist/components/image/ImageOverlayHost.svelte.d.ts +20 -0
- package/dist/components/image/ImageProperties.svelte +153 -0
- package/dist/components/image/ImageProperties.svelte.d.ts +14 -0
- package/dist/components/image/ImageResizeHandles.svelte +188 -0
- package/dist/components/image/ImageResizeHandles.svelte.d.ts +10 -0
- package/dist/components/image/image-edit-commit.d.ts +38 -0
- package/dist/components/image/image-edit-commit.js +159 -0
- package/dist/components/image/image-resize.d.ts +11 -0
- package/dist/components/image/image-resize.js +38 -0
- package/dist/components/image/image-source-bytes.d.ts +15 -0
- package/dist/components/image/image-source-bytes.js +73 -0
- package/dist/components/image/image-widget-editing.d.ts +7 -0
- package/dist/components/image/image-widget-editing.js +41 -0
- package/dist/components/image/widget-dom.d.ts +11 -0
- package/dist/components/image/widget-dom.js +110 -0
- package/dist/components/image/widget-selection-state.svelte.d.ts +18 -0
- package/dist/components/image/widget-selection-state.svelte.js +26 -0
- package/dist/components/link-card/LinkCard.svelte +190 -0
- package/dist/components/link-card/LinkCard.svelte.d.ts +18 -0
- package/dist/components/link-card/LinkCardHost.svelte +181 -0
- package/dist/components/link-card/LinkCardHost.svelte.d.ts +25 -0
- package/dist/components/link-card/link-card-commit.d.ts +50 -0
- package/dist/components/link-card/link-card-commit.js +134 -0
- package/dist/components/link-card/link-card-entry.d.ts +39 -0
- package/dist/components/link-card/link-card-entry.js +51 -0
- package/dist/components/link-card/link-card-state.svelte.d.ts +44 -0
- package/dist/components/link-card/link-card-state.svelte.js +46 -0
- package/dist/components/lrd-map-gate.d.ts +18 -0
- package/dist/components/lrd-map-gate.js +22 -0
- package/dist/components/paste-image-arm.d.ts +29 -0
- package/dist/components/paste-image-arm.js +61 -0
- package/dist/components/portal.d.ts +11 -0
- package/dist/components/portal.js +29 -0
- package/dist/core/directive/activate.d.ts +8 -0
- package/dist/core/directive/activate.js +25 -0
- package/dist/core/directive/container-opener.d.ts +7 -0
- package/dist/core/directive/container-opener.js +162 -0
- package/dist/core/directive/grammar.d.ts +50 -0
- package/dist/core/directive/grammar.js +88 -0
- package/dist/core/directive/kinds.d.ts +31 -0
- package/dist/core/directive/kinds.js +137 -0
- package/dist/core/directive/registry.d.ts +39 -0
- package/dist/core/directive/registry.js +49 -0
- package/dist/core/directive/text-recognizer.d.ts +8 -0
- package/dist/core/directive/text-recognizer.js +87 -0
- package/dist/core/escapable.d.ts +6 -0
- package/dist/core/escapable.js +6 -0
- package/dist/core/inline/backticks.d.ts +16 -0
- package/dist/core/inline/backticks.js +62 -0
- package/dist/core/inline/character-refs.d.ts +7 -0
- package/dist/core/inline/character-refs.js +70 -0
- package/dist/core/inline/destination-bytes.d.ts +7 -0
- package/dist/core/inline/destination-bytes.js +14 -0
- package/dist/core/inline/entity-widget.d.ts +11 -0
- package/dist/core/inline/entity-widget.js +21 -0
- package/dist/core/inline/format-toggle.d.ts +50 -0
- package/dist/core/inline/format-toggle.js +533 -0
- package/dist/core/inline/html-entities.d.ts +8 -0
- package/dist/core/inline/html-entities.js +2134 -0
- package/dist/core/inline/html-tag-grammar.d.ts +16 -0
- package/dist/core/inline/html-tag-grammar.js +58 -0
- package/dist/core/inline/image-dimensions.d.ts +6 -0
- package/dist/core/inline/image-dimensions.js +42 -0
- package/dist/core/inline/index.d.ts +42 -0
- package/dist/core/inline/index.js +77 -0
- package/dist/core/inline/inline-cache.d.ts +20 -0
- package/dist/core/inline/inline-cache.js +28 -0
- package/dist/core/inline/inline-widgets.d.ts +124 -0
- package/dist/core/inline/inline-widgets.js +131 -0
- package/dist/core/inline/link-reference-resolver.d.ts +21 -0
- package/dist/core/inline/link-reference-resolver.js +46 -0
- package/dist/core/inline/raw-html-widget.d.ts +10 -0
- package/dist/core/inline/raw-html-widget.js +22 -0
- package/dist/core/inline/scan/autolinks.d.ts +23 -0
- package/dist/core/inline/scan/autolinks.js +354 -0
- package/dist/core/inline/scan/brackets.d.ts +11 -0
- package/dist/core/inline/scan/brackets.js +284 -0
- package/dist/core/inline/scan/code-spans.d.ts +7 -0
- package/dist/core/inline/scan/code-spans.js +27 -0
- package/dist/core/inline/scan/emphasis.d.ts +10 -0
- package/dist/core/inline/scan/emphasis.js +276 -0
- package/dist/core/inline/scan/index.d.ts +7 -0
- package/dist/core/inline/scan/index.js +176 -0
- package/dist/core/inline/scan/plugin-syntax.d.ts +62 -0
- package/dist/core/inline/scan/plugin-syntax.js +150 -0
- package/dist/core/inline/scan/scan-state.d.ts +47 -0
- package/dist/core/inline/scan/scan-state.js +48 -0
- package/dist/core/inline/scan/simple-nodes.d.ts +14 -0
- package/dist/core/inline/scan/simple-nodes.js +53 -0
- package/dist/core/inline/scan/url.d.ts +12 -0
- package/dist/core/inline/scan/url.js +82 -0
- package/dist/core/inline/transparency.d.ts +8 -0
- package/dist/core/inline/transparency.js +39 -0
- package/dist/core/inline/visibility.d.ts +81 -0
- package/dist/core/inline/visibility.js +144 -0
- package/dist/core/inline/walk.d.ts +14 -0
- package/dist/core/inline/walk.js +29 -0
- package/dist/core/inline-render.d.ts +48 -0
- package/dist/core/inline-render.js +322 -0
- package/dist/core/lines.d.ts +44 -0
- package/dist/core/lines.js +91 -0
- package/dist/core/node-views.d.ts +22 -0
- package/dist/core/node-views.js +8 -0
- package/dist/core/nodes.d.ts +297 -0
- package/dist/core/nodes.js +83 -0
- package/dist/core/parser.d.ts +68 -0
- package/dist/core/parser.js +189 -0
- package/dist/core/parsers/blockquote.d.ts +17 -0
- package/dist/core/parsers/blockquote.js +69 -0
- package/dist/core/parsers/built-in-openers.d.ts +8 -0
- package/dist/core/parsers/built-in-openers.js +124 -0
- package/dist/core/parsers/fence-syntax.d.ts +24 -0
- package/dist/core/parsers/fence-syntax.js +44 -0
- package/dist/core/parsers/fenced-code.d.ts +7 -0
- package/dist/core/parsers/fenced-code.js +29 -0
- package/dist/core/parsers/heading.d.ts +3 -0
- package/dist/core/parsers/heading.js +6 -0
- package/dist/core/parsers/html-block.d.ts +17 -0
- package/dist/core/parsers/html-block.js +94 -0
- package/dist/core/parsers/indented-code.d.ts +4 -0
- package/dist/core/parsers/indented-code.js +41 -0
- package/dist/core/parsers/link-reference.d.ts +7 -0
- package/dist/core/parsers/link-reference.js +152 -0
- package/dist/core/parsers/list.d.ts +19 -0
- package/dist/core/parsers/list.js +133 -0
- package/dist/core/parsers/paragraph.d.ts +10 -0
- package/dist/core/parsers/paragraph.js +42 -0
- package/dist/core/parsers/table-completion.d.ts +13 -0
- package/dist/core/parsers/table-completion.js +48 -0
- package/dist/core/parsers/table.d.ts +18 -0
- package/dist/core/parsers/table.js +110 -0
- package/dist/core/parsers/thematic-break.d.ts +1 -0
- package/dist/core/parsers/thematic-break.js +19 -0
- package/dist/core/serializer.d.ts +15 -0
- package/dist/core/serializer.js +11 -0
- package/dist/core/terminator-escalation.d.ts +8 -0
- package/dist/core/terminator-escalation.js +18 -0
- package/dist/core/url-policy.d.ts +14 -0
- package/dist/core/url-policy.js +44 -0
- package/dist/cursor/content-offsets.d.ts +29 -0
- package/dist/cursor/content-offsets.js +151 -0
- package/dist/cursor/coordinate-spaces.d.ts +65 -0
- package/dist/cursor/coordinate-spaces.js +66 -0
- package/dist/cursor/dom-walk.d.ts +18 -0
- package/dist/cursor/dom-walk.js +31 -0
- package/dist/cursor/edge-affinity.d.ts +44 -0
- package/dist/cursor/edge-affinity.js +60 -0
- package/dist/cursor/focused-caret.d.ts +10 -0
- package/dist/cursor/focused-caret.js +24 -0
- package/dist/cursor/height-model.d.ts +24 -0
- package/dist/cursor/height-model.js +72 -0
- package/dist/cursor/height-oracle.d.ts +24 -0
- package/dist/cursor/height-oracle.js +94 -0
- package/dist/cursor/overlay-rects.d.ts +8 -0
- package/dist/cursor/overlay-rects.js +19 -0
- package/dist/cursor/overlay-remeasure.d.ts +17 -0
- package/dist/cursor/overlay-remeasure.js +31 -0
- package/dist/cursor/pending-marks.d.ts +24 -0
- package/dist/cursor/pending-marks.js +36 -0
- package/dist/cursor/point-offset.d.ts +21 -0
- package/dist/cursor/point-offset.js +48 -0
- package/dist/cursor/reveal-anchor.d.ts +30 -0
- package/dist/cursor/reveal-anchor.js +31 -0
- package/dist/cursor/reveal-source.d.ts +35 -0
- package/dist/cursor/reveal-source.js +51 -0
- package/dist/cursor/scroll-ancestors.d.ts +28 -0
- package/dist/cursor/scroll-ancestors.js +89 -0
- package/dist/cursor/scrollport.d.ts +20 -0
- package/dist/cursor/scrollport.js +41 -0
- package/dist/cursor/sticky-column.d.ts +35 -0
- package/dist/cursor/sticky-column.js +64 -0
- package/dist/cursor/sticky-measure.d.ts +16 -0
- package/dist/cursor/sticky-measure.js +97 -0
- package/dist/cursor/typography-estimates.d.ts +21 -0
- package/dist/cursor/typography-estimates.js +21 -0
- package/dist/cursor/visual-lines.d.ts +25 -0
- package/dist/cursor/visual-lines.js +125 -0
- package/dist/cursor/widget-offset.d.ts +132 -0
- package/dist/cursor/widget-offset.js +543 -0
- package/dist/debug/diagnostics-report.d.ts +17 -0
- package/dist/debug/diagnostics-report.js +25 -0
- package/dist/debug/dump-tree.d.ts +6 -0
- package/dist/debug/dump-tree.js +114 -0
- package/dist/debug/inspect.d.ts +19 -0
- package/dist/debug/inspect.js +116 -0
- package/dist/debug/interaction-trace.d.ts +39 -0
- package/dist/debug/interaction-trace.js +105 -0
- package/dist/debug/operations-log.d.ts +14 -0
- package/dist/debug/operations-log.js +30 -0
- package/dist/decorations/buckets.d.ts +40 -0
- package/dist/decorations/buckets.js +87 -0
- package/dist/decorations/decoration-state.svelte.d.ts +20 -0
- package/dist/decorations/decoration-state.svelte.js +195 -0
- package/dist/decorations/island-dom.d.ts +35 -0
- package/dist/decorations/island-dom.js +148 -0
- package/dist/decorations/reserved-attrs.d.ts +12 -0
- package/dist/decorations/reserved-attrs.js +47 -0
- package/dist/decorations/types.d.ts +68 -0
- package/dist/decorations/types.js +5 -0
- package/dist/decorations/widget-dom.d.ts +15 -0
- package/dist/decorations/widget-dom.js +35 -0
- package/dist/dev-warn.d.ts +13 -0
- package/dist/dev-warn.js +28 -0
- package/dist/editor-actions/ancestry-folds.d.ts +32 -0
- package/dist/editor-actions/ancestry-folds.js +106 -0
- package/dist/editor-actions/block-edit-core.d.ts +29 -0
- package/dist/editor-actions/block-edit-core.js +277 -0
- package/dist/editor-actions/block-edit-scope.d.ts +79 -0
- package/dist/editor-actions/block-edit-scope.js +76 -0
- package/dist/editor-actions/block-edit.d.ts +8 -0
- package/dist/editor-actions/block-edit.js +111 -0
- package/dist/editor-actions/commit/history.d.ts +9 -0
- package/dist/editor-actions/commit/history.js +77 -0
- package/dist/editor-actions/commit/text-batch.d.ts +34 -0
- package/dist/editor-actions/commit/text-batch.js +61 -0
- package/dist/editor-actions/commit/undo-controller.d.ts +7 -0
- package/dist/editor-actions/commit/undo-controller.js +570 -0
- package/dist/editor-actions/container-block-component.d.ts +85 -0
- package/dist/editor-actions/container-block-component.js +228 -0
- package/dist/editor-actions/container-edit.d.ts +7 -0
- package/dist/editor-actions/container-edit.js +49 -0
- package/dist/editor-actions/container-exit-overrides.d.ts +16 -0
- package/dist/editor-actions/container-exit-overrides.js +38 -0
- package/dist/editor-actions/deps.d.ts +60 -0
- package/dist/editor-actions/deps.js +1 -0
- package/dist/editor-actions/enter-completion.d.ts +25 -0
- package/dist/editor-actions/enter-completion.js +76 -0
- package/dist/editor-actions/focus/focus-dispatch.d.ts +36 -0
- package/dist/editor-actions/focus/focus-dispatch.js +106 -0
- package/dist/editor-actions/focus/focus-landing.d.ts +7 -0
- package/dist/editor-actions/focus/focus-landing.js +39 -0
- package/dist/editor-actions/focus/focus.d.ts +7 -0
- package/dist/editor-actions/focus/focus.js +74 -0
- package/dist/editor-actions/index.d.ts +15 -0
- package/dist/editor-actions/index.js +19 -0
- package/dist/editor-actions/inline-range-commit.d.ts +20 -0
- package/dist/editor-actions/inline-range-commit.js +63 -0
- package/dist/editor-actions/list-context.d.ts +25 -0
- package/dist/editor-actions/list-context.js +285 -0
- package/dist/editor-actions/list-overrides.d.ts +13 -0
- package/dist/editor-actions/list-overrides.js +26 -0
- package/dist/editor-actions/merge-fallback.d.ts +19 -0
- package/dist/editor-actions/merge-fallback.js +27 -0
- package/dist/editor-actions/nested/nested-actions.d.ts +65 -0
- package/dist/editor-actions/nested/nested-actions.js +59 -0
- package/dist/editor-actions/nested/nested-block-edit.d.ts +10 -0
- package/dist/editor-actions/nested/nested-block-edit.js +181 -0
- package/dist/editor-actions/nested/nested-focus.d.ts +9 -0
- package/dist/editor-actions/nested/nested-focus.js +30 -0
- package/dist/editor-actions/paste-coordinator.d.ts +4 -0
- package/dist/editor-actions/paste-coordinator.js +20 -0
- package/dist/editor-actions/plugin/chrome-leaf.d.ts +25 -0
- package/dist/editor-actions/plugin/chrome-leaf.js +80 -0
- package/dist/editor-actions/plugin/container.d.ts +137 -0
- package/dist/editor-actions/plugin/container.js +351 -0
- package/dist/editor-actions/plugin/directive-container.d.ts +13 -0
- package/dist/editor-actions/plugin/directive-container.js +31 -0
- package/dist/editor-actions/reorder-action.d.ts +17 -0
- package/dist/editor-actions/reorder-action.js +104 -0
- package/dist/editor-actions/reorder-drag.d.ts +34 -0
- package/dist/editor-actions/reorder-drag.js +152 -0
- package/dist/editor-actions/replacement-focus.d.ts +27 -0
- package/dist/editor-actions/replacement-focus.js +60 -0
- package/dist/editor-actions/search-replace.d.ts +6 -0
- package/dist/editor-actions/search-replace.js +145 -0
- package/dist/editor-actions/table-context.d.ts +34 -0
- package/dist/editor-actions/table-context.js +292 -0
- package/dist/editor-actions/unwrap-strategies.d.ts +14 -0
- package/dist/editor-actions/unwrap-strategies.js +131 -0
- package/dist/editor-actions/whole-block-focus-surface.d.ts +51 -0
- package/dist/editor-actions/whole-block-focus-surface.js +171 -0
- package/dist/editor-events.d.ts +89 -0
- package/dist/editor-events.js +96 -0
- package/dist/editor-keys.d.ts +197 -0
- package/dist/editor-keys.js +40 -0
- package/dist/editor-props.d.ts +164 -0
- package/dist/editor-props.js +1 -0
- package/dist/editor-rects.d.ts +58 -0
- package/dist/editor-rects.js +114 -0
- package/dist/env.d.ts +12 -0
- package/dist/env.js +20 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +19 -0
- package/dist/invariants/commit-paths.d.ts +10 -0
- package/dist/invariants/commit-paths.js +25 -0
- package/dist/invariants/commit-scope.d.ts +9 -0
- package/dist/invariants/commit-scope.js +16 -0
- package/dist/invariants/context-keys.d.ts +7 -0
- package/dist/invariants/context-keys.js +14 -0
- package/dist/invariants/descriptor.d.ts +10 -0
- package/dist/invariants/descriptor.js +24 -0
- package/dist/invariants/inline-transitions.d.ts +23 -0
- package/dist/invariants/inline-transitions.js +52 -0
- package/dist/invariants/install.d.ts +36 -0
- package/dist/invariants/install.js +66 -0
- package/dist/invariants/landable-caret.d.ts +12 -0
- package/dist/invariants/landable-caret.js +31 -0
- package/dist/invariants/marker-css-parity.d.ts +10 -0
- package/dist/invariants/marker-css-parity.js +87 -0
- package/dist/invariants/node-shape.d.ts +44 -0
- package/dist/invariants/node-shape.js +258 -0
- package/dist/invariants/registry.d.ts +126 -0
- package/dist/invariants/registry.js +349 -0
- package/dist/invariants/render-fidelity.d.ts +8 -0
- package/dist/invariants/render-fidelity.js +33 -0
- package/dist/invariants/selection-endpoints.d.ts +19 -0
- package/dist/invariants/selection-endpoints.js +78 -0
- package/dist/invariants/single-node-sink.d.ts +9 -0
- package/dist/invariants/single-node-sink.js +16 -0
- package/dist/invariants/snapshot-integrity.d.ts +17 -0
- package/dist/invariants/snapshot-integrity.js +24 -0
- package/dist/invariants/split-landing.d.ts +8 -0
- package/dist/invariants/split-landing.js +15 -0
- package/dist/invariants/structural-descriptor.d.ts +21 -0
- package/dist/invariants/structural-descriptor.js +50 -0
- package/dist/perf/instruments.d.ts +49 -0
- package/dist/perf/instruments.js +154 -0
- package/dist/perf/use-mount-gauge.svelte.d.ts +1 -0
- package/dist/perf/use-mount-gauge.svelte.js +15 -0
- package/dist/plugin.d.ts +102 -0
- package/dist/plugin.js +156 -0
- package/dist/plugins/admonitions/AdmonitionBlock.svelte +144 -0
- package/dist/plugins/admonitions/AdmonitionBlock.svelte.d.ts +11 -0
- package/dist/plugins/admonitions/admonition-kind.d.ts +8 -0
- package/dist/plugins/admonitions/admonition-kind.js +97 -0
- package/dist/plugins/admonitions/convert-document.d.ts +11 -0
- package/dist/plugins/admonitions/convert-document.js +39 -0
- package/dist/plugins/admonitions/gh-alert.d.ts +13 -0
- package/dist/plugins/admonitions/gh-alert.js +83 -0
- package/dist/plugins/admonitions/github-alert-kind.d.ts +12 -0
- package/dist/plugins/admonitions/github-alert-kind.js +125 -0
- package/dist/plugins/admonitions/index.d.ts +6 -0
- package/dist/plugins/admonitions/index.js +8 -0
- package/dist/plugins/admonitions/kinds.d.ts +26 -0
- package/dist/plugins/admonitions/kinds.js +18 -0
- package/dist/plugins/admonitions/register.d.ts +7 -0
- package/dist/plugins/admonitions/register.js +12 -0
- package/dist/plugins/details/DetailsBlock.svelte +129 -0
- package/dist/plugins/details/DetailsBlock.svelte.d.ts +11 -0
- package/dist/plugins/details/details-disclosure.svelte.d.ts +17 -0
- package/dist/plugins/details/details-disclosure.svelte.js +24 -0
- package/dist/plugins/details/details-kind.d.ts +25 -0
- package/dist/plugins/details/details-kind.js +237 -0
- package/dist/plugins/details/index.d.ts +2 -0
- package/dist/plugins/details/index.js +2 -0
- package/dist/plugins/details/register.d.ts +6 -0
- package/dist/plugins/details/register.js +15 -0
- package/dist/plugins/emoji/emoji-plugin.d.ts +2 -0
- package/dist/plugins/emoji/emoji-plugin.js +10 -0
- package/dist/plugins/emoji/emoji-recognizer.d.ts +18 -0
- package/dist/plugins/emoji/emoji-recognizer.js +63 -0
- package/dist/plugins/emoji/emoji-table.d.ts +1 -0
- package/dist/plugins/emoji/emoji-table.js +1919 -0
- package/dist/plugins/emoji/index.d.ts +3 -0
- package/dist/plugins/emoji/index.js +4 -0
- package/dist/plugins/footnotes/FootnoteDefinition.svelte +103 -0
- package/dist/plugins/footnotes/FootnoteDefinition.svelte.d.ts +13 -0
- package/dist/plugins/footnotes/FootnoteReference.svelte +50 -0
- package/dist/plugins/footnotes/FootnoteReference.svelte.d.ts +4 -0
- package/dist/plugins/footnotes/constants.d.ts +2 -0
- package/dist/plugins/footnotes/constants.js +4 -0
- package/dist/plugins/footnotes/footnote-definition.d.ts +14 -0
- package/dist/plugins/footnotes/footnote-definition.js +147 -0
- package/dist/plugins/footnotes/footnote-lookup.d.ts +9 -0
- package/dist/plugins/footnotes/footnote-lookup.js +33 -0
- package/dist/plugins/footnotes/footnote-numbering.d.ts +23 -0
- package/dist/plugins/footnotes/footnote-numbering.js +78 -0
- package/dist/plugins/footnotes/footnote-reference.d.ts +7 -0
- package/dist/plugins/footnotes/footnote-reference.js +54 -0
- package/dist/plugins/footnotes/footnotes-plugin.d.ts +7 -0
- package/dist/plugins/footnotes/footnotes-plugin.js +17 -0
- package/dist/plugins/footnotes/index.d.ts +5 -0
- package/dist/plugins/footnotes/index.js +6 -0
- package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +17 -0
- package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +31 -0
- package/dist/plugins/highlight-occurrences/index.d.ts +1 -0
- package/dist/plugins/highlight-occurrences/index.js +1 -0
- package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +26 -0
- package/dist/plugins/highlight-occurrences/occurrence-source.js +54 -0
- package/dist/plugins/highlight-occurrences/occurrences.d.ts +33 -0
- package/dist/plugins/highlight-occurrences/occurrences.js +108 -0
- package/dist/plugins/latex/BlockMath.svelte +119 -0
- package/dist/plugins/latex/BlockMath.svelte.d.ts +21 -0
- package/dist/plugins/latex/MathInline.svelte +28 -0
- package/dist/plugins/latex/MathInline.svelte.d.ts +4 -0
- package/dist/plugins/latex/index.d.ts +3 -0
- package/dist/plugins/latex/index.js +4 -0
- package/dist/plugins/latex/latex-kind.d.ts +17 -0
- package/dist/plugins/latex/latex-kind.js +224 -0
- package/dist/plugins/latex/math-completion.d.ts +10 -0
- package/dist/plugins/latex/math-completion.js +19 -0
- package/dist/plugins/latex/math-renderer.d.ts +26 -0
- package/dist/plugins/latex/math-renderer.js +42 -0
- package/dist/plugins/latex/register.d.ts +10 -0
- package/dist/plugins/latex/register.js +23 -0
- package/dist/plugins/latex/renderer.d.ts +13 -0
- package/dist/plugins/latex/renderer.js +34 -0
- package/dist/plugins/mermaid/MermaidBlock.svelte +572 -0
- package/dist/plugins/mermaid/MermaidBlock.svelte.d.ts +11 -0
- package/dist/plugins/mermaid/index.d.ts +3 -0
- package/dist/plugins/mermaid/index.js +3 -0
- package/dist/plugins/mermaid/mermaid-kind.d.ts +38 -0
- package/dist/plugins/mermaid/mermaid-kind.js +176 -0
- package/dist/plugins/mermaid/mermaid-renderer.d.ts +28 -0
- package/dist/plugins/mermaid/mermaid-renderer.js +35 -0
- package/dist/plugins/mermaid/register.d.ts +10 -0
- package/dist/plugins/mermaid/register.js +20 -0
- package/dist/plugins/mermaid/renderer.d.ts +11 -0
- package/dist/plugins/mermaid/renderer.js +53 -0
- package/dist/plugins/parrot/ParrotBlock.svelte +342 -0
- package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +21 -0
- package/dist/plugins/parrot/index.d.ts +1 -0
- package/dist/plugins/parrot/index.js +2 -0
- package/dist/plugins/parrot/parrot-plugin.d.ts +3 -0
- package/dist/plugins/parrot/parrot-plugin.js +49 -0
- package/dist/plugins/toc/TocBlock.svelte +218 -0
- package/dist/plugins/toc/TocBlock.svelte.d.ts +24 -0
- package/dist/plugins/toc/heading-outline.d.ts +28 -0
- package/dist/plugins/toc/heading-outline.js +65 -0
- package/dist/plugins/toc/index.d.ts +2 -0
- package/dist/plugins/toc/index.js +2 -0
- package/dist/plugins/toc/navigation-queue.d.ts +12 -0
- package/dist/plugins/toc/navigation-queue.js +21 -0
- package/dist/plugins/toc/toc-plugin.d.ts +16 -0
- package/dist/plugins/toc/toc-plugin.js +71 -0
- package/dist/presentation-mode.d.ts +32 -0
- package/dist/presentation-mode.js +50 -0
- package/dist/reactivity/block-list-state.svelte.d.ts +22 -0
- package/dist/reactivity/block-list-state.svelte.js +46 -0
- package/dist/reactivity/block-window.svelte.d.ts +41 -0
- package/dist/reactivity/block-window.svelte.js +93 -0
- package/dist/reactivity/content-version.svelte.d.ts +14 -0
- package/dist/reactivity/content-version.svelte.js +16 -0
- package/dist/reactivity/list-windowing.svelte.d.ts +100 -0
- package/dist/reactivity/list-windowing.svelte.js +402 -0
- package/dist/reactivity/measure-batch.d.ts +15 -0
- package/dist/reactivity/measure-batch.js +18 -0
- package/dist/reactivity/publish-ref.svelte.d.ts +54 -0
- package/dist/reactivity/publish-ref.svelte.js +128 -0
- package/dist/reactivity/scope-geometry.d.ts +18 -0
- package/dist/reactivity/scope-geometry.js +29 -0
- package/dist/reactivity/state-registry.d.ts +10 -0
- package/dist/reactivity/state-registry.js +44 -0
- package/dist/reactivity/use-container-windowing.svelte.d.ts +35 -0
- package/dist/reactivity/use-container-windowing.svelte.js +95 -0
- package/dist/reactivity/window-slice.d.ts +11 -0
- package/dist/reactivity/window-slice.js +9 -0
- package/dist/scan-index.d.ts +11 -0
- package/dist/scan-index.js +27 -0
- package/dist/schema/block-commands.d.ts +105 -0
- package/dist/schema/block-commands.js +179 -0
- package/dist/schema/block-completions.d.ts +33 -0
- package/dist/schema/block-completions.js +49 -0
- package/dist/schema/block-component-registry.d.ts +33 -0
- package/dist/schema/block-component-registry.js +33 -0
- package/dist/schema/block-kind-descriptor.d.ts +281 -0
- package/dist/schema/block-kind-descriptor.js +187 -0
- package/dist/schema/block-openers.d.ts +94 -0
- package/dist/schema/block-openers.js +150 -0
- package/dist/schema/built-in-descriptors.d.ts +8 -0
- package/dist/schema/built-in-descriptors.js +560 -0
- package/dist/schema/child-spans.d.ts +25 -0
- package/dist/schema/child-spans.js +161 -0
- package/dist/schema/closure.d.ts +39 -0
- package/dist/schema/closure.js +55 -0
- package/dist/schema/command-id.d.ts +20 -0
- package/dist/schema/command-id.js +42 -0
- package/dist/schema/commands.d.ts +147 -0
- package/dist/schema/commands.js +294 -0
- package/dist/schema/container-raw.d.ts +21 -0
- package/dist/schema/container-raw.js +43 -0
- package/dist/schema/container-rebuilders.d.ts +32 -0
- package/dist/schema/container-rebuilders.js +95 -0
- package/dist/schema/define-plugin-block.d.ts +15 -0
- package/dist/schema/define-plugin-block.js +18 -0
- package/dist/schema/fenced-code-raw.d.ts +43 -0
- package/dist/schema/fenced-code-raw.js +220 -0
- package/dist/schema/global-commands.d.ts +11 -0
- package/dist/schema/global-commands.js +40 -0
- package/dist/schema/inline-construct-policy.d.ts +131 -0
- package/dist/schema/inline-construct-policy.js +96 -0
- package/dist/schema/keybinding-overrides.d.ts +39 -0
- package/dist/schema/keybinding-overrides.js +43 -0
- package/dist/schema/keybindings.d.ts +36 -0
- package/dist/schema/keybindings.js +75 -0
- package/dist/schema/merge-rules.d.ts +28 -0
- package/dist/schema/merge-rules.js +57 -0
- package/dist/schema/opener-priorities.d.ts +16 -0
- package/dist/schema/opener-priorities.js +16 -0
- package/dist/schema/operations.d.ts +110 -0
- package/dist/schema/operations.js +6 -0
- package/dist/schema/plugin-activation.d.ts +13 -0
- package/dist/schema/plugin-activation.js +18 -0
- package/dist/schema/plugin-editor-context.d.ts +33 -0
- package/dist/schema/plugin-editor-context.js +65 -0
- package/dist/schema/plugin-install.d.ts +58 -0
- package/dist/schema/plugin-install.js +132 -0
- package/dist/schema/plugin-kind.d.ts +21 -0
- package/dist/schema/plugin-kind.js +86 -0
- package/dist/schema/plugin-name.d.ts +1 -0
- package/dist/schema/plugin-name.js +7 -0
- package/dist/schema/register-once.d.ts +9 -0
- package/dist/schema/register-once.js +35 -0
- package/dist/schema/registration-checks.d.ts +32 -0
- package/dist/schema/registration-checks.js +122 -0
- package/dist/schema/registration-pending.d.ts +28 -0
- package/dist/schema/registration-pending.js +48 -0
- package/dist/schema/registry-reset.d.ts +7 -0
- package/dist/schema/registry-reset.js +30 -0
- package/dist/schema/registry-view.d.ts +30 -0
- package/dist/schema/registry-view.js +39 -0
- package/dist/schema/reserved-chords.d.ts +35 -0
- package/dist/schema/reserved-chords.js +313 -0
- package/dist/schema/reserved-chrome.d.ts +23 -0
- package/dist/schema/reserved-chrome.js +33 -0
- package/dist/schema/table-cell-raw.d.ts +14 -0
- package/dist/schema/table-cell-raw.js +30 -0
- package/dist/schema/whole-block-unit.d.ts +8 -0
- package/dist/schema/whole-block-unit.js +12 -0
- package/dist/search/document-scan.d.ts +22 -0
- package/dist/search/document-scan.js +39 -0
- package/dist/search/matcher.d.ts +31 -0
- package/dist/search/matcher.js +70 -0
- package/dist/search/regex-executor.d.ts +41 -0
- package/dist/search/regex-executor.js +165 -0
- package/dist/search/replace.d.ts +15 -0
- package/dist/search/replace.js +29 -0
- package/dist/search/search-state.svelte.d.ts +59 -0
- package/dist/search/search-state.svelte.js +231 -0
- package/dist/selection/autoscroll.d.ts +26 -0
- package/dist/selection/autoscroll.js +91 -0
- package/dist/selection/block-hit-test.d.ts +37 -0
- package/dist/selection/block-hit-test.js +59 -0
- package/dist/selection/caret-doors.d.ts +20 -0
- package/dist/selection/caret-doors.js +44 -0
- package/dist/selection/caret-restore.d.ts +15 -0
- package/dist/selection/caret-restore.js +32 -0
- package/dist/selection/char-endpoint-snap.d.ts +15 -0
- package/dist/selection/char-endpoint-snap.js +39 -0
- package/dist/selection/clipboard-text.d.ts +13 -0
- package/dist/selection/clipboard-text.js +314 -0
- package/dist/selection/cross-block/clipboard.d.ts +14 -0
- package/dist/selection/cross-block/clipboard.js +20 -0
- package/dist/selection/cross-block/dispatch.d.ts +78 -0
- package/dist/selection/cross-block/dispatch.js +57 -0
- package/dist/selection/cross-block/format-range.d.ts +38 -0
- package/dist/selection/cross-block/format-range.js +193 -0
- package/dist/selection/cross-block/format-toggle.d.ts +27 -0
- package/dist/selection/cross-block/format-toggle.js +109 -0
- package/dist/selection/cross-block/keydown.d.ts +11 -0
- package/dist/selection/cross-block/keydown.js +339 -0
- package/dist/selection/cross-block/ops.d.ts +56 -0
- package/dist/selection/cross-block/ops.js +210 -0
- package/dist/selection/cross-block/paste.d.ts +8 -0
- package/dist/selection/cross-block/paste.js +156 -0
- package/dist/selection/cross-block/pointer.d.ts +19 -0
- package/dist/selection/cross-block/pointer.js +80 -0
- package/dist/selection/cross-block/type-replace.d.ts +10 -0
- package/dist/selection/cross-block/type-replace.js +129 -0
- package/dist/selection/dead-space-caret.d.ts +39 -0
- package/dist/selection/dead-space-caret.js +173 -0
- package/dist/selection/drag-pointer.d.ts +22 -0
- package/dist/selection/drag-pointer.js +89 -0
- package/dist/selection/gap-caret.d.ts +47 -0
- package/dist/selection/gap-caret.js +72 -0
- package/dist/selection/keyboard-extend.d.ts +43 -0
- package/dist/selection/keyboard-extend.js +257 -0
- package/dist/selection/native-bridge.d.ts +47 -0
- package/dist/selection/native-bridge.js +204 -0
- package/dist/selection/nearest-block.d.ts +43 -0
- package/dist/selection/nearest-block.js +73 -0
- package/dist/selection/path-lookup.d.ts +32 -0
- package/dist/selection/path-lookup.js +132 -0
- package/dist/selection/path-math.d.ts +35 -0
- package/dist/selection/path-math.js +90 -0
- package/dist/selection/pointer-session.d.ts +43 -0
- package/dist/selection/pointer-session.js +111 -0
- package/dist/selection/primitives.d.ts +75 -0
- package/dist/selection/primitives.js +91 -0
- package/dist/selection/range-delete-ceremony.d.ts +85 -0
- package/dist/selection/range-delete-ceremony.js +197 -0
- package/dist/selection/range-delete-chrome.d.ts +39 -0
- package/dist/selection/range-delete-chrome.js +105 -0
- package/dist/selection/range-delete-table-coverage.d.ts +28 -0
- package/dist/selection/range-delete-table-coverage.js +168 -0
- package/dist/selection/range-delete-table.d.ts +16 -0
- package/dist/selection/range-delete-table.js +347 -0
- package/dist/selection/range-delete.d.ts +33 -0
- package/dist/selection/range-delete.js +121 -0
- package/dist/selection/selection-description.d.ts +7 -0
- package/dist/selection/selection-description.js +18 -0
- package/dist/selection/selection-restore.d.ts +46 -0
- package/dist/selection/selection-restore.js +66 -0
- package/dist/selection/selection-state.svelte.d.ts +72 -0
- package/dist/selection/selection-state.svelte.js +247 -0
- package/dist/selection/shared-keydown.d.ts +61 -0
- package/dist/selection/shared-keydown.js +150 -0
- package/dist/selection/table-endpoint-snap.d.ts +55 -0
- package/dist/selection/table-endpoint-snap.js +143 -0
- package/dist/selection/table-rect-extend.d.ts +23 -0
- package/dist/selection/table-rect-extend.js +46 -0
- package/dist/selection/widget-range-paint.d.ts +12 -0
- package/dist/selection/widget-range-paint.js +44 -0
- package/dist/styles/editor-theme.css +151 -0
- package/dist/styles/editor.css +585 -0
- package/dist/testing/conformance-core.d.ts +45 -0
- package/dist/testing/conformance-core.js +105 -0
- package/dist/testing/container-conformance.d.ts +137 -0
- package/dist/testing/container-conformance.js +533 -0
- package/dist/testing/headless-actions.d.ts +37 -0
- package/dist/testing/headless-actions.js +118 -0
- package/dist/testing/inline-conformance.d.ts +50 -0
- package/dist/testing/inline-conformance.js +442 -0
- package/dist/testing/kind-conformance.d.ts +54 -0
- package/dist/testing/kind-conformance.js +325 -0
- package/dist/testing/mount-dom-stubs.d.ts +8 -0
- package/dist/testing/mount-dom-stubs.js +19 -0
- package/dist/testing/parse-convergence.d.ts +14 -0
- package/dist/testing/parse-convergence.js +81 -0
- package/dist/testing.d.ts +20 -0
- package/dist/testing.js +61 -0
- package/dist/tree-operations/blockquote.d.ts +18 -0
- package/dist/tree-operations/blockquote.js +59 -0
- package/dist/tree-operations/children.d.ts +17 -0
- package/dist/tree-operations/children.js +56 -0
- package/dist/tree-operations/cleanup.d.ts +10 -0
- package/dist/tree-operations/cleanup.js +25 -0
- package/dist/tree-operations/clone.d.ts +5 -0
- package/dist/tree-operations/clone.js +43 -0
- package/dist/tree-operations/container-lift.d.ts +9 -0
- package/dist/tree-operations/container-lift.js +29 -0
- package/dist/tree-operations/index.d.ts +16 -0
- package/dist/tree-operations/index.js +14 -0
- package/dist/tree-operations/list/empty-check.d.ts +7 -0
- package/dist/tree-operations/list/empty-check.js +19 -0
- package/dist/tree-operations/list/exit-replacement.d.ts +13 -0
- package/dist/tree-operations/list/exit-replacement.js +49 -0
- package/dist/tree-operations/list/item-partition.d.ts +13 -0
- package/dist/tree-operations/list/item-partition.js +33 -0
- package/dist/tree-operations/list/list-builders.d.ts +44 -0
- package/dist/tree-operations/list/list-builders.js +129 -0
- package/dist/tree-operations/list/ordered-markers.d.ts +36 -0
- package/dist/tree-operations/list/ordered-markers.js +114 -0
- package/dist/tree-operations/list/reconcile-task.d.ts +12 -0
- package/dist/tree-operations/list/reconcile-task.js +47 -0
- package/dist/tree-operations/list/sublist-separator.d.ts +13 -0
- package/dist/tree-operations/list/sublist-separator.js +34 -0
- package/dist/tree-operations/list/terminator.d.ts +17 -0
- package/dist/tree-operations/list/terminator.js +60 -0
- package/dist/tree-operations/list/unwrap-merge.d.ts +29 -0
- package/dist/tree-operations/list/unwrap-merge.js +202 -0
- package/dist/tree-operations/node-ops.d.ts +296 -0
- package/dist/tree-operations/node-ops.js +1428 -0
- package/dist/tree-operations/parse-block.d.ts +3 -0
- package/dist/tree-operations/parse-block.js +8 -0
- package/dist/tree-operations/paste/apply.d.ts +12 -0
- package/dist/tree-operations/paste/apply.js +75 -0
- package/dist/tree-operations/paste/body-write.d.ts +19 -0
- package/dist/tree-operations/paste/body-write.js +53 -0
- package/dist/tree-operations/paste/container-match.d.ts +32 -0
- package/dist/tree-operations/paste/container-match.js +238 -0
- package/dist/tree-operations/paste/container-paste.d.ts +10 -0
- package/dist/tree-operations/paste/container-paste.js +27 -0
- package/dist/tree-operations/paste/dispatch.d.ts +61 -0
- package/dist/tree-operations/paste/dispatch.js +138 -0
- package/dist/tree-operations/paste/find-enclosing-list.d.ts +8 -0
- package/dist/tree-operations/paste/find-enclosing-list.js +30 -0
- package/dist/tree-operations/paste/focus-target.d.ts +27 -0
- package/dist/tree-operations/paste/focus-target.js +40 -0
- package/dist/tree-operations/paste/hooks.d.ts +17 -0
- package/dist/tree-operations/paste/hooks.js +80 -0
- package/dist/tree-operations/paste/list-absorb.d.ts +29 -0
- package/dist/tree-operations/paste/list-absorb.js +106 -0
- package/dist/tree-operations/paste/list-break-out.d.ts +42 -0
- package/dist/tree-operations/paste/list-break-out.js +136 -0
- package/dist/tree-operations/paste/parent-scope.d.ts +17 -0
- package/dist/tree-operations/paste/parent-scope.js +35 -0
- package/dist/tree-operations/paste/paste-deps.d.ts +20 -0
- package/dist/tree-operations/paste/paste-deps.js +6 -0
- package/dist/tree-operations/paste/paste-replacement.d.ts +8 -0
- package/dist/tree-operations/paste/paste-replacement.js +60 -0
- package/dist/tree-operations/paste/paste-transforms.d.ts +25 -0
- package/dist/tree-operations/paste/paste-transforms.js +72 -0
- package/dist/tree-operations/paste/replace-block-at-parent.d.ts +29 -0
- package/dist/tree-operations/paste/replace-block-at-parent.js +75 -0
- package/dist/tree-operations/paste/strategy.d.ts +9 -0
- package/dist/tree-operations/paste/strategy.js +20 -0
- package/dist/tree-operations/paste/table-slice.d.ts +10 -0
- package/dist/tree-operations/paste/table-slice.js +39 -0
- package/dist/tree-operations/paste-surfaces.d.ts +61 -0
- package/dist/tree-operations/paste-surfaces.js +15 -0
- package/dist/tree-operations/path-mutate.d.ts +12 -0
- package/dist/tree-operations/path-mutate.js +20 -0
- package/dist/tree-operations/reorder-unit.d.ts +17 -0
- package/dist/tree-operations/reorder-unit.js +37 -0
- package/dist/tree-operations/reorder.d.ts +13 -0
- package/dist/tree-operations/reorder.js +57 -0
- package/dist/tree-operations/sharing.d.ts +18 -0
- package/dist/tree-operations/sharing.js +14 -0
- package/dist/tree-operations/splice-many.d.ts +9 -0
- package/dist/tree-operations/splice-many.js +22 -0
- package/dist/tree-operations/structural-change.d.ts +65 -0
- package/dist/tree-operations/structural-change.js +117 -0
- package/dist/tree-operations/sub-table-copy.d.ts +6 -0
- package/dist/tree-operations/sub-table-copy.js +43 -0
- package/dist/tree-operations/table-mutations.d.ts +17 -0
- package/dist/tree-operations/table-mutations.js +101 -0
- package/dist/tree-operations/unshare.d.ts +101 -0
- package/dist/tree-operations/unshare.js +248 -0
- package/dist/undo/manager.d.ts +2 -0
- package/dist/undo/manager.js +50 -0
- package/dist/undo/types.d.ts +44 -0
- package/dist/undo/types.js +7 -0
- package/docs/guide/consumer-guide.md +1098 -0
- package/docs/guide/directives.md +223 -0
- package/docs/guide/plugin-api.md +329 -0
- package/docs/guide/plugin-guide/conspiracy.gif +0 -0
- package/docs/guide/plugin-guide/parrot-frames.md +209 -0
- package/docs/guide/plugin-guide/parrot.gif +0 -0
- package/docs/guide/plugin-guide.md +1693 -0
- package/docs/guide/plugin-testing.md +463 -0
- package/package.json +238 -0
|
@@ -0,0 +1,1075 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { getContext, tick } from 'svelte';
|
|
3
|
+
import type { BlockEditActions, TableContext } from '../../../action-contracts';
|
|
4
|
+
import { type BlockComponent } from '../../../block-component';
|
|
5
|
+
import { type CommandId } from '../../../schema/commands';
|
|
6
|
+
import { eventToChord } from '../../../schema/keybindings';
|
|
7
|
+
import {
|
|
8
|
+
createInlineFormatActiveMemo,
|
|
9
|
+
toggleInlineFormat
|
|
10
|
+
} from '../../../core/inline/format-toggle';
|
|
11
|
+
import { paintsFocusedMarkers } from '../../../presentation-mode';
|
|
12
|
+
import {
|
|
13
|
+
inlineMarkForCommand,
|
|
14
|
+
type InlineMarkKind
|
|
15
|
+
} from '../../../schema/inline-construct-policy';
|
|
16
|
+
import type { NodeView } from '../../../core/node-views';
|
|
17
|
+
import {
|
|
18
|
+
EDITOR_DOC_KEY,
|
|
19
|
+
EDITOR_POLICIES_KEY,
|
|
20
|
+
EDITOR_SERVICES_KEY,
|
|
21
|
+
TABLE_CONTEXT_KEY,
|
|
22
|
+
type EditorDoc,
|
|
23
|
+
type EditorPolicies,
|
|
24
|
+
type EditorServices
|
|
25
|
+
} from '../../../editor-keys';
|
|
26
|
+
import type { TableAlignment } from '../../../core/nodes';
|
|
27
|
+
import { trimTrailingLineEnding, normalizeLineEndings } from '../../../core/lines';
|
|
28
|
+
import { pasteDispatch } from '../../../tree-operations/paste/dispatch';
|
|
29
|
+
import { blockNodeAt, cutRangeFromDisplay } from '../../../tree-operations/node-ops';
|
|
30
|
+
import { applyLiveRangeEdit } from '../text/live-selection-edit';
|
|
31
|
+
import { hasSelection as hasSelectionHelper } from '../../../cursor/content-offsets';
|
|
32
|
+
import { FALLBACK_CONTENT_WIDTH } from '../../../cursor/typography-estimates';
|
|
33
|
+
import {
|
|
34
|
+
rawTextOfNode,
|
|
35
|
+
containerDomTextLength,
|
|
36
|
+
landableDomTextBounds,
|
|
37
|
+
createRangeAtDomTextOffsets,
|
|
38
|
+
screenVisibilityOf,
|
|
39
|
+
selectionFocusWalkOffset
|
|
40
|
+
} from '../../../cursor/widget-offset';
|
|
41
|
+
import { asRawOffset, toDomTextOffset, type RawOffset } from '../../../cursor/coordinate-spaces';
|
|
42
|
+
import { createAmbientCursorIO } from '../../../ambient/ambient-cursor';
|
|
43
|
+
import { getCurrentCursorEditorRelativeX } from '../../../cursor/sticky-measure';
|
|
44
|
+
import { handleSharedKeydown, handleSharedBeforeInput } from '../../../selection/shared-keydown';
|
|
45
|
+
import {
|
|
46
|
+
createEditableSurface,
|
|
47
|
+
createClipboardHandlers,
|
|
48
|
+
consumePendingRestore
|
|
49
|
+
} from '../editable-surface';
|
|
50
|
+
import { wireSurfaceContexts, useParkFocusOnUnmount } from '../surface-wiring.svelte';
|
|
51
|
+
import { resetForPointerDown } from '../../../selection/cross-block/pointer';
|
|
52
|
+
import { publishRefSlot, type RefSlots } from '../../../reactivity/publish-ref.svelte';
|
|
53
|
+
import {
|
|
54
|
+
selectWholeDocument,
|
|
55
|
+
extendFocusToNextBlock,
|
|
56
|
+
extendFocusToPreviousBlock
|
|
57
|
+
} from '../../../selection/keyboard-extend';
|
|
58
|
+
import { intraTableRectExtension } from '../../../selection/table-rect-extend';
|
|
59
|
+
import { isAtFirstVisualLine, isAtLastVisualLine } from '../../../cursor/visual-lines';
|
|
60
|
+
import { cellKeydownPlan, type CellKeyPlan, type CellKeyState } from './cell-keydown-plan';
|
|
61
|
+
import { tableAxisCommand } from './cell-table-commands';
|
|
62
|
+
import { intraTableRectPayload } from './cell-clipboard';
|
|
63
|
+
import { escapedCellOffset } from './table-cell-paste';
|
|
64
|
+
import type { CellSelectionPoint, SelectionPoint } from '../../../selection/primitives';
|
|
65
|
+
import type { ClipboardAction } from './table-menu-model';
|
|
66
|
+
import {
|
|
67
|
+
installCellDragListener,
|
|
68
|
+
handleCellShiftClick,
|
|
69
|
+
cellCoordsOfElement,
|
|
70
|
+
type CellAnchor
|
|
71
|
+
} from './cell-pointer';
|
|
72
|
+
import { createCellRender } from './cell-render';
|
|
73
|
+
import type { IndexedDecoration } from '../../../decorations/buckets';
|
|
74
|
+
import type { ReplaceDecoration, WidgetDecoration } from '../../../decorations/types';
|
|
75
|
+
import { createWidgetInteraction } from '../text/widget-interaction';
|
|
76
|
+
import { createEdgePolicyDispatch } from '../text/edge-policy-dispatch';
|
|
77
|
+
import { createCompositionSeat } from '../text/composition-seat';
|
|
78
|
+
import { resolvedInlineContent } from '../../../core/inline/inline-cache';
|
|
79
|
+
import { widgetElByStart } from '../text/widget-adjacency';
|
|
80
|
+
import { getInlineWidgetEditing } from '../../../core/inline/inline-widgets';
|
|
81
|
+
import { enterLinkCardAtCaret, linkCardTargetAt } from '../../link-card/link-card-entry';
|
|
82
|
+
|
|
83
|
+
type ExitDirection = 'up' | 'down';
|
|
84
|
+
|
|
85
|
+
// The chord that continues a select-all run rather than ending it.
|
|
86
|
+
const SELECT_ALL_CHORD = 'Mod+A';
|
|
87
|
+
|
|
88
|
+
let {
|
|
89
|
+
node,
|
|
90
|
+
index,
|
|
91
|
+
myPath = [],
|
|
92
|
+
rowIdx,
|
|
93
|
+
columnCount,
|
|
94
|
+
rowCount,
|
|
95
|
+
alignment = 'none',
|
|
96
|
+
slots
|
|
97
|
+
}: {
|
|
98
|
+
node: NodeView;
|
|
99
|
+
index: number;
|
|
100
|
+
myPath?: number[];
|
|
101
|
+
rowIdx: number;
|
|
102
|
+
columnCount: number;
|
|
103
|
+
rowCount: number;
|
|
104
|
+
alignment?: TableAlignment;
|
|
105
|
+
slots?: RefSlots<BlockComponent>;
|
|
106
|
+
} = $props();
|
|
107
|
+
|
|
108
|
+
// A cell's position among its row's children IS its column.
|
|
109
|
+
const colIdx = $derived(index);
|
|
110
|
+
|
|
111
|
+
const wiring = wireSurfaceContexts();
|
|
112
|
+
const {
|
|
113
|
+
blockEdit: parentBlockEdit,
|
|
114
|
+
focusActions,
|
|
115
|
+
controller,
|
|
116
|
+
pasteCoordinator,
|
|
117
|
+
stickyColumn,
|
|
118
|
+
edgeAffinity,
|
|
119
|
+
selection,
|
|
120
|
+
getDoc,
|
|
121
|
+
getBlockElByPath,
|
|
122
|
+
getEditorRoot,
|
|
123
|
+
grammar,
|
|
124
|
+
activePlugins,
|
|
125
|
+
events: editorEvents,
|
|
126
|
+
linkRef
|
|
127
|
+
} = wiring.deps;
|
|
128
|
+
const tableContext = getContext<TableContext>(TABLE_CONTEXT_KEY);
|
|
129
|
+
const {
|
|
130
|
+
pendingMarks,
|
|
131
|
+
widgetSelection,
|
|
132
|
+
linkCard,
|
|
133
|
+
reorder,
|
|
134
|
+
rects,
|
|
135
|
+
decorations: decorationEngine
|
|
136
|
+
} = getContext<EditorServices>(EDITOR_SERVICES_KEY);
|
|
137
|
+
const {
|
|
138
|
+
presentationMode: getPresentationMode,
|
|
139
|
+
theme: getTheme,
|
|
140
|
+
resolveLinkUrl,
|
|
141
|
+
onPasteImage
|
|
142
|
+
} = getContext<EditorPolicies>(EDITOR_POLICIES_KEY);
|
|
143
|
+
const { contentVersion: getContentVersion, lifetime: editorLifetime } =
|
|
144
|
+
getContext<EditorDoc>(EDITOR_DOC_KEY);
|
|
145
|
+
const presentationMode = $derived(getPresentationMode?.() ?? 'source');
|
|
146
|
+
const readOnly = $derived(presentationMode === 'reading');
|
|
147
|
+
|
|
148
|
+
// A constant fallback keeps an empty island set out of the render key.
|
|
149
|
+
const NO_ISLANDS: IndexedDecoration<WidgetDecoration | ReplaceDecoration>[] = [];
|
|
150
|
+
|
|
151
|
+
// ── The cell's write door ───────────────────────────────────────────────
|
|
152
|
+
//
|
|
153
|
+
// Every write of this cell's raw goes through `blockEdit`; the escape is the kind's
|
|
154
|
+
// (`normalizeRawWrite`, at the write sink). The caret half stays here: `caretAfter` addresses
|
|
155
|
+
// the text the caller wrote, so the sink's backslashes move it; `caretBefore` addresses the
|
|
156
|
+
// already-escaped pre-write bytes and stays unmapped.
|
|
157
|
+
const blockEdit: BlockEditActions = {
|
|
158
|
+
...parentBlockEdit,
|
|
159
|
+
updateBlockContent(i, text, caretBefore, caretAfter) {
|
|
160
|
+
const cellText = trimTrailingLineEnding(text);
|
|
161
|
+
return parentBlockEdit.updateBlockContent(
|
|
162
|
+
i,
|
|
163
|
+
cellText,
|
|
164
|
+
caretBefore,
|
|
165
|
+
caretAfter === undefined ? undefined : escapedCellOffset(cellText, caretAfter)
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
let el: HTMLDivElement | undefined = $state();
|
|
171
|
+
let composing = $state(false);
|
|
172
|
+
// A revealed widget source is ephemeral DOM, so onInput skips the per-keystroke CST
|
|
173
|
+
// commit and the cell commits once on reveal exit (mirrors TextEditableBlock).
|
|
174
|
+
let revealing = $state(false);
|
|
175
|
+
let pendingCursorOffset = $state<number | null>(null);
|
|
176
|
+
|
|
177
|
+
// The door's other half, and the ONLY write of `pendingCursorOffset` besides the render
|
|
178
|
+
// effect's clear. A pending cursor never passes through `blockEdit`, so the caller hands
|
|
179
|
+
// over the text its offset addresses; no text means it already stands in escaped space.
|
|
180
|
+
function parkCursor(offset: number | null, writtenText?: string): void {
|
|
181
|
+
pendingCursorOffset =
|
|
182
|
+
offset === null || writtenText === undefined
|
|
183
|
+
? offset
|
|
184
|
+
: escapedCellOffset(writtenText, offset);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
let preEditOffset = 0;
|
|
188
|
+
// Y is load-bearing for the reveal hit-test: a column-aligned click on another
|
|
189
|
+
// visual line must not reveal.
|
|
190
|
+
let lastClickClientX: number | null = null;
|
|
191
|
+
let lastClickClientY: number | null = null;
|
|
192
|
+
|
|
193
|
+
// Cells carry no ambient marker; at zero ambient the factory is plain widget-aware
|
|
194
|
+
// raw-unit cursor IO (textContent math undercounts widget bytes).
|
|
195
|
+
const cursor = createAmbientCursorIO({
|
|
196
|
+
getEl: () => el ?? null,
|
|
197
|
+
getAmbientLength: () => 0
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
const editableSurface = createEditableSurface({
|
|
201
|
+
...wiring.deps,
|
|
202
|
+
// The wiring's blockEdit is the parent door; this surface writes through the
|
|
203
|
+
// cell's escaping one above.
|
|
204
|
+
blockEdit,
|
|
205
|
+
getEl: () => el ?? null,
|
|
206
|
+
getAmbientLength: () => 0,
|
|
207
|
+
isInputSuppressed: () => revealing,
|
|
208
|
+
backend: {
|
|
209
|
+
getRaw: () => cursor.getRaw(),
|
|
210
|
+
setRaw: (offset) => cursor.setRaw(offset),
|
|
211
|
+
buildRange: (start, end) =>
|
|
212
|
+
createRangeAtDomTextOffsets(el!, toDomTextOffset(start, 0), toDomTextOffset(end, 0))
|
|
213
|
+
},
|
|
214
|
+
getMyPath: () => myPath,
|
|
215
|
+
getIndex: () => index,
|
|
216
|
+
getComposing: () => composing,
|
|
217
|
+
setComposing: (value) => {
|
|
218
|
+
composing = value;
|
|
219
|
+
},
|
|
220
|
+
getPreEditOffset: () => preEditOffset,
|
|
221
|
+
setPreEditOffset: (offset) => {
|
|
222
|
+
preEditOffset = offset;
|
|
223
|
+
},
|
|
224
|
+
setPendingCursor: (offset) => parkCursor(offset),
|
|
225
|
+
getPresentationMode,
|
|
226
|
+
getFocusOffset: () => getRawFocusOffset(),
|
|
227
|
+
getTextLen: () => (el ? containerDomTextLength(el) : 0),
|
|
228
|
+
readText: () => readCellText(),
|
|
229
|
+
relocateComposedText: (after, composedAt) => compositionSeat.relocate(after, composedAt),
|
|
230
|
+
// `saved` re-focuses if the edit remounts the cell, so it is reported through
|
|
231
|
+
// the door's escape.
|
|
232
|
+
commitInput: (text, preEdit, saved) => {
|
|
233
|
+
void blockEdit.updateBlockContent(index, text, preEdit, saved);
|
|
234
|
+
return escapedCellOffset(text, saved);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
// The same seat the keydown dispatch takes, for the one insertion a keydown cannot reach.
|
|
239
|
+
const compositionSeat = createCompositionSeat({
|
|
240
|
+
getDisplayText: () => trimTrailingLineEnding(node.raw),
|
|
241
|
+
getInlines: () => resolvedInlineContent(node, linkRef),
|
|
242
|
+
getAffinity: () => edgeAffinity.get(),
|
|
243
|
+
getScreen: () => screenVisibilityOf(el ?? null),
|
|
244
|
+
consumePendingMarks: () => pendingMarks.consume(),
|
|
245
|
+
restorePendingMarks: (marks) => pendingMarks.restore(marks)
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
const crossBlock = editableSurface.crossBlock;
|
|
249
|
+
const sharedCtx = editableSurface.sharedCtx;
|
|
250
|
+
|
|
251
|
+
// The prose inline-widget seams, threaded with cell-shaped deps: zero ambient, no
|
|
252
|
+
// snap overlay (cells render no image widgets), and the escaping blockEdit.
|
|
253
|
+
const widgetInteraction = createWidgetInteraction({
|
|
254
|
+
get node() {
|
|
255
|
+
return node;
|
|
256
|
+
},
|
|
257
|
+
get index() {
|
|
258
|
+
return index;
|
|
259
|
+
},
|
|
260
|
+
get myPath() {
|
|
261
|
+
return myPath;
|
|
262
|
+
},
|
|
263
|
+
getEl: () => el ?? null,
|
|
264
|
+
getAmbientLength: () => 0,
|
|
265
|
+
getEditorContentWidth: () => getEditorRoot()?.clientWidth ?? FALLBACK_CONTENT_WIDTH,
|
|
266
|
+
cursor,
|
|
267
|
+
widgetSelection,
|
|
268
|
+
blockEdit,
|
|
269
|
+
focusActions,
|
|
270
|
+
setSnapTarget: () => {},
|
|
271
|
+
setPendingCursor: (offset, writtenText) => parkCursor(offset, writtenText),
|
|
272
|
+
readRawText: () => readCellText(),
|
|
273
|
+
setRevealing: (value) => {
|
|
274
|
+
revealing = value;
|
|
275
|
+
},
|
|
276
|
+
isCrossBlock: () => selection.isCrossBlock,
|
|
277
|
+
getPresentationMode,
|
|
278
|
+
get linkRef() {
|
|
279
|
+
return linkRef;
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
// The one caret-edge dispatch (G4.12), same seam prose uses: a plain edge key against
|
|
284
|
+
// a CST widget or a decoration island resolves against its declarative policy.
|
|
285
|
+
const edgeDispatch = createEdgePolicyDispatch({
|
|
286
|
+
get node() {
|
|
287
|
+
return node;
|
|
288
|
+
},
|
|
289
|
+
get index() {
|
|
290
|
+
return index;
|
|
291
|
+
},
|
|
292
|
+
get containerParent() {
|
|
293
|
+
return blockNodeAt(getDoc(), myPath.slice(0, -1));
|
|
294
|
+
},
|
|
295
|
+
get linkRef() {
|
|
296
|
+
return linkRef;
|
|
297
|
+
},
|
|
298
|
+
getEl: () => el ?? null,
|
|
299
|
+
getAmbientLength: () => 0,
|
|
300
|
+
hasIslands: () =>
|
|
301
|
+
decorationEngine ? decorationEngine.islandsForPath(myPath).length > 0 : false,
|
|
302
|
+
getRawSelection: () => cursor.getRawSelection(),
|
|
303
|
+
blockEdit,
|
|
304
|
+
setPendingCursor: (offset, _source, writtenText) => parkCursor(offset, writtenText),
|
|
305
|
+
setSnapTarget: () => {},
|
|
306
|
+
isRevealing: () => widgetInteraction.isRevealing(),
|
|
307
|
+
// A non-reveal widget reached through this seam is an ARROW's entry, so step the
|
|
308
|
+
// caret over it like native contenteditable.
|
|
309
|
+
enterWidget: (widget, fromTrailingEdge) => {
|
|
310
|
+
if (getInlineWidgetEditing(widget.kind)?.revealSource) {
|
|
311
|
+
widgetInteraction.enterWidget(widget, fromTrailingEdge);
|
|
312
|
+
} else {
|
|
313
|
+
cursor.setRaw(asRawOffset(fromTrailingEdge ? widget.start : widget.end));
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
// A cell paints no widget-selection overlay, so the prose select-then-delete default
|
|
317
|
+
// would show nothing between the presses. Scoped to what the cell actually PAINTS as
|
|
318
|
+
// a widget, and merged onto the registered policy rather than replacing it.
|
|
319
|
+
widgetEdgePolicy: (widget) => {
|
|
320
|
+
const registered = getInlineWidgetEditing(widget.kind);
|
|
321
|
+
if (!el || registered?.revealSource) return undefined;
|
|
322
|
+
return widgetElByStart(el, widget.start)
|
|
323
|
+
? { ...registered, deleteGranularity: 'atomic' }
|
|
324
|
+
: undefined;
|
|
325
|
+
},
|
|
326
|
+
isReading: () => readOnly,
|
|
327
|
+
getEdgeAffinity: () => edgeAffinity.get(),
|
|
328
|
+
pendingMarks,
|
|
329
|
+
installedAs: 'cell'
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
// ── BlockComponent interface ────────────────────────────────────────
|
|
333
|
+
|
|
334
|
+
export const editable = true;
|
|
335
|
+
export const focusable = true;
|
|
336
|
+
|
|
337
|
+
export const focus = editableSurface.surface.focus;
|
|
338
|
+
export const parkCaret = editableSurface.surface.parkCaret;
|
|
339
|
+
export const focusAtColumn = editableSurface.surface.focusAtColumn;
|
|
340
|
+
export const getCursorOffset = editableSurface.surface.getCursorOffset;
|
|
341
|
+
export const getSelectedText = editableSurface.surface.getSelectedText;
|
|
342
|
+
export const setSelection = editableSurface.surface.setSelection;
|
|
343
|
+
export const measurePartialRects = editableSurface.surface.measurePartialRects;
|
|
344
|
+
|
|
345
|
+
/** The card's query for this cell. `range` is null at the chord's arm, where a create would
|
|
346
|
+
* have to answer the pipe escapes in cell raw, and the live one at the pressed read. */
|
|
347
|
+
const linkCardQuery = (contentEl: HTMLElement, range: { start: number; end: number } | null) => ({
|
|
348
|
+
contentEl,
|
|
349
|
+
block: node,
|
|
350
|
+
path: myPath,
|
|
351
|
+
linkRef,
|
|
352
|
+
mode: presentationMode,
|
|
353
|
+
selection: range,
|
|
354
|
+
crossBlockRange: selection.isCrossBlock
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
// A toolbar asks once per button on every selection change, so the buttons share the parse.
|
|
358
|
+
const formatActive = createInlineFormatActiveMemo();
|
|
359
|
+
|
|
360
|
+
// The pressed-state read: the same cell text and selection the toggle itself takes, and for
|
|
361
|
+
// the card the same construct its own entry resolves.
|
|
362
|
+
export function isCommandActive(id: CommandId): boolean {
|
|
363
|
+
if (!el) return false;
|
|
364
|
+
const marked = inlineMarkForCommand(id);
|
|
365
|
+
if (!marked) {
|
|
366
|
+
if (id !== 'link.openCard') return false;
|
|
367
|
+
return linkCardTargetAt(linkCardQuery(el, cursor.getRawSelection())) !== null;
|
|
368
|
+
}
|
|
369
|
+
const caret = cursor.getRaw() ?? 0;
|
|
370
|
+
const selection = cursor.getRawSelection() ?? { start: caret, end: caret };
|
|
371
|
+
const cellText = readCellText();
|
|
372
|
+
return formatActive(
|
|
373
|
+
{ display: cellText, content: { start: 0, end: cellText.length }, selection },
|
|
374
|
+
marked.kind
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// Claims the chord even with no caret to act on: declining leaves Mod+B to the browser's
|
|
379
|
+
// own contenteditable bold, an edit this surface never authored.
|
|
380
|
+
function toggleFormat(format: InlineMarkKind): boolean {
|
|
381
|
+
if (!el) return true;
|
|
382
|
+
const caret = cursor.getRaw();
|
|
383
|
+
// A collapsed caret is the empty-pair contract, not a bail — see toggleInlineFormat.
|
|
384
|
+
const offsets =
|
|
385
|
+
cursor.getRawSelection() ?? (caret === null ? null : { start: caret, end: caret });
|
|
386
|
+
if (!offsets) return true;
|
|
387
|
+
// Same fork as the prose surface, on the same question the toggle door asks: a surface
|
|
388
|
+
// painting no delimiter would hold an abandoned empty pair as invisible garbage in the
|
|
389
|
+
// cell's bytes (live-mode.md § 4.3).
|
|
390
|
+
if (!paintsFocusedMarkers(presentationMode) && offsets.start === offsets.end) {
|
|
391
|
+
controller.flushDebouncedCheckpoint();
|
|
392
|
+
pendingMarks.toggle(format);
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
// A cell has no markers of its own, so the whole read is content — taken from the DOM text
|
|
396
|
+
// rather than `getContentRange(node)`, whose bytes carry the escapes the door writes.
|
|
397
|
+
const cellText = readCellText();
|
|
398
|
+
const result = toggleInlineFormat(
|
|
399
|
+
{ display: cellText, content: { start: 0, end: cellText.length }, selection: offsets },
|
|
400
|
+
format,
|
|
401
|
+
presentationMode
|
|
402
|
+
);
|
|
403
|
+
if (!result) return true;
|
|
404
|
+
// Anchor undo at the live post-toggle caret: cross-block dispatch arrives with no
|
|
405
|
+
// preceding onKeyDown, so `preEditOffset` would be stale (mirrors TextEditableBlock).
|
|
406
|
+
// A command is not typing, so the toggle's bytes are their own undo step.
|
|
407
|
+
controller.isolateUndoEntry(() =>
|
|
408
|
+
blockEdit.updateBlockContent(index, result.newDisplay, result.newSelStart, result.newSelStart)
|
|
409
|
+
);
|
|
410
|
+
// The door may have inserted backslashes inside the toggled span, so both selection
|
|
411
|
+
// edges are read back through the escape.
|
|
412
|
+
const selStart = escapedCellOffset(result.newDisplay, result.newSelStart);
|
|
413
|
+
const selEnd = escapedCellOffset(result.newDisplay, result.newSelEnd);
|
|
414
|
+
void tick().then(() => setSelection(selStart, selEnd));
|
|
415
|
+
return true;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* The cell's mutation funnel. A live reveal holds this cell's bytes in ephemeral DOM the CST
|
|
420
|
+
* has not seen, so a mutation would either splice the pre-reveal source or re-derive the whole
|
|
421
|
+
* row from cell raws — dropping the edit. Fold, settle, then act.
|
|
422
|
+
*/
|
|
423
|
+
function afterRevealFold(run: () => void): void {
|
|
424
|
+
if (!widgetInteraction.isRevealing()) {
|
|
425
|
+
run();
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
const fold = widgetInteraction.foldRevealBeforeMutation();
|
|
429
|
+
void (fold?.settled ?? tick()).then(run);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/** One arm per command this cell owns, resolved BEFORE any fold so the fold sits between
|
|
433
|
+
* resolution and mutation — the prose surface's split. Null declines the chord. */
|
|
434
|
+
function cellCommand(id: CommandId, contentEl: HTMLElement): (() => void) | null {
|
|
435
|
+
// The format chords are rows: the construct that declares a mark names the command that
|
|
436
|
+
// toggles it, so this surface grows a new one without an arm.
|
|
437
|
+
const marked = inlineMarkForCommand(id);
|
|
438
|
+
if (marked) return () => void toggleFormat(marked.kind);
|
|
439
|
+
// Consumed whether or not it enters, the prose surface's rule on this surface too:
|
|
440
|
+
// `reservedChords()` reports Mod+K as the editor's wherever the keymaps bind it.
|
|
441
|
+
if (id === 'link.openCard') {
|
|
442
|
+
return () => enterLinkCardAtCaret({ ...linkCardQuery(contentEl, null), card: linkCard });
|
|
443
|
+
}
|
|
444
|
+
const axisCommand = tableAxisCommand(id);
|
|
445
|
+
if (axisCommand) {
|
|
446
|
+
return () =>
|
|
447
|
+
void tableContext[axisCommand.action](axisCommand.axis === 'row' ? rowIdx : colIdx);
|
|
448
|
+
}
|
|
449
|
+
// Moves the whole table: the reorder walk resolves the unit at the nearest ancestor
|
|
450
|
+
// that reorders its children, which a table's grid rows are not.
|
|
451
|
+
if (id === 'block.moveUp' || id === 'block.moveDown') {
|
|
452
|
+
return () => void reorder.nudgeReorderUnit(myPath, id === 'block.moveUp' ? -1 : 1);
|
|
453
|
+
}
|
|
454
|
+
if (id !== 'cell.enter' && id !== 'cell.tab' && id !== 'cell.shiftTab') return null;
|
|
455
|
+
const plan = cellKeydownPlan(
|
|
456
|
+
{
|
|
457
|
+
key: id === 'cell.enter' ? 'Enter' : 'Tab',
|
|
458
|
+
ctrlOrMeta: false,
|
|
459
|
+
shiftKey: id === 'cell.shiftTab',
|
|
460
|
+
altKey: false
|
|
461
|
+
},
|
|
462
|
+
cellPlanState(cursor.getRaw() ?? 0)
|
|
463
|
+
);
|
|
464
|
+
if (plan.kind === 'native' || plan.kind === 'select-all-step') return null;
|
|
465
|
+
return () => void applyCellPlan(plan);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// Every chord the `tableCell` keymap binds arrives here, including from cross-block
|
|
469
|
+
// dispatch, which carries no event — so the 'native'/'select-all-step' plans are
|
|
470
|
+
// declined by the arm table and only the action plans run.
|
|
471
|
+
export function runCommand(id: CommandId): boolean {
|
|
472
|
+
if (!el) return false;
|
|
473
|
+
const perform = cellCommand(id, el);
|
|
474
|
+
if (!perform) return false;
|
|
475
|
+
afterRevealFold(perform);
|
|
476
|
+
return true;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// The ONE surface literal: the row mounts this cell with no `bind:this`, so the published slot
|
|
480
|
+
// is the only channel a caller reaches it through — and the parity G4.38 scans.
|
|
481
|
+
$effect(() => {
|
|
482
|
+
if (!slots) return;
|
|
483
|
+
const self = {
|
|
484
|
+
editable,
|
|
485
|
+
focusable,
|
|
486
|
+
focus,
|
|
487
|
+
parkCaret,
|
|
488
|
+
getCursorOffset,
|
|
489
|
+
focusAtColumn,
|
|
490
|
+
getSelectedText,
|
|
491
|
+
setSelection,
|
|
492
|
+
measurePartialRects,
|
|
493
|
+
runCommand,
|
|
494
|
+
getSelectionOffsets,
|
|
495
|
+
applyMenuClipboard,
|
|
496
|
+
snapCaretToPoint,
|
|
497
|
+
insertMarkdown: clipboard.insertMarkdown
|
|
498
|
+
} satisfies BlockComponent;
|
|
499
|
+
return publishRefSlot(slots, index, self, el);
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
// ── Render pipeline ────────────────────────────────────────────────────
|
|
503
|
+
|
|
504
|
+
const cellRender = createCellRender({
|
|
505
|
+
get el() {
|
|
506
|
+
return el ?? null;
|
|
507
|
+
},
|
|
508
|
+
get node() {
|
|
509
|
+
return node;
|
|
510
|
+
},
|
|
511
|
+
get linkRef() {
|
|
512
|
+
return linkRef;
|
|
513
|
+
},
|
|
514
|
+
resolveLinkUrl,
|
|
515
|
+
get presentationMode() {
|
|
516
|
+
return presentationMode;
|
|
517
|
+
},
|
|
518
|
+
getTheme,
|
|
519
|
+
getDocument: () => getDoc(),
|
|
520
|
+
getContentVersion,
|
|
521
|
+
navigateTo: (path) => rects.navigateTo(path),
|
|
522
|
+
get islands() {
|
|
523
|
+
return decorationEngine ? decorationEngine.islandsForPath(myPath) : NO_ISLANDS;
|
|
524
|
+
},
|
|
525
|
+
reportRenderError: (error) =>
|
|
526
|
+
editorEvents?.emit('error', { origin: 'render', error, context: { path: myPath } })
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
$effect(() => {
|
|
530
|
+
if (!el) return;
|
|
531
|
+
cellRender.render({
|
|
532
|
+
forceRebuild: pendingCursorOffset !== null,
|
|
533
|
+
carryCaret: pendingCursorOffset === null
|
|
534
|
+
});
|
|
535
|
+
if (pendingCursorOffset !== null) {
|
|
536
|
+
consumePendingRestore(el, pendingCursorOffset, (offset) =>
|
|
537
|
+
cursor.setRaw(asRawOffset(offset))
|
|
538
|
+
);
|
|
539
|
+
pendingCursorOffset = null;
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
$effect(() => () => cellRender.dispose());
|
|
544
|
+
|
|
545
|
+
useParkFocusOnUnmount(() => el ?? null, getEditorRoot);
|
|
546
|
+
|
|
547
|
+
// A selection move that leaves a revealed source but stays inside the cell folds the
|
|
548
|
+
// reveal; blur owns the focus-leaving fold. Composition suppresses it like onInput.
|
|
549
|
+
$effect(() => {
|
|
550
|
+
const root = el;
|
|
551
|
+
if (!root) return;
|
|
552
|
+
const handler = () => {
|
|
553
|
+
if (composing) return;
|
|
554
|
+
widgetInteraction.foldRevealIfSelectionEscaped();
|
|
555
|
+
};
|
|
556
|
+
document.addEventListener('selectionchange', handler);
|
|
557
|
+
return () => document.removeEventListener('selectionchange', handler);
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
// Not textContent: a rendered widget carries zero textContent but several raw bytes.
|
|
561
|
+
function readCellText(): string {
|
|
562
|
+
return el ? rawTextOfNode(el, node.raw) : '';
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// Zero-ambient cell: the walk offset IS the raw offset.
|
|
566
|
+
function getRawFocusOffset(): RawOffset | null {
|
|
567
|
+
return el ? selectionFocusWalkOffset(el, 0) : null;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// ── Event handlers ─────────────────────────────────────────────────────
|
|
571
|
+
|
|
572
|
+
const onInput = editableSurface.onInput;
|
|
573
|
+
// Captured before the surface's own handler: its cross-block half clears the affinity, and
|
|
574
|
+
// the first mid-composition `input` re-arms it to the typed side.
|
|
575
|
+
function onCompositionStart(): void {
|
|
576
|
+
compositionSeat.noteStart();
|
|
577
|
+
editableSurface.onCompositionStart();
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
function onCompositionEnd(): void {
|
|
581
|
+
editableSurface.onCompositionEnd();
|
|
582
|
+
compositionSeat.noteEnd();
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// Shared by the live keydown path and the cross-block dispatch entry, which differ
|
|
586
|
+
// only in where the offset comes from; both guard `el` before calling.
|
|
587
|
+
function cellPlanState(offset: number): CellKeyState {
|
|
588
|
+
// Zero-ambient cell: the walk offsets ARE the raw offsets the plan compares. Deliberately
|
|
589
|
+
// unguarded by mode, unlike the prose bounds — a cell's hop follows what is ON SCREEN, so
|
|
590
|
+
// the bound tracks preview-inline's proximity reveal.
|
|
591
|
+
const bounds = landableDomTextBounds(el!);
|
|
592
|
+
return {
|
|
593
|
+
rowIdx,
|
|
594
|
+
colIdx,
|
|
595
|
+
columnCount,
|
|
596
|
+
rowCount,
|
|
597
|
+
offset,
|
|
598
|
+
contentStart: bounds.start,
|
|
599
|
+
contentEnd: bounds.end,
|
|
600
|
+
collapsed: !hasSelectionHelper(),
|
|
601
|
+
selectAllCount: selection.selectAllCount
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
async function onKeyDown(e: KeyboardEvent): Promise<void> {
|
|
606
|
+
if (composing || !el) return;
|
|
607
|
+
|
|
608
|
+
// Ahead of the plan, in the shared prelude's position: the prelude's own reset is
|
|
609
|
+
// reachable only on the 'native' arm, so every key the plan claims would leave the
|
|
610
|
+
// select-all run armed. `eventToChord` declines bare modifiers and uppercases.
|
|
611
|
+
const chord = eventToChord(e);
|
|
612
|
+
if (chord !== null && chord !== SELECT_ALL_CHORD) selection.resetSelectAllCount();
|
|
613
|
+
|
|
614
|
+
// Must precede cellKeydownPlan, which claims arrows and preventDefaults without
|
|
615
|
+
// reaching here — leaving a live selection the next keystroke would range-replace.
|
|
616
|
+
if (selection.isCrossBlock && (await crossBlock.handleKeyDown(e))) return;
|
|
617
|
+
|
|
618
|
+
// Reveal/selection intercepts before the plan, which would otherwise read a
|
|
619
|
+
// mid-reveal ArrowUp/Down as cell nav.
|
|
620
|
+
if ((await widgetInteraction.handleRevealingKeydown(e)) || editableSurface.isDetached()) return;
|
|
621
|
+
// Enter is a cell's exception: prose splits, a cell hops rows, and hopping would
|
|
622
|
+
// carry the ephemeral edit out of the surface that owns it. Commit and stay put.
|
|
623
|
+
if (widgetInteraction.isRevealing() && e.key === 'Enter' && !e.ctrlKey && !e.metaKey) {
|
|
624
|
+
e.preventDefault();
|
|
625
|
+
widgetInteraction.foldRevealBeforeMutation();
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
if ((await widgetInteraction.handleSelectedWidgetKeydown(e)) || editableSurface.isDetached())
|
|
629
|
+
return;
|
|
630
|
+
if (widgetInteraction.handleShiftArrowIntoWidget(e)) return;
|
|
631
|
+
|
|
632
|
+
preEditOffset = cursor.getRaw() ?? 0;
|
|
633
|
+
|
|
634
|
+
// FIRST, because neither the navigation plan's boundary branches nor the shared
|
|
635
|
+
// prelude's ArrowLeft@0 hop tests modifiers: either would eat the column reorder at
|
|
636
|
+
// a cell's left edge. Also the only point a consumer `keybindings` override reaches.
|
|
637
|
+
if (wiring.dispatchChord(e, { kind: node.kind, runCommand })) return;
|
|
638
|
+
|
|
639
|
+
const plan = cellKeydownPlan(
|
|
640
|
+
{ key: e.key, ctrlOrMeta: e.ctrlKey || e.metaKey, shiftKey: e.shiftKey, altKey: e.altKey },
|
|
641
|
+
cellPlanState(preEditOffset)
|
|
642
|
+
);
|
|
643
|
+
|
|
644
|
+
switch (plan.kind) {
|
|
645
|
+
case 'native': {
|
|
646
|
+
// The first Shift+ArrowUp/Down at a cell's vertical edge takes a whole row;
|
|
647
|
+
// the shared prose extend would instead walk the next doc-order leaf.
|
|
648
|
+
if (
|
|
649
|
+
!selection.isCrossBlock &&
|
|
650
|
+
e.shiftKey &&
|
|
651
|
+
!e.altKey &&
|
|
652
|
+
!e.ctrlKey &&
|
|
653
|
+
!e.metaKey &&
|
|
654
|
+
(e.key === 'ArrowUp' || e.key === 'ArrowDown') &&
|
|
655
|
+
startIntraTableRect(e.key, preEditOffset)
|
|
656
|
+
) {
|
|
657
|
+
e.preventDefault();
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
if (await handleSharedKeydown(e, sharedCtx)) return;
|
|
661
|
+
// Runs only where the plan yielded 'native': at the text boundaries the plan
|
|
662
|
+
// claims, an entered widget sits outside the boundary and the dispatch declines.
|
|
663
|
+
if (edgeDispatch.handleKeydown(e, cursor.getRaw())) return;
|
|
664
|
+
return;
|
|
665
|
+
}
|
|
666
|
+
// Cells override the document-level 2-stage Ctrl+A with a 3-stage table-aware
|
|
667
|
+
// variant; the intra-cell step stays native.
|
|
668
|
+
case 'select-all-step':
|
|
669
|
+
selection.incrementSelectAllCount();
|
|
670
|
+
if (plan.step === 'native') return;
|
|
671
|
+
e.preventDefault();
|
|
672
|
+
if (plan.step === 'table') {
|
|
673
|
+
const tablePath = myPath.slice(0, -2);
|
|
674
|
+
// Flagged row-major like the drag/shift-click anchor, so a later
|
|
675
|
+
// exit-the-table extend snaps its whole row.
|
|
676
|
+
selection.enterCrossBlock(
|
|
677
|
+
{ path: tablePath, offset: 0, cellCoordinate: true } satisfies CellSelectionPoint,
|
|
678
|
+
{ path: tablePath, offset: columnCount * rowCount - 1 }
|
|
679
|
+
);
|
|
680
|
+
} else {
|
|
681
|
+
selectWholeDocument(selection, getDoc(), getBlockElByPath);
|
|
682
|
+
}
|
|
683
|
+
return;
|
|
684
|
+
default:
|
|
685
|
+
e.preventDefault();
|
|
686
|
+
// Reading mode keeps navigation and swallows the structural plans.
|
|
687
|
+
if (readOnly && plan.kind !== 'focus-cell' && plan.kind !== 'exit') return;
|
|
688
|
+
await applyCellPlan(plan);
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
// The navigation plans, no live event needed; the caller preventDefaults. The fold is here
|
|
694
|
+
// rather than at each caller: insert-row-below rebuilds every row from cell raws, so an open
|
|
695
|
+
// reveal's edit would be re-derived away.
|
|
696
|
+
async function applyCellPlan(plan: CellKeyPlan): Promise<void> {
|
|
697
|
+
const fold = widgetInteraction.foldRevealBeforeMutation();
|
|
698
|
+
if (fold) await fold.settled;
|
|
699
|
+
switch (plan.kind) {
|
|
700
|
+
case 'focus-cell':
|
|
701
|
+
if (plan.setStickyColumn !== undefined) tableContext.setStickyColumn(plan.setStickyColumn);
|
|
702
|
+
tableContext.focusCell(plan.rowIdx, plan.colIdx, plan.position);
|
|
703
|
+
return;
|
|
704
|
+
case 'insert-row-below':
|
|
705
|
+
await tableContext.insertRowBelow(rowIdx);
|
|
706
|
+
return;
|
|
707
|
+
case 'exit':
|
|
708
|
+
exitWithStickyX(plan.direction);
|
|
709
|
+
return;
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
// Enter an intra-table rectangle from a collapsed cell caret on the first
|
|
714
|
+
// Shift+ArrowUp/Down. Gated on the cell's visual edge so a multi-line cell still
|
|
715
|
+
// extends its own text first (prose parity). Returns false to fall through.
|
|
716
|
+
function startIntraTableRect(key: 'ArrowUp' | 'ArrowDown', offset: number): boolean {
|
|
717
|
+
if (!el) return false;
|
|
718
|
+
const bounds = landableDomTextBounds(el);
|
|
719
|
+
const atEdge =
|
|
720
|
+
key === 'ArrowDown'
|
|
721
|
+
? isAtLastVisualLine(el, offset, bounds.end)
|
|
722
|
+
: isAtFirstVisualLine(el, offset, bounds.start);
|
|
723
|
+
if (!atEdge) return false;
|
|
724
|
+
|
|
725
|
+
const tablePath = myPath.slice(0, -2);
|
|
726
|
+
const currentIdx = rowIdx * columnCount + colIdx;
|
|
727
|
+
const currentPoint: SelectionPoint = { path: tablePath, offset: currentIdx };
|
|
728
|
+
const ext = intraTableRectExtension(getDoc(), currentPoint, currentPoint, key);
|
|
729
|
+
if (!ext) return false;
|
|
730
|
+
|
|
731
|
+
const anchor = {
|
|
732
|
+
path: tablePath,
|
|
733
|
+
offset: currentIdx,
|
|
734
|
+
cellCoordinate: true
|
|
735
|
+
} satisfies CellSelectionPoint;
|
|
736
|
+
if (ext.kind === 'cell') {
|
|
737
|
+
selection.enterCrossBlock(anchor, { path: tablePath.slice(), offset: ext.offset });
|
|
738
|
+
return true;
|
|
739
|
+
}
|
|
740
|
+
// Enter the rect at the current cell, then hand off to the block-level extend so
|
|
741
|
+
// the selection leaves the table. The seed is minted before the extend can answer, so
|
|
742
|
+
// a decline (no block past the table) has to take it back: the stored pair would be an
|
|
743
|
+
// invisible selection the next Backspace deletes the whole cell through.
|
|
744
|
+
selection.enterCrossBlock(anchor, { path: tablePath.slice(), offset: currentIdx });
|
|
745
|
+
const extended =
|
|
746
|
+
ext.direction === 'forward'
|
|
747
|
+
? extendFocusToNextBlock(selection, getDoc(), el, ext.fromCellPath, 'vertical')
|
|
748
|
+
: extendFocusToPreviousBlock(selection, getDoc(), el, ext.fromCellPath, 'start');
|
|
749
|
+
if (!extended) {
|
|
750
|
+
selection.collapse();
|
|
751
|
+
return false;
|
|
752
|
+
}
|
|
753
|
+
return true;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
function exitWithStickyX(direction: ExitDirection): void {
|
|
757
|
+
if (!el) return;
|
|
758
|
+
const x = getCurrentCursorEditorRelativeX(el) ?? 0;
|
|
759
|
+
if (direction === 'up') tableContext.exitUpward(x);
|
|
760
|
+
else tableContext.exitDownward(x);
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// The cell at the prose surface's live ranged-edit arm: a native edit over a range spanning
|
|
764
|
+
// hidden delimiters is the destructive family with no seam offsets of its own.
|
|
765
|
+
function handleLiveSelectionEdit(e: InputEvent): boolean {
|
|
766
|
+
return applyLiveRangeEdit(
|
|
767
|
+
e,
|
|
768
|
+
node,
|
|
769
|
+
cursor,
|
|
770
|
+
presentationMode,
|
|
771
|
+
linkRef,
|
|
772
|
+
'',
|
|
773
|
+
widgetInteraction.isRevealing,
|
|
774
|
+
(edit) => {
|
|
775
|
+
void blockEdit.updateBlockContent(index, edit.raw, edit.range.start, edit.caret);
|
|
776
|
+
parkCursor(edit.caret, edit.raw);
|
|
777
|
+
}
|
|
778
|
+
);
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
async function onBeforeInput(e: InputEvent): Promise<void> {
|
|
782
|
+
if (await handleSharedBeforeInput(e, sharedCtx)) return;
|
|
783
|
+
if (handleLiveSelectionEdit(e)) return;
|
|
784
|
+
if (e.inputType === 'insertLineBreak') {
|
|
785
|
+
// GFM cells can't carry raw newlines, so a line break is a literal `<br>`,
|
|
786
|
+
// which the inline-HTML pipeline renders as a live widget.
|
|
787
|
+
e.preventDefault();
|
|
788
|
+
if (!el) return;
|
|
789
|
+
// Both reads below are taken AFTER the fold: the committed text is what the offset
|
|
790
|
+
// they splice must be measured against.
|
|
791
|
+
const fold = widgetInteraction.foldRevealBeforeMutation();
|
|
792
|
+
if (fold) await fold.settled;
|
|
793
|
+
const offset = cursor.getRaw() ?? 0;
|
|
794
|
+
const text = readCellText();
|
|
795
|
+
const inserted = '<br>';
|
|
796
|
+
const newText = text.slice(0, offset) + inserted + text.slice(offset);
|
|
797
|
+
const caret = offset + inserted.length;
|
|
798
|
+
void blockEdit.updateBlockContent(index, newText, offset, caret);
|
|
799
|
+
parkCursor(caret, newText);
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
function onPointerDown(e: PointerEvent): void {
|
|
805
|
+
if (!el) return;
|
|
806
|
+
// The clear + drag-install below would collapse an active rectangle before
|
|
807
|
+
// contextmenu fires, leaving the menu's Cut/Copy nothing to act on.
|
|
808
|
+
if (e.button === 2) return;
|
|
809
|
+
lastClickClientX = e.clientX;
|
|
810
|
+
lastClickClientY = e.clientY;
|
|
811
|
+
// A press on a reveal-source widget is an owned gesture: suppress the browser caret
|
|
812
|
+
// default and skip the drag so nothing races the reveal's own placement.
|
|
813
|
+
if (widgetInteraction.isPointOnRevealWidget(e.clientX, e.clientY)) {
|
|
814
|
+
e.preventDefault();
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
817
|
+
const tableEl = el.closest('[role="table"]') as HTMLElement | null;
|
|
818
|
+
if (!tableEl) {
|
|
819
|
+
crossBlock.handlePointerDown(e);
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
const tablePath = myPath.slice(0, -2);
|
|
823
|
+
const anchor: CellAnchor = {
|
|
824
|
+
tableEl,
|
|
825
|
+
tablePath,
|
|
826
|
+
rowIdx,
|
|
827
|
+
colIdx,
|
|
828
|
+
columnCount
|
|
829
|
+
};
|
|
830
|
+
|
|
831
|
+
resetForPointerDown(selection, stickyColumn, edgeAffinity, e.shiftKey);
|
|
832
|
+
|
|
833
|
+
if (e.shiftKey) {
|
|
834
|
+
const prevCoords = cellCoordsOfElement(document.activeElement, tableEl);
|
|
835
|
+
if (prevCoords && (prevCoords.rowIdx !== rowIdx || prevCoords.colIdx !== colIdx)) {
|
|
836
|
+
handleCellShiftClick(
|
|
837
|
+
selection,
|
|
838
|
+
{ ...anchor, rowIdx: prevCoords.rowIdx, colIdx: prevCoords.colIdx },
|
|
839
|
+
{ rowIdx, colIdx }
|
|
840
|
+
);
|
|
841
|
+
e.preventDefault();
|
|
842
|
+
return;
|
|
843
|
+
}
|
|
844
|
+
crossBlock.handlePointerDown(e);
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
const editorRoot = getEditorRoot();
|
|
849
|
+
if (!editorRoot) return;
|
|
850
|
+
installCellDragListener({ editorRoot, selection, lifetimeSignal: editorLifetime }, anchor, e);
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// Copy/cut/paste through the shared skeleton. The cell's extra arms are the intra-table
|
|
854
|
+
// rectangle (copied as a GFM sub-table) and the intra-cell raw slice, which preserves
|
|
855
|
+
// widget bytes like `<br>` that the browser's rendered-textContent copy drops.
|
|
856
|
+
const clipboard = createClipboardHandlers({
|
|
857
|
+
stickyColumn,
|
|
858
|
+
edgeAffinity,
|
|
859
|
+
selection,
|
|
860
|
+
getDoc,
|
|
861
|
+
crossBlock,
|
|
862
|
+
isReadOnly: () => readOnly,
|
|
863
|
+
caret: editableSurface.caret,
|
|
864
|
+
events: editorEvents,
|
|
865
|
+
onPasteImage,
|
|
866
|
+
foldReveal: () => widgetInteraction.foldRevealBeforeMutation(),
|
|
867
|
+
copyPreHook: (e) => {
|
|
868
|
+
const rectPayload = intraTableRectPayload({ selection, getDoc });
|
|
869
|
+
if (rectPayload === null) return false;
|
|
870
|
+
e.preventDefault();
|
|
871
|
+
e.clipboardData?.setData('text/plain', rectPayload);
|
|
872
|
+
return true;
|
|
873
|
+
},
|
|
874
|
+
// During a reveal the swapped DOM holds an edit `node.raw` hasn't seen; copy never
|
|
875
|
+
// mutates, so it slices the live DOM text rather than folding first.
|
|
876
|
+
copyTail: (e) => {
|
|
877
|
+
if (!el) return;
|
|
878
|
+
const offsets = cursor.getRawSelection();
|
|
879
|
+
if (!offsets || offsets.start === offsets.end) return;
|
|
880
|
+
e.preventDefault();
|
|
881
|
+
const display = widgetInteraction.isRevealing()
|
|
882
|
+
? readCellText()
|
|
883
|
+
: trimTrailingLineEnding(node.raw);
|
|
884
|
+
e.clipboardData?.setData('text/plain', display.slice(offsets.start, offsets.end));
|
|
885
|
+
},
|
|
886
|
+
// Clears the cells in place, without `tableCoverageDelete` — only Backspace's
|
|
887
|
+
// structural delete opts into row/column/table removal.
|
|
888
|
+
cutPreHook: async (e) => {
|
|
889
|
+
const rectPayload = intraTableRectPayload({ selection, getDoc });
|
|
890
|
+
if (rectPayload === null) return false;
|
|
891
|
+
e.clipboardData?.setData('text/plain', rectPayload);
|
|
892
|
+
await crossBlock.performCrossBlockDeleteFromEvent();
|
|
893
|
+
return true;
|
|
894
|
+
},
|
|
895
|
+
// The write must be sync (clipboardData closes after the event), and the truncation
|
|
896
|
+
// goes through the CST: native deleteByCut would leave a stale snapshot anchor.
|
|
897
|
+
cutTail: (e) => {
|
|
898
|
+
if (!el) return;
|
|
899
|
+
const offsets = cursor.getRawSelection();
|
|
900
|
+
if (!offsets || offsets.start === offsets.end) return;
|
|
901
|
+
const display = trimTrailingLineEnding(node.raw);
|
|
902
|
+
e.clipboardData?.setData('text/plain', display.slice(offsets.start, offsets.end));
|
|
903
|
+
deleteCellRange(offsets.start, offsets.end);
|
|
904
|
+
},
|
|
905
|
+
pasteTail: async (pastedText) => {
|
|
906
|
+
if (!el) return;
|
|
907
|
+
const selOffsets = cursor.getRawSelection();
|
|
908
|
+
const start = selOffsets ? selOffsets.start : (cursor.getRaw() ?? 0);
|
|
909
|
+
await applyCellPaste(pastedText, { start, end: selOffsets ? selOffsets.end : start });
|
|
910
|
+
}
|
|
911
|
+
});
|
|
912
|
+
const { onCopy, onCut, onPaste } = clipboard;
|
|
913
|
+
|
|
914
|
+
// ── Shared mutation primitives (event handlers + right-click menu) ───────
|
|
915
|
+
|
|
916
|
+
// The truncation is a join like the paste's delete half: in live the runs it strands are
|
|
917
|
+
// bytes the reader never saw, so it crosses the same seam ahead of the escaping sink
|
|
918
|
+
// (live-mode.md § 4.5).
|
|
919
|
+
function deleteCellRange(start: number, end: number): void {
|
|
920
|
+
const display = trimTrailingLineEnding(node.raw);
|
|
921
|
+
const cut = cutRangeFromDisplay(node, display, { start, end }, presentationMode, linkRef);
|
|
922
|
+
void blockEdit.updateBlockContent(index, cut.display, start, cut.offset);
|
|
923
|
+
parkCursor(cut.offset, cut.display);
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
async function applyCellPaste(
|
|
927
|
+
pastedText: string,
|
|
928
|
+
sel: { start: number; end: number }
|
|
929
|
+
): Promise<void> {
|
|
930
|
+
const result = await pasteDispatch(
|
|
931
|
+
{
|
|
932
|
+
pastedText,
|
|
933
|
+
targetPath: myPath,
|
|
934
|
+
offset: sel.start,
|
|
935
|
+
preDelete: sel.start !== sel.end ? { start: sel.start, end: sel.end } : undefined
|
|
936
|
+
},
|
|
937
|
+
{
|
|
938
|
+
doc: getDoc(),
|
|
939
|
+
blockEdit,
|
|
940
|
+
controller: pasteCoordinator,
|
|
941
|
+
grammar,
|
|
942
|
+
activePlugins,
|
|
943
|
+
// The delete half is a join like any other, and a cell's is no more literal than a
|
|
944
|
+
// paragraph's: without the seam a live cut pastes the runs it stranded into view.
|
|
945
|
+
seam: { presentationMode, linkRef }
|
|
946
|
+
}
|
|
947
|
+
);
|
|
948
|
+
// Already escaped: the cell's paste surface reports its caret in escaped space.
|
|
949
|
+
if (result.inlineCaretOffset !== undefined) parkCursor(result.inlineCaretOffset);
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
// ── Right-click menu clipboard (no ClipboardEvent) ──────────────────────
|
|
953
|
+
//
|
|
954
|
+
// Copy/Cut restore the range and fire `execCommand('copy')`, keeping the clipboard write
|
|
955
|
+
// synchronous the way Tauri needs and `navigator.clipboard.writeText` isn't. `execCommand('cut')`
|
|
956
|
+
// is unusable because onCut's write trails an await, so Cut copies then deletes; paste has no
|
|
957
|
+
// sync equivalent at all.
|
|
958
|
+
|
|
959
|
+
function getSelectionOffsets(): { start: number; end: number } | null {
|
|
960
|
+
const range = cursor.getRawSelection();
|
|
961
|
+
if (range) return range;
|
|
962
|
+
const caret = cursor.getRaw();
|
|
963
|
+
return caret === null ? null : { start: caret, end: caret };
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
async function applyMenuClipboard(
|
|
967
|
+
action: ClipboardAction,
|
|
968
|
+
sel: { start: number; end: number }
|
|
969
|
+
): Promise<void> {
|
|
970
|
+
if (!el) return;
|
|
971
|
+
// Belt behind TableBlock's menu-open gate: paste and cut mutate.
|
|
972
|
+
if (readOnly && action !== 'copy') return;
|
|
973
|
+
// Right-click deliberately skips the pointerdown reset, so the reveal is still open here
|
|
974
|
+
// and `sel` was captured in the REVEALED DOM's coordinates — a fold before any of it.
|
|
975
|
+
const fold = widgetInteraction.foldRevealBeforeMutation();
|
|
976
|
+
if (fold) await fold.settled;
|
|
977
|
+
// A rectangle has no cell-local range to restore: refocusing keeps it live in
|
|
978
|
+
// SelectionState, and the onCopy/onCut rect arms do the rest.
|
|
979
|
+
const hasRect = action !== 'paste' && intraTableRectPayload({ selection, getDoc }) !== null;
|
|
980
|
+
if (action !== 'paste' && !hasRect && sel.start === sel.end) return;
|
|
981
|
+
// Clicking the menu item moved focus off the cell, so every branch refocuses before
|
|
982
|
+
// mutating: execCommand needs the restored range, paste needs a focused caret.
|
|
983
|
+
stickyColumn.reset();
|
|
984
|
+
edgeAffinity.reset();
|
|
985
|
+
el.focus();
|
|
986
|
+
if (action === 'paste') {
|
|
987
|
+
let raw: string;
|
|
988
|
+
try {
|
|
989
|
+
// Fired un-awaited from the menu onclick, so a denied read would surface as
|
|
990
|
+
// an unhandled rejection; degrade to a no-op.
|
|
991
|
+
raw = await navigator.clipboard.readText();
|
|
992
|
+
} catch {
|
|
993
|
+
return;
|
|
994
|
+
}
|
|
995
|
+
const text = normalizeLineEndings(raw);
|
|
996
|
+
if (text) await applyCellPaste(text, sel);
|
|
997
|
+
return;
|
|
998
|
+
}
|
|
999
|
+
if (hasRect) {
|
|
1000
|
+
document.execCommand('copy');
|
|
1001
|
+
if (action === 'cut') await crossBlock.performCrossBlockDeleteFromEvent();
|
|
1002
|
+
return;
|
|
1003
|
+
}
|
|
1004
|
+
setSelection(sel.start, sel.end);
|
|
1005
|
+
document.execCommand('copy');
|
|
1006
|
+
if (action === 'cut') deleteCellRange(sel.start, sel.end);
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
// A click past a widget drops the caret at an element-level position with no text
|
|
1010
|
+
// anchor, so snap to the nearest widget edge (or reveal). Normal text clicks fall
|
|
1011
|
+
// through untouched.
|
|
1012
|
+
function onClick(e: MouseEvent): void {
|
|
1013
|
+
const x = lastClickClientX;
|
|
1014
|
+
const y = lastClickClientY;
|
|
1015
|
+
lastClickClientX = null;
|
|
1016
|
+
lastClickClientY = null;
|
|
1017
|
+
widgetInteraction.snapClickToWidgetEdge(x, y, {
|
|
1018
|
+
modified: e.ctrlKey || e.metaKey,
|
|
1019
|
+
clickCount: e.detail
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
function snapCaretToPoint(clientX: number, clientY: number): void {
|
|
1024
|
+
widgetInteraction.snapClickToWidgetEdge(clientX, clientY);
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
function onFocus(): void {
|
|
1028
|
+
tableContext.notifyCellFocused(rowIdx, colIdx);
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
function onBlur(e: FocusEvent): void {
|
|
1032
|
+
// Persist a revealed source edit before the caret is gone; the render effect's
|
|
1033
|
+
// activeElement guard keeps the commit from yanking focus back.
|
|
1034
|
+
if (!(el && e.relatedTarget && el.contains(e.relatedTarget as Node))) {
|
|
1035
|
+
widgetInteraction.commitRevealOnBlur();
|
|
1036
|
+
}
|
|
1037
|
+
tableContext.notifyCellBlurred();
|
|
1038
|
+
}
|
|
1039
|
+
</script>
|
|
1040
|
+
|
|
1041
|
+
<div
|
|
1042
|
+
bind:this={el}
|
|
1043
|
+
tabindex="0"
|
|
1044
|
+
class="table-cell"
|
|
1045
|
+
contenteditable={readOnly ? 'false' : 'true'}
|
|
1046
|
+
role="cell"
|
|
1047
|
+
style:text-align={alignment === 'none' ? undefined : alignment}
|
|
1048
|
+
oninput={onInput}
|
|
1049
|
+
onkeydown={onKeyDown}
|
|
1050
|
+
onbeforeinput={onBeforeInput}
|
|
1051
|
+
onpointerdown={onPointerDown}
|
|
1052
|
+
onclick={onClick}
|
|
1053
|
+
oncopy={onCopy}
|
|
1054
|
+
oncut={onCut}
|
|
1055
|
+
onpaste={onPaste}
|
|
1056
|
+
onfocus={onFocus}
|
|
1057
|
+
onblur={onBlur}
|
|
1058
|
+
oncompositionstart={onCompositionStart}
|
|
1059
|
+
oncompositionend={onCompositionEnd}
|
|
1060
|
+
></div>
|
|
1061
|
+
|
|
1062
|
+
<style>
|
|
1063
|
+
.table-cell {
|
|
1064
|
+
outline: none;
|
|
1065
|
+
padding: 4px 8px;
|
|
1066
|
+
min-height: 1.4em;
|
|
1067
|
+
white-space: pre-wrap;
|
|
1068
|
+
word-wrap: break-word;
|
|
1069
|
+
border: 1px solid var(--color-ui-muted, #a4a4a4);
|
|
1070
|
+
}
|
|
1071
|
+
.table-cell:focus {
|
|
1072
|
+
outline: 2px solid var(--color-accent, #567b67);
|
|
1073
|
+
outline-offset: -2px;
|
|
1074
|
+
}
|
|
1075
|
+
</style>
|