edytor 1.0.0-rc.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +27 -137
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.js +7 -7
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +4 -17
- package/dist/cloudflare/DocumentRoom.js +3 -5
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +19 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +3 -32
- package/dist/cloudflare/room/storage.js +33 -108
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +39 -55
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +53 -96
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +2 -5
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +8 -13
- package/dist/crdt/data.js +30 -70
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/dnd/autoScroll.js +1 -2
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +34 -64
- package/dist/edytor.svelte.js +116 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +185 -181
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +1 -1
- package/dist/events/onDrop.js +27 -69
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +45 -67
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -14
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +81 -320
- package/dist/labels.js +180 -408
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -154
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +39 -94
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +190 -247
- package/dist/plugins/blockHandles/BlockHandles.svelte +27 -17
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +129 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +2 -1
- package/dist/plugins/blockHandles/geometry.js +6 -6
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +45 -38
- package/dist/plugins/chrome.js +59 -36
- package/dist/plugins/code/CodeHeader.svelte +3 -35
- package/dist/plugins/code/CodePlugin.svelte +50 -53
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +16 -125
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
- package/dist/plugins/code/code.css +5 -117
- package/dist/plugins/code/header.svelte.d.ts +2 -11
- package/dist/plugins/code/header.svelte.js +11 -38
- package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
- package/dist/plugins/code/languageMenu.svelte.js +30 -160
- package/dist/plugins/code/languages.d.ts +9 -19
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -431
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
- package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +16 -130
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
- package/dist/plugins/equation/EquationPlugin.svelte +109 -165
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +2 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +37 -24
- package/dist/plugins/equation/equation.svelte.js +20 -94
- package/dist/plugins/equation/katex.js +6 -9
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +6 -167
- package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
- package/dist/plugins/image/ImagePlugin.svelte +45 -134
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -42
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -36
- package/dist/plugins/image/controls.svelte.js +43 -212
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +31 -26
- package/dist/plugins/index.js +29 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
- package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
- package/dist/plugins/marquee/marquee.js +4 -21
- package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
- package/dist/plugins/marquee/marqueePlugin.js +16 -15
- package/dist/plugins/media/AudioPlugin.svelte +3 -90
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
- package/dist/plugins/media/EmbedPlugin.svelte +82 -86
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +35 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +51 -90
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -99
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +36 -44
- package/dist/plugins/media/empty.svelte.js +41 -45
- package/dist/plugins/media/media.d.ts +90 -44
- package/dist/plugins/media/media.js +77 -99
- package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
- package/dist/plugins/media/urlPaste.svelte.js +32 -102
- package/dist/plugins/mention/MentionPlugin.svelte +42 -123
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +6 -25
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +47 -107
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +6 -25
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +13 -20
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +161 -177
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +33 -34
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.js +2 -2
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
- package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +40 -124
- package/dist/plugins/table/TablePlugin.svelte +106 -168
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +38 -141
- package/dist/plugins/table/chrome.svelte.js +339 -589
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +16 -152
- package/dist/plugins/table/table.d.ts +15 -14
- package/dist/plugins/table/table.js +22 -16
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +4 -68
- package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
- package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +154 -59
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +8 -10
- package/dist/selection/pointer.svelte.js +32 -73
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +224 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +3 -8
- package/dist/selection/visibility.js +7 -5
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +33 -39
- package/dist/session/attempt.js +61 -55
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +3 -2
- package/dist/session/navigation.js +127 -168
- package/dist/session/ports.d.ts +2 -7
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +5 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +42 -47
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +2 -2
- package/dist/surface/lines.js +1 -1
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +52 -72
- package/dist/surface/overlay.d.ts +41 -3
- package/dist/surface/overlay.js +92 -37
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +263 -106
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -554
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -61
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -335
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -93
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
- package/dist/plugins/image/empty.svelte.d.ts +0 -56
- package/dist/plugins/image/empty.svelte.js +0 -83
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
- package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/labels.d.ts +0 -9
- package/dist/plugins/richtext/labels.js +0 -7
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/table/dragPreview.d.ts +0 -29
- package/dist/plugins/table/dragPreview.js +0 -103
- package/dist/plugins/toolbar/LinkCard.svelte +0 -122
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
- package/dist/plugins/toolbar/Toolbar.svelte +0 -349
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The controls inside the rich text kinds (a to-do's checkbox, a callout's
|
|
3
|
+
* icon, an empty body's hint): the package's markup by default, the app's
|
|
4
|
+
* snippet when `createRichTextPlugin` names one. Each snippet receives a
|
|
5
|
+
* payload: the state, the action (written through the document) and the
|
|
6
|
+
* words the markup reads, and the control's attachment (its marker, its
|
|
7
|
+
* ARIA, its press and click), so custom markup keeps the keys, the
|
|
8
|
+
* accessibility and what the editor reads of it.
|
|
9
|
+
*/
|
|
10
|
+
import type { Snippet } from 'svelte';
|
|
11
|
+
import type { Attachment } from 'svelte/attachments';
|
|
12
|
+
import type { Block } from '../../block/block.svelte.js';
|
|
13
|
+
import type { Edytor } from '../../edytor.svelte.js';
|
|
14
|
+
import type { BlockView } from '../../plugins.js';
|
|
15
|
+
/** What a to-do's `checkbox` snippet receives. */
|
|
16
|
+
export type TodoCheckboxPayload = {
|
|
17
|
+
/** The to-do; `undefined` in a suggestion's preview (its box writes nothing). */
|
|
18
|
+
readonly block: Block | undefined;
|
|
19
|
+
/** It is checked: its `data.checked` (reactive). */
|
|
20
|
+
readonly checked: boolean;
|
|
21
|
+
/** The checkbox's accessible name (the view's `richText.checkbox`). */
|
|
22
|
+
readonly label: string;
|
|
23
|
+
/** Check or uncheck it: one data write, refused in a readonly view. */
|
|
24
|
+
toggle: () => void;
|
|
25
|
+
/**
|
|
26
|
+
* The control's attachment (`{@attach box.control}`), on an `input
|
|
27
|
+
* type="checkbox"` (give it `checked={box.checked}`) or a `button` (it
|
|
28
|
+
* gets `role="checkbox"` and `aria-checked`): its marker
|
|
29
|
+
* (`data-edytor-todo-checkbox`), `contenteditable="false"`, its
|
|
30
|
+
* `aria-label`, a press that keeps the editor's selection and a click
|
|
31
|
+
* that toggles the to-do.
|
|
32
|
+
*/
|
|
33
|
+
readonly control: Attachment<HTMLElement>;
|
|
34
|
+
};
|
|
35
|
+
/** What a callout's `calloutIcon` snippet receives. */
|
|
36
|
+
export type CalloutIconPayload = {
|
|
37
|
+
/** The callout; `undefined` in a suggestion's preview. */
|
|
38
|
+
readonly block: Block | undefined;
|
|
39
|
+
/** Its icon: its `data.icon`, the view's default without one, `''` for none (reactive). */
|
|
40
|
+
readonly icon: string;
|
|
41
|
+
/**
|
|
42
|
+
* The icon opens the view's picker: an editable view listing a picker,
|
|
43
|
+
* not a suggestion's preview. Draw a `button` then, else the icon alone.
|
|
44
|
+
*/
|
|
45
|
+
readonly editable: boolean;
|
|
46
|
+
/** The picker is open on this callout (reactive). */
|
|
47
|
+
readonly expanded: boolean;
|
|
48
|
+
/** The button's accessible name: Change icon, or Add icon over an empty slot. */
|
|
49
|
+
readonly label: string;
|
|
50
|
+
/** Open the view's picker on this callout, or close it. */
|
|
51
|
+
toggle: () => void;
|
|
52
|
+
/**
|
|
53
|
+
* The icon's attachment (`{@attach icon.control}`): its marker
|
|
54
|
+
* (`data-edytor-callout-icon`, which the picker opens under), `data-empty`
|
|
55
|
+
* without an icon, `contenteditable="false"`; editable, its
|
|
56
|
+
* `aria-label`, `aria-haspopup`, `aria-expanded`, `aria-controls`, a
|
|
57
|
+
* press that keeps the editor's selection and a click that toggles the
|
|
58
|
+
* picker; else `aria-hidden`.
|
|
59
|
+
*/
|
|
60
|
+
readonly control: Attachment<HTMLElement>;
|
|
61
|
+
};
|
|
62
|
+
/** What the `emptyBody` snippet of an open toggle's or a callout's empty body receives. */
|
|
63
|
+
export type EmptyBodyPayload = {
|
|
64
|
+
/** The toggle or callout. */
|
|
65
|
+
readonly block: Block;
|
|
66
|
+
/** Which kind's body. */
|
|
67
|
+
readonly kind: 'toggle' | 'callout';
|
|
68
|
+
/** The hint (the view's `richText.emptyBody`). */
|
|
69
|
+
readonly label: string;
|
|
70
|
+
/** Start the body: a first child, the caret in it (one command, one undo step). */
|
|
71
|
+
open: () => void;
|
|
72
|
+
/**
|
|
73
|
+
* The hint's attachment (`{@attach hint.control}`): its marker
|
|
74
|
+
* (`data-edytor-empty-body`, where a dragged block drops inside),
|
|
75
|
+
* `contenteditable="false"`, `aria-hidden` (Enter at the end of the
|
|
76
|
+
* header is the keyboard's way in) and a click that starts the body.
|
|
77
|
+
*/
|
|
78
|
+
readonly control: Attachment<HTMLElement>;
|
|
79
|
+
};
|
|
80
|
+
/** `createRichTextPlugin`'s control snippets. */
|
|
81
|
+
export type RichTextControls = {
|
|
82
|
+
checkbox?: Snippet<[TodoCheckboxPayload]>;
|
|
83
|
+
calloutIcon?: Snippet<[CalloutIconPayload]>;
|
|
84
|
+
emptyBody?: Snippet<[EmptyBodyPayload]>;
|
|
85
|
+
};
|
|
86
|
+
/** Each view's control snippets (the first rich text plugin listed sets them). */
|
|
87
|
+
export declare const richTextControls: WeakMap<object, RichTextControls>;
|
|
88
|
+
/** Check or uncheck a to-do: one key patched, so a peer's concurrent edit of another key is kept. */
|
|
89
|
+
export declare const toggleTodo: (block: Block) => import("../../index.js").OpResult;
|
|
90
|
+
/**
|
|
91
|
+
* A to-do's checkbox in `view` (a suggestion's preview included: no
|
|
92
|
+
* handle, no write), named in its labels.
|
|
93
|
+
*/
|
|
94
|
+
export declare const todoCheckbox: (view: Edytor, block: () => BlockView<{
|
|
95
|
+
checked?: boolean;
|
|
96
|
+
}>) => TodoCheckboxPayload;
|
|
97
|
+
/**
|
|
98
|
+
* A callout's icon in `view` (`callout.icon`): its `data.icon`, the view's
|
|
99
|
+
* default without one, none when it is `''`; a button opening the view's
|
|
100
|
+
* picker where it may be picked (an editable view listing a picker, not a
|
|
101
|
+
* suggestion's preview), else the icon alone.
|
|
102
|
+
*/
|
|
103
|
+
export declare const calloutIcon: (view: Edytor, block: () => BlockView<{
|
|
104
|
+
icon?: string;
|
|
105
|
+
}>) => CalloutIconPayload;
|
|
106
|
+
/**
|
|
107
|
+
* The hint of `block`'s empty body in `view` (`body.hint`), or `null` where
|
|
108
|
+
* none shows: a readonly view, a suggestion's preview (no handle).
|
|
109
|
+
*/
|
|
110
|
+
export declare const emptyBody: (view: Edytor, block: BlockView, kind: "toggle" | "callout") => EmptyBodyPayload | null;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { labelsOf, richTextEnglish } from '../../labels.js';
|
|
2
|
+
import { attach, keepSelection } from '../chrome.js';
|
|
3
|
+
import { calloutPickers, iconOf } from './callouts.js';
|
|
4
|
+
import { openBody } from './body.js';
|
|
5
|
+
/** Each view's control snippets (the first rich text plugin listed sets them). */
|
|
6
|
+
export const richTextControls = new WeakMap();
|
|
7
|
+
/** Check or uncheck a to-do: one key patched, so a peer's concurrent edit of another key is kept. */
|
|
8
|
+
export const toggleTodo = (block) => block.edytor.patchData(block.id, [{ path: ['checked'], value: !block.data.checked }]);
|
|
9
|
+
/**
|
|
10
|
+
* A to-do's checkbox in `view` (a suggestion's preview included: no
|
|
11
|
+
* handle, no write), named in its labels.
|
|
12
|
+
*/
|
|
13
|
+
export const todoCheckbox = (view, block) => {
|
|
14
|
+
const label = labelsOf(view, 'richText', richTextEnglish).checkbox;
|
|
15
|
+
const checked = () => Boolean(block().data.checked);
|
|
16
|
+
const toggle = () => {
|
|
17
|
+
const handle = block().handle;
|
|
18
|
+
if (handle)
|
|
19
|
+
toggleTodo(handle);
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
get block() {
|
|
23
|
+
return block().handle;
|
|
24
|
+
},
|
|
25
|
+
get checked() {
|
|
26
|
+
return checked();
|
|
27
|
+
},
|
|
28
|
+
label,
|
|
29
|
+
toggle,
|
|
30
|
+
get control() {
|
|
31
|
+
const on = checked();
|
|
32
|
+
return (node) => {
|
|
33
|
+
const native = node instanceof HTMLInputElement && node.type === 'checkbox';
|
|
34
|
+
// Another element than a native checkbox is one to assistive technology,
|
|
35
|
+
// unless the markup gave it its own role.
|
|
36
|
+
const role = native ? {} : { role: node.getAttribute('role') ?? 'checkbox' };
|
|
37
|
+
return attach({
|
|
38
|
+
contenteditable: 'false',
|
|
39
|
+
'aria-label': label,
|
|
40
|
+
'data-edytor-todo-checkbox': '',
|
|
41
|
+
...role,
|
|
42
|
+
'aria-checked': native ? undefined : on
|
|
43
|
+
}, {
|
|
44
|
+
mousedown: keepSelection,
|
|
45
|
+
click: () => {
|
|
46
|
+
// Never cancel the click: the browser reverts a canceled checkbox click
|
|
47
|
+
// after its handlers, over the re-render this write makes, so the box
|
|
48
|
+
// would show the old state here while peers show the new one. Toggle the
|
|
49
|
+
// document, then show what it holds (a refused write, readonly or vetoed,
|
|
50
|
+
// shows unchanged).
|
|
51
|
+
toggle();
|
|
52
|
+
if (native)
|
|
53
|
+
node.checked = checked();
|
|
54
|
+
}
|
|
55
|
+
})(node);
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* A callout's icon in `view` (`callout.icon`): its `data.icon`, the view's
|
|
62
|
+
* default without one, none when it is `''`; a button opening the view's
|
|
63
|
+
* picker where it may be picked (an editable view listing a picker, not a
|
|
64
|
+
* suggestion's preview), else the icon alone.
|
|
65
|
+
*/
|
|
66
|
+
export const calloutIcon = (view, block) => {
|
|
67
|
+
const labels = labelsOf(view, 'richText', richTextEnglish).calloutIcon;
|
|
68
|
+
const picker = calloutPickers.get(view);
|
|
69
|
+
const editable = () => Boolean(block().handle && picker && !view.readonly);
|
|
70
|
+
const icon = () => iconOf(block().data, view);
|
|
71
|
+
const expanded = () => picker?.target === block().id;
|
|
72
|
+
const toggle = () => {
|
|
73
|
+
const handle = block().handle;
|
|
74
|
+
if (handle && editable())
|
|
75
|
+
picker?.toggle(handle);
|
|
76
|
+
};
|
|
77
|
+
const label = () => (icon() ? labels.change : labels.add);
|
|
78
|
+
return {
|
|
79
|
+
get block() {
|
|
80
|
+
return block().handle;
|
|
81
|
+
},
|
|
82
|
+
get icon() {
|
|
83
|
+
return icon();
|
|
84
|
+
},
|
|
85
|
+
get editable() {
|
|
86
|
+
return editable();
|
|
87
|
+
},
|
|
88
|
+
get expanded() {
|
|
89
|
+
return expanded();
|
|
90
|
+
},
|
|
91
|
+
get label() {
|
|
92
|
+
return label();
|
|
93
|
+
},
|
|
94
|
+
toggle,
|
|
95
|
+
get control() {
|
|
96
|
+
const can = editable();
|
|
97
|
+
return attach({
|
|
98
|
+
contenteditable: 'false',
|
|
99
|
+
'data-edytor-callout-icon': '',
|
|
100
|
+
'data-empty': !icon(),
|
|
101
|
+
'aria-label': can ? label() : undefined,
|
|
102
|
+
'aria-haspopup': can ? 'menu' : undefined,
|
|
103
|
+
'aria-expanded': can ? expanded() : undefined,
|
|
104
|
+
'aria-controls': can && expanded() ? picker?.listId : undefined,
|
|
105
|
+
'aria-hidden': can ? undefined : 'true'
|
|
106
|
+
}, can ? { mousedown: keepSelection, click: toggle } : {});
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* The hint of `block`'s empty body in `view` (`body.hint`), or `null` where
|
|
112
|
+
* none shows: a readonly view, a suggestion's preview (no handle).
|
|
113
|
+
*/
|
|
114
|
+
export const emptyBody = (view, block, kind) => {
|
|
115
|
+
const handle = block.handle;
|
|
116
|
+
if (!handle || view.readonly)
|
|
117
|
+
return null;
|
|
118
|
+
const open = () => void openBody(handle);
|
|
119
|
+
return {
|
|
120
|
+
block: handle,
|
|
121
|
+
kind,
|
|
122
|
+
label: labelsOf(view, 'richText', richTextEnglish).emptyBody[kind],
|
|
123
|
+
open,
|
|
124
|
+
control: attach({ contenteditable: 'false', 'data-edytor-empty-body': kind, 'aria-hidden': 'true' }, { click: open })
|
|
125
|
+
};
|
|
126
|
+
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { isRecord } from '../../utils/json.js';
|
|
2
|
-
import {
|
|
3
|
-
import { holdsNothing, lineage, placing } from '../../kinds.js';
|
|
2
|
+
import { holdsNothing, placing } from '../../kinds.js';
|
|
4
3
|
import { id } from '../../utils.js';
|
|
5
4
|
import { marksForInsertion } from '../../session/editing/text.js';
|
|
6
5
|
import { selectedTextSpans, viewOf } from '../../selection/visibility.js';
|
|
@@ -121,20 +120,25 @@ export const openLink = (href, view = globalThis.window ?? null) => {
|
|
|
121
120
|
if (safe)
|
|
122
121
|
view?.open(safe, '_blank', 'noopener,noreferrer');
|
|
123
122
|
};
|
|
123
|
+
/** Set `mark` to `value` (`null`: remove it) over `start`–`end` of `text`: the view's `formatRange`. */
|
|
124
|
+
const markText = (edytor, text, start, end, mark, value) => edytor.formatRange(text.parent.id, text.segStart + start, end - start, {
|
|
125
|
+
[mark]: value === undefined ? true : value
|
|
126
|
+
});
|
|
124
127
|
const formatSelectedTextRange = (edytor, mark, value, toggle) => {
|
|
125
|
-
const { yStart, yEnd, startText, endText
|
|
128
|
+
const { yStart, yEnd, startText, endText } = edytor.selection.textRange();
|
|
129
|
+
const { isCollapsed, isReversed } = edytor.selection.projection;
|
|
126
130
|
if (isCollapsed || !startText || !endText)
|
|
127
131
|
return;
|
|
128
132
|
const spans = selectedTextSpans(edytor).filter(({ start, end }) => end > start);
|
|
129
133
|
// One decision for the whole range (Notion): a toggle removes the mark only
|
|
130
134
|
// when every selected character has it, else it marks all of them.
|
|
131
135
|
const on = spans.every(({ text, start, end }) => text.getMarksAtRange(start, end).every(({ marks }) => marks && mark in marks));
|
|
132
|
-
const next = toggle && on ? null : value;
|
|
136
|
+
const next = toggle && on ? null : value === undefined ? true : value;
|
|
133
137
|
// One command per span: a vetoed one keeps its marks (`dispatcher.each`).
|
|
134
|
-
edytor.dispatcher.each('format', spans, ({ text, start, end }) => text.
|
|
138
|
+
edytor.dispatcher.each('format', spans, ({ text, start, end }) => edytor.formatRange(text.parent.id, text.segStart + start, end - start, { [mark]: next }));
|
|
135
139
|
// Selected blocks stay selected (Notion; a divider's phantom text is no range).
|
|
136
140
|
if (!selectsBlocks(edytor))
|
|
137
|
-
edytor.selection.
|
|
141
|
+
edytor.selection.selectText(startText, yStart, endText, yEnd, isReversed);
|
|
138
142
|
};
|
|
139
143
|
/**
|
|
140
144
|
* A block selection: formatting keeps it, and it has no caret to stage a
|
|
@@ -154,11 +158,13 @@ export const richTextOperations = (edytor) => ({
|
|
|
154
158
|
* whole.
|
|
155
159
|
*/
|
|
156
160
|
insertDividerAtSelection: () => {
|
|
157
|
-
const {
|
|
158
|
-
|
|
161
|
+
const { startText, yStart } = edytor.selection.textRange();
|
|
162
|
+
const { isCollapsed } = edytor.selection.projection;
|
|
163
|
+
const block = startText?.parent;
|
|
164
|
+
if (!block?.convertible || !block.parent || !isCollapsed)
|
|
159
165
|
return null;
|
|
160
166
|
const { facade, dispatcher } = edytor;
|
|
161
|
-
const [self, parent] = [block.
|
|
167
|
+
const [self, parent] = [block.id, block.parent.isRoot ? null : block.parent.id];
|
|
162
168
|
const divider = { id: id('b'), type: 'divider', data: {}, content: [], children: [] };
|
|
163
169
|
const paragraph = { id: id('b'), type: edytor.defaultChild(block.parent) };
|
|
164
170
|
const slot = (after, specs) => facade.prepare.insertBlocks({ parent, index: block.index + after }, specs);
|
|
@@ -185,24 +191,25 @@ export const richTextOperations = (edytor) => ({
|
|
|
185
191
|
caret = next?.id ?? paragraph.id;
|
|
186
192
|
prepare = () => slot(1, next ? [divider] : [divider, paragraph]);
|
|
187
193
|
}
|
|
188
|
-
if (
|
|
194
|
+
if (dispatcher.plan('insertDivider', {}, prepare, block).status !== 'applied')
|
|
189
195
|
return null;
|
|
190
196
|
const text = caret ? edytor.idToBlock.get(caret)?.firstText : startText;
|
|
191
197
|
dispatcher.caret(text, caret ? 0 : yStart);
|
|
192
198
|
return block;
|
|
193
199
|
},
|
|
194
200
|
removeAllMarksAtRange: () => {
|
|
195
|
-
const { yStart, startText
|
|
201
|
+
const { yStart, startText } = edytor.selection.textRange();
|
|
202
|
+
const { isCollapsed } = edytor.selection.projection;
|
|
196
203
|
if (isCollapsed) {
|
|
197
204
|
if (startText && !selectsBlocks(edytor)) {
|
|
198
205
|
edytor.selection.stage({});
|
|
199
|
-
edytor.selection.
|
|
206
|
+
edytor.selection.selectText(startText, yStart);
|
|
200
207
|
}
|
|
201
208
|
return;
|
|
202
209
|
}
|
|
203
210
|
edytor.dispatcher.each('format', selectedTextSpans(edytor), ({ text, start, end }) => {
|
|
204
211
|
if (end > start)
|
|
205
|
-
text.
|
|
212
|
+
edytor.clearMarks(text.parent.id, text.segStart + start, end - start);
|
|
206
213
|
});
|
|
207
214
|
},
|
|
208
215
|
setLinkAtRange: (link) => {
|
|
@@ -225,15 +232,15 @@ export const richTextOperations = (edytor) => ({
|
|
|
225
232
|
const safe = sanitizeLinkHref(href);
|
|
226
233
|
if (safe === null || end <= start)
|
|
227
234
|
return;
|
|
228
|
-
edytor.dispatcher.run('autolink', () =>
|
|
235
|
+
edytor.dispatcher.run('autolink', () => markText(edytor, text, start, end, 'link', { href: safe }));
|
|
229
236
|
},
|
|
230
237
|
/** Unlink `start`–`end` of `text` (the link card's Remove), one undo step; the selection stays. */
|
|
231
238
|
unlinkText: (text, start, end) => {
|
|
232
|
-
edytor.dispatcher.run('format', () =>
|
|
239
|
+
edytor.dispatcher.run('format', () => markText(edytor, text, start, end, 'link', null));
|
|
233
240
|
},
|
|
234
241
|
/** Remove one mark (a color, a highlight…) from the selected range. */
|
|
235
242
|
removeMarkAtRange: (mark) => {
|
|
236
|
-
if (!edytor.selection.
|
|
243
|
+
if (!edytor.selection.projection.isCollapsed)
|
|
237
244
|
formatSelectedTextRange(edytor, mark, null, false);
|
|
238
245
|
},
|
|
239
246
|
/**
|
|
@@ -249,7 +256,8 @@ export const richTextOperations = (edytor) => ({
|
|
|
249
256
|
const safeValue = mark === 'color' || mark === 'highlight' ? sanitizeCssColorValue(value) : value;
|
|
250
257
|
if (safeValue === null)
|
|
251
258
|
return;
|
|
252
|
-
const {
|
|
259
|
+
const { startText, yStart } = edytor.selection.textRange();
|
|
260
|
+
const { isCollapsed } = edytor.selection.projection;
|
|
253
261
|
if (isCollapsed) {
|
|
254
262
|
if (startText && !selectsBlocks(edytor)) {
|
|
255
263
|
// Stage the full set the next insertion carries, values kept.
|
|
@@ -257,7 +265,7 @@ export const richTextOperations = (edytor) => ({
|
|
|
257
265
|
...marksForInsertion(startText, yStart, { pending: edytor.selection.pending }),
|
|
258
266
|
[mark]: safeValue
|
|
259
267
|
}));
|
|
260
|
-
edytor.selection.
|
|
268
|
+
edytor.selection.selectText(startText, yStart);
|
|
261
269
|
}
|
|
262
270
|
return;
|
|
263
271
|
}
|
|
@@ -269,17 +277,18 @@ export const richTextOperations = (edytor) => ({
|
|
|
269
277
|
* stage it for the next character typed.
|
|
270
278
|
*/
|
|
271
279
|
setMarkAtRange: (mark, value) => {
|
|
272
|
-
const { yStart, yEnd, startText, endText
|
|
273
|
-
|
|
280
|
+
const { yStart, yEnd, startText, endText } = edytor.selection.textRange();
|
|
281
|
+
const { selection } = edytor;
|
|
282
|
+
if (selection.projection.isCollapsed) {
|
|
274
283
|
if (startText && !selectsBlocks(edytor)) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
})
|
|
282
|
-
|
|
284
|
+
// A caret stages the full set the next insertion carries (values kept).
|
|
285
|
+
edytor.dispatcher.run('format', () => {
|
|
286
|
+
const { [mark]: current = null, ...rest } = marksForInsertion(startText, yStart, {
|
|
287
|
+
pending: selection.pending
|
|
288
|
+
});
|
|
289
|
+
selection.stage(current !== null ? rest : { ...rest, [mark]: value === undefined ? true : value });
|
|
290
|
+
});
|
|
291
|
+
selection.selectText(startText, yStart, endText, yEnd);
|
|
283
292
|
}
|
|
284
293
|
return;
|
|
285
294
|
}
|
|
@@ -2,19 +2,15 @@ import type { Attachment } from 'svelte/attachments';
|
|
|
2
2
|
import type { Block } from '../../block/block.svelte.js';
|
|
3
3
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
4
4
|
import type { EditorCommand } from '../../plugins.js';
|
|
5
|
-
import { type SlashMenuLabels } from '../../labels.js';
|
|
6
5
|
import type { BlockAddition } from '../blockHandles/BlockHandleController.svelte.js';
|
|
7
6
|
import { TextTriggerController } from '../triggers/TriggerController.svelte.js';
|
|
8
7
|
import type { Popup } from '../../surface/popups.svelte.js';
|
|
9
|
-
export type { TextInsertionPayload } from '../triggers/TriggerController.svelte.js';
|
|
10
8
|
/**
|
|
11
9
|
* The slash menu: the `/` trigger (`TextTriggerController`: the range, the
|
|
12
10
|
* query, the keys, the pick), whose rows are the editor's commands, and the
|
|
13
11
|
* menu a handle's `+` opens with a search field of its own (`addition`).
|
|
14
12
|
*/
|
|
15
13
|
export declare class SlashMenuController extends TextTriggerController {
|
|
16
|
-
/** The words the menu shows (the plugin's `labels`): read them in a custom `menu` or `item`. */
|
|
17
|
-
readonly labels: SlashMenuLabels;
|
|
18
14
|
/**
|
|
19
15
|
* Opened by a handle's `+` (`BLOCK_ADD_EVENT`): no `/` in the text, the
|
|
20
16
|
* query is the menu's own field, and a picked row adds the block first.
|
|
@@ -22,20 +18,12 @@ export declare class SlashMenuController extends TextTriggerController {
|
|
|
22
18
|
addition: BlockAddition | null;
|
|
23
19
|
/** The selection when a `+` opened the menu, given back when it closes unpicked. */
|
|
24
20
|
private held;
|
|
25
|
-
|
|
26
|
-
groupName: (group: string) => string;
|
|
27
|
-
constructor(edytor: Edytor,
|
|
28
|
-
/** The words the menu shows (the plugin's `labels`): read them in a custom `menu` or `item`. */
|
|
29
|
-
labels?: SlashMenuLabels);
|
|
30
|
-
/** A row's element id (page-unique), for `aria-activedescendant`: set it on a custom `item`. */
|
|
31
|
-
optionId: (command: EditorCommand) => string;
|
|
32
|
-
protected get listName(): string;
|
|
33
|
-
protected rowIdAt(index: number): string;
|
|
21
|
+
constructor(edytor: Edytor);
|
|
34
22
|
/** A `+`'s menu names its highlighted row from its own field, and tells the `+` it opened it. */
|
|
35
23
|
protected popupOf(active: string | undefined): Popup;
|
|
36
24
|
/**
|
|
37
25
|
* The element that holds a `+` menu's keyboard (`{@attach controller.keys}`:
|
|
38
|
-
* its field, or the
|
|
26
|
+
* its field, or the menu element itself). Focused when
|
|
39
27
|
* it mounts, it takes the menu's keys (↑/↓ walk the rows, Enter runs the
|
|
40
28
|
* highlighted one, Escape closes the menu and gives the selection back);
|
|
41
29
|
* on an element that is not a field, typing and Backspace edit the query.
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { untrack } from 'svelte';
|
|
2
|
-
import { project } from '../../session/selection.js';
|
|
2
|
+
import { noSelection, project } from '../../session/selection.js';
|
|
3
3
|
import { BASIC_BLOCKS, matchesQuery } from '../../kinds.js';
|
|
4
|
-
import { englishLabels } from '../../labels.js';
|
|
5
4
|
import { TextTriggerController } from '../triggers/TriggerController.svelte.js';
|
|
6
|
-
import { attribute,
|
|
5
|
+
import { attribute, isField, keepFocus } from '../chrome.js';
|
|
6
|
+
import { holdKeys } from '../list.svelte.js';
|
|
7
|
+
import { all, listen } from '../../utils/listen.js';
|
|
8
|
+
import { takeKeys } from '../../events/onFocus.js';
|
|
7
9
|
/**
|
|
8
10
|
* The view a `+`'s menu asks `isEnabled` of: the editor, its selection a
|
|
9
11
|
* caret at the start of the block the `+` adds, below `block` (a stand-in
|
|
@@ -40,24 +42,15 @@ const additionView = (edytor, { block }) => {
|
|
|
40
42
|
}
|
|
41
43
|
});
|
|
42
44
|
const added = reused ? block : through(block, stand);
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
yEnd: 0,
|
|
47
|
-
isCollapsed: true,
|
|
48
|
-
isReversed: false,
|
|
49
|
-
isBlockSpanning: false,
|
|
50
|
-
isVoidEditableElement: false,
|
|
51
|
-
startText: text,
|
|
52
|
-
endText: text,
|
|
53
|
-
startBlock: added,
|
|
54
|
-
endBlock: added,
|
|
55
|
-
texts: text ? [text] : [],
|
|
56
|
-
blocks: [added]
|
|
57
|
-
};
|
|
45
|
+
// A caret at the added block's start (a stand-in text when it is not made yet).
|
|
46
|
+
const text = added.firstText ?? { parent: added };
|
|
47
|
+
const range = { startText: text, endText: text, yStart: 0, yEnd: 0, texts: [text] };
|
|
58
48
|
const selection = through(edytor.selection, {
|
|
59
|
-
|
|
60
|
-
|
|
49
|
+
textRange: () => range,
|
|
50
|
+
caret: { block: added, offset: 0 },
|
|
51
|
+
voidField: false,
|
|
52
|
+
value: noSelection,
|
|
53
|
+
projection: project(noSelection, edytor.facade),
|
|
61
54
|
selectedBlocks: new Set(),
|
|
62
55
|
selectedInlineBlock: new Set()
|
|
63
56
|
});
|
|
@@ -69,7 +62,6 @@ const additionView = (edytor, { block }) => {
|
|
|
69
62
|
* menu a handle's `+` opens with a search field of its own (`addition`).
|
|
70
63
|
*/
|
|
71
64
|
export class SlashMenuController extends TextTriggerController {
|
|
72
|
-
labels;
|
|
73
65
|
/**
|
|
74
66
|
* Opened by a handle's `+` (`BLOCK_ADD_EVENT`): no `/` in the text, the
|
|
75
67
|
* query is the menu's own field, and a picked row adds the block first.
|
|
@@ -77,22 +69,8 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
77
69
|
addition = $state(null);
|
|
78
70
|
/** The selection when a `+` opened the menu, given back when it closes unpicked. */
|
|
79
71
|
held = { kind: 'none' };
|
|
80
|
-
|
|
81
|
-
groupName = (group) => this.labels.groups[group] ?? group;
|
|
82
|
-
constructor(edytor,
|
|
83
|
-
/** The words the menu shows (the plugin's `labels`): read them in a custom `menu` or `item`. */
|
|
84
|
-
labels = englishLabels.slashMenu) {
|
|
72
|
+
constructor(edytor) {
|
|
85
73
|
super(edytor, '/', 'slash-menu');
|
|
86
|
-
this.labels = labels;
|
|
87
|
-
}
|
|
88
|
-
/** A row's element id (page-unique), for `aria-activedescendant`: set it on a custom `item`. */
|
|
89
|
-
optionId = (command) => this.edytor.popups.idOf(`slash-menu-${command.id}`);
|
|
90
|
-
get listName() {
|
|
91
|
-
return this.labels.list;
|
|
92
|
-
}
|
|
93
|
-
rowIdAt(index) {
|
|
94
|
-
const command = this.commands[index];
|
|
95
|
-
return command && this.optionId(command);
|
|
96
74
|
}
|
|
97
75
|
/** A `+`'s menu names its highlighted row from its own field, and tells the `+` it opened it. */
|
|
98
76
|
popupOf(active) {
|
|
@@ -107,7 +85,7 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
107
85
|
}
|
|
108
86
|
/**
|
|
109
87
|
* The element that holds a `+` menu's keyboard (`{@attach controller.keys}`:
|
|
110
|
-
* its field, or the
|
|
88
|
+
* its field, or the menu element itself). Focused when
|
|
111
89
|
* it mounts, it takes the menu's keys (↑/↓ walk the rows, Enter runs the
|
|
112
90
|
* highlighted one, Escape closes the menu and gives the selection back);
|
|
113
91
|
* on an element that is not a field, typing and Backspace edit the query.
|
|
@@ -122,22 +100,19 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
122
100
|
return;
|
|
123
101
|
const menu = node.closest('[data-edytor-slash-menu-host]') ?? node;
|
|
124
102
|
const field = isField(node);
|
|
125
|
-
untrack(() => {
|
|
126
|
-
if (!node.contains(node.ownerDocument.activeElement))
|
|
127
|
-
node.focus({ preventScroll: true });
|
|
128
|
-
});
|
|
129
103
|
const keydown = (event) => {
|
|
130
104
|
// A key that ends an IME composition (Enter commits it, Escape cancels it) is the IME's.
|
|
131
105
|
if (event.defaultPrevented || event.isComposing || event.keyCode === 229)
|
|
132
106
|
return;
|
|
133
107
|
const { key, ctrlKey, metaKey } = event;
|
|
134
108
|
const move = { ArrowDown: 1, ArrowUp: -1 }[key];
|
|
135
|
-
|
|
109
|
+
const typed = !field && event.target === node;
|
|
110
|
+
if (typed && key === 'Backspace')
|
|
136
111
|
this.search(this.query.slice(0, -1));
|
|
137
|
-
else if (
|
|
112
|
+
else if (typed && key.length === 1 && !ctrlKey && !metaKey)
|
|
138
113
|
this.search(this.query + key);
|
|
139
114
|
else if (move)
|
|
140
|
-
this.
|
|
115
|
+
this.move(move);
|
|
141
116
|
else if (key === 'Enter')
|
|
142
117
|
void this.runSelected();
|
|
143
118
|
else if (key === 'Escape')
|
|
@@ -150,9 +125,9 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
150
125
|
const target = event.target;
|
|
151
126
|
if (!field || target === node)
|
|
152
127
|
return;
|
|
153
|
-
const index = this.commands.findIndex((
|
|
128
|
+
const index = this.commands.findIndex((_, index) => target.closest?.(`[id="${this.rowId(index)}"]`) !== null);
|
|
154
129
|
if (index !== -1)
|
|
155
|
-
this.
|
|
130
|
+
this.index = index;
|
|
156
131
|
node.focus({ preventScroll: true });
|
|
157
132
|
};
|
|
158
133
|
const focusout = (event) => {
|
|
@@ -160,28 +135,17 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
160
135
|
if (this.addition && to instanceof Node && !menu.contains(to))
|
|
161
136
|
this.dismiss(false);
|
|
162
137
|
};
|
|
163
|
-
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
menu.addEventListener('focusout', focusout);
|
|
168
|
-
menu.addEventListener('mousedown', keepFocus);
|
|
169
|
-
$effect(() => {
|
|
170
|
-
if (!field)
|
|
171
|
-
return;
|
|
138
|
+
const off2 = listen(menu, 'focusin', focusin);
|
|
139
|
+
const off3 = listen(menu, 'focusout', focusout);
|
|
140
|
+
const off4 = listen(menu, 'mousedown', keepFocus);
|
|
141
|
+
if (field)
|
|
172
142
|
attribute(node, 'aria-controls', this.listId);
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
return () => {
|
|
177
|
-
keyed.removeEventListener('keydown', keydown);
|
|
178
|
-
menu.removeEventListener('focusin', focusin);
|
|
179
|
-
menu.removeEventListener('focusout', focusout);
|
|
180
|
-
menu.removeEventListener('mousedown', keepFocus);
|
|
181
|
-
};
|
|
143
|
+
// A field takes the keys of the whole menu (a row a screen reader focused); a wrapper, its own.
|
|
144
|
+
const off = holdKeys(node, keydown, () => (field && this.count ? this.rowId(this.index) : undefined), field ? menu : node);
|
|
145
|
+
return all(off, off2, off3, off4);
|
|
182
146
|
};
|
|
183
147
|
get count() {
|
|
184
|
-
return this.commands.length;
|
|
148
|
+
return this.isOpen ? this.commands.length : 0;
|
|
185
149
|
}
|
|
186
150
|
/** A `/` opens the menu in a block a kind can replace (`convertible`). */
|
|
187
151
|
admits(block) {
|
|
@@ -197,7 +161,7 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
197
161
|
if (query && (commandCount === 0 || /^\s/.test(query) || !/[^-\s]/.test(query)))
|
|
198
162
|
this.close();
|
|
199
163
|
else
|
|
200
|
-
this.
|
|
164
|
+
this.index = Math.max(0, Math.min(this.index, commandCount - 1));
|
|
201
165
|
}
|
|
202
166
|
/** Matching commands, grouped (groups in first-seen order): the menu's rows and keyboard order. */
|
|
203
167
|
get commands() {
|
|
@@ -236,7 +200,7 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
236
200
|
}
|
|
237
201
|
/** The `+`'s menu typed in its own field (a query that matches nothing shows "No results"). */
|
|
238
202
|
search(query) {
|
|
239
|
-
[this.query, this.
|
|
203
|
+
[this.query, this.index] = [query, 0];
|
|
240
204
|
}
|
|
241
205
|
/**
|
|
242
206
|
* Close without picking. A `+`'s menu gives the selection back as it was
|
|
@@ -253,11 +217,10 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
253
217
|
this.edytor.selection.select(held);
|
|
254
218
|
if (!focus || this.edytor.readonly)
|
|
255
219
|
return;
|
|
256
|
-
this.edytor
|
|
257
|
-
this.edytor.node?.focus({ preventScroll: true });
|
|
220
|
+
takeKeys(this.edytor);
|
|
258
221
|
}
|
|
259
222
|
runSelected() {
|
|
260
|
-
return this.run(this.commands[this.
|
|
223
|
+
return this.run(this.commands[this.index]);
|
|
261
224
|
}
|
|
262
225
|
async run(command) {
|
|
263
226
|
const { addition } = this;
|
|
@@ -277,7 +240,7 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
277
240
|
// nothing synchronously runs after it. The caret goes back to where the
|
|
278
241
|
// `/` was while it is still in its text: commands that replace the
|
|
279
242
|
// block (Code, a divider) keep their own.
|
|
280
|
-
const ran = await this.replaceTrigger(() => this.edytor.runCommand(command.id), (text) => this.edytor.selection.
|
|
243
|
+
const ran = await this.replaceTrigger(() => this.edytor.runCommand(command.id), (text) => this.edytor.selection.textRange().startText === text);
|
|
281
244
|
return ran ?? false;
|
|
282
245
|
}
|
|
283
246
|
}
|