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,243 @@
|
|
|
1
|
+
import { blockSelection, noSelection } from '../../session/selection.js';
|
|
2
|
+
import { takeKeys } from '../../events/onFocus.js';
|
|
3
|
+
import { marqueeBlocks } from './marquee.js';
|
|
4
|
+
/** Within this distance (px) of the scroller's top or bottom edge, the page scrolls. */
|
|
5
|
+
const EDGE = 48;
|
|
6
|
+
/** The fastest auto-scroll, in px a frame: at the edge or past it. */
|
|
7
|
+
const SPEED = 24;
|
|
8
|
+
const sameIds = (a, b) => a.length === b.length && a.every((id, i) => id === b[i]);
|
|
9
|
+
export class MarqueeController {
|
|
10
|
+
edytor;
|
|
11
|
+
threshold;
|
|
12
|
+
/** The rectangle while the marquee shows (client coordinates), else `null` (reactive). */
|
|
13
|
+
rect = $state.raw(null);
|
|
14
|
+
/** The block ids the marquee selects (reactive). */
|
|
15
|
+
ids = $state.raw([]);
|
|
16
|
+
/** Shift or Mod was held at the press (reactive). */
|
|
17
|
+
adding = $state(false);
|
|
18
|
+
#press = null;
|
|
19
|
+
/** The drag passed the threshold: the rectangle shows. */
|
|
20
|
+
#active = false;
|
|
21
|
+
/** The pointer, in client coordinates. */
|
|
22
|
+
#pointer = { x: 0, y: 0 };
|
|
23
|
+
#frame = null;
|
|
24
|
+
/** The editor's nearest scrolling ancestor (`null`: the page), read when the rectangle starts. */
|
|
25
|
+
#scroller = null;
|
|
26
|
+
constructor(edytor, threshold) {
|
|
27
|
+
this.edytor = edytor;
|
|
28
|
+
this.threshold = threshold;
|
|
29
|
+
}
|
|
30
|
+
/** What a `box` snippet receives. */
|
|
31
|
+
get payload() {
|
|
32
|
+
const { rect } = this;
|
|
33
|
+
return rect && { rect, count: this.ids.length, ids: this.ids, adding: this.adding };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A primary press from a mouse or a pen, already classified as the
|
|
37
|
+
* editor's empty area (`host`: the host's own; else the handle gutter or
|
|
38
|
+
* the app's container). Answers whether the marquee took it.
|
|
39
|
+
*/
|
|
40
|
+
press = (event, host) => {
|
|
41
|
+
const node = this.edytor.node;
|
|
42
|
+
const document = node?.ownerDocument;
|
|
43
|
+
const view = document?.defaultView;
|
|
44
|
+
if (!node || !document || !view || event.button !== 0)
|
|
45
|
+
return false;
|
|
46
|
+
if (event.pointerType === 'touch')
|
|
47
|
+
return false;
|
|
48
|
+
// A press while one is down: the release of the last one never reached the page.
|
|
49
|
+
this.#end();
|
|
50
|
+
const box = node.getBoundingClientRect();
|
|
51
|
+
const mod = this.edytor.keymap.isMac ? event.metaKey : event.ctrlKey;
|
|
52
|
+
const adding = event.shiftKey || mod;
|
|
53
|
+
const before = this.edytor.selection.value;
|
|
54
|
+
const { clientX, clientY, shiftKey, altKey, metaKey, ctrlKey } = event;
|
|
55
|
+
// The press is the marquee's: the browser starts no selection of its own and moves no focus.
|
|
56
|
+
if (event.type === 'mousedown')
|
|
57
|
+
event.preventDefault();
|
|
58
|
+
const cancel = (event) => event.preventDefault();
|
|
59
|
+
const compat = (event) => {
|
|
60
|
+
if (event.button === 0)
|
|
61
|
+
event.preventDefault();
|
|
62
|
+
};
|
|
63
|
+
const listening = new AbortController();
|
|
64
|
+
const on = (target, type, listener) => target.addEventListener(type, listener, {
|
|
65
|
+
capture: true,
|
|
66
|
+
passive: type === 'scroll',
|
|
67
|
+
signal: listening.signal
|
|
68
|
+
});
|
|
69
|
+
// WebKit after a native drag sends a lone `mousedown` and may skip the
|
|
70
|
+
// pointer events of the press: its mouse events end it too.
|
|
71
|
+
for (const type of ['pointermove', 'mousemove'])
|
|
72
|
+
on(document, type, this.#moved);
|
|
73
|
+
for (const type of ['pointerup', 'mouseup'])
|
|
74
|
+
on(document, type, this.#released);
|
|
75
|
+
on(document, 'pointercancel', this.cancel);
|
|
76
|
+
on(document, 'mousedown', compat);
|
|
77
|
+
on(document, 'selectstart', cancel);
|
|
78
|
+
on(document, 'dragstart', cancel);
|
|
79
|
+
on(document, 'scroll', this.#scrolled);
|
|
80
|
+
on(view, 'keydown', this.#key);
|
|
81
|
+
this.#press = {
|
|
82
|
+
x: clientX - box.left,
|
|
83
|
+
y: clientY - box.top,
|
|
84
|
+
point: { clientX, clientY, shiftKey, altKey, metaKey, ctrlKey },
|
|
85
|
+
host,
|
|
86
|
+
before,
|
|
87
|
+
base: adding && before.kind === 'blocks' ? before.ids : [],
|
|
88
|
+
listening
|
|
89
|
+
};
|
|
90
|
+
this.#pointer = { x: clientX, y: clientY };
|
|
91
|
+
this.adding = adding;
|
|
92
|
+
return true;
|
|
93
|
+
};
|
|
94
|
+
#moved = (event) => {
|
|
95
|
+
const press = this.#press;
|
|
96
|
+
if (!press)
|
|
97
|
+
return;
|
|
98
|
+
// A release the page never saw (over a frame of another origin, outside the window):
|
|
99
|
+
// a mouse move with no button down ends the gesture, as `sel.drag.unseen-release`.
|
|
100
|
+
if (event.type === 'mousemove' && event.buttons === 0)
|
|
101
|
+
return this.#end();
|
|
102
|
+
this.#pointer = { x: event.clientX, y: event.clientY };
|
|
103
|
+
if (!this.#active) {
|
|
104
|
+
const { clientX, clientY } = press.point;
|
|
105
|
+
if (Math.hypot(event.clientX - clientX, event.clientY - clientY) < this.threshold)
|
|
106
|
+
return;
|
|
107
|
+
this.#active = true;
|
|
108
|
+
this.#scroller = this.edytor.node ? scrollerOf(this.edytor.node) : null;
|
|
109
|
+
// The editor takes the keys: Delete, Mod+C, Tab and the arrows act on the selection.
|
|
110
|
+
takeKeys(this.edytor);
|
|
111
|
+
}
|
|
112
|
+
this.#update();
|
|
113
|
+
this.#autoScroll();
|
|
114
|
+
};
|
|
115
|
+
/** The page scrolled under the drag: the rectangle keeps its start where it was in the page. */
|
|
116
|
+
#scrolled = () => {
|
|
117
|
+
if (this.#active)
|
|
118
|
+
this.#update();
|
|
119
|
+
};
|
|
120
|
+
/** The rectangle from the press to the pointer, and the selection it makes. */
|
|
121
|
+
#update = () => {
|
|
122
|
+
const press = this.#press;
|
|
123
|
+
const node = this.edytor.node;
|
|
124
|
+
if (!press || !node)
|
|
125
|
+
return;
|
|
126
|
+
const box = node.getBoundingClientRect();
|
|
127
|
+
const [x, y] = [box.left + press.x, box.top + press.y];
|
|
128
|
+
const { x: px, y: py } = this.#pointer;
|
|
129
|
+
const area = {
|
|
130
|
+
left: Math.min(x, px),
|
|
131
|
+
top: Math.min(y, py),
|
|
132
|
+
right: Math.max(x, px, Math.min(x, px) + 1),
|
|
133
|
+
bottom: Math.max(y, py, Math.min(y, py) + 1)
|
|
134
|
+
};
|
|
135
|
+
const base = new Set(press.base);
|
|
136
|
+
const hits = marqueeBlocks(this.edytor, area).flatMap((block) => base.has(block.id) ? [] : [block.id]);
|
|
137
|
+
const ids = [...press.base, ...hits];
|
|
138
|
+
this.rect = new DOMRectReadOnly(area.left, area.top, area.right - area.left, area.bottom - area.top);
|
|
139
|
+
if (!sameIds(ids, this.ids)) {
|
|
140
|
+
this.ids = ids;
|
|
141
|
+
this.edytor.selection.select(ids.length ? blockSelection(ids) : noSelection);
|
|
142
|
+
}
|
|
143
|
+
this.edytor.overlay.invalidate();
|
|
144
|
+
};
|
|
145
|
+
/** The distance to scroll this frame (negative: up), from the pointer's place by the scroller's edges. */
|
|
146
|
+
#step = () => {
|
|
147
|
+
const node = this.edytor.node;
|
|
148
|
+
const view = node?.ownerDocument.defaultView;
|
|
149
|
+
if (!node || !view)
|
|
150
|
+
return null;
|
|
151
|
+
const scroller = this.#scroller;
|
|
152
|
+
const box = scroller?.getBoundingClientRect();
|
|
153
|
+
const top = Math.max(box?.top ?? 0, 0);
|
|
154
|
+
const bottom = Math.min(box?.bottom ?? view.innerHeight, view.innerHeight);
|
|
155
|
+
const y = this.#pointer.y;
|
|
156
|
+
const near = (distance) => Math.ceil(SPEED * Math.min(1, (EDGE - distance) / EDGE));
|
|
157
|
+
const by = y < top + EDGE ? -near(y - top) : y > bottom - EDGE ? near(bottom - y) : 0;
|
|
158
|
+
return by ? { scroller, by } : null;
|
|
159
|
+
};
|
|
160
|
+
/**
|
|
161
|
+
* Browser rule `marquee.auto-scroll` (one named frame loop): while the
|
|
162
|
+
* pointer is within `EDGE` of the scroller's top or bottom (the editor's
|
|
163
|
+
* nearest scrolling ancestor, else the page), it scrolls a step a frame,
|
|
164
|
+
* faster nearer the edge, and the rectangle extends with it. It stops
|
|
165
|
+
* when the pointer leaves the band, the scroller cannot go further, or
|
|
166
|
+
* the gesture ends.
|
|
167
|
+
*/
|
|
168
|
+
#autoScroll = () => {
|
|
169
|
+
const view = this.edytor.node?.ownerDocument.defaultView;
|
|
170
|
+
if (this.#frame !== null || !this.#active || !view?.requestAnimationFrame || !this.#step())
|
|
171
|
+
return;
|
|
172
|
+
this.#frame = view.requestAnimationFrame(() => {
|
|
173
|
+
this.#frame = null;
|
|
174
|
+
const step = this.#step();
|
|
175
|
+
if (!step || !this.#active)
|
|
176
|
+
return;
|
|
177
|
+
const target = step.scroller ?? view.document.scrollingElement;
|
|
178
|
+
if (!target)
|
|
179
|
+
return;
|
|
180
|
+
const before = target.scrollTop;
|
|
181
|
+
target.scrollTop += step.by;
|
|
182
|
+
// The scroller is at its end: the loop waits for the next move.
|
|
183
|
+
if (target.scrollTop === before)
|
|
184
|
+
return;
|
|
185
|
+
this.#update();
|
|
186
|
+
this.#autoScroll();
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
#released = () => {
|
|
190
|
+
const press = this.#press;
|
|
191
|
+
if (!press)
|
|
192
|
+
return;
|
|
193
|
+
const click = !this.#active;
|
|
194
|
+
this.#end();
|
|
195
|
+
// A press released where it began is a click: the host's own (the trailing paragraph, a caret).
|
|
196
|
+
if (click && press.host)
|
|
197
|
+
this.edytor.selection.pointer.marginClick(press.point);
|
|
198
|
+
};
|
|
199
|
+
/** Escape: the selection from before the press comes back, and the gesture ends. */
|
|
200
|
+
#key = (event) => {
|
|
201
|
+
if (event.key !== 'Escape' || !this.#press)
|
|
202
|
+
return;
|
|
203
|
+
event.preventDefault();
|
|
204
|
+
event.stopPropagation();
|
|
205
|
+
this.cancel();
|
|
206
|
+
};
|
|
207
|
+
/** End the gesture and give back the selection from before the press. */
|
|
208
|
+
cancel = () => {
|
|
209
|
+
const press = this.#press;
|
|
210
|
+
if (!press)
|
|
211
|
+
return;
|
|
212
|
+
const active = this.#active;
|
|
213
|
+
this.#end();
|
|
214
|
+
if (active)
|
|
215
|
+
this.edytor.selection.select(press.before);
|
|
216
|
+
};
|
|
217
|
+
#end = () => {
|
|
218
|
+
const press = this.#press;
|
|
219
|
+
this.#press = null;
|
|
220
|
+
this.#active = false;
|
|
221
|
+
press?.listening.abort();
|
|
222
|
+
if (this.#frame !== null)
|
|
223
|
+
this.edytor.node?.ownerDocument.defaultView?.cancelAnimationFrame(this.#frame);
|
|
224
|
+
this.#frame = null;
|
|
225
|
+
this.rect = null;
|
|
226
|
+
this.ids = [];
|
|
227
|
+
this.adding = false;
|
|
228
|
+
this.edytor.overlay.invalidate();
|
|
229
|
+
};
|
|
230
|
+
destroy = () => this.#end();
|
|
231
|
+
}
|
|
232
|
+
/** The editor's nearest ancestor that scrolls vertically, else `null` (the page). */
|
|
233
|
+
const scrollerOf = (node) => {
|
|
234
|
+
const view = node.ownerDocument.defaultView;
|
|
235
|
+
const { body, documentElement } = node.ownerDocument;
|
|
236
|
+
for (let at = node.parentElement; at && at !== body && at !== documentElement;) {
|
|
237
|
+
const { overflowY } = view.getComputedStyle(at);
|
|
238
|
+
if (/auto|scroll|overlay/.test(overflowY) && at.scrollHeight > at.clientHeight)
|
|
239
|
+
return at;
|
|
240
|
+
at = at.parentElement;
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which blocks a marquee rectangle selects (`sel.marquee.blocks`, Notion),
|
|
3
|
+
* read from the blocks' boxes: the one rule the marquee's live selection
|
|
4
|
+
* reads. A pointer move never reads the whole page: a binary search over a
|
|
5
|
+
* parent's children (vertical order) finds the ones at the rectangle's
|
|
6
|
+
* height, then their descendants the same way.
|
|
7
|
+
*/
|
|
8
|
+
import type { Block } from '../../block/block.svelte.js';
|
|
9
|
+
import type { Edytor } from '../../edytor.svelte.js';
|
|
10
|
+
/** A rectangle in viewport (client) coordinates. */
|
|
11
|
+
export type MarqueeRect = {
|
|
12
|
+
left: number;
|
|
13
|
+
top: number;
|
|
14
|
+
right: number;
|
|
15
|
+
bottom: number;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* The blocks `rect` selects, in document order, each once:
|
|
19
|
+
*
|
|
20
|
+
* - a block whose own row (its box down to where its first shown child
|
|
21
|
+
* begins) meets the rectangle is selected with its whole shown subtree
|
|
22
|
+
* (Notion: a block carries its children);
|
|
23
|
+
* - a block whose box meets it only below its own row is not: its children
|
|
24
|
+
* are read the same way;
|
|
25
|
+
* - a void or an island (an image, a code block, a table) is one unit:
|
|
26
|
+
* selected when its box meets the rectangle, never its rows or lines;
|
|
27
|
+
* - a layout and its columns are never selected themselves: the columns the
|
|
28
|
+
* rectangle meets are read, so it selects the blocks of the columns it
|
|
29
|
+
* crosses (a layout covered whole stands for them, `liftLayouts`); a list
|
|
30
|
+
* container (it shows only its items) is read through its items;
|
|
31
|
+
* - a block hidden by view state (a closed toggle's body) never.
|
|
32
|
+
*/
|
|
33
|
+
export declare const marqueeBlocks: (edytor: Edytor, rect: MarqueeRect) => Block[];
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { hidden } from '../../selection/visibility.js';
|
|
2
|
+
import { bandRun } from '../../surface/overlay.js';
|
|
3
|
+
/** Whether two boxes overlap (an edge they share is no overlap: rows touch). */
|
|
4
|
+
const meets = (rect, box) => rect.left < box.right && rect.right > box.left && rect.top < box.bottom && rect.bottom > box.top;
|
|
5
|
+
/**
|
|
6
|
+
* The blocks `rect` selects, in document order, each once:
|
|
7
|
+
*
|
|
8
|
+
* - a block whose own row (its box down to where its first shown child
|
|
9
|
+
* begins) meets the rectangle is selected with its whole shown subtree
|
|
10
|
+
* (Notion: a block carries its children);
|
|
11
|
+
* - a block whose box meets it only below its own row is not: its children
|
|
12
|
+
* are read the same way;
|
|
13
|
+
* - a void or an island (an image, a code block, a table) is one unit:
|
|
14
|
+
* selected when its box meets the rectangle, never its rows or lines;
|
|
15
|
+
* - a layout and its columns are never selected themselves: the columns the
|
|
16
|
+
* rectangle meets are read, so it selects the blocks of the columns it
|
|
17
|
+
* crosses (a layout covered whole stands for them, `liftLayouts`); a list
|
|
18
|
+
* container (it shows only its items) is read through its items;
|
|
19
|
+
* - a block hidden by view state (a closed toggle's body) never.
|
|
20
|
+
*/
|
|
21
|
+
export const marqueeBlocks = (edytor, rect) => {
|
|
22
|
+
const { facade, idToBlock } = edytor;
|
|
23
|
+
const out = [];
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
const box = (block) => block.node?.getBoundingClientRect();
|
|
26
|
+
const add = (block) => {
|
|
27
|
+
if (seen.has(block.id))
|
|
28
|
+
return;
|
|
29
|
+
seen.add(block.id);
|
|
30
|
+
out.push(block);
|
|
31
|
+
};
|
|
32
|
+
const unit = (block) => facade.isVoid(block.id) || facade.isIsland(block.id);
|
|
33
|
+
const layout = (block) => facade.isLayout(block.id) || facade.isLayoutItem(block.id);
|
|
34
|
+
/** A block's children ids while they show (a closed toggle hides its whole body). */
|
|
35
|
+
const shownChildren = (block) => {
|
|
36
|
+
const ids = facade.childrenIds(block?.id ?? null);
|
|
37
|
+
const first = ids[0];
|
|
38
|
+
return first === undefined || (block && hidden(idToBlock.block(first))) ? [] : ids;
|
|
39
|
+
};
|
|
40
|
+
/** The children of `parent` at the rectangle's height: a binary search over their boxes. */
|
|
41
|
+
const rows = (ids) => {
|
|
42
|
+
const at = (i) => box(idToBlock.block(ids[i]));
|
|
43
|
+
// Rows touch: an edge they share is no overlap.
|
|
44
|
+
const [first, end] = bandRun(ids.length, at, rect.top, rect.bottom, true);
|
|
45
|
+
return ids.slice(first, end).flatMap((id) => {
|
|
46
|
+
const block = idToBlock.block(id);
|
|
47
|
+
return hidden(block) ? [] : [block];
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
/** `block` and its shown subtree, a layout and its columns as their blocks. */
|
|
51
|
+
const whole = (block) => {
|
|
52
|
+
if (!layout(block))
|
|
53
|
+
add(block);
|
|
54
|
+
if (unit(block))
|
|
55
|
+
return;
|
|
56
|
+
for (const id of shownChildren(block)) {
|
|
57
|
+
const child = idToBlock.block(id);
|
|
58
|
+
if (!hidden(child))
|
|
59
|
+
whole(child);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const visit = (block) => {
|
|
63
|
+
const own = box(block);
|
|
64
|
+
if (!own || !meets(rect, own))
|
|
65
|
+
return;
|
|
66
|
+
if (unit(block))
|
|
67
|
+
return add(block);
|
|
68
|
+
if (facade.isLayout(block.id)) {
|
|
69
|
+
for (const id of facade.childrenIds(block.id))
|
|
70
|
+
visit(idToBlock.block(id));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const children = shownChildren(block);
|
|
74
|
+
if (facade.isLayoutItem(block.id) || block.isContainer) {
|
|
75
|
+
for (const child of rows(children))
|
|
76
|
+
visit(child);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const first = children[0] === undefined ? undefined : box(idToBlock.block(children[0]));
|
|
80
|
+
const bottom = first && first.height > 0 && first.top > own.top ? first.top : own.bottom;
|
|
81
|
+
if (meets(rect, { left: own.left, right: own.right, top: own.top, bottom }))
|
|
82
|
+
return whole(block);
|
|
83
|
+
for (const child of rows(children))
|
|
84
|
+
visit(child);
|
|
85
|
+
};
|
|
86
|
+
for (const block of rows(shownChildren(null)))
|
|
87
|
+
visit(block);
|
|
88
|
+
return out;
|
|
89
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { Plugin } from '../../plugins.js';
|
|
3
|
+
import { type MarqueeBoxPayload } from './MarqueeController.svelte.js';
|
|
4
|
+
export type MarqueePluginOptions = {
|
|
5
|
+
/**
|
|
6
|
+
* An element around the editor whose empty area starts a marquee too (the
|
|
7
|
+
* page, as in Notion): a CSS selector the editor's element is matched
|
|
8
|
+
* against with `closest()`, or a function of the editor's element. A
|
|
9
|
+
* press on that element itself, or on a wrapper between it and the
|
|
10
|
+
* editor, starts one; its other content (a title, a button) keeps its
|
|
11
|
+
* presses.
|
|
12
|
+
*/
|
|
13
|
+
container?: string | ((editor: HTMLElement) => Element | null | undefined);
|
|
14
|
+
/** How far (px) the pointer moves before the rectangle starts: a shorter press is a click. Default 4. */
|
|
15
|
+
threshold?: number;
|
|
16
|
+
/**
|
|
17
|
+
* The rectangle's markup; it renders in a host placed and sized to the
|
|
18
|
+
* rectangle (without it, the blocks are selected and no rectangle shows).
|
|
19
|
+
*/
|
|
20
|
+
box?: Snippet<[MarqueeBoxPayload]>;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Block selection with a rectangle (Notion's rubber band), opt-in: a press
|
|
24
|
+
* in the editor's empty area — the margins beside the blocks (the handle
|
|
25
|
+
* gutter, not a handle), the space below the last block, an optional
|
|
26
|
+
* `container` around the editor — then a drag draws a rectangle and selects,
|
|
27
|
+
* live, the blocks it meets. Shift or Mod adds to the selection there was;
|
|
28
|
+
* Escape gives it back. On release the block selection stays and the editor
|
|
29
|
+
* has the keys. A click without a drag keeps what a press there did (below
|
|
30
|
+
* the last block, the trailing paragraph).
|
|
31
|
+
*/
|
|
32
|
+
export declare const createMarqueePlugin: (options?: MarqueePluginOptions) => Plugin;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { onPress } from '../../events/onFocus.js';
|
|
2
|
+
import MarqueeBox from './MarqueeBox.svelte';
|
|
3
|
+
import { MarqueeController } from './MarqueeController.svelte.js';
|
|
4
|
+
/** The handle gutter: a block handle's own box, around its buttons (never a button). */
|
|
5
|
+
const HANDLE_HOST = '[data-edytor-block-handle-host]';
|
|
6
|
+
const controllers = new WeakMap();
|
|
7
|
+
/** The marquee's controller of `edytor`; `undefined` when the plugin is not listed. @internal */
|
|
8
|
+
export const marqueeController = (edytor) => controllers.get(edytor);
|
|
9
|
+
/**
|
|
10
|
+
* Block selection with a rectangle (Notion's rubber band), opt-in: a press
|
|
11
|
+
* in the editor's empty area — the margins beside the blocks (the handle
|
|
12
|
+
* gutter, not a handle), the space below the last block, an optional
|
|
13
|
+
* `container` around the editor — then a drag draws a rectangle and selects,
|
|
14
|
+
* live, the blocks it meets. Shift or Mod adds to the selection there was;
|
|
15
|
+
* Escape gives it back. On release the block selection stays and the editor
|
|
16
|
+
* has the keys. A click without a drag keeps what a press there did (below
|
|
17
|
+
* the last block, the trailing paragraph).
|
|
18
|
+
*/
|
|
19
|
+
export const createMarqueePlugin = (options = {}) => (edytor) => {
|
|
20
|
+
const controller = new MarqueeController(edytor, options.threshold ?? 4);
|
|
21
|
+
controllers.set(edytor, controller);
|
|
22
|
+
return {
|
|
23
|
+
onEdytorAttached: ({ node }) => {
|
|
24
|
+
const layer = edytor.overlay.layer;
|
|
25
|
+
const offs = [
|
|
26
|
+
// The host's own area: classified with the editor's presses (`events/onFocus.ts`).
|
|
27
|
+
edytor.selection.pointer.claimMargins((event) => controller.press(event, true)),
|
|
28
|
+
onPress(edytor, layer, (event) => {
|
|
29
|
+
const target = event.target;
|
|
30
|
+
if (target?.matches?.(HANDLE_HOST))
|
|
31
|
+
controller.press(event, false);
|
|
32
|
+
})
|
|
33
|
+
];
|
|
34
|
+
const container = typeof options.container === 'string'
|
|
35
|
+
? node.closest(options.container)
|
|
36
|
+
: options.container?.(node);
|
|
37
|
+
if (container)
|
|
38
|
+
offs.push(onPress(edytor, container, (event) => {
|
|
39
|
+
const target = event.target;
|
|
40
|
+
const around = target === container ||
|
|
41
|
+
(target !== node && !!target?.contains(node) && container.contains(target));
|
|
42
|
+
if (around)
|
|
43
|
+
controller.press(event, false);
|
|
44
|
+
}));
|
|
45
|
+
const { box } = options;
|
|
46
|
+
const unmount = box
|
|
47
|
+
? edytor.overlay.mount(MarqueeBox, { controller, box }, 'edytor-marquee-host', 6, (host) => {
|
|
48
|
+
const rect = controller.rect;
|
|
49
|
+
return () => Object.assign(host.style, {
|
|
50
|
+
pointerEvents: 'none',
|
|
51
|
+
display: rect ? '' : 'none',
|
|
52
|
+
...(rect && {
|
|
53
|
+
left: `${rect.left}px`,
|
|
54
|
+
top: `${rect.top}px`,
|
|
55
|
+
width: `${rect.width}px`,
|
|
56
|
+
height: `${rect.height}px`
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
})
|
|
60
|
+
: () => { };
|
|
61
|
+
return () => {
|
|
62
|
+
controller.destroy();
|
|
63
|
+
offs.forEach((off) => off());
|
|
64
|
+
unmount();
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
};
|
|
@@ -1,96 +1,11 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
|
-
import type { Plugin
|
|
3
|
-
import
|
|
4
|
-
import type { Edytor } from '../../edytor.svelte.js';
|
|
5
|
-
import MediaEmpty from './MediaEmpty.svelte';
|
|
6
|
-
import { mediaKinds } from '../../crdt/semantics.js';
|
|
7
|
-
import { keywordsOf, labelsWith } from '../../labels.js';
|
|
8
|
-
import {
|
|
9
|
-
claimed,
|
|
10
|
-
escapeHtml,
|
|
11
|
-
mediaLabels,
|
|
12
|
-
mediaSourceOf,
|
|
13
|
-
safeMediaSrc,
|
|
14
|
-
mediaUploads,
|
|
15
|
-
type MediaPluginOptions
|
|
16
|
-
} from './media.js';
|
|
17
|
-
|
|
18
|
-
const uploadOf = new WeakMap<Edytor, MediaPluginOptions['upload']>();
|
|
19
|
-
|
|
20
|
-
const audioLink = (block: Block | undefined, value: string) => {
|
|
21
|
-
const src = safeMediaSrc(value);
|
|
22
|
-
if (!block || !src) return false;
|
|
23
|
-
block.data.src = src;
|
|
24
|
-
return true;
|
|
25
|
-
};
|
|
2
|
+
import type { Plugin } from '../../plugins.js';
|
|
3
|
+
import { sourcePlugin } from './SourceBlock.svelte';
|
|
26
4
|
|
|
27
5
|
/**
|
|
28
6
|
* Notion's audio block: an audio file (an `http(s)` link, or an upload
|
|
29
7
|
* through `upload`) in the browser's player, with an editable caption.
|
|
30
8
|
* Void: its only text is the caption.
|
|
31
9
|
*/
|
|
32
|
-
export const createAudioPlugin =
|
|
33
|
-
(options: MediaPluginOptions = {}): Plugin =>
|
|
34
|
-
(edytor) => {
|
|
35
|
-
// First wins, as for the kind: a second listing never replaces it.
|
|
36
|
-
const first = !!edytor && !uploadOf.has(edytor);
|
|
37
|
-
if (first) uploadOf.set(edytor, options.upload);
|
|
38
|
-
const onPaste = first ? mediaUploads(edytor, 'audio', options.upload) : undefined;
|
|
39
|
-
const labels = labelsWith('media', options.labels);
|
|
40
|
-
mediaLabels.audio.claim(edytor, labels);
|
|
41
|
-
return {
|
|
42
|
-
...(onPaste ? { onPaste } : {}),
|
|
43
|
-
blocks: {
|
|
44
|
-
audio: {
|
|
45
|
-
...mediaKinds.audio,
|
|
46
|
-
snippet: audio,
|
|
47
|
-
element: 'figure',
|
|
48
|
-
presets: [
|
|
49
|
-
{
|
|
50
|
-
label: labels.audio.label,
|
|
51
|
-
icon: '🎵',
|
|
52
|
-
keywords: keywordsOf('block.audio', ['sound', 'music', 'mp3'], options.keywords),
|
|
53
|
-
group: 'Media'
|
|
54
|
-
}
|
|
55
|
-
],
|
|
56
|
-
html: (block, caption) => {
|
|
57
|
-
const src = safeMediaSrc(block.data?.src);
|
|
58
|
-
const media = src ? `<audio src="${escapeHtml(src)}" controls></audio>` : '';
|
|
59
|
-
return `<figure>${media}<figcaption>${caption}</figcaption></figure>`;
|
|
60
|
-
},
|
|
61
|
-
// An `audio` (bare, or in a `figure`) with a safe `src` or `source`.
|
|
62
|
-
parse: (el) => {
|
|
63
|
-
const src = mediaSourceOf(claimed(el, 'audio'));
|
|
64
|
-
return src ? { src } : undefined;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
/** The audio block, links only. */
|
|
72
|
-
export const audioPlugin = createAudioPlugin();
|
|
10
|
+
export const createAudioPlugin = (): Plugin => sourcePlugin('audio', ['sound', 'music', 'mp3']);
|
|
73
11
|
</script>
|
|
74
|
-
|
|
75
|
-
{#snippet audio({ block, content }: BlockSnippetPayload<{ src?: string }>)}
|
|
76
|
-
{@const src = safeMediaSrc(block.data.src)}
|
|
77
|
-
{#if src}
|
|
78
|
-
<div use:block.void data-edytor-audio>
|
|
79
|
-
<audio {src} controls preload="metadata" style="display: block; width: 100%"></audio>
|
|
80
|
-
</div>
|
|
81
|
-
{:else}
|
|
82
|
-
<div use:block.void data-edytor-media-empty>
|
|
83
|
-
<MediaEmpty
|
|
84
|
-
block={block.handle}
|
|
85
|
-
kind="audio"
|
|
86
|
-
icon="🎵"
|
|
87
|
-
accept="audio/*"
|
|
88
|
-
upload={block.handle && uploadOf.get(block.handle.edytor)}
|
|
89
|
-
link={(value) => audioLink(block.handle, value)}
|
|
90
|
-
/>
|
|
91
|
-
</div>
|
|
92
|
-
{/if}
|
|
93
|
-
<!-- The core renders the kind's <figure> around this markup. -->
|
|
94
|
-
<!-- svelte-ignore a11y_figcaption_parent -->
|
|
95
|
-
<figcaption>{@render content()}</figcaption>
|
|
96
|
-
{/snippet}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import type { Plugin } from '../../plugins.js';
|
|
2
|
-
import { type MediaPluginOptions } from './media.js';
|
|
3
2
|
/**
|
|
4
3
|
* Notion's audio block: an audio file (an `http(s)` link, or an upload
|
|
5
4
|
* through `upload`) in the browser's player, with an editable caption.
|
|
6
5
|
* Void: its only text is the caption.
|
|
7
6
|
*/
|
|
8
|
-
export declare const createAudioPlugin: (
|
|
9
|
-
/** The audio block, links only. */
|
|
10
|
-
export declare const audioPlugin: Plugin;
|
|
7
|
+
export declare const createAudioPlugin: () => Plugin;
|
|
11
8
|
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
12
9
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
13
10
|
$$bindings?: Bindings;
|