edytor 1.0.0-rc.3 → 2.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 +21 -39
- package/dist/block/block.svelte.d.ts +11 -84
- package/dist/block/block.svelte.js +30 -134
- 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 +11 -9
- package/dist/block/inlineBlock.svelte.js +18 -21
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.js +7 -7
- 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 +4 -17
- package/dist/cloudflare/DocumentRoom.js +3 -5
- 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 +25 -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 +3 -32
- package/dist/cloudflare/room/storage.js +33 -108
- 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/awarenessSelection.d.ts +22 -1
- package/dist/collaboration/awarenessSelection.js +42 -0
- 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 +42 -56
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +82 -99
- package/dist/components/Edytor.svelte.d.ts +16 -13
- package/dist/components/InlineBlock.svelte +1 -1
- 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 +2 -5
- 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 +18 -13
- package/dist/crdt/data.js +49 -71
- 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 +8 -5
- package/dist/crdt/doc/reads.js +49 -50
- 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 +32 -115
- package/dist/crdt/document.js +216 -302
- package/dist/crdt/edytor-doc.d.ts +689 -90
- package/dist/crdt/edytor-doc.js +74 -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 +32 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +8 -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/props.d.ts +32 -0
- package/dist/crdt/props.js +172 -0
- 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/dnd/autoScroll.js +1 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.d.ts +2 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.js +52 -60
- package/dist/{plugins/blockHandles → dnd}/geometry.d.ts +4 -3
- package/dist/{plugins/blockHandles → dnd}/geometry.js +6 -6
- package/dist/dnd/placement.d.ts +200 -0
- package/dist/dnd/placement.js +426 -0
- 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 +46 -63
- package/dist/edytor.svelte.js +126 -181
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -181
- 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 +64 -78
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +45 -67
- 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 +14 -1
- package/dist/events/onPaste.js +51 -76
- package/dist/index.d.ts +11 -15
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +83 -320
- package/dist/labels.js +181 -408
- 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 -154
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +21 -196
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +158 -573
- package/dist/plugins/blockHandles/BlockHandles.svelte +15 -23
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
- 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 +45 -38
- package/dist/plugins/chrome.js +59 -36
- package/dist/plugins/code/CodeHeader.svelte +8 -38
- package/dist/plugins/code/CodePlugin.svelte +53 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +16 -125
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
- package/dist/plugins/code/code.css +5 -117
- package/dist/plugins/code/header.svelte.d.ts +2 -11
- package/dist/plugins/code/header.svelte.js +11 -38
- package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
- package/dist/plugins/code/languageMenu.svelte.js +30 -160
- package/dist/plugins/code/languages.d.ts +9 -22
- package/dist/plugins/code/languages.js +39 -128
- package/dist/plugins/columns/ColumnResize.svelte +16 -27
- 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/gaps.d.ts +7 -5
- package/dist/plugins/columns/gaps.js +11 -6
- package/dist/plugins/columns/resize.svelte.d.ts +17 -54
- package/dist/plugins/columns/resize.svelte.js +80 -173
- 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 -431
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
- package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +16 -130
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
- package/dist/plugins/equation/EquationPlugin.svelte +109 -172
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +3 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.css +7 -0
- package/dist/plugins/equation/equation.svelte.d.ts +37 -24
- package/dist/plugins/equation/equation.svelte.js +20 -94
- package/dist/plugins/equation/katex.js +6 -9
- package/dist/plugins/fileDrop.d.ts +28 -0
- package/dist/plugins/fileDrop.js +116 -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 +6 -167
- package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
- package/dist/plugins/image/ImagePlugin.svelte +71 -151
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +12 -41
- 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 -36
- package/dist/plugins/image/controls.svelte.js +43 -212
- package/dist/plugins/image/image.css +17 -0
- 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 +30 -26
- package/dist/plugins/index.js +28 -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 +10 -9
- package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
- package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
- package/dist/plugins/marquee/marquee.js +4 -21
- package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
- package/dist/plugins/marquee/marqueePlugin.js +16 -15
- package/dist/plugins/media/AudioPlugin.svelte +13 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +11 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
- package/dist/plugins/media/EmbedPlugin.svelte +82 -86
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +45 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +21 -4
- package/dist/plugins/media/MediaEmpty.svelte +51 -90
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +200 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +34 -0
- package/dist/plugins/media/UploadPreview.svelte +32 -0
- package/dist/plugins/media/UploadPreview.svelte.d.ts +11 -0
- package/dist/plugins/media/VideoPlugin.svelte +14 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +12 -5
- package/dist/plugins/media/empty.svelte.d.ts +47 -46
- package/dist/plugins/media/empty.svelte.js +67 -60
- package/dist/plugins/media/media.d.ts +97 -44
- package/dist/plugins/media/media.js +77 -99
- package/dist/plugins/media/upload.css +23 -0
- package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
- package/dist/plugins/media/urlPaste.svelte.js +32 -102
- package/dist/plugins/mention/MentionPlugin.svelte +84 -126
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +17 -27
- package/dist/plugins/mention/mention.css +6 -0
- 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 +154 -109
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +19 -26
- package/dist/plugins/pageLink/pageLink.css +6 -0
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +13 -20
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +174 -183
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +34 -34
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.js +2 -2
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
- package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
- 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/richtext/richtext.css +6 -0
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +40 -124
- package/dist/plugins/table/TablePlugin.svelte +106 -168
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +38 -141
- package/dist/plugins/table/chrome.svelte.js +340 -589
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +16 -152
- package/dist/plugins/table/table.d.ts +15 -14
- package/dist/plugins/table/table.js +22 -16
- 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 +4 -68
- package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
- package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
- 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 +55 -24
- package/dist/plugins/uploads.svelte.js +123 -50
- package/dist/plugins.d.ts +187 -66
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +8 -10
- package/dist/selection/pointer.svelte.js +32 -73
- 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 +224 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +3 -8
- package/dist/selection/visibility.js +7 -5
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +43 -39
- package/dist/session/attempt.js +62 -55
- package/dist/session/bindings.js +117 -145
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +208 -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 +16 -21
- package/dist/session/inputRules.d.ts +6 -3
- package/dist/session/inputRules.js +78 -83
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +43 -10
- package/dist/session/moves.js +101 -59
- package/dist/session/navigation.d.ts +10 -2
- package/dist/session/navigation.js +140 -172
- package/dist/session/ports.d.ts +2 -7
- package/dist/session/props.d.ts +25 -25
- package/dist/session/props.js +62 -159
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +5 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +42 -47
- package/dist/session/uploads.d.ts +29 -0
- package/dist/session/uploads.js +10 -0
- 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 +2 -2
- package/dist/surface/lines.js +1 -1
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +52 -72
- package/dist/surface/overlay.d.ts +41 -3
- package/dist/surface/overlay.js +92 -37
- 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 +272 -106
- 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 -554
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -61
- 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 -335
- 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 -93
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
- package/dist/plugins/image/empty.svelte.d.ts +0 -56
- package/dist/plugins/image/empty.svelte.js +0 -83
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
- package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/labels.d.ts +0 -9
- package/dist/plugins/richtext/labels.js +0 -7
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/table/dragPreview.d.ts +0 -29
- package/dist/plugins/table/dragPreview.js +0 -103
- package/dist/plugins/toolbar/LinkCard.svelte +0 -122
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
- package/dist/plugins/toolbar/Toolbar.svelte +0 -349
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- 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
- /package/dist/{plugins/columns → dnd}/stacking.d.ts +0 -0
- /package/dist/{plugins/columns → dnd}/stacking.js +0 -0
package/dist/events/onInput.js
CHANGED
|
@@ -1,24 +1,10 @@
|
|
|
1
1
|
import { diffText } from '../utils/diffText.js';
|
|
2
2
|
import { getDomSelectionSnapshot } from '../selection/domSelection.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { isNativeInteractiveEvent, isNestedForeignEditableTarget } from './nativeInteractiveControl.js';
|
|
6
|
-
import { getTextContentOffsetAtPoint } from './domTextOffset.js';
|
|
3
|
+
import { domOffsetIn } from '../selection/selection.utils.js';
|
|
4
|
+
import { isControlEvent } from './nativeInteractiveControl.js';
|
|
7
5
|
import { runOccurrence } from './onBeforeInput.js';
|
|
8
6
|
import { attemptOf, kindOf } from '../session/attempt.js';
|
|
9
7
|
const ZERO_WIDTH_SPACE = '\u200B';
|
|
10
|
-
const isNativeLineBreakTextInput = (event) => typeof InputEvent !== 'undefined' &&
|
|
11
|
-
event instanceof InputEvent &&
|
|
12
|
-
(event.inputType === 'insertText' || kindOf(event.inputType) === 'break');
|
|
13
|
-
const isTextInsertionInput = (event) => typeof InputEvent !== 'undefined' &&
|
|
14
|
-
event instanceof InputEvent &&
|
|
15
|
-
event.inputType === 'insertText' &&
|
|
16
|
-
typeof event.data === 'string' &&
|
|
17
|
-
event.data.length > 0;
|
|
18
|
-
const isNativeHistoryInput = (event) => typeof InputEvent !== 'undefined' &&
|
|
19
|
-
event instanceof InputEvent &&
|
|
20
|
-
kindOf(event.inputType) === 'history';
|
|
21
|
-
const runInputHistoryCommand = (edytor, event) => event.inputType === 'historyUndo' ? edytor.historyUndo() : edytor.historyRedo();
|
|
22
8
|
/**
|
|
23
9
|
* What the browser shows for `text`: its element's text nodes in order (WebKit's
|
|
24
10
|
* converted-space wrappers read as plain spaces), the empty filler and the
|
|
@@ -44,20 +30,6 @@ export const readDomText = (text) => {
|
|
|
44
30
|
}
|
|
45
31
|
return value;
|
|
46
32
|
};
|
|
47
|
-
const isLiveText = (text) => text.isInDocument;
|
|
48
|
-
const getDomOffsetWithinText = (text, node, offset) => {
|
|
49
|
-
if (!text.node) {
|
|
50
|
-
return 0;
|
|
51
|
-
}
|
|
52
|
-
if (text.endsWithNewline && isInsideTrailingNewlineMarker(node)) {
|
|
53
|
-
return text.length;
|
|
54
|
-
}
|
|
55
|
-
// No model-length clamp here — the DOM caret is read BEFORE the
|
|
56
|
-
// reconcile writes the model, so a native insertion legitimately sits
|
|
57
|
-
// past the current `text.length` (the trailing-newline marker case is
|
|
58
|
-
// handled above; `setAtTextOffset` clamps the final write).
|
|
59
|
-
return getTextContentOffsetAtPoint(text.node, node, offset);
|
|
60
|
-
};
|
|
61
33
|
export const getCollapsedDomTextSelection = (edytor) => {
|
|
62
34
|
const selection = getDomSelectionSnapshot(edytor.node);
|
|
63
35
|
if (!selection?.anchorNode || !selection.isCollapsed) {
|
|
@@ -70,47 +42,22 @@ export const getCollapsedDomTextSelection = (edytor) => {
|
|
|
70
42
|
if (!text?.node) {
|
|
71
43
|
return null;
|
|
72
44
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
};
|
|
77
|
-
};
|
|
78
|
-
const getEventTextRepairTarget = (edytor, event) => {
|
|
79
|
-
const target = event.target instanceof Node ? event.target : null;
|
|
80
|
-
const text = edytor.selection.getTextOfNode(target);
|
|
81
|
-
if (!text?.node) {
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
text,
|
|
86
|
-
offset: edytor.selection.state.startText === text ? edytor.selection.state.yStart : text.length
|
|
87
|
-
};
|
|
45
|
+
// No model rule here: the DOM caret is read BEFORE the reconcile writes
|
|
46
|
+
// the model, so a native insertion legitimately sits past `text.length`
|
|
47
|
+
// (`selectText` clamps the final write).
|
|
48
|
+
return { text, offset: domOffsetIn(text, selection.anchorNode, selection.anchorOffset) };
|
|
88
49
|
};
|
|
89
50
|
const getInputType = (event) => {
|
|
90
51
|
const inputType = event.inputType;
|
|
91
52
|
return typeof inputType === 'string' ? inputType : '';
|
|
92
53
|
};
|
|
93
|
-
const waitForSuppressedObservedMutationRepair = () => new Promise((resolve) => setTimeout(resolve, 20));
|
|
94
|
-
/**
|
|
95
|
-
* Where drift repair puts the caret: the command's caret, else the model
|
|
96
|
-
* caret (a restore, or a line break), else the DOM caret; the event's text last.
|
|
97
|
-
*/
|
|
98
|
-
const driftRepairTarget = (edytor, event, repair, caret) => {
|
|
99
|
-
const { startText, yStart } = edytor.selection.state;
|
|
100
|
-
const model = startText ? { text: startText, offset: yStart } : null;
|
|
101
|
-
const preferModel = repair || kindOf(getInputType(event)) === 'break';
|
|
102
|
-
return ((repair && caret) ||
|
|
103
|
-
(preferModel ? model : getCollapsedDomTextSelection(edytor)) ||
|
|
104
|
-
getEventTextRepairTarget(edytor, event));
|
|
105
|
-
};
|
|
106
54
|
const getNativeLineBreakInsertionIndexFromValue = (text, value) => {
|
|
107
55
|
const change = diffText(text.stringContent, value);
|
|
108
56
|
return change && !change.remove && /^[\r\n]+$/.test(change.insert) ? change.at : null;
|
|
109
57
|
};
|
|
110
58
|
export const handleNativeLineBreakTextValue = async (edytor, text, value) => {
|
|
111
|
-
if (!
|
|
59
|
+
if (!text.isInDocument)
|
|
112
60
|
return false;
|
|
113
|
-
}
|
|
114
61
|
const insertionIndex = getNativeLineBreakInsertionIndexFromValue(text, value);
|
|
115
62
|
if (insertionIndex === null) {
|
|
116
63
|
return false;
|
|
@@ -120,71 +67,10 @@ export const handleNativeLineBreakTextValue = async (edytor, text, value) => {
|
|
|
120
67
|
? 'insertLineBreak'
|
|
121
68
|
: 'insertParagraph';
|
|
122
69
|
text.refreshFromModel();
|
|
123
|
-
edytor.selection.
|
|
70
|
+
edytor.selection.selectText(text, insertionIndex);
|
|
124
71
|
await runOccurrence(edytor, { inputType, cancelable: false });
|
|
125
72
|
return true;
|
|
126
73
|
};
|
|
127
|
-
const handleNativeLineBreakTextInput = async (edytor, event) => {
|
|
128
|
-
if (!isNativeLineBreakTextInput(event)) {
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
const target = getCollapsedDomTextSelection(edytor) ?? getEventTextRepairTarget(edytor, event);
|
|
132
|
-
return target
|
|
133
|
-
? handleNativeLineBreakTextValue(edytor, target.text, readDomText(target.text))
|
|
134
|
-
: false;
|
|
135
|
-
};
|
|
136
|
-
const getExpandedSelectionInputText = (edytor, event) => !edytor.readonly &&
|
|
137
|
-
!edytor.isComposing &&
|
|
138
|
-
isTextInsertionInput(event) &&
|
|
139
|
-
!edytor.selection.state.isCollapsed &&
|
|
140
|
-
edytor.selection.selectedBlocks.size === 0
|
|
141
|
-
? event.data
|
|
142
|
-
: null;
|
|
143
|
-
const replaceExpandedSelectionFromInputOnlyText = (edytor, value) => {
|
|
144
|
-
const target = replaceSelectionWithCollapsedTarget(edytor);
|
|
145
|
-
if (!target) {
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
edytor.selection.setAtTextOffset(target.text, target.offset);
|
|
149
|
-
target.text.insertText({
|
|
150
|
-
value,
|
|
151
|
-
start: target.offset,
|
|
152
|
-
end: target.offset
|
|
153
|
-
});
|
|
154
|
-
target.text.refreshFromModel();
|
|
155
|
-
edytor.selection.setAtTextOffset(target.text, target.offset + value.length);
|
|
156
|
-
return true;
|
|
157
|
-
};
|
|
158
|
-
/** Drift around a model-owned attempt: re-render its texts from the model and put the caret back. */
|
|
159
|
-
const repairDrift = async (edytor, attempt, expect, event) => {
|
|
160
|
-
const repair = expect.mode !== 'refresh';
|
|
161
|
-
if (attempt.isStructuralKeyFallback && attempt.phase === 'open' && !repair) {
|
|
162
|
-
// The key's attempt has not run yet: its deadline performs it.
|
|
163
|
-
expect.input = false;
|
|
164
|
-
edytor.attempts.arm(attempt, 50);
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
const serial = edytor.intentSerial;
|
|
168
|
-
if (expect.mode === 'discard') {
|
|
169
|
-
await waitForSuppressedObservedMutationRepair();
|
|
170
|
-
}
|
|
171
|
-
expect.input = false;
|
|
172
|
-
if (expect.mode !== 'discard')
|
|
173
|
-
edytor.attempts.arm(attempt, 0);
|
|
174
|
-
const target = driftRepairTarget(edytor, event, repair, expect.caret);
|
|
175
|
-
if (!target)
|
|
176
|
-
return;
|
|
177
|
-
const eventTarget = getEventTextRepairTarget(edytor, event);
|
|
178
|
-
if (eventTarget && eventTarget.text !== target.text && isLiveText(eventTarget.text)) {
|
|
179
|
-
eventTarget.text.refreshFromModel();
|
|
180
|
-
}
|
|
181
|
-
target.text.refreshFromModel();
|
|
182
|
-
// The attempt decided the caret; `select()` it — the projector displays it —
|
|
183
|
-
// unless a gesture came during the wait: the selection is then the user's.
|
|
184
|
-
if (edytor.intentSerial !== serial)
|
|
185
|
-
return;
|
|
186
|
-
edytor.selection.setAtTextOffset(target.text, Math.min(target.offset, target.text.length));
|
|
187
|
-
};
|
|
188
74
|
/**
|
|
189
75
|
* An `input` no attempt expected (its engine sent no `beforeinput`): the
|
|
190
76
|
* browser changed the text under its caret — a browser-owned attempt of its own.
|
|
@@ -201,45 +87,46 @@ const claimOf = (edytor, event) => {
|
|
|
201
87
|
});
|
|
202
88
|
};
|
|
203
89
|
/**
|
|
204
|
-
* An `input` event.
|
|
205
|
-
*
|
|
206
|
-
* the `input` flushes it — a browser-owned attempt's change
|
|
207
|
-
* once, through the dispatcher — then closes the attempt it
|
|
90
|
+
* An `input` event. Browser-made text is never adopted here: the mutation
|
|
91
|
+
* queue is the only adopter (a native line break there runs as its
|
|
92
|
+
* occurrence), so the `input` flushes it — a browser-owned attempt's change
|
|
93
|
+
* is adopted there, once, through the dispatcher — then closes the attempt it
|
|
94
|
+
* belongs to. Drift around a model-owned attempt is the observer's to invert;
|
|
95
|
+
* a restoring attempt (a delete the browser could not be kept from) also
|
|
96
|
+
* re-renders the text the input landed in and shows its caret again, which
|
|
97
|
+
* the browser moved.
|
|
208
98
|
*/
|
|
209
99
|
export async function onInput(event) {
|
|
210
100
|
// The live session's own input; a late one of its tail is drift it expects.
|
|
211
101
|
if (this.composition.input(event) === 'live')
|
|
212
102
|
return;
|
|
103
|
+
const inputType = getInputType(event);
|
|
213
104
|
// The attempt this `input` belongs to: the newest whose expectation it satisfies.
|
|
214
|
-
let attempt = this.attempts.inputOf(
|
|
105
|
+
let attempt = this.attempts.inputOf(inputType);
|
|
215
106
|
const expect = attempt?.expect;
|
|
216
|
-
if (
|
|
217
|
-
|
|
107
|
+
if (expect?.kind === 'drift') {
|
|
108
|
+
expect.input = false;
|
|
109
|
+
if (expect.mode !== 'restore')
|
|
110
|
+
return;
|
|
111
|
+
this.attempts.arm(attempt, 0);
|
|
112
|
+
const { selection } = this;
|
|
113
|
+
const at = expect.caret;
|
|
114
|
+
for (const text of [selection.getTextOfNode(event.target), at?.text])
|
|
115
|
+
if (text?.isInDocument)
|
|
116
|
+
text.refreshFromModel();
|
|
117
|
+
return selection.select(at ? selection.textValue(at.text, at.offset) : selection.value);
|
|
218
118
|
}
|
|
219
119
|
try {
|
|
220
|
-
if (
|
|
221
|
-
(event && isNestedForeignEditableTarget(this.node, event.target))) {
|
|
120
|
+
if (isControlEvent(this.node, event))
|
|
222
121
|
return;
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
// mid-composition consumes capture groups while the IME still
|
|
227
|
-
// owns the DOM node (engines that deliver history via `input`
|
|
228
|
-
// only would otherwise bypass the beforeinput swallow).
|
|
122
|
+
// History an engine delivers by `input` only; mid-composition it would
|
|
123
|
+
// consume capture groups while the IME still owns the DOM node.
|
|
124
|
+
if (kindOf(inputType) === 'history') {
|
|
229
125
|
if (!this.isComposing)
|
|
230
|
-
|
|
126
|
+
this[inputType]();
|
|
231
127
|
return;
|
|
232
128
|
}
|
|
233
129
|
attempt ??= claimOf(this, event);
|
|
234
|
-
if (await handleNativeLineBreakTextInput(this, event)) {
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
const expandedSelectionInputText = getExpandedSelectionInputText(this, event);
|
|
238
|
-
if (expandedSelectionInputText) {
|
|
239
|
-
if (replaceExpandedSelectionFromInputOnlyText(this, expandedSelectionInputText)) {
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
130
|
await this.surface.flush();
|
|
244
131
|
}
|
|
245
132
|
finally {
|
package/dist/events/onKeyDown.js
CHANGED
|
@@ -1,143 +1,76 @@
|
|
|
1
|
-
import { isInsideTrailingNewlineMarker } from '../selection/selection.utils.js';
|
|
2
1
|
import { isNativeInteractiveEvent, isNativeTextControl, isNativeTextControlEvent, ownsEvent } from './nativeInteractiveControl.js';
|
|
3
2
|
import { replaceSelectedAtom } from '../session/bindings.js';
|
|
4
|
-
import { admitKeyAttempt } from './onBeforeInput.js';
|
|
5
|
-
import { targetless } from '../session/attempt.js';
|
|
6
|
-
import {
|
|
3
|
+
import { admitKeyAttempt, isTrailingSoftBreakBackward } from './onBeforeInput.js';
|
|
4
|
+
import { INTENTS, intentSnapshot, keyIntentOf, targetless } from '../session/attempt.js';
|
|
5
|
+
import { selectionIsInside } from './onFocus.js';
|
|
7
6
|
const isEventFromEditor = (edytor, event) => {
|
|
8
|
-
|
|
7
|
+
const { node, selection } = edytor;
|
|
8
|
+
if (!node)
|
|
9
9
|
return true;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const activeElementIsOutsideTextControl = activeElement instanceof HTMLElement &&
|
|
13
|
-
!edytor.node.contains(activeElement) &&
|
|
14
|
-
isNativeTextControl(activeElement);
|
|
15
|
-
if (activeElementIsOutsideTextControl) {
|
|
10
|
+
const active = node.ownerDocument.activeElement;
|
|
11
|
+
if (active instanceof HTMLElement && !node.contains(active) && isNativeTextControl(active))
|
|
16
12
|
return false;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
13
|
+
// Focus on the host or inside it, or nowhere (the body): a selection of the
|
|
14
|
+
// editor's own (blocks, an atom; a text one under a command chord) takes the key.
|
|
15
|
+
const focused = active === node.ownerDocument.body || (active instanceof Node && node.contains(active));
|
|
16
|
+
if (focused &&
|
|
17
|
+
(selection.selectedBlocks.size > 0 ||
|
|
18
|
+
selection.selectedInlineBlock.size > 0 ||
|
|
19
|
+
((event.metaKey || event.ctrlKey) && selection.textRange().startText?.node)))
|
|
23
20
|
return true;
|
|
24
|
-
|
|
25
|
-
if (event.composedPath().includes(edytor.node)) {
|
|
21
|
+
if (event.composedPath().includes(node))
|
|
26
22
|
return true;
|
|
27
|
-
|
|
28
|
-
if (event.target instanceof Node && edytor.node.contains(event.target)) {
|
|
23
|
+
if (event.target instanceof Node && node.contains(event.target))
|
|
29
24
|
return true;
|
|
30
|
-
|
|
31
|
-
const hasModelTextSelection = Boolean(edytor.selection.state.startText?.node);
|
|
32
|
-
if ((event.metaKey || event.ctrlKey) &&
|
|
33
|
-
hasModelTextSelection &&
|
|
34
|
-
(activeElement === edytor.node ||
|
|
35
|
-
activeElement === edytor.node.ownerDocument.body ||
|
|
36
|
-
(activeElement instanceof Node && edytor.node.contains(activeElement)))) {
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
const selection = getDomSelection(edytor.node);
|
|
40
|
-
return Boolean(selection?.anchorNode &&
|
|
41
|
-
(edytor.node.contains(selection.anchorNode) ||
|
|
42
|
-
(selection.focusNode && edytor.node.contains(selection.focusNode))));
|
|
25
|
+
return selectionIsInside(node);
|
|
43
26
|
};
|
|
44
27
|
const hasCommandModifier = (event) => event.metaKey || event.ctrlKey || event.altKey;
|
|
45
28
|
/** Backspace or Delete on a select or a button: the browser would delete around it in the host. */
|
|
46
29
|
const shouldPreventNativeInteractiveDeletionKey = (event) => isNativeInteractiveEvent(event) &&
|
|
47
30
|
!isNativeTextControlEvent(event) &&
|
|
48
31
|
(event.key.toLowerCase() === 'backspace' || event.key.toLowerCase() === 'delete');
|
|
49
|
-
|
|
50
|
-
const shouldRefreshSelectionBeforeKeyDown = (edytor, event) =>
|
|
32
|
+
/** A command chord at a caret (a block or atom selection projects no caret). */
|
|
33
|
+
const shouldRefreshSelectionBeforeKeyDown = (edytor, event) => !/^(Alt|Control|Meta|Shift)$/.test(event.key) &&
|
|
51
34
|
hasCommandModifier(event) &&
|
|
52
|
-
edytor.selection.
|
|
53
|
-
edytor.selection.selectedBlocks.size === 0 &&
|
|
54
|
-
edytor.selection.selectedInlineBlock.size === 0 &&
|
|
35
|
+
edytor.selection.projection.isCollapsed &&
|
|
55
36
|
!isNativeInteractiveEvent(event);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
return event.key.length === 1;
|
|
61
|
-
};
|
|
37
|
+
/** A character key with no command modifier (a dead key's name is no character). */
|
|
38
|
+
const isPrintableReplacementKey = (event) => !hasCommandModifier(event) && event.key.length === 1;
|
|
62
39
|
/** The editing intent of an unmodified key (a character, Backspace, Delete, Enter), if it has one. */
|
|
63
|
-
const keyIntent = (event) =>
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
'arrowdown',
|
|
85
|
-
'home',
|
|
86
|
-
'end',
|
|
87
|
-
'pageup',
|
|
88
|
-
'pagedown',
|
|
89
|
-
'escape'
|
|
90
|
-
].includes(event.key.toLowerCase());
|
|
91
|
-
const shouldPreventReadonlyMutationKey = (event) => {
|
|
92
|
-
if (isNativeTextControlEvent(event)) {
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
if (isReadonlyAllowedShortcut(event) || isReadonlyNavigationKey(event)) {
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
const key = event.key.toLowerCase();
|
|
99
|
-
return (key.length === 1 || key === 'backspace' || key === 'delete' || key === 'enter' || key === 'tab');
|
|
100
|
-
};
|
|
101
|
-
const isBackspaceFromTrailingNewlineMarker = (edytor) => {
|
|
102
|
-
const { isCollapsed, startText, yStart } = edytor.selection.state;
|
|
103
|
-
if (!isCollapsed ||
|
|
104
|
-
!startText?.node ||
|
|
105
|
-
!startText.endsWithNewline ||
|
|
106
|
-
yStart !== startText.length) {
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
const selection = getDomSelection(startText.node);
|
|
110
|
-
const anchorNode = selection?.anchorNode;
|
|
111
|
-
return Boolean(anchorNode && isInsideTrailingNewlineMarker(anchorNode));
|
|
112
|
-
};
|
|
40
|
+
const keyIntent = (event) => event.isComposing || hasCommandModifier(event)
|
|
41
|
+
? null
|
|
42
|
+
: (keyIntentOf(event.key, event.shiftKey) ??
|
|
43
|
+
(isPrintableReplacementKey(event) ? 'insertText' : null));
|
|
44
|
+
/**
|
|
45
|
+
* A key that would edit a readonly view (a character, Backspace, Delete,
|
|
46
|
+
* Enter, Tab), outside a text control: never copy, select all or the
|
|
47
|
+
* browser's find (the keymap does not run while readonly).
|
|
48
|
+
*/
|
|
49
|
+
const shouldPreventReadonlyMutationKey = (event) => /^(.|backspace|delete|enter|tab)$/i.test(event.key) &&
|
|
50
|
+
!((event.metaKey || event.ctrlKey) && /^[acf]$/i.test(event.key)) &&
|
|
51
|
+
!isNativeTextControlEvent(event);
|
|
52
|
+
/**
|
|
53
|
+
* The intent a keydown admits when its `beforeinput` may never come: Enter
|
|
54
|
+
* and Shift+Enter, and a Backspace or Delete over a range or at the edge of
|
|
55
|
+
* its block or text (or right after a trailing soft break, for Backspace,
|
|
56
|
+
* which the model deletes). With a
|
|
57
|
+
* command modifier, a word or line chord at the block's edge deletes the
|
|
58
|
+
* neighbour like a character (a unit delete, `runBeforeInputDeleteCommand`); WebKit announces no
|
|
59
|
+
* `beforeinput` for it at the document's first text.
|
|
60
|
+
*/
|
|
113
61
|
const getStructuralFallbackInputType = (edytor, event) => {
|
|
114
|
-
const
|
|
62
|
+
const intent = keyIntentOf(event.key, event.shiftKey);
|
|
63
|
+
const dir = intent && INTENTS[intent].dir;
|
|
115
64
|
const { isCollapsed, isAtStartOfBlock, isAtStartOfText, isAtEndOfBlock, isAtEndOfText } = edytor.selection.projection;
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return 'deleteContentForward';
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
if (key === 'enter') {
|
|
129
|
-
return event.shiftKey ? 'insertLineBreak' : 'insertParagraph';
|
|
130
|
-
}
|
|
131
|
-
if (key === 'backspace') {
|
|
132
|
-
if (isBackspaceFromTrailingNewlineMarker(edytor)) {
|
|
133
|
-
return 'deleteContentBackward';
|
|
134
|
-
}
|
|
135
|
-
return !isCollapsed || isAtStartOfBlock || isAtStartOfText ? 'deleteContentBackward' : null;
|
|
136
|
-
}
|
|
137
|
-
if (key === 'delete') {
|
|
138
|
-
return !isCollapsed || isAtEndOfBlock || isAtEndOfText ? 'deleteContentForward' : null;
|
|
139
|
-
}
|
|
140
|
-
return null;
|
|
65
|
+
const back = dir === 'back';
|
|
66
|
+
const atBlockEdge = back ? isAtStartOfBlock : isAtEndOfBlock;
|
|
67
|
+
if (hasCommandModifier(event))
|
|
68
|
+
return dir && isCollapsed && !event.shiftKey && atBlockEdge ? intent : null;
|
|
69
|
+
if (!dir)
|
|
70
|
+
return intent;
|
|
71
|
+
const atTextEdge = back ? isAtStartOfText : isAtEndOfText;
|
|
72
|
+
const atMarker = back && isTrailingSoftBreakBackward(intentSnapshot(edytor, intent));
|
|
73
|
+
return !isCollapsed || atBlockEdge || atTextEdge || atMarker ? intent : null;
|
|
141
74
|
};
|
|
142
75
|
export function onKeyDown(e) {
|
|
143
76
|
// A keydown the bindings are not offered offers no key to its `beforeinput`.
|
|
@@ -165,7 +98,7 @@ export function onKeyDown(e) {
|
|
|
165
98
|
}
|
|
166
99
|
return;
|
|
167
100
|
}
|
|
168
|
-
if (this.selection.
|
|
101
|
+
if (this.selection.voidField) {
|
|
169
102
|
return;
|
|
170
103
|
}
|
|
171
104
|
// Any other native control (a link, the chrome's buttons beside the host)
|
package/dist/events/onPaste.d.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import type { Edytor } from '../edytor.svelte.js';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* A paste: the browser's in a readonly view, a void's field, a kind's own
|
|
4
|
+
* control (a field bound to `block.data`, a nested editable island:
|
|
5
|
+
* `ownsEvent` — inserting the fragment at the model selection would write
|
|
6
|
+
* the document AND cancel its paste) or under a live composition (its
|
|
7
|
+
* preview owns the write path: the browser pastes, the observer reconciles
|
|
8
|
+
* it after the end, as PM input.ts:656-660). Else, unless Shift asks for
|
|
9
|
+
* plain text: an Edytor fragment; what an extension's `onPaste` claims (the
|
|
10
|
+
* `pasteFirst` ones first, then list order); a
|
|
11
|
+
* file nothing claimed inserts nothing (the Files → image seam), never its
|
|
12
|
+
* name; external HTML (HTML that carries nothing falls through); markdown
|
|
13
|
+
* text as its blocks (`paste.markdown`), except in a code block's lines.
|
|
14
|
+
* The plain text (or a URI) left is the paste occurrence's.
|
|
15
|
+
*/
|
|
3
16
|
export declare function onPaste(this: Edytor, e: ClipboardEvent): Promise<void>;
|
package/dist/events/onPaste.js
CHANGED
|
@@ -5,7 +5,6 @@ import { inCodeLines } from '../session/inputRules.js';
|
|
|
5
5
|
import { flowOfHtml } from '../clipboard/htmlFlow.js';
|
|
6
6
|
import { getDomSelectionSnapshot } from '../selection/domSelection.js';
|
|
7
7
|
import { getYIndex } from '../selection/selection.utils.js';
|
|
8
|
-
import { observeInternalDragSources } from './onDrop.js';
|
|
9
8
|
import { runOccurrence } from './onBeforeInput.js';
|
|
10
9
|
import { firstUriListEntry } from './dataTransferPayload.js';
|
|
11
10
|
import { ownsEvent } from './nativeInteractiveControl.js';
|
|
@@ -13,27 +12,17 @@ import { ownsEvent } from './nativeInteractiveControl.js';
|
|
|
13
12
|
* Shift-paste requests a plain-text paste (PM input.ts:620-630 —
|
|
14
13
|
* `mod-shift-v` and `Shift+Insert` keyCode 45 both take the plain branch).
|
|
15
14
|
* `ClipboardEvent` carries no modifier state, so the Shift state is tracked
|
|
16
|
-
* on keydown/keyup capture
|
|
15
|
+
* on the document's keydown/keyup capture (a shadow root's keys are composed:
|
|
16
|
+
* the document sees them first, Shift included).
|
|
17
17
|
*/
|
|
18
18
|
let shiftPasteModifierHeld = false;
|
|
19
|
-
|
|
20
|
-
export const observeShiftPasteModifier = (rootNode) => {
|
|
21
|
-
if (!rootNode || observedShiftRoots.has(rootNode)) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
observedShiftRoots.add(rootNode);
|
|
19
|
+
if (typeof document !== 'undefined') {
|
|
25
20
|
const track = (event) => {
|
|
26
21
|
shiftPasteModifierHeld = event.shiftKey === true;
|
|
27
22
|
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
view?.addEventListener('blur', () => {
|
|
32
|
-
shiftPasteModifierHeld = false;
|
|
33
|
-
});
|
|
34
|
-
};
|
|
35
|
-
if (typeof document !== 'undefined') {
|
|
36
|
-
observeShiftPasteModifier(document);
|
|
23
|
+
document.addEventListener('keydown', track, true);
|
|
24
|
+
document.addEventListener('keyup', track, true);
|
|
25
|
+
window.addEventListener('blur', track);
|
|
37
26
|
}
|
|
38
27
|
/**
|
|
39
28
|
* A paste over a block selection lands at a collapsed DOM caret put outside
|
|
@@ -56,71 +45,57 @@ const syncCollapsedDomCaretForPaste = (edytor) => {
|
|
|
56
45
|
if (selectedBlocks.has(block))
|
|
57
46
|
return;
|
|
58
47
|
if (text)
|
|
59
|
-
edytor.selection.
|
|
48
|
+
edytor.selection.selectText(text, getYIndex(text, node, dom.anchorOffset));
|
|
60
49
|
};
|
|
50
|
+
/**
|
|
51
|
+
* A paste: the browser's in a readonly view, a void's field, a kind's own
|
|
52
|
+
* control (a field bound to `block.data`, a nested editable island:
|
|
53
|
+
* `ownsEvent` — inserting the fragment at the model selection would write
|
|
54
|
+
* the document AND cancel its paste) or under a live composition (its
|
|
55
|
+
* preview owns the write path: the browser pastes, the observer reconciles
|
|
56
|
+
* it after the end, as PM input.ts:656-660). Else, unless Shift asks for
|
|
57
|
+
* plain text: an Edytor fragment; what an extension's `onPaste` claims (the
|
|
58
|
+
* `pasteFirst` ones first, then list order); a
|
|
59
|
+
* file nothing claimed inserts nothing (the Files → image seam), never its
|
|
60
|
+
* name; external HTML (HTML that carries nothing falls through); markdown
|
|
61
|
+
* text as its blocks (`paste.markdown`), except in a code block's lines.
|
|
62
|
+
* The plain text (or a URI) left is the paste occurrence's.
|
|
63
|
+
*/
|
|
61
64
|
export async function onPaste(e) {
|
|
62
|
-
if (this.readonly || this.selection.
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
// A paste in a kind's own control (a field bound to `block.data`, a
|
|
66
|
-
// nested editable island) is the control's (`ownsEvent`): inserting the
|
|
67
|
-
// fragment at the model selection would write the document AND cancel its paste.
|
|
68
|
-
if (ownsEvent(this.node, e)) {
|
|
65
|
+
if (this.readonly || this.selection.voidField || ownsEvent(this.node, e) || this.isComposing)
|
|
69
66
|
return;
|
|
70
|
-
}
|
|
71
|
-
if (this.isComposing) {
|
|
72
|
-
// The composition preview owns the write path — the browser performs
|
|
73
|
-
// the paste and the deferred observer reconciles it after
|
|
74
|
-
// compositionend (PM input.ts:656-660 does the same).
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
observeInternalDragSources(this.node?.getRootNode());
|
|
78
|
-
observeShiftPasteModifier(this.node?.getRootNode());
|
|
79
67
|
syncCollapsedDomCaretForPaste(this);
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
e.preventDefault();
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
// External HTML; HTML that carries nothing falls through to text/plain.
|
|
99
|
-
const flow = flowOfHtml(this, e.clipboardData?.getData('text/html'));
|
|
100
|
-
if (flow) {
|
|
101
|
-
e.preventDefault();
|
|
102
|
-
return this.dispatcher.run('insertFromPaste', () => pasteFlow(this, flow));
|
|
103
|
-
}
|
|
104
|
-
// Markdown text (`paste.markdown`): its blocks, except in a code block's lines.
|
|
105
|
-
const start = this.selection.projection.start?.block;
|
|
106
|
-
const at = start ? this.idToBlock.get(start) : undefined;
|
|
107
|
-
const markdown = at && inCodeLines(this, at)
|
|
108
|
-
? null
|
|
109
|
-
: flowOfMarkdown(this, e.clipboardData?.getData('text/plain') ?? '');
|
|
110
|
-
if (markdown) {
|
|
111
|
-
e.preventDefault();
|
|
112
|
-
return this.dispatcher.run('insertFromPaste', () => pasteFlow(this, markdown));
|
|
68
|
+
const data = e.clipboardData;
|
|
69
|
+
const plain = data?.getData('text/plain') ?? '';
|
|
70
|
+
let flow = null;
|
|
71
|
+
if (!(shiftPasteModifierHeld && plain)) {
|
|
72
|
+
const fragment = readEdytorClipboardFragment(data);
|
|
73
|
+
if (!fragment) {
|
|
74
|
+
// The `pasteFirst` hooks (a pasted reference: page link's `fromPaste`), then the
|
|
75
|
+
// others in list order; the first that prevents claims the paste.
|
|
76
|
+
const claimed = (first) => (plugin) => !!plugin.pasteFirst === first && vetoable((prevent) => plugin.onPaste?.({ prevent, e }));
|
|
77
|
+
const stop = () => e.preventDefault();
|
|
78
|
+
if (this.dispatcher.intercept(claimed(true), stop) ||
|
|
79
|
+
this.dispatcher.intercept(claimed(false), stop))
|
|
80
|
+
return;
|
|
81
|
+
if (data?.files?.length)
|
|
82
|
+
return e.preventDefault();
|
|
113
83
|
}
|
|
84
|
+
const start = this.idToBlock.get(this.selection.projection.start?.block ?? '');
|
|
85
|
+
flow = fragment
|
|
86
|
+
? flowOfFragment(fragment)
|
|
87
|
+
: (flowOfHtml(this, data?.getData('text/html')) ??
|
|
88
|
+
(start && inCodeLines(this, start) ? null : flowOfMarkdown(this, plain)));
|
|
114
89
|
}
|
|
115
|
-
if (!
|
|
116
|
-
!firstUriListEntry(e.clipboardData?.getData('text/uri-list'))) {
|
|
90
|
+
if (!flow && !plain && !firstUriListEntry(data?.getData('text/uri-list')))
|
|
117
91
|
return;
|
|
118
|
-
}
|
|
119
92
|
e.preventDefault();
|
|
120
|
-
return
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
93
|
+
return flow
|
|
94
|
+
? this.dispatcher.run('insertFromPaste', () => pasteFlow(this, flow))
|
|
95
|
+
: runOccurrence(this, {
|
|
96
|
+
inputType: 'insertFromPaste',
|
|
97
|
+
data: plain,
|
|
98
|
+
dataTransfer: data,
|
|
99
|
+
cancelable: true
|
|
100
|
+
});
|
|
126
101
|
}
|