edytor 1.0.0-rc.2 → 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 +47 -141
- 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.d.ts +6 -1
- package/dist/clipboard/htmlFlow.js +26 -13
- 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 +22 -17
- package/dist/cloudflare/DocumentRoom.js +10 -5
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- 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 +20 -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 +9 -30
- package/dist/cloudflare/room/storage.js +52 -104
- 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 +160 -119
- package/dist/components/Block.svelte.d.ts +8 -3
- package/dist/components/Content.svelte +91 -44
- package/dist/components/CustomMark.svelte +46 -0
- package/dist/components/CustomMark.svelte.d.ts +11 -0
- package/dist/components/Edytor.svelte +80 -95
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/InlineBlock.svelte +4 -9
- package/dist/components/Mark.svelte +46 -35
- package/dist/components/Mark.svelte.d.ts +7 -0
- 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 +48 -14
- 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/{plugins/blockHandles → dnd}/autoScroll.d.ts +2 -1
- package/dist/{plugins/blockHandles → dnd}/autoScroll.js +3 -3
- 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 +118 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -184
- 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 +7 -1
- package/dist/events/onDrop.js +33 -72
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +92 -72
- 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 -13
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +91 -314
- package/dist/labels.js +180 -396
- 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 -151
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +63 -97
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +247 -268
- package/dist/plugins/blockHandles/BlockHandles.svelte +46 -29
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +29 -23
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -162
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +20 -17
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +46 -1
- package/dist/plugins/blockHandles/geometry.js +51 -4
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +59 -28
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +180 -105
- 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 +79 -0
- package/dist/plugins/chrome.js +87 -0
- package/dist/plugins/code/CodeHeader.svelte +12 -58
- package/dist/plugins/code/CodeHeader.svelte.d.ts +1 -0
- package/dist/plugins/code/CodePlugin.svelte +75 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +25 -0
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +9 -0
- package/dist/plugins/code/code.css +5 -100
- package/dist/plugins/code/header.svelte.d.ts +47 -0
- package/dist/plugins/code/header.svelte.js +141 -0
- package/dist/plugins/code/languageMenu.svelte.d.ts +84 -0
- package/dist/plugins/code/languageMenu.svelte.js +199 -0
- package/dist/plugins/code/languages.d.ts +21 -10
- 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 -430
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +6 -7
- package/dist/plugins/comments/commentsPlugin.d.ts +31 -10
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +18 -129
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +2 -1
- package/dist/plugins/equation/EquationPlugin.svelte +123 -168
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +5 -3
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +74 -36
- package/dist/plugins/equation/equation.svelte.js +74 -66
- package/dist/plugins/equation/importUrl.d.ts +6 -0
- package/dist/plugins/equation/importUrl.js +6 -0
- package/dist/plugins/equation/katex.d.ts +8 -0
- package/dist/plugins/equation/katex.js +77 -0
- 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 +5 -151
- package/dist/plugins/image/ImagePlugin.svelte +49 -117
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -24
- 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 -57
- package/dist/plugins/image/controls.svelte.js +51 -174
- 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 +39 -24
- package/dist/plugins/index.js +30 -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 +15 -0
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +9 -0
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +46 -0
- package/dist/plugins/marquee/MarqueeController.svelte.js +243 -0
- package/dist/plugins/marquee/marquee.d.ts +33 -0
- package/dist/plugins/marquee/marquee.js +89 -0
- package/dist/plugins/marquee/marqueePlugin.d.ts +32 -0
- package/dist/plugins/marquee/marqueePlugin.js +68 -0
- package/dist/plugins/media/AudioPlugin.svelte +3 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +124 -112
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +20 -7
- package/dist/plugins/media/EmbedPlugin.svelte +93 -77
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +21 -9
- 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 -111
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +55 -112
- 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 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +69 -0
- package/dist/plugins/media/empty.svelte.js +111 -0
- package/dist/plugins/media/media.d.ts +93 -30
- package/dist/plugins/media/media.js +79 -86
- package/dist/plugins/media/urlPaste.svelte.d.ts +9 -32
- package/dist/plugins/media/urlPaste.svelte.js +46 -75
- package/dist/plugins/mention/MentionPlugin.svelte +47 -124
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +11 -23
- 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 +52 -108
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +11 -23
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +25 -0
- package/dist/plugins/richtext/CalloutIcon.svelte.d.ts +9 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +25 -0
- package/dist/plugins/richtext/EmptyBody.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +272 -148
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +37 -18
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.d.ts +9 -0
- package/dist/plugins/richtext/body.js +16 -0
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +97 -0
- package/dist/plugins/richtext/calloutIcons.svelte.js +214 -0
- 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 +18 -11
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +93 -35
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +11 -24
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +32 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -16
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +96 -127
- package/dist/plugins/table/TableChrome.svelte.d.ts +5 -1
- package/dist/plugins/table/TablePlugin.svelte +116 -171
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +110 -117
- package/dist/plugins/table/chrome.svelte.js +643 -289
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +55 -134
- package/dist/plugins/table/table.d.ts +26 -7
- package/dist/plugins/table/table.js +23 -49
- 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 +29 -66
- package/dist/plugins/toolbar/ToolbarController.svelte.js +151 -76
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +14 -13
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +6 -45
- package/dist/plugins/triggers/TriggerController.svelte.js +51 -96
- 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 +167 -60
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +12 -10
- package/dist/selection/pointer.svelte.js +154 -71
- 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 +263 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +11 -8
- package/dist/selection/visibility.js +23 -8
- 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 -53
- 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 +18 -3
- package/dist/session/navigation.js +194 -153
- package/dist/session/ports.d.ts +7 -0
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +8 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +64 -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 +32 -0
- package/dist/surface/lines.js +43 -0
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +73 -77
- package/dist/surface/overlay.d.ts +48 -6
- package/dist/surface/overlay.js +133 -23
- 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 +315 -126
- 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 -525
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -43
- 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 -447
- 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 -116
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -12
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -83
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -7
- package/dist/plugins/richtext/labels.d.ts +0 -5
- package/dist/plugins/richtext/labels.js +0 -3
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -360
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/toolbar/LinkCard.svelte +0 -118
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -7
- package/dist/plugins/toolbar/Toolbar.svelte +0 -400
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -144
- 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
|
@@ -4,44 +4,29 @@ import { selectedTextSpans } from '../../selection/visibility.js';
|
|
|
4
4
|
import { getYIndex, SUGGESTION, SYNTHETIC_TEXT_OVERLAY_SELECTOR } from '../../selection/selection.utils.js';
|
|
5
5
|
import { convertBlocks, convertibleKinds, rowOf } from '../../kinds.js';
|
|
6
6
|
import { getSelectionBlocks } from '../../selection/replaceSelection.js';
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
{ name: 'Brown', text: '#9f765a', background: '#f5ede9' },
|
|
13
|
-
{ name: 'Orange', text: '#d27b2d', background: '#fbebde' },
|
|
14
|
-
{ name: 'Yellow', text: '#cb9434', background: '#f9f3dc' },
|
|
15
|
-
{ name: 'Green', text: '#50946e', background: '#e8f1ec' },
|
|
16
|
-
{ name: 'Blue', text: '#387dc9', background: '#e5f2fc' },
|
|
17
|
-
{ name: 'Purple', text: '#9a6bb4', background: '#f3ebf9' },
|
|
18
|
-
{ name: 'Pink', text: '#c14c8a', background: '#fae9f1' },
|
|
19
|
-
{ name: 'Red', text: '#cf5148', background: '#fce9e7' }
|
|
20
|
-
];
|
|
7
|
+
import { identify } from '../chrome.js';
|
|
8
|
+
import { all, listen } from '../../utils/listen.js';
|
|
9
|
+
import { takeKeys } from '../../events/onFocus.js';
|
|
10
|
+
/** The bar's controls the arrows walk (a disabled one is skipped). */
|
|
11
|
+
const STOPS = 'button:not([disabled]), input:not([disabled]), select:not([disabled])';
|
|
21
12
|
const getLinkHref = (value) => isRecord(value) && typeof value.href === 'string' ? value.href : null;
|
|
22
13
|
export class ToolbarController {
|
|
23
14
|
edytor;
|
|
24
|
-
labels;
|
|
25
15
|
/** Shown for the current selection; hidden while the editor is readonly. */
|
|
26
16
|
shown = $state(false);
|
|
27
17
|
linkUrl = $state('');
|
|
28
18
|
/** The open panel: the kind menu, the link field or the colors. */
|
|
29
19
|
panel = $state(null);
|
|
30
20
|
/** The selection the toolbar acts on: a value (anchors), so peers' edits move it. */
|
|
31
|
-
selectionSnapshot = null;
|
|
32
|
-
isRestoringSelection = false;
|
|
21
|
+
#selectionSnapshot = null;
|
|
22
|
+
#isRestoringSelection = false;
|
|
33
23
|
/** The link panel's field takes the focus when it next mounts (it was opened, not re-rendered). */
|
|
34
|
-
focusField = false;
|
|
24
|
+
#focusField = false;
|
|
35
25
|
/** The link under the pointer, for the link card (`link.card`). */
|
|
36
26
|
hovered = $state.raw(null);
|
|
37
|
-
constructor(edytor
|
|
38
|
-
/** The words the toolbar shows (the plugin's `labels`): read them in a custom `toolbar`. */
|
|
39
|
-
labels = englishLabels.toolbar) {
|
|
27
|
+
constructor(edytor) {
|
|
40
28
|
this.edytor = edytor;
|
|
41
|
-
this.labels = labels;
|
|
42
29
|
}
|
|
43
|
-
/** A palette color's name as shown (`labels.colors`). */
|
|
44
|
-
colorName = (name) => this.labels.colors[name] ?? name;
|
|
45
30
|
get isVisible() {
|
|
46
31
|
return this.shown && !this.edytor.readonly;
|
|
47
32
|
}
|
|
@@ -49,29 +34,120 @@ export class ToolbarController {
|
|
|
49
34
|
get barId() {
|
|
50
35
|
return this.edytor.popups.idOf('toolbar');
|
|
51
36
|
}
|
|
52
|
-
/**
|
|
53
|
-
|
|
37
|
+
/** The link panel's field id (page-unique): a `label`'s `for`. */
|
|
38
|
+
get linkFieldId() {
|
|
39
|
+
return this.edytor.popups.idOf('toolbar-link');
|
|
40
|
+
}
|
|
41
|
+
/** The control the bar's one tab stop is on (its `data-stop`, else its place), kept while it shows. */
|
|
42
|
+
#stop = 0;
|
|
43
|
+
/**
|
|
44
|
+
* The bar (`{@attach controller.popup}`, named by your markup): it takes
|
|
45
|
+
* the bar's id, its `toolbar` role unless it has its own, the placement's mark
|
|
46
|
+
* (`data-edytor-toolbar-bar`, which the toolbar's shortcut also reads),
|
|
47
|
+
* and is published to the view's root (`edytor.popups`, with that
|
|
48
|
+
* shortcut as its `aria-keyshortcuts`) while it is in the page.
|
|
49
|
+
*/
|
|
50
|
+
popup = (node) => {
|
|
51
|
+
identify(node, this.barId, 'toolbar');
|
|
52
|
+
node.setAttribute('data-edytor-toolbar-bar', '');
|
|
53
|
+
this.edytor.popups.set('toolbar', { id: this.barId, keys: 'Alt+F10' });
|
|
54
|
+
return () => this.edytor.popups.set('toolbar', null);
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* The bar's keys (`{@attach controller.keys}`, WAI-ARIA toolbar): one tab
|
|
58
|
+
* stop, the control it last held (`tabindex="0"`, every other `-1`); the
|
|
59
|
+
* arrows, Home and End walk its controls, Escape gives the focus back to
|
|
60
|
+
* the editor over the held selection (`release`). Every key in it is its
|
|
61
|
+
* own, never the editor's (Enter presses the button).
|
|
62
|
+
*/
|
|
63
|
+
keys = (node) => {
|
|
64
|
+
const stops = () => [...node.querySelectorAll(STOPS)];
|
|
65
|
+
const keyOf = (stop, at) => stop.dataset.stop ?? at;
|
|
66
|
+
/** One tab stop: the remembered control, else the first. */
|
|
67
|
+
const rove = () => {
|
|
68
|
+
const all = stops();
|
|
69
|
+
const at = all.findIndex((stop, index) => keyOf(stop, index) === this.#stop);
|
|
70
|
+
all.forEach((stop, index) => (stop.tabIndex = index === Math.max(0, at) ? 0 : -1));
|
|
71
|
+
};
|
|
72
|
+
const focusin = (event) => {
|
|
73
|
+
const all = stops();
|
|
74
|
+
const at = all.indexOf(event.target);
|
|
75
|
+
if (at === -1)
|
|
76
|
+
return;
|
|
77
|
+
this.#stop = keyOf(all[at], at);
|
|
78
|
+
rove();
|
|
79
|
+
};
|
|
80
|
+
const keydown = (event) => {
|
|
81
|
+
event.stopPropagation();
|
|
82
|
+
if (event.defaultPrevented)
|
|
83
|
+
return;
|
|
84
|
+
const all = stops();
|
|
85
|
+
const at = all.indexOf(event.target);
|
|
86
|
+
const next = {
|
|
87
|
+
ArrowRight: (at + 1) % all.length,
|
|
88
|
+
ArrowLeft: (at - 1 + all.length) % all.length,
|
|
89
|
+
Home: 0,
|
|
90
|
+
End: all.length - 1
|
|
91
|
+
}[event.key];
|
|
92
|
+
if (event.key === 'Escape') {
|
|
93
|
+
event.preventDefault();
|
|
94
|
+
this.release();
|
|
95
|
+
}
|
|
96
|
+
else if (next !== undefined && at !== -1) {
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
all[next]?.focus();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
rove();
|
|
102
|
+
const off = listen(node, 'focusin', focusin);
|
|
103
|
+
const off2 = listen(node, 'keydown', keydown);
|
|
104
|
+
return all(off, off2);
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* The link panel's field (`{@attach controller.linkField}`): its id
|
|
108
|
+
* (`linkFieldId`), the focus when the panel was just opened (Mod+K, Edit,
|
|
109
|
+
* the Link button), Enter applies the link and Escape closes the panel,
|
|
110
|
+
* both giving the editor its focus and the selection back.
|
|
111
|
+
*/
|
|
112
|
+
linkField = (node) => {
|
|
113
|
+
node.id = this.linkFieldId;
|
|
114
|
+
if (this.takeFieldFocus())
|
|
115
|
+
node.focus({ preventScroll: true });
|
|
116
|
+
const keydown = (event) => {
|
|
117
|
+
if (event.defaultPrevented || event.isComposing)
|
|
118
|
+
return;
|
|
119
|
+
if (event.key === 'Enter') {
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
this.applyLink();
|
|
122
|
+
this.closePanel(true);
|
|
123
|
+
}
|
|
124
|
+
else if (event.key === 'Escape') {
|
|
125
|
+
event.preventDefault();
|
|
126
|
+
this.closePanel(true);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
return listen(node, 'keydown', keydown);
|
|
130
|
+
};
|
|
54
131
|
/** Give the keyboard back to the editor (Escape in the bar), over the held selection. */
|
|
55
132
|
release() {
|
|
56
|
-
const snapshot = this
|
|
133
|
+
const snapshot = this.#selectionSnapshot;
|
|
57
134
|
this.panel = null;
|
|
58
135
|
if (snapshot)
|
|
59
|
-
this
|
|
60
|
-
this.edytor
|
|
61
|
-
this.edytor.node?.focus({ preventScroll: true });
|
|
136
|
+
this.#restoreSelection(snapshot);
|
|
137
|
+
takeKeys(this.edytor);
|
|
62
138
|
}
|
|
63
139
|
updateFromSelection(selection = this.edytor.selection) {
|
|
64
|
-
if (!this
|
|
140
|
+
if (!this.#canShowForSelection(selection)) {
|
|
65
141
|
this.shown = false;
|
|
66
142
|
this.linkUrl = '';
|
|
67
143
|
this.panel = null;
|
|
68
|
-
this
|
|
144
|
+
this.#selectionSnapshot = null;
|
|
69
145
|
return;
|
|
70
146
|
}
|
|
71
147
|
this.shown = true;
|
|
72
|
-
if (!this
|
|
73
|
-
this.linkUrl = this
|
|
74
|
-
this
|
|
148
|
+
if (!this.#isRestoringSelection)
|
|
149
|
+
this.linkUrl = this.#getSelectedLinkUrl();
|
|
150
|
+
this.#selectionSnapshot = selection.value.kind === 'text' ? selection.value : null;
|
|
75
151
|
}
|
|
76
152
|
setLinkUrl(value) {
|
|
77
153
|
this.linkUrl = value;
|
|
@@ -93,16 +169,16 @@ export class ToolbarController {
|
|
|
93
169
|
}
|
|
94
170
|
/** The row naming the selection's block, for the kind button's label. */
|
|
95
171
|
get currentKind() {
|
|
96
|
-
return rowOf(this.edytor, this.edytor.selection.
|
|
172
|
+
return rowOf(this.edytor, this.edytor.selection.textRange().startText?.parent);
|
|
97
173
|
}
|
|
98
174
|
togglePanel(panel) {
|
|
99
175
|
this.panel = this.panel === panel ? null : panel;
|
|
100
|
-
this
|
|
176
|
+
this.#focusField = this.panel === 'link';
|
|
101
177
|
}
|
|
102
178
|
/** Whether the link field mounting now takes the focus (once per opening). */
|
|
103
179
|
takeFieldFocus() {
|
|
104
|
-
const focus = this
|
|
105
|
-
this
|
|
180
|
+
const focus = this.#focusField;
|
|
181
|
+
this.#focusField = false;
|
|
106
182
|
return focus;
|
|
107
183
|
}
|
|
108
184
|
/**
|
|
@@ -112,7 +188,8 @@ export class ToolbarController {
|
|
|
112
188
|
*/
|
|
113
189
|
openLinkPanel() {
|
|
114
190
|
const { selection } = this.edytor;
|
|
115
|
-
const {
|
|
191
|
+
const { startText, yStart } = selection.textRange();
|
|
192
|
+
const { isCollapsed } = selection.projection;
|
|
116
193
|
if (selection.value.kind !== 'text' || !startText)
|
|
117
194
|
return false;
|
|
118
195
|
const { voidRoot, islandRoot } = selection.projection;
|
|
@@ -122,14 +199,17 @@ export class ToolbarController {
|
|
|
122
199
|
const run = linkAt(startText, yStart - 1) ?? linkAt(startText, yStart);
|
|
123
200
|
if (!run)
|
|
124
201
|
return false;
|
|
125
|
-
selection.
|
|
202
|
+
selection.selectText(startText, run.start, startText, run.end);
|
|
126
203
|
}
|
|
204
|
+
return this.#linkPanel();
|
|
205
|
+
}
|
|
206
|
+
/** The link panel over the selection, its field focused when it mounts; whether it opened. */
|
|
207
|
+
#linkPanel() {
|
|
127
208
|
this.updateFromSelection();
|
|
128
209
|
if (!this.isVisible)
|
|
129
210
|
return false;
|
|
130
211
|
this.panel = 'link';
|
|
131
|
-
this
|
|
132
|
-
return true;
|
|
212
|
+
return (this.#focusField = true);
|
|
133
213
|
}
|
|
134
214
|
/**
|
|
135
215
|
* Close the open panel. With `focus` (Enter or Escape in the link field)
|
|
@@ -137,13 +217,12 @@ export class ToolbarController {
|
|
|
137
217
|
*/
|
|
138
218
|
closePanel(focus = false) {
|
|
139
219
|
this.panel = null;
|
|
140
|
-
const snapshot = this
|
|
220
|
+
const snapshot = this.#selectionSnapshot;
|
|
141
221
|
if (!focus || this.edytor.readonly)
|
|
142
222
|
return;
|
|
143
|
-
this.edytor
|
|
144
|
-
this.edytor.node?.focus({ preventScroll: true });
|
|
223
|
+
takeKeys(this.edytor);
|
|
145
224
|
if (snapshot)
|
|
146
|
-
this
|
|
225
|
+
this.#restoreSelection(snapshot);
|
|
147
226
|
}
|
|
148
227
|
/** The link card shows: a link is hovered in an editable view. */
|
|
149
228
|
get card() {
|
|
@@ -168,26 +247,22 @@ export class ToolbarController {
|
|
|
168
247
|
}
|
|
169
248
|
/** The card's Edit: select the hovered link and open the link panel on it. */
|
|
170
249
|
editHovered() {
|
|
171
|
-
const link = this
|
|
250
|
+
const link = this.#hoveredLink();
|
|
172
251
|
this.hover(null);
|
|
173
252
|
if (!link)
|
|
174
253
|
return;
|
|
175
|
-
this.edytor.selection.
|
|
176
|
-
this
|
|
177
|
-
if (!this.isVisible)
|
|
178
|
-
return;
|
|
179
|
-
this.panel = 'link';
|
|
180
|
-
this.focusField = true;
|
|
254
|
+
this.edytor.selection.selectText(link.text, link.start, link.text, link.end);
|
|
255
|
+
this.#linkPanel();
|
|
181
256
|
}
|
|
182
257
|
/** The card's Remove: unlink the whole hovered link (one undo step); the selection stays. */
|
|
183
258
|
removeHovered() {
|
|
184
|
-
const link = this
|
|
259
|
+
const link = this.#hoveredLink();
|
|
185
260
|
this.hover(null);
|
|
186
261
|
if (link)
|
|
187
262
|
richTextOperations(this.edytor).unlinkText(link.text, link.start, link.end);
|
|
188
263
|
}
|
|
189
264
|
/** The hovered link element's text and link run, read from the model (never from the DOM). */
|
|
190
|
-
hoveredLink() {
|
|
265
|
+
#hoveredLink() {
|
|
191
266
|
const anchor = this.hovered;
|
|
192
267
|
if (!anchor?.isConnected || anchor.closest(`${SUGGESTION}, ${SYNTHETIC_TEXT_OVERLAY_SELECTOR}`))
|
|
193
268
|
return null;
|
|
@@ -201,12 +276,12 @@ export class ToolbarController {
|
|
|
201
276
|
/** Convert every block the selection touches (Notion), as one undo step. */
|
|
202
277
|
turnInto(kind) {
|
|
203
278
|
this.panel = null;
|
|
204
|
-
this
|
|
279
|
+
this.#runWithSelection(() => convertBlocks(this.edytor, getSelectionBlocks(this.edytor), kind));
|
|
205
280
|
}
|
|
206
281
|
/** Set (or clear, with `null`) the text color or background of the selection. */
|
|
207
282
|
setColor(mark, value) {
|
|
208
283
|
this.panel = null;
|
|
209
|
-
this
|
|
284
|
+
this.#runWithSelection(() => {
|
|
210
285
|
const operations = richTextOperations(this.edytor);
|
|
211
286
|
if (value)
|
|
212
287
|
operations.setMarkValueAtRange(mark, value);
|
|
@@ -218,7 +293,7 @@ export class ToolbarController {
|
|
|
218
293
|
const run = this.edytor.marks.get(mark)?.toolbar?.run;
|
|
219
294
|
if (run)
|
|
220
295
|
return run(this.edytor);
|
|
221
|
-
this
|
|
296
|
+
this.#runWithSelection(() => {
|
|
222
297
|
richTextOperations(this.edytor).setMarkAtRange(mark);
|
|
223
298
|
});
|
|
224
299
|
}
|
|
@@ -227,30 +302,30 @@ export class ToolbarController {
|
|
|
227
302
|
if (!href)
|
|
228
303
|
this.removeLink();
|
|
229
304
|
else
|
|
230
|
-
this
|
|
305
|
+
this.#runWithSelection(() => {
|
|
231
306
|
richTextOperations(this.edytor).setLinkAtRange({ href });
|
|
232
307
|
this.linkUrl = href;
|
|
233
308
|
});
|
|
234
309
|
}
|
|
235
310
|
removeLink() {
|
|
236
|
-
this
|
|
311
|
+
this.#runWithSelection(() => {
|
|
237
312
|
richTextOperations(this.edytor).removeLinkAtRange();
|
|
238
313
|
this.linkUrl = '';
|
|
239
314
|
});
|
|
240
315
|
}
|
|
241
|
-
canShowForSelection(selection) {
|
|
242
|
-
const
|
|
243
|
-
return (!
|
|
244
|
-
Boolean(
|
|
245
|
-
Boolean(
|
|
246
|
-
|
|
316
|
+
#canShowForSelection(selection) {
|
|
317
|
+
const range = selection.textRange();
|
|
318
|
+
return (!selection.projection.isCollapsed &&
|
|
319
|
+
Boolean(range.startText) &&
|
|
320
|
+
Boolean(range.endText) &&
|
|
321
|
+
range.texts.length > 0 &&
|
|
247
322
|
selection.selectedBlocks.size === 0 &&
|
|
248
323
|
selection.selectedInlineBlock.size === 0 &&
|
|
249
324
|
selection.projection.voidRoot === null &&
|
|
250
325
|
selection.projection.islandRoot === null);
|
|
251
326
|
}
|
|
252
|
-
getSelectedLinkUrl(
|
|
253
|
-
for (const { text, start, end } of selectedTextSpans(this.edytor
|
|
327
|
+
#getSelectedLinkUrl() {
|
|
328
|
+
for (const { text, start, end } of selectedTextSpans(this.edytor)) {
|
|
254
329
|
for (const segment of text.getMarksAtRange(start, end)) {
|
|
255
330
|
const href = getLinkHref(segment.marks?.link);
|
|
256
331
|
if (href)
|
|
@@ -260,21 +335,21 @@ export class ToolbarController {
|
|
|
260
335
|
return '';
|
|
261
336
|
}
|
|
262
337
|
/** Act on the held selection, then select it again (the projector displays it). */
|
|
263
|
-
runWithSelection(callback) {
|
|
264
|
-
const snapshot = this
|
|
338
|
+
#runWithSelection(callback) {
|
|
339
|
+
const snapshot = this.#selectionSnapshot;
|
|
265
340
|
if (!this.isVisible || !snapshot)
|
|
266
341
|
return;
|
|
267
|
-
this
|
|
342
|
+
this.#restoreSelection(snapshot);
|
|
268
343
|
callback();
|
|
269
|
-
this
|
|
344
|
+
this.#restoreSelection(snapshot);
|
|
270
345
|
}
|
|
271
|
-
restoreSelection(snapshot) {
|
|
272
|
-
this
|
|
346
|
+
#restoreSelection(snapshot) {
|
|
347
|
+
this.#isRestoringSelection = true;
|
|
273
348
|
try {
|
|
274
349
|
this.edytor.selection.select(snapshot);
|
|
275
350
|
}
|
|
276
351
|
finally {
|
|
277
|
-
this
|
|
352
|
+
this.#isRestoringSelection = false;
|
|
278
353
|
}
|
|
279
354
|
}
|
|
280
355
|
}
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { Plugin } from '../../plugins.js';
|
|
3
3
|
import { ToolbarController } from './ToolbarController.svelte.js';
|
|
4
|
-
import { type PartialLabels } from '../../labels.js';
|
|
5
4
|
export type ToolbarOptions = {
|
|
6
5
|
/**
|
|
7
|
-
*
|
|
8
|
-
* above the selection (
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* The toolbar's markup; it renders while `controller.isVisible`, placed
|
|
7
|
+
* above the selection (without it, nothing shows). A press on it never takes the editor's focus (its
|
|
8
|
+
* fields, an input or a select, take their own). Give it the
|
|
9
|
+
* keyboard and ARIA with its attachments: `{@attach controller.popup}`
|
|
10
|
+
* and `{@attach controller.keys}` on the bar (its id, role, placement and
|
|
11
|
+
* publication; the shortcut that reaches it, the roving tab stop and
|
|
12
|
+
* Escape), `{@attach
|
|
13
|
+
* controller.linkField}` on a link field.
|
|
11
14
|
*/
|
|
12
15
|
toolbar?: Snippet<[ToolbarController]>;
|
|
13
16
|
/**
|
|
14
|
-
* The card shown under a hovered link
|
|
15
|
-
*
|
|
17
|
+
* The card shown under a hovered link (`link.card`): it renders while
|
|
18
|
+
* `controller.card`, just below the hovered link (`controller.hoveredHref`,
|
|
19
|
+
* and `openHovered`, `editHovered`, `removeHovered`); without it, no
|
|
20
|
+
* card. A press on it never takes the editor's focus.
|
|
16
21
|
*/
|
|
17
|
-
|
|
18
|
-
/** The words the toolbar and the link card show, over the English ones. */
|
|
19
|
-
labels?: PartialLabels<'toolbar'>;
|
|
22
|
+
card?: Snippet<[ToolbarController]>;
|
|
20
23
|
};
|
|
21
|
-
/** The selection toolbar,
|
|
24
|
+
/** The selection toolbar, drawn by your `toolbar` snippet, and the link card by your `card`. */
|
|
22
25
|
export declare const createToolbarPlugin: (options?: ToolbarOptions) => Plugin;
|
|
23
|
-
/** The Notion-style selection toolbar. */
|
|
24
|
-
export declare const toolbarPlugin: Plugin;
|
|
@@ -1,34 +1,31 @@
|
|
|
1
|
-
import Toolbar from './Toolbar.svelte';
|
|
2
|
-
import LinkCard from './LinkCard.svelte';
|
|
3
1
|
import { ToolbarController } from './ToolbarController.svelte.js';
|
|
4
|
-
import {
|
|
2
|
+
import { mountChrome } from '../chrome.js';
|
|
3
|
+
import { placeNear } from '../../surface/overlay.js';
|
|
4
|
+
import { all, listen } from '../../utils/listen.js';
|
|
5
5
|
/** A press in a field of the chrome (an input, a select): it takes focus. */
|
|
6
6
|
const isNativeFieldEvent = (event) => event
|
|
7
7
|
.composedPath()
|
|
8
8
|
.some((target) => target instanceof Element && target.matches('input, textarea, select'));
|
|
9
|
-
/** The selection toolbar,
|
|
9
|
+
/** The selection toolbar, drawn by your `toolbar` snippet, and the link card by your `card`. */
|
|
10
10
|
export const createToolbarPlugin = (options = {}) => (edytor) => {
|
|
11
|
-
const controller = new ToolbarController(edytor
|
|
11
|
+
const controller = new ToolbarController(edytor);
|
|
12
12
|
/** Above the selection, kept in the viewport; measured in the overlay's frame, written after. */
|
|
13
13
|
const positionToolbar = (host) => {
|
|
14
14
|
const editor = edytor.node;
|
|
15
15
|
if (!editor || !controller.isVisible)
|
|
16
16
|
return;
|
|
17
|
-
const view = editor.ownerDocument.defaultView;
|
|
18
17
|
const selection = editor.ownerDocument.getSelection();
|
|
19
|
-
if (!
|
|
18
|
+
if (!selection?.rangeCount || !editor.contains(selection.anchorNode))
|
|
20
19
|
return;
|
|
21
20
|
const range = selection.getRangeAt(0);
|
|
22
21
|
if (typeof range.getBoundingClientRect !== 'function')
|
|
23
22
|
return;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const top = `${rect.top - height - 8 >= 8 ? rect.top - height - 8 : rect.bottom + 8}px`;
|
|
31
|
-
return () => Object.assign(host.style, { left, top });
|
|
23
|
+
return placeNear(host, range.getBoundingClientRect(), [460, 40], {
|
|
24
|
+
above: true,
|
|
25
|
+
center: true,
|
|
26
|
+
// The bar, not its open panel: panels drop over the text below it.
|
|
27
|
+
box: host.querySelector('[data-edytor-toolbar-bar]') ?? host.firstElementChild
|
|
28
|
+
});
|
|
32
29
|
};
|
|
33
30
|
/** Just below the hovered link, flush with it (the host's top padding bridges the two). */
|
|
34
31
|
const positionCard = (host) => {
|
|
@@ -65,14 +62,7 @@ export const createToolbarPlugin = (options = {}) => (edytor) => {
|
|
|
65
62
|
if (!inside(event.relatedTarget) && !linkOf(event.relatedTarget))
|
|
66
63
|
controller.hover(null);
|
|
67
64
|
};
|
|
68
|
-
node
|
|
69
|
-
node.addEventListener('mouseout', out);
|
|
70
|
-
card.addEventListener('mouseout', out);
|
|
71
|
-
return () => {
|
|
72
|
-
node.removeEventListener('mouseover', over);
|
|
73
|
-
node.removeEventListener('mouseout', out);
|
|
74
|
-
card.removeEventListener('mouseout', out);
|
|
75
|
-
};
|
|
65
|
+
return all(listen(node, 'mouseover', over), listen(node, 'mouseout', out), listen(card, 'mouseout', out));
|
|
76
66
|
};
|
|
77
67
|
/**
|
|
78
68
|
* Alt+F10 (the editors' convention: TinyMCE, CKEditor, Google Docs):
|
|
@@ -107,37 +97,32 @@ export const createToolbarPlugin = (options = {}) => (edytor) => {
|
|
|
107
97
|
edytor.overlay.invalidate();
|
|
108
98
|
},
|
|
109
99
|
onEdytorAttached: () => {
|
|
110
|
-
const
|
|
100
|
+
const offs = [];
|
|
111
101
|
// No press on the chrome takes focus, its background and a custom
|
|
112
102
|
// snippet's markup included (not only its buttons): the editor keeps
|
|
113
103
|
// its focus and its selection. A field (the link panel's input) takes
|
|
114
104
|
// its own. Every press has a `mousedown`, WebKit's lone one too
|
|
115
105
|
// (`onFocus.ts`), so no `pointerdown` is cancelled.
|
|
116
|
-
const host = edytor.overlay.layer?.querySelector('[data-edytor-toolbar-host]');
|
|
117
106
|
const keep = (event) => {
|
|
118
107
|
if (!isNativeFieldEvent(event))
|
|
119
108
|
event.preventDefault();
|
|
120
109
|
};
|
|
121
|
-
host
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
110
|
+
/** Mount `snippet` in the overlay while `shown`, its host keeping the focus on a press. */
|
|
111
|
+
const mount = (snippet, shown, name, zIndex, measure) => {
|
|
112
|
+
offs.push(mountChrome(edytor, snippet, controller, shown, { name, zIndex, measure }));
|
|
113
|
+
const host = snippet && edytor.overlay.layer?.querySelector(`[data-${name}]`);
|
|
114
|
+
offs.push(listen(host, 'mousedown', keep));
|
|
115
|
+
return host;
|
|
116
|
+
};
|
|
117
|
+
mount(options.toolbar, () => controller.isVisible, 'edytor-toolbar-host', 60, positionToolbar);
|
|
118
|
+
const card = mount(options.card, () => controller.card, 'edytor-link-card-host', 61, positionCard);
|
|
119
|
+
if (edytor.node && card)
|
|
120
|
+
offs.push(trackLinks(edytor.node, card));
|
|
121
|
+
offs.push(() => controller.hover(null));
|
|
131
122
|
return () => {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
untrack();
|
|
135
|
-
controller.hover(null);
|
|
136
|
-
unmountCard();
|
|
137
|
-
unmount();
|
|
123
|
+
for (const off of offs.reverse())
|
|
124
|
+
off();
|
|
138
125
|
};
|
|
139
126
|
}
|
|
140
127
|
};
|
|
141
128
|
};
|
|
142
|
-
/** The Notion-style selection toolbar. */
|
|
143
|
-
export const toolbarPlugin = createToolbarPlugin();
|
|
@@ -11,35 +11,22 @@
|
|
|
11
11
|
import type { Block } from '../../block/block.svelte.js';
|
|
12
12
|
import type { Text } from '../../text/text.svelte.js';
|
|
13
13
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
14
|
-
import type { TextAnchor } from '../../selection/selection.svelte.js';
|
|
15
14
|
import type { Trigger, TriggerContext } from '../../plugins.js';
|
|
16
15
|
import type { Popup } from '../../surface/popups.svelte.js';
|
|
17
16
|
import type { SelectionValue } from '../../session/selection.js';
|
|
18
|
-
|
|
19
|
-
value: string;
|
|
20
|
-
start?: number;
|
|
21
|
-
end?: number;
|
|
22
|
-
};
|
|
17
|
+
import { ChromeList } from '../list.svelte.js';
|
|
23
18
|
/** Where the trigger is now: its text, the trigger's start and the query's end in it. */
|
|
24
19
|
export type TriggerRange = {
|
|
25
20
|
text: Text;
|
|
26
21
|
triggerStart: number;
|
|
27
22
|
queryEnd: number;
|
|
28
23
|
};
|
|
29
|
-
export declare abstract class TextTriggerController {
|
|
30
|
-
|
|
24
|
+
export declare abstract class TextTriggerController extends ChromeList {
|
|
25
|
+
#private;
|
|
31
26
|
/** The text that opens the menu. */
|
|
32
27
|
readonly char: string;
|
|
33
|
-
/** The popup's owner name (`edytor.popups`), unique per view. */
|
|
34
|
-
protected owner: string;
|
|
35
28
|
isOpen: boolean;
|
|
36
29
|
query: string;
|
|
37
|
-
selectedIndex: number;
|
|
38
|
-
/** The trigger's start and the query's end, held as anchors so peers' edits move them. */
|
|
39
|
-
protected activeRange: {
|
|
40
|
-
trigger: TextAnchor;
|
|
41
|
-
end: TextAnchor;
|
|
42
|
-
} | null;
|
|
43
30
|
/** A pick is running: its own selection changes close nothing. */
|
|
44
31
|
protected picking: boolean;
|
|
45
32
|
constructor(edytor: Edytor,
|
|
@@ -49,28 +36,16 @@ export declare abstract class TextTriggerController {
|
|
|
49
36
|
owner: string);
|
|
50
37
|
/** The editor is readonly: the menu closes. */
|
|
51
38
|
get readonly(): boolean;
|
|
52
|
-
/** The
|
|
53
|
-
|
|
54
|
-
/** Publish the open menu to the view's root (`edytor.popups`), or withdraw it with `null`. */
|
|
55
|
-
publish: (popup: Popup | null) => void;
|
|
56
|
-
/** The rows the keyboard moves through. */
|
|
57
|
-
protected abstract get count(): number;
|
|
39
|
+
/** The record `popup` publishes, `active` the highlighted row's id when it is in the page. */
|
|
40
|
+
protected popupOf(active: string | undefined): Popup;
|
|
58
41
|
/** Whether a trigger typed in `block` opens the menu. */
|
|
59
42
|
protected abstract admits(block: Block): boolean;
|
|
60
43
|
/** The query changed (or was set again): close the menu, or load its rows. */
|
|
61
44
|
protected abstract queried(query: string): void;
|
|
62
45
|
/** After an `insertText`: the trigger opens, the query grows, or the menu closes. */
|
|
63
|
-
handleTextInsertion(text: Text, block: Block,
|
|
64
|
-
/**
|
|
65
|
-
* Where `value`, inserted at `start` of `text` (already written), completes
|
|
66
|
-
* the trigger: its start, or -1. A trigger of several characters (`[[`)
|
|
67
|
-
* completes with its last one.
|
|
68
|
-
*/
|
|
69
|
-
private triggerAt;
|
|
46
|
+
handleTextInsertion(text: Text, block: Block, start: number, value: string): void;
|
|
70
47
|
/** The caret moved: it stays after the trigger, in its text, and marks the query's end. */
|
|
71
48
|
reconcileSelection(): void;
|
|
72
|
-
/** Move the keyboard's row (wrapping); `false` when there is nothing to move through. */
|
|
73
|
-
moveSelection(delta: number): boolean;
|
|
74
49
|
close(): void;
|
|
75
50
|
/** The range where its anchors resolve now: one text, the trigger before the query end. */
|
|
76
51
|
protected get range(): TriggerRange | null;
|
|
@@ -88,7 +63,6 @@ export declare abstract class TextTriggerController {
|
|
|
88
63
|
owns?: (text: Text, held: SelectionValue) => boolean): Promise<Awaited<R> | undefined>;
|
|
89
64
|
protected setEnd(text: Text, queryEnd: number): void;
|
|
90
65
|
protected open(text: Text, triggerStart: number, queryEnd: number): void;
|
|
91
|
-
private syncQueryFromText;
|
|
92
66
|
}
|
|
93
67
|
/** A plugin's trigger (`triggers`): rows from its `items(query)`, a pick its `onPick`. */
|
|
94
68
|
export declare class TriggerMenuController<T = unknown> extends TextTriggerController {
|
|
@@ -101,21 +75,8 @@ export declare class TriggerMenuController<T = unknown> extends TextTriggerContr
|
|
|
101
75
|
constructor(edytor: Edytor, trigger: Trigger<T>, owner: string);
|
|
102
76
|
protected get count(): number;
|
|
103
77
|
protected admits(block: Block): boolean;
|
|
104
|
-
/** The menu's accessible name. */
|
|
105
|
-
get name(): string;
|
|
106
|
-
/** The text shown when no row matches. */
|
|
107
|
-
get empty(): string;
|
|
108
|
-
/** The text shown while a search is pending and no row is shown. */
|
|
109
|
-
get searching(): string;
|
|
110
78
|
labelOf: (item: T) => string;
|
|
111
79
|
keyOf: (item: T) => string;
|
|
112
|
-
/**
|
|
113
|
-
* The element id of the row at `index` (page-unique, whatever the rows'
|
|
114
|
-
* keys or labels), for `aria-activedescendant`.
|
|
115
|
-
*/
|
|
116
|
-
optionId: (index: number) => string;
|
|
117
|
-
/** The context `items` and `onPick` read, for the current range. */
|
|
118
|
-
private context;
|
|
119
80
|
protected queried(query: string): void;
|
|
120
81
|
/** The rows for the query: none after a word and a space is prose, and the menu closes. */
|
|
121
82
|
private answered;
|