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
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
import { inCodeLines } from '../../session/inputRules.js';
|
|
2
|
-
import {
|
|
2
|
+
import { ChromeList, inPage } from '../list.svelte.js';
|
|
3
3
|
/** A trigger opens at a text's start or after whitespace, never inside a word (`1/2`, `a@b`). */
|
|
4
4
|
const startsTrigger = (text, offset) => offset === 0 || /\s/.test(text.stringContent[offset - 1] ?? '');
|
|
5
|
-
|
|
6
|
-
|
|
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 {
|
|
7
18
|
char;
|
|
8
|
-
owner;
|
|
9
19
|
isOpen = $state(false);
|
|
10
20
|
query = $state('');
|
|
11
|
-
selectedIndex = $state(0);
|
|
12
21
|
/** The trigger's start and the query's end, held as anchors so peers' edits move them. */
|
|
13
|
-
activeRange = null;
|
|
22
|
+
#activeRange = null;
|
|
14
23
|
/** A pick is running: its own selection changes close nothing. */
|
|
15
24
|
picking = false;
|
|
16
25
|
constructor(edytor,
|
|
@@ -18,65 +27,30 @@ export class TextTriggerController {
|
|
|
18
27
|
char,
|
|
19
28
|
/** The popup's owner name (`edytor.popups`), unique per view. */
|
|
20
29
|
owner) {
|
|
21
|
-
this.
|
|
30
|
+
super(edytor, owner, 'listbox', (node) => this.isOpen && this.popupOf(inPage(node, this.rowId(this.index))));
|
|
22
31
|
this.char = char;
|
|
23
|
-
this.owner = owner;
|
|
24
32
|
}
|
|
25
33
|
/** The editor is readonly: the menu closes. */
|
|
26
34
|
get readonly() {
|
|
27
35
|
return this.edytor.readonly;
|
|
28
36
|
}
|
|
29
|
-
/** The listbox's element id (page-unique), for `aria-controls`. */
|
|
30
|
-
get listId() {
|
|
31
|
-
return this.edytor.popups.idOf(this.owner);
|
|
32
|
-
}
|
|
33
|
-
/** Publish the open menu to the view's root (`edytor.popups`), or withdraw it with `null`. */
|
|
34
|
-
publish = (popup) => this.edytor.popups.set(this.owner, popup);
|
|
35
|
-
/**
|
|
36
|
-
* The listbox (`{@attach controller.popup}`): it takes the menu's id, its
|
|
37
|
-
* `listbox` role and name unless it has its own, keeps the focus where it
|
|
38
|
-
* is on a press (the editor's caret, or the menu's field), and is
|
|
39
|
-
* published to the view's root (`edytor.popups`) while the menu is open,
|
|
40
|
-
* with its highlighted row (`option(index)`) once that row is in the page.
|
|
41
|
-
*/
|
|
42
|
-
popup = (node) => {
|
|
43
|
-
identify(node, this.listId, 'listbox', this.listName);
|
|
44
|
-
node.addEventListener('mousedown', keepFocus);
|
|
45
|
-
$effect(() => {
|
|
46
|
-
if (!this.isOpen)
|
|
47
|
-
return;
|
|
48
|
-
this.publish(this.popupOf(inPage(node, this.rowIdAt(this.selectedIndex))));
|
|
49
|
-
return () => this.publish(null);
|
|
50
|
-
});
|
|
51
|
-
return () => node.removeEventListener('mousedown', keepFocus);
|
|
52
|
-
};
|
|
53
|
-
/**
|
|
54
|
-
* The attributes of the row at `index`: spread them on its element
|
|
55
|
-
* (`{...controller.option(index)}`): its id (the one the menu's keyboard
|
|
56
|
-
* owner names), `role="option"`, `aria-selected` and `data-selected` for
|
|
57
|
-
* the keyboard's row, which scrolls into view.
|
|
58
|
-
*/
|
|
59
|
-
option = (index) => optionAttributes(this.rowIdAt(index) ?? this.edytor.popups.idOf(`${this.owner}-option-${index}`), 'option', index === this.selectedIndex);
|
|
60
37
|
/** The record `popup` publishes, `active` the highlighted row's id when it is in the page. */
|
|
61
38
|
popupOf(active) {
|
|
62
39
|
return { id: this.listId, haspopup: 'listbox', active };
|
|
63
40
|
}
|
|
64
41
|
/** After an `insertText`: the trigger opens, the query grows, or the menu closes. */
|
|
65
|
-
handleTextInsertion(text, block,
|
|
66
|
-
const { state } = this.edytor.selection;
|
|
67
|
-
const start = payload.start ?? state.yStart;
|
|
68
|
-
const end = payload.end ?? state.yEnd;
|
|
42
|
+
handleTextInsertion(text, block, start, value) {
|
|
69
43
|
if (this.edytor.readonly)
|
|
70
44
|
return this.close();
|
|
71
45
|
// A trigger typed alone, or committed by an IME with its query (`/h`).
|
|
72
|
-
const at =
|
|
46
|
+
const at = this.admits(block) ? this.#triggerAt(text, start, value) : -1;
|
|
73
47
|
if (at !== -1)
|
|
74
|
-
this.open(text, at, start +
|
|
48
|
+
this.open(text, at, start + value.length);
|
|
75
49
|
// Typing at the query's end extends it; typing anywhere else closes the menu.
|
|
76
|
-
else if (this
|
|
50
|
+
else if (this.#activeRange) {
|
|
77
51
|
const range = this.range;
|
|
78
52
|
if (text === range?.text && start === range.queryEnd)
|
|
79
|
-
this.setEnd(text, start +
|
|
53
|
+
this.setEnd(text, start + value.length);
|
|
80
54
|
else
|
|
81
55
|
this.close();
|
|
82
56
|
}
|
|
@@ -86,7 +60,7 @@ export class TextTriggerController {
|
|
|
86
60
|
* the trigger: its start, or -1. A trigger of several characters (`[[`)
|
|
87
61
|
* completes with its last one.
|
|
88
62
|
*/
|
|
89
|
-
triggerAt(text, start, value) {
|
|
63
|
+
#triggerAt(text, start, value) {
|
|
90
64
|
const content = text.stringContent;
|
|
91
65
|
const { char } = this;
|
|
92
66
|
for (let at = Math.max(0, start - char.length + 1); at <= start; at++) {
|
|
@@ -99,10 +73,11 @@ export class TextTriggerController {
|
|
|
99
73
|
}
|
|
100
74
|
/** The caret moved: it stays after the trigger, in its text, and marks the query's end. */
|
|
101
75
|
reconcileSelection() {
|
|
102
|
-
if (!this
|
|
76
|
+
if (!this.#activeRange || this.picking)
|
|
103
77
|
return;
|
|
104
78
|
const range = this.range;
|
|
105
|
-
const { startText, yStart
|
|
79
|
+
const { startText, yStart } = this.edytor.selection.textRange();
|
|
80
|
+
const { isCollapsed } = this.edytor.selection.projection;
|
|
106
81
|
if (range &&
|
|
107
82
|
isCollapsed &&
|
|
108
83
|
startText === range.text &&
|
|
@@ -112,26 +87,17 @@ export class TextTriggerController {
|
|
|
112
87
|
else
|
|
113
88
|
this.close();
|
|
114
89
|
}
|
|
115
|
-
/** Move the keyboard's row (wrapping); `false` when there is nothing to move through. */
|
|
116
|
-
moveSelection(delta) {
|
|
117
|
-
// Nothing to move through: the arrows stay the caret's.
|
|
118
|
-
const count = this.isOpen ? this.count : 0;
|
|
119
|
-
if (!count)
|
|
120
|
-
return false;
|
|
121
|
-
this.selectedIndex = (this.selectedIndex + delta + count) % count;
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
90
|
close() {
|
|
125
91
|
this.isOpen = false;
|
|
126
92
|
this.query = '';
|
|
127
|
-
this.
|
|
128
|
-
this
|
|
93
|
+
this.index = 0;
|
|
94
|
+
this.#activeRange = null;
|
|
129
95
|
}
|
|
130
96
|
/** The range where its anchors resolve now: one text, the trigger before the query end. */
|
|
131
97
|
get range() {
|
|
132
98
|
const { selection } = this.edytor;
|
|
133
|
-
const trigger = this
|
|
134
|
-
const end = this
|
|
99
|
+
const trigger = this.#activeRange && selection.resolveTextAnchor(this.#activeRange.trigger);
|
|
100
|
+
const end = this.#activeRange && selection.resolveTextAnchor(this.#activeRange.end);
|
|
135
101
|
if (!trigger || !end || trigger.text !== end.text)
|
|
136
102
|
return null;
|
|
137
103
|
if (end.offset < trigger.offset + this.char.length)
|
|
@@ -159,25 +125,17 @@ export class TextTriggerController {
|
|
|
159
125
|
const { selection, dispatcher } = edytor;
|
|
160
126
|
const { text, triggerStart, queryEnd } = range;
|
|
161
127
|
const end = Math.min(queryEnd, text.length);
|
|
162
|
-
const
|
|
163
|
-
const
|
|
128
|
+
const ctx = contextOf(edytor, text, triggerStart, end, query);
|
|
129
|
+
const { block, from, to } = ctx;
|
|
164
130
|
this.close();
|
|
165
|
-
selection.
|
|
131
|
+
selection.selectText(text, triggerStart);
|
|
166
132
|
const held = selection.value;
|
|
167
|
-
const ctx = {
|
|
168
|
-
edytor,
|
|
169
|
-
block,
|
|
170
|
-
from,
|
|
171
|
-
to,
|
|
172
|
-
query,
|
|
173
|
-
caret: (offset) => void dispatcher.caret({ block, offset })
|
|
174
|
-
};
|
|
175
133
|
const removal = edytor.facade.prepare.deleteText(block.id, from, to - from);
|
|
176
134
|
const run = dispatcher.lead(removal, () => body(ctx));
|
|
177
135
|
const index = text.index;
|
|
178
136
|
// Nothing took the lead: the trigger goes on its own, unless the body declined.
|
|
179
137
|
if (!run.taken && run.out !== false && index !== -1)
|
|
180
|
-
block.
|
|
138
|
+
edytor.deleteText(block.id, from, to - from);
|
|
181
139
|
const kept = run.out === false || (run.taken && dispatcher.last?.status === 'refused');
|
|
182
140
|
const out = await run.out;
|
|
183
141
|
if (owns(text, held))
|
|
@@ -190,9 +148,9 @@ export class TextTriggerController {
|
|
|
190
148
|
}
|
|
191
149
|
setEnd(text, queryEnd) {
|
|
192
150
|
const end = this.edytor.selection.createTextAnchor(text, queryEnd, 'left');
|
|
193
|
-
if (this
|
|
194
|
-
this
|
|
195
|
-
this
|
|
151
|
+
if (this.#activeRange && end)
|
|
152
|
+
this.#activeRange.end = end;
|
|
153
|
+
this.#syncQueryFromText();
|
|
196
154
|
}
|
|
197
155
|
open(text, triggerStart, queryEnd) {
|
|
198
156
|
const { selection } = this.edytor;
|
|
@@ -200,13 +158,13 @@ export class TextTriggerController {
|
|
|
200
158
|
const end = selection.createTextAnchor(text, queryEnd, 'left');
|
|
201
159
|
if (!trigger || !end)
|
|
202
160
|
return;
|
|
203
|
-
this
|
|
161
|
+
this.#activeRange = { trigger, end };
|
|
204
162
|
this.isOpen = true;
|
|
205
163
|
this.query = '';
|
|
206
|
-
this.
|
|
207
|
-
this
|
|
164
|
+
this.index = 0;
|
|
165
|
+
this.#syncQueryFromText(true);
|
|
208
166
|
}
|
|
209
|
-
syncQueryFromText(opened = false) {
|
|
167
|
+
#syncQueryFromText(opened = false) {
|
|
210
168
|
const range = this.range;
|
|
211
169
|
if (!range)
|
|
212
170
|
return;
|
|
@@ -214,13 +172,13 @@ export class TextTriggerController {
|
|
|
214
172
|
const query = text.stringContent.slice(triggerStart + this.char.length, queryEnd);
|
|
215
173
|
// A new query highlights its first match again (Notion).
|
|
216
174
|
if (query !== this.query)
|
|
217
|
-
this.
|
|
175
|
+
this.index = 0;
|
|
218
176
|
const changed = opened || query !== this.query;
|
|
219
177
|
this.query = query;
|
|
220
178
|
if (changed)
|
|
221
179
|
this.queried(query);
|
|
222
180
|
else
|
|
223
|
-
this.
|
|
181
|
+
this.index = Math.max(0, Math.min(this.index, this.count - 1));
|
|
224
182
|
}
|
|
225
183
|
}
|
|
226
184
|
/** The label a row shows: a string itself, else its `label`, `title` or `name`. */
|
|
@@ -247,31 +205,13 @@ export class TriggerMenuController extends TextTriggerController {
|
|
|
247
205
|
this.trigger = trigger;
|
|
248
206
|
}
|
|
249
207
|
get count() {
|
|
250
|
-
return this.items.length;
|
|
208
|
+
return this.isOpen ? this.items.length : 0;
|
|
251
209
|
}
|
|
252
210
|
admits(block) {
|
|
253
211
|
if (this.trigger.enabled)
|
|
254
212
|
return this.trigger.enabled(block);
|
|
255
213
|
return !inCodeLines(this.edytor, block);
|
|
256
214
|
}
|
|
257
|
-
/** The menu's accessible name. */
|
|
258
|
-
get name() {
|
|
259
|
-
return this.trigger.name ?? this.edytor.labels.triggerMenu;
|
|
260
|
-
}
|
|
261
|
-
get listName() {
|
|
262
|
-
return this.name;
|
|
263
|
-
}
|
|
264
|
-
rowIdAt(index) {
|
|
265
|
-
return this.items[index] === undefined ? undefined : this.optionId(index);
|
|
266
|
-
}
|
|
267
|
-
/** The text shown when no row matches. */
|
|
268
|
-
get empty() {
|
|
269
|
-
return this.trigger.empty ?? this.edytor.labels.noResults;
|
|
270
|
-
}
|
|
271
|
-
/** The text shown while a search is pending and no row is shown. */
|
|
272
|
-
get searching() {
|
|
273
|
-
return this.trigger.searching ?? this.edytor.labels.searching;
|
|
274
|
-
}
|
|
275
215
|
labelOf = (item) => (this.trigger.label ? this.trigger.label(item) : defaultLabel(item));
|
|
276
216
|
keyOf = (item) => {
|
|
277
217
|
if (this.trigger.key)
|
|
@@ -279,35 +219,14 @@ export class TriggerMenuController extends TextTriggerController {
|
|
|
279
219
|
const id = item?.id;
|
|
280
220
|
return typeof id === 'string' || typeof id === 'number' ? String(id) : this.labelOf(item);
|
|
281
221
|
};
|
|
282
|
-
/**
|
|
283
|
-
* The element id of the row at `index` (page-unique, whatever the rows'
|
|
284
|
-
* keys or labels), for `aria-activedescendant`.
|
|
285
|
-
*/
|
|
286
|
-
optionId = (index) => this.edytor.popups.idOf(`${this.owner}-option-${index}`);
|
|
287
|
-
/** The context `items` and `onPick` read, for the current range. */
|
|
288
|
-
context() {
|
|
289
|
-
const range = this.range;
|
|
290
|
-
if (!range)
|
|
291
|
-
return null;
|
|
292
|
-
const { text, triggerStart, queryEnd } = range;
|
|
293
|
-
const block = text.parent;
|
|
294
|
-
const { edytor, query } = this;
|
|
295
|
-
return {
|
|
296
|
-
edytor,
|
|
297
|
-
block,
|
|
298
|
-
from: text.segStart + triggerStart,
|
|
299
|
-
to: text.segStart + queryEnd,
|
|
300
|
-
query,
|
|
301
|
-
caret: (offset) => void edytor.dispatcher.caret({ block, offset })
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
222
|
queried(query) {
|
|
305
223
|
// A query that opens with whitespace is prose (`a @ b`): the menu closes.
|
|
306
224
|
if (/^\s/.test(query))
|
|
307
225
|
return this.close();
|
|
308
|
-
const
|
|
309
|
-
if (!
|
|
226
|
+
const range = this.range;
|
|
227
|
+
if (!range)
|
|
310
228
|
return;
|
|
229
|
+
const ctx = contextOf(this.edytor, range.text, range.triggerStart, range.queryEnd, query);
|
|
311
230
|
// A pick waiting on the previous query's search is dropped with it.
|
|
312
231
|
this.#pickOnAnswer = false;
|
|
313
232
|
const request = ++this.#request;
|
|
@@ -338,7 +257,7 @@ export class TriggerMenuController extends TextTriggerController {
|
|
|
338
257
|
this.items = Array.isArray(rows) ? rows : [];
|
|
339
258
|
if (!this.items.length && /\s$/.test(this.query))
|
|
340
259
|
return this.close();
|
|
341
|
-
this.
|
|
260
|
+
this.index = Math.max(0, Math.min(this.index, this.items.length - 1));
|
|
342
261
|
if (pick)
|
|
343
262
|
void this.pickSelected();
|
|
344
263
|
}
|
|
@@ -359,7 +278,7 @@ export class TriggerMenuController extends TextTriggerController {
|
|
|
359
278
|
this.#pickOnAnswer = true;
|
|
360
279
|
return Promise.resolve(undefined);
|
|
361
280
|
}
|
|
362
|
-
const item = this.items[this.
|
|
281
|
+
const item = this.items[this.index];
|
|
363
282
|
return item === undefined ? Promise.resolve(undefined) : this.pick(item);
|
|
364
283
|
}
|
|
365
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
|
};
|