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
|
@@ -4,7 +4,7 @@ import { attemptOf, intentSnapshot, kindOf, untargeted } from './attempt.js';
|
|
|
4
4
|
import { insertionMarks } from './editing/text.js';
|
|
5
5
|
/** How long the tail owns late signals of an engine that sends no next occurrence (compared at use). */
|
|
6
6
|
const TAIL_MS = 500;
|
|
7
|
-
const now = () =>
|
|
7
|
+
const now = () => performance.now();
|
|
8
8
|
const isAppleWebKit = () => typeof navigator !== 'undefined' &&
|
|
9
9
|
/AppleWebKit/i.test(navigator.userAgent) &&
|
|
10
10
|
!/(Chrome|Chromium|Edg|OPR|SamsungBrowser)/i.test(navigator.userAgent);
|
|
@@ -55,9 +55,8 @@ export class Composition {
|
|
|
55
55
|
#tail = null;
|
|
56
56
|
#caret = null;
|
|
57
57
|
#waiting = [];
|
|
58
|
-
/** Where the host's block sits (
|
|
59
|
-
#where =
|
|
60
|
-
#order = [];
|
|
58
|
+
/** Where the host's block sits (`#place`): the re-placement check compares it. */
|
|
59
|
+
#where = [];
|
|
61
60
|
/** After a re-placing commit, until the IME ends: the text it committed (resumed over), or `lost` (dropped). */
|
|
62
61
|
#resume = null;
|
|
63
62
|
/** Phantom structural keys the tail swallowed (a test oracle). */
|
|
@@ -68,8 +67,6 @@ export class Composition {
|
|
|
68
67
|
get live() {
|
|
69
68
|
return this.phase === 'live';
|
|
70
69
|
}
|
|
71
|
-
/** `node` lies inside the element a live session owns (the pinned element). */
|
|
72
|
-
owns = (node) => this.host !== null && this.edytor.pin.owns(node);
|
|
73
70
|
/** Run `fn` once the live session has ended (after its writes), or now when none is live. */
|
|
74
71
|
ended = (fn) => {
|
|
75
72
|
if (this.live)
|
|
@@ -98,7 +95,7 @@ export class Composition {
|
|
|
98
95
|
this.#resume = null;
|
|
99
96
|
if (resume && resume !== 'lost')
|
|
100
97
|
selection.select(resume);
|
|
101
|
-
const { startText, endText, yStart, yEnd } = selection.
|
|
98
|
+
const { startText, endText, yStart, yEnd } = selection.textRange();
|
|
102
99
|
this.phase = 'live';
|
|
103
100
|
this.#tail = this.#caret = this.#region = null;
|
|
104
101
|
this.#own.clear();
|
|
@@ -117,8 +114,11 @@ export class Composition {
|
|
|
117
114
|
? 'block'
|
|
118
115
|
: 'blocks'
|
|
119
116
|
: false;
|
|
117
|
+
// With no target, the caret the browser parked for the IME.
|
|
118
|
+
const parked = targetless && dom?.anchorNode;
|
|
119
|
+
const point = parked ? this.edytor.ports.surface.pointAt(parked, dom.anchorOffset) : null;
|
|
120
120
|
const at = targetless
|
|
121
|
-
?
|
|
121
|
+
? point && { text: point.text, from: point.offset, to: point.offset }
|
|
122
122
|
: shown === 'blocks' || shown === 'atom'
|
|
123
123
|
? this.#rangeless()
|
|
124
124
|
: startText && {
|
|
@@ -130,7 +130,6 @@ export class Composition {
|
|
|
130
130
|
this.#pin(at.text, at.from, at.to);
|
|
131
131
|
this.host = at?.text ?? null;
|
|
132
132
|
this.#where = this.#place();
|
|
133
|
-
this.#order = this.#siblings();
|
|
134
133
|
};
|
|
135
134
|
/** A composition update: the model holds `value` (mechanical, in the capture group). */
|
|
136
135
|
update = (value, attempt) => {
|
|
@@ -187,7 +186,7 @@ export class Composition {
|
|
|
187
186
|
restructured = (change) => {
|
|
188
187
|
if (!this.live || !(change.removed.size || change.moved.size || change.meta.size))
|
|
189
188
|
return;
|
|
190
|
-
if (
|
|
189
|
+
if (!this.#replaced())
|
|
191
190
|
return;
|
|
192
191
|
const shown = this.edytor.pin.imeBuffer() ?? this.preview;
|
|
193
192
|
const at = this.#kept();
|
|
@@ -243,12 +242,10 @@ export class Composition {
|
|
|
243
242
|
}
|
|
244
243
|
const tail = this.tail();
|
|
245
244
|
this.occurred();
|
|
246
|
-
|
|
245
|
+
// A caret: a block or atom selection is no collapsed projection.
|
|
247
246
|
const phantom = tail &&
|
|
248
247
|
(event.key === 'Enter' || (event.key === 'Backspace' && isAppleWebKit())) &&
|
|
249
|
-
|
|
250
|
-
!selectedBlocks.size &&
|
|
251
|
-
!selectedInlineBlock.size;
|
|
248
|
+
this.edytor.selection.projection.isCollapsed;
|
|
252
249
|
if (!phantom)
|
|
253
250
|
return false;
|
|
254
251
|
this.swallows++;
|
|
@@ -299,10 +296,10 @@ export class Composition {
|
|
|
299
296
|
*/
|
|
300
297
|
#rangeless() {
|
|
301
298
|
const { edytor } = this;
|
|
302
|
-
const { selectedBlocks,
|
|
299
|
+
const { selectedBlocks, projection } = edytor.selection;
|
|
303
300
|
const exit = selectedBlocks.size
|
|
304
301
|
? selectedBlocksExit(edytor)
|
|
305
|
-
:
|
|
302
|
+
: edytor.selection.textAt(projection.start);
|
|
306
303
|
const at = this.#open() ? this.#at() : exit;
|
|
307
304
|
if (!at)
|
|
308
305
|
return null;
|
|
@@ -312,41 +309,38 @@ export class Composition {
|
|
|
312
309
|
edytor.ports.surface.park(at.text, at.offset);
|
|
313
310
|
return { text: at.text, from: at.offset, to: at.offset };
|
|
314
311
|
}
|
|
315
|
-
/**
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
return at && { text: at.text, from: at.offset, to: at.offset };
|
|
320
|
-
}
|
|
321
|
-
/** The host's block and its ancestors (none once it is not visible). */
|
|
322
|
-
#chain() {
|
|
323
|
-
const { facade } = this.edytor;
|
|
324
|
-
const id = this.host?.parent.id;
|
|
325
|
-
return id && facade.isVisibleBlock(id) ? [id, ...facade.ancestorsOf(id)] : [];
|
|
326
|
-
}
|
|
327
|
-
/** The chain with its types. */
|
|
312
|
+
/**
|
|
313
|
+
* Where the host's block sits: it and its ancestors (none once it is not
|
|
314
|
+
* visible), each with its type and its parent's child ids.
|
|
315
|
+
*/
|
|
328
316
|
#place() {
|
|
329
317
|
const { facade } = this.edytor;
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
return this.#chain().map((id) => ({ id, kids: facade.childrenIds(facade.parentOf(id)) }));
|
|
318
|
+
const id = this.host?.parent.id;
|
|
319
|
+
const chain = id && facade.isVisibleBlock(id) ? [id, ...facade.ancestorsOf(id)] : [];
|
|
320
|
+
return chain.map((id) => ({
|
|
321
|
+
id,
|
|
322
|
+
type: facade.blockTypeOf(id),
|
|
323
|
+
kids: facade.childrenIds(facade.parentOf(id))
|
|
324
|
+
}));
|
|
338
325
|
}
|
|
339
|
-
/**
|
|
340
|
-
|
|
341
|
-
|
|
326
|
+
/**
|
|
327
|
+
* The host's block was re-placed since the last look: a chain member is
|
|
328
|
+
* another block or kind, or moved among the siblings it had and still
|
|
329
|
+
* has (a same-parent move).
|
|
330
|
+
*/
|
|
331
|
+
#replaced() {
|
|
332
|
+
const [before, after] = [this.#where, (this.#where = this.#place())];
|
|
342
333
|
const rank = (id, kids, other) => {
|
|
343
334
|
const kept = new Set(other);
|
|
344
335
|
return kids.filter((kid) => kept.has(kid)).indexOf(id);
|
|
345
336
|
};
|
|
346
|
-
return before.
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
337
|
+
return (before.length !== after.length ||
|
|
338
|
+
before.some(({ id, type, kids }, i) => {
|
|
339
|
+
const now = after[i];
|
|
340
|
+
return (now.id !== id ||
|
|
341
|
+
now.type !== type ||
|
|
342
|
+
rank(id, kids, now.kids) !== rank(id, now.kids, kids));
|
|
343
|
+
}));
|
|
350
344
|
}
|
|
351
345
|
/** The preview's position while it is live and whole in one visible block (not deleted with it). */
|
|
352
346
|
#kept() {
|
|
@@ -379,17 +373,15 @@ export class Composition {
|
|
|
379
373
|
const end = this.#region && facade.resolveAnchor(this.#region.end);
|
|
380
374
|
if (!start || !end || !this.#own.size)
|
|
381
375
|
return [];
|
|
382
|
-
const spans = start.blockId === end.blockId
|
|
383
|
-
? [{ blockId: start.blockId, from: start.offset, to: end.offset }]
|
|
384
|
-
: [
|
|
385
|
-
{ blockId: start.blockId, from: start.offset, to: facade.displayLength(start.blockId) },
|
|
386
|
-
{ blockId: end.blockId, from: 0, to: end.offset }
|
|
387
|
-
];
|
|
388
376
|
const units = [];
|
|
389
|
-
for (const { blockId, from
|
|
390
|
-
|
|
377
|
+
for (const { blockId, offset: from } of start.blockId === end.blockId
|
|
378
|
+
? [start]
|
|
379
|
+
: [start, end]) {
|
|
380
|
+
const to = blockId === end.blockId ? end.offset : facade.displayLength(blockId);
|
|
381
|
+
for (let offset = blockId === start.blockId ? from : 0; offset < to; offset++)
|
|
391
382
|
if (this.#own.has(this.#unit(blockId, offset)))
|
|
392
383
|
units.push({ blockId, offset });
|
|
384
|
+
}
|
|
393
385
|
return units;
|
|
394
386
|
}
|
|
395
387
|
/** Delete the preview's live units through the facade's text delete, one run each, last first; foreign units stay. */
|
|
@@ -451,15 +443,12 @@ export class Composition {
|
|
|
451
443
|
const um = this.edytor.undoManager;
|
|
452
444
|
if (!um || this.#item)
|
|
453
445
|
return write();
|
|
454
|
-
const
|
|
455
|
-
um.on('stack-item-added', record);
|
|
456
|
-
um.on('stack-item-updated', record);
|
|
446
|
+
const off = um.observe(({ stackItem }) => (this.#item ??= stackItem));
|
|
457
447
|
try {
|
|
458
448
|
return write();
|
|
459
449
|
}
|
|
460
450
|
finally {
|
|
461
|
-
|
|
462
|
-
um.off('stack-item-updated', record);
|
|
451
|
+
off();
|
|
463
452
|
}
|
|
464
453
|
}
|
|
465
454
|
/** The one ending: `value` replaces the preview (a commit shown to hooks), '' deletes it. */
|
|
@@ -471,7 +460,7 @@ export class Composition {
|
|
|
471
460
|
const { edytor } = this;
|
|
472
461
|
const { dispatcher, selection } = edytor;
|
|
473
462
|
// A command that moved the caret out of the region keeps it there.
|
|
474
|
-
const { startText: moved, yStart: movedAt } = selection.
|
|
463
|
+
const { startText: moved, yStart: movedAt } = selection.textRange();
|
|
475
464
|
const keep = this.#interrupted && moved && !this.covers(moved, movedAt);
|
|
476
465
|
this.#tail = this.host;
|
|
477
466
|
this.#ended = now();
|
|
@@ -482,13 +471,15 @@ export class Composition {
|
|
|
482
471
|
this.#hold();
|
|
483
472
|
if (at && value) {
|
|
484
473
|
const text = at.text;
|
|
485
|
-
const
|
|
486
|
-
|
|
474
|
+
const args = [text.parent.id, text.segStart + at.offset, value, this.marks];
|
|
475
|
+
const prepare = (a) => edytor.facade.prepare.insertText(...a);
|
|
476
|
+
// The preview goes first, in the command: the insertion is prepared over what it leaves.
|
|
477
|
+
dispatcher.run('insertFromComposition', () => dispatcher.dispatch('insertText', args, { block: text.parent, text }, (a) => {
|
|
487
478
|
this.#erase();
|
|
488
|
-
|
|
479
|
+
dispatcher.write(prepare(a));
|
|
489
480
|
if (selection.pending)
|
|
490
481
|
selection.stage(undefined);
|
|
491
|
-
}));
|
|
482
|
+
}, prepare));
|
|
492
483
|
}
|
|
493
484
|
// A refused commit, or a cancel: the preview goes.
|
|
494
485
|
if (!value || dispatcher.last?.status === 'refused')
|
|
@@ -498,7 +489,7 @@ export class Composition {
|
|
|
498
489
|
if (text)
|
|
499
490
|
this.#caret = { text, offset: Math.min(at.offset + typed, text.length) };
|
|
500
491
|
}
|
|
501
|
-
const { startText, yStart } = selection.
|
|
492
|
+
const { startText, yStart } = selection.textRange();
|
|
502
493
|
const caret = keep && startText ? { text: startText, offset: yStart } : this.#caret;
|
|
503
494
|
this.#release();
|
|
504
495
|
if (caret)
|
|
@@ -512,8 +503,7 @@ export class Composition {
|
|
|
512
503
|
this.host = null;
|
|
513
504
|
// No host, no re-placement baseline: a stale one would end the next session
|
|
514
505
|
// when its start target's replacement commits (`#rangeless`).
|
|
515
|
-
this.#where =
|
|
516
|
-
this.#order = [];
|
|
506
|
+
this.#where = [];
|
|
517
507
|
this.#region = this.#merged = null;
|
|
518
508
|
this.#own.clear();
|
|
519
509
|
this.edytor.pin.release();
|
|
@@ -42,3 +42,9 @@ export declare const marksForInsertion: (text: Text, offset: number, { replaced,
|
|
|
42
42
|
* is replaced: typing, a soft break, a plain paste, an IME's first preview.
|
|
43
43
|
*/
|
|
44
44
|
export declare const insertionMarks: (edytor: Edytor, snapshot: Attempt) => Marks;
|
|
45
|
+
/**
|
|
46
|
+
* The marks of text a view inserts at offset `offset` of block `id` with
|
|
47
|
+
* none named (`edytor.insertText(id, offset, text)`): the caret's pending
|
|
48
|
+
* marks when it sits there, else the neighbours' (`marksForInsertion`).
|
|
49
|
+
*/
|
|
50
|
+
export declare const insertionMarksAt: (edytor: Edytor, id: string, offset: number) => Marks;
|
|
@@ -9,9 +9,10 @@ const commonMarks = (parts) => {
|
|
|
9
9
|
};
|
|
10
10
|
/** The side the selection admitted for a caret at `text`/`offset`, if it sits there. */
|
|
11
11
|
export const admittedSide = (text, offset) => {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
const { selection } = text.edytor;
|
|
13
|
+
const { startText, yStart } = selection.textRange();
|
|
14
|
+
return selection.projection.isCollapsed && startText === text && yStart === offset
|
|
15
|
+
? selection.edge
|
|
15
16
|
: undefined;
|
|
16
17
|
};
|
|
17
18
|
export const marksForInsertion = (text, offset, { replaced, side = admittedSide(text, offset), pending } = {}) => {
|
|
@@ -51,3 +52,16 @@ export const insertionMarks = (edytor, snapshot) => {
|
|
|
51
52
|
pending: edytor.selection.pending
|
|
52
53
|
});
|
|
53
54
|
};
|
|
55
|
+
/**
|
|
56
|
+
* The marks of text a view inserts at offset `offset` of block `id` with
|
|
57
|
+
* none named (`edytor.insertText(id, offset, text)`): the caret's pending
|
|
58
|
+
* marks when it sits there, else the neighbours' (`marksForInsertion`).
|
|
59
|
+
*/
|
|
60
|
+
export const insertionMarksAt = (edytor, id, offset) => {
|
|
61
|
+
const at = edytor.idToBlock.get(id)?.textAtOffset(offset);
|
|
62
|
+
if (!at)
|
|
63
|
+
return {};
|
|
64
|
+
const { caret, pending } = edytor.selection;
|
|
65
|
+
const here = caret?.block.id === id && caret.offset === offset;
|
|
66
|
+
return marksForInsertion(at.text, at.offset, { pending: here ? pending : undefined });
|
|
67
|
+
};
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
import { Block } from '../block/block.svelte.js';
|
|
16
16
|
import { InlineBlock } from '../block/inlineBlock.svelte.js';
|
|
17
17
|
import { Text } from '../text/text.svelte.js';
|
|
18
|
-
import type { ContentItem, DocChange } from '../crdt/index.js';
|
|
18
|
+
import type { ContentItem, Destination, DocChange } from '../crdt/index.js';
|
|
19
19
|
import type { Edytor } from '../edytor.svelte.js';
|
|
20
|
+
import type { JSONText } from '../utils/json.js';
|
|
20
21
|
export type TextRunItem = {
|
|
21
22
|
text: string;
|
|
22
23
|
marks?: Record<string, unknown>;
|
|
@@ -36,6 +37,14 @@ export type ContentPart = {
|
|
|
36
37
|
};
|
|
37
38
|
/** Segments and atoms, alternating, starting and ending with a segment. */
|
|
38
39
|
export declare const contentParts: (items: readonly ContentItem[]) => ContentPart[];
|
|
40
|
+
/**
|
|
41
|
+
* A text segment's items as `JSONText` runs (`text.value`): empty items
|
|
42
|
+
* dropped, adjacent runs with the same marks joined, each run's marks a
|
|
43
|
+
* copy (none when it has no mark).
|
|
44
|
+
*/
|
|
45
|
+
export declare const segmentJSON: (items: readonly TextRunItem[]) => JSONText[];
|
|
46
|
+
/** The destination right after `block` among its siblings (`after: false`, right before it). */
|
|
47
|
+
export declare const siblingSlot: (block: Block, after?: boolean) => Destination;
|
|
39
48
|
export declare class Handles {
|
|
40
49
|
#private;
|
|
41
50
|
private edytor;
|
package/dist/session/handles.js
CHANGED
|
@@ -38,7 +38,35 @@ export const contentParts = (items) => {
|
|
|
38
38
|
close();
|
|
39
39
|
return parts;
|
|
40
40
|
};
|
|
41
|
+
/**
|
|
42
|
+
* A text segment's items as `JSONText` runs (`text.value`): empty items
|
|
43
|
+
* dropped, adjacent runs with the same marks joined, each run's marks a
|
|
44
|
+
* copy (none when it has no mark).
|
|
45
|
+
*/
|
|
46
|
+
export const segmentJSON = (items) => {
|
|
47
|
+
const out = [];
|
|
48
|
+
for (const { text, marks = {} } of items) {
|
|
49
|
+
if (!text)
|
|
50
|
+
continue;
|
|
51
|
+
const keys = Object.keys(marks);
|
|
52
|
+
const last = out.at(-1);
|
|
53
|
+
const held = last?.marks ?? {};
|
|
54
|
+
if (last && Object.keys(held).length === keys.length && keys.every((k) => held[k] === marks[k]))
|
|
55
|
+
last.text += text;
|
|
56
|
+
else
|
|
57
|
+
out.push(keys.length ? { text, marks: { ...marks } } : { text });
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
};
|
|
41
61
|
const ROOT = contentParts([]);
|
|
62
|
+
/** The destination right after `block` among its siblings (`after: false`, right before it). */
|
|
63
|
+
export const siblingSlot = (block, after = true) => {
|
|
64
|
+
const parent = block.parent;
|
|
65
|
+
return {
|
|
66
|
+
parent: !parent || parent.isRoot ? null : parent.id,
|
|
67
|
+
index: block.index + Number(after)
|
|
68
|
+
};
|
|
69
|
+
};
|
|
42
70
|
export class Handles {
|
|
43
71
|
edytor;
|
|
44
72
|
root;
|
|
@@ -53,8 +53,4 @@ export declare class History {
|
|
|
53
53
|
* `refused`, `noop` on an empty stack, else `applied`.
|
|
54
54
|
*/
|
|
55
55
|
replay: (command: "undo" | "redo") => "refused" | "noop" | "applied";
|
|
56
|
-
/** Replay the top undo item; answers whether one was replayed. */
|
|
57
|
-
undo: () => boolean;
|
|
58
|
-
/** Replay the top redo item; answers whether one was replayed. */
|
|
59
|
-
redo: () => boolean;
|
|
60
56
|
}
|
package/dist/session/history.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { project, textSelection } from './selection.js';
|
|
1
|
+
import { project, sameEnds, textSelection } from './selection.js';
|
|
2
2
|
const KEY = 'edytor:selection';
|
|
3
3
|
/** A stack item's last dispatched write was an insertion (`wrote`): typing may continue it. */
|
|
4
4
|
const INSERTING = 'edytor:inserting';
|
|
@@ -50,12 +50,10 @@ export class History {
|
|
|
50
50
|
this.#open = { entry, gesture: this.edytor.intentSerial };
|
|
51
51
|
};
|
|
52
52
|
doc.on('beforeTransaction', begin);
|
|
53
|
-
um.
|
|
54
|
-
um.on('stack-item-updated', record);
|
|
53
|
+
const off = um.observe(record);
|
|
55
54
|
this.#off = () => {
|
|
56
55
|
doc.off('beforeTransaction', begin);
|
|
57
|
-
|
|
58
|
-
um.off('stack-item-updated', record);
|
|
56
|
+
off();
|
|
59
57
|
};
|
|
60
58
|
};
|
|
61
59
|
unbind = () => {
|
|
@@ -78,12 +76,16 @@ export class History {
|
|
|
78
76
|
* moves) restores the one the user had.
|
|
79
77
|
*/
|
|
80
78
|
began = (value) => {
|
|
81
|
-
const {
|
|
82
|
-
const item = um?.undoStack.at(-1);
|
|
83
|
-
const entry = item && entries(item).get(key);
|
|
79
|
+
const { entry } = this.#top();
|
|
84
80
|
if (entry)
|
|
85
81
|
entry.before = value;
|
|
86
82
|
};
|
|
83
|
+
/** The top undo item and this view's entry on it. */
|
|
84
|
+
#top() {
|
|
85
|
+
const { undoManager: um, transaction: key } = this.edytor;
|
|
86
|
+
const item = um?.undoStack.at(-1);
|
|
87
|
+
return { item, entry: item && entries(item).get(key) };
|
|
88
|
+
}
|
|
87
89
|
/** The dispatcher wrote in this transaction: an insertion (`inserts`) or not. */
|
|
88
90
|
wrote = (insertion) => {
|
|
89
91
|
this.#inserting = (this.#inserting ?? true) && insertion;
|
|
@@ -97,16 +99,12 @@ export class History {
|
|
|
97
99
|
* follows.
|
|
98
100
|
*/
|
|
99
101
|
continues = (value) => {
|
|
100
|
-
const {
|
|
101
|
-
const
|
|
102
|
-
if (item?.meta.get(INSERTING) !== true)
|
|
103
|
-
return false;
|
|
104
|
-
const after = item?.meta.get(KEY)?.get(key)?.after;
|
|
105
|
-
if (after?.kind !== 'text' || value.kind !== 'text')
|
|
102
|
+
const { item, entry } = this.#top();
|
|
103
|
+
const after = entry?.after;
|
|
104
|
+
if (item?.meta.get(INSERTING) !== true || after?.kind !== 'text' || value.kind !== 'text')
|
|
106
105
|
return false;
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
return at(a.start, b.start) && at(a.end, b.end);
|
|
106
|
+
const a = project(after, this.edytor.facade);
|
|
107
|
+
return !!a.start && sameEnds(a, project(value, this.edytor.facade));
|
|
110
108
|
};
|
|
111
109
|
/**
|
|
112
110
|
* Replay the top undo (redo) item, under the dispatcher's admission (a
|
|
@@ -114,10 +112,6 @@ export class History {
|
|
|
114
112
|
* `refused`, `noop` on an empty stack, else `applied`.
|
|
115
113
|
*/
|
|
116
114
|
replay = (command) => !this.edytor.dispatcher.permits() ? 'refused' : this.#run(command) ? 'applied' : 'noop';
|
|
117
|
-
/** Replay the top undo item; answers whether one was replayed. */
|
|
118
|
-
undo = () => this.replay('undo') === 'applied';
|
|
119
|
-
/** Replay the top redo item; answers whether one was replayed. */
|
|
120
|
-
redo = () => this.replay('redo') === 'applied';
|
|
121
115
|
#run(command) {
|
|
122
116
|
const { undoManager: um, transaction: key, selection, facade } = this.edytor;
|
|
123
117
|
this.#open = null;
|
|
@@ -18,111 +18,102 @@ const matchAtEnd = (find, subject) => {
|
|
|
18
18
|
export const inputRulesHook = (edytor, rules) => {
|
|
19
19
|
/** A rule's replacement, or the typed text after it declined, is running: no rule runs on its writes. */
|
|
20
20
|
let running = false;
|
|
21
|
-
/** The typed text lands as typed, the caret after it. */
|
|
22
|
-
const typeAsIs = (text, payload, at) => {
|
|
23
|
-
text.insertText(payload);
|
|
24
|
-
edytor.dispatcher.caret(text, at + payload.value.length);
|
|
25
|
-
};
|
|
26
21
|
return (change) => {
|
|
22
|
+
const { dispatcher, facade, selection } = edytor;
|
|
27
23
|
if (running || change.operation !== 'insertText' || !rules.length)
|
|
28
24
|
return;
|
|
29
25
|
// Typed text only: a paste or a drop (a URL pasted at the caret) completes no rule.
|
|
30
|
-
if (
|
|
26
|
+
if (dispatcher.command?.startsWith('insertFrom'))
|
|
31
27
|
return;
|
|
32
28
|
const { payload, block, prevent, text } = change;
|
|
33
|
-
const
|
|
34
|
-
const { startText, yStart } =
|
|
29
|
+
const [, offset, value] = payload;
|
|
30
|
+
const { startText, yStart } = selection.textRange();
|
|
35
31
|
// Only text typed at the caret: an insertion elsewhere completes no rule.
|
|
36
|
-
if (!caret || !
|
|
32
|
+
if (!selection.caret || !text || text !== startText)
|
|
37
33
|
return;
|
|
38
|
-
if (
|
|
34
|
+
if (offset !== text.segStart + yStart)
|
|
39
35
|
return;
|
|
40
|
-
if (!
|
|
36
|
+
if (!value || inCodeLines(edytor, block))
|
|
41
37
|
return;
|
|
42
|
-
const before =
|
|
43
|
-
const subject = before +
|
|
44
|
-
// The
|
|
45
|
-
const
|
|
38
|
+
const before = text.stringContent.slice(0, yStart);
|
|
39
|
+
const subject = before + value;
|
|
40
|
+
// The rules that match, with the typed text inside their match.
|
|
41
|
+
const matches = rules.flatMap((rule) => {
|
|
46
42
|
const match = matchAtEnd(rule.find, subject);
|
|
47
|
-
return
|
|
43
|
+
return match && match.index <= before.length ? [{ rule, match }] : [];
|
|
48
44
|
});
|
|
49
|
-
if (
|
|
45
|
+
if (!matches.length)
|
|
50
46
|
return;
|
|
47
|
+
/** The typed text lands as typed, the caret after it. */
|
|
48
|
+
const typeAsIs = () => {
|
|
49
|
+
edytor.insertText(...payload);
|
|
50
|
+
dispatcher.caret(text, yStart + value.length);
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Run `rule` over `match`: whether it wrote, or `null` when it declined
|
|
54
|
+
* (the next rule is asked).
|
|
55
|
+
*/
|
|
56
|
+
const apply = (rule, match) => {
|
|
57
|
+
/** The match's start in the segment; the match in the block, `from` to the caret. */
|
|
58
|
+
const start = match.index;
|
|
59
|
+
const from = text.segStart + start;
|
|
60
|
+
const to = text.segStart + yStart;
|
|
61
|
+
let removed = null;
|
|
62
|
+
/** Remove the match in the same plan as `then`'s first operation: `ctx.remove`. */
|
|
63
|
+
const remove = (then) => {
|
|
64
|
+
const last = dispatcher.last;
|
|
65
|
+
if (to > from) {
|
|
66
|
+
const removal = facade.prepare.deleteText(block.id, from, to - from);
|
|
67
|
+
const run = dispatcher.lead(removal, () => then?.());
|
|
68
|
+
// Nothing took the lead: the matched text goes on its own, unless `then` declined.
|
|
69
|
+
if (!run.taken && run.out !== false && text.index !== -1)
|
|
70
|
+
edytor.deleteText(block.id, from, to - from);
|
|
71
|
+
}
|
|
72
|
+
else
|
|
73
|
+
dispatcher.alone(() => then?.());
|
|
74
|
+
removed = dispatcher.last !== last && dispatcher.last?.status === 'applied';
|
|
75
|
+
return removed;
|
|
76
|
+
};
|
|
77
|
+
const ctx = {
|
|
78
|
+
edytor,
|
|
79
|
+
block,
|
|
80
|
+
from,
|
|
81
|
+
to,
|
|
82
|
+
typed: value,
|
|
83
|
+
caret: (offset) => void dispatcher.caret({ block, offset }),
|
|
84
|
+
remove
|
|
85
|
+
};
|
|
86
|
+
const last = dispatcher.last;
|
|
87
|
+
// Whatever the rule writes is a step of its own, even when no removal leads it.
|
|
88
|
+
const out = dispatcher.alone(() => rule.replace(match, ctx));
|
|
89
|
+
if (typeof out === 'string') {
|
|
90
|
+
const written = remove(() => dispatcher.alone(() => edytor.insertText(block.id, from, out)));
|
|
91
|
+
if (written)
|
|
92
|
+
dispatcher.caret({ block, offset: from + out.length });
|
|
93
|
+
return written;
|
|
94
|
+
}
|
|
95
|
+
if (out === false || out === null)
|
|
96
|
+
return removed;
|
|
97
|
+
if (removed !== null)
|
|
98
|
+
return removed;
|
|
99
|
+
// Written without `remove`: what its own commands did decides.
|
|
100
|
+
if (dispatcher.last !== last)
|
|
101
|
+
return dispatcher.last?.status === 'applied';
|
|
102
|
+
return out === true ? true : null;
|
|
103
|
+
};
|
|
51
104
|
prevent(() => {
|
|
52
105
|
running = true;
|
|
53
106
|
try {
|
|
54
|
-
for (const rule of
|
|
55
|
-
const
|
|
56
|
-
if (
|
|
57
|
-
|
|
58
|
-
const written = apply(rule, match, startText, block, yStart, caret.offset, payload);
|
|
59
|
-
if (written !== null) {
|
|
60
|
-
if (!written)
|
|
61
|
-
typeAsIs(startText, payload, yStart);
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
107
|
+
for (const { rule, match } of matches) {
|
|
108
|
+
const written = apply(rule, match);
|
|
109
|
+
if (written !== null)
|
|
110
|
+
return written || typeAsIs();
|
|
64
111
|
}
|
|
65
|
-
typeAsIs(
|
|
112
|
+
typeAsIs();
|
|
66
113
|
}
|
|
67
114
|
finally {
|
|
68
115
|
running = false;
|
|
69
116
|
}
|
|
70
117
|
});
|
|
71
118
|
};
|
|
72
|
-
/**
|
|
73
|
-
* Run `rule` over `match`: whether it wrote, or `null` when it declined
|
|
74
|
-
* (the next rule is asked).
|
|
75
|
-
*/
|
|
76
|
-
function apply(rule, match, text, block, yStart, caretOffset, payload) {
|
|
77
|
-
const { dispatcher, facade } = edytor;
|
|
78
|
-
/** The match's start in the segment, and in the block. */
|
|
79
|
-
const start = match.index;
|
|
80
|
-
const from = caretOffset - (yStart - start);
|
|
81
|
-
const to = caretOffset;
|
|
82
|
-
let removed = null;
|
|
83
|
-
/** Remove the match in the same plan as `then`'s first operation: `ctx.remove`. */
|
|
84
|
-
const removeMatch = (then) => {
|
|
85
|
-
const last = dispatcher.last;
|
|
86
|
-
if (to > from) {
|
|
87
|
-
const removal = facade.prepare.deleteText(block.id, from, to - from);
|
|
88
|
-
const run = dispatcher.lead(removal, () => then?.());
|
|
89
|
-
// Nothing took the lead: the matched text goes on its own, unless `then` declined.
|
|
90
|
-
if (!run.taken && run.out !== false && text.index !== -1)
|
|
91
|
-
block.deleteContentAtRange({
|
|
92
|
-
start: [text.index, start],
|
|
93
|
-
end: [text.index, yStart]
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
else
|
|
97
|
-
dispatcher.alone(() => then?.());
|
|
98
|
-
removed = dispatcher.last !== last && dispatcher.last?.status === 'applied';
|
|
99
|
-
return removed;
|
|
100
|
-
};
|
|
101
|
-
const ctx = {
|
|
102
|
-
edytor,
|
|
103
|
-
block,
|
|
104
|
-
from,
|
|
105
|
-
to,
|
|
106
|
-
typed: payload.value,
|
|
107
|
-
caret: (offset) => void dispatcher.caret({ block, offset }),
|
|
108
|
-
remove: removeMatch
|
|
109
|
-
};
|
|
110
|
-
const last = dispatcher.last;
|
|
111
|
-
// Whatever the rule writes is a step of its own, even when no removal leads it.
|
|
112
|
-
const out = dispatcher.alone(() => rule.replace(match, ctx));
|
|
113
|
-
if (typeof out === 'string') {
|
|
114
|
-
const written = removeMatch(() => dispatcher.alone(() => text.insertText({ value: out, start, end: start })));
|
|
115
|
-
if (written)
|
|
116
|
-
dispatcher.caret({ block, offset: from + out.length });
|
|
117
|
-
return written;
|
|
118
|
-
}
|
|
119
|
-
if (out === false || out === null)
|
|
120
|
-
return removed ?? null;
|
|
121
|
-
if (removed !== null)
|
|
122
|
-
return removed;
|
|
123
|
-
// Written without `remove`: what its own commands did decides.
|
|
124
|
-
if (dispatcher.last !== last)
|
|
125
|
-
return dispatcher.last?.status === 'applied';
|
|
126
|
-
return out === true ? true : null;
|
|
127
|
-
}
|
|
128
119
|
};
|
package/dist/session/keymap.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export type Modifiers = {
|
|
|
23
23
|
/** A chord: a key, after up to three modifiers in any order (matched case-insensitively). */
|
|
24
24
|
export type HotKeyCombination = Key | `${Modifiers}+${Key}`;
|
|
25
25
|
export declare class Keymap {
|
|
26
|
+
#private;
|
|
26
27
|
private edytor;
|
|
27
28
|
/** chord → bindings in precedence order. */
|
|
28
29
|
private table;
|
|
@@ -30,12 +31,6 @@ export declare class Keymap {
|
|
|
30
31
|
offered: string | null;
|
|
31
32
|
get isMac(): boolean;
|
|
32
33
|
constructor(edytor: Edytor, consumer?: EdytorOptions['hotkeys'], plugins?: InitializedPlugin[]);
|
|
33
|
-
/**
|
|
34
|
-
* A keyboard event's chord: `mod` is Cmd on Apple and Ctrl elsewhere; on
|
|
35
|
-
* Apple bare Ctrl stays `ctrl` (the Emacs rows); a reverse tab is Shift+Tab;
|
|
36
|
-
* the space bar is `space`.
|
|
37
|
-
*/
|
|
38
|
-
chordOf: (event: KeyboardEvent, key?: string) => string;
|
|
39
34
|
/** Offer a keydown to its bindings (the produced key first, then the layout key). */
|
|
40
35
|
handle: (event: KeyboardEvent) => boolean;
|
|
41
36
|
/** Run `chord`'s bindings in precedence order until one claims it. */
|