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
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
import { inCodeLines } from '../../session/inputRules.js';
|
|
2
|
+
import { ChromeList, inPage } from '../list.svelte.js';
|
|
2
3
|
/** A trigger opens at a text's start or after whitespace, never inside a word (`1/2`, `a@b`). */
|
|
3
4
|
const startsTrigger = (text, offset) => offset === 0 || /\s/.test(text.stringContent[offset - 1] ?? '');
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
/** What `items` and `onPick` read: the trigger's block, its range in block offsets, the query. */
|
|
6
|
+
const contextOf = (edytor, text, start, end, query) => {
|
|
7
|
+
const block = text.parent;
|
|
8
|
+
return {
|
|
9
|
+
edytor,
|
|
10
|
+
block,
|
|
11
|
+
from: text.segStart + start,
|
|
12
|
+
to: text.segStart + end,
|
|
13
|
+
query,
|
|
14
|
+
caret: (offset) => void edytor.dispatcher.caret({ block, offset })
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export class TextTriggerController extends ChromeList {
|
|
6
18
|
char;
|
|
7
|
-
owner;
|
|
8
19
|
isOpen = $state(false);
|
|
9
20
|
query = $state('');
|
|
10
|
-
selectedIndex = $state(0);
|
|
11
21
|
/** The trigger's start and the query's end, held as anchors so peers' edits move them. */
|
|
12
|
-
activeRange = null;
|
|
22
|
+
#activeRange = null;
|
|
13
23
|
/** A pick is running: its own selection changes close nothing. */
|
|
14
24
|
picking = false;
|
|
15
25
|
constructor(edytor,
|
|
@@ -17,36 +27,30 @@ export class TextTriggerController {
|
|
|
17
27
|
char,
|
|
18
28
|
/** The popup's owner name (`edytor.popups`), unique per view. */
|
|
19
29
|
owner) {
|
|
20
|
-
this.
|
|
30
|
+
super(edytor, owner, 'listbox', (node) => this.isOpen && this.popupOf(inPage(node, this.rowId(this.index))));
|
|
21
31
|
this.char = char;
|
|
22
|
-
this.owner = owner;
|
|
23
32
|
}
|
|
24
33
|
/** The editor is readonly: the menu closes. */
|
|
25
34
|
get readonly() {
|
|
26
35
|
return this.edytor.readonly;
|
|
27
36
|
}
|
|
28
|
-
/** The
|
|
29
|
-
|
|
30
|
-
return this.
|
|
37
|
+
/** The record `popup` publishes, `active` the highlighted row's id when it is in the page. */
|
|
38
|
+
popupOf(active) {
|
|
39
|
+
return { id: this.listId, haspopup: 'listbox', active };
|
|
31
40
|
}
|
|
32
|
-
/** Publish the open menu to the view's root (`edytor.popups`), or withdraw it with `null`. */
|
|
33
|
-
publish = (popup) => this.edytor.popups.set(this.owner, popup);
|
|
34
41
|
/** After an `insertText`: the trigger opens, the query grows, or the menu closes. */
|
|
35
|
-
handleTextInsertion(text, block,
|
|
36
|
-
const { state } = this.edytor.selection;
|
|
37
|
-
const start = payload.start ?? state.yStart;
|
|
38
|
-
const end = payload.end ?? state.yEnd;
|
|
42
|
+
handleTextInsertion(text, block, start, value) {
|
|
39
43
|
if (this.edytor.readonly)
|
|
40
44
|
return this.close();
|
|
41
45
|
// A trigger typed alone, or committed by an IME with its query (`/h`).
|
|
42
|
-
const at =
|
|
46
|
+
const at = this.admits(block) ? this.#triggerAt(text, start, value) : -1;
|
|
43
47
|
if (at !== -1)
|
|
44
|
-
this.open(text, at, start +
|
|
48
|
+
this.open(text, at, start + value.length);
|
|
45
49
|
// Typing at the query's end extends it; typing anywhere else closes the menu.
|
|
46
|
-
else if (this
|
|
50
|
+
else if (this.#activeRange) {
|
|
47
51
|
const range = this.range;
|
|
48
52
|
if (text === range?.text && start === range.queryEnd)
|
|
49
|
-
this.setEnd(text, start +
|
|
53
|
+
this.setEnd(text, start + value.length);
|
|
50
54
|
else
|
|
51
55
|
this.close();
|
|
52
56
|
}
|
|
@@ -56,7 +60,7 @@ export class TextTriggerController {
|
|
|
56
60
|
* the trigger: its start, or -1. A trigger of several characters (`[[`)
|
|
57
61
|
* completes with its last one.
|
|
58
62
|
*/
|
|
59
|
-
triggerAt(text, start, value) {
|
|
63
|
+
#triggerAt(text, start, value) {
|
|
60
64
|
const content = text.stringContent;
|
|
61
65
|
const { char } = this;
|
|
62
66
|
for (let at = Math.max(0, start - char.length + 1); at <= start; at++) {
|
|
@@ -69,10 +73,11 @@ export class TextTriggerController {
|
|
|
69
73
|
}
|
|
70
74
|
/** The caret moved: it stays after the trigger, in its text, and marks the query's end. */
|
|
71
75
|
reconcileSelection() {
|
|
72
|
-
if (!this
|
|
76
|
+
if (!this.#activeRange || this.picking)
|
|
73
77
|
return;
|
|
74
78
|
const range = this.range;
|
|
75
|
-
const { startText, yStart
|
|
79
|
+
const { startText, yStart } = this.edytor.selection.textRange();
|
|
80
|
+
const { isCollapsed } = this.edytor.selection.projection;
|
|
76
81
|
if (range &&
|
|
77
82
|
isCollapsed &&
|
|
78
83
|
startText === range.text &&
|
|
@@ -82,26 +87,17 @@ export class TextTriggerController {
|
|
|
82
87
|
else
|
|
83
88
|
this.close();
|
|
84
89
|
}
|
|
85
|
-
/** Move the keyboard's row (wrapping); `false` when there is nothing to move through. */
|
|
86
|
-
moveSelection(delta) {
|
|
87
|
-
// Nothing to move through: the arrows stay the caret's.
|
|
88
|
-
const count = this.isOpen ? this.count : 0;
|
|
89
|
-
if (!count)
|
|
90
|
-
return false;
|
|
91
|
-
this.selectedIndex = (this.selectedIndex + delta + count) % count;
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
94
90
|
close() {
|
|
95
91
|
this.isOpen = false;
|
|
96
92
|
this.query = '';
|
|
97
|
-
this.
|
|
98
|
-
this
|
|
93
|
+
this.index = 0;
|
|
94
|
+
this.#activeRange = null;
|
|
99
95
|
}
|
|
100
96
|
/** The range where its anchors resolve now: one text, the trigger before the query end. */
|
|
101
97
|
get range() {
|
|
102
98
|
const { selection } = this.edytor;
|
|
103
|
-
const trigger = this
|
|
104
|
-
const end = this
|
|
99
|
+
const trigger = this.#activeRange && selection.resolveTextAnchor(this.#activeRange.trigger);
|
|
100
|
+
const end = this.#activeRange && selection.resolveTextAnchor(this.#activeRange.end);
|
|
105
101
|
if (!trigger || !end || trigger.text !== end.text)
|
|
106
102
|
return null;
|
|
107
103
|
if (end.offset < trigger.offset + this.char.length)
|
|
@@ -129,25 +125,17 @@ export class TextTriggerController {
|
|
|
129
125
|
const { selection, dispatcher } = edytor;
|
|
130
126
|
const { text, triggerStart, queryEnd } = range;
|
|
131
127
|
const end = Math.min(queryEnd, text.length);
|
|
132
|
-
const
|
|
133
|
-
const
|
|
128
|
+
const ctx = contextOf(edytor, text, triggerStart, end, query);
|
|
129
|
+
const { block, from, to } = ctx;
|
|
134
130
|
this.close();
|
|
135
|
-
selection.
|
|
131
|
+
selection.selectText(text, triggerStart);
|
|
136
132
|
const held = selection.value;
|
|
137
|
-
const ctx = {
|
|
138
|
-
edytor,
|
|
139
|
-
block,
|
|
140
|
-
from,
|
|
141
|
-
to,
|
|
142
|
-
query,
|
|
143
|
-
caret: (offset) => void dispatcher.caret({ block, offset })
|
|
144
|
-
};
|
|
145
133
|
const removal = edytor.facade.prepare.deleteText(block.id, from, to - from);
|
|
146
134
|
const run = dispatcher.lead(removal, () => body(ctx));
|
|
147
135
|
const index = text.index;
|
|
148
136
|
// Nothing took the lead: the trigger goes on its own, unless the body declined.
|
|
149
137
|
if (!run.taken && run.out !== false && index !== -1)
|
|
150
|
-
block.
|
|
138
|
+
edytor.deleteText(block.id, from, to - from);
|
|
151
139
|
const kept = run.out === false || (run.taken && dispatcher.last?.status === 'refused');
|
|
152
140
|
const out = await run.out;
|
|
153
141
|
if (owns(text, held))
|
|
@@ -160,9 +148,9 @@ export class TextTriggerController {
|
|
|
160
148
|
}
|
|
161
149
|
setEnd(text, queryEnd) {
|
|
162
150
|
const end = this.edytor.selection.createTextAnchor(text, queryEnd, 'left');
|
|
163
|
-
if (this
|
|
164
|
-
this
|
|
165
|
-
this
|
|
151
|
+
if (this.#activeRange && end)
|
|
152
|
+
this.#activeRange.end = end;
|
|
153
|
+
this.#syncQueryFromText();
|
|
166
154
|
}
|
|
167
155
|
open(text, triggerStart, queryEnd) {
|
|
168
156
|
const { selection } = this.edytor;
|
|
@@ -170,13 +158,13 @@ export class TextTriggerController {
|
|
|
170
158
|
const end = selection.createTextAnchor(text, queryEnd, 'left');
|
|
171
159
|
if (!trigger || !end)
|
|
172
160
|
return;
|
|
173
|
-
this
|
|
161
|
+
this.#activeRange = { trigger, end };
|
|
174
162
|
this.isOpen = true;
|
|
175
163
|
this.query = '';
|
|
176
|
-
this.
|
|
177
|
-
this
|
|
164
|
+
this.index = 0;
|
|
165
|
+
this.#syncQueryFromText(true);
|
|
178
166
|
}
|
|
179
|
-
syncQueryFromText(opened = false) {
|
|
167
|
+
#syncQueryFromText(opened = false) {
|
|
180
168
|
const range = this.range;
|
|
181
169
|
if (!range)
|
|
182
170
|
return;
|
|
@@ -184,13 +172,13 @@ export class TextTriggerController {
|
|
|
184
172
|
const query = text.stringContent.slice(triggerStart + this.char.length, queryEnd);
|
|
185
173
|
// A new query highlights its first match again (Notion).
|
|
186
174
|
if (query !== this.query)
|
|
187
|
-
this.
|
|
175
|
+
this.index = 0;
|
|
188
176
|
const changed = opened || query !== this.query;
|
|
189
177
|
this.query = query;
|
|
190
178
|
if (changed)
|
|
191
179
|
this.queried(query);
|
|
192
180
|
else
|
|
193
|
-
this.
|
|
181
|
+
this.index = Math.max(0, Math.min(this.index, this.count - 1));
|
|
194
182
|
}
|
|
195
183
|
}
|
|
196
184
|
/** The label a row shows: a string itself, else its `label`, `title` or `name`. */
|
|
@@ -217,25 +205,13 @@ export class TriggerMenuController extends TextTriggerController {
|
|
|
217
205
|
this.trigger = trigger;
|
|
218
206
|
}
|
|
219
207
|
get count() {
|
|
220
|
-
return this.items.length;
|
|
208
|
+
return this.isOpen ? this.items.length : 0;
|
|
221
209
|
}
|
|
222
210
|
admits(block) {
|
|
223
211
|
if (this.trigger.enabled)
|
|
224
212
|
return this.trigger.enabled(block);
|
|
225
213
|
return !inCodeLines(this.edytor, block);
|
|
226
214
|
}
|
|
227
|
-
/** The menu's accessible name. */
|
|
228
|
-
get name() {
|
|
229
|
-
return this.trigger.name ?? this.edytor.labels.triggerMenu;
|
|
230
|
-
}
|
|
231
|
-
/** The text shown when no row matches. */
|
|
232
|
-
get empty() {
|
|
233
|
-
return this.trigger.empty ?? this.edytor.labels.noResults;
|
|
234
|
-
}
|
|
235
|
-
/** The text shown while a search is pending and no row is shown. */
|
|
236
|
-
get searching() {
|
|
237
|
-
return this.trigger.searching ?? this.edytor.labels.searching;
|
|
238
|
-
}
|
|
239
215
|
labelOf = (item) => (this.trigger.label ? this.trigger.label(item) : defaultLabel(item));
|
|
240
216
|
keyOf = (item) => {
|
|
241
217
|
if (this.trigger.key)
|
|
@@ -243,35 +219,14 @@ export class TriggerMenuController extends TextTriggerController {
|
|
|
243
219
|
const id = item?.id;
|
|
244
220
|
return typeof id === 'string' || typeof id === 'number' ? String(id) : this.labelOf(item);
|
|
245
221
|
};
|
|
246
|
-
/**
|
|
247
|
-
* The element id of the row at `index` (page-unique, whatever the rows'
|
|
248
|
-
* keys or labels), for `aria-activedescendant`.
|
|
249
|
-
*/
|
|
250
|
-
optionId = (index) => this.edytor.popups.idOf(`${this.owner}-option-${index}`);
|
|
251
|
-
/** The context `items` and `onPick` read, for the current range. */
|
|
252
|
-
context() {
|
|
253
|
-
const range = this.range;
|
|
254
|
-
if (!range)
|
|
255
|
-
return null;
|
|
256
|
-
const { text, triggerStart, queryEnd } = range;
|
|
257
|
-
const block = text.parent;
|
|
258
|
-
const { edytor, query } = this;
|
|
259
|
-
return {
|
|
260
|
-
edytor,
|
|
261
|
-
block,
|
|
262
|
-
from: text.segStart + triggerStart,
|
|
263
|
-
to: text.segStart + queryEnd,
|
|
264
|
-
query,
|
|
265
|
-
caret: (offset) => void edytor.dispatcher.caret({ block, offset })
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
222
|
queried(query) {
|
|
269
223
|
// A query that opens with whitespace is prose (`a @ b`): the menu closes.
|
|
270
224
|
if (/^\s/.test(query))
|
|
271
225
|
return this.close();
|
|
272
|
-
const
|
|
273
|
-
if (!
|
|
226
|
+
const range = this.range;
|
|
227
|
+
if (!range)
|
|
274
228
|
return;
|
|
229
|
+
const ctx = contextOf(this.edytor, range.text, range.triggerStart, range.queryEnd, query);
|
|
275
230
|
// A pick waiting on the previous query's search is dropped with it.
|
|
276
231
|
this.#pickOnAnswer = false;
|
|
277
232
|
const request = ++this.#request;
|
|
@@ -302,7 +257,7 @@ export class TriggerMenuController extends TextTriggerController {
|
|
|
302
257
|
this.items = Array.isArray(rows) ? rows : [];
|
|
303
258
|
if (!this.items.length && /\s$/.test(this.query))
|
|
304
259
|
return this.close();
|
|
305
|
-
this.
|
|
260
|
+
this.index = Math.max(0, Math.min(this.index, this.items.length - 1));
|
|
306
261
|
if (pick)
|
|
307
262
|
void this.pickSelected();
|
|
308
263
|
}
|
|
@@ -323,7 +278,7 @@ export class TriggerMenuController extends TextTriggerController {
|
|
|
323
278
|
this.#pickOnAnswer = true;
|
|
324
279
|
return Promise.resolve(undefined);
|
|
325
280
|
}
|
|
326
|
-
const item = this.items[this.
|
|
281
|
+
const item = this.items[this.index];
|
|
327
282
|
return item === undefined ? Promise.resolve(undefined) : this.pick(item);
|
|
328
283
|
}
|
|
329
284
|
/** Replace the trigger and its query with `item` (`onPick`). */
|
|
@@ -4,12 +4,3 @@ import type { Edytor } from '../../edytor.svelte.js';
|
|
|
4
4
|
* else the caret's text element, else the editor's box.
|
|
5
5
|
*/
|
|
6
6
|
export declare const caretRect: (edytor: Edytor) => DOMRect | undefined;
|
|
7
|
-
/**
|
|
8
|
-
* A menu's position below `rect` (above it when there is no room), kept in
|
|
9
|
-
* the viewport: measured now, written by the returned function (the
|
|
10
|
-
* overlay's read-then-write pass).
|
|
11
|
-
*/
|
|
12
|
-
export declare const placeBelow: (host: HTMLElement, rect: DOMRect, fallback: {
|
|
13
|
-
width: number;
|
|
14
|
-
height: number;
|
|
15
|
-
}) => (() => void) | void;
|
|
@@ -15,23 +15,7 @@ export const caretRect = (edytor) => {
|
|
|
15
15
|
rect = range.getBoundingClientRect();
|
|
16
16
|
}
|
|
17
17
|
if (!rect || (!rect.width && !rect.height)) {
|
|
18
|
-
rect = edytor.selection.
|
|
18
|
+
rect = edytor.selection.textRange().startText?.node?.getBoundingClientRect();
|
|
19
19
|
}
|
|
20
20
|
return rect ?? editor.getBoundingClientRect();
|
|
21
21
|
};
|
|
22
|
-
/**
|
|
23
|
-
* A menu's position below `rect` (above it when there is no room), kept in
|
|
24
|
-
* the viewport: measured now, written by the returned function (the
|
|
25
|
-
* overlay's read-then-write pass).
|
|
26
|
-
*/
|
|
27
|
-
export const placeBelow = (host, rect, fallback) => {
|
|
28
|
-
const view = host.ownerDocument.defaultView;
|
|
29
|
-
if (!view)
|
|
30
|
-
return;
|
|
31
|
-
const box = host.firstElementChild?.getBoundingClientRect();
|
|
32
|
-
const width = box?.width || fallback.width;
|
|
33
|
-
const height = box?.height || fallback.height;
|
|
34
|
-
const left = `${Math.max(8, Math.min(rect.left, view.innerWidth - width - 8))}px`;
|
|
35
|
-
const top = `${Math.max(8, rect.bottom + height + 8 < view.innerHeight ? rect.bottom + 8 : rect.top - height - 8)}px`;
|
|
36
|
-
return () => Object.assign(host.style, { left, top });
|
|
37
|
-
};
|
|
@@ -1,12 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* run in its `onBeforeOperation`
|
|
4
|
-
* `TriggerMenuController` fed by
|
|
5
|
-
* `onSelectionChange`, rendered in the overlay,
|
|
6
|
-
* `hotkeys` (before its own bindings of the same
|
|
7
|
-
*
|
|
2
|
+
* Input rules and triggers, wired into a plugin's own hooks
|
|
3
|
+
* (`withRulesAndTriggers`): the rules run in its `onBeforeOperation`
|
|
4
|
+
* (after its own hook), each trigger is a `TriggerMenuController` fed by
|
|
5
|
+
* its `onAfterOperation` and `onSelectionChange`, rendered in the overlay,
|
|
6
|
+
* and keyed through its `hotkeys` (before its own bindings of the same
|
|
7
|
+
* keys), as the slash menu is (`withTriggerMenus`). The precedence of both
|
|
8
|
+
* is the plugin's place in the list. A view without such a plugin ships
|
|
9
|
+
* none of it.
|
|
8
10
|
*/
|
|
9
11
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
10
|
-
import type { InitializedPlugin } from '../../plugins.js';
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
import type { InitializedPlugin, InputRule, Trigger } from '../../plugins.js';
|
|
13
|
+
import { type TextTriggerController } from './TriggerController.svelte.js';
|
|
14
|
+
import { type HeldList } from '../list.svelte.js';
|
|
15
|
+
/**
|
|
16
|
+
* `plugin` with `inputRules` (text typed at the caret that a rule
|
|
17
|
+
* replaces: markdown, `:smile:` → 😄) and `triggers` (characters that open
|
|
18
|
+
* a menu of rows at the caret: `@` mentions) run through its own hooks.
|
|
19
|
+
* A plugin declares them by returning this:
|
|
20
|
+
* `(edytor) => withRulesAndTriggers(edytor, { inlineBlocks }, { triggers: [mention] })`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const withRulesAndTriggers: (edytor: Edytor, plugin: InitializedPlugin, { inputRules, triggers }: {
|
|
23
|
+
inputRules?: InputRule[];
|
|
24
|
+
triggers?: Trigger[];
|
|
25
|
+
}) => InitializedPlugin;
|
|
26
|
+
/**
|
|
27
|
+
* `plugin` with trigger menus wired into its hooks (a plugin's `triggers`,
|
|
28
|
+
* the slash menu): each controller fed by its `onAfterOperation` (an
|
|
29
|
+
* `insertText`) and `onSelectionChange`, its menu mounted in the overlay by
|
|
30
|
+
* `mount` once the view is attached, and the open one keyed through its
|
|
31
|
+
* `hotkeys` (`listHotkeys`, before the plugin's own bindings of the same
|
|
32
|
+
* keys) as `held` drives it.
|
|
33
|
+
*/
|
|
34
|
+
export declare const withTriggerMenus: <C extends TextTriggerController>(edytor: Edytor, plugin: InitializedPlugin, controllers: C[], held: (controller: C) => HeldList, mount: (controller: C) => () => void) => InitializedPlugin;
|
|
@@ -1,22 +1,28 @@
|
|
|
1
1
|
import { inputRulesHook } from '../../session/inputRules.js';
|
|
2
2
|
import { TriggerMenuController } from './TriggerController.svelte.js';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
3
|
+
import { caretRect } from './place.js';
|
|
4
|
+
import { placeNear } from '../../surface/overlay.js';
|
|
5
|
+
import { listHotkeys } from '../list.svelte.js';
|
|
6
|
+
import { mountChrome } from '../chrome.js';
|
|
5
7
|
/** Two bindings of one chord, `first`'s claim ending the key. */
|
|
6
8
|
const both = (first, then) => (payload) => {
|
|
7
9
|
first(payload);
|
|
8
10
|
then?.(payload);
|
|
9
11
|
};
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
/** The triggers each view numbered so far: a trigger's popup owner name. */
|
|
13
|
+
const counts = new WeakMap();
|
|
14
|
+
/**
|
|
15
|
+
* `plugin` with `inputRules` (text typed at the caret that a rule
|
|
16
|
+
* replaces: markdown, `:smile:` → 😄) and `triggers` (characters that open
|
|
17
|
+
* a menu of rows at the caret: `@` mentions) run through its own hooks.
|
|
18
|
+
* A plugin declares them by returning this:
|
|
19
|
+
* `(edytor) => withRulesAndTriggers(edytor, { inlineBlocks }, { triggers: [mention] })`.
|
|
20
|
+
*/
|
|
21
|
+
export const withRulesAndTriggers = (edytor, plugin, { inputRules = [], triggers = [] }) => {
|
|
16
22
|
const extended = { ...plugin };
|
|
17
|
-
if (
|
|
23
|
+
if (inputRules.length) {
|
|
18
24
|
const own = plugin.onBeforeOperation;
|
|
19
|
-
const run = inputRulesHook(edytor,
|
|
25
|
+
const run = inputRulesHook(edytor, inputRules);
|
|
20
26
|
// Both run, whatever the plugin's hook answers (a prevent in it throws and
|
|
21
27
|
// ends the hook): the rules read the payload it replaced the command's with.
|
|
22
28
|
extended.onBeforeOperation = (change) => {
|
|
@@ -25,63 +31,77 @@ export const withRulesAndTriggers = (edytor, plugin, at) => {
|
|
|
25
31
|
return out;
|
|
26
32
|
};
|
|
27
33
|
}
|
|
28
|
-
|
|
34
|
+
// The records read with no view (`plugin(undefined)`) keep no menus.
|
|
35
|
+
if (!triggers.length || !edytor)
|
|
29
36
|
return extended;
|
|
30
|
-
const controllers = triggers.map((trigger
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
37
|
+
const controllers = triggers.map((trigger) => {
|
|
38
|
+
const n = counts.get(edytor) ?? 0;
|
|
39
|
+
counts.set(edytor, n + 1);
|
|
40
|
+
return new TriggerMenuController(edytor, trigger, `trigger-${n}`);
|
|
41
|
+
});
|
|
42
|
+
return withTriggerMenus(edytor, extended, controllers, (controller) => ({
|
|
43
|
+
move: controller.move,
|
|
44
|
+
// A pending search's Enter waits for its rows: never an older query's row.
|
|
45
|
+
pick: controller.items.length || controller.loading
|
|
46
|
+
? () => void controller.pickSelected()
|
|
47
|
+
: undefined,
|
|
48
|
+
close: () => controller.close()
|
|
49
|
+
}),
|
|
50
|
+
// Below the caret (above it when there is no room), kept in the viewport.
|
|
51
|
+
(controller) => mountChrome(edytor, controller.trigger.menu, controller, () => controller.isOpen, {
|
|
52
|
+
name: 'edytor-trigger-menu-host',
|
|
53
|
+
zIndex: 50,
|
|
54
|
+
measure: (host) => {
|
|
55
|
+
if (!controller.isOpen)
|
|
56
|
+
return;
|
|
57
|
+
const rect = caretRect(edytor);
|
|
58
|
+
return rect && placeNear(host, rect, [280, 240]);
|
|
51
59
|
}
|
|
52
|
-
};
|
|
60
|
+
}, () => controller.close()));
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* `plugin` with trigger menus wired into its hooks (a plugin's `triggers`,
|
|
64
|
+
* the slash menu): each controller fed by its `onAfterOperation` (an
|
|
65
|
+
* `insertText`) and `onSelectionChange`, its menu mounted in the overlay by
|
|
66
|
+
* `mount` once the view is attached, and the open one keyed through its
|
|
67
|
+
* `hotkeys` (`listHotkeys`, before the plugin's own bindings of the same
|
|
68
|
+
* keys) as `held` drives it.
|
|
69
|
+
*/
|
|
70
|
+
export const withTriggerMenus = (edytor, plugin, controllers, held, mount) => {
|
|
71
|
+
const keys = listHotkeys(() => {
|
|
72
|
+
const controller = controllers.find(({ isOpen }) => isOpen);
|
|
73
|
+
return controller && held(controller);
|
|
74
|
+
});
|
|
53
75
|
const hotkeys = { ...plugin.hotkeys };
|
|
54
76
|
for (const [chord, binding] of Object.entries(keys))
|
|
55
77
|
hotkeys[chord] = both(binding, plugin.hotkeys?.[chord]);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
controller.handleTextInsertion(change.text, change.block, change.payload);
|
|
63
|
-
edytor.overlay.invalidate();
|
|
64
|
-
};
|
|
65
|
-
extended.onSelectionChange = (selection) => {
|
|
66
|
-
plugin.onSelectionChange?.(selection);
|
|
67
|
-
for (const controller of controllers)
|
|
68
|
-
controller.reconcileSelection();
|
|
69
|
-
edytor.overlay.invalidate();
|
|
70
|
-
};
|
|
71
|
-
extended.onEdytorAttached = (payload) => {
|
|
72
|
-
const own = plugin.onEdytorAttached?.(payload);
|
|
73
|
-
// Below the caret (above it when there is no room), kept in the viewport.
|
|
74
|
-
const unmount = controllers.map((controller) => edytor.overlay.mount(TriggerMenu, { controller }, 'edytor-trigger-menu-host', 50, (host) => {
|
|
75
|
-
if (!controller.isOpen)
|
|
78
|
+
return {
|
|
79
|
+
...plugin,
|
|
80
|
+
hotkeys,
|
|
81
|
+
onAfterOperation: (change) => {
|
|
82
|
+
plugin.onAfterOperation?.(change);
|
|
83
|
+
if (change.operation !== 'insertText' || !change.text)
|
|
76
84
|
return;
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
const [, offset, value] = change.payload;
|
|
86
|
+
const { text } = change;
|
|
87
|
+
for (const controller of controllers)
|
|
88
|
+
controller.handleTextInsertion(text, change.block, offset - text.segStart, value);
|
|
89
|
+
edytor.overlay.invalidate();
|
|
90
|
+
},
|
|
91
|
+
onSelectionChange: (selection) => {
|
|
92
|
+
plugin.onSelectionChange?.(selection);
|
|
93
|
+
for (const controller of controllers)
|
|
94
|
+
controller.reconcileSelection();
|
|
95
|
+
edytor.overlay.invalidate();
|
|
96
|
+
},
|
|
97
|
+
onEdytorAttached: (payload) => {
|
|
98
|
+
const own = plugin.onEdytorAttached?.(payload);
|
|
99
|
+
const unmount = controllers.map(mount);
|
|
100
|
+
return () => {
|
|
101
|
+
own?.();
|
|
102
|
+
for (const off of unmount)
|
|
103
|
+
off();
|
|
104
|
+
};
|
|
105
|
+
}
|
|
85
106
|
};
|
|
86
|
-
return extended;
|
|
87
107
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Edytor } from '../edytor.svelte.js';
|
|
2
|
-
import type { PluginOperations } from '../plugins.js';
|
|
2
|
+
import type { Plugin, PluginOperations } from '../plugins.js';
|
|
3
3
|
/** What an `upload` may report while it runs. */
|
|
4
4
|
export type UploadReport = {
|
|
5
5
|
/** The share sent so far, `0` to `1`: the block shows it as a bar. */
|
|
@@ -27,14 +27,16 @@ export type FileUpload = {
|
|
|
27
27
|
readonly status: 'landed';
|
|
28
28
|
readonly data: Record<string, unknown>;
|
|
29
29
|
};
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
/**
|
|
31
|
+
* What files a kind takes (its record's `upload`, `BlockDefinition`): which,
|
|
32
|
+
* and the data an upload's answer writes. The view's uploader, if the
|
|
33
|
+
* uploads plugin is listed, sends them.
|
|
34
|
+
*/
|
|
35
|
+
export type KindUpload = {
|
|
33
36
|
/** Whether it takes `file`. */
|
|
34
37
|
accepts: (file: File) => boolean;
|
|
35
38
|
/** It takes any file no other kind takes (the file block): asked last. */
|
|
36
39
|
fallback?: boolean;
|
|
37
|
-
upload: Uploader;
|
|
38
40
|
/** The data the answered URL writes (`null`: no source this kind stores). */
|
|
39
41
|
data: (file: File, answer: string) => Record<string, unknown> | null;
|
|
40
42
|
/** Whether the block has a source already (a peer's, a link's): its upload then writes nothing. */
|
|
@@ -43,12 +45,14 @@ export type UploadKind = {
|
|
|
43
45
|
preview?: boolean;
|
|
44
46
|
};
|
|
45
47
|
/**
|
|
46
|
-
* The view's uploads
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* files
|
|
50
|
-
*
|
|
51
|
-
*
|
|
48
|
+
* The view's uploads (`media.files`), one per view, the uploads plugin's:
|
|
49
|
+
* its uploader (`upload`, an empty block's Upload too) and the uploads of
|
|
50
|
+
* pasted and dropped files, session state, never in the document. A kind
|
|
51
|
+
* takes files by its record's `upload`; a paste or a drop (a drop replays
|
|
52
|
+
* the paste hooks) of files the kinds take places one empty block per
|
|
53
|
+
* file, each of the kind that takes it (`fallback` last), in the
|
|
54
|
+
* clipboard's order, as one paste (one command, one undo step), and each
|
|
55
|
+
* block shows its upload (`of`).
|
|
52
56
|
* The data an upload answers fills the block outside the history
|
|
53
57
|
* (`dispatcher.outside`), so the paste stays the one step that undoes it.
|
|
54
58
|
* A failed upload, or an answer that is no source, leaves the block empty
|
|
@@ -61,17 +65,16 @@ export type UploadKind = {
|
|
|
61
65
|
export declare class FileUploads {
|
|
62
66
|
#private;
|
|
63
67
|
private edytor;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
/** The
|
|
68
|
-
|
|
68
|
+
/** The view's uploader. */
|
|
69
|
+
readonly upload: Uploader;
|
|
70
|
+
constructor(edytor: Edytor,
|
|
71
|
+
/** The view's uploader. */
|
|
72
|
+
upload: Uploader);
|
|
69
73
|
/** The upload of block `id` in this view (reactive), if any. */
|
|
70
74
|
of: (id: string) => FileUpload | undefined;
|
|
71
75
|
/**
|
|
72
|
-
* The paste hook
|
|
73
|
-
*
|
|
74
|
-
* them shows text (an office app puts a picture of copied text on the
|
|
76
|
+
* The paste hook: the files a kind takes, unless the HTML beside them
|
|
77
|
+
* shows text (an office app puts a picture of copied text on the
|
|
75
78
|
* clipboard).
|
|
76
79
|
*/
|
|
77
80
|
paste: NonNullable<PluginOperations['onPaste']>;
|
|
@@ -88,5 +91,20 @@ export declare class FileUploads {
|
|
|
88
91
|
/** Release every preview. */
|
|
89
92
|
destroy: () => void;
|
|
90
93
|
}
|
|
91
|
-
/** The view's
|
|
94
|
+
/** The view's uploads, when it lists the uploads plugin. */
|
|
92
95
|
export declare const fileUploads: (edytor: Edytor | undefined) => FileUploads | undefined;
|
|
96
|
+
export type UploadsOptions = {
|
|
97
|
+
/**
|
|
98
|
+
* Upload a file and answer its URL: an empty image or media block's
|
|
99
|
+
* Upload, and the pasted and dropped files a kind takes, each placed as a
|
|
100
|
+
* block of that kind at once (one undo step) and filled with the URL this
|
|
101
|
+
* answers (the block shows the progress it reports).
|
|
102
|
+
*/
|
|
103
|
+
upload: Uploader;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* File uploads (Notion's): the view's one uploader, for every kind whose
|
|
107
|
+
* record takes files (`upload`: the image, file, video and audio kinds).
|
|
108
|
+
* Without it, only links are embedded. The first listed claims the view.
|
|
109
|
+
*/
|
|
110
|
+
export declare const createUploadsPlugin: ({ upload }: UploadsOptions) => Plugin;
|