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,18 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The selection under a pointer (`selection.pointer`): a press and its drag
|
|
3
|
-
* (`dragStart`, the drag's release, a normalization it held back), a press
|
|
4
|
-
* on a block's non-editable chrome, a triple click, a drag across columns
|
|
5
|
-
* (`acrossColumns`), a drag over inline atoms and `selectstart` on chrome.
|
|
6
|
-
* It writes the selection only through the selection's own setters; the
|
|
7
|
-
* selection's DOM adoption reads `dragging` and `across` and asks `hold()`.
|
|
8
|
-
*/
|
|
9
|
-
import { InlineBlock } from '../block/inlineBlock.svelte.js';
|
|
10
1
|
import { blockSelection } from '../session/selection.js';
|
|
11
|
-
import {
|
|
2
|
+
import { toTrailingParagraph } from '../session/navigation.js';
|
|
3
|
+
import { isNativeInteractiveControl, isNativeInteractiveEvent } from '../events/nativeInteractiveControl.js';
|
|
12
4
|
import { acrossColumns } from './replaceSelection.js';
|
|
13
|
-
import { getDomSelectionSnapshot } from './domSelection.js';
|
|
5
|
+
import { caretAtPoint, getDomSelectionSnapshot } from './domSelection.js';
|
|
14
6
|
import { domPointOf } from '../surface/projector.svelte.js';
|
|
15
|
-
import { getElementFromNode,
|
|
7
|
+
import { getElementFromNode, isTextBoundSelectionPoint, offsetIn, SUGGESTION } from './selection.utils.js';
|
|
16
8
|
export class SelectionPointer {
|
|
17
9
|
selection;
|
|
18
10
|
/** The press's text point while a primary press (a drag) lasts; `null` after its release. */
|
|
@@ -32,11 +24,7 @@ export class SelectionPointer {
|
|
|
32
24
|
hold = () => {
|
|
33
25
|
this.#held = true;
|
|
34
26
|
};
|
|
35
|
-
|
|
36
|
-
const element = getElementFromNode(node);
|
|
37
|
-
return Boolean(element?.closest('[data-edytor-text]'));
|
|
38
|
-
};
|
|
39
|
-
chromeBlock = (node) => {
|
|
27
|
+
#chromeBlock = (node) => {
|
|
40
28
|
const element = getElementFromNode(node);
|
|
41
29
|
const nonEditableElement = element?.closest('[contenteditable="false"]');
|
|
42
30
|
if (!(nonEditableElement instanceof HTMLElement) ||
|
|
@@ -44,7 +32,7 @@ export class SelectionPointer {
|
|
|
44
32
|
return null;
|
|
45
33
|
}
|
|
46
34
|
// A suggestion's preview is no block's chrome: a press there is its own (cancelled).
|
|
47
|
-
if (nonEditableElement.closest(
|
|
35
|
+
if (isNativeInteractiveControl(nonEditableElement) || nonEditableElement.closest(SUGGESTION)) {
|
|
48
36
|
return null;
|
|
49
37
|
}
|
|
50
38
|
const block = this.selection.getBlockOfNode(nonEditableElement);
|
|
@@ -53,10 +41,132 @@ export class SelectionPointer {
|
|
|
53
41
|
}
|
|
54
42
|
return block;
|
|
55
43
|
};
|
|
44
|
+
/**
|
|
45
|
+
* A press in the host's own area below its last block (its bottom
|
|
46
|
+
* padding, its height past the content; `nav.trailing.press`, Notion):
|
|
47
|
+
* the caret goes to the trailing paragraph (`toTrailingParagraph`, a new
|
|
48
|
+
* one when the last block is not an empty one). A primary press without
|
|
49
|
+
* a modifier, from a mouse or a pen (a touch there may start a scroll:
|
|
50
|
+
* the browser's); a view that writes nothing keeps the browser's caret.
|
|
51
|
+
* Answers whether it took the press.
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
belowPress = (event) => {
|
|
55
|
+
const { edytor } = this.selection;
|
|
56
|
+
const host = edytor.node;
|
|
57
|
+
if (!host || event.target !== host || event.button !== 0)
|
|
58
|
+
return false;
|
|
59
|
+
if (event.shiftKey || event.altKey || event.metaKey || event.ctrlKey)
|
|
60
|
+
return false;
|
|
61
|
+
if (event.pointerType === 'touch' || !edytor.dispatcher.permits())
|
|
62
|
+
return false;
|
|
63
|
+
if (!this.#below(event.clientY))
|
|
64
|
+
return false;
|
|
65
|
+
// The model answers this press, as a chrome press: no native caret placement.
|
|
66
|
+
event.preventDefault();
|
|
67
|
+
this.#trailing();
|
|
68
|
+
return true;
|
|
69
|
+
};
|
|
70
|
+
/** Whether `y` lies below the host's last top-level block (`nav.trailing.press`'s place). */
|
|
71
|
+
#below = (y) => {
|
|
72
|
+
const last = this.selection.edytor.root?.children.at(-1)?.node;
|
|
73
|
+
const bottom = last?.getBoundingClientRect().bottom;
|
|
74
|
+
return bottom !== undefined && y > bottom;
|
|
75
|
+
};
|
|
76
|
+
#trailing = () => {
|
|
77
|
+
const { edytor } = this.selection;
|
|
78
|
+
edytor.expectInternalFocus();
|
|
79
|
+
edytor.node?.focus({ preventScroll: true });
|
|
80
|
+
toTrailingParagraph(edytor);
|
|
81
|
+
};
|
|
82
|
+
/** The gesture a press in the host's own area starts (`claimMargins`): the marquee's. */
|
|
83
|
+
#margin = null;
|
|
84
|
+
/**
|
|
85
|
+
* The host's last press went to the margin gesture (`marginPress`), until
|
|
86
|
+
* its release: its compatibility `mousedown` is cancelled (no native
|
|
87
|
+
* caret, focus or selection), and it places no caret (`pressed`) and
|
|
88
|
+
* starts no text drag (`capture`).
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
claimed = false;
|
|
92
|
+
/**
|
|
93
|
+
* Register the gesture a press in the host's own area starts (one per
|
|
94
|
+
* view: the marquee plugin's, `sel.marquee`). Answers the release.
|
|
95
|
+
* @internal
|
|
96
|
+
*/
|
|
97
|
+
claimMargins = (claim) => {
|
|
98
|
+
this.#margin = claim;
|
|
99
|
+
return () => {
|
|
100
|
+
if (this.#margin === claim)
|
|
101
|
+
this.#margin = null;
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* A primary press from a mouse or a pen on the host's own area (its
|
|
106
|
+
* padding beside and below the blocks: never a block, its text or its
|
|
107
|
+
* chrome) while a margin gesture is registered (`sel.marquee`): offered
|
|
108
|
+
* to it before the trailing paragraph's press (`belowPress`), whose click
|
|
109
|
+
* the gesture gives back (`marginClick`). Classified with the chrome
|
|
110
|
+
* press in `events/onFocus.ts`. Answers whether the gesture took it.
|
|
111
|
+
* @internal
|
|
112
|
+
*/
|
|
113
|
+
marginPress = (event) => {
|
|
114
|
+
this.claimed = false;
|
|
115
|
+
const claim = this.#margin;
|
|
116
|
+
const host = this.selection.edytor.node;
|
|
117
|
+
if (!claim || !host || event.target !== host || event.button !== 0)
|
|
118
|
+
return false;
|
|
119
|
+
if (event.pointerType === 'touch' || !claim(event))
|
|
120
|
+
return false;
|
|
121
|
+
this.claimed = true;
|
|
122
|
+
// WebKit's lone `mousedown` is the press itself (`isLonePress`).
|
|
123
|
+
if (event.type === 'mousedown')
|
|
124
|
+
event.preventDefault();
|
|
125
|
+
return true;
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* The compatibility `mousedown` of the press the margin gesture took:
|
|
129
|
+
* cancelled, so the browser places no caret, moves no focus and starts no
|
|
130
|
+
* native selection (the `mousedown`'s default actions; the `pointerdown` is
|
|
131
|
+
* left alone).
|
|
132
|
+
* @internal
|
|
133
|
+
*/
|
|
134
|
+
marginMouse = (event) => {
|
|
135
|
+
if (this.claimed && event.button === 0)
|
|
136
|
+
event.preventDefault();
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* A margin press released where it began (a click, no drag): what the
|
|
140
|
+
* press does when no gesture takes it. Below the last block, the trailing
|
|
141
|
+
* paragraph (`nav.trailing.press`: no modifier, a view that writes);
|
|
142
|
+
* beside the blocks, the caret at the text point of that height nearest
|
|
143
|
+
* the host's edge, where the browser puts it. A click with a modifier
|
|
144
|
+
* keeps the selection.
|
|
145
|
+
* @internal
|
|
146
|
+
*/
|
|
147
|
+
marginClick = (at) => {
|
|
148
|
+
const { edytor } = this.selection;
|
|
149
|
+
const host = edytor.node;
|
|
150
|
+
if (!host || at.shiftKey || at.altKey || at.metaKey || at.ctrlKey)
|
|
151
|
+
return;
|
|
152
|
+
if (this.#below(at.clientY)) {
|
|
153
|
+
if (edytor.dispatcher.permits())
|
|
154
|
+
this.#trailing();
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const box = host.getBoundingClientRect();
|
|
158
|
+
const x = Math.min(Math.max(at.clientX, box.left + 1), box.right - 1);
|
|
159
|
+
const point = this.#pointAt(x, at.clientY);
|
|
160
|
+
if (!point)
|
|
161
|
+
return;
|
|
162
|
+
edytor.expectInternalFocus();
|
|
163
|
+
host.focus({ preventScroll: true });
|
|
164
|
+
this.selection.selectText(point.text, point.offset);
|
|
165
|
+
};
|
|
56
166
|
/** @internal */
|
|
57
167
|
chromePress = (event) => {
|
|
58
168
|
const targetNode = event.target instanceof Node ? event.target : null;
|
|
59
|
-
const targetBlock = this
|
|
169
|
+
const targetBlock = this.#chromeBlock(targetNode);
|
|
60
170
|
const targetText = targetBlock?.firstText;
|
|
61
171
|
// A native control inside the chrome (a void block's input) owns its press.
|
|
62
172
|
if (!targetText || isNativeInteractiveEvent(event)) {
|
|
@@ -67,7 +177,7 @@ export class SelectionPointer {
|
|
|
67
177
|
event.preventDefault();
|
|
68
178
|
this.selection.edytor.expectInternalFocus();
|
|
69
179
|
this.selection.edytor.node?.focus({ preventScroll: true });
|
|
70
|
-
this.selection.
|
|
180
|
+
this.selection.selectText(targetText, 0);
|
|
71
181
|
};
|
|
72
182
|
/**
|
|
73
183
|
* A triple click selects the block's content in the model; the browser's
|
|
@@ -80,18 +190,15 @@ export class SelectionPointer {
|
|
|
80
190
|
return;
|
|
81
191
|
const targetNode = e.target instanceof Node ? e.target : null;
|
|
82
192
|
const clickedBlock = this.selection.getBlockOfNode(targetNode);
|
|
83
|
-
if (clickedBlock?.definition.void && !
|
|
193
|
+
if (clickedBlock?.definition.void && !isTextBoundSelectionPoint(targetNode)) {
|
|
84
194
|
e.preventDefault();
|
|
85
|
-
this.selection.
|
|
195
|
+
this.selection.select(blockSelection([clickedBlock.id]));
|
|
86
196
|
return;
|
|
87
197
|
}
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
:
|
|
92
|
-
if (targetBlock) {
|
|
93
|
-
this.selection.preserveBlockRange(targetBlock);
|
|
94
|
-
}
|
|
198
|
+
const { selection } = this;
|
|
199
|
+
selection.selectLines(targetNode
|
|
200
|
+
? (selection.getTextOfNode(targetNode)?.parent ?? selection.getBlockOfNode(targetNode))
|
|
201
|
+
: selection.textAt(selection.projection.start)?.text.parent);
|
|
95
202
|
};
|
|
96
203
|
/** @internal */
|
|
97
204
|
preventTripleClick = (e) => {
|
|
@@ -99,30 +206,17 @@ export class SelectionPointer {
|
|
|
99
206
|
e.preventDefault();
|
|
100
207
|
};
|
|
101
208
|
/** The text point under the pointer, if any. */
|
|
102
|
-
pointAt = (clientX, clientY) => {
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const caretRange = caretPosition ? null : ownerDocument.caretRangeFromPoint?.(clientX, clientY);
|
|
107
|
-
const node = caretPosition?.offsetNode ?? caretRange?.startContainer ?? null;
|
|
108
|
-
const domOffset = caretPosition?.offset ?? caretRange?.startOffset ?? null;
|
|
109
|
-
const text = this.selection.getTextOfNode(node, domOffset ?? undefined);
|
|
110
|
-
if (!text || typeof domOffset !== 'number') {
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
text,
|
|
115
|
-
offset: Math.min(Math.max(getYIndex(text, node, domOffset), 0), text.length),
|
|
116
|
-
clientX,
|
|
117
|
-
clientY
|
|
118
|
-
};
|
|
209
|
+
#pointAt = (clientX, clientY) => {
|
|
210
|
+
const at = caretAtPoint(this.selection.edytor.node?.ownerDocument ?? document, clientX, clientY);
|
|
211
|
+
const text = at && this.selection.getTextOfNode(at.node, at.offset);
|
|
212
|
+
return text ? { text, offset: offsetIn(text, at.node, at.offset), clientX, clientY } : null;
|
|
119
213
|
};
|
|
120
|
-
offsetAt = (text, clientX, clientY) => {
|
|
214
|
+
#offsetAt = (text, clientX, clientY) => {
|
|
121
215
|
const ownerDocument = text.node?.ownerDocument;
|
|
122
216
|
if (!text.node || !ownerDocument) {
|
|
123
217
|
return 0;
|
|
124
218
|
}
|
|
125
|
-
const caretPoint = this
|
|
219
|
+
const caretPoint = this.#pointAt(clientX, clientY);
|
|
126
220
|
if (caretPoint?.text === text) {
|
|
127
221
|
return caretPoint.offset;
|
|
128
222
|
}
|
|
@@ -147,7 +241,7 @@ export class SelectionPointer {
|
|
|
147
241
|
};
|
|
148
242
|
/** @internal */
|
|
149
243
|
placeAt = (text, clientX, clientY) => {
|
|
150
|
-
this.selection.
|
|
244
|
+
this.selection.selectText(text, this.#offsetAt(text, clientX, clientY));
|
|
151
245
|
};
|
|
152
246
|
/** @internal */
|
|
153
247
|
capture = (event) => {
|
|
@@ -155,12 +249,13 @@ export class SelectionPointer {
|
|
|
155
249
|
this.dragStart = null;
|
|
156
250
|
return;
|
|
157
251
|
}
|
|
158
|
-
this.dragStart = this
|
|
252
|
+
this.dragStart = this.#pointAt(event.clientX, event.clientY);
|
|
159
253
|
this.#across = false;
|
|
160
254
|
this.#extending = event.shiftKey;
|
|
161
255
|
};
|
|
162
256
|
/** @internal */
|
|
163
257
|
release = () => {
|
|
258
|
+
this.claimed = false;
|
|
164
259
|
this.dragStart = null;
|
|
165
260
|
this.#dropped();
|
|
166
261
|
};
|
|
@@ -226,11 +321,11 @@ export class SelectionPointer {
|
|
|
226
321
|
return;
|
|
227
322
|
}
|
|
228
323
|
this.selection.placedOver = this.selection.value;
|
|
229
|
-
const point = this
|
|
324
|
+
const point = this.#pointAt(event.clientX, event.clientY);
|
|
230
325
|
if (!point) {
|
|
231
326
|
return;
|
|
232
327
|
}
|
|
233
|
-
this.selection.
|
|
328
|
+
this.selection.selectText(point.text, point.offset);
|
|
234
329
|
};
|
|
235
330
|
/** @internal */
|
|
236
331
|
restoreAtomRange = (event) => {
|
|
@@ -240,7 +335,7 @@ export class SelectionPointer {
|
|
|
240
335
|
if (!dragStart || event.button !== 0) {
|
|
241
336
|
return;
|
|
242
337
|
}
|
|
243
|
-
const dragEnd = this
|
|
338
|
+
const dragEnd = this.#pointAt(event.clientX, event.clientY);
|
|
244
339
|
if (!dragEnd) {
|
|
245
340
|
return;
|
|
246
341
|
}
|
|
@@ -248,27 +343,15 @@ export class SelectionPointer {
|
|
|
248
343
|
if (movement < 4) {
|
|
249
344
|
return;
|
|
250
345
|
}
|
|
346
|
+
// Two texts of one block hold an inline atom between them (a block's
|
|
347
|
+
// content alternates texts and atoms): the range is the drag's.
|
|
251
348
|
window.setTimeout(() => {
|
|
252
|
-
if (dragStart.text.parent !== dragEnd.text.parent) {
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
349
|
const content = dragStart.text.parent.content;
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
const firstTextIndex = Math.min(startIndex, endIndex);
|
|
259
|
-
const lastTextIndex = Math.max(startIndex, endIndex);
|
|
260
|
-
const hasInlineAtomBetweenTextPoints = content.some((part, index) => part instanceof InlineBlock && index > firstTextIndex && index < lastTextIndex);
|
|
261
|
-
if (startIndex === -1 || endIndex === -1 || !hasInlineAtomBetweenTextPoints) {
|
|
350
|
+
const [from, to] = [content.indexOf(dragStart.text), content.indexOf(dragEnd.text)];
|
|
351
|
+
if (dragStart.text.parent !== dragEnd.text.parent || from < 0 || to < 0 || from === to)
|
|
262
352
|
return;
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
const rangeStart = isReversed ? dragEnd : dragStart;
|
|
266
|
-
const rangeEnd = isReversed ? dragStart : dragEnd;
|
|
267
|
-
this.selection.clearInlineBlockSelection();
|
|
268
|
-
this.selection.setAtRange(rangeStart.text, rangeStart.offset, rangeEnd.text, rangeEnd.offset, {
|
|
269
|
-
isReversed
|
|
270
|
-
});
|
|
271
|
-
this.selection.clearInlineBlockSelection();
|
|
353
|
+
const [start, end] = from < to ? [dragStart, dragEnd] : [dragEnd, dragStart];
|
|
354
|
+
this.selection.selectText(start.text, start.offset, end.text, end.offset, from > to);
|
|
272
355
|
});
|
|
273
356
|
};
|
|
274
357
|
/**
|
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
import type { Block } from '../block/block.svelte.js';
|
|
2
2
|
import type { Edytor } from '../edytor.svelte.js';
|
|
3
3
|
import { Text } from '../text/text.svelte.js';
|
|
4
|
-
import type {
|
|
4
|
+
import type { OpResult } from '../crdt/edytor-doc.js';
|
|
5
5
|
export type SelectionInsertionTarget = {
|
|
6
6
|
text: Text;
|
|
7
7
|
offset: number;
|
|
8
8
|
};
|
|
9
|
+
/** The two endpoints of a range, as the selection holds them. */
|
|
10
|
+
export type RangeEndpoints = {
|
|
11
|
+
startText: Text | null;
|
|
12
|
+
endText: Text | null;
|
|
13
|
+
yStart: number;
|
|
14
|
+
yEnd: number;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The caret a write that decides one left (a range deletion, a placed flow:
|
|
18
|
+
* the view selects it), as a text and an offset; none when the write was
|
|
19
|
+
* refused.
|
|
20
|
+
*/
|
|
21
|
+
export declare const caretLeft: (edytor: Edytor, result: OpResult) => SelectionInsertionTarget | null;
|
|
22
|
+
/** A range to replace (an attempt's target); none: the live selection. */
|
|
9
23
|
export type SelectionReplacementState = RangeEndpoints & {
|
|
10
24
|
isCollapsed: boolean;
|
|
11
25
|
};
|
|
12
|
-
export declare const getSelectionReplacementState: (edytor: Edytor) => SelectionReplacementState;
|
|
13
26
|
/**
|
|
14
27
|
* The selected blocks as clicked, in document order: a grip-selected list is
|
|
15
28
|
* one block. What a command over them acts on (a list with its items) is
|
|
@@ -85,27 +98,13 @@ export declare const movable: (blocks: Iterable<Block>) => Block[];
|
|
|
85
98
|
*/
|
|
86
99
|
export declare const selectMoved: (edytor: Edytor, moved: Block[], before: Iterable<Block>) => void;
|
|
87
100
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* command (`revealed`) share it. Answers the moved blocks.
|
|
93
|
-
*/
|
|
94
|
-
export declare const revealing: (blocks: Block[], move: () => Block[]) => Block[];
|
|
95
|
-
/**
|
|
96
|
-
* Open every closed toggle `block` sits in, so it shows: a moved block
|
|
97
|
-
* ({@link revealing}), find's current match (`plugins/find`).
|
|
101
|
+
* Open every closed toggle `block` sits in, so it shows (Notion: a move never
|
|
102
|
+
* hides a block the user saw): every block a view's operation moved (the
|
|
103
|
+
* dispatcher's write; a remote peer's move, an undo or a redo opens nothing:
|
|
104
|
+
* `open` is this view's state), find's current match (`plugins/find`).
|
|
98
105
|
*/
|
|
99
106
|
export declare const reveal: (block: Block) => void;
|
|
100
|
-
|
|
101
|
-
* A block's move command (`nestBlock`, `unNestBlock`, `moveBlock`,
|
|
102
|
-
* `moveBlocks`) that reveals what it moved (`revealing`), as the keys and
|
|
103
|
-
* `edytor.moveBlocks` do. A remote peer's move, an undo or a redo
|
|
104
|
-
* opens nothing: `open` is this view's state, and history restores it as
|
|
105
|
-
* it was.
|
|
106
|
-
*/
|
|
107
|
-
export declare const revealed: <A extends unknown[], R extends Block | Block[] | null | undefined>(command: (...args: A) => R) => (this: Block, ...args: A) => R;
|
|
108
|
-
export declare const replaceSelectionWithCollapsedTarget: (edytor: Edytor, state?: SelectionReplacementState) => SelectionInsertionTarget | null;
|
|
107
|
+
export declare const replaceSelectionWithCollapsedTarget: (edytor: Edytor, range?: SelectionReplacementState) => SelectionInsertionTarget | null;
|
|
109
108
|
/**
|
|
110
109
|
* The first or last text `block` shows: its own line's (a block selection is
|
|
111
110
|
* exactly its members, never their unselected children), else, for a block
|
|
@@ -114,7 +113,7 @@ export declare const replaceSelectionWithCollapsedTarget: (edytor: Edytor, state
|
|
|
114
113
|
* document order); none for a void that shows nothing (a divider) or a
|
|
115
114
|
* closed toggle's hidden body. A line created in the same change counts (it
|
|
116
115
|
* is displayed once it mounts), as for `caretBeside`. Ranges over blocks
|
|
117
|
-
* (`
|
|
116
|
+
* (`selectLines`: Mod+A, a triple click), the block-selection keys
|
|
118
117
|
* and Escape read it.
|
|
119
118
|
*/
|
|
120
119
|
export declare const shownText: (block: Block, edge: "first" | "last", whole?: boolean) => Text | undefined;
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { Text } from '../text/text.svelte.js';
|
|
2
2
|
import { id, vetoable } from '../utils.js';
|
|
3
|
+
import { blockSelection, noSelection } from '../session/selection.js';
|
|
3
4
|
import { hidden, selectedMembers, shown } from './visibility.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* The caret a write that decides one left (a range deletion, a placed flow:
|
|
7
|
+
* the view selects it), as a text and an offset; none when the write was
|
|
8
|
+
* refused.
|
|
9
|
+
*/
|
|
10
|
+
export const caretLeft = (edytor, result) => {
|
|
11
|
+
const { startText, yStart } = edytor.selection.textRange();
|
|
12
|
+
return result.status !== 'refused' && startText ? { text: startText, offset: yStart } : null;
|
|
7
13
|
};
|
|
8
14
|
/**
|
|
9
15
|
* The selected blocks as clicked, in document order: a grip-selected list is
|
|
@@ -23,14 +29,18 @@ export const getSelectedBlocksInDocumentOrder = (edytor) => [...edytor.selection
|
|
|
23
29
|
* the caret's block. Menus, the toolbar, kind commands and Tab read it.
|
|
24
30
|
*/
|
|
25
31
|
export const getSelectionBlocks = (edytor) => {
|
|
26
|
-
const { selectedBlocks,
|
|
32
|
+
const { selectedBlocks, projection } = edytor.selection;
|
|
27
33
|
if (selectedBlocks.size)
|
|
28
34
|
return selectedMembers(edytor);
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
const { startText, endText } = edytor.selection.textRange(projection);
|
|
36
|
+
const [start, end] = [startText?.parent, endText?.parent];
|
|
37
|
+
if (projection.isCollapsed)
|
|
38
|
+
return start ? [start] : [];
|
|
39
|
+
const enters = (block) => block.isContainer && [start, end].some((edge) => edge?.isChildOf(block));
|
|
40
|
+
return projection.blocks.flatMap((id) => {
|
|
41
|
+
const block = edytor.idToBlock.get(id);
|
|
42
|
+
return block && !hidden(block) && !enters(block) ? [block] : [];
|
|
43
|
+
});
|
|
34
44
|
};
|
|
35
45
|
/**
|
|
36
46
|
* The blocks <kbd>Mod</kbd>+<kbd>Enter</kbd> modifies (Notion): the
|
|
@@ -45,13 +55,6 @@ export const flipToggles = (blocks) => {
|
|
|
45
55
|
if (node?.tagName === 'DETAILS')
|
|
46
56
|
node.open = !node.open;
|
|
47
57
|
};
|
|
48
|
-
/** Whether `block` is a descendant of `ancestor`. */
|
|
49
|
-
const isInside = (block, ancestor) => {
|
|
50
|
-
for (let parent = block.parent; parent; parent = parent.parent)
|
|
51
|
-
if (parent === ancestor)
|
|
52
|
-
return true;
|
|
53
|
-
return false;
|
|
54
|
-
};
|
|
55
58
|
/**
|
|
56
59
|
* `blocks` with every layout they cover whole standing for it (as
|
|
57
60
|
* Notion): a set holding every shown block of every column of a layout (each
|
|
@@ -170,28 +173,11 @@ export const movable = (blocks) => {
|
|
|
170
173
|
*/
|
|
171
174
|
export const selectMoved = (edytor, moved, before) => {
|
|
172
175
|
const held = [...before];
|
|
173
|
-
const kept = held.filter((block) => moved.some((root) =>
|
|
176
|
+
const kept = held.filter((block) => moved.some((root) => block.isChildOf(root)));
|
|
174
177
|
// A layout moved for the blocks covering it whole stays selected as those blocks.
|
|
175
178
|
const lifted = new Set(liftLayouts(kept));
|
|
176
179
|
const roots = moved.filter((block) => !lifted.has(block) || held.includes(block));
|
|
177
|
-
edytor.selection.
|
|
178
|
-
};
|
|
179
|
-
/**
|
|
180
|
-
* Run a block move that never hides a block the user saw (Notion): a closed
|
|
181
|
-
* toggle a moved block lands in opens, and so does a closed toggle that
|
|
182
|
-
* adopts blocks (Shift+Tab takes the blocks after it). `open` is view state.
|
|
183
|
-
* Every relative move (`edytor.moveBlocks`) and every block move
|
|
184
|
-
* command (`revealed`) share it. Answers the moved blocks.
|
|
185
|
-
*/
|
|
186
|
-
export const revealing = (blocks, move) => {
|
|
187
|
-
const had = new Map(blocks.map((block) => [block, block.children.length]));
|
|
188
|
-
const moved = move();
|
|
189
|
-
for (const block of moved) {
|
|
190
|
-
reveal(block);
|
|
191
|
-
if (block.children.length > (had.get(block) ?? Infinity))
|
|
192
|
-
open(block);
|
|
193
|
-
}
|
|
194
|
-
return moved;
|
|
180
|
+
edytor.selection.select(blockSelection([...roots, ...kept].map((block) => block.id)));
|
|
195
181
|
};
|
|
196
182
|
/** Open `block` when it is a closed toggle (`open` is view state). */
|
|
197
183
|
const open = (block) => {
|
|
@@ -199,33 +185,41 @@ const open = (block) => {
|
|
|
199
185
|
block.node.open = true;
|
|
200
186
|
};
|
|
201
187
|
/**
|
|
202
|
-
* Open every closed toggle `block` sits in, so it shows: a
|
|
203
|
-
*
|
|
188
|
+
* Open every closed toggle `block` sits in, so it shows (Notion: a move never
|
|
189
|
+
* hides a block the user saw): every block a view's operation moved (the
|
|
190
|
+
* dispatcher's write; a remote peer's move, an undo or a redo opens nothing:
|
|
191
|
+
* `open` is this view's state), find's current match (`plugins/find`).
|
|
204
192
|
*/
|
|
205
193
|
export const reveal = (block) => {
|
|
206
194
|
for (let parent = block.parent; parent; parent = parent.parent)
|
|
207
195
|
open(parent);
|
|
208
196
|
};
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
* `edytor.moveBlocks` do. A remote peer's move, an undo or a redo
|
|
213
|
-
* opens nothing: `open` is this view's state, and history restores it as
|
|
214
|
-
* it was.
|
|
215
|
-
*/
|
|
216
|
-
export const revealed = (command) => function (...args) {
|
|
217
|
-
let out;
|
|
218
|
-
const moving = args[0]?.blocks ?? [this];
|
|
219
|
-
revealing(moving, () => [(out = command.apply(this, args)) ?? []].flat());
|
|
220
|
-
return out;
|
|
221
|
-
};
|
|
222
|
-
export const replaceSelectionWithCollapsedTarget = (edytor, state = getSelectionReplacementState(edytor)) => {
|
|
223
|
-
const { startText, yStart } = state;
|
|
224
|
-
if (!startText || state.isCollapsed) {
|
|
197
|
+
export const replaceSelectionWithCollapsedTarget = (edytor, range) => {
|
|
198
|
+
const { startText, yStart } = range ?? edytor.selection.textRange();
|
|
199
|
+
if (!startText || (range ?? edytor.selection.projection).isCollapsed) {
|
|
225
200
|
return startText && { text: startText, offset: yStart };
|
|
226
201
|
}
|
|
227
|
-
|
|
228
|
-
|
|
202
|
+
return deleteRange(edytor, true, range);
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* The document's range deletion of the selected range (or `selection`,
|
|
206
|
+
* `del.range.*`; `replace`: the deletion half of a replacement, the head
|
|
207
|
+
* kept), which selects its caret. Answers that caret; refused by the
|
|
208
|
+
* document, the range's start; by the view or a hook, none.
|
|
209
|
+
*/
|
|
210
|
+
const deleteRange = (edytor, replace, selection) => {
|
|
211
|
+
const { startText, endText, yStart, yEnd } = selection ?? edytor.selection.textRange();
|
|
212
|
+
if (!startText || !endText)
|
|
213
|
+
return null;
|
|
214
|
+
const at = (text, offset) => ({
|
|
215
|
+
block: text.parent.id,
|
|
216
|
+
offset: text.segStart + offset
|
|
217
|
+
});
|
|
218
|
+
const [from, to] = [at(startText, yStart), at(endText, yEnd)];
|
|
219
|
+
const result = replace ? edytor.replaceRange(from, to) : edytor.deleteRange(from, to);
|
|
220
|
+
if (result.status === 'refused')
|
|
221
|
+
return result.reason === 'view' ? null : { text: startText, offset: yStart };
|
|
222
|
+
return caretLeft(edytor, result);
|
|
229
223
|
};
|
|
230
224
|
/**
|
|
231
225
|
* The first or last text `block` shows: its own line's (a block selection is
|
|
@@ -235,7 +229,7 @@ export const replaceSelectionWithCollapsedTarget = (edytor, state = getSelection
|
|
|
235
229
|
* document order); none for a void that shows nothing (a divider) or a
|
|
236
230
|
* closed toggle's hidden body. A line created in the same change counts (it
|
|
237
231
|
* is displayed once it mounts), as for `caretBeside`. Ranges over blocks
|
|
238
|
-
* (`
|
|
232
|
+
* (`selectLines`: Mod+A, a triple click), the block-selection keys
|
|
239
233
|
* and Escape read it.
|
|
240
234
|
*/
|
|
241
235
|
export const shownText = (block, edge, whole = false) => {
|
|
@@ -346,8 +340,8 @@ export const deleteSelectedBlocks = (edytor, blocks = selectedMembers(edytor)) =
|
|
|
346
340
|
...beside(blocks[0], 'blockBefore', blocks),
|
|
347
341
|
...beside(blocks.at(-1), 'blockAfter', blocks)
|
|
348
342
|
];
|
|
349
|
-
const deleted = edytor.dispatcher.caret(at?.text, at?.offset ?? 0, () => edytor.deleteBlocks(
|
|
350
|
-
if (
|
|
343
|
+
const deleted = edytor.dispatcher.caret(at?.text, at?.offset ?? 0, () => edytor.deleteBlocks(blocks.map((block) => block.id)));
|
|
344
|
+
if (deleted?.status !== 'applied')
|
|
351
345
|
return null;
|
|
352
346
|
edytor.announcer.deleted(what);
|
|
353
347
|
if (at)
|
|
@@ -362,7 +356,7 @@ export const deleteSelectedBlocks = (edytor, blocks = selectedMembers(edytor)) =
|
|
|
362
356
|
if (text)
|
|
363
357
|
edytor.dispatcher.caret(text, 0);
|
|
364
358
|
else if (survivor)
|
|
365
|
-
edytor.selection.
|
|
359
|
+
edytor.selection.select(blockSelection([survivor.id]));
|
|
366
360
|
return text ?? null;
|
|
367
361
|
};
|
|
368
362
|
/**
|
|
@@ -383,9 +377,9 @@ const beside = (from, step, blocks) => {
|
|
|
383
377
|
};
|
|
384
378
|
/** Delete the selected range (or `selection`) as Backspace does (`del.range.*`), then its caret. */
|
|
385
379
|
export const deleteSelectedRange = (edytor, payload = {}) => {
|
|
386
|
-
const
|
|
387
|
-
if (
|
|
388
|
-
edytor.selection.
|
|
380
|
+
const at = deleteRange(edytor, false, payload.selection);
|
|
381
|
+
if (at)
|
|
382
|
+
edytor.selection.selectText(at.text, at.offset);
|
|
389
383
|
};
|
|
390
384
|
/**
|
|
391
385
|
* Typing or a composition over a block selection (`flow.slot`),
|
|
@@ -398,14 +392,11 @@ const replaceSelectedBlocksWithEmptyBlock = (edytor) => {
|
|
|
398
392
|
const parent = selected[0]?.parent;
|
|
399
393
|
if (!parent || keepsSelectedBlocks(edytor, selected))
|
|
400
394
|
return null;
|
|
401
|
-
const
|
|
402
|
-
|
|
403
|
-
target: { replace: selected.map((block) => block.id) }
|
|
404
|
-
});
|
|
405
|
-
if (!text)
|
|
395
|
+
const at = caretLeft(edytor, edytor.insertFlow({ replace: selected.map((block) => block.id) }, { lines: [{ id: id('b'), type: edytor.defaultChild(parent) }] }));
|
|
396
|
+
if (!at)
|
|
406
397
|
return null;
|
|
407
|
-
edytor.selection.
|
|
408
|
-
return
|
|
398
|
+
edytor.selection.select(noSelection);
|
|
399
|
+
return at;
|
|
409
400
|
};
|
|
410
401
|
/** Where typed text lands: over selected blocks, one empty block in their place; else the range replaced. */
|
|
411
402
|
export const replaceSelectionForInsertion = (edytor, state) => edytor.selection.selectedBlocks.size
|