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
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { labelsOf, richTextEnglish } from '../../labels.js';
|
|
2
|
+
import { attach, keepSelection } from '../chrome.js';
|
|
3
|
+
import { calloutPickers, iconOf } from './callouts.js';
|
|
4
|
+
import { openBody } from './body.js';
|
|
5
|
+
/** Each view's control snippets (the first rich text plugin listed sets them). */
|
|
6
|
+
export const richTextControls = new WeakMap();
|
|
7
|
+
/** Check or uncheck a to-do: one key patched, so a peer's concurrent edit of another key is kept. */
|
|
8
|
+
export const toggleTodo = (block) => block.edytor.patchData(block.id, [{ path: ['checked'], value: !block.data.checked }]);
|
|
9
|
+
/**
|
|
10
|
+
* A to-do's checkbox in `view` (a suggestion's preview included: no
|
|
11
|
+
* handle, no write), named in its labels.
|
|
12
|
+
*/
|
|
13
|
+
export const todoCheckbox = (view, block) => {
|
|
14
|
+
const label = labelsOf(view, 'richText', richTextEnglish).checkbox;
|
|
15
|
+
const checked = () => Boolean(block().data.checked);
|
|
16
|
+
const toggle = () => {
|
|
17
|
+
const handle = block().handle;
|
|
18
|
+
if (handle)
|
|
19
|
+
toggleTodo(handle);
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
get block() {
|
|
23
|
+
return block().handle;
|
|
24
|
+
},
|
|
25
|
+
get checked() {
|
|
26
|
+
return checked();
|
|
27
|
+
},
|
|
28
|
+
label,
|
|
29
|
+
toggle,
|
|
30
|
+
get control() {
|
|
31
|
+
const on = checked();
|
|
32
|
+
return (node) => {
|
|
33
|
+
const native = node instanceof HTMLInputElement && node.type === 'checkbox';
|
|
34
|
+
// Another element than a native checkbox is one to assistive technology,
|
|
35
|
+
// unless the markup gave it its own role.
|
|
36
|
+
const role = native ? {} : { role: node.getAttribute('role') ?? 'checkbox' };
|
|
37
|
+
return attach({
|
|
38
|
+
contenteditable: 'false',
|
|
39
|
+
'aria-label': label,
|
|
40
|
+
'data-edytor-todo-checkbox': '',
|
|
41
|
+
...role,
|
|
42
|
+
'aria-checked': native ? undefined : on
|
|
43
|
+
}, {
|
|
44
|
+
mousedown: keepSelection,
|
|
45
|
+
click: () => {
|
|
46
|
+
// Never cancel the click: the browser reverts a canceled checkbox click
|
|
47
|
+
// after its handlers, over the re-render this write makes, so the box
|
|
48
|
+
// would show the old state here while peers show the new one. Toggle the
|
|
49
|
+
// document, then show what it holds (a refused write, readonly or vetoed,
|
|
50
|
+
// shows unchanged).
|
|
51
|
+
toggle();
|
|
52
|
+
if (native)
|
|
53
|
+
node.checked = checked();
|
|
54
|
+
}
|
|
55
|
+
})(node);
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* A callout's icon in `view` (`callout.icon`): its `data.icon`, the view's
|
|
62
|
+
* default without one, none when it is `''`; a button opening the view's
|
|
63
|
+
* picker where it may be picked (an editable view listing a picker, not a
|
|
64
|
+
* suggestion's preview), else the icon alone.
|
|
65
|
+
*/
|
|
66
|
+
export const calloutIcon = (view, block) => {
|
|
67
|
+
const labels = labelsOf(view, 'richText', richTextEnglish).calloutIcon;
|
|
68
|
+
const picker = calloutPickers.get(view);
|
|
69
|
+
const editable = () => Boolean(block().handle && picker && !view.readonly);
|
|
70
|
+
const icon = () => iconOf(block().data, view);
|
|
71
|
+
const expanded = () => picker?.target === block().id;
|
|
72
|
+
const toggle = () => {
|
|
73
|
+
const handle = block().handle;
|
|
74
|
+
if (handle && editable())
|
|
75
|
+
picker?.toggle(handle);
|
|
76
|
+
};
|
|
77
|
+
const label = () => (icon() ? labels.change : labels.add);
|
|
78
|
+
return {
|
|
79
|
+
get block() {
|
|
80
|
+
return block().handle;
|
|
81
|
+
},
|
|
82
|
+
get icon() {
|
|
83
|
+
return icon();
|
|
84
|
+
},
|
|
85
|
+
get editable() {
|
|
86
|
+
return editable();
|
|
87
|
+
},
|
|
88
|
+
get expanded() {
|
|
89
|
+
return expanded();
|
|
90
|
+
},
|
|
91
|
+
get label() {
|
|
92
|
+
return label();
|
|
93
|
+
},
|
|
94
|
+
toggle,
|
|
95
|
+
get control() {
|
|
96
|
+
const can = editable();
|
|
97
|
+
return attach({
|
|
98
|
+
contenteditable: 'false',
|
|
99
|
+
'data-edytor-callout-icon': '',
|
|
100
|
+
'data-empty': !icon(),
|
|
101
|
+
'aria-label': can ? label() : undefined,
|
|
102
|
+
'aria-haspopup': can ? 'menu' : undefined,
|
|
103
|
+
'aria-expanded': can ? expanded() : undefined,
|
|
104
|
+
'aria-controls': can && expanded() ? picker?.listId : undefined,
|
|
105
|
+
'aria-hidden': can ? undefined : 'true'
|
|
106
|
+
}, can ? { mousedown: keepSelection, click: toggle } : {});
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* The hint of `block`'s empty body in `view` (`body.hint`), or `null` where
|
|
112
|
+
* none shows: a readonly view, a suggestion's preview (no handle).
|
|
113
|
+
*/
|
|
114
|
+
export const emptyBody = (view, block, kind) => {
|
|
115
|
+
const handle = block.handle;
|
|
116
|
+
if (!handle || view.readonly)
|
|
117
|
+
return null;
|
|
118
|
+
const open = () => void openBody(handle);
|
|
119
|
+
return {
|
|
120
|
+
block: handle,
|
|
121
|
+
kind,
|
|
122
|
+
label: labelsOf(view, 'richText', richTextEnglish).emptyBody[kind],
|
|
123
|
+
open,
|
|
124
|
+
control: attach({ contenteditable: 'false', 'data-edytor-empty-body': kind, 'aria-hidden': 'true' }, { click: open })
|
|
125
|
+
};
|
|
126
|
+
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { isRecord } from '../../utils/json.js';
|
|
2
|
-
import {
|
|
3
|
-
import { holdsNothing, lineage, placing } from '../../kinds.js';
|
|
2
|
+
import { holdsNothing, placing } from '../../kinds.js';
|
|
4
3
|
import { id } from '../../utils.js';
|
|
5
4
|
import { marksForInsertion } from '../../session/editing/text.js';
|
|
6
5
|
import { selectedTextSpans, viewOf } from '../../selection/visibility.js';
|
|
@@ -121,20 +120,25 @@ export const openLink = (href, view = globalThis.window ?? null) => {
|
|
|
121
120
|
if (safe)
|
|
122
121
|
view?.open(safe, '_blank', 'noopener,noreferrer');
|
|
123
122
|
};
|
|
123
|
+
/** Set `mark` to `value` (`null`: remove it) over `start`–`end` of `text`: the view's `formatRange`. */
|
|
124
|
+
const markText = (edytor, text, start, end, mark, value) => edytor.formatRange(text.parent.id, text.segStart + start, end - start, {
|
|
125
|
+
[mark]: value === undefined ? true : value
|
|
126
|
+
});
|
|
124
127
|
const formatSelectedTextRange = (edytor, mark, value, toggle) => {
|
|
125
|
-
const { yStart, yEnd, startText, endText
|
|
128
|
+
const { yStart, yEnd, startText, endText } = edytor.selection.textRange();
|
|
129
|
+
const { isCollapsed, isReversed } = edytor.selection.projection;
|
|
126
130
|
if (isCollapsed || !startText || !endText)
|
|
127
131
|
return;
|
|
128
132
|
const spans = selectedTextSpans(edytor).filter(({ start, end }) => end > start);
|
|
129
133
|
// One decision for the whole range (Notion): a toggle removes the mark only
|
|
130
134
|
// when every selected character has it, else it marks all of them.
|
|
131
135
|
const on = spans.every(({ text, start, end }) => text.getMarksAtRange(start, end).every(({ marks }) => marks && mark in marks));
|
|
132
|
-
const next = toggle && on ? null : value;
|
|
136
|
+
const next = toggle && on ? null : value === undefined ? true : value;
|
|
133
137
|
// One command per span: a vetoed one keeps its marks (`dispatcher.each`).
|
|
134
|
-
edytor.dispatcher.each('format', spans, ({ text, start, end }) => text.
|
|
138
|
+
edytor.dispatcher.each('format', spans, ({ text, start, end }) => edytor.formatRange(text.parent.id, text.segStart + start, end - start, { [mark]: next }));
|
|
135
139
|
// Selected blocks stay selected (Notion; a divider's phantom text is no range).
|
|
136
140
|
if (!selectsBlocks(edytor))
|
|
137
|
-
edytor.selection.
|
|
141
|
+
edytor.selection.selectText(startText, yStart, endText, yEnd, isReversed);
|
|
138
142
|
};
|
|
139
143
|
/**
|
|
140
144
|
* A block selection: formatting keeps it, and it has no caret to stage a
|
|
@@ -154,11 +158,13 @@ export const richTextOperations = (edytor) => ({
|
|
|
154
158
|
* whole.
|
|
155
159
|
*/
|
|
156
160
|
insertDividerAtSelection: () => {
|
|
157
|
-
const {
|
|
158
|
-
|
|
161
|
+
const { startText, yStart } = edytor.selection.textRange();
|
|
162
|
+
const { isCollapsed } = edytor.selection.projection;
|
|
163
|
+
const block = startText?.parent;
|
|
164
|
+
if (!block?.convertible || !block.parent || !isCollapsed)
|
|
159
165
|
return null;
|
|
160
166
|
const { facade, dispatcher } = edytor;
|
|
161
|
-
const [self, parent] = [block.
|
|
167
|
+
const [self, parent] = [block.id, block.parent.isRoot ? null : block.parent.id];
|
|
162
168
|
const divider = { id: id('b'), type: 'divider', data: {}, content: [], children: [] };
|
|
163
169
|
const paragraph = { id: id('b'), type: edytor.defaultChild(block.parent) };
|
|
164
170
|
const slot = (after, specs) => facade.prepare.insertBlocks({ parent, index: block.index + after }, specs);
|
|
@@ -185,24 +191,25 @@ export const richTextOperations = (edytor) => ({
|
|
|
185
191
|
caret = next?.id ?? paragraph.id;
|
|
186
192
|
prepare = () => slot(1, next ? [divider] : [divider, paragraph]);
|
|
187
193
|
}
|
|
188
|
-
if (
|
|
194
|
+
if (dispatcher.plan('insertDivider', {}, prepare, block).status !== 'applied')
|
|
189
195
|
return null;
|
|
190
196
|
const text = caret ? edytor.idToBlock.get(caret)?.firstText : startText;
|
|
191
197
|
dispatcher.caret(text, caret ? 0 : yStart);
|
|
192
198
|
return block;
|
|
193
199
|
},
|
|
194
200
|
removeAllMarksAtRange: () => {
|
|
195
|
-
const { yStart, startText
|
|
201
|
+
const { yStart, startText } = edytor.selection.textRange();
|
|
202
|
+
const { isCollapsed } = edytor.selection.projection;
|
|
196
203
|
if (isCollapsed) {
|
|
197
204
|
if (startText && !selectsBlocks(edytor)) {
|
|
198
205
|
edytor.selection.stage({});
|
|
199
|
-
edytor.selection.
|
|
206
|
+
edytor.selection.selectText(startText, yStart);
|
|
200
207
|
}
|
|
201
208
|
return;
|
|
202
209
|
}
|
|
203
210
|
edytor.dispatcher.each('format', selectedTextSpans(edytor), ({ text, start, end }) => {
|
|
204
211
|
if (end > start)
|
|
205
|
-
text.
|
|
212
|
+
edytor.clearMarks(text.parent.id, text.segStart + start, end - start);
|
|
206
213
|
});
|
|
207
214
|
},
|
|
208
215
|
setLinkAtRange: (link) => {
|
|
@@ -225,15 +232,15 @@ export const richTextOperations = (edytor) => ({
|
|
|
225
232
|
const safe = sanitizeLinkHref(href);
|
|
226
233
|
if (safe === null || end <= start)
|
|
227
234
|
return;
|
|
228
|
-
edytor.dispatcher.run('autolink', () =>
|
|
235
|
+
edytor.dispatcher.run('autolink', () => markText(edytor, text, start, end, 'link', { href: safe }));
|
|
229
236
|
},
|
|
230
237
|
/** Unlink `start`–`end` of `text` (the link card's Remove), one undo step; the selection stays. */
|
|
231
238
|
unlinkText: (text, start, end) => {
|
|
232
|
-
edytor.dispatcher.run('format', () =>
|
|
239
|
+
edytor.dispatcher.run('format', () => markText(edytor, text, start, end, 'link', null));
|
|
233
240
|
},
|
|
234
241
|
/** Remove one mark (a color, a highlight…) from the selected range. */
|
|
235
242
|
removeMarkAtRange: (mark) => {
|
|
236
|
-
if (!edytor.selection.
|
|
243
|
+
if (!edytor.selection.projection.isCollapsed)
|
|
237
244
|
formatSelectedTextRange(edytor, mark, null, false);
|
|
238
245
|
},
|
|
239
246
|
/**
|
|
@@ -249,7 +256,8 @@ export const richTextOperations = (edytor) => ({
|
|
|
249
256
|
const safeValue = mark === 'color' || mark === 'highlight' ? sanitizeCssColorValue(value) : value;
|
|
250
257
|
if (safeValue === null)
|
|
251
258
|
return;
|
|
252
|
-
const {
|
|
259
|
+
const { startText, yStart } = edytor.selection.textRange();
|
|
260
|
+
const { isCollapsed } = edytor.selection.projection;
|
|
253
261
|
if (isCollapsed) {
|
|
254
262
|
if (startText && !selectsBlocks(edytor)) {
|
|
255
263
|
// Stage the full set the next insertion carries, values kept.
|
|
@@ -257,7 +265,7 @@ export const richTextOperations = (edytor) => ({
|
|
|
257
265
|
...marksForInsertion(startText, yStart, { pending: edytor.selection.pending }),
|
|
258
266
|
[mark]: safeValue
|
|
259
267
|
}));
|
|
260
|
-
edytor.selection.
|
|
268
|
+
edytor.selection.selectText(startText, yStart);
|
|
261
269
|
}
|
|
262
270
|
return;
|
|
263
271
|
}
|
|
@@ -269,17 +277,18 @@ export const richTextOperations = (edytor) => ({
|
|
|
269
277
|
* stage it for the next character typed.
|
|
270
278
|
*/
|
|
271
279
|
setMarkAtRange: (mark, value) => {
|
|
272
|
-
const { yStart, yEnd, startText, endText
|
|
273
|
-
|
|
280
|
+
const { yStart, yEnd, startText, endText } = edytor.selection.textRange();
|
|
281
|
+
const { selection } = edytor;
|
|
282
|
+
if (selection.projection.isCollapsed) {
|
|
274
283
|
if (startText && !selectsBlocks(edytor)) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
})
|
|
282
|
-
|
|
284
|
+
// A caret stages the full set the next insertion carries (values kept).
|
|
285
|
+
edytor.dispatcher.run('format', () => {
|
|
286
|
+
const { [mark]: current = null, ...rest } = marksForInsertion(startText, yStart, {
|
|
287
|
+
pending: selection.pending
|
|
288
|
+
});
|
|
289
|
+
selection.stage(current !== null ? rest : { ...rest, [mark]: value === undefined ? true : value });
|
|
290
|
+
});
|
|
291
|
+
selection.selectText(startText, yStart, endText, yEnd);
|
|
283
292
|
}
|
|
284
293
|
return;
|
|
285
294
|
}
|
|
@@ -1,18 +1,16 @@
|
|
|
1
|
+
import type { Attachment } from 'svelte/attachments';
|
|
1
2
|
import type { Block } from '../../block/block.svelte.js';
|
|
2
3
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
3
4
|
import type { EditorCommand } from '../../plugins.js';
|
|
4
|
-
import { type SlashMenuLabels } from '../../labels.js';
|
|
5
5
|
import type { BlockAddition } from '../blockHandles/BlockHandleController.svelte.js';
|
|
6
6
|
import { TextTriggerController } from '../triggers/TriggerController.svelte.js';
|
|
7
|
-
|
|
7
|
+
import type { Popup } from '../../surface/popups.svelte.js';
|
|
8
8
|
/**
|
|
9
9
|
* The slash menu: the `/` trigger (`TextTriggerController`: the range, the
|
|
10
10
|
* query, the keys, the pick), whose rows are the editor's commands, and the
|
|
11
11
|
* menu a handle's `+` opens with a search field of its own (`addition`).
|
|
12
12
|
*/
|
|
13
13
|
export declare class SlashMenuController extends TextTriggerController {
|
|
14
|
-
/** The words the menu shows (the plugin's `labels`): read them in a custom `menu` or `item`. */
|
|
15
|
-
readonly labels: SlashMenuLabels;
|
|
16
14
|
/**
|
|
17
15
|
* Opened by a handle's `+` (`BLOCK_ADD_EVENT`): no `/` in the text, the
|
|
18
16
|
* query is the menu's own field, and a picked row adds the block first.
|
|
@@ -20,13 +18,22 @@ export declare class SlashMenuController extends TextTriggerController {
|
|
|
20
18
|
addition: BlockAddition | null;
|
|
21
19
|
/** The selection when a `+` opened the menu, given back when it closes unpicked. */
|
|
22
20
|
private held;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
21
|
+
constructor(edytor: Edytor);
|
|
22
|
+
/** A `+`'s menu names its highlighted row from its own field, and tells the `+` it opened it. */
|
|
23
|
+
protected popupOf(active: string | undefined): Popup;
|
|
24
|
+
/**
|
|
25
|
+
* The element that holds a `+` menu's keyboard (`{@attach controller.keys}`:
|
|
26
|
+
* its field, or the menu element itself). Focused when
|
|
27
|
+
* it mounts, it takes the menu's keys (↑/↓ walk the rows, Enter runs the
|
|
28
|
+
* highlighted one, Escape closes the menu and gives the selection back);
|
|
29
|
+
* on an element that is not a field, typing and Backspace edit the query.
|
|
30
|
+
* A field takes the keys of the whole menu, names the list and its highlighted row (`aria-controls`,
|
|
31
|
+
* `aria-activedescendant`), and takes the focus back from any other part
|
|
32
|
+
* of the menu (a row a click or a screen reader focused, which becomes
|
|
33
|
+
* the highlighted one). Focus leaving the menu closes it. A `/` menu
|
|
34
|
+
* leaves the keys to the editor: there it does nothing.
|
|
35
|
+
*/
|
|
36
|
+
keys: Attachment<HTMLElement>;
|
|
30
37
|
protected get count(): number;
|
|
31
38
|
/** A `/` opens the menu in a block a kind can replace (`convertible`). */
|
|
32
39
|
protected admits(block: Block): boolean;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { untrack } from 'svelte';
|
|
2
|
+
import { noSelection, project } from '../../session/selection.js';
|
|
2
3
|
import { BASIC_BLOCKS, matchesQuery } from '../../kinds.js';
|
|
3
|
-
import { englishLabels } from '../../labels.js';
|
|
4
4
|
import { TextTriggerController } from '../triggers/TriggerController.svelte.js';
|
|
5
|
+
import { attribute, isField, keepFocus } from '../chrome.js';
|
|
6
|
+
import { holdKeys } from '../list.svelte.js';
|
|
7
|
+
import { all, listen } from '../../utils/listen.js';
|
|
8
|
+
import { takeKeys } from '../../events/onFocus.js';
|
|
5
9
|
/**
|
|
6
10
|
* The view a `+`'s menu asks `isEnabled` of: the editor, its selection a
|
|
7
11
|
* caret at the start of the block the `+` adds, below `block` (a stand-in
|
|
@@ -38,24 +42,15 @@ const additionView = (edytor, { block }) => {
|
|
|
38
42
|
}
|
|
39
43
|
});
|
|
40
44
|
const added = reused ? block : through(block, stand);
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
yEnd: 0,
|
|
45
|
-
isCollapsed: true,
|
|
46
|
-
isReversed: false,
|
|
47
|
-
isBlockSpanning: false,
|
|
48
|
-
isVoidEditableElement: false,
|
|
49
|
-
startText: text,
|
|
50
|
-
endText: text,
|
|
51
|
-
startBlock: added,
|
|
52
|
-
endBlock: added,
|
|
53
|
-
texts: text ? [text] : [],
|
|
54
|
-
blocks: [added]
|
|
55
|
-
};
|
|
45
|
+
// A caret at the added block's start (a stand-in text when it is not made yet).
|
|
46
|
+
const text = added.firstText ?? { parent: added };
|
|
47
|
+
const range = { startText: text, endText: text, yStart: 0, yEnd: 0, texts: [text] };
|
|
56
48
|
const selection = through(edytor.selection, {
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
textRange: () => range,
|
|
50
|
+
caret: { block: added, offset: 0 },
|
|
51
|
+
voidField: false,
|
|
52
|
+
value: noSelection,
|
|
53
|
+
projection: project(noSelection, edytor.facade),
|
|
59
54
|
selectedBlocks: new Set(),
|
|
60
55
|
selectedInlineBlock: new Set()
|
|
61
56
|
});
|
|
@@ -67,7 +62,6 @@ const additionView = (edytor, { block }) => {
|
|
|
67
62
|
* menu a handle's `+` opens with a search field of its own (`addition`).
|
|
68
63
|
*/
|
|
69
64
|
export class SlashMenuController extends TextTriggerController {
|
|
70
|
-
labels;
|
|
71
65
|
/**
|
|
72
66
|
* Opened by a handle's `+` (`BLOCK_ADD_EVENT`): no `/` in the text, the
|
|
73
67
|
* query is the menu's own field, and a picked row adds the block first.
|
|
@@ -75,18 +69,83 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
75
69
|
addition = $state(null);
|
|
76
70
|
/** The selection when a `+` opened the menu, given back when it closes unpicked. */
|
|
77
71
|
held = { kind: 'none' };
|
|
78
|
-
|
|
79
|
-
groupName = (group) => this.labels.groups[group] ?? group;
|
|
80
|
-
constructor(edytor,
|
|
81
|
-
/** The words the menu shows (the plugin's `labels`): read them in a custom `menu` or `item`. */
|
|
82
|
-
labels = englishLabels.slashMenu) {
|
|
72
|
+
constructor(edytor) {
|
|
83
73
|
super(edytor, '/', 'slash-menu');
|
|
84
|
-
this.labels = labels;
|
|
85
74
|
}
|
|
86
|
-
/** A
|
|
87
|
-
|
|
75
|
+
/** A `+`'s menu names its highlighted row from its own field, and tells the `+` it opened it. */
|
|
76
|
+
popupOf(active) {
|
|
77
|
+
const { addition } = this;
|
|
78
|
+
return addition
|
|
79
|
+
? {
|
|
80
|
+
id: this.listId,
|
|
81
|
+
haspopup: 'listbox',
|
|
82
|
+
opener: { block: addition.block.id, control: 'add' }
|
|
83
|
+
}
|
|
84
|
+
: { id: this.listId, haspopup: 'listbox', active };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The element that holds a `+` menu's keyboard (`{@attach controller.keys}`:
|
|
88
|
+
* its field, or the menu element itself). Focused when
|
|
89
|
+
* it mounts, it takes the menu's keys (↑/↓ walk the rows, Enter runs the
|
|
90
|
+
* highlighted one, Escape closes the menu and gives the selection back);
|
|
91
|
+
* on an element that is not a field, typing and Backspace edit the query.
|
|
92
|
+
* A field takes the keys of the whole menu, names the list and its highlighted row (`aria-controls`,
|
|
93
|
+
* `aria-activedescendant`), and takes the focus back from any other part
|
|
94
|
+
* of the menu (a row a click or a screen reader focused, which becomes
|
|
95
|
+
* the highlighted one). Focus leaving the menu closes it. A `/` menu
|
|
96
|
+
* leaves the keys to the editor: there it does nothing.
|
|
97
|
+
*/
|
|
98
|
+
keys = (node) => {
|
|
99
|
+
if (!untrack(() => this.addition))
|
|
100
|
+
return;
|
|
101
|
+
const menu = node.closest('[data-edytor-slash-menu-host]') ?? node;
|
|
102
|
+
const field = isField(node);
|
|
103
|
+
const keydown = (event) => {
|
|
104
|
+
// A key that ends an IME composition (Enter commits it, Escape cancels it) is the IME's.
|
|
105
|
+
if (event.defaultPrevented || event.isComposing || event.keyCode === 229)
|
|
106
|
+
return;
|
|
107
|
+
const { key, ctrlKey, metaKey } = event;
|
|
108
|
+
const move = { ArrowDown: 1, ArrowUp: -1 }[key];
|
|
109
|
+
const typed = !field && event.target === node;
|
|
110
|
+
if (typed && key === 'Backspace')
|
|
111
|
+
this.search(this.query.slice(0, -1));
|
|
112
|
+
else if (typed && key.length === 1 && !ctrlKey && !metaKey)
|
|
113
|
+
this.search(this.query + key);
|
|
114
|
+
else if (move)
|
|
115
|
+
this.move(move);
|
|
116
|
+
else if (key === 'Enter')
|
|
117
|
+
void this.runSelected();
|
|
118
|
+
else if (key === 'Escape')
|
|
119
|
+
this.dismiss();
|
|
120
|
+
else
|
|
121
|
+
return;
|
|
122
|
+
event.preventDefault();
|
|
123
|
+
};
|
|
124
|
+
const focusin = (event) => {
|
|
125
|
+
const target = event.target;
|
|
126
|
+
if (!field || target === node)
|
|
127
|
+
return;
|
|
128
|
+
const index = this.commands.findIndex((_, index) => target.closest?.(`[id="${this.rowId(index)}"]`) !== null);
|
|
129
|
+
if (index !== -1)
|
|
130
|
+
this.index = index;
|
|
131
|
+
node.focus({ preventScroll: true });
|
|
132
|
+
};
|
|
133
|
+
const focusout = (event) => {
|
|
134
|
+
const to = event.relatedTarget;
|
|
135
|
+
if (this.addition && to instanceof Node && !menu.contains(to))
|
|
136
|
+
this.dismiss(false);
|
|
137
|
+
};
|
|
138
|
+
const off2 = listen(menu, 'focusin', focusin);
|
|
139
|
+
const off3 = listen(menu, 'focusout', focusout);
|
|
140
|
+
const off4 = listen(menu, 'mousedown', keepFocus);
|
|
141
|
+
if (field)
|
|
142
|
+
attribute(node, 'aria-controls', this.listId);
|
|
143
|
+
// A field takes the keys of the whole menu (a row a screen reader focused); a wrapper, its own.
|
|
144
|
+
const off = holdKeys(node, keydown, () => (field && this.count ? this.rowId(this.index) : undefined), field ? menu : node);
|
|
145
|
+
return all(off, off2, off3, off4);
|
|
146
|
+
};
|
|
88
147
|
get count() {
|
|
89
|
-
return this.commands.length;
|
|
148
|
+
return this.isOpen ? this.commands.length : 0;
|
|
90
149
|
}
|
|
91
150
|
/** A `/` opens the menu in a block a kind can replace (`convertible`). */
|
|
92
151
|
admits(block) {
|
|
@@ -102,7 +161,7 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
102
161
|
if (query && (commandCount === 0 || /^\s/.test(query) || !/[^-\s]/.test(query)))
|
|
103
162
|
this.close();
|
|
104
163
|
else
|
|
105
|
-
this.
|
|
164
|
+
this.index = Math.max(0, Math.min(this.index, commandCount - 1));
|
|
106
165
|
}
|
|
107
166
|
/** Matching commands, grouped (groups in first-seen order): the menu's rows and keyboard order. */
|
|
108
167
|
get commands() {
|
|
@@ -141,7 +200,7 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
141
200
|
}
|
|
142
201
|
/** The `+`'s menu typed in its own field (a query that matches nothing shows "No results"). */
|
|
143
202
|
search(query) {
|
|
144
|
-
[this.query, this.
|
|
203
|
+
[this.query, this.index] = [query, 0];
|
|
145
204
|
}
|
|
146
205
|
/**
|
|
147
206
|
* Close without picking. A `+`'s menu gives the selection back as it was
|
|
@@ -158,11 +217,10 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
158
217
|
this.edytor.selection.select(held);
|
|
159
218
|
if (!focus || this.edytor.readonly)
|
|
160
219
|
return;
|
|
161
|
-
this.edytor
|
|
162
|
-
this.edytor.node?.focus({ preventScroll: true });
|
|
220
|
+
takeKeys(this.edytor);
|
|
163
221
|
}
|
|
164
222
|
runSelected() {
|
|
165
|
-
return this.run(this.commands[this.
|
|
223
|
+
return this.run(this.commands[this.index]);
|
|
166
224
|
}
|
|
167
225
|
async run(command) {
|
|
168
226
|
const { addition } = this;
|
|
@@ -182,7 +240,7 @@ export class SlashMenuController extends TextTriggerController {
|
|
|
182
240
|
// nothing synchronously runs after it. The caret goes back to where the
|
|
183
241
|
// `/` was while it is still in its text: commands that replace the
|
|
184
242
|
// block (Code, a divider) keep their own.
|
|
185
|
-
const ran = await this.replaceTrigger(() => this.edytor.runCommand(command.id), (text) => this.edytor.selection.
|
|
243
|
+
const ran = await this.replaceTrigger(() => this.edytor.runCommand(command.id), (text) => this.edytor.selection.textRange().startText === text);
|
|
186
244
|
return ran ?? false;
|
|
187
245
|
}
|
|
188
246
|
}
|
|
@@ -1,30 +1,17 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
|
-
import type {
|
|
2
|
+
import type { Plugin } from '../../plugins.js';
|
|
3
3
|
import { SlashMenuController } from './SlashMenuController.svelte.js';
|
|
4
|
-
import { type PartialLabels } from '../../labels.js';
|
|
5
|
-
/** One row, for an `item` snippet. */
|
|
6
|
-
export type SlashMenuItem = {
|
|
7
|
-
command: EditorCommand;
|
|
8
|
-
/** The row's element id: set it (`id={item.id}`) so the keyboard's owner names the highlighted row. */
|
|
9
|
-
id: string;
|
|
10
|
-
/** The keyboard's row. */
|
|
11
|
-
selected: boolean;
|
|
12
|
-
/** The built-in line icon as a CSS `mask-image` value, when the command has one. */
|
|
13
|
-
icon: string | undefined;
|
|
14
|
-
/** Run the command (removes the `/query` first). */
|
|
15
|
-
run: () => void;
|
|
16
|
-
/** Make this the keyboard's row (hover). */
|
|
17
|
-
select: () => void;
|
|
18
|
-
};
|
|
19
4
|
export type SlashMenuOptions = {
|
|
20
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* The menu's markup and its words; it renders while `controller.isOpen`
|
|
7
|
+
* (without it, nothing shows). Keys and placement stay the plugin's. Keep
|
|
8
|
+
* its ARIA with `{@attach controller.popup}` on the list (name it) and
|
|
9
|
+
* `{...controller.option(index)}` on each row; in a `+`'s menu (while
|
|
10
|
+
* `controller.addition`), `{@attach controller.keys}` on the element that
|
|
11
|
+
* holds the keyboard (your field, or the menu itself: typing then edits
|
|
12
|
+
* the query).
|
|
13
|
+
*/
|
|
21
14
|
menu?: Snippet<[SlashMenuController]>;
|
|
22
|
-
/** Replace each row of the default menu. */
|
|
23
|
-
item?: Snippet<[SlashMenuItem]>;
|
|
24
|
-
/** The words the menu shows (its field, headings, empty state), over the English ones. */
|
|
25
|
-
labels?: PartialLabels<'slashMenu'>;
|
|
26
15
|
};
|
|
27
|
-
/** The slash menu,
|
|
16
|
+
/** The slash menu, drawn by your `menu` snippet. */
|
|
28
17
|
export declare const createSlashMenuPlugin: (options?: SlashMenuOptions) => Plugin;
|
|
29
|
-
/** The Notion-style slash menu. */
|
|
30
|
-
export declare const slashMenuPlugin: Plugin;
|