edytor 1.0.0-rc.3 → 2.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 +21 -39
- package/dist/block/block.svelte.d.ts +11 -84
- package/dist/block/block.svelte.js +30 -134
- 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 +11 -9
- package/dist/block/inlineBlock.svelte.js +18 -21
- 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 +25 -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/awarenessSelection.d.ts +22 -1
- package/dist/collaboration/awarenessSelection.js +42 -0
- 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 +42 -56
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +82 -99
- package/dist/components/Edytor.svelte.d.ts +16 -13
- package/dist/components/InlineBlock.svelte +1 -1
- 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 +18 -13
- package/dist/crdt/data.js +49 -71
- 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 +8 -5
- package/dist/crdt/doc/reads.js +49 -50
- 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 +32 -115
- package/dist/crdt/document.js +216 -302
- package/dist/crdt/edytor-doc.d.ts +689 -90
- package/dist/crdt/edytor-doc.js +74 -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 +32 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +8 -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/props.d.ts +32 -0
- package/dist/crdt/props.js +172 -0
- 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/{plugins/blockHandles → dnd}/dropIndicator.d.ts +2 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.js +52 -60
- package/dist/{plugins/blockHandles → dnd}/geometry.d.ts +4 -3
- package/dist/{plugins/blockHandles → dnd}/geometry.js +6 -6
- package/dist/dnd/placement.d.ts +200 -0
- package/dist/dnd/placement.js +426 -0
- 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 +46 -63
- package/dist/edytor.svelte.js +126 -181
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -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 +7 -1
- package/dist/events/onDrop.js +64 -78
- 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 +14 -1
- package/dist/events/onPaste.js +51 -76
- package/dist/index.d.ts +11 -15
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +83 -320
- package/dist/labels.js +181 -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 +21 -196
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +158 -573
- package/dist/plugins/blockHandles/BlockHandles.svelte +15 -23
- 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 +130 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- 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 +8 -38
- package/dist/plugins/code/CodePlugin.svelte +53 -56
- 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 -22
- package/dist/plugins/code/languages.js +39 -128
- package/dist/plugins/columns/ColumnResize.svelte +16 -27
- 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/gaps.d.ts +7 -5
- package/dist/plugins/columns/gaps.js +11 -6
- package/dist/plugins/columns/resize.svelte.d.ts +17 -54
- package/dist/plugins/columns/resize.svelte.js +80 -173
- 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 -172
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +3 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.css +7 -0
- 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/fileDrop.d.ts +28 -0
- package/dist/plugins/fileDrop.js +116 -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 +6 -167
- package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
- package/dist/plugins/image/ImagePlugin.svelte +71 -151
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +12 -41
- 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.css +17 -0
- 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 +30 -26
- package/dist/plugins/index.js +28 -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 +10 -9
- 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 +13 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +11 -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 +45 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +21 -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 +200 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +34 -0
- package/dist/plugins/media/UploadPreview.svelte +32 -0
- package/dist/plugins/media/UploadPreview.svelte.d.ts +11 -0
- package/dist/plugins/media/VideoPlugin.svelte +14 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +12 -5
- package/dist/plugins/media/empty.svelte.d.ts +47 -46
- package/dist/plugins/media/empty.svelte.js +67 -60
- package/dist/plugins/media/media.d.ts +97 -44
- package/dist/plugins/media/media.js +77 -99
- package/dist/plugins/media/upload.css +23 -0
- 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 +84 -126
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +17 -27
- package/dist/plugins/mention/mention.css +6 -0
- 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 +154 -109
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +19 -26
- package/dist/plugins/pageLink/pageLink.css +6 -0
- 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 +174 -183
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +34 -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/richtext/richtext.css +6 -0
- 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 +340 -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 +55 -24
- package/dist/plugins/uploads.svelte.js +123 -50
- package/dist/plugins.d.ts +187 -66
- 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 +43 -39
- package/dist/session/attempt.js +62 -55
- package/dist/session/bindings.js +117 -145
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +208 -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 +16 -21
- package/dist/session/inputRules.d.ts +6 -3
- package/dist/session/inputRules.js +78 -83
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +43 -10
- package/dist/session/moves.js +101 -59
- package/dist/session/navigation.d.ts +10 -2
- package/dist/session/navigation.js +140 -172
- package/dist/session/ports.d.ts +2 -7
- package/dist/session/props.d.ts +25 -25
- package/dist/session/props.js +62 -159
- 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/uploads.d.ts +29 -0
- package/dist/session/uploads.js +10 -0
- 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 +272 -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/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
- /package/dist/{plugins/columns → dnd}/stacking.d.ts +0 -0
- /package/dist/{plugins/columns → dnd}/stacking.js +0 -0
|
@@ -4,47 +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 { englishLabels } from '../../labels.js';
|
|
8
7
|
import { identify } from '../chrome.js';
|
|
8
|
+
import { all, listen } from '../../utils/listen.js';
|
|
9
|
+
import { takeKeys } from '../../events/onFocus.js';
|
|
9
10
|
/** The bar's controls the arrows walk (a disabled one is skipped). */
|
|
10
11
|
const STOPS = 'button:not([disabled]), input:not([disabled]), select:not([disabled])';
|
|
11
|
-
/** Notion's palette: text colors and their backgrounds, by name (shown through the labels' `colors`). */
|
|
12
|
-
export const TOOLBAR_COLORS = [
|
|
13
|
-
{ name: 'Default', text: null, background: null },
|
|
14
|
-
{ name: 'Gray', text: '#7d7a75', background: '#f0efed' },
|
|
15
|
-
{ name: 'Brown', text: '#9f765a', background: '#f5ede9' },
|
|
16
|
-
{ name: 'Orange', text: '#d27b2d', background: '#fbebde' },
|
|
17
|
-
{ name: 'Yellow', text: '#cb9434', background: '#f9f3dc' },
|
|
18
|
-
{ name: 'Green', text: '#50946e', background: '#e8f1ec' },
|
|
19
|
-
{ name: 'Blue', text: '#387dc9', background: '#e5f2fc' },
|
|
20
|
-
{ name: 'Purple', text: '#9a6bb4', background: '#f3ebf9' },
|
|
21
|
-
{ name: 'Pink', text: '#c14c8a', background: '#fae9f1' },
|
|
22
|
-
{ name: 'Red', text: '#cf5148', background: '#fce9e7' }
|
|
23
|
-
];
|
|
24
12
|
const getLinkHref = (value) => isRecord(value) && typeof value.href === 'string' ? value.href : null;
|
|
25
13
|
export class ToolbarController {
|
|
26
14
|
edytor;
|
|
27
|
-
labels;
|
|
28
15
|
/** Shown for the current selection; hidden while the editor is readonly. */
|
|
29
16
|
shown = $state(false);
|
|
30
17
|
linkUrl = $state('');
|
|
31
18
|
/** The open panel: the kind menu, the link field or the colors. */
|
|
32
19
|
panel = $state(null);
|
|
33
20
|
/** The selection the toolbar acts on: a value (anchors), so peers' edits move it. */
|
|
34
|
-
selectionSnapshot = null;
|
|
35
|
-
isRestoringSelection = false;
|
|
21
|
+
#selectionSnapshot = null;
|
|
22
|
+
#isRestoringSelection = false;
|
|
36
23
|
/** The link panel's field takes the focus when it next mounts (it was opened, not re-rendered). */
|
|
37
|
-
focusField = false;
|
|
24
|
+
#focusField = false;
|
|
38
25
|
/** The link under the pointer, for the link card (`link.card`). */
|
|
39
26
|
hovered = $state.raw(null);
|
|
40
|
-
constructor(edytor
|
|
41
|
-
/** The words the toolbar shows (the plugin's `labels`): read them in a custom `toolbar`. */
|
|
42
|
-
labels = englishLabels.toolbar) {
|
|
27
|
+
constructor(edytor) {
|
|
43
28
|
this.edytor = edytor;
|
|
44
|
-
this.labels = labels;
|
|
45
29
|
}
|
|
46
|
-
/** A palette color's name as shown (`labels.colors`). */
|
|
47
|
-
colorName = (name) => this.labels.colors[name] ?? name;
|
|
48
30
|
get isVisible() {
|
|
49
31
|
return this.shown && !this.edytor.readonly;
|
|
50
32
|
}
|
|
@@ -52,8 +34,6 @@ export class ToolbarController {
|
|
|
52
34
|
get barId() {
|
|
53
35
|
return this.edytor.popups.idOf('toolbar');
|
|
54
36
|
}
|
|
55
|
-
/** Publish the shown bar to the view's root (`edytor.popups`), or withdraw it with `null`. */
|
|
56
|
-
publish = (popup) => this.edytor.popups.set('toolbar', popup);
|
|
57
37
|
/** The link panel's field id (page-unique): a `label`'s `for`. */
|
|
58
38
|
get linkFieldId() {
|
|
59
39
|
return this.edytor.popups.idOf('toolbar-link');
|
|
@@ -61,17 +41,17 @@ export class ToolbarController {
|
|
|
61
41
|
/** The control the bar's one tab stop is on (its `data-stop`, else its place), kept while it shows. */
|
|
62
42
|
#stop = 0;
|
|
63
43
|
/**
|
|
64
|
-
* The bar (`{@attach controller.popup}
|
|
65
|
-
* `toolbar` role
|
|
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
|
|
66
46
|
* (`data-edytor-toolbar-bar`, which the toolbar's shortcut also reads),
|
|
67
47
|
* and is published to the view's root (`edytor.popups`, with that
|
|
68
48
|
* shortcut as its `aria-keyshortcuts`) while it is in the page.
|
|
69
49
|
*/
|
|
70
50
|
popup = (node) => {
|
|
71
|
-
identify(node, this.barId, 'toolbar'
|
|
51
|
+
identify(node, this.barId, 'toolbar');
|
|
72
52
|
node.setAttribute('data-edytor-toolbar-bar', '');
|
|
73
|
-
this.
|
|
74
|
-
return () => this.
|
|
53
|
+
this.edytor.popups.set('toolbar', { id: this.barId, keys: 'Alt+F10' });
|
|
54
|
+
return () => this.edytor.popups.set('toolbar', null);
|
|
75
55
|
};
|
|
76
56
|
/**
|
|
77
57
|
* The bar's keys (`{@attach controller.keys}`, WAI-ARIA toolbar): one tab
|
|
@@ -119,12 +99,9 @@ export class ToolbarController {
|
|
|
119
99
|
}
|
|
120
100
|
};
|
|
121
101
|
rove();
|
|
122
|
-
node
|
|
123
|
-
node
|
|
124
|
-
return ()
|
|
125
|
-
node.removeEventListener('focusin', focusin);
|
|
126
|
-
node.removeEventListener('keydown', keydown);
|
|
127
|
-
};
|
|
102
|
+
const off = listen(node, 'focusin', focusin);
|
|
103
|
+
const off2 = listen(node, 'keydown', keydown);
|
|
104
|
+
return all(off, off2);
|
|
128
105
|
};
|
|
129
106
|
/**
|
|
130
107
|
* The link panel's field (`{@attach controller.linkField}`): its id
|
|
@@ -149,30 +126,28 @@ export class ToolbarController {
|
|
|
149
126
|
this.closePanel(true);
|
|
150
127
|
}
|
|
151
128
|
};
|
|
152
|
-
node
|
|
153
|
-
return () => node.removeEventListener('keydown', keydown);
|
|
129
|
+
return listen(node, 'keydown', keydown);
|
|
154
130
|
};
|
|
155
131
|
/** Give the keyboard back to the editor (Escape in the bar), over the held selection. */
|
|
156
132
|
release() {
|
|
157
|
-
const snapshot = this
|
|
133
|
+
const snapshot = this.#selectionSnapshot;
|
|
158
134
|
this.panel = null;
|
|
159
135
|
if (snapshot)
|
|
160
|
-
this
|
|
161
|
-
this.edytor
|
|
162
|
-
this.edytor.node?.focus({ preventScroll: true });
|
|
136
|
+
this.#restoreSelection(snapshot);
|
|
137
|
+
takeKeys(this.edytor);
|
|
163
138
|
}
|
|
164
139
|
updateFromSelection(selection = this.edytor.selection) {
|
|
165
|
-
if (!this
|
|
140
|
+
if (!this.#canShowForSelection(selection)) {
|
|
166
141
|
this.shown = false;
|
|
167
142
|
this.linkUrl = '';
|
|
168
143
|
this.panel = null;
|
|
169
|
-
this
|
|
144
|
+
this.#selectionSnapshot = null;
|
|
170
145
|
return;
|
|
171
146
|
}
|
|
172
147
|
this.shown = true;
|
|
173
|
-
if (!this
|
|
174
|
-
this.linkUrl = this
|
|
175
|
-
this
|
|
148
|
+
if (!this.#isRestoringSelection)
|
|
149
|
+
this.linkUrl = this.#getSelectedLinkUrl();
|
|
150
|
+
this.#selectionSnapshot = selection.value.kind === 'text' ? selection.value : null;
|
|
176
151
|
}
|
|
177
152
|
setLinkUrl(value) {
|
|
178
153
|
this.linkUrl = value;
|
|
@@ -194,16 +169,16 @@ export class ToolbarController {
|
|
|
194
169
|
}
|
|
195
170
|
/** The row naming the selection's block, for the kind button's label. */
|
|
196
171
|
get currentKind() {
|
|
197
|
-
return rowOf(this.edytor, this.edytor.selection.
|
|
172
|
+
return rowOf(this.edytor, this.edytor.selection.textRange().startText?.parent);
|
|
198
173
|
}
|
|
199
174
|
togglePanel(panel) {
|
|
200
175
|
this.panel = this.panel === panel ? null : panel;
|
|
201
|
-
this
|
|
176
|
+
this.#focusField = this.panel === 'link';
|
|
202
177
|
}
|
|
203
178
|
/** Whether the link field mounting now takes the focus (once per opening). */
|
|
204
179
|
takeFieldFocus() {
|
|
205
|
-
const focus = this
|
|
206
|
-
this
|
|
180
|
+
const focus = this.#focusField;
|
|
181
|
+
this.#focusField = false;
|
|
207
182
|
return focus;
|
|
208
183
|
}
|
|
209
184
|
/**
|
|
@@ -213,7 +188,8 @@ export class ToolbarController {
|
|
|
213
188
|
*/
|
|
214
189
|
openLinkPanel() {
|
|
215
190
|
const { selection } = this.edytor;
|
|
216
|
-
const {
|
|
191
|
+
const { startText, yStart } = selection.textRange();
|
|
192
|
+
const { isCollapsed } = selection.projection;
|
|
217
193
|
if (selection.value.kind !== 'text' || !startText)
|
|
218
194
|
return false;
|
|
219
195
|
const { voidRoot, islandRoot } = selection.projection;
|
|
@@ -223,14 +199,17 @@ export class ToolbarController {
|
|
|
223
199
|
const run = linkAt(startText, yStart - 1) ?? linkAt(startText, yStart);
|
|
224
200
|
if (!run)
|
|
225
201
|
return false;
|
|
226
|
-
selection.
|
|
202
|
+
selection.selectText(startText, run.start, startText, run.end);
|
|
227
203
|
}
|
|
204
|
+
return this.#linkPanel();
|
|
205
|
+
}
|
|
206
|
+
/** The link panel over the selection, its field focused when it mounts; whether it opened. */
|
|
207
|
+
#linkPanel() {
|
|
228
208
|
this.updateFromSelection();
|
|
229
209
|
if (!this.isVisible)
|
|
230
210
|
return false;
|
|
231
211
|
this.panel = 'link';
|
|
232
|
-
this
|
|
233
|
-
return true;
|
|
212
|
+
return (this.#focusField = true);
|
|
234
213
|
}
|
|
235
214
|
/**
|
|
236
215
|
* Close the open panel. With `focus` (Enter or Escape in the link field)
|
|
@@ -238,13 +217,12 @@ export class ToolbarController {
|
|
|
238
217
|
*/
|
|
239
218
|
closePanel(focus = false) {
|
|
240
219
|
this.panel = null;
|
|
241
|
-
const snapshot = this
|
|
220
|
+
const snapshot = this.#selectionSnapshot;
|
|
242
221
|
if (!focus || this.edytor.readonly)
|
|
243
222
|
return;
|
|
244
|
-
this.edytor
|
|
245
|
-
this.edytor.node?.focus({ preventScroll: true });
|
|
223
|
+
takeKeys(this.edytor);
|
|
246
224
|
if (snapshot)
|
|
247
|
-
this
|
|
225
|
+
this.#restoreSelection(snapshot);
|
|
248
226
|
}
|
|
249
227
|
/** The link card shows: a link is hovered in an editable view. */
|
|
250
228
|
get card() {
|
|
@@ -269,26 +247,22 @@ export class ToolbarController {
|
|
|
269
247
|
}
|
|
270
248
|
/** The card's Edit: select the hovered link and open the link panel on it. */
|
|
271
249
|
editHovered() {
|
|
272
|
-
const link = this
|
|
250
|
+
const link = this.#hoveredLink();
|
|
273
251
|
this.hover(null);
|
|
274
252
|
if (!link)
|
|
275
253
|
return;
|
|
276
|
-
this.edytor.selection.
|
|
277
|
-
this
|
|
278
|
-
if (!this.isVisible)
|
|
279
|
-
return;
|
|
280
|
-
this.panel = 'link';
|
|
281
|
-
this.focusField = true;
|
|
254
|
+
this.edytor.selection.selectText(link.text, link.start, link.text, link.end);
|
|
255
|
+
this.#linkPanel();
|
|
282
256
|
}
|
|
283
257
|
/** The card's Remove: unlink the whole hovered link (one undo step); the selection stays. */
|
|
284
258
|
removeHovered() {
|
|
285
|
-
const link = this
|
|
259
|
+
const link = this.#hoveredLink();
|
|
286
260
|
this.hover(null);
|
|
287
261
|
if (link)
|
|
288
262
|
richTextOperations(this.edytor).unlinkText(link.text, link.start, link.end);
|
|
289
263
|
}
|
|
290
264
|
/** The hovered link element's text and link run, read from the model (never from the DOM). */
|
|
291
|
-
hoveredLink() {
|
|
265
|
+
#hoveredLink() {
|
|
292
266
|
const anchor = this.hovered;
|
|
293
267
|
if (!anchor?.isConnected || anchor.closest(`${SUGGESTION}, ${SYNTHETIC_TEXT_OVERLAY_SELECTOR}`))
|
|
294
268
|
return null;
|
|
@@ -302,12 +276,12 @@ export class ToolbarController {
|
|
|
302
276
|
/** Convert every block the selection touches (Notion), as one undo step. */
|
|
303
277
|
turnInto(kind) {
|
|
304
278
|
this.panel = null;
|
|
305
|
-
this
|
|
279
|
+
this.#runWithSelection(() => convertBlocks(this.edytor, getSelectionBlocks(this.edytor), kind));
|
|
306
280
|
}
|
|
307
281
|
/** Set (or clear, with `null`) the text color or background of the selection. */
|
|
308
282
|
setColor(mark, value) {
|
|
309
283
|
this.panel = null;
|
|
310
|
-
this
|
|
284
|
+
this.#runWithSelection(() => {
|
|
311
285
|
const operations = richTextOperations(this.edytor);
|
|
312
286
|
if (value)
|
|
313
287
|
operations.setMarkValueAtRange(mark, value);
|
|
@@ -319,7 +293,7 @@ export class ToolbarController {
|
|
|
319
293
|
const run = this.edytor.marks.get(mark)?.toolbar?.run;
|
|
320
294
|
if (run)
|
|
321
295
|
return run(this.edytor);
|
|
322
|
-
this
|
|
296
|
+
this.#runWithSelection(() => {
|
|
323
297
|
richTextOperations(this.edytor).setMarkAtRange(mark);
|
|
324
298
|
});
|
|
325
299
|
}
|
|
@@ -328,30 +302,30 @@ export class ToolbarController {
|
|
|
328
302
|
if (!href)
|
|
329
303
|
this.removeLink();
|
|
330
304
|
else
|
|
331
|
-
this
|
|
305
|
+
this.#runWithSelection(() => {
|
|
332
306
|
richTextOperations(this.edytor).setLinkAtRange({ href });
|
|
333
307
|
this.linkUrl = href;
|
|
334
308
|
});
|
|
335
309
|
}
|
|
336
310
|
removeLink() {
|
|
337
|
-
this
|
|
311
|
+
this.#runWithSelection(() => {
|
|
338
312
|
richTextOperations(this.edytor).removeLinkAtRange();
|
|
339
313
|
this.linkUrl = '';
|
|
340
314
|
});
|
|
341
315
|
}
|
|
342
|
-
canShowForSelection(selection) {
|
|
343
|
-
const
|
|
344
|
-
return (!
|
|
345
|
-
Boolean(
|
|
346
|
-
Boolean(
|
|
347
|
-
|
|
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 &&
|
|
348
322
|
selection.selectedBlocks.size === 0 &&
|
|
349
323
|
selection.selectedInlineBlock.size === 0 &&
|
|
350
324
|
selection.projection.voidRoot === null &&
|
|
351
325
|
selection.projection.islandRoot === null);
|
|
352
326
|
}
|
|
353
|
-
getSelectedLinkUrl(
|
|
354
|
-
for (const { text, start, end } of selectedTextSpans(this.edytor
|
|
327
|
+
#getSelectedLinkUrl() {
|
|
328
|
+
for (const { text, start, end } of selectedTextSpans(this.edytor)) {
|
|
355
329
|
for (const segment of text.getMarksAtRange(start, end)) {
|
|
356
330
|
const href = getLinkHref(segment.marks?.link);
|
|
357
331
|
if (href)
|
|
@@ -361,21 +335,21 @@ export class ToolbarController {
|
|
|
361
335
|
return '';
|
|
362
336
|
}
|
|
363
337
|
/** Act on the held selection, then select it again (the projector displays it). */
|
|
364
|
-
runWithSelection(callback) {
|
|
365
|
-
const snapshot = this
|
|
338
|
+
#runWithSelection(callback) {
|
|
339
|
+
const snapshot = this.#selectionSnapshot;
|
|
366
340
|
if (!this.isVisible || !snapshot)
|
|
367
341
|
return;
|
|
368
|
-
this
|
|
342
|
+
this.#restoreSelection(snapshot);
|
|
369
343
|
callback();
|
|
370
|
-
this
|
|
344
|
+
this.#restoreSelection(snapshot);
|
|
371
345
|
}
|
|
372
|
-
restoreSelection(snapshot) {
|
|
373
|
-
this
|
|
346
|
+
#restoreSelection(snapshot) {
|
|
347
|
+
this.#isRestoringSelection = true;
|
|
374
348
|
try {
|
|
375
349
|
this.edytor.selection.select(snapshot);
|
|
376
350
|
}
|
|
377
351
|
finally {
|
|
378
|
-
this
|
|
352
|
+
this.#isRestoringSelection = false;
|
|
379
353
|
}
|
|
380
354
|
}
|
|
381
355
|
}
|
|
@@ -1,12 +1,11 @@
|
|
|
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. A press on it never takes the editor's focus (its
|
|
9
|
-
* fields, an input or a select, take their own).
|
|
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
|
|
10
9
|
* keyboard and ARIA with its attachments: `{@attach controller.popup}`
|
|
11
10
|
* and `{@attach controller.keys}` on the bar (its id, role, placement and
|
|
12
11
|
* publication; the shortcut that reaches it, the roving tab stop and
|
|
@@ -15,21 +14,12 @@ export type ToolbarOptions = {
|
|
|
15
14
|
*/
|
|
16
15
|
toolbar?: Snippet<[ToolbarController]>;
|
|
17
16
|
/**
|
|
18
|
-
* The card shown under a hovered link
|
|
19
|
-
*
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Replace the link card's markup; it renders while `controller.card`,
|
|
24
|
-
* just below the hovered link (`controller.hoveredHref`, and
|
|
25
|
-
* `openHovered`, `editHovered`, `removeHovered`). A press on it never
|
|
26
|
-
* takes the editor's focus.
|
|
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.
|
|
27
21
|
*/
|
|
28
22
|
card?: Snippet<[ToolbarController]>;
|
|
29
|
-
/** The words the toolbar and the link card show, over the English ones. */
|
|
30
|
-
labels?: PartialLabels<'toolbar'>;
|
|
31
23
|
};
|
|
32
|
-
/** The selection toolbar,
|
|
24
|
+
/** The selection toolbar, drawn by your `toolbar` snippet, and the link card by your `card`. */
|
|
33
25
|
export declare const createToolbarPlugin: (options?: ToolbarOptions) => Plugin;
|
|
34
|
-
/** The Notion-style selection toolbar. */
|
|
35
|
-
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();
|
|
@@ -8,40 +8,25 @@
|
|
|
8
8
|
* first operation (one plan, one undo step). The slash menu is one
|
|
9
9
|
* (`SlashMenuController`), a plugin's `triggers` are the others.
|
|
10
10
|
*/
|
|
11
|
-
import type { Attachment } from 'svelte/attachments';
|
|
12
11
|
import type { Block } from '../../block/block.svelte.js';
|
|
13
12
|
import type { Text } from '../../text/text.svelte.js';
|
|
14
13
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
15
|
-
import type { TextAnchor } from '../../selection/selection.svelte.js';
|
|
16
14
|
import type { Trigger, TriggerContext } from '../../plugins.js';
|
|
17
15
|
import type { Popup } from '../../surface/popups.svelte.js';
|
|
18
16
|
import type { SelectionValue } from '../../session/selection.js';
|
|
19
|
-
import {
|
|
20
|
-
export type TextInsertionPayload = {
|
|
21
|
-
value: string;
|
|
22
|
-
start?: number;
|
|
23
|
-
end?: number;
|
|
24
|
-
};
|
|
17
|
+
import { ChromeList } from '../list.svelte.js';
|
|
25
18
|
/** Where the trigger is now: its text, the trigger's start and the query's end in it. */
|
|
26
19
|
export type TriggerRange = {
|
|
27
20
|
text: Text;
|
|
28
21
|
triggerStart: number;
|
|
29
22
|
queryEnd: number;
|
|
30
23
|
};
|
|
31
|
-
export declare abstract class TextTriggerController {
|
|
32
|
-
|
|
24
|
+
export declare abstract class TextTriggerController extends ChromeList {
|
|
25
|
+
#private;
|
|
33
26
|
/** The text that opens the menu. */
|
|
34
27
|
readonly char: string;
|
|
35
|
-
/** The popup's owner name (`edytor.popups`), unique per view. */
|
|
36
|
-
protected owner: string;
|
|
37
28
|
isOpen: boolean;
|
|
38
29
|
query: string;
|
|
39
|
-
selectedIndex: number;
|
|
40
|
-
/** The trigger's start and the query's end, held as anchors so peers' edits move them. */
|
|
41
|
-
protected activeRange: {
|
|
42
|
-
trigger: TextAnchor;
|
|
43
|
-
end: TextAnchor;
|
|
44
|
-
} | null;
|
|
45
30
|
/** A pick is running: its own selection changes close nothing. */
|
|
46
31
|
protected picking: boolean;
|
|
47
32
|
constructor(edytor: Edytor,
|
|
@@ -51,49 +36,16 @@ export declare abstract class TextTriggerController {
|
|
|
51
36
|
owner: string);
|
|
52
37
|
/** The editor is readonly: the menu closes. */
|
|
53
38
|
get readonly(): boolean;
|
|
54
|
-
/** The listbox's element id (page-unique), for `aria-controls`. */
|
|
55
|
-
get listId(): string;
|
|
56
|
-
/** Publish the open menu to the view's root (`edytor.popups`), or withdraw it with `null`. */
|
|
57
|
-
publish: (popup: Popup | null) => void;
|
|
58
|
-
/**
|
|
59
|
-
* The listbox (`{@attach controller.popup}`): it takes the menu's id, its
|
|
60
|
-
* `listbox` role and name unless it has its own, keeps the focus where it
|
|
61
|
-
* is on a press (the editor's caret, or the menu's field), and is
|
|
62
|
-
* published to the view's root (`edytor.popups`) while the menu is open,
|
|
63
|
-
* with its highlighted row (`option(index)`) once that row is in the page.
|
|
64
|
-
*/
|
|
65
|
-
popup: Attachment<HTMLElement>;
|
|
66
|
-
/**
|
|
67
|
-
* The attributes of the row at `index`: spread them on its element
|
|
68
|
-
* (`{...controller.option(index)}`): its id (the one the menu's keyboard
|
|
69
|
-
* owner names), `role="option"`, `aria-selected` and `data-selected` for
|
|
70
|
-
* the keyboard's row, which scrolls into view.
|
|
71
|
-
*/
|
|
72
|
-
option: (index: number) => OptionAttributes;
|
|
73
39
|
/** The record `popup` publishes, `active` the highlighted row's id when it is in the page. */
|
|
74
40
|
protected popupOf(active: string | undefined): Popup;
|
|
75
|
-
/** The listbox's accessible name. */
|
|
76
|
-
protected abstract get listName(): string;
|
|
77
|
-
/** The element id of the row at `index`, if there is such a row. */
|
|
78
|
-
protected abstract rowIdAt(index: number): string | undefined;
|
|
79
|
-
/** The rows the keyboard moves through. */
|
|
80
|
-
protected abstract get count(): number;
|
|
81
41
|
/** Whether a trigger typed in `block` opens the menu. */
|
|
82
42
|
protected abstract admits(block: Block): boolean;
|
|
83
43
|
/** The query changed (or was set again): close the menu, or load its rows. */
|
|
84
44
|
protected abstract queried(query: string): void;
|
|
85
45
|
/** After an `insertText`: the trigger opens, the query grows, or the menu closes. */
|
|
86
|
-
handleTextInsertion(text: Text, block: Block,
|
|
87
|
-
/**
|
|
88
|
-
* Where `value`, inserted at `start` of `text` (already written), completes
|
|
89
|
-
* the trigger: its start, or -1. A trigger of several characters (`[[`)
|
|
90
|
-
* completes with its last one.
|
|
91
|
-
*/
|
|
92
|
-
private triggerAt;
|
|
46
|
+
handleTextInsertion(text: Text, block: Block, start: number, value: string): void;
|
|
93
47
|
/** The caret moved: it stays after the trigger, in its text, and marks the query's end. */
|
|
94
48
|
reconcileSelection(): void;
|
|
95
|
-
/** Move the keyboard's row (wrapping); `false` when there is nothing to move through. */
|
|
96
|
-
moveSelection(delta: number): boolean;
|
|
97
49
|
close(): void;
|
|
98
50
|
/** The range where its anchors resolve now: one text, the trigger before the query end. */
|
|
99
51
|
protected get range(): TriggerRange | null;
|
|
@@ -111,7 +63,6 @@ export declare abstract class TextTriggerController {
|
|
|
111
63
|
owns?: (text: Text, held: SelectionValue) => boolean): Promise<Awaited<R> | undefined>;
|
|
112
64
|
protected setEnd(text: Text, queryEnd: number): void;
|
|
113
65
|
protected open(text: Text, triggerStart: number, queryEnd: number): void;
|
|
114
|
-
private syncQueryFromText;
|
|
115
66
|
}
|
|
116
67
|
/** A plugin's trigger (`triggers`): rows from its `items(query)`, a pick its `onPick`. */
|
|
117
68
|
export declare class TriggerMenuController<T = unknown> extends TextTriggerController {
|
|
@@ -124,23 +75,8 @@ export declare class TriggerMenuController<T = unknown> extends TextTriggerContr
|
|
|
124
75
|
constructor(edytor: Edytor, trigger: Trigger<T>, owner: string);
|
|
125
76
|
protected get count(): number;
|
|
126
77
|
protected admits(block: Block): boolean;
|
|
127
|
-
/** The menu's accessible name. */
|
|
128
|
-
get name(): string;
|
|
129
|
-
protected get listName(): string;
|
|
130
|
-
protected rowIdAt(index: number): string | undefined;
|
|
131
|
-
/** The text shown when no row matches. */
|
|
132
|
-
get empty(): string;
|
|
133
|
-
/** The text shown while a search is pending and no row is shown. */
|
|
134
|
-
get searching(): string;
|
|
135
78
|
labelOf: (item: T) => string;
|
|
136
79
|
keyOf: (item: T) => string;
|
|
137
|
-
/**
|
|
138
|
-
* The element id of the row at `index` (page-unique, whatever the rows'
|
|
139
|
-
* keys or labels), for `aria-activedescendant`.
|
|
140
|
-
*/
|
|
141
|
-
optionId: (index: number) => string;
|
|
142
|
-
/** The context `items` and `onPick` read, for the current range. */
|
|
143
|
-
private context;
|
|
144
80
|
protected queried(query: string): void;
|
|
145
81
|
/** The rows for the query: none after a word and a space is prose, and the menu closes. */
|
|
146
82
|
private answered;
|