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
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import type { BlockHandleController } from './BlockHandleController.svelte.js';
|
|
11
11
|
import { gapBefore, handleSpan } from '../columns/gaps.js';
|
|
12
12
|
import { renderSkipped, rendered } from '../../surface/overlay.js';
|
|
13
|
+
import { getOwnRowBottom } from './geometry.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* The handles, in the overlay: one per registered movable block that
|
|
@@ -33,8 +34,8 @@
|
|
|
33
34
|
near: ReadonlySet<string>;
|
|
34
35
|
/** Blocks under the pointer; reactive. */
|
|
35
36
|
hovered: ReadonlySet<string>;
|
|
36
|
-
/**
|
|
37
|
-
handle
|
|
37
|
+
/** The app's handle (`BlockHandlesOptions.handle`). */
|
|
38
|
+
handle: Snippet<[BlockHandleSnippetPayload]>;
|
|
38
39
|
} = $props();
|
|
39
40
|
|
|
40
41
|
/** The block whose handle holds focus: its handle stays while focused. */
|
|
@@ -47,20 +48,27 @@
|
|
|
47
48
|
if (change.order.size || change.added.size || change.removed.size) structure++;
|
|
48
49
|
})
|
|
49
50
|
);
|
|
51
|
+
/**
|
|
52
|
+
* The few blocks that show a handle, sorted into document order: never a
|
|
53
|
+
* walk of the whole document (a structural commit on a long page).
|
|
54
|
+
*/
|
|
50
55
|
const ids = $derived.by(() => {
|
|
51
56
|
void structure;
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
);
|
|
57
|
+
const shown = new Set([...near, ...hovered]);
|
|
58
|
+
for (const block of edytor.selection.selectedBlocks) shown.add(block.id);
|
|
59
|
+
if (focused !== null) shown.add(focused);
|
|
60
|
+
if (controller.dragging) shown.add(controller.dragging);
|
|
61
|
+
// Document order by index paths (O(depth) each): no whole-document order is rebuilt.
|
|
62
|
+
const paths = new Map<string, number[]>();
|
|
63
|
+
for (const id of shown) {
|
|
64
|
+
const path = blocks.has(id) ? edytor.facade.pathOf(id) : null;
|
|
65
|
+
if (path) paths.set(id, path);
|
|
66
|
+
}
|
|
67
|
+
const before = (a: number[], b: number[]) => {
|
|
68
|
+
for (let i = 0; i < Math.min(a.length, b.length); i++) if (a[i] !== b[i]) return a[i] - b[i];
|
|
69
|
+
return a.length - b.length;
|
|
70
|
+
};
|
|
71
|
+
return [...paths.keys()].sort((a, b) => before(paths.get(a)!, paths.get(b)!));
|
|
64
72
|
});
|
|
65
73
|
|
|
66
74
|
/** The blocks whose handle sits over a gap between two columns (`overGap`, measured). */
|
|
@@ -78,16 +86,6 @@
|
|
|
78
86
|
return gapBefore(column);
|
|
79
87
|
};
|
|
80
88
|
|
|
81
|
-
/** Where a block's own row ends: where its first shown child begins, else its box's bottom. */
|
|
82
|
-
const ownRowBottom = (node: HTMLElement, rect: DOMRect) => {
|
|
83
|
-
const child = node
|
|
84
|
-
.querySelector<HTMLElement>('[data-edytor-block="true"]')
|
|
85
|
-
?.getBoundingClientRect();
|
|
86
|
-
return child && child.height > 0 && child.top >= rect.top && child.top < rect.bottom
|
|
87
|
-
? child.top
|
|
88
|
-
: rect.bottom;
|
|
89
|
-
};
|
|
90
|
-
|
|
91
89
|
const firstRowCenter = (node: HTMLElement, block: Block): number => {
|
|
92
90
|
if (block.definition.island) {
|
|
93
91
|
const header = node.querySelector<HTMLElement>(':scope > [data-edytor-void="true"]');
|
|
@@ -131,7 +129,7 @@
|
|
|
131
129
|
// the host's top, which is centered on the first line.
|
|
132
130
|
const span = gap ? `${handleSpan(gap, rect.left)}px` : '';
|
|
133
131
|
const row = gap
|
|
134
|
-
? `${rect.top - (center - host.offsetHeight / 2)}px ${
|
|
132
|
+
? `${rect.top - (center - host.offsetHeight / 2)}px ${getOwnRowBottom(node, rect) - rect.top}px`
|
|
135
133
|
: '';
|
|
136
134
|
const next = shown ? `${left} ${top} ${row} ${span}` : 'none';
|
|
137
135
|
if (next === at) return;
|
|
@@ -218,10 +216,6 @@
|
|
|
218
216
|
padding-inline-end: 0;
|
|
219
217
|
}
|
|
220
218
|
|
|
221
|
-
[data-edytor-block-handle-host][data-over-gap='true'] :global(.edytor-block-add) {
|
|
222
|
-
width: 18px;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
219
|
[data-edytor-block-handle-host][data-over-gap='true']::before {
|
|
226
220
|
content: '';
|
|
227
221
|
position: absolute;
|
|
@@ -244,4 +238,27 @@
|
|
|
244
238
|
padding-inline-end: 0;
|
|
245
239
|
}
|
|
246
240
|
}
|
|
241
|
+
|
|
242
|
+
/* Where a handle's drag lands (`DropIndicator`): the bar (4px) and the nest
|
|
243
|
+
* backdrop, placed in the overlay and shown (`data-shown`) by the plugin;
|
|
244
|
+
* their look is a theme's (`edytor/themes/notion.css`). */
|
|
245
|
+
:global([data-edytor-drop-indicator]),
|
|
246
|
+
:global([data-edytor-drop-backdrop]) {
|
|
247
|
+
position: absolute;
|
|
248
|
+
pointer-events: none;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
:global([data-edytor-drop-indicator]) {
|
|
252
|
+
z-index: 100;
|
|
253
|
+
box-sizing: border-box;
|
|
254
|
+
height: 4px;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
:global([data-edytor-drop-backdrop]) {
|
|
258
|
+
z-index: 99;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
:global([data-edytor-drop-backdrop]:not([data-shown='true'])) {
|
|
262
|
+
visibility: hidden;
|
|
263
|
+
}
|
|
247
264
|
</style>
|
|
@@ -12,8 +12,8 @@ type $$ComponentProps = {
|
|
|
12
12
|
near: ReadonlySet<string>;
|
|
13
13
|
/** Blocks under the pointer; reactive. */
|
|
14
14
|
hovered: ReadonlySet<string>;
|
|
15
|
-
/**
|
|
16
|
-
handle
|
|
15
|
+
/** The app's handle (`BlockHandlesOptions.handle`). */
|
|
16
|
+
handle: Snippet<[BlockHandleSnippetPayload]>;
|
|
17
17
|
};
|
|
18
18
|
declare const BlockHandles: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
19
19
|
type BlockHandles = ReturnType<typeof BlockHandles>;
|
|
@@ -1,50 +1,56 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { Plugin } from '../../plugins.js';
|
|
3
3
|
import type { Block } from '../../block/block.svelte.js';
|
|
4
|
-
import {
|
|
5
|
-
export type BlockHandleActivation = {
|
|
6
|
-
block: Block;
|
|
7
|
-
anchor: HTMLElement;
|
|
8
|
-
};
|
|
4
|
+
import type { Attachment } from 'svelte/attachments';
|
|
9
5
|
/** What a `handle` snippet receives. */
|
|
10
6
|
export type BlockHandleSnippetPayload = {
|
|
11
7
|
block: Block;
|
|
12
8
|
/** The block's kind as people read it ("Heading 1", its preset's label): name your controls with it. */
|
|
13
9
|
label: string;
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
/**
|
|
11
|
+
* The grip's attachment (`{@attach handle.grip}`): the drag source, a
|
|
12
|
+
* click that opens the block's menu, the Alt+arrow moves
|
|
13
|
+
* (`aria-keyshortcuts`), and the ARIA of the menu it opened
|
|
14
|
+
* (`aria-expanded`, `aria-controls`, `aria-haspopup`).
|
|
15
|
+
*/
|
|
16
|
+
grip: Attachment<HTMLElement>;
|
|
17
|
+
/**
|
|
18
|
+
* The `+`'s attachment (`{@attach handle.plus}`): a click calls `add`
|
|
19
|
+
* (Alt+click with `true`) with the `+` as the anchor, a press keeps the
|
|
20
|
+
* editor's focus, and the ARIA of the menu it opened.
|
|
21
|
+
*/
|
|
22
|
+
plus: Attachment<HTMLElement>;
|
|
18
23
|
/**
|
|
19
24
|
* The `+`: the slash menu offers what to add below; with `true` (Alt+click)
|
|
20
25
|
* above, or, for a block directly in a layout's column, in a new column
|
|
21
|
-
* right of its column. Nothing is added until a row is picked.
|
|
26
|
+
* right of its column. Nothing is added until a row is picked. The menu
|
|
27
|
+
* opens under `anchor` (your `+`: `event.currentTarget`), else under the
|
|
28
|
+
* block.
|
|
29
|
+
*/
|
|
30
|
+
add: (alt?: boolean, anchor?: HTMLElement | null) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Alt+click on the `+` adds a column right of the block's (a block
|
|
33
|
+
* directly in a layout's column): name your `+` with it.
|
|
22
34
|
*/
|
|
23
|
-
|
|
24
|
-
/** Whether the block takes a `+`: always `true` (a block in a column too, as Notion). */
|
|
25
|
-
addable: boolean;
|
|
35
|
+
beside: boolean;
|
|
26
36
|
readonly: boolean;
|
|
27
37
|
draggable: boolean;
|
|
28
38
|
};
|
|
29
39
|
export type BlockHandlesOptions = {
|
|
30
40
|
/** Keep the handle and its keyboard actions, but omit pointer dragging and drop targets. */
|
|
31
41
|
draggable?: boolean;
|
|
32
|
-
|
|
33
|
-
|
|
42
|
+
/**
|
|
43
|
+
* The `+` and ⋮⋮ beside each block, and their words (without it, no
|
|
44
|
+
* handle shows and no block drags); placement and hover are the plugin's.
|
|
45
|
+
*/
|
|
34
46
|
handle?: Snippet<[BlockHandleSnippetPayload]>;
|
|
35
|
-
/** The handles' accessible names and tooltips, over the English ones. */
|
|
36
|
-
labels?: PartialLabels<'blockHandles'>;
|
|
37
47
|
};
|
|
38
|
-
/** Recognize both the default and configured handle plugins during component composition. */
|
|
39
|
-
export declare const isBlockHandlesPlugin: (plugin: Plugin) => boolean;
|
|
40
48
|
/**
|
|
41
49
|
* Block handles in the overlay, created lazily: a handle mounts
|
|
42
|
-
* for a block near the viewport (`
|
|
43
|
-
* hidden; every block without layout),
|
|
50
|
+
* for a block near the viewport (the overlay's `near` top-level blocks and
|
|
51
|
+
* the blocks inside them, not hidden; every block without layout),
|
|
44
52
|
* under the pointer, selected, focused or dragged; drop targets exist only
|
|
45
53
|
* during our own drag. Hover is one delegated listener on the editor and
|
|
46
54
|
* one on the overlay (a block's handle keeps it hovered).
|
|
47
55
|
*/
|
|
48
56
|
export declare const createBlockHandlesPlugin: (options?: BlockHandlesOptions) => Plugin;
|
|
49
|
-
/** Default handles for consumers that add the plugin directly. */
|
|
50
|
-
export declare const blockHandlesPlugin: Plugin;
|
|
@@ -2,180 +2,148 @@ import { mount, unmount } from 'svelte';
|
|
|
2
2
|
import { SvelteMap, SvelteSet } from 'svelte/reactivity';
|
|
3
3
|
import BlockHandles from './BlockHandles.svelte';
|
|
4
4
|
import { BlockHandleController } from './BlockHandleController.svelte.js';
|
|
5
|
-
import { labelsWith } from '../../labels.js';
|
|
6
5
|
import { hidden } from '../../selection/visibility.js';
|
|
7
|
-
|
|
8
|
-
/** Recognize both the default and configured handle plugins during component composition. */
|
|
9
|
-
export const isBlockHandlesPlugin = (plugin) => handlePlugins.has(plugin);
|
|
10
|
-
/**
|
|
11
|
-
* Where a handle mounts: a block within one screen of the viewport, above or
|
|
12
|
-
* below. Without layout (no `IntersectionObserver`: a DOM without a
|
|
13
|
-
* renderer), every block is near.
|
|
14
|
-
*/
|
|
15
|
-
const NEAR_SCREENS = 1;
|
|
16
|
-
/**
|
|
17
|
-
* The top-level blocks near the viewport, by a binary search over their
|
|
18
|
-
* boxes (document order is vertical order at the top level): reads
|
|
19
|
-
* O(log n) boxes a frame, where an observer of every block computed them all
|
|
20
|
-
* after each layout change.
|
|
21
|
-
*/
|
|
22
|
-
const nearTop = (blocks, screen) => {
|
|
23
|
-
const top = -NEAR_SCREENS * screen;
|
|
24
|
-
const bottom = (1 + NEAR_SCREENS) * screen;
|
|
25
|
-
const box = (block) => block.node?.getBoundingClientRect();
|
|
26
|
-
let lo = 0;
|
|
27
|
-
let hi = blocks.length;
|
|
28
|
-
while (lo < hi) {
|
|
29
|
-
const mid = (lo + hi) >> 1;
|
|
30
|
-
const at = box(blocks[mid]);
|
|
31
|
-
if (!at || at.bottom < top)
|
|
32
|
-
lo = mid + 1;
|
|
33
|
-
else
|
|
34
|
-
hi = mid;
|
|
35
|
-
}
|
|
36
|
-
const first = lo;
|
|
37
|
-
hi = blocks.length;
|
|
38
|
-
while (lo < hi) {
|
|
39
|
-
const mid = (lo + hi) >> 1;
|
|
40
|
-
const at = box(blocks[mid]);
|
|
41
|
-
if (!at || at.top <= bottom)
|
|
42
|
-
lo = mid + 1;
|
|
43
|
-
else
|
|
44
|
-
hi = mid;
|
|
45
|
-
}
|
|
46
|
-
return blocks.slice(first, lo);
|
|
47
|
-
};
|
|
6
|
+
import { all, listen } from '../../utils/listen.js';
|
|
48
7
|
/**
|
|
49
8
|
* Block handles in the overlay, created lazily: a handle mounts
|
|
50
|
-
* for a block near the viewport (`
|
|
51
|
-
* hidden; every block without layout),
|
|
9
|
+
* for a block near the viewport (the overlay's `near` top-level blocks and
|
|
10
|
+
* the blocks inside them, not hidden; every block without layout),
|
|
52
11
|
* under the pointer, selected, focused or dragged; drop targets exist only
|
|
53
12
|
* during our own drag. Hover is one delegated listener on the editor and
|
|
54
13
|
* one on the overlay (a block's handle keeps it hovered).
|
|
55
14
|
*/
|
|
56
|
-
export const createBlockHandlesPlugin = (options = {}) => {
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
15
|
+
export const createBlockHandlesPlugin = (options = {}) => (edytor) => {
|
|
16
|
+
const controller = new BlockHandleController(edytor, {
|
|
17
|
+
draggable: options.draggable !== false
|
|
18
|
+
});
|
|
19
|
+
const blocks = new SvelteMap();
|
|
20
|
+
const near = new SvelteSet();
|
|
21
|
+
const hovered = new SvelteSet();
|
|
22
|
+
/** Layout is computed (a browser): the near band is measured, else every block is near. */
|
|
23
|
+
const measured = typeof IntersectionObserver !== 'undefined';
|
|
24
|
+
/** The blocks the band gained, mounted after the frame's paint (`afterPaint`). */
|
|
25
|
+
let gained = null;
|
|
26
|
+
let afterPaint;
|
|
27
|
+
/**
|
|
28
|
+
* Browser rule `handles.after-paint` (one named timer): a handle the band
|
|
29
|
+
* gains mounts in a task queued from the overlay's frame, so after that
|
|
30
|
+
* frame's paint: a key that adds a block (Enter, a paste) paints its text
|
|
31
|
+
* first, the new blocks' handles a frame later. A handle the band loses
|
|
32
|
+
* goes at once; hovered, selected and focused handles do not wait.
|
|
33
|
+
*/
|
|
34
|
+
const mountGained = () => {
|
|
35
|
+
afterPaint = undefined;
|
|
36
|
+
const ids = gained;
|
|
37
|
+
gained = null;
|
|
38
|
+
if (ids)
|
|
39
|
+
for (const id of ids)
|
|
40
|
+
if (blocks.has(id) && !near.has(id))
|
|
41
|
+
near.add(id);
|
|
42
|
+
};
|
|
43
|
+
/** The near band, measured on the overlay's frames (a scroll, a resize, a commit). */
|
|
44
|
+
const measureNear = () => {
|
|
45
|
+
const next = new Set();
|
|
46
|
+
const visit = (block) => {
|
|
47
|
+
if (blocks.has(block.id) && !hidden(block))
|
|
48
|
+
next.add(block.id);
|
|
49
|
+
for (const child of block.children)
|
|
50
|
+
visit(child);
|
|
92
51
|
};
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const target = event.target;
|
|
101
|
-
const handle = target?.closest?.('[data-edytor-block-handle-host]');
|
|
102
|
-
const start = handle
|
|
103
|
-
? blocks.get(handle.dataset.blockId ?? '')?.node
|
|
104
|
-
: target?.closest?.('[data-edytor-block="true"]');
|
|
105
|
-
const next = new Set();
|
|
106
|
-
for (let node = start; node; node = node.parentElement?.closest('[data-edytor-block="true"]')) {
|
|
107
|
-
const id = ids.get(node);
|
|
108
|
-
if (id)
|
|
109
|
-
next.add(id);
|
|
110
|
-
}
|
|
111
|
-
for (const id of hovered)
|
|
52
|
+
for (const node of edytor.overlay.near) {
|
|
53
|
+
const block = edytor.idToBlock.get(node.dataset.edytorId ?? '');
|
|
54
|
+
if (block?.node === node)
|
|
55
|
+
visit(block);
|
|
56
|
+
}
|
|
57
|
+
return () => {
|
|
58
|
+
for (const id of near)
|
|
112
59
|
if (!next.has(id))
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const hoverOverlay = (event) => {
|
|
119
|
-
if (event.target?.closest?.('[data-edytor-block-handle-host]'))
|
|
120
|
-
hover(event);
|
|
60
|
+
near.delete(id);
|
|
61
|
+
const add = [...next].filter((id) => !near.has(id));
|
|
62
|
+
gained = add.length ? new Set(add) : null;
|
|
63
|
+
if (gained)
|
|
64
|
+
afterPaint ??= setTimeout(mountGained);
|
|
121
65
|
};
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* The blocks under the pointer that have a handle: the hovered block and
|
|
69
|
+
* its handled ancestors (a layout and its columns have none). Over a
|
|
70
|
+
* block's handle (in the overlay), that block: a block stays hovered
|
|
71
|
+
* while the pointer goes from its text to its handle and stays there.
|
|
72
|
+
*/
|
|
73
|
+
const hover = (event) => {
|
|
74
|
+
const target = event.target;
|
|
75
|
+
const handle = target?.closest?.('[data-edytor-block-handle-host]');
|
|
76
|
+
const start = handle
|
|
77
|
+
? blocks.get(handle.dataset.blockId ?? '')?.node
|
|
78
|
+
: target?.closest?.('[data-edytor-block="true"]');
|
|
79
|
+
const next = new Set();
|
|
80
|
+
for (let node = start; node; node = node.parentElement?.closest('[data-edytor-block="true"]')) {
|
|
81
|
+
const id = node.dataset.edytorId ?? '';
|
|
82
|
+
if (blocks.get(id)?.node === node)
|
|
83
|
+
next.add(id);
|
|
84
|
+
}
|
|
85
|
+
for (const id of hovered)
|
|
86
|
+
if (!next.has(id))
|
|
87
|
+
hovered.delete(id);
|
|
88
|
+
for (const id of next)
|
|
89
|
+
hovered.add(id);
|
|
90
|
+
};
|
|
91
|
+
/** In the overlay, only a handle names a block; other chrome (a resize strip, a menu) keeps the hover. */
|
|
92
|
+
const hoverOverlay = (event) => {
|
|
93
|
+
if (event.target?.closest?.('[data-edytor-block-handle-host]'))
|
|
94
|
+
hover(event);
|
|
95
|
+
};
|
|
96
|
+
/** The pointer left the editor and its overlay (not one for the other): nothing is hovered. */
|
|
97
|
+
const unhover = (event) => {
|
|
98
|
+
const to = event.relatedTarget;
|
|
99
|
+
if (to && (edytor.node?.contains(to) || edytor.overlay.layer?.contains(to)))
|
|
100
|
+
return;
|
|
101
|
+
hovered.clear();
|
|
102
|
+
};
|
|
103
|
+
return {
|
|
104
|
+
onEdytorAttached: ({ node }) => {
|
|
105
|
+
const layer = edytor.overlay.layer;
|
|
106
|
+
const offPointer = all(listen(node, 'pointerover', hover), listen(node, 'pointerleave', unhover), listen(layer, 'pointerover', hoverOverlay), listen(layer, 'pointerleave', unhover));
|
|
107
|
+
const offNear = measured ? edytor.overlay.add(measureNear) : undefined;
|
|
108
|
+
const { handle } = options;
|
|
109
|
+
const component = handle &&
|
|
110
|
+
mount(BlockHandles, {
|
|
138
111
|
target: layer,
|
|
139
|
-
props: { edytor, controller, blocks, near, hovered, handle
|
|
112
|
+
props: { edytor, controller, blocks, near, hovered, handle }
|
|
140
113
|
});
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
114
|
+
return () => {
|
|
115
|
+
offPointer();
|
|
116
|
+
offNear?.();
|
|
117
|
+
clearTimeout(afterPaint);
|
|
118
|
+
afterPaint = undefined;
|
|
119
|
+
gained = null;
|
|
120
|
+
if (component)
|
|
147
121
|
void unmount(component);
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
};
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
onBlockAttached: ({ node, block }) => {
|
|
125
|
+
// A table's rows move by its own row menus, its cells never (`table.fits`).
|
|
126
|
+
if (!block.movable || edytor.facade.isTableRow(block.id))
|
|
127
|
+
return;
|
|
128
|
+
const offDropTarget = controller.addDropTarget(node, block);
|
|
129
|
+
// A layout and its columns are drop targets but have no handle (as
|
|
130
|
+
// Notion): a block selection covering a layout stands for it.
|
|
131
|
+
const { facade } = edytor;
|
|
132
|
+
if (facade.isLayout(block.id) || facade.isLayoutItem(block.id))
|
|
133
|
+
return offDropTarget;
|
|
134
|
+
blocks.set(block.id, block);
|
|
135
|
+
if (measured)
|
|
136
|
+
edytor.overlay.invalidate();
|
|
137
|
+
else
|
|
138
|
+
near.add(block.id);
|
|
139
|
+
return () => {
|
|
140
|
+
offDropTarget();
|
|
141
|
+
if (block.node === node || block.node === undefined) {
|
|
142
|
+
blocks.delete(block.id);
|
|
143
|
+
near.delete(block.id);
|
|
144
|
+
hovered.delete(block.id);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
176
148
|
};
|
|
177
|
-
handlePlugins.add(plugin);
|
|
178
|
-
return plugin;
|
|
179
149
|
};
|
|
180
|
-
/** Default handles for consumers that add the plugin directly. */
|
|
181
|
-
export const blockHandlesPlugin = createBlockHandlesPlugin();
|
|
@@ -21,13 +21,15 @@ export type DragPreview = {
|
|
|
21
21
|
/**
|
|
22
22
|
* The ghost of `nodes` (the dragged blocks' elements, in document order),
|
|
23
23
|
* grabbed at `pointer`: a copy of each block laid out at its own width (the
|
|
24
|
-
* widest of them;
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
24
|
+
* widest of them; `MAX_WIDTH` when none is laid out), scaled by `SCALE` from its top left, cut at `MAX_HEIGHT`.
|
|
25
|
+
* With `columns` (a table row's or column's cells, `table.drag`), the copies
|
|
26
|
+
* are laid out in a grid of columns that wide, row after row. Nothing is
|
|
27
|
+
* added (no card, background, shadow, opacity, fade or count badge): the
|
|
28
|
+
* blocks' own look. The pointer keeps its place on the first block (a
|
|
29
|
+
* handle is left of it: a transparent gutter keeps the offset positive,
|
|
30
|
+
* which every browser supports).
|
|
29
31
|
*/
|
|
30
32
|
export declare const dragPreview: (root: HTMLElement, nodes: HTMLElement[], pointer: {
|
|
31
33
|
clientX: number;
|
|
32
34
|
clientY: number;
|
|
33
|
-
}) => DragPreview;
|
|
35
|
+
}, columns?: number[]) => DragPreview;
|
|
@@ -11,9 +11,10 @@ const MAX_WIDTH = 600;
|
|
|
11
11
|
const MAX_HEIGHT = 300;
|
|
12
12
|
/** The ghost is the blocks' own look, only smaller. */
|
|
13
13
|
const SCALE = 0.8;
|
|
14
|
-
/** View-only nodes a clone drops: render anchors, suggestions, peers' carets, handles and overlay. */
|
|
14
|
+
/** View-only nodes a clone drops: render anchors, empty-body hints, suggestions, peers' carets, handles and overlay. */
|
|
15
15
|
const VIEW_ONLY = [
|
|
16
16
|
'[data-edytor-render-anchor]',
|
|
17
|
+
'[data-edytor-empty-body]',
|
|
17
18
|
'[data-edytor-text-suggestion]',
|
|
18
19
|
'[data-edytor-suggestion]',
|
|
19
20
|
'[data-edytor-remote-cursor]',
|
|
@@ -148,31 +149,33 @@ const themed = (root, content) => {
|
|
|
148
149
|
scope.append(shell);
|
|
149
150
|
return scope;
|
|
150
151
|
};
|
|
151
|
-
/** The root's content width, capped (`MAX_WIDTH`). */
|
|
152
|
-
const contentWidth = (root) => {
|
|
153
|
-
const style = root.ownerDocument.defaultView?.getComputedStyle(root);
|
|
154
|
-
const padding = style ? parseFloat(style.paddingLeft) + parseFloat(style.paddingRight) : 0;
|
|
155
|
-
const width = root.clientWidth - (padding || 0);
|
|
156
|
-
return width > 0 ? Math.min(width, MAX_WIDTH) : MAX_WIDTH;
|
|
157
|
-
};
|
|
158
152
|
/**
|
|
159
153
|
* The ghost of `nodes` (the dragged blocks' elements, in document order),
|
|
160
154
|
* grabbed at `pointer`: a copy of each block laid out at its own width (the
|
|
161
|
-
* widest of them;
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
155
|
+
* widest of them; `MAX_WIDTH` when none is laid out), scaled by `SCALE` from its top left, cut at `MAX_HEIGHT`.
|
|
156
|
+
* With `columns` (a table row's or column's cells, `table.drag`), the copies
|
|
157
|
+
* are laid out in a grid of columns that wide, row after row. Nothing is
|
|
158
|
+
* added (no card, background, shadow, opacity, fade or count badge): the
|
|
159
|
+
* blocks' own look. The pointer keeps its place on the first block (a
|
|
160
|
+
* handle is left of it: a transparent gutter keeps the offset positive,
|
|
161
|
+
* which every browser supports).
|
|
166
162
|
*/
|
|
167
|
-
export const dragPreview = (root, nodes, pointer) => {
|
|
163
|
+
export const dragPreview = (root, nodes, pointer, columns) => {
|
|
168
164
|
const { ownerDocument: document } = root;
|
|
169
165
|
const first = nodes[0]?.getBoundingClientRect();
|
|
170
166
|
const dx = first ? pointer.clientX - first.left : 0;
|
|
171
167
|
const dy = first ? pointer.clientY - first.top : 0;
|
|
172
|
-
// Each block at its own width (a column's block at its column's), capped.
|
|
173
|
-
const own =
|
|
174
|
-
|
|
168
|
+
// Each block at its own width (a column's block at its column's), capped (the cap where none is laid out).
|
|
169
|
+
const own = columns
|
|
170
|
+
? columns.reduce((sum, w) => sum + w, 0)
|
|
171
|
+
: Math.max(0, ...nodes.map((node) => node.getBoundingClientRect().width));
|
|
172
|
+
const width = Math.min(own || MAX_WIDTH, MAX_WIDTH);
|
|
175
173
|
const list = document.createElement('div');
|
|
174
|
+
if (columns)
|
|
175
|
+
Object.assign(list.style, {
|
|
176
|
+
display: 'grid',
|
|
177
|
+
gridTemplateColumns: columns.map((w) => `${w}px`).join(' ')
|
|
178
|
+
});
|
|
176
179
|
let shown = 0;
|
|
177
180
|
for (const node of nodes) {
|
|
178
181
|
// Past the cap nothing more shows: the rest is not cloned.
|