edytor 1.0.0-rc.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +47 -141
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.d.ts +6 -1
- package/dist/clipboard/htmlFlow.js +26 -13
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +22 -17
- package/dist/cloudflare/DocumentRoom.js +10 -5
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +20 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +9 -30
- package/dist/cloudflare/room/storage.js +52 -104
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +160 -119
- package/dist/components/Block.svelte.d.ts +8 -3
- package/dist/components/Content.svelte +91 -44
- package/dist/components/CustomMark.svelte +46 -0
- package/dist/components/CustomMark.svelte.d.ts +11 -0
- package/dist/components/Edytor.svelte +80 -95
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/InlineBlock.svelte +4 -9
- package/dist/components/Mark.svelte +46 -35
- package/dist/components/Mark.svelte.d.ts +7 -0
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +48 -14
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +8 -13
- package/dist/crdt/data.js +30 -70
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/{plugins/blockHandles → dnd}/autoScroll.d.ts +2 -1
- package/dist/{plugins/blockHandles → dnd}/autoScroll.js +3 -3
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +34 -64
- package/dist/edytor.svelte.js +118 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -184
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +33 -72
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +92 -72
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -13
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +91 -314
- package/dist/labels.js +180 -396
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -151
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +63 -97
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +247 -268
- package/dist/plugins/blockHandles/BlockHandles.svelte +46 -29
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +29 -23
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -162
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +20 -17
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +46 -1
- package/dist/plugins/blockHandles/geometry.js +51 -4
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +59 -28
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +180 -105
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +79 -0
- package/dist/plugins/chrome.js +87 -0
- package/dist/plugins/code/CodeHeader.svelte +12 -58
- package/dist/plugins/code/CodeHeader.svelte.d.ts +1 -0
- package/dist/plugins/code/CodePlugin.svelte +75 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +25 -0
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +9 -0
- package/dist/plugins/code/code.css +5 -100
- package/dist/plugins/code/header.svelte.d.ts +47 -0
- package/dist/plugins/code/header.svelte.js +141 -0
- package/dist/plugins/code/languageMenu.svelte.d.ts +84 -0
- package/dist/plugins/code/languageMenu.svelte.js +199 -0
- package/dist/plugins/code/languages.d.ts +21 -10
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -430
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +6 -7
- package/dist/plugins/comments/commentsPlugin.d.ts +31 -10
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +18 -129
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +2 -1
- package/dist/plugins/equation/EquationPlugin.svelte +123 -168
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +5 -3
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +74 -36
- package/dist/plugins/equation/equation.svelte.js +74 -66
- package/dist/plugins/equation/importUrl.d.ts +6 -0
- package/dist/plugins/equation/importUrl.js +6 -0
- package/dist/plugins/equation/katex.d.ts +8 -0
- package/dist/plugins/equation/katex.js +77 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +5 -151
- package/dist/plugins/image/ImagePlugin.svelte +49 -117
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -24
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -57
- package/dist/plugins/image/controls.svelte.js +51 -174
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +39 -24
- package/dist/plugins/index.js +30 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +15 -0
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +9 -0
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +46 -0
- package/dist/plugins/marquee/MarqueeController.svelte.js +243 -0
- package/dist/plugins/marquee/marquee.d.ts +33 -0
- package/dist/plugins/marquee/marquee.js +89 -0
- package/dist/plugins/marquee/marqueePlugin.d.ts +32 -0
- package/dist/plugins/marquee/marqueePlugin.js +68 -0
- package/dist/plugins/media/AudioPlugin.svelte +3 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +124 -112
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +20 -7
- package/dist/plugins/media/EmbedPlugin.svelte +93 -77
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +21 -9
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +35 -111
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +55 -112
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +69 -0
- package/dist/plugins/media/empty.svelte.js +111 -0
- package/dist/plugins/media/media.d.ts +93 -30
- package/dist/plugins/media/media.js +79 -86
- package/dist/plugins/media/urlPaste.svelte.d.ts +9 -32
- package/dist/plugins/media/urlPaste.svelte.js +46 -75
- package/dist/plugins/mention/MentionPlugin.svelte +47 -124
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +11 -23
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +52 -108
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +11 -23
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +25 -0
- package/dist/plugins/richtext/CalloutIcon.svelte.d.ts +9 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +25 -0
- package/dist/plugins/richtext/EmptyBody.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +272 -148
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +37 -18
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.d.ts +9 -0
- package/dist/plugins/richtext/body.js +16 -0
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +97 -0
- package/dist/plugins/richtext/calloutIcons.svelte.js +214 -0
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +18 -11
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +93 -35
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +11 -24
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +32 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -16
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +96 -127
- package/dist/plugins/table/TableChrome.svelte.d.ts +5 -1
- package/dist/plugins/table/TablePlugin.svelte +116 -171
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +110 -117
- package/dist/plugins/table/chrome.svelte.js +643 -289
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +55 -134
- package/dist/plugins/table/table.d.ts +26 -7
- package/dist/plugins/table/table.js +23 -49
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +29 -66
- package/dist/plugins/toolbar/ToolbarController.svelte.js +151 -76
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +14 -13
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +6 -45
- package/dist/plugins/triggers/TriggerController.svelte.js +51 -96
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +167 -60
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +12 -10
- package/dist/selection/pointer.svelte.js +154 -71
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +263 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +11 -8
- package/dist/selection/visibility.js +23 -8
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +33 -39
- package/dist/session/attempt.js +61 -53
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +18 -3
- package/dist/session/navigation.js +194 -153
- package/dist/session/ports.d.ts +7 -0
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +8 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +64 -47
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +32 -0
- package/dist/surface/lines.js +43 -0
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +73 -77
- package/dist/surface/overlay.d.ts +48 -6
- package/dist/surface/overlay.js +133 -23
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +315 -126
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -525
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -43
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -447
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -116
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -12
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -83
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -7
- package/dist/plugins/richtext/labels.d.ts +0 -5
- package/dist/plugins/richtext/labels.js +0 -3
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -360
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/toolbar/LinkCard.svelte +0 -118
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -7
- package/dist/plugins/toolbar/Toolbar.svelte +0 -400
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -144
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import { blockSelection } from '../../session/selection.js';
|
|
1
2
|
import { convertBlocks, convertedBlocks, convertibleKinds, convertToKind, matchesQuery, rowOf, turnCommands } from '../../kinds.js';
|
|
2
3
|
import { deleteSelectedBlocks, getSelectedBlocksInDocumentOrder, liftLayouts, outermost, shownText } from '../../selection/replaceSelection.js';
|
|
3
4
|
import { selectedMembers } from '../../selection/visibility.js';
|
|
4
|
-
import {
|
|
5
|
+
import { blockMenuEnglish, labelsOf } from '../../labels.js';
|
|
5
6
|
import { BLOCK_COLORS, colorable, setBlockColor } from '../../block/colors.js';
|
|
7
|
+
import { attribute, identify, keepFocus } from '../chrome.js';
|
|
8
|
+
import { holdKeys, listPopup, optionAttachment, stepRow } from '../list.svelte.js';
|
|
9
|
+
import { listen } from '../../utils/listen.js';
|
|
10
|
+
import { takeKeys } from '../../events/onFocus.js';
|
|
6
11
|
/** The Color flyout's rows in `labels`: the text colours, then the backgrounds, each from the default. */
|
|
7
12
|
const colorRows = (labels) => ['color', 'background'].flatMap((field) => [null, ...BLOCK_COLORS].map((value) => {
|
|
8
13
|
const name = labels.colors[value ?? 'default'] ?? value ?? 'default';
|
|
@@ -26,18 +31,18 @@ export const colorQueryRow = (row) => ({
|
|
|
26
31
|
* listed once a query names them (`searchOnly`): each paints the caret's
|
|
27
32
|
* block, as the block menu's Color does (`setBlockColor`).
|
|
28
33
|
*/
|
|
29
|
-
export const colorCommands = (edytor
|
|
34
|
+
export const colorCommands = (edytor) => colorRows(labelsOf(edytor, 'blockMenu', blockMenuEnglish)).map((row) => ({
|
|
30
35
|
id: row.id,
|
|
31
36
|
...colorQueryRow(row),
|
|
32
37
|
icon: 'A',
|
|
33
38
|
group: 'Color',
|
|
34
39
|
searchOnly: true,
|
|
35
40
|
isEnabled: (view = edytor) => {
|
|
36
|
-
const block = view.selection.
|
|
41
|
+
const block = view.selection.textRange().startText?.parent;
|
|
37
42
|
return Boolean(block && colorable(block));
|
|
38
43
|
},
|
|
39
44
|
run: () => {
|
|
40
|
-
const block = edytor.selection.
|
|
45
|
+
const block = edytor.selection.textRange().startText?.parent;
|
|
41
46
|
if (!block || !colorable(block))
|
|
42
47
|
return false;
|
|
43
48
|
if (setBlockColor(edytor, [block], row.field, row.value))
|
|
@@ -60,20 +65,25 @@ export class BlockMenuController {
|
|
|
60
65
|
blocks = $state([]);
|
|
61
66
|
anchor = null;
|
|
62
67
|
query = $state('');
|
|
63
|
-
|
|
68
|
+
/** The keyboard's row. */
|
|
69
|
+
index = $state(0);
|
|
64
70
|
/** The open flyout: the kinds (`turn`), the colours (`color`), or none. */
|
|
65
71
|
flyout = $state(false);
|
|
66
72
|
/** The keyboard's row in the open flyout. */
|
|
67
73
|
flyoutIndex = $state(0);
|
|
68
|
-
/** The words the
|
|
69
|
-
labels;
|
|
70
|
-
/** The Color flyout's rows, in
|
|
74
|
+
/** The actions' words: the view's `blockMenu` labels. */
|
|
75
|
+
#labels;
|
|
76
|
+
/** The Color flyout's rows, in those words. */
|
|
71
77
|
#colors;
|
|
72
78
|
constructor(edytor, options = {}) {
|
|
73
79
|
this.edytor = edytor;
|
|
74
80
|
this.options = options;
|
|
75
|
-
this
|
|
76
|
-
this.#colors = colorRows(this
|
|
81
|
+
this.#labels = labelsOf(edytor, 'blockMenu', blockMenuEnglish);
|
|
82
|
+
this.#colors = colorRows(this.#labels);
|
|
83
|
+
this.popup = listPopup(edytor, 'block-menu', 'menu', () => {
|
|
84
|
+
const { block } = this;
|
|
85
|
+
return block && { opener: { block: block.id, control: 'grip' } };
|
|
86
|
+
});
|
|
77
87
|
}
|
|
78
88
|
get isOpen() {
|
|
79
89
|
return this.block !== null;
|
|
@@ -91,8 +101,106 @@ export class BlockMenuController {
|
|
|
91
101
|
}
|
|
92
102
|
/** A row's element id (page-unique; a flyout's with `flyout`), for `aria-activedescendant`. */
|
|
93
103
|
rowId = (row, flyout = false) => this.edytor.popups.idOf(`block-menu-${flyout ? 'flyout-' : ''}${'field' in row ? 'color-' : 'value' in row ? 'kind-' : ''}${row.id}`);
|
|
94
|
-
/**
|
|
95
|
-
|
|
104
|
+
/**
|
|
105
|
+
* The menu element (`{@attach controller.popup}`, the one with the rows):
|
|
106
|
+
* it takes the menu's id, its `menu` role and name unless it has its
|
|
107
|
+
* own, keeps the focus where it is on a press (a field takes its own),
|
|
108
|
+
* and is published to the view's root (`edytor.popups`) while it is in
|
|
109
|
+
* the page, the grip that opened it told so.
|
|
110
|
+
*/
|
|
111
|
+
popup;
|
|
112
|
+
/**
|
|
113
|
+
* An open flyout (`{@attach controller.flyoutMenu}`, named by your
|
|
114
|
+
* markup): its id, `menu` role, the overlay's placement beside the menu,
|
|
115
|
+
* and presses that keep the focus.
|
|
116
|
+
*/
|
|
117
|
+
flyoutMenu = (node) => {
|
|
118
|
+
identify(node, this.flyoutId, 'menu');
|
|
119
|
+
node.setAttribute('data-edytor-block-menu-flyout', '');
|
|
120
|
+
return listen(node, 'mousedown', keepFocus);
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* The element that holds the keyboard (`{@attach controller.keys}`: the
|
|
124
|
+
* search field): focused when it mounts, it takes every key of the menu
|
|
125
|
+
* (the arrows, Home and End walk the rows, → opens a row's flyout and ←
|
|
126
|
+
* closes it, Enter runs the row, Delete removes the blocks while the
|
|
127
|
+
* query is empty, Escape closes the flyout, then the menu), and names
|
|
128
|
+
* the open menu and its highlighted row (`aria-controls`,
|
|
129
|
+
* `aria-activedescendant`, once that row is in the page).
|
|
130
|
+
*/
|
|
131
|
+
keys = (node) => {
|
|
132
|
+
$effect(() => attribute(node, 'aria-controls', this.flyout ? this.flyoutId : this.menuId));
|
|
133
|
+
return holdKeys(node, this.#keydown, () => {
|
|
134
|
+
const flyout = Boolean(this.flyout);
|
|
135
|
+
const row = flyout ? this.flyoutRows[this.flyoutIndex] : this.rows[this.index];
|
|
136
|
+
return row && this.rowId(row, flyout);
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* The attachment of the row at `index` (of the open flyout's rows with
|
|
141
|
+
* `flyout`): `{@attach controller.option(index)}` on its element.
|
|
142
|
+
* Its id, its role (`menuitem`, a switch's `menuitemcheckbox`, a colour's
|
|
143
|
+
* `menuitemradio` with its ✓ as `aria-checked`, a flyout's opener with
|
|
144
|
+
* `aria-haspopup` and `aria-expanded`); the keyboard's row scrolls into
|
|
145
|
+
* view. Its look is the markup's (`index`, `flyoutIndex`).
|
|
146
|
+
*/
|
|
147
|
+
option = (index, flyout = false) => {
|
|
148
|
+
const row = (flyout ? this.flyoutRows : this.rows)[index];
|
|
149
|
+
// Only an action has `checked` and `submenu`, only a colour `field`.
|
|
150
|
+
const { checked, submenu } = (row ?? {});
|
|
151
|
+
const color = row && 'field' in row;
|
|
152
|
+
const on = color ? this.isCurrentColor(row) : checked;
|
|
153
|
+
return optionAttachment(row
|
|
154
|
+
? this.rowId(row, flyout)
|
|
155
|
+
: this.edytor.popups.idOf(`block-menu-${flyout ? 'flyout-' : ''}${index}`), color ? 'menuitemradio' : on === undefined ? 'menuitem' : 'menuitemcheckbox', (flyout ? this.flyoutIndex : this.index) === index, {
|
|
156
|
+
...(on === undefined ? {} : { 'aria-checked': on }),
|
|
157
|
+
...(submenu
|
|
158
|
+
? { 'aria-haspopup': 'menu', 'aria-expanded': this.flyout === submenu }
|
|
159
|
+
: {})
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
/** The search field typed in: the rows match `query`, the first one highlighted, no flyout open. */
|
|
163
|
+
search(query) {
|
|
164
|
+
this.query = query;
|
|
165
|
+
this.index = 0;
|
|
166
|
+
this.flyout = false;
|
|
167
|
+
}
|
|
168
|
+
/** The menu's keys, on the element that holds the keyboard (`keys`). */
|
|
169
|
+
#keydown = (event) => {
|
|
170
|
+
if (event.defaultPrevented || event.isComposing)
|
|
171
|
+
return;
|
|
172
|
+
const { key } = event;
|
|
173
|
+
const { flyout, rows } = this;
|
|
174
|
+
const row = rows[this.index];
|
|
175
|
+
const submenu = row && 'submenu' in row ? row.submenu : undefined;
|
|
176
|
+
const to = stepRow(key, this.index, rows.length, { ends: true });
|
|
177
|
+
if (key === 'Escape') {
|
|
178
|
+
if (flyout)
|
|
179
|
+
this.flyout = false;
|
|
180
|
+
else
|
|
181
|
+
this.close();
|
|
182
|
+
}
|
|
183
|
+
else if (flyout && (key === 'ArrowDown' || key === 'ArrowUp'))
|
|
184
|
+
// In a flyout, the arrows walk its rows.
|
|
185
|
+
this.flyoutIndex = stepRow(key, this.flyoutIndex, this.flyoutRows.length);
|
|
186
|
+
else if (flyout && key === 'Enter')
|
|
187
|
+
this.run(this.flyoutRows[this.flyoutIndex]);
|
|
188
|
+
else if (key === 'Delete' && !this.query)
|
|
189
|
+
this.remove();
|
|
190
|
+
else if (to !== undefined) {
|
|
191
|
+
this.index = to;
|
|
192
|
+
this.flyout = false;
|
|
193
|
+
}
|
|
194
|
+
else if (key === 'ArrowRight' && submenu)
|
|
195
|
+
this.openFlyout(submenu);
|
|
196
|
+
else if (key === 'ArrowLeft' && flyout)
|
|
197
|
+
this.flyout = false;
|
|
198
|
+
else if (key === 'Enter')
|
|
199
|
+
this.run(row);
|
|
200
|
+
else
|
|
201
|
+
return;
|
|
202
|
+
event.preventDefault();
|
|
203
|
+
};
|
|
96
204
|
/** What Delete and Turn into act on: `blocks`, a list or a code block with its subtree (`selectedMembers`). */
|
|
97
205
|
get members() {
|
|
98
206
|
return selectedMembers(this.edytor, this.blocks);
|
|
@@ -124,38 +232,34 @@ export class BlockMenuController {
|
|
|
124
232
|
return rowOf(this.edytor, this.block);
|
|
125
233
|
}
|
|
126
234
|
get actions() {
|
|
127
|
-
const { block, blocks } = this;
|
|
235
|
+
const { block, blocks, edytor } = this;
|
|
236
|
+
const labels = this.#labels;
|
|
128
237
|
if (!block)
|
|
129
238
|
return [];
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
239
|
+
const [mod, shift] = edytor.keymap.isMac ? ['⌘', '⇧'] : [`${labels.ctrl}+`, `${labels.shift}+`];
|
|
240
|
+
/** An action row, its icon named by its id. */
|
|
241
|
+
const action = (id, label, more) => ({
|
|
242
|
+
id,
|
|
243
|
+
label,
|
|
244
|
+
icon: `action.${id}`,
|
|
245
|
+
...more
|
|
246
|
+
});
|
|
247
|
+
const move = (direction, label, arrow) => action(direction, label, {
|
|
248
|
+
hint: `${mod}${shift}${arrow}`,
|
|
249
|
+
isEnabled: () => edytor.canMove({ blocks: outermost(blocks), direction }),
|
|
250
|
+
run: () => this.move(direction)
|
|
251
|
+
});
|
|
135
252
|
const all = [
|
|
136
|
-
{
|
|
137
|
-
id: 'turn',
|
|
138
|
-
label: labels.turnInto,
|
|
139
|
-
icon: 'action.turn',
|
|
253
|
+
action('turn', labels.turnInto, {
|
|
140
254
|
submenu: 'turn',
|
|
141
255
|
isEnabled: () => convertedBlocks(this.members).length > 0
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
id: 'color',
|
|
145
|
-
label: labels.color,
|
|
146
|
-
icon: 'action.color',
|
|
256
|
+
}),
|
|
257
|
+
action('color', labels.color, {
|
|
147
258
|
submenu: 'color',
|
|
148
259
|
isEnabled: () => this.colorable.length > 0
|
|
149
|
-
},
|
|
260
|
+
}),
|
|
150
261
|
...(this.options.linkTo && this.linked
|
|
151
|
-
? [
|
|
152
|
-
{
|
|
153
|
-
id: 'link',
|
|
154
|
-
label: labels.copyLink,
|
|
155
|
-
icon: 'action.link',
|
|
156
|
-
run: () => this.copyLink()
|
|
157
|
-
}
|
|
158
|
-
]
|
|
262
|
+
? [action('link', labels.copyLink, { run: () => this.copyLink() })]
|
|
159
263
|
: []),
|
|
160
264
|
// The kind's own rows, on its block alone (a table's rows and switches). A
|
|
161
265
|
// switch keeps the menu open; any other row closes it, the caret its
|
|
@@ -173,37 +277,17 @@ export class BlockMenuController {
|
|
|
173
277
|
: row.run
|
|
174
278
|
}))
|
|
175
279
|
: []),
|
|
176
|
-
{
|
|
177
|
-
id: 'duplicate',
|
|
178
|
-
label: labels.duplicate,
|
|
179
|
-
icon: 'action.duplicate',
|
|
280
|
+
action('duplicate', labels.duplicate, {
|
|
180
281
|
hint: `${mod}D`,
|
|
181
|
-
run: () => (blocks.length > 1
|
|
182
|
-
},
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
icon: 'action.up',
|
|
187
|
-
hint: `${mod}${shift}↑`,
|
|
188
|
-
isEnabled: canMove('up'),
|
|
189
|
-
run: () => this.move('up')
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
id: 'down',
|
|
193
|
-
label: labels.moveDown,
|
|
194
|
-
icon: 'action.down',
|
|
195
|
-
hint: `${mod}${shift}↓`,
|
|
196
|
-
isEnabled: canMove('down'),
|
|
197
|
-
run: () => this.move('down')
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
id: 'delete',
|
|
201
|
-
label: labels.delete,
|
|
202
|
-
icon: 'action.delete',
|
|
282
|
+
run: () => this.duplicate(blocks, blocks.length > 1)
|
|
283
|
+
}),
|
|
284
|
+
move('up', labels.moveUp, '↑'),
|
|
285
|
+
move('down', labels.moveDown, '↓'),
|
|
286
|
+
action('delete', labels.delete, {
|
|
203
287
|
hint: labels.deleteKey,
|
|
204
288
|
danger: true,
|
|
205
289
|
run: () => this.remove()
|
|
206
|
-
}
|
|
290
|
+
})
|
|
207
291
|
];
|
|
208
292
|
return all.filter((action) => matchesQuery(action, this.query) && action.isEnabled?.() !== false);
|
|
209
293
|
}
|
|
@@ -211,12 +295,13 @@ export class BlockMenuController {
|
|
|
211
295
|
* With a query, the kinds it names join the list (Notion's "Turn into"
|
|
212
296
|
* results), matched as the slash menu matches them (`matchesQuery`).
|
|
213
297
|
*/
|
|
214
|
-
get matchingKinds() {
|
|
298
|
+
get #matchingKinds() {
|
|
215
299
|
if (!this.query.trim())
|
|
216
300
|
return [];
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
301
|
+
const kinds = convertedBlocks(this.members).length
|
|
302
|
+
? this.kinds
|
|
303
|
+
: turnCommands(this.edytor, this.blocks);
|
|
304
|
+
return kinds.filter((kind) => matchesQuery(kind, this.query));
|
|
220
305
|
}
|
|
221
306
|
/**
|
|
222
307
|
* With a query, the colours it names join the list after the kinds
|
|
@@ -230,7 +315,7 @@ export class BlockMenuController {
|
|
|
230
315
|
}
|
|
231
316
|
/** Every keyboard row: actions, then the matching kinds, then the matching colours. */
|
|
232
317
|
get rows() {
|
|
233
|
-
return [...this.actions, ...this
|
|
318
|
+
return [...this.actions, ...this.#matchingKinds, ...this.matchingColors];
|
|
234
319
|
}
|
|
235
320
|
open(block, anchor) {
|
|
236
321
|
const selected = getSelectedBlocksInDocumentOrder(this.edytor);
|
|
@@ -238,7 +323,7 @@ export class BlockMenuController {
|
|
|
238
323
|
this.block = block;
|
|
239
324
|
this.anchor = anchor;
|
|
240
325
|
this.query = '';
|
|
241
|
-
this.
|
|
326
|
+
this.index = 0;
|
|
242
327
|
this.flyout = false;
|
|
243
328
|
this.flyoutIndex = 0;
|
|
244
329
|
}
|
|
@@ -254,7 +339,7 @@ export class BlockMenuController {
|
|
|
254
339
|
move(direction) {
|
|
255
340
|
if (!this.blocks.length)
|
|
256
341
|
return;
|
|
257
|
-
this.edytor.
|
|
342
|
+
this.edytor.move({ blocks: outermost(this.blocks), direction });
|
|
258
343
|
this.close();
|
|
259
344
|
}
|
|
260
345
|
/**
|
|
@@ -290,26 +375,24 @@ export class BlockMenuController {
|
|
|
290
375
|
setBlockColor(this.edytor, painted, row.field, row.value);
|
|
291
376
|
const live = blocks.flatMap((block) => this.edytor.idToBlock.get(block.id) ?? []);
|
|
292
377
|
if (live.length)
|
|
293
|
-
this.edytor.selection.
|
|
378
|
+
this.edytor.selection.select(blockSelection(live.map((block) => block.id)));
|
|
294
379
|
this.focus();
|
|
295
380
|
}
|
|
296
|
-
duplicate(block) {
|
|
297
|
-
const copy = block.duplicateBlock();
|
|
298
|
-
this.close(false);
|
|
299
|
-
this.caret(copy ?? block);
|
|
300
|
-
}
|
|
301
381
|
/**
|
|
302
|
-
* Duplicate
|
|
303
|
-
* block inside another of them is copied with it; a vetoed one is
|
|
304
|
-
* `dispatcher.each`); the copies are selected
|
|
382
|
+
* Duplicate `blocks` as one undo step, each copy after its block (a
|
|
383
|
+
* block inside another of them is copied with it; a vetoed one is
|
|
384
|
+
* skipped, `dispatcher.each`); the copies are selected (`select`), else
|
|
385
|
+
* the first copy takes the caret (refused: its block keeps it).
|
|
305
386
|
*/
|
|
306
|
-
|
|
387
|
+
duplicate(blocks, select) {
|
|
307
388
|
const copies = this.edytor.dispatcher
|
|
308
|
-
.each('
|
|
309
|
-
.
|
|
389
|
+
.each('duplicateBlock', outermost(blocks), (block) => this.edytor.duplicateBlock(block.id))
|
|
390
|
+
.flatMap((copy) => (copy?.status === 'applied' ? copy.ids : []));
|
|
310
391
|
this.close(false);
|
|
311
|
-
if (
|
|
312
|
-
this.edytor.
|
|
392
|
+
if (!select)
|
|
393
|
+
this.caret(this.edytor.idToBlock.get(copies[0] ?? '') ?? blocks[0]);
|
|
394
|
+
else if (copies.length)
|
|
395
|
+
this.edytor.selection.select(blockSelection(copies));
|
|
313
396
|
}
|
|
314
397
|
/**
|
|
315
398
|
* Delete the open blocks' `members` (a list with its items) as the
|
|
@@ -343,30 +426,23 @@ export class BlockMenuController {
|
|
|
343
426
|
await navigator.clipboard?.writeText(options.linkTo(linked));
|
|
344
427
|
this.close();
|
|
345
428
|
}
|
|
346
|
-
/**
|
|
347
|
-
|
|
348
|
-
|
|
429
|
+
/**
|
|
430
|
+
* Run a row of the menu or of its open flyout (a click; Enter runs the
|
|
431
|
+
* keyboard's): paint a colour, convert to a kind, open an action's
|
|
432
|
+
* flyout or run it.
|
|
433
|
+
*/
|
|
434
|
+
run(row) {
|
|
349
435
|
if (!row)
|
|
350
436
|
return;
|
|
351
437
|
if ('field' in row)
|
|
352
|
-
|
|
353
|
-
if ('value' in row)
|
|
354
|
-
|
|
355
|
-
if (row.submenu)
|
|
438
|
+
this.paint(row);
|
|
439
|
+
else if ('value' in row)
|
|
440
|
+
this.turnInto(row);
|
|
441
|
+
else if (row.submenu)
|
|
356
442
|
this.openFlyout(row.submenu);
|
|
357
443
|
else
|
|
358
444
|
row.run?.();
|
|
359
445
|
}
|
|
360
|
-
/** Run the open flyout's keyboard row: convert to its kind, or paint its colour. */
|
|
361
|
-
runFlyout() {
|
|
362
|
-
const row = this.flyoutRows[this.flyoutIndex];
|
|
363
|
-
if (!row)
|
|
364
|
-
return;
|
|
365
|
-
if ('field' in row)
|
|
366
|
-
this.paint(row);
|
|
367
|
-
else
|
|
368
|
-
this.turnInto(row);
|
|
369
|
-
}
|
|
370
446
|
/**
|
|
371
447
|
* Open a flyout on its first row (keyboard or mouse): the "Turn into"
|
|
372
448
|
* kinds (default) or the colours; that flyout already open stays as it
|
|
@@ -382,7 +458,7 @@ export class BlockMenuController {
|
|
|
382
458
|
restore(blocks) {
|
|
383
459
|
const live = blocks.flatMap((block) => this.edytor.idToBlock.get(block.id) ?? []);
|
|
384
460
|
if (live.length > 1) {
|
|
385
|
-
this.edytor.selection.
|
|
461
|
+
this.edytor.selection.select(blockSelection(live.map((block) => block.id)));
|
|
386
462
|
this.focus();
|
|
387
463
|
}
|
|
388
464
|
else if (live[0]?.node?.isConnected)
|
|
@@ -399,12 +475,11 @@ export class BlockMenuController {
|
|
|
399
475
|
if (text || !block?.isInTree)
|
|
400
476
|
this.edytor.dispatcher.caret(text, 0);
|
|
401
477
|
else
|
|
402
|
-
this.edytor.selection.
|
|
478
|
+
this.edytor.selection.select(blockSelection([block.id]));
|
|
403
479
|
this.focus();
|
|
404
480
|
}
|
|
405
481
|
/** Back to the editor: its own focus, not a user gesture (as its selection writes). */
|
|
406
482
|
focus() {
|
|
407
|
-
this.edytor
|
|
408
|
-
this.edytor.node?.focus({ preventScroll: true });
|
|
483
|
+
takeKeys(this.edytor);
|
|
409
484
|
}
|
|
410
485
|
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { Plugin } from '../../plugins.js';
|
|
2
2
|
import { type BlockMenuOptions } from './BlockMenuController.svelte.js';
|
|
3
3
|
/**
|
|
4
|
-
* Notion's block menu: a handle click
|
|
4
|
+
* Notion's block menu: a handle click
|
|
5
5
|
* opens it beside the handle — search, Turn into, Color, Duplicate, Move,
|
|
6
6
|
* Delete, and Copy link when `linkTo` is given. Also binds Mod+D (duplicate
|
|
7
7
|
* the selected blocks, or the caret's block), and adds the colours to the
|
|
8
8
|
* slash menu by name (`/red`: "Red text", "Red background").
|
|
9
9
|
*/
|
|
10
10
|
export declare const createBlockMenuPlugin: (options?: BlockMenuOptions) => Plugin;
|
|
11
|
-
/** The block menu without a block link. */
|
|
12
|
-
export declare const blockMenuPlugin: Plugin;
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { onPress } from '../../events/onFocus.js';
|
|
1
|
+
import { handleMenuEvents, mountChrome } from '../chrome.js';
|
|
3
2
|
import { getSelectedBlocksInDocumentOrder } from '../../selection/replaceSelection.js';
|
|
4
|
-
import BlockMenu from './BlockMenu.svelte';
|
|
5
3
|
import { BlockMenuController, colorCommands } from './BlockMenuController.svelte.js';
|
|
6
4
|
/**
|
|
7
|
-
* Notion's block menu: a handle click
|
|
5
|
+
* Notion's block menu: a handle click
|
|
8
6
|
* opens it beside the handle — search, Turn into, Color, Duplicate, Move,
|
|
9
7
|
* Delete, and Copy link when `linkTo` is given. Also binds Mod+D (duplicate
|
|
10
8
|
* the selected blocks, or the caret's block), and adds the colours to the
|
|
@@ -76,48 +74,33 @@ export const createBlockMenuPlugin = (options = {}) => (edytor) => {
|
|
|
76
74
|
};
|
|
77
75
|
return {
|
|
78
76
|
// Colours by name in the slash menu (`/red`), as in Notion.
|
|
79
|
-
commands: colorCommands(edytor
|
|
77
|
+
commands: colorCommands(edytor),
|
|
80
78
|
hotkeys: {
|
|
81
79
|
'mod+d': ({ prevent }) => {
|
|
82
80
|
if (edytor.readonly)
|
|
83
81
|
return;
|
|
84
82
|
const selected = getSelectedBlocksInDocumentOrder(edytor).filter((b) => b.movable);
|
|
85
83
|
if (selected.length)
|
|
86
|
-
return prevent(() => controller.
|
|
87
|
-
const block = edytor.selection.
|
|
84
|
+
return prevent(() => controller.duplicate(selected, true));
|
|
85
|
+
const block = edytor.selection.textRange().startText?.parent;
|
|
88
86
|
if (block?.movable)
|
|
89
|
-
prevent(() => controller.duplicate(block));
|
|
87
|
+
prevent(() => controller.duplicate([block], false));
|
|
90
88
|
}
|
|
91
89
|
},
|
|
92
90
|
onEdytorAttached: ({ node }) => {
|
|
93
|
-
const
|
|
91
|
+
const off = handleMenuEvents(edytor, node, (event) => {
|
|
94
92
|
// The menu takes the keyboard (its search field).
|
|
95
93
|
event.preventDefault();
|
|
96
|
-
|
|
97
|
-
controller.open(block, anchor);
|
|
94
|
+
controller.open(event.detail.block, event.detail.anchor);
|
|
98
95
|
edytor.overlay.invalidate();
|
|
99
|
-
}
|
|
100
|
-
const outside = (event) => {
|
|
101
|
-
const target = event.target;
|
|
102
|
-
if (controller.isOpen &&
|
|
103
|
-
!target?.closest?.('[data-edytor-block-menu-host], [data-edytor-block-handle-host]'))
|
|
104
|
-
controller.close(false);
|
|
105
|
-
};
|
|
96
|
+
},
|
|
106
97
|
// A `+` opens its own menu: this one closes.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
node.addEventListener(BLOCK_ADD_EVENT, add);
|
|
110
|
-
// Every press, WebKit's lone `mousedown` after a drag too (`onPress`).
|
|
111
|
-
const offPress = onPress(edytor, node.ownerDocument, outside, true);
|
|
112
|
-
const unmount = edytor.overlay.mount(BlockMenu, { controller, menu: options.menu }, 'edytor-block-menu-host', 70, place);
|
|
98
|
+
close, '[data-edytor-block-menu-host], [data-edytor-block-handle-host]', () => controller.isOpen && close());
|
|
99
|
+
const unmount = mountChrome(edytor, options.menu, controller, () => controller.isOpen, { name: 'edytor-block-menu-host', zIndex: 70, measure: place }, close);
|
|
113
100
|
return () => {
|
|
114
|
-
|
|
115
|
-
node.removeEventListener(BLOCK_ADD_EVENT, add);
|
|
116
|
-
offPress();
|
|
101
|
+
off();
|
|
117
102
|
unmount();
|
|
118
103
|
};
|
|
119
104
|
}
|
|
120
105
|
};
|
|
121
106
|
};
|
|
122
|
-
/** The block menu without a block link. */
|
|
123
|
-
export const blockMenuPlugin = createBlockMenuPlugin();
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Plugin } from '../plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* `plugin`, known as a `name` plugin: `<Edytor>`'s default plugin of that
|
|
4
|
+
* name yields to any instance listed (`brandOf`).
|
|
5
|
+
*/
|
|
6
|
+
export declare const branded: (name: string, plugin: Plugin) => Plugin;
|
|
7
|
+
/** The name `plugin` was branded with, if any. */
|
|
8
|
+
export declare const brandOf: (plugin: Plugin) => string | undefined;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const brands = new WeakMap();
|
|
2
|
+
/**
|
|
3
|
+
* `plugin`, known as a `name` plugin: `<Edytor>`'s default plugin of that
|
|
4
|
+
* name yields to any instance listed (`brandOf`).
|
|
5
|
+
*/
|
|
6
|
+
export const branded = (name, plugin) => (brands.set(plugin, name), plugin);
|
|
7
|
+
/** The name `plugin` was branded with, if any. */
|
|
8
|
+
export const brandOf = (plugin) => brands.get(plugin);
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What every chrome surface shares with the markup that renders it, the
|
|
3
|
+
* app's snippet: the one host (`mountChrome`), the row payload a controller
|
|
4
|
+
* builds, a row's attributes (`option(index)`), and the small DOM rules the
|
|
5
|
+
* controllers' attachments apply (a press that keeps the focus, an
|
|
6
|
+
* element given its id, role and name).
|
|
7
|
+
*/
|
|
8
|
+
import type { Snippet } from 'svelte';
|
|
9
|
+
import type { Attachment } from 'svelte/attachments';
|
|
10
|
+
import type { Edytor } from '../edytor.svelte.js';
|
|
11
|
+
import { type BlockActivation, type BlockAddition } from './blockHandles/BlockHandleController.svelte.js';
|
|
12
|
+
/**
|
|
13
|
+
* Mount the app's `snippet` for a chrome surface in a fixed host of the
|
|
14
|
+
* overlay (`data-<name>`, placed by `measure`), rendered with `payload`
|
|
15
|
+
* while `shown` holds and closed (`close`) when the view turns readonly.
|
|
16
|
+
* Without a snippet the surface renders nothing (its controller still
|
|
17
|
+
* works): nothing is mounted. Answers the teardown.
|
|
18
|
+
*/
|
|
19
|
+
export declare const mountChrome: <T>(edytor: Edytor, snippet: Snippet<[T]> | undefined, payload: T, shown: () => unknown, place: {
|
|
20
|
+
name: string;
|
|
21
|
+
zIndex: number;
|
|
22
|
+
measure: (host: HTMLElement, origin: DOMRect) => (() => void) | void;
|
|
23
|
+
}, close?: () => void) => () => void;
|
|
24
|
+
/**
|
|
25
|
+
* One row of a chrome list a controller builds for the app's markup: the
|
|
26
|
+
* same shape in every menu (a table grip's, the code language list's).
|
|
27
|
+
*/
|
|
28
|
+
export type MenuItemPayload<T> = {
|
|
29
|
+
/** What the row stands for: a command, a trigger's row, a version. */
|
|
30
|
+
item: T;
|
|
31
|
+
/** The row's element id (page-unique): the keyboard's owner names the highlighted row by it. */
|
|
32
|
+
id: string;
|
|
33
|
+
/** It is the keyboard's row. */
|
|
34
|
+
selected: boolean;
|
|
35
|
+
/** Run it (pick the row). */
|
|
36
|
+
run: () => void;
|
|
37
|
+
/** Make it the keyboard's row (hover). */
|
|
38
|
+
select: () => void;
|
|
39
|
+
/**
|
|
40
|
+
* The row's attachment (`{@attach item.option}`): its `id`, `role`,
|
|
41
|
+
* `aria-selected` (or `aria-checked`) and `tabindex`, and the keyboard's
|
|
42
|
+
* row scrolled into view. Its look is yours, from `selected`.
|
|
43
|
+
*/
|
|
44
|
+
option: Attachment<HTMLElement>;
|
|
45
|
+
};
|
|
46
|
+
/** An attribute's value as an attachment writes it: `undefined` or `null` removes it. */
|
|
47
|
+
type AttributeValue = string | number | boolean | null | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* The attachment of an element the package needs something of (a row, a
|
|
50
|
+
* control inside a block): it writes `attributes` (see `write`) and
|
|
51
|
+
* listens for `on`'s events until it is torn down. Read in a template,
|
|
52
|
+
* a new attachment replaces the last one when what it reads changes: the
|
|
53
|
+
* attributes it no longer gives (`undefined`) are removed.
|
|
54
|
+
*/
|
|
55
|
+
export declare const attach: (attributes: Record<string, AttributeValue>, on?: { [K in keyof HTMLElementEventMap]?: (event: HTMLElementEventMap[K]) => void; }) => Attachment<HTMLElement>;
|
|
56
|
+
/** A text field: it takes the focus a press gives it. */
|
|
57
|
+
export declare const isField: (target: EventTarget | null) => boolean;
|
|
58
|
+
/**
|
|
59
|
+
* A press on chrome keeps the focus where it is (the editor's caret, or the
|
|
60
|
+
* menu's field): every press but one on a field, which takes its own.
|
|
61
|
+
*/
|
|
62
|
+
export declare const keepFocus: (event: MouseEvent) => void;
|
|
63
|
+
/** A press on a control inside a block keeps the editor's selection (and its focus). */
|
|
64
|
+
export declare const keepSelection: (event: MouseEvent) => void;
|
|
65
|
+
/** Give `node` the id the controller names it by (`aria-controls`), and the role it lacks. */
|
|
66
|
+
export declare const identify: (node: HTMLElement, id: string, role?: string) => void;
|
|
67
|
+
/** Set or remove (`undefined`) an attribute the keyboard's owner carries. */
|
|
68
|
+
export declare const attribute: (node: HTMLElement, name: string, value: string | undefined) => void;
|
|
69
|
+
/** Whether `node` may name a highlighted row (`aria-activedescendant`): a field, or an element with a role. */
|
|
70
|
+
export declare const namesRows: (node: HTMLElement) => boolean;
|
|
71
|
+
/**
|
|
72
|
+
* A handle menu's events on the editor `node` (the block menu, the `+`'s
|
|
73
|
+
* menu): a grip's activation (`BLOCK_ACTIVATE_EVENT`), a `+`'s offer
|
|
74
|
+
* (`BLOCK_ADD_EVENT`), and every press outside the elements `inside`
|
|
75
|
+
* matches (WebKit's lone `mousedown` after a drag too, `onPress`). Answers
|
|
76
|
+
* the teardown.
|
|
77
|
+
*/
|
|
78
|
+
export declare const handleMenuEvents: (edytor: Edytor, node: HTMLElement, activate: (event: CustomEvent<BlockActivation>) => void, add: (event: CustomEvent<BlockAddition>) => void, inside: string, outside: () => void) => () => void;
|
|
79
|
+
export {};
|