edytor 1.0.0-rc.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +47 -141
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.d.ts +6 -1
- package/dist/clipboard/htmlFlow.js +26 -13
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +22 -17
- package/dist/cloudflare/DocumentRoom.js +10 -5
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +20 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +9 -30
- package/dist/cloudflare/room/storage.js +52 -104
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +160 -119
- package/dist/components/Block.svelte.d.ts +8 -3
- package/dist/components/Content.svelte +91 -44
- package/dist/components/CustomMark.svelte +46 -0
- package/dist/components/CustomMark.svelte.d.ts +11 -0
- package/dist/components/Edytor.svelte +80 -95
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/InlineBlock.svelte +4 -9
- package/dist/components/Mark.svelte +46 -35
- package/dist/components/Mark.svelte.d.ts +7 -0
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +48 -14
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +8 -13
- package/dist/crdt/data.js +30 -70
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/{plugins/blockHandles → dnd}/autoScroll.d.ts +2 -1
- package/dist/{plugins/blockHandles → dnd}/autoScroll.js +3 -3
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +34 -64
- package/dist/edytor.svelte.js +118 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -184
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +33 -72
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +92 -72
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -13
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +91 -314
- package/dist/labels.js +180 -396
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -151
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +63 -97
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +247 -268
- package/dist/plugins/blockHandles/BlockHandles.svelte +46 -29
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +29 -23
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -162
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +20 -17
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +46 -1
- package/dist/plugins/blockHandles/geometry.js +51 -4
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +59 -28
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +180 -105
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +79 -0
- package/dist/plugins/chrome.js +87 -0
- package/dist/plugins/code/CodeHeader.svelte +12 -58
- package/dist/plugins/code/CodeHeader.svelte.d.ts +1 -0
- package/dist/plugins/code/CodePlugin.svelte +75 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +25 -0
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +9 -0
- package/dist/plugins/code/code.css +5 -100
- package/dist/plugins/code/header.svelte.d.ts +47 -0
- package/dist/plugins/code/header.svelte.js +141 -0
- package/dist/plugins/code/languageMenu.svelte.d.ts +84 -0
- package/dist/plugins/code/languageMenu.svelte.js +199 -0
- package/dist/plugins/code/languages.d.ts +21 -10
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -430
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +6 -7
- package/dist/plugins/comments/commentsPlugin.d.ts +31 -10
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +18 -129
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +2 -1
- package/dist/plugins/equation/EquationPlugin.svelte +123 -168
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +5 -3
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +74 -36
- package/dist/plugins/equation/equation.svelte.js +74 -66
- package/dist/plugins/equation/importUrl.d.ts +6 -0
- package/dist/plugins/equation/importUrl.js +6 -0
- package/dist/plugins/equation/katex.d.ts +8 -0
- package/dist/plugins/equation/katex.js +77 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +5 -151
- package/dist/plugins/image/ImagePlugin.svelte +49 -117
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -24
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -57
- package/dist/plugins/image/controls.svelte.js +51 -174
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +39 -24
- package/dist/plugins/index.js +30 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +15 -0
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +9 -0
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +46 -0
- package/dist/plugins/marquee/MarqueeController.svelte.js +243 -0
- package/dist/plugins/marquee/marquee.d.ts +33 -0
- package/dist/plugins/marquee/marquee.js +89 -0
- package/dist/plugins/marquee/marqueePlugin.d.ts +32 -0
- package/dist/plugins/marquee/marqueePlugin.js +68 -0
- package/dist/plugins/media/AudioPlugin.svelte +3 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +124 -112
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +20 -7
- package/dist/plugins/media/EmbedPlugin.svelte +93 -77
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +21 -9
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +35 -111
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +55 -112
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +69 -0
- package/dist/plugins/media/empty.svelte.js +111 -0
- package/dist/plugins/media/media.d.ts +93 -30
- package/dist/plugins/media/media.js +79 -86
- package/dist/plugins/media/urlPaste.svelte.d.ts +9 -32
- package/dist/plugins/media/urlPaste.svelte.js +46 -75
- package/dist/plugins/mention/MentionPlugin.svelte +47 -124
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +11 -23
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +52 -108
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +11 -23
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +25 -0
- package/dist/plugins/richtext/CalloutIcon.svelte.d.ts +9 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +25 -0
- package/dist/plugins/richtext/EmptyBody.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +272 -148
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +37 -18
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.d.ts +9 -0
- package/dist/plugins/richtext/body.js +16 -0
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +97 -0
- package/dist/plugins/richtext/calloutIcons.svelte.js +214 -0
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +18 -11
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +93 -35
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +11 -24
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +32 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -16
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +96 -127
- package/dist/plugins/table/TableChrome.svelte.d.ts +5 -1
- package/dist/plugins/table/TablePlugin.svelte +116 -171
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +110 -117
- package/dist/plugins/table/chrome.svelte.js +643 -289
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +55 -134
- package/dist/plugins/table/table.d.ts +26 -7
- package/dist/plugins/table/table.js +23 -49
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +29 -66
- package/dist/plugins/toolbar/ToolbarController.svelte.js +151 -76
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +14 -13
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +6 -45
- package/dist/plugins/triggers/TriggerController.svelte.js +51 -96
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +167 -60
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +12 -10
- package/dist/selection/pointer.svelte.js +154 -71
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +263 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +11 -8
- package/dist/selection/visibility.js +23 -8
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +33 -39
- package/dist/session/attempt.js +61 -53
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +18 -3
- package/dist/session/navigation.js +194 -153
- package/dist/session/ports.d.ts +7 -0
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +8 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +64 -47
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +32 -0
- package/dist/surface/lines.js +43 -0
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +73 -77
- package/dist/surface/overlay.d.ts +48 -6
- package/dist/surface/overlay.js +133 -23
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +315 -126
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -525
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -43
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -447
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -116
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -12
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -83
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -7
- package/dist/plugins/richtext/labels.d.ts +0 -5
- package/dist/plugins/richtext/labels.js +0 -3
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -360
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/toolbar/LinkCard.svelte +0 -118
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -7
- package/dist/plugins/toolbar/Toolbar.svelte +0 -400
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -144
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { untrack } from 'svelte';
|
|
2
|
+
import { autoScrollFor } from '../../dnd/autoScroll.js';
|
|
3
|
+
import { blockSelection, noSelection, project } from '../../session/selection.js';
|
|
4
|
+
import { draggable, dropTargetForElements, setCustomNativeDragPreview } from '../../dnd/pragmatic.js';
|
|
4
5
|
import { HIDDEN, hidden } from '../../selection/visibility.js';
|
|
5
6
|
import { getSelectionBlocks, holdsBlocks, movable, outermost, selectMoved, shownText } from '../../selection/replaceSelection.js';
|
|
6
7
|
import { takeKeys } from '../../events/onFocus.js';
|
|
8
|
+
import { EDYTOR_BLOCK_DRAG_MIME } from '../../events/onDrop.js';
|
|
7
9
|
import { kindLabel } from '../../kinds.js';
|
|
8
|
-
import {
|
|
10
|
+
import { siblingSlot } from '../../session/handles.js';
|
|
9
11
|
import { dragPreview } from './dragPreview.js';
|
|
10
12
|
import { DropIndicator } from './dropIndicator.js';
|
|
11
|
-
import { getOwnRowBottom, isBeside, nestIndent, ownRow, ownTextRow } from './geometry.js';
|
|
13
|
+
import { dropReach, getOwnRowBottom, isBeside, marginAt, nestIndent, overEmptyBody, ownRow, ownTextRow } from './geometry.js';
|
|
12
14
|
import { stacks } from '../columns/stacking.js';
|
|
13
|
-
|
|
15
|
+
import { all, listen } from '../../utils/listen.js';
|
|
14
16
|
/**
|
|
15
|
-
* The DOM event a
|
|
16
|
-
*
|
|
17
|
+
* The DOM event a grip click dispatches on the editor (the one way to
|
|
18
|
+
* answer it: the block menu's, or your own). A menu that takes the keyboard answers it with `preventDefault()`
|
|
17
19
|
* (the block menu does); unanswered, the editor takes the focus, so the keys
|
|
18
20
|
* act on the selected block (Backspace deletes it, Shift+arrows extend it).
|
|
19
21
|
*/
|
|
@@ -31,8 +33,9 @@ const keyMoves = {
|
|
|
31
33
|
ArrowRight: 'in',
|
|
32
34
|
ArrowLeft: 'out'
|
|
33
35
|
};
|
|
34
|
-
/** The drop target data
|
|
36
|
+
/** The drop target data keys of the row at the pointer (`rowAt`) and of its half (the top one). */
|
|
35
37
|
const ROW = 'edytorRow';
|
|
38
|
+
const BEFORE = 'edytorBefore';
|
|
36
39
|
/** The drop target data key of a beside band beyond the editor's edges (`margin`). */
|
|
37
40
|
const MARGIN = 'edytorMargin';
|
|
38
41
|
/** How far beside a target's box it stays the drop target (`getIsSticky`), across and along. */
|
|
@@ -41,11 +44,6 @@ const SLOP_Y = 24;
|
|
|
41
44
|
/** The right beside band: the row's last 15% (Notion), at least this many px. */
|
|
42
45
|
const RIGHT_BAND = 0.15;
|
|
43
46
|
const RIGHT_BAND_MIN = 32;
|
|
44
|
-
/**
|
|
45
|
-
* How far the beside bands reach into the page margins, within a row's
|
|
46
|
-
* height: left, beyond the handle column; right, beyond the editor's edge.
|
|
47
|
-
*/
|
|
48
|
-
const MARGIN_X = 120;
|
|
49
47
|
/** The handle column's width when the drag's handle cannot be measured (`+`, grip and gap). */
|
|
50
48
|
const HANDLE_COLUMN = 50;
|
|
51
49
|
/**
|
|
@@ -105,10 +103,6 @@ export class BlockHandleController {
|
|
|
105
103
|
get draggable() {
|
|
106
104
|
return this.options.draggable;
|
|
107
105
|
}
|
|
108
|
-
/** The words the handles say (the plugin's `labels`): read them in a custom `handle`. */
|
|
109
|
-
get labels() {
|
|
110
|
-
return this.options.labels ?? englishLabels.blockHandles;
|
|
111
|
-
}
|
|
112
106
|
/**
|
|
113
107
|
* The block's kind as people read it (`kindLabel`: "Heading 1"), its
|
|
114
108
|
* handle's name; reactive through the block's cell (a Turn into renames it).
|
|
@@ -120,36 +114,54 @@ export class BlockHandleController {
|
|
|
120
114
|
/** The popup the `+` or the grip of `block` opened, while it is open (`edytor.popups`). */
|
|
121
115
|
opened = (block, control) => this.edytor.popups.openedBy(block.id, control);
|
|
122
116
|
/**
|
|
123
|
-
*
|
|
124
|
-
* selects the block and opens its menu,
|
|
117
|
+
* The block's grip (`{@attach handle.grip}`): dragging (when draggable),
|
|
118
|
+
* a click that selects the block and opens its menu, the Alt+arrow moves
|
|
119
|
+
* (`aria-keyshortcuts`), and the ARIA of the menu it opened.
|
|
125
120
|
*/
|
|
126
121
|
grip = (block) => (node) => {
|
|
127
|
-
|
|
122
|
+
node.setAttribute('aria-keyshortcuts', 'Alt+ArrowUp Alt+ArrowDown Alt+ArrowRight Alt+ArrowLeft');
|
|
123
|
+
this.#opener(node, block, 'grip');
|
|
124
|
+
return untrack(() => all(listen(node, 'click', (event) => {
|
|
128
125
|
event.preventDefault();
|
|
129
126
|
event.stopPropagation();
|
|
130
|
-
this
|
|
131
|
-
};
|
|
132
|
-
const pointerdown = (event) => event.stopPropagation();
|
|
133
|
-
const keydown = (event) => this.handleKeyDown(event, block);
|
|
134
|
-
node.addEventListener('click', click);
|
|
135
|
-
node.addEventListener('pointerdown', pointerdown);
|
|
136
|
-
node.addEventListener('keydown', keydown);
|
|
137
|
-
const unregister = this.registerHandle(node, block);
|
|
138
|
-
return {
|
|
139
|
-
destroy: () => {
|
|
140
|
-
node.removeEventListener('click', click);
|
|
141
|
-
node.removeEventListener('pointerdown', pointerdown);
|
|
142
|
-
node.removeEventListener('keydown', keydown);
|
|
143
|
-
unregister();
|
|
144
|
-
}
|
|
145
|
-
};
|
|
127
|
+
this.#activateBlock(block, node);
|
|
128
|
+
}), listen(node, 'pointerdown', (event) => event.stopPropagation()), listen(node, 'keydown', (event) => this.#handleKeyDown(event, block)), this.registerHandle(node, block)));
|
|
146
129
|
};
|
|
130
|
+
/**
|
|
131
|
+
* The block's `+` (`{@attach handle.plus}`): a click offers what to add
|
|
132
|
+
* below (Alt+click above, or a column beside: `addBlock`) under it; a
|
|
133
|
+
* press keeps the editor's focus; the ARIA of the menu it opened.
|
|
134
|
+
*/
|
|
135
|
+
plus = (block) => (node) => {
|
|
136
|
+
this.#opener(node, block, 'add');
|
|
137
|
+
return all(listen(node, 'mousedown', (event) => event.preventDefault()), listen(node, 'pointerdown', (event) => event.stopPropagation()), listen(node, 'click', (event) => {
|
|
138
|
+
event.preventDefault();
|
|
139
|
+
event.stopPropagation();
|
|
140
|
+
this.addBlock(block, event.altKey, node);
|
|
141
|
+
}));
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Keep `node`'s `aria-expanded`, `aria-controls` and `aria-haspopup` in
|
|
145
|
+
* step with the menu its `control` of `block` opened, while it is open.
|
|
146
|
+
*/
|
|
147
|
+
#opener(node, block, control) {
|
|
148
|
+
$effect(() => {
|
|
149
|
+
const popup = this.opened(block, control);
|
|
150
|
+
const values = { expanded: popup && 'true', controls: popup?.id, haspopup: popup?.haspopup };
|
|
151
|
+
for (const [name, value] of Object.entries(values)) {
|
|
152
|
+
if (value === undefined)
|
|
153
|
+
node.removeAttribute(`aria-${name}`);
|
|
154
|
+
else
|
|
155
|
+
node.setAttribute(`aria-${name}`, String(value));
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
147
159
|
/**
|
|
148
160
|
* Select the block — a block selection holding it stays; over a text
|
|
149
161
|
* range across blocks, the blocks it covers (`select`) — and open its
|
|
150
162
|
* menu.
|
|
151
163
|
*/
|
|
152
|
-
activateBlock(block, anchor) {
|
|
164
|
+
#activateBlock(block, anchor) {
|
|
153
165
|
if (this.edytor.readonly || !block.movable)
|
|
154
166
|
return;
|
|
155
167
|
const { selection } = this.edytor;
|
|
@@ -157,10 +169,8 @@ export class BlockHandleController {
|
|
|
157
169
|
if (!selection.selectedBlocks.has(block))
|
|
158
170
|
this.select(block);
|
|
159
171
|
this.gripped = { before, after: selection.value };
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
// Without a callback, a block menu plugin may answer the activation; with
|
|
163
|
-
// none answering, the keys go to the editor, over the block selection
|
|
172
|
+
// A block menu plugin (or the app) may answer the activation; with none
|
|
173
|
+
// answering, the keys go to the editor, over the block selection
|
|
164
174
|
// (Notion), not to the grip (its own focus: not a user gesture).
|
|
165
175
|
const event = new CustomEvent(BLOCK_ACTIVATE_EVENT, {
|
|
166
176
|
cancelable: true,
|
|
@@ -192,15 +202,14 @@ export class BlockHandleController {
|
|
|
192
202
|
const { edytor } = this;
|
|
193
203
|
if (edytor.readonly || !block.parent)
|
|
194
204
|
return;
|
|
195
|
-
this
|
|
205
|
+
this.#ungrip();
|
|
196
206
|
const column = alt && this.addsColumn(block);
|
|
197
207
|
const above = alt && !column;
|
|
198
208
|
const insert = (then) => {
|
|
199
209
|
const { dispatcher, facade, selection, undoManager: um } = edytor;
|
|
200
210
|
const held = selection.value;
|
|
201
211
|
let refused;
|
|
202
|
-
edytor
|
|
203
|
-
edytor.node?.focus({ preventScroll: true });
|
|
212
|
+
takeKeys(edytor);
|
|
204
213
|
// The addition and `then` are one transaction: one update, one undo
|
|
205
214
|
// step. Refused with nothing applied, the addition is taken back inside
|
|
206
215
|
// it, and the history captures nothing (its undo and redo steps stay).
|
|
@@ -209,20 +218,17 @@ export class BlockHandleController {
|
|
|
209
218
|
um.captureTransaction = (tr) => !refused && capture(tr);
|
|
210
219
|
let out;
|
|
211
220
|
try {
|
|
212
|
-
out = dispatcher.run('
|
|
221
|
+
out = dispatcher.run('insertBlocks', () => edytor.transact(() => {
|
|
213
222
|
const type = block.parent && edytor.defaultChild(block.parent);
|
|
214
223
|
if (!type)
|
|
215
224
|
return;
|
|
216
|
-
const spec = { block: { type } };
|
|
217
225
|
const reused = !column && block.type === type && block.isEmpty;
|
|
218
226
|
const target = reused
|
|
219
227
|
? block
|
|
220
|
-
: above
|
|
221
|
-
? block.insertBlockBefore(spec)
|
|
222
|
-
: block.insertBlockAfter(spec);
|
|
228
|
+
: edytor.idToBlock.get(edytor.insertBlocks(siblingSlot(block, !above), [{ type }]).ids[0] ?? '');
|
|
223
229
|
// A new column right of the block's: the one move path places it.
|
|
224
230
|
if (target && column)
|
|
225
|
-
edytor.
|
|
231
|
+
edytor.move({ blocks: [target], target: block, position: 'right' });
|
|
226
232
|
// The caret is the model's: the projector shows it once the block mounts.
|
|
227
233
|
if (target?.firstText)
|
|
228
234
|
dispatcher.caret(target.firstText, 0);
|
|
@@ -235,7 +241,7 @@ export class BlockHandleController {
|
|
|
235
241
|
if (facade.version !== added || (result !== false && last?.status !== 'refused'))
|
|
236
242
|
return result;
|
|
237
243
|
refused =
|
|
238
|
-
last?.status === 'refused' ? last : { operation: '
|
|
244
|
+
last?.status === 'refused' ? last : { operation: 'insertBlocks', status: 'refused' };
|
|
239
245
|
// The take-back of this command's own uncommitted write, not a user command.
|
|
240
246
|
if (!reused)
|
|
241
247
|
facade.apply(facade.prepare.deleteBlocks([target.id]));
|
|
@@ -266,7 +272,7 @@ export class BlockHandleController {
|
|
|
266
272
|
* block's first line — and the `+` holds that one (its menu's Escape
|
|
267
273
|
* gives it back).
|
|
268
274
|
*/
|
|
269
|
-
ungrip() {
|
|
275
|
+
#ungrip() {
|
|
270
276
|
const { gripped } = this;
|
|
271
277
|
this.gripped = null;
|
|
272
278
|
const { selection, facade } = this.edytor;
|
|
@@ -293,7 +299,7 @@ export class BlockHandleController {
|
|
|
293
299
|
element,
|
|
294
300
|
canDrag: () => !this.edytor.readonly && block.movable,
|
|
295
301
|
getInitialData: () => ({ owner: this.owner, blockId: block.id }),
|
|
296
|
-
getInitialDataForExternal: () => ({ [
|
|
302
|
+
getInitialDataForExternal: () => ({ [EDYTOR_BLOCK_DRAG_MIME]: block.id }),
|
|
297
303
|
// The moved blocks are known, and drop targets exist, from the start of
|
|
298
304
|
// our drag (before any target is looked up).
|
|
299
305
|
onGenerateDragPreview: ({ nativeSetDragImage, location }) => {
|
|
@@ -313,8 +319,8 @@ export class BlockHandleController {
|
|
|
313
319
|
});
|
|
314
320
|
}
|
|
315
321
|
for (const [node, target] of this.targets)
|
|
316
|
-
this
|
|
317
|
-
this
|
|
322
|
+
this.#registerDropTarget(node, target);
|
|
323
|
+
this.#registerDropTarget(element.ownerDocument.body, null);
|
|
318
324
|
this.scrolling?.();
|
|
319
325
|
this.scrolling = root ? autoScrollFor(root, (data) => data.owner === this.owner) : null;
|
|
320
326
|
this.indicator.begin(element.ownerDocument);
|
|
@@ -354,7 +360,7 @@ export class BlockHandleController {
|
|
|
354
360
|
return () => { };
|
|
355
361
|
this.targets.set(node, target);
|
|
356
362
|
if (this.dragging)
|
|
357
|
-
this
|
|
363
|
+
this.#registerDropTarget(node, target);
|
|
358
364
|
return () => {
|
|
359
365
|
if (this.targets.get(node) === target)
|
|
360
366
|
this.targets.delete(node);
|
|
@@ -364,9 +370,20 @@ export class BlockHandleController {
|
|
|
364
370
|
this.indicator.clear();
|
|
365
371
|
};
|
|
366
372
|
}
|
|
367
|
-
|
|
373
|
+
/**
|
|
374
|
+
* A block's drop target (`target`), or the page's (`body`, `null`): the
|
|
375
|
+
* editor's margins (Notion, `dnd.reach`), a drop target only where
|
|
376
|
+
* `margin` gives a placement — the handle column left of the blocks, the
|
|
377
|
+
* page margin past it and the one right of the content, up to the drop
|
|
378
|
+
* reach, within the editor's height — so a row is reached from outside it
|
|
379
|
+
* too, row after row; anywhere else the block targets (and their
|
|
380
|
+
* stickiness) stand, and a block target holding the pointer (its sticky
|
|
381
|
+
* slop) answers before the page.
|
|
382
|
+
*/
|
|
383
|
+
#registerDropTarget(node, target) {
|
|
368
384
|
if (this.registered.has(node))
|
|
369
385
|
return;
|
|
386
|
+
const show = ({ location, source }) => this.#showIndicator(node, location, source.data);
|
|
370
387
|
const cleanup = dropTargetForElements({
|
|
371
388
|
element: node,
|
|
372
389
|
// A beside band counts: a row whose halves are both refused still takes it.
|
|
@@ -375,25 +392,28 @@ export class BlockHandleController {
|
|
|
375
392
|
// row at the pointer's height (`margin`): never a placement held from
|
|
376
393
|
// a row passed on the way.
|
|
377
394
|
canDrop: ({ source, input }) => {
|
|
378
|
-
|
|
395
|
+
const dragSource = this.#getDragSource(source.data);
|
|
396
|
+
if (!dragSource)
|
|
397
|
+
return false;
|
|
398
|
+
if (!target)
|
|
399
|
+
return Boolean(this.margin(dragSource, input));
|
|
400
|
+
if (this.#inHandleColumn(input.clientX))
|
|
379
401
|
return false;
|
|
380
|
-
const row = this.rowAt(
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
return Boolean(dragSource && this.beside(dragSource, row, input));
|
|
402
|
+
const row = this.rowAt(dragSource, target, node, input);
|
|
403
|
+
const { before, after } = this.zones(dragSource, row, input);
|
|
404
|
+
return ([...before, ...after].some(this.fits(dragSource)) ||
|
|
405
|
+
Boolean(this.beside(dragSource, row, input)));
|
|
385
406
|
},
|
|
386
|
-
//
|
|
387
|
-
//
|
|
388
|
-
//
|
|
407
|
+
// The row at the pointer and the half of its own row (not its subtree's)
|
|
408
|
+
// the pointer is in: held while the target is sticky (the drag library
|
|
409
|
+
// keeps a sticky record's data).
|
|
389
410
|
getData: ({ source, input }) => {
|
|
390
|
-
const
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
});
|
|
411
|
+
const dragSource = this.#getDragSource(source.data);
|
|
412
|
+
if (!target || !dragSource)
|
|
413
|
+
return { [MARGIN]: true };
|
|
414
|
+
const row = this.rowAt(dragSource, target, node, input);
|
|
415
|
+
const rect = ownRow(row.node);
|
|
416
|
+
return { [ROW]: row.id, [BEFORE]: input.clientY < rect.top + rect.height / 2 };
|
|
397
417
|
},
|
|
398
418
|
// Held while it or a target inside it holds the placement (the drag library
|
|
399
419
|
// keeps an inner target only while every outer one of its chain sticks),
|
|
@@ -401,20 +421,19 @@ export class BlockHandleController {
|
|
|
401
421
|
// the way down (Notion) — never over another block's own row (its parent's,
|
|
402
422
|
// which the drag library would otherwise let it keep), nor over another column.
|
|
403
423
|
getIsSticky: ({ source, input }) => {
|
|
404
|
-
const dragSource = this.getDragSource(source.data);
|
|
405
424
|
const active = this.indicator.target;
|
|
406
|
-
if (!
|
|
425
|
+
if (!target || !this.#getDragSource(source.data) || !active || !node.contains(active))
|
|
407
426
|
return false;
|
|
408
427
|
const rect = node.getBoundingClientRect();
|
|
409
428
|
return (input.clientX >= rect.left - SLOP_X &&
|
|
410
429
|
input.clientX <= rect.right + SLOP_X &&
|
|
411
430
|
input.clientY >= rect.top - SLOP_Y &&
|
|
412
431
|
(input.clientY <= rect.bottom + SLOP_Y || endsDocument(target)) &&
|
|
413
|
-
!this
|
|
432
|
+
!this.#overOtherColumn(target, input.clientX) &&
|
|
414
433
|
!overOtherRow(node, input, (over) => !this.edytor.idToBlock.get(over.dataset.edytorId ?? '')?.isContainer));
|
|
415
434
|
},
|
|
416
|
-
onDragEnter:
|
|
417
|
-
onDrag:
|
|
435
|
+
onDragEnter: show,
|
|
436
|
+
onDrag: show,
|
|
418
437
|
// The target left hands the placement to the innermost one still current (an
|
|
419
438
|
// outer target of its chain that sticks), before the next move asks it to stick.
|
|
420
439
|
onDragLeave: ({ location, source }) => {
|
|
@@ -423,131 +442,85 @@ export class BlockHandleController {
|
|
|
423
442
|
this.indicator.clear();
|
|
424
443
|
const [current] = location.current.dropTargets;
|
|
425
444
|
if (current)
|
|
426
|
-
this
|
|
445
|
+
this.#showIndicator(current.element, location, source.data);
|
|
427
446
|
},
|
|
428
447
|
onDrop: ({ location, source }) => {
|
|
429
448
|
const [current] = location.current.dropTargets;
|
|
430
449
|
if (current?.element !== node)
|
|
431
450
|
return;
|
|
432
|
-
const dragSource = this
|
|
451
|
+
const dragSource = this.#getDragSource(source.data);
|
|
433
452
|
const placement = this.indicator.target === node && this.indicator.placement
|
|
434
453
|
? this.indicator.placement
|
|
435
|
-
: this.placement(current,
|
|
454
|
+
: dragSource && this.placement(current, dragSource, location.current.input);
|
|
436
455
|
this.indicator.clear();
|
|
437
|
-
if (dragSource
|
|
438
|
-
placement &&
|
|
439
|
-
this.canDrop(dragSource, placement.target, placement.position)) {
|
|
440
|
-
const moved = this.moveAndSelect({
|
|
441
|
-
blocks: this.moving(dragSource),
|
|
442
|
-
target: placement.target,
|
|
443
|
-
position: placement.position
|
|
444
|
-
});
|
|
445
|
-
if (moved.length && this.held)
|
|
446
|
-
this.edytor.history.began(this.held);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
});
|
|
450
|
-
this.registered.set(node, cleanup);
|
|
451
|
-
}
|
|
452
|
-
/**
|
|
453
|
-
* The editor's margins (Notion): during our drag, the page (`body`) is a
|
|
454
|
-
* drop target only where `margin` gives a placement — the handle column
|
|
455
|
-
* left of the blocks (a reorder of the row there), the page margin beyond
|
|
456
|
-
* it and the one right of the editor (beside bands), within a row's
|
|
457
|
-
* height — so a row is reached from outside it too, row after row;
|
|
458
|
-
* anywhere else the block targets (and their stickiness) stand.
|
|
459
|
-
*/
|
|
460
|
-
registerMarginTarget(node) {
|
|
461
|
-
if (this.registered.has(node))
|
|
462
|
-
return;
|
|
463
|
-
const cleanup = dropTargetForElements({
|
|
464
|
-
element: node,
|
|
465
|
-
canDrop: ({ source, input }) => {
|
|
466
|
-
const dragSource = this.getDragSource(source.data);
|
|
467
|
-
return Boolean(dragSource && this.margin(dragSource, input));
|
|
468
|
-
},
|
|
469
|
-
getData: () => ({ [MARGIN]: true }),
|
|
470
|
-
onDragEnter: ({ location, source }) => this.showIndicator(node, location, source.data),
|
|
471
|
-
onDrag: ({ location, source }) => this.showIndicator(node, location, source.data),
|
|
472
|
-
onDragLeave: ({ location, source }) => {
|
|
473
|
-
if (this.indicator.target !== node)
|
|
456
|
+
if (!dragSource || !placement)
|
|
474
457
|
return;
|
|
475
|
-
|
|
476
|
-
const
|
|
477
|
-
if (
|
|
478
|
-
this.showIndicator(current.element, location, source.data);
|
|
479
|
-
},
|
|
480
|
-
onDrop: ({ location, source }) => {
|
|
481
|
-
const [current] = location.current.dropTargets;
|
|
482
|
-
if (current?.element !== node)
|
|
458
|
+
const { target, position } = placement;
|
|
459
|
+
const request = { blocks: this.moving(dragSource), target, position };
|
|
460
|
+
if (!this.edytor.canMove(request))
|
|
483
461
|
return;
|
|
484
|
-
const
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
: dragSource && this.margin(dragSource, location.current.input);
|
|
488
|
-
this.indicator.clear();
|
|
489
|
-
if (dragSource &&
|
|
490
|
-
placement &&
|
|
491
|
-
this.canDrop(dragSource, placement.target, placement.position)) {
|
|
492
|
-
const moved = this.moveAndSelect({
|
|
493
|
-
blocks: this.moving(dragSource),
|
|
494
|
-
target: placement.target,
|
|
495
|
-
position: placement.position
|
|
496
|
-
});
|
|
497
|
-
if (moved.length && this.held)
|
|
498
|
-
this.edytor.history.began(this.held);
|
|
499
|
-
}
|
|
462
|
+
const moved = this.#moveAndSelect(request);
|
|
463
|
+
if (moved.length && this.held)
|
|
464
|
+
this.edytor.history.began(this.held);
|
|
500
465
|
}
|
|
501
466
|
});
|
|
502
467
|
this.registered.set(node, cleanup);
|
|
503
468
|
}
|
|
504
469
|
/**
|
|
505
|
-
* The editor's
|
|
506
|
-
*
|
|
507
|
-
* handle, measured: `+`, grip and the gap to the
|
|
470
|
+
* The editor's content column (`start`…`end`, the root's content box:
|
|
471
|
+
* where its blocks' boxes start and end), the width of the handle column
|
|
472
|
+
* left of it (the drag's handle, measured: `+`, grip and the gap to the
|
|
473
|
+
* block) and how far the drag reaches past them (`dropReach`, the
|
|
474
|
+
* `--edytor-drop-reach` the root inherits).
|
|
508
475
|
*/
|
|
509
476
|
gutter(root) {
|
|
510
477
|
const style = root.ownerDocument.defaultView?.getComputedStyle(root);
|
|
511
|
-
const
|
|
512
|
-
|
|
513
|
-
|
|
478
|
+
const rect = root.getBoundingClientRect();
|
|
479
|
+
const px = (value) => parseFloat(value ?? '') || 0;
|
|
480
|
+
const start = rect.left + root.clientLeft + px(style?.paddingLeft);
|
|
481
|
+
const end = rect.right - px(style?.borderRightWidth) - px(style?.paddingRight);
|
|
514
482
|
const width = this.handle?.isConnected ? this.handle.getBoundingClientRect().width : 0;
|
|
515
|
-
return { start, handles: width > 0 ? width : HANDLE_COLUMN };
|
|
483
|
+
return { start, end, handles: width > 0 ? width : HANDLE_COLUMN, reach: dropReach(style) };
|
|
516
484
|
}
|
|
517
485
|
/** Whether `x` is in the handle column left of the editor's blocks (`gutter`): the page target's. */
|
|
518
|
-
inHandleColumn(x) {
|
|
486
|
+
#inHandleColumn(x) {
|
|
519
487
|
const root = this.edytor.node;
|
|
520
|
-
|
|
521
|
-
return false;
|
|
522
|
-
const { start, handles } = this.gutter(root);
|
|
523
|
-
return x < start && x >= start - handles;
|
|
488
|
+
return !!root && marginAt(x, this.gutter(root))?.zone === 'handles';
|
|
524
489
|
}
|
|
525
490
|
/**
|
|
526
|
-
* A placement in the editor's margins at the pointer,
|
|
527
|
-
* editor's
|
|
528
|
-
*
|
|
529
|
-
*
|
|
530
|
-
*
|
|
531
|
-
*
|
|
532
|
-
*
|
|
533
|
-
*
|
|
534
|
-
* the
|
|
535
|
-
*
|
|
491
|
+
* A placement in the editor's margins at the pointer (`dnd.reach`), within
|
|
492
|
+
* the editor's height, for the row the content's near edge shows at the
|
|
493
|
+
* pointer's height (`rowAt`: a nested block's own row; over a layout, the
|
|
494
|
+
* row of its first column on the left, of its last on the right, never
|
|
495
|
+
* another), by the zone the pointer is in (`marginAt`):
|
|
496
|
+
* - the handle column left of the blocks (`gutter`): that row's reorder
|
|
497
|
+
* (`reorder`): a drag straight down the handles reorders, row after
|
|
498
|
+
* row, gaps included (never a beside band);
|
|
499
|
+
* - the first `BESIDE_MARGIN` px past it on the left, and past the
|
|
500
|
+
* content's right edge: the beside band of that side (`beside`, as if
|
|
501
|
+
* the pointer were at that edge) when the document has a layout kind
|
|
502
|
+
* and the row offers one (a refused band shows nothing);
|
|
503
|
+
* - elsewhere within the reach (and there without a band): the reorder,
|
|
504
|
+
* on the left the handle column's, on the right the one the row's
|
|
505
|
+
* right edge offers (its halves as just inside the content, so nothing
|
|
506
|
+
* jumps as the pointer leaves it).
|
|
507
|
+
* `undefined` past the reach, above or below the editor, and inside the
|
|
508
|
+
* content (the blocks' own targets answer there).
|
|
536
509
|
*/
|
|
537
510
|
margin(source, { clientX: x, clientY: y }) {
|
|
538
511
|
const root = this.edytor.node;
|
|
539
|
-
if (!root
|
|
512
|
+
if (!root)
|
|
540
513
|
return undefined;
|
|
541
514
|
const box = root.getBoundingClientRect();
|
|
542
515
|
if (y < box.top || y > box.bottom)
|
|
543
516
|
return undefined;
|
|
544
|
-
const
|
|
545
|
-
const
|
|
546
|
-
|
|
547
|
-
const right = x > box.right && x <= box.right + MARGIN_X;
|
|
548
|
-
if (!handle && (!this.layouts || (!left && !right)))
|
|
517
|
+
const gutter = this.gutter(root);
|
|
518
|
+
const zone = marginAt(x, gutter);
|
|
519
|
+
if (!zone)
|
|
549
520
|
return undefined;
|
|
550
|
-
const
|
|
521
|
+
const right = zone.side === 'right';
|
|
522
|
+
const band = zone.zone === 'beside' && this.layouts;
|
|
523
|
+
const edge = right ? gutter.end - 1 : gutter.start + 1;
|
|
551
524
|
const hits = root.ownerDocument.elementsFromPoint?.(edge, y) ?? [];
|
|
552
525
|
const hit = hits.find((at) => {
|
|
553
526
|
const block = at.closest('[data-edytor-block="true"]');
|
|
@@ -555,16 +528,15 @@ export class BlockHandleController {
|
|
|
555
528
|
});
|
|
556
529
|
const node = hit?.closest('[data-edytor-block="true"]');
|
|
557
530
|
const target = node && this.targets.get(node);
|
|
558
|
-
// Between two rows
|
|
559
|
-
// reorder shown stays, as a block's sticky slop keeps it.
|
|
560
|
-
const shown =
|
|
531
|
+
// Between two rows where the margin reorders (a margin, a layout's
|
|
532
|
+
// edge), the reorder shown stays, as a block's sticky slop keeps it.
|
|
533
|
+
const shown = !band && this.indicator.target === root.ownerDocument.body;
|
|
561
534
|
const held = shown ? this.indicator.placement : null;
|
|
562
535
|
const stay = held && !isBeside(held.position) ? held : undefined;
|
|
563
536
|
if (!node || !target)
|
|
564
537
|
return stay;
|
|
565
|
-
const data = { owner: this.owner, blockId: source.id };
|
|
566
538
|
const { facade } = this.edytor;
|
|
567
|
-
let row = this.rowAt(
|
|
539
|
+
let row = this.rowAt(source, target, node, { clientX: edge, clientY: y });
|
|
568
540
|
// Over a layout's edge, its first or last column's row at that height.
|
|
569
541
|
if (facade.isLayout(row.id)) {
|
|
570
542
|
const items = row.children.filter((item) => item.node && this.targets.has(item.node));
|
|
@@ -572,74 +544,92 @@ export class BlockHandleController {
|
|
|
572
544
|
if (!rect || rect.width === 0)
|
|
573
545
|
return undefined;
|
|
574
546
|
const inner = right ? rect.right - 1 : rect.left + 1;
|
|
575
|
-
row = this.rowAt(
|
|
547
|
+
row = this.rowAt(source, target, node, { clientX: inner, clientY: y });
|
|
576
548
|
}
|
|
577
549
|
if (facade.isLayout(row.id) || !row.node)
|
|
578
550
|
return stay;
|
|
579
|
-
if (
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
551
|
+
if (band) {
|
|
552
|
+
const aside = this.beside(source, row, { clientX: right ? Infinity : -Infinity, clientY: y }, zone.side);
|
|
553
|
+
// A band the document refuses shows nothing; a row offering none (a
|
|
554
|
+
// nested row on the left, a layout that would stack) reorders.
|
|
555
|
+
if (aside !== undefined)
|
|
556
|
+
return aside ?? undefined;
|
|
557
|
+
}
|
|
558
|
+
const rect = ownRow(row.node);
|
|
559
|
+
if (right) {
|
|
560
|
+
const at = { clientX: Math.min(x, rect.right - 1), clientY: y };
|
|
561
|
+
return this.pick(source, this.halves(source, row, at, rect)) ?? undefined;
|
|
562
|
+
}
|
|
563
|
+
return this.reorder(source, row, { clientX: x, clientY: y }) ?? undefined;
|
|
583
564
|
}
|
|
584
565
|
/**
|
|
585
|
-
* The
|
|
586
|
-
*
|
|
587
|
-
*
|
|
588
|
-
* after, only before or after a block — never inside one; `null` when
|
|
589
|
-
* neither half fits. Over an item of a container the dragged blocks do not
|
|
590
|
-
* fit in (a paragraph over a list's item: the document refuses every
|
|
591
|
-
* placement at the item's level), the container is the row: its whole box,
|
|
592
|
-
* the upper half before it, the lower half after it (round 4), so a drag
|
|
593
|
-
* down the handles meets the list as one row it can pass.
|
|
566
|
+
* The halves of `row` (`zones`) at the pointer, the one it is in first:
|
|
567
|
+
* the top half of `rect` (its own row by default) before, the bottom one
|
|
568
|
+
* after; with `plain`, only before or after a block — never inside one.
|
|
594
569
|
*/
|
|
595
|
-
|
|
570
|
+
halves(source, row, input, rect, plain = false) {
|
|
571
|
+
const zones = this.zones(source, row, input);
|
|
572
|
+
const [before, after] = [zones.before, zones.after].map((half) => plain ? half.filter((placement) => placement.position !== 'inside') : half);
|
|
573
|
+
return input.clientY < rect.top + rect.height / 2 ? [before, after] : [after, before];
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* The first placement of `halves` the document takes (a refused one gives
|
|
577
|
+
* way to the next, then to the other half's), `blocked` when the first
|
|
578
|
+
* half took none; `null` when none fits.
|
|
579
|
+
*/
|
|
580
|
+
pick(source, halves) {
|
|
596
581
|
const fits = this.fits(source);
|
|
597
|
-
const halvesOf = (row, rect) => {
|
|
598
|
-
const zones = this.zones(source, row, input);
|
|
599
|
-
const [before, after] = [zones.before, zones.after].map((half) => half.filter((placement) => placement.position !== 'inside'));
|
|
600
|
-
return input.clientY < rect.top + rect.height / 2 ? [before, after] : [after, before];
|
|
601
|
-
};
|
|
602
|
-
let halves = halvesOf(row, ownRow(row.node));
|
|
603
|
-
for (let at = row.parent; !halves[0].some(fits) && at?.node && !at.isRoot && at.isContainer; at = at.parent)
|
|
604
|
-
halves = halvesOf(at, at.node.getBoundingClientRect());
|
|
605
582
|
const placement = halves.flat().find(fits);
|
|
606
583
|
return placement ? { ...placement, blocked: !halves[0].some(fits) } : null;
|
|
607
584
|
}
|
|
585
|
+
/**
|
|
586
|
+
* The handle column's reorder over `row` at the pointer: its plain halves
|
|
587
|
+
* (`halves`, the pointer's x picking the level); `null` when neither half
|
|
588
|
+
* fits. Over an item of a container the dragged blocks do not fit in (a
|
|
589
|
+
* paragraph over a list's item: the document refuses every placement at
|
|
590
|
+
* the item's level), the container is the row: its whole box, the upper
|
|
591
|
+
* half before it, the lower half after it (round 4), so a drag down the
|
|
592
|
+
* handles meets the list as one row it can pass.
|
|
593
|
+
*/
|
|
594
|
+
reorder(source, row, input) {
|
|
595
|
+
const fits = this.fits(source);
|
|
596
|
+
let halves = this.halves(source, row, input, ownRow(row.node), true);
|
|
597
|
+
for (let at = row.parent; !halves[0].some(fits) && at?.node && !at.isRoot && at.isContainer; at = at.parent)
|
|
598
|
+
halves = this.halves(source, at, input, at.node.getBoundingClientRect(), true);
|
|
599
|
+
return this.pick(source, halves);
|
|
600
|
+
}
|
|
608
601
|
/**
|
|
609
602
|
* Alt+arrow: one step for the blocks a drag of this handle moves. A text
|
|
610
603
|
* range over them stays, as Mod+Shift+arrow keeps it; else they end
|
|
611
|
-
* selected as after a drop (
|
|
604
|
+
* selected as after a drop (`#moveAndSelect`).
|
|
612
605
|
*/
|
|
613
|
-
handleKeyDown(event, block) {
|
|
606
|
+
#handleKeyDown(event, block) {
|
|
614
607
|
const direction = event.altKey ? keyMoves[event.key] : undefined;
|
|
615
608
|
if (this.edytor.readonly || !direction)
|
|
616
609
|
return;
|
|
617
610
|
event.preventDefault();
|
|
618
611
|
event.stopPropagation();
|
|
619
612
|
const request = { blocks: this.dragBlocks(block), direction };
|
|
620
|
-
if (this
|
|
621
|
-
this.edytor.
|
|
613
|
+
if (this.#covered(block)?.range)
|
|
614
|
+
this.edytor.move(request);
|
|
622
615
|
else
|
|
623
|
-
this
|
|
616
|
+
this.#moveAndSelect(request);
|
|
624
617
|
}
|
|
625
618
|
/**
|
|
626
619
|
* Move, then select what moved — the drag's rule (`onDragStart`): a group
|
|
627
620
|
* the block selection holds keeps it (a moved block's selected children
|
|
628
621
|
* too); any other group ends selected alone.
|
|
629
622
|
*/
|
|
630
|
-
moveAndSelect(request) {
|
|
623
|
+
#moveAndSelect(request) {
|
|
631
624
|
const { selectedBlocks } = this.edytor.selection;
|
|
632
625
|
// A layout the selection covers whole counts as held: its blocks stay selected.
|
|
633
626
|
const holds = holdsBlocks(selectedBlocks, request.blocks);
|
|
634
627
|
const before = holds ? [...selectedBlocks] : [];
|
|
635
|
-
const moved = this.edytor.
|
|
628
|
+
const moved = this.edytor.move(request);
|
|
636
629
|
if (moved.length)
|
|
637
630
|
selectMoved(this.edytor, moved, before);
|
|
638
631
|
return moved;
|
|
639
632
|
}
|
|
640
|
-
canDrop(source, target, position) {
|
|
641
|
-
return this.edytor.canMoveBlocks({ blocks: this.moving(source), target, position });
|
|
642
|
-
}
|
|
643
633
|
/** The blocks a drop of `source` moves: the drag's own group, fixed when it started. */
|
|
644
634
|
moving(source) {
|
|
645
635
|
// A member a collaborator deleted meanwhile is left out; the others still move.
|
|
@@ -650,23 +640,19 @@ export class BlockHandleController {
|
|
|
650
640
|
* The blocks the selection covers — a block selection's blocks as
|
|
651
641
|
* clicked (a selected list is one block: its item's handle drags the
|
|
652
642
|
* item), or the blocks a text range spans (`getSelectionBlocks`, the
|
|
653
|
-
* resolver Tab and Turn into read), a code line as its code
|
|
654
|
-
* (`movable`) — when `source` is one of them; else
|
|
643
|
+
* resolver Tab and Turn into read; `range`), a code line as its code
|
|
644
|
+
* block (`movable`) — when `source` is one of them; else none.
|
|
655
645
|
*/
|
|
656
|
-
covered(source) {
|
|
657
|
-
const { selectedBlocks,
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
/** Whether a text range (no block selection) covers `source` (`covered`). */
|
|
664
|
-
inRange(source) {
|
|
665
|
-
const { selectedBlocks, state } = this.edytor.selection;
|
|
666
|
-
return (!selectedBlocks.size &&
|
|
667
|
-
!state.isCollapsed &&
|
|
668
|
-
movable(getSelectionBlocks(this.edytor)).includes(source));
|
|
646
|
+
#covered(source) {
|
|
647
|
+
const { selectedBlocks, projection } = this.edytor.selection;
|
|
648
|
+
const range = !selectedBlocks.size;
|
|
649
|
+
if (range && projection.isCollapsed)
|
|
650
|
+
return null;
|
|
651
|
+
const covered = movable(range ? getSelectionBlocks(this.edytor) : selectedBlocks);
|
|
652
|
+
return covered.includes(source) ? { covered, range } : null;
|
|
669
653
|
}
|
|
654
|
+
/** The blocks the selection covers when `source` is one of them, else `source` alone. */
|
|
655
|
+
covered = (source) => this.#covered(source)?.covered ?? [source];
|
|
670
656
|
/**
|
|
671
657
|
* The blocks a drag (or an Alt+arrow) from `source`'s handle moves
|
|
672
658
|
* (Notion): the outermost of those the selection covers (`covered`), in
|
|
@@ -683,23 +669,11 @@ export class BlockHandleController {
|
|
|
683
669
|
*/
|
|
684
670
|
select(source) {
|
|
685
671
|
const { selection } = this.edytor;
|
|
686
|
-
selection.
|
|
672
|
+
const blocks = selection.selectedBlocks.size ? [source] : this.covered(source);
|
|
673
|
+
selection.select(blockSelection(blocks.map((block) => block.id)));
|
|
687
674
|
}
|
|
688
675
|
/** Whether the drag of `source` may land at a placement. */
|
|
689
|
-
fits = (source) => (
|
|
690
|
-
/**
|
|
691
|
-
* The hitbox's operations over `row` for our drag: reorder-before and
|
|
692
|
-
* reorder-after, each `blocked` when the document refuses every
|
|
693
|
-
* placement of that half (`zones`), none outside our drag.
|
|
694
|
-
*/
|
|
695
|
-
operations(data, row, input) {
|
|
696
|
-
const source = this.getDragSource(data);
|
|
697
|
-
if (!source || this.edytor.readonly)
|
|
698
|
-
return {};
|
|
699
|
-
const { before, after } = this.zones(source, row, input);
|
|
700
|
-
const offer = (half) => half.some(this.fits(source)) ? 'available' : 'blocked';
|
|
701
|
-
return { 'reorder-before': offer(before), 'reorder-after': offer(after) };
|
|
702
|
-
}
|
|
676
|
+
fits = (source) => ({ target, position }) => this.edytor.canMove({ blocks: this.moving(source), target, position });
|
|
703
677
|
/**
|
|
704
678
|
* The block whose row the pointer is on over `node`: the last shown drop
|
|
705
679
|
* target in it whose row starts at or above the pointer (beside a nested
|
|
@@ -708,9 +682,8 @@ export class BlockHandleController {
|
|
|
708
682
|
* sit side by side: only the one under the pointer is measured (between
|
|
709
683
|
* two of them, the layout is the row: its gap).
|
|
710
684
|
*/
|
|
711
|
-
rowAt(
|
|
712
|
-
const
|
|
713
|
-
const lift = (row) => (source ? this.emptied(source, row) : row);
|
|
685
|
+
rowAt(source, target, node, { clientX, clientY }) {
|
|
686
|
+
const lift = (row) => this.emptied(source, row);
|
|
714
687
|
if (clientY < getOwnRowBottom(node))
|
|
715
688
|
return lift(target);
|
|
716
689
|
const { facade } = this.edytor;
|
|
@@ -766,7 +739,7 @@ export class BlockHandleController {
|
|
|
766
739
|
* Whether `x` is over a column other than one holding `block`: a sticky
|
|
767
740
|
* target never holds the pointer across a column boundary.
|
|
768
741
|
*/
|
|
769
|
-
overOtherColumn(block, x) {
|
|
742
|
+
#overOtherColumn(block, x) {
|
|
770
743
|
const { facade } = this.edytor;
|
|
771
744
|
for (let at = block; at && !at.isRoot; at = at.parent) {
|
|
772
745
|
if (!facade.isLayoutItem(at.id))
|
|
@@ -799,10 +772,9 @@ export class BlockHandleController {
|
|
|
799
772
|
* nothing.
|
|
800
773
|
*/
|
|
801
774
|
beside(source, row, { clientX: x, clientY: y }, band) {
|
|
802
|
-
if (!row.node ||
|
|
775
|
+
if (!row.node || !this.layouts)
|
|
803
776
|
return undefined;
|
|
804
|
-
|
|
805
|
-
if (group.some((moved) => moved === row || row.isChildOf(moved)))
|
|
777
|
+
if (this.carrier(source, row))
|
|
806
778
|
return undefined;
|
|
807
779
|
const { facade } = this.edytor;
|
|
808
780
|
let placement;
|
|
@@ -866,7 +838,7 @@ export class BlockHandleController {
|
|
|
866
838
|
*/
|
|
867
839
|
emptied(source, row) {
|
|
868
840
|
const group = this.moving(source);
|
|
869
|
-
const parent =
|
|
841
|
+
const parent = this.carrier(source, row)?.parent;
|
|
870
842
|
if (!parent?.node || parent.isRoot || !this.targets.has(parent.node))
|
|
871
843
|
return row;
|
|
872
844
|
const shown = this.shown(parent);
|
|
@@ -887,12 +859,14 @@ export class BlockHandleController {
|
|
|
887
859
|
* moves only its children (they would stay where they are).
|
|
888
860
|
* None over a dragged block's own row or its subtree: released there, the
|
|
889
861
|
* drag changes nothing (its levels would outdent it) — unless it empties
|
|
890
|
-
* its parent's shown children (`emptied`): that parent's row.
|
|
862
|
+
* its parent's shown children (`emptied`): that parent's row. Over the
|
|
863
|
+
* hint of the row's empty body (`body.hint`: an open toggle's, a
|
|
864
|
+
* callout's), inside it first, either half.
|
|
891
865
|
*/
|
|
892
|
-
zones(source, row, { clientX }) {
|
|
893
|
-
|
|
894
|
-
if (group.some((moved) => moved === row || row.isChildOf(moved)))
|
|
866
|
+
zones(source, row, { clientX, clientY }) {
|
|
867
|
+
if (this.carrier(source, row))
|
|
895
868
|
return { before: [], after: [] };
|
|
869
|
+
const group = this.moving(source);
|
|
896
870
|
const at = (target, position) => target?.node ? [{ target, node: target.node, position }] : [];
|
|
897
871
|
const before = at(row, 'before');
|
|
898
872
|
const shown = this.shown(row);
|
|
@@ -915,41 +889,46 @@ export class BlockHandleController {
|
|
|
915
889
|
.flatMap((level) => at(level, 'after'));
|
|
916
890
|
const stays = shown.length > 0 && group.every((moved) => moved.parent === row);
|
|
917
891
|
const inside = stays ? [] : at(row, 'inside');
|
|
892
|
+
if (overEmptyBody(row.node, clientY))
|
|
893
|
+
return { before: [...inside, ...before], after: [...inside, ...after] };
|
|
918
894
|
const nests = clientX > column(row) + nestIndent(row.node);
|
|
919
895
|
return { before, after: nests ? [...inside, ...after] : [...after, ...inside] };
|
|
920
896
|
}
|
|
921
897
|
/**
|
|
922
|
-
* The placement a drop target record offers:
|
|
923
|
-
* first (`beside`; `false` when
|
|
924
|
-
*
|
|
925
|
-
* sticky), the pointer
|
|
898
|
+
* The placement a drop target record offers: the page's margins
|
|
899
|
+
* (`margin`), else a beside band of the row first (`beside`; `false` when
|
|
900
|
+
* the document refuses it: nothing shows), else the row's halves, the one
|
|
901
|
+
* the record took first (held while the target is sticky), the pointer
|
|
902
|
+
* live.
|
|
926
903
|
*/
|
|
927
|
-
placement(record,
|
|
928
|
-
const source = this.getDragSource(data);
|
|
904
|
+
placement(record, source, input) {
|
|
929
905
|
if (record.data[MARGIN])
|
|
930
|
-
return
|
|
931
|
-
const instruction = extractInstruction(record.data);
|
|
906
|
+
return this.margin(source, input) ?? false;
|
|
932
907
|
const row = this.edytor.idToBlock.get(record.data[ROW]);
|
|
933
|
-
if (!
|
|
908
|
+
if (!row?.node)
|
|
934
909
|
return null;
|
|
935
910
|
const aside = this.beside(source, row, input);
|
|
936
911
|
if (aside !== undefined)
|
|
937
912
|
return aside ?? false;
|
|
938
913
|
const { before, after } = this.zones(source, row, input);
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
914
|
+
return this.pick(source, record.data[BEFORE] ? [before, after] : [after, before]);
|
|
915
|
+
}
|
|
916
|
+
/** The dragged block that is `row` or holds it: its row offers nothing (it moves with the drag). */
|
|
917
|
+
carrier(source, row) {
|
|
918
|
+
return this.moving(source).find((moved) => moved === row || row.isChildOf(moved));
|
|
942
919
|
}
|
|
943
|
-
|
|
944
|
-
|
|
920
|
+
/** The block our drag moves from (none in a read-only view). */
|
|
921
|
+
#getDragSource(data) {
|
|
922
|
+
if (data.owner !== this.owner || typeof data.blockId !== 'string' || this.edytor.readonly)
|
|
945
923
|
return null;
|
|
946
924
|
return this.edytor.idToBlock.get(data.blockId) ?? null;
|
|
947
925
|
}
|
|
948
|
-
showIndicator(node, location, data) {
|
|
926
|
+
#showIndicator(node, location, data) {
|
|
949
927
|
const [current] = location.current.dropTargets;
|
|
950
928
|
if (current?.element !== node)
|
|
951
929
|
return;
|
|
952
|
-
const
|
|
930
|
+
const source = this.#getDragSource(data);
|
|
931
|
+
const placement = source && this.placement(current, source, location.current.input);
|
|
953
932
|
// A refused beside band shows nothing.
|
|
954
933
|
if (placement === false)
|
|
955
934
|
return this.indicator.clear();
|