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,145 +1,101 @@
|
|
|
1
1
|
import { vetoable } from '../utils.js';
|
|
2
|
-
import { Text } from '../text/text.svelte.js';
|
|
3
2
|
import { createDomRange, createDomSelectionSnapshotFromRange, getActiveElement, getDomSelection } from '../selection/domSelection.js';
|
|
4
3
|
import { getYIndex } from '../selection/selection.utils.js';
|
|
5
4
|
import { sameValue } from '../session/selection.js';
|
|
6
5
|
import { INTENTS, attemptOf, intentOf, kindOf, reproject, targetless } from '../session/attempt.js';
|
|
7
6
|
import { isAndroidChromeBrowser } from './events.utils.js';
|
|
8
7
|
import { isNativeInteractiveControl, isNativeInteractiveEvent, ownsEvent } from './nativeInteractiveControl.js';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
8
|
+
import { runBeforeInputCommand } from './beforeInputCommands.js';
|
|
9
|
+
import { deleteInText } from './beforeInputDeleteCommands.js';
|
|
11
10
|
import { readDomText } from './onInput.js';
|
|
12
|
-
const isRangeInsideEditor = (edytor, range) => Boolean(edytor.node &&
|
|
13
|
-
edytor.node.contains(range.startContainer) &&
|
|
14
|
-
edytor.node.contains(range.endContainer));
|
|
15
|
-
// Deletes whose extent the model computes itself (`deleteCollapsed*` in
|
|
16
|
-
// beforeInputDeleteCommands): for a collapsed caret the browser's
|
|
17
|
-
// targetRange is only used to locate the caret edge, never adopted
|
|
18
|
-
// verbatim — Firefox delivers block-level end containers for word/line
|
|
19
|
-
// deletes, which derive to a degenerate caret and no-op the delete.
|
|
20
|
-
const deleteDir = (inputType) => INTENTS[inputType]?.dir;
|
|
21
|
-
/** Insertions whose target is the caret the user placed (not a drop point). */
|
|
22
|
-
const isTextInsertionInput = (inputType) => inputType.startsWith('insert') &&
|
|
23
|
-
inputType !== 'insertFromDrop' &&
|
|
24
|
-
['text', 'composition', 'payload'].includes(kindOf(inputType) ?? '');
|
|
25
11
|
/** The Android no-op-Backspace and model-owned drift deadlines (named, counted browser rules). */
|
|
26
12
|
const NATIVE_INPUT_REPAIR_WINDOW_MS = 150;
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
return {
|
|
34
|
-
startText,
|
|
35
|
-
endText,
|
|
36
|
-
yStart: getYIndex(startText, range.startContainer, range.startOffset),
|
|
37
|
-
yEnd: getYIndex(endText, range.endContainer, range.endOffset)
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
const isSafeDeleteTargetRange = (inputType, { startText, endText, yStart, yEnd }) => {
|
|
41
|
-
if (!deleteDir(inputType) || startText !== endText || yStart < 0 || yEnd < yStart)
|
|
42
|
-
return false;
|
|
43
|
-
if (yEnd > startText.length)
|
|
44
|
-
return false;
|
|
45
|
-
if (yStart !== yEnd)
|
|
46
|
-
return true;
|
|
47
|
-
return deleteDir(inputType) === 'back' ? yStart > 0 : yStart < startText.length;
|
|
13
|
+
const dirOf = (inputType) => INTENTS[inputType]?.dir;
|
|
14
|
+
/** An insertion at the caret the user placed (not a drop point, not a break). */
|
|
15
|
+
const inserts = (inputType) => {
|
|
16
|
+
const kind = kindOf(inputType);
|
|
17
|
+
return (inputType.startsWith('insert') && inputType !== 'insertFromDrop' && !!kind && kind !== 'break');
|
|
48
18
|
};
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Whether the range the browser declared, not the model selection, is where
|
|
21
|
+
* the attempt acts: never for history, nor for an insertion the model keeps
|
|
22
|
+
* its selection for, nor over a model range (but for a replacement or a
|
|
23
|
+
* drop); an insertion at the admitted caret keeps its edge side (Chromium
|
|
24
|
+
* re-reports ` tail`@0 as `Link`@4); a delete whose extent the model
|
|
25
|
+
* computes takes only a caret edge inside one text (Firefox declares
|
|
26
|
+
* block-level containers for word and line deletes).
|
|
27
|
+
*/
|
|
28
|
+
const declares = (edytor, a, range) => {
|
|
29
|
+
const { reported, inputType: intent, isCollapsed } = a;
|
|
30
|
+
const insertion = inserts(intent);
|
|
31
|
+
if (kindOf(reported) === 'history')
|
|
59
32
|
return false;
|
|
60
|
-
|
|
61
|
-
|
|
33
|
+
if (!isCollapsed &&
|
|
34
|
+
(insertion ? intent !== 'insertReplacementText' : kindOf(intent) === 'break' || dirOf(intent)))
|
|
62
35
|
return false;
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
|
|
36
|
+
const start = edytor.selection.getTextOfNode(range.startContainer);
|
|
37
|
+
const end = edytor.selection.getTextOfNode(range.endContainer);
|
|
38
|
+
const from = getYIndex(start, range.startContainer, range.startOffset);
|
|
39
|
+
const to = getYIndex(end, range.endContainer, range.endOffset);
|
|
40
|
+
if (insertion &&
|
|
67
41
|
isCollapsed &&
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
// The engine re-reports the admitted caret, canonicalized (Chromium moves
|
|
73
|
-
// ` tail`@0 into `Link`@4): the caret keeps its admitted edge side.
|
|
42
|
+
start === a.startText &&
|
|
43
|
+
end === start &&
|
|
44
|
+
from === a.yStart &&
|
|
45
|
+
to === from)
|
|
74
46
|
return false;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
47
|
+
const dir = dirOf(reported);
|
|
48
|
+
return (!dir ||
|
|
49
|
+
(!!start &&
|
|
50
|
+
start === end &&
|
|
51
|
+
from >= 0 &&
|
|
52
|
+
from <= to &&
|
|
53
|
+
to <= start.length &&
|
|
54
|
+
(from !== to || (dir === 'back' ? from > 0 : from < start.length))));
|
|
80
55
|
};
|
|
81
|
-
/**
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const range = createDomRange(targetRange.startContainer);
|
|
93
|
-
const dir = deleteDir(reported);
|
|
94
|
-
if (dir && edytor.selection.state.isCollapsed) {
|
|
95
|
-
const [container, offset] = dir === 'back'
|
|
96
|
-
? [targetRange.endContainer, targetRange.endOffset]
|
|
97
|
-
: [targetRange.startContainer, targetRange.startOffset];
|
|
98
|
-
range.setStart(container, offset);
|
|
56
|
+
/** The declared range becomes the model selection: the DOM selection is not a transport. */
|
|
57
|
+
const adoptDeclared = (edytor, a, declared) => {
|
|
58
|
+
const range = createDomRange(declared.startContainer);
|
|
59
|
+
const { startContainer, startOffset, endContainer, endOffset } = declared;
|
|
60
|
+
const dir = dirOf(a.reported);
|
|
61
|
+
if (dir && a.isCollapsed) {
|
|
62
|
+
// A collapsed caret's delete: the declared range only locates its edge.
|
|
63
|
+
if (dir === 'back')
|
|
64
|
+
range.setStart(endContainer, endOffset);
|
|
65
|
+
else
|
|
66
|
+
range.setStart(startContainer, startOffset);
|
|
99
67
|
range.collapse(true);
|
|
100
68
|
}
|
|
101
69
|
else {
|
|
102
|
-
range.setStart(
|
|
103
|
-
range.setEnd(
|
|
70
|
+
range.setStart(startContainer, startOffset);
|
|
71
|
+
range.setEnd(endContainer, endOffset);
|
|
104
72
|
}
|
|
105
73
|
edytor.selection.applySelectionSnapshot(createDomSelectionSnapshotFromRange(range), {
|
|
106
74
|
restoreNormalizedDomRange: false
|
|
107
75
|
});
|
|
76
|
+
reproject(edytor, a);
|
|
108
77
|
};
|
|
109
78
|
/**
|
|
110
79
|
* Undo-scope walk (Lexical #6714): when a control OUTSIDE the editor exhausts
|
|
111
80
|
* its own undo stack, Chromium/WebKit re-dispatch `historyUndo`/`historyRedo`
|
|
112
|
-
* at the contenteditable root
|
|
113
|
-
*
|
|
114
|
-
* the command
|
|
115
|
-
*
|
|
81
|
+
* at the contenteditable root. Those are not the editor's: no
|
|
82
|
+
* `preventDefault`, the owning scope handles them. A focused element outside
|
|
83
|
+
* owns the command; with nothing focused (the body, the document, the shadow
|
|
84
|
+
* host that retargets inner focus) the DOM selection decides.
|
|
116
85
|
*/
|
|
117
|
-
const
|
|
118
|
-
if (kindOf(event.inputType) !== 'history') {
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
86
|
+
const isForeignHistory = (edytor) => {
|
|
121
87
|
const node = edytor.node;
|
|
122
|
-
if (!node)
|
|
88
|
+
if (!node)
|
|
123
89
|
return true;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (activeElement === node || (activeElement && node.contains(activeElement))) {
|
|
90
|
+
const active = getActiveElement(node);
|
|
91
|
+
if (active && node.contains(active))
|
|
127
92
|
return false;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const ownerDocument = node.ownerDocument;
|
|
135
|
-
if (activeElement &&
|
|
136
|
-
activeElement !== shadowHost &&
|
|
137
|
-
activeElement !== ownerDocument.body &&
|
|
138
|
-
activeElement !== ownerDocument.documentElement) {
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
const selection = getDomSelection(node);
|
|
142
|
-
return !selection?.anchorNode || !node.contains(selection.anchorNode);
|
|
93
|
+
const { body, documentElement } = node.ownerDocument;
|
|
94
|
+
const anchor = getDomSelection(node)?.anchorNode;
|
|
95
|
+
return ((!!active &&
|
|
96
|
+
![body, documentElement, node.getRootNode().host].includes(active)) ||
|
|
97
|
+
!anchor ||
|
|
98
|
+
!node.contains(anchor));
|
|
143
99
|
};
|
|
144
100
|
/**
|
|
145
101
|
* An input the browser performs alone: any in a kind's own control (a field
|
|
@@ -152,94 +108,64 @@ const isBrowserOwnedNativeInput = (edytor, event) => ownsEvent(edytor.node, even
|
|
|
152
108
|
(isNativeInteractiveEvent(event) &&
|
|
153
109
|
edytor.selection.selectedBlocks.size === 0 &&
|
|
154
110
|
edytor.selection.selectedInlineBlock.size === 0);
|
|
155
|
-
const shouldIgnoreBeforeInput = (edytor, attempt) => edytor.readonly ||
|
|
156
|
-
attempt.isVoidEditableElement ||
|
|
157
|
-
(attempt.event &&
|
|
158
|
-
(isBrowserOwnedNativeInput(edytor, attempt.event) ||
|
|
159
|
-
isNativeInteractiveControl(attempt.event.target)));
|
|
160
|
-
/** One text, nothing spanning, no block selection: a change the browser can make alone. */
|
|
161
|
-
const isTextLocal = (edytor, attempt) => edytor.selection.selectedBlocks.size === 0 &&
|
|
162
|
-
Boolean(attempt.startText) &&
|
|
163
|
-
attempt.startText === attempt.endText &&
|
|
164
|
-
!attempt.isTextSpanning &&
|
|
165
|
-
!attempt.isBlockSpanning;
|
|
166
|
-
const isTextLocalDeletion = (edytor, attempt) => {
|
|
167
|
-
if (attempt.isStructuralKeyFallback ||
|
|
168
|
-
attempt.cancelable ||
|
|
169
|
-
isTrailingSoftBreakBackward(attempt) ||
|
|
170
|
-
(attempt.inputType !== 'deleteContentBackward' &&
|
|
171
|
-
attempt.inputType !== 'deleteContentForward') ||
|
|
172
|
-
!isTextLocal(edytor, attempt)) {
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
if (!attempt.isCollapsed) {
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
return attempt.inputType === 'deleteContentBackward'
|
|
179
|
-
? !attempt.isAtStartOfText
|
|
180
|
-
: !attempt.isAtEndOfText;
|
|
181
|
-
};
|
|
182
|
-
const isTextLocalReplacement = (edytor, attempt) => attempt.inputType === 'insertReplacementText' &&
|
|
183
|
-
attempt.isCollapsed &&
|
|
184
|
-
isTextLocal(edytor, attempt);
|
|
185
|
-
const isSafeTextLocalInsertion = (edytor, attempt) => !attempt.cancelable &&
|
|
186
|
-
attempt.inputType === 'insertText' &&
|
|
187
|
-
attempt.data !== '\t' &&
|
|
188
|
-
!(attempt.data === '@' && edytor.inlineBlocks.has('mention')) &&
|
|
189
|
-
attempt.isCollapsed &&
|
|
190
|
-
isTextLocal(edytor, attempt);
|
|
191
|
-
/** A non-cancelable insertion the model must perform: the browser's own write is drift. */
|
|
192
|
-
const isUnsafeNativeTextInsertion = (edytor, attempt) => !attempt.cancelable &&
|
|
193
|
-
((attempt.inputType === 'insertText' && !isSafeTextLocalInsertion(edytor, attempt)) ||
|
|
194
|
-
(attempt.inputType === 'insertReplacementText' && !isTextLocalReplacement(edytor, attempt)) ||
|
|
195
|
-
kindOf(attempt.inputType) === 'payload');
|
|
196
|
-
/**
|
|
197
|
-
* `insertTranspose` (macOS Ctrl+T) and `insertFromYank` (Emacs yank)
|
|
198
|
-
* carry no `data` and usually no `dataTransfer` — the model cannot know
|
|
199
|
-
* what to insert, so the only correct handling is letting the browser
|
|
200
|
-
* perform the mutation natively and reconciling it. Restricted to a
|
|
201
|
-
* single text: a spanning range would let the browser clobber structure
|
|
202
|
-
* the model cannot recover.
|
|
203
|
-
*/
|
|
204
|
-
const isTextLocalRearrangeInput = (edytor, attempt) => (attempt.inputType === 'insertTranspose' || attempt.inputType === 'insertFromYank') &&
|
|
205
|
-
!attempt.data &&
|
|
206
|
-
!attempt.hasDataTransferTextPayload &&
|
|
207
|
-
edytor.selection.selectedInlineBlock.size === 0 &&
|
|
208
|
-
isTextLocal(edytor, attempt);
|
|
209
111
|
/**
|
|
210
|
-
* The owner rule: the browser performs a text-local
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
112
|
+
* The owner rule, one answer per attempt: the browser performs a text-local
|
|
113
|
+
* change — an insertion it reports without letting the model take it (but a
|
|
114
|
+
* tab or a mention trigger), a replacement or rearrangement (transpose, yank:
|
|
115
|
+
* no data the model could insert), a character delete inside the text (not a
|
|
116
|
+
* trailing soft break's, whose `<br>` it mishandles) — and the attempt
|
|
117
|
+
* expects that change on its host (`deleteCompositionText`: none to check).
|
|
118
|
+
* The model performs everything else; the answer is then how it repairs
|
|
119
|
+
* the DOM drift around it and for how long: a browser write it could not
|
|
120
|
+
* prevent (text, payloads, breaks) is inverted for the window, a delete's
|
|
121
|
+
* also has its caret restored.
|
|
214
122
|
*/
|
|
215
|
-
const
|
|
216
|
-
const text =
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
123
|
+
const nativeOf = (edytor, a) => {
|
|
124
|
+
const { inputType: type, startText: text, cancelable, isCollapsed } = a;
|
|
125
|
+
const kind = kindOf(type);
|
|
126
|
+
const plain = !a.hasDataTransferTextPayload;
|
|
127
|
+
const local = !edytor.selection.selectedBlocks.size &&
|
|
128
|
+
!!text &&
|
|
129
|
+
text === a.endText &&
|
|
130
|
+
!a.projection.isTextSpanning &&
|
|
131
|
+
!a.projection.isBlockSpanning;
|
|
132
|
+
const change = (after = null) => ({ kind: 'change', host: text, after });
|
|
133
|
+
if (local) {
|
|
134
|
+
if (isCollapsed &&
|
|
135
|
+
!cancelable &&
|
|
136
|
+
type === 'insertText' &&
|
|
137
|
+
a.data !== '\t' &&
|
|
138
|
+
!(a.data === '@' && edytor.inlineBlocks.has('mention'))) {
|
|
139
|
+
const before = text.stringContent;
|
|
140
|
+
return change(before.slice(0, a.yStart) + a.data + before.slice(a.yStart));
|
|
141
|
+
}
|
|
142
|
+
if (isCollapsed && plain && type === 'insertReplacementText')
|
|
143
|
+
return change();
|
|
144
|
+
if (plain &&
|
|
145
|
+
!a.data &&
|
|
146
|
+
/^insert(Transpose|FromYank)$/.test(type) &&
|
|
147
|
+
!edytor.selection.selectedInlineBlock.size)
|
|
148
|
+
return change();
|
|
149
|
+
if (!cancelable &&
|
|
150
|
+
!a.isStructuralKeyFallback &&
|
|
151
|
+
/^deleteContent(Back|For)ward$/.test(type) &&
|
|
152
|
+
!isTrailingSoftBreakBackward(a) &&
|
|
153
|
+
!(isCollapsed &&
|
|
154
|
+
(dirOf(type) === 'back' ? a.projection.isAtStartOfText : a.projection.isAtEndOfText)))
|
|
155
|
+
return change();
|
|
156
|
+
}
|
|
157
|
+
if (type === 'deleteCompositionText')
|
|
230
158
|
return null;
|
|
231
|
-
|
|
232
|
-
};
|
|
233
|
-
/** How the browser's own mutation around a model-owned attempt is handled, for how long. */
|
|
234
|
-
const driftOf = (edytor, attempt) => {
|
|
235
|
-
const kind = kindOf(attempt.inputType);
|
|
236
|
-
if (attempt.cancelable || kind === 'history')
|
|
159
|
+
if (cancelable)
|
|
237
160
|
return ['refresh', 0];
|
|
238
|
-
if (
|
|
239
|
-
return ['discard', NATIVE_INPUT_REPAIR_WINDOW_MS];
|
|
240
|
-
if (kind === 'delete' && !isTextLocalDeletion(edytor, attempt))
|
|
161
|
+
if (kind === 'delete')
|
|
241
162
|
return ['restore', NATIVE_INPUT_REPAIR_WINDOW_MS];
|
|
242
|
-
return [
|
|
163
|
+
return [
|
|
164
|
+
'refresh',
|
|
165
|
+
kind === 'break' || kind === 'payload' || /^insert(Text|ReplacementText)$/.test(type)
|
|
166
|
+
? NATIVE_INPUT_REPAIR_WINDOW_MS
|
|
167
|
+
: 0
|
|
168
|
+
];
|
|
243
169
|
};
|
|
244
170
|
/**
|
|
245
171
|
* Android can announce a non-cancelable Backspace it never performs. At the
|
|
@@ -250,83 +176,64 @@ const androidNoOpBackspaceDeadline = (edytor, attempt) => {
|
|
|
250
176
|
const text = attempt.startText;
|
|
251
177
|
if (!isAndroidChromeBrowser() ||
|
|
252
178
|
attempt.inputType !== 'deleteContentBackward' ||
|
|
253
|
-
!
|
|
254
|
-
!attempt.isCollapsed ||
|
|
255
|
-
attempt.isAtStartOfText ||
|
|
256
|
-
attempt.isTextSpanning ||
|
|
257
|
-
attempt.isBlockSpanning) {
|
|
179
|
+
!attempt.isCollapsed)
|
|
258
180
|
return;
|
|
259
|
-
}
|
|
260
181
|
setTimeout(() => {
|
|
261
182
|
// Did this attempt's adoption apply (or refuse) a deletion?
|
|
262
183
|
if (attempt.phase === 'applied' ||
|
|
263
184
|
attempt.phase === 'failed' ||
|
|
264
185
|
!text.isInDocument ||
|
|
265
186
|
!sameValue(edytor.selection.value, attempt.target) ||
|
|
266
|
-
readDomText(text) !== text.stringContent)
|
|
187
|
+
readDomText(text) !== text.stringContent)
|
|
267
188
|
return;
|
|
268
|
-
}
|
|
269
189
|
attempt.phase = 'applied';
|
|
270
190
|
edytor.attempts.drift(attempt, 'refresh', 0);
|
|
271
|
-
|
|
272
|
-
edytor.selection.setAtTextOffset(text, deletion?.start ?? attempt.yStart - 1);
|
|
191
|
+
deleteInText(edytor, text, attempt.yStart, true, false);
|
|
273
192
|
}, NATIVE_INPUT_REPAIR_WINDOW_MS);
|
|
274
193
|
};
|
|
275
194
|
/**
|
|
276
195
|
* Backspace right after a trailing soft break: the browser mishandles the
|
|
277
196
|
* `<br>` it renders, so the model deletes the break (a command hooks see).
|
|
278
197
|
*/
|
|
279
|
-
const isTrailingSoftBreakBackward = ({ inputType,
|
|
280
|
-
|
|
281
|
-
|
|
198
|
+
export const isTrailingSoftBreakBackward = ({ inputType, yStart, yEnd, startText }) => inputType === 'deleteContentBackward' &&
|
|
199
|
+
yStart === yEnd &&
|
|
200
|
+
!!startText?.stringContent.endsWith('\n') &&
|
|
282
201
|
yStart === startText.length;
|
|
283
|
-
/** The pre-admission extension hook: an extension may claim a browser `beforeinput`. */
|
|
284
|
-
const runBeforeInputPlugins = (edytor, event) => {
|
|
285
|
-
edytor.plugins.forEach((plugin) => {
|
|
286
|
-
vetoable((prevent) => plugin.onBeforeInput?.({ prevent, e: event }));
|
|
287
|
-
});
|
|
288
|
-
};
|
|
289
202
|
/**
|
|
290
203
|
* Perform a model-owned attempt as one user command (undo policy, prevention
|
|
291
|
-
* scope): the key's bindings first (offered once per occurrence
|
|
292
|
-
*
|
|
204
|
+
* scope): the key's bindings first (offered once per occurrence: the key it
|
|
205
|
+
* stands for when no keydown offered it — Android, virtual keyboards; a
|
|
206
|
+
* non-cancelable intent too, its attempt owns the browser's drift either
|
|
207
|
+
* way), then its drift expectation, the extension hook and the intent's
|
|
208
|
+
* command.
|
|
293
209
|
*/
|
|
294
|
-
const perform = (edytor, attempt, offered) => edytor.dispatcher.run(attempt.inputType, async () => {
|
|
295
|
-
const { event } = attempt;
|
|
296
|
-
const kind = kindOf(
|
|
210
|
+
const perform = (edytor, attempt, offered, [mode, window]) => edytor.dispatcher.run(attempt.inputType, async () => {
|
|
211
|
+
const { event, inputType, data } = attempt;
|
|
212
|
+
const kind = kindOf(inputType);
|
|
297
213
|
attempt.phase = 'applied';
|
|
298
214
|
event?.preventDefault();
|
|
299
|
-
|
|
300
|
-
edytor.attempts.drift(attempt, 'refresh', 0);
|
|
301
|
-
if (attempt.inputType === 'historyUndo')
|
|
302
|
-
edytor.historyUndo();
|
|
303
|
-
else
|
|
304
|
-
edytor.historyRedo();
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
215
|
+
const key = inputType === 'insertText' && data === '\t' ? 'tab' : INTENTS[inputType]?.key;
|
|
307
216
|
// A binding claimed the intent: its command owns the result, the
|
|
308
217
|
// observer repairs what the browser did around it.
|
|
309
|
-
if (
|
|
218
|
+
if (key && key !== offered && edytor.keymap.run(key))
|
|
310
219
|
return;
|
|
311
|
-
const [mode, window] = driftOf(edytor, attempt);
|
|
312
220
|
// The live composition host is the session's: no drift expectation on it.
|
|
313
221
|
if (kind !== 'composition')
|
|
314
222
|
edytor.attempts.drift(attempt, mode, window);
|
|
223
|
+
if (kind === 'history')
|
|
224
|
+
return edytor[inputType]();
|
|
315
225
|
try {
|
|
316
226
|
if (event)
|
|
317
|
-
|
|
227
|
+
for (const plugin of edytor.plugins)
|
|
228
|
+
vetoable((prevent) => plugin.onBeforeInput?.({ prevent, e: event }));
|
|
318
229
|
await runBeforeInputCommand(edytor, attempt);
|
|
319
230
|
}
|
|
320
231
|
catch (error) {
|
|
321
232
|
attempt.phase = 'failed';
|
|
322
233
|
throw error;
|
|
323
234
|
}
|
|
324
|
-
if (
|
|
235
|
+
if (window)
|
|
325
236
|
edytor.attempts.arm(attempt, window);
|
|
326
|
-
// The command selected its caret; a paste re-renders the text it landed in.
|
|
327
|
-
const text = edytor.selection.state.startText;
|
|
328
|
-
if (attempt.inputType === 'insertFromPaste' && text?.node?.isConnected)
|
|
329
|
-
text.refreshFromModel();
|
|
330
237
|
if (kind !== 'composition')
|
|
331
238
|
edytor.composition.interrupt();
|
|
332
239
|
});
|
|
@@ -336,69 +243,61 @@ const perform = (edytor, attempt, offered) => edytor.dispatcher.run(attempt.inpu
|
|
|
336
243
|
* `key` is the keydown's attempt when that keydown announced the intent;
|
|
337
244
|
* `reuse` is that attempt itself when its `beforeinput` never came.
|
|
338
245
|
*/
|
|
339
|
-
const occur = (edytor, occurrence, key
|
|
340
|
-
|
|
246
|
+
const occur = (edytor, occurrence, key, offered, reuse) => {
|
|
247
|
+
const { event, declared } = occurrence;
|
|
341
248
|
const intent = intentOf(occurrence.inputType, occurrence.data ?? null, key?.inputType);
|
|
342
249
|
if (kindOf(intent) !== 'composition')
|
|
343
250
|
edytor.composition.occurred(intent);
|
|
251
|
+
const drop = () => reuse && edytor.attempts.close(reuse);
|
|
344
252
|
// Admission: an intent with no target is refused before the declared range
|
|
345
|
-
// (where the browser parked its own caret) could become one.
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
253
|
+
// (where the browser parked its own caret) could become one. Nothing is
|
|
254
|
+
// written; a browser write that cannot be prevented is drift the model
|
|
255
|
+
// owns until the deadline (a composition's is its session's: the tail
|
|
256
|
+
// restores its pinned host).
|
|
257
|
+
if (targetless(edytor, intent)) {
|
|
258
|
+
drop();
|
|
259
|
+
edytor.dispatcher.record({ operation: occurrence.inputType, status: 'refused' });
|
|
260
|
+
// The caret the browser placed for this key is its own, never adopted.
|
|
261
|
+
edytor.projector.parked();
|
|
262
|
+
if (occurrence.cancelable || !event)
|
|
263
|
+
return event?.preventDefault();
|
|
264
|
+
if (kindOf(occurrence.inputType) === 'composition')
|
|
265
|
+
return;
|
|
266
|
+
const attempt = edytor.attempts.admit(attemptOf(edytor, occurrence, key?.inputType), 'model');
|
|
267
|
+
attempt.phase = 'failed';
|
|
268
|
+
return edytor.attempts.drift(attempt, 'refresh', NATIVE_INPUT_REPAIR_WINDOW_MS);
|
|
355
269
|
}
|
|
356
|
-
const
|
|
357
|
-
if (
|
|
270
|
+
const attempt = reuse ? reproject(edytor, reuse) : attemptOf(edytor, occurrence, key?.inputType);
|
|
271
|
+
if (!reuse && declared && declares(edytor, attempt, declared))
|
|
272
|
+
adoptDeclared(edytor, attempt, declared);
|
|
273
|
+
// A native control's input over a block or atom selection (the others are
|
|
274
|
+
// the browser's, before any admission) writes nothing either.
|
|
275
|
+
if (edytor.readonly ||
|
|
276
|
+
attempt.isVoidEditableElement ||
|
|
277
|
+
(event && isNativeInteractiveControl(event.target)))
|
|
278
|
+
return drop();
|
|
279
|
+
const native = nativeOf(edytor, attempt);
|
|
280
|
+
if (!Array.isArray(native)) {
|
|
358
281
|
edytor.dispatcher.cut(attempt.inputType);
|
|
359
|
-
edytor.attempts.admit(attempt, 'browser',
|
|
360
|
-
androidNoOpBackspaceDeadline(edytor, attempt);
|
|
361
|
-
return;
|
|
282
|
+
edytor.attempts.admit(attempt, 'browser', native);
|
|
283
|
+
return androidNoOpBackspaceDeadline(edytor, attempt);
|
|
362
284
|
}
|
|
363
285
|
if (!edytor.dispatcher.permits()) {
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
edytor.attempts.close(reuse);
|
|
367
|
-
return;
|
|
286
|
+
event?.preventDefault();
|
|
287
|
+
return drop();
|
|
368
288
|
}
|
|
369
289
|
if (!reuse)
|
|
370
290
|
edytor.attempts.admit(attempt, 'model');
|
|
371
|
-
return perform(edytor, attempt, offered);
|
|
372
|
-
};
|
|
373
|
-
/**
|
|
374
|
-
* Refuse an occurrence with no target (`targetless`): nothing is written. A
|
|
375
|
-
* cancelable one is prevented; a browser write that cannot be is drift the
|
|
376
|
-
* model owns until the deadline (restored from the model, as an unsafe
|
|
377
|
-
* native insertion's).
|
|
378
|
-
*/
|
|
379
|
-
const refuseTargetless = (edytor, occurrence, key, reuse) => {
|
|
380
|
-
if (reuse)
|
|
381
|
-
edytor.attempts.close(reuse);
|
|
382
|
-
edytor.dispatcher.record({ operation: occurrence.inputType, status: 'refused' });
|
|
383
|
-
// The caret the browser placed for this key is its own, never adopted.
|
|
384
|
-
edytor.projector.parked();
|
|
385
|
-
if (occurrence.cancelable || !occurrence.event) {
|
|
386
|
-
occurrence.event?.preventDefault();
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
// A composition's writes are its session's: the tail restores its pinned host.
|
|
390
|
-
if (kindOf(occurrence.inputType) === 'composition')
|
|
391
|
-
return;
|
|
392
|
-
const attempt = edytor.attempts.admit(attemptOf(edytor, occurrence, key?.inputType), 'model');
|
|
393
|
-
attempt.phase = 'failed';
|
|
394
|
-
edytor.attempts.drift(attempt, 'discard', NATIVE_INPUT_REPAIR_WINDOW_MS);
|
|
291
|
+
return perform(edytor, attempt, offered, native);
|
|
395
292
|
};
|
|
396
|
-
/**
|
|
397
|
-
|
|
293
|
+
/** The keydown's attempt this occurrence confirms, and the chord it offered the bindings. */
|
|
294
|
+
const keyed = (edytor) => {
|
|
398
295
|
const offered = edytor.keymap.offered;
|
|
399
296
|
edytor.keymap.offered = null;
|
|
400
|
-
return
|
|
297
|
+
return [edytor.attempts.confirm(), offered];
|
|
401
298
|
};
|
|
299
|
+
/** An occurrence with no `beforeinput` of its own (paste, drop, a line break found in the DOM). */
|
|
300
|
+
export const runOccurrence = (edytor, occurrence) => occur(edytor, occurrence, ...keyed(edytor));
|
|
402
301
|
/**
|
|
403
302
|
* A keydown whose intent some engines never announce (structural keys): an
|
|
404
303
|
* attempt at the keydown's anchored target, run at the missing-`beforeinput`
|
|
@@ -416,22 +315,10 @@ const runKeyAttempt = async (edytor, attempt) => {
|
|
|
416
315
|
edytor.attempts.arm(attempt, NATIVE_INPUT_REPAIR_WINDOW_MS);
|
|
417
316
|
// The browser may have moved the selection since the keydown: the key
|
|
418
317
|
// acts on its anchored target, which followed any concurrent edit.
|
|
419
|
-
edytor.selection.
|
|
420
|
-
|
|
421
|
-
if (
|
|
422
|
-
edytor.
|
|
423
|
-
}
|
|
424
|
-
else if (state.startText && state.endText) {
|
|
425
|
-
if (state.isCollapsed)
|
|
426
|
-
edytor.selection.setAtTextOffset(state.startText, state.yStart);
|
|
427
|
-
else
|
|
428
|
-
edytor.selection.setAtRange(state.startText, state.yStart, state.endText, state.yEnd);
|
|
429
|
-
}
|
|
430
|
-
else {
|
|
431
|
-
// Its target is gone (a remote delete): a named no-op.
|
|
432
|
-
edytor.attempts.close(attempt);
|
|
433
|
-
return;
|
|
434
|
-
}
|
|
318
|
+
edytor.selection.select(attempt.target);
|
|
319
|
+
// Its target is gone (a remote delete): a named no-op.
|
|
320
|
+
if (!edytor.selection.projection.start)
|
|
321
|
+
return edytor.attempts.close(attempt);
|
|
435
322
|
// A real `beforeinput` or a newer key may have taken over meanwhile.
|
|
436
323
|
if (edytor.attempts.key !== attempt)
|
|
437
324
|
return;
|
|
@@ -439,42 +326,31 @@ const runKeyAttempt = async (edytor, attempt) => {
|
|
|
439
326
|
};
|
|
440
327
|
export async function onBeforeInput(event) {
|
|
441
328
|
// The keydown of this occurrence may have admitted its attempt and offered its key.
|
|
442
|
-
const key = this
|
|
443
|
-
const
|
|
444
|
-
|
|
445
|
-
if (
|
|
446
|
-
event.preventDefault();
|
|
447
|
-
this.selection.pointer.release();
|
|
448
|
-
return;
|
|
449
|
-
}
|
|
450
|
-
if (isBrowserOwnedNativeInput(this, event)) {
|
|
451
|
-
this.attempts.clear((attempt) => attempt.owner === 'browser');
|
|
452
|
-
return;
|
|
453
|
-
}
|
|
454
|
-
const declared = typeof event.getTargetRanges === 'function' ? (event.getTargetRanges()[0] ?? null) : null;
|
|
455
|
-
if (declared && !isRangeInsideEditor(this, declared)) {
|
|
456
|
-
event.preventDefault();
|
|
457
|
-
return;
|
|
458
|
-
}
|
|
459
|
-
if (isForeignHistoryBeforeInput(this, event)) {
|
|
460
|
-
return;
|
|
461
|
-
}
|
|
462
|
-
if (this.isComposing && kindOf(event.inputType) === 'history') {
|
|
463
|
-
// A history command landing mid-composition would consume capture
|
|
464
|
-
// groups (and the preview's own model writes) while the IME still
|
|
465
|
-
// owns the DOM node; the commit would then resolve against a moved
|
|
466
|
-
// document. Swallow it — undo applies cleanly after the commit.
|
|
329
|
+
const [key, offered] = keyed(this);
|
|
330
|
+
const { inputType } = event;
|
|
331
|
+
const kind = kindOf(inputType);
|
|
332
|
+
if (inputType === 'deleteByDrag' && event.isTrusted) {
|
|
467
333
|
event.preventDefault();
|
|
334
|
+
return this.selection.pointer.release();
|
|
335
|
+
}
|
|
336
|
+
if (isBrowserOwnedNativeInput(this, event))
|
|
337
|
+
return this.attempts.clear((attempt) => attempt.owner === 'browser');
|
|
338
|
+
const declared = event.getTargetRanges?.()[0] ?? null;
|
|
339
|
+
const node = this.node;
|
|
340
|
+
if (declared &&
|
|
341
|
+
!(node?.contains(declared.startContainer) && node.contains(declared.endContainer)))
|
|
342
|
+
return event.preventDefault();
|
|
343
|
+
if (kind === 'history' && isForeignHistory(this))
|
|
468
344
|
return;
|
|
469
|
-
|
|
470
|
-
//
|
|
471
|
-
//
|
|
472
|
-
//
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
345
|
+
// A history command landing mid-composition would consume capture groups
|
|
346
|
+
// (and the preview's own model writes) while the IME still owns the DOM
|
|
347
|
+
// node: swallowed, undo applies cleanly after the commit. A paste or drop
|
|
348
|
+
// mid-composition is left to the browser (PM input.ts:656-660): the
|
|
349
|
+
// preview owns the write path, the observer reconciles it after the end.
|
|
350
|
+
if (this.isComposing && (kind === 'history' || kind === 'payload'))
|
|
351
|
+
return kind === 'history' ? event.preventDefault() : undefined;
|
|
476
352
|
return occur(this, {
|
|
477
|
-
inputType
|
|
353
|
+
inputType,
|
|
478
354
|
data: event.data,
|
|
479
355
|
dataTransfer: event.dataTransfer,
|
|
480
356
|
declared,
|