edytor 1.0.0-rc.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -39
- package/dist/block/block.svelte.d.ts +11 -84
- package/dist/block/block.svelte.js +30 -134
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +11 -9
- package/dist/block/inlineBlock.svelte.js +18 -21
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.js +7 -7
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +4 -17
- package/dist/cloudflare/DocumentRoom.js +3 -5
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +25 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +3 -32
- package/dist/cloudflare/room/storage.js +33 -108
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/awarenessSelection.d.ts +22 -1
- package/dist/collaboration/awarenessSelection.js +42 -0
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +42 -56
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +82 -99
- package/dist/components/Edytor.svelte.d.ts +16 -13
- package/dist/components/InlineBlock.svelte +1 -1
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +2 -5
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +18 -13
- package/dist/crdt/data.js +49 -71
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +8 -5
- package/dist/crdt/doc/reads.js +49 -50
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +32 -115
- package/dist/crdt/document.js +216 -302
- package/dist/crdt/edytor-doc.d.ts +689 -90
- package/dist/crdt/edytor-doc.js +74 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +32 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +8 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/props.d.ts +32 -0
- package/dist/crdt/props.js +172 -0
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/dnd/autoScroll.js +1 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.d.ts +2 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.js +52 -60
- package/dist/{plugins/blockHandles → dnd}/geometry.d.ts +4 -3
- package/dist/{plugins/blockHandles → dnd}/geometry.js +6 -6
- package/dist/dnd/placement.d.ts +200 -0
- package/dist/dnd/placement.js +426 -0
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +46 -63
- package/dist/edytor.svelte.js +126 -181
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -181
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +64 -78
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +45 -67
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +14 -1
- package/dist/events/onPaste.js +51 -76
- package/dist/index.d.ts +11 -15
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +83 -320
- package/dist/labels.js +181 -408
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -154
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +21 -196
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +158 -573
- package/dist/plugins/blockHandles/BlockHandles.svelte +15 -23
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +45 -38
- package/dist/plugins/chrome.js +59 -36
- package/dist/plugins/code/CodeHeader.svelte +8 -38
- package/dist/plugins/code/CodePlugin.svelte +53 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +16 -125
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
- package/dist/plugins/code/code.css +5 -117
- package/dist/plugins/code/header.svelte.d.ts +2 -11
- package/dist/plugins/code/header.svelte.js +11 -38
- package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
- package/dist/plugins/code/languageMenu.svelte.js +30 -160
- package/dist/plugins/code/languages.d.ts +9 -22
- package/dist/plugins/code/languages.js +39 -128
- package/dist/plugins/columns/ColumnResize.svelte +16 -27
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/gaps.d.ts +7 -5
- package/dist/plugins/columns/gaps.js +11 -6
- package/dist/plugins/columns/resize.svelte.d.ts +17 -54
- package/dist/plugins/columns/resize.svelte.js +80 -173
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -431
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
- package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +16 -130
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
- package/dist/plugins/equation/EquationPlugin.svelte +109 -172
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +3 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.css +7 -0
- package/dist/plugins/equation/equation.svelte.d.ts +37 -24
- package/dist/plugins/equation/equation.svelte.js +20 -94
- package/dist/plugins/equation/katex.js +6 -9
- package/dist/plugins/fileDrop.d.ts +28 -0
- package/dist/plugins/fileDrop.js +116 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +6 -167
- package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
- package/dist/plugins/image/ImagePlugin.svelte +71 -151
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +12 -41
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -36
- package/dist/plugins/image/controls.svelte.js +43 -212
- package/dist/plugins/image/image.css +17 -0
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +30 -26
- package/dist/plugins/index.js +28 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +10 -9
- package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
- package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
- package/dist/plugins/marquee/marquee.js +4 -21
- package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
- package/dist/plugins/marquee/marqueePlugin.js +16 -15
- package/dist/plugins/media/AudioPlugin.svelte +13 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +11 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
- package/dist/plugins/media/EmbedPlugin.svelte +82 -86
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +45 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +21 -4
- package/dist/plugins/media/MediaEmpty.svelte +51 -90
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +200 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +34 -0
- package/dist/plugins/media/UploadPreview.svelte +32 -0
- package/dist/plugins/media/UploadPreview.svelte.d.ts +11 -0
- package/dist/plugins/media/VideoPlugin.svelte +14 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +12 -5
- package/dist/plugins/media/empty.svelte.d.ts +47 -46
- package/dist/plugins/media/empty.svelte.js +67 -60
- package/dist/plugins/media/media.d.ts +97 -44
- package/dist/plugins/media/media.js +77 -99
- package/dist/plugins/media/upload.css +23 -0
- package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
- package/dist/plugins/media/urlPaste.svelte.js +32 -102
- package/dist/plugins/mention/MentionPlugin.svelte +84 -126
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +17 -27
- package/dist/plugins/mention/mention.css +6 -0
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +154 -109
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +19 -26
- package/dist/plugins/pageLink/pageLink.css +6 -0
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +13 -20
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +174 -183
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +34 -34
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.js +2 -2
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
- package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/richtext/richtext.css +6 -0
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +40 -124
- package/dist/plugins/table/TablePlugin.svelte +106 -168
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +38 -141
- package/dist/plugins/table/chrome.svelte.js +340 -589
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +16 -152
- package/dist/plugins/table/table.d.ts +15 -14
- package/dist/plugins/table/table.js +22 -16
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +4 -68
- package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
- package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +55 -24
- package/dist/plugins/uploads.svelte.js +123 -50
- package/dist/plugins.d.ts +187 -66
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +8 -10
- package/dist/selection/pointer.svelte.js +32 -73
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +224 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +3 -8
- package/dist/selection/visibility.js +7 -5
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +43 -39
- package/dist/session/attempt.js +62 -55
- package/dist/session/bindings.js +117 -145
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +208 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +16 -21
- package/dist/session/inputRules.d.ts +6 -3
- package/dist/session/inputRules.js +78 -83
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +43 -10
- package/dist/session/moves.js +101 -59
- package/dist/session/navigation.d.ts +10 -2
- package/dist/session/navigation.js +140 -172
- package/dist/session/ports.d.ts +2 -7
- package/dist/session/props.d.ts +25 -25
- package/dist/session/props.js +62 -159
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +5 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +42 -47
- package/dist/session/uploads.d.ts +29 -0
- package/dist/session/uploads.js +10 -0
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +2 -2
- package/dist/surface/lines.js +1 -1
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +52 -72
- package/dist/surface/overlay.d.ts +41 -3
- package/dist/surface/overlay.js +92 -37
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +272 -106
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -554
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -61
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -335
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -93
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
- package/dist/plugins/image/empty.svelte.d.ts +0 -56
- package/dist/plugins/image/empty.svelte.js +0 -83
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
- package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/labels.d.ts +0 -9
- package/dist/plugins/richtext/labels.js +0 -7
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/table/dragPreview.d.ts +0 -29
- package/dist/plugins/table/dragPreview.js +0 -103
- package/dist/plugins/toolbar/LinkCard.svelte +0 -122
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
- package/dist/plugins/toolbar/Toolbar.svelte +0 -349
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
- /package/dist/{plugins/columns → dnd}/stacking.d.ts +0 -0
- /package/dist/{plugins/columns → dnd}/stacking.js +0 -0
package/dist/session/props.js
CHANGED
|
@@ -1,162 +1,65 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
* `keySegment` writes it (`~abc` as `~0abc`: never an item's id). A write
|
|
15
|
-
* is one data patch through `write` (a
|
|
16
|
-
* command): `obj.key = v`, `arr[i] = v` (by index) and `delete obj.key`
|
|
17
|
-
* patch that path (a write inside an item, that item);
|
|
18
|
-
* `push`, `pop`, `shift`, `unshift`, `splice` and `length` are one
|
|
19
|
-
* `splice`, `sort` and `reverse` one `order` (the items move), `fill` and
|
|
20
|
-
* `copyWithin` writes of the items they change.
|
|
21
|
-
* `JSON.stringify` and `$state.snapshot` read plain JSON through it.
|
|
22
|
-
*/
|
|
23
|
-
import { keySegment, segmentKey } from '../crdt/data.js';
|
|
24
|
-
const isObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
25
|
-
/** A plain JSON copy (proxies included), or `undefined`. */
|
|
26
|
-
const plain = (v) => (v === undefined ? v : JSON.parse(JSON.stringify(v)));
|
|
27
|
-
/** The items of `now` that differ from `was`, as writes of those items. */
|
|
28
|
-
const changed = (_, __, was, now) => now.flatMap((value, i) => JSON.stringify(value) === JSON.stringify(was[i]) ? [] : [{ at: `${i}`, value }]);
|
|
29
|
-
/**
|
|
30
|
-
* Each array mutator as the patches of the array (or of its items `at`),
|
|
31
|
-
* from its length `n`, the call's `args`, the array `was` and the result `out`.
|
|
32
|
-
*/
|
|
33
|
-
const MUTATORS = {
|
|
34
|
-
push: (n, args) => ({ splice: [n, 0, ...args] }),
|
|
35
|
-
pop: (n) => ({ splice: [Math.max(n - 1, 0), n && 1] }),
|
|
36
|
-
shift: () => ({ splice: [0, 1] }),
|
|
37
|
-
unshift: (_, args) => ({ splice: [0, 0, ...args] }),
|
|
38
|
-
// The start and count `splice` resolved (negative, fractional, past the end).
|
|
39
|
-
splice: (n, [start, , ...items], _, out) => {
|
|
40
|
-
const s = Math.trunc(Number(start)) || 0;
|
|
41
|
-
return { splice: [s < 0 ? Math.max(n + s, 0) : Math.min(s, n), out.length, ...items] };
|
|
42
|
-
},
|
|
43
|
-
sort: (n, [compare], was) => ({ order: sorted(n, was, compare) }),
|
|
44
|
-
reverse: (n) => ({ order: Array.from({ length: n }, (_, i) => n - 1 - i) }),
|
|
45
|
-
fill: changed,
|
|
46
|
-
copyWithin: changed
|
|
47
|
-
};
|
|
48
|
-
/** The indexes `Array.prototype.sort` puts `values` in (stable, `undefined` compare: by string). */
|
|
49
|
-
const sorted = (n, values, compare) => {
|
|
50
|
-
const by = typeof compare === 'function'
|
|
51
|
-
? compare
|
|
52
|
-
: (a, b) => (`${a}` < `${b}` ? -1 : `${a}` > `${b}` ? 1 : 0);
|
|
53
|
-
return Array.from({ length: n }, (_, i) => i).sort((a, b) => by(values[a], values[b]));
|
|
54
|
-
};
|
|
55
|
-
export const propsProxy = (read, write,
|
|
56
|
-
/** The ids of the items of the array at a path (`facade.dataItemIds`). */
|
|
57
|
-
ids = () => []) => {
|
|
58
|
-
const cache = new Map();
|
|
59
|
-
// Item ids per array path, for the value `read()` last gave.
|
|
60
|
-
let seen;
|
|
61
|
-
const known = new Map();
|
|
62
|
-
const idsOf = (path) => {
|
|
63
|
-
const now = read();
|
|
64
|
-
if (now !== seen) {
|
|
65
|
-
seen = now;
|
|
66
|
-
known.clear();
|
|
67
|
-
}
|
|
68
|
-
const key = JSON.stringify(path);
|
|
69
|
-
return known.get(key) ?? known.set(key, ids(path)).get(key);
|
|
70
|
-
};
|
|
71
|
-
const at = (path) => path.reduce((v, k, n) => /^~[a-z]/.test(k)
|
|
72
|
-
? Array.isArray(v)
|
|
73
|
-
? v[idsOf(path.slice(0, n)).indexOf(k)]
|
|
74
|
-
: undefined // its array is gone
|
|
75
|
-
: v !== null && typeof v === 'object'
|
|
76
|
-
? v[segmentKey(k)]
|
|
77
|
-
: undefined, read());
|
|
78
|
-
const put = (path, value) => write([{ path, ...(value !== undefined && { value: plain(value) }) }]);
|
|
79
|
-
const wrap = (path, v) => Array.isArray(v) || isObject(v) ? proxy(path, Array.isArray(v)) : v;
|
|
80
|
-
const proxy = (path, array) => {
|
|
81
|
-
const key = `${array ? '[' : '{'}${JSON.stringify(path)}`;
|
|
82
|
-
const cached = cache.get(key);
|
|
83
|
-
if (cached)
|
|
84
|
-
return cached;
|
|
1
|
+
import { propsProxy } from '../crdt/props.js';
|
|
2
|
+
const keyOf = (target) => JSON.stringify(target);
|
|
3
|
+
export class DataWrites {
|
|
4
|
+
edytor;
|
|
5
|
+
#pending = new Map();
|
|
6
|
+
#scheduled = false;
|
|
7
|
+
constructor(edytor) {
|
|
8
|
+
this.edytor = edytor;
|
|
9
|
+
}
|
|
10
|
+
/** The live proxy over `target`'s data; `read` is its reactive, committed source. */
|
|
11
|
+
proxy(target, read) {
|
|
12
|
+
let preview;
|
|
13
|
+
const pending = () => this.#pending.get(keyOf(target));
|
|
85
14
|
const current = () => {
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (typeof k === 'symbol')
|
|
96
|
-
return array && k === Symbol.iterator
|
|
97
|
-
? () => items()[Symbol.iterator]()
|
|
98
|
-
: Reflect.get(target, k);
|
|
99
|
-
if (array && k === 'length')
|
|
100
|
-
return current().length;
|
|
101
|
-
if (own(k))
|
|
102
|
-
return wrap(child(k), current()[k]);
|
|
103
|
-
if (array && Object.hasOwn(MUTATORS, k))
|
|
104
|
-
return (...args) => {
|
|
105
|
-
const was = plain(current());
|
|
106
|
-
const next = [...was];
|
|
107
|
-
const fn = Array.prototype[k];
|
|
108
|
-
args = args.map((a) => (a !== null && typeof a === 'object' ? plain(a) : a));
|
|
109
|
-
const out = fn.apply(next, args);
|
|
110
|
-
const ops = [MUTATORS[k](was.length, args, was, out)].flat();
|
|
111
|
-
write(ops.map(({ at, ...op }) => ({ ...op, path: at ? [...path, at] : path })));
|
|
112
|
-
return out === next ? made : out;
|
|
113
|
-
};
|
|
114
|
-
const method = array ? Array.prototype[k] : undefined;
|
|
115
|
-
if (typeof method === 'function')
|
|
116
|
-
return (...args) => method.apply(items(), args);
|
|
117
|
-
return Reflect.get(target, k);
|
|
118
|
-
},
|
|
119
|
-
set(_, k, value) {
|
|
120
|
-
if (typeof k === 'symbol')
|
|
121
|
-
return false;
|
|
122
|
-
if (array && k === 'length') {
|
|
123
|
-
const n = current().length;
|
|
124
|
-
const nulls = Array.from({ length: Math.max(value - n, 0) }, () => null);
|
|
125
|
-
write([{ path, splice: [Math.min(value, n), Math.max(n - value, 0), ...nulls] }]);
|
|
126
|
-
}
|
|
127
|
-
else
|
|
128
|
-
put([...path, keySegment(k)], value);
|
|
129
|
-
return true;
|
|
130
|
-
},
|
|
131
|
-
deleteProperty(_, k) {
|
|
132
|
-
if (typeof k === 'symbol')
|
|
133
|
-
return false;
|
|
134
|
-
if (own(k))
|
|
135
|
-
put([...path, keySegment(k)], undefined);
|
|
136
|
-
return true;
|
|
137
|
-
},
|
|
138
|
-
has: (target, k) => (typeof k === 'string' && own(k)) || Reflect.has(target, k),
|
|
139
|
-
ownKeys: () => [...Object.keys(current()), ...(array ? ['length'] : [])],
|
|
140
|
-
getOwnPropertyDescriptor(target, k) {
|
|
141
|
-
if (array && k === 'length')
|
|
142
|
-
return (Reflect.getOwnPropertyDescriptor(target, k) && {
|
|
143
|
-
value: current().length,
|
|
144
|
-
writable: true,
|
|
145
|
-
enumerable: false,
|
|
146
|
-
configurable: false
|
|
147
|
-
});
|
|
148
|
-
if (typeof k !== 'string' || !own(k))
|
|
149
|
-
return undefined;
|
|
150
|
-
return {
|
|
151
|
-
value: wrap(child(k), current()[k]),
|
|
152
|
-
writable: true,
|
|
153
|
-
enumerable: true,
|
|
154
|
-
configurable: true
|
|
155
|
-
};
|
|
15
|
+
const base = read();
|
|
16
|
+
const queued = pending();
|
|
17
|
+
if (!queued)
|
|
18
|
+
return base;
|
|
19
|
+
const { version } = this.edytor.facade;
|
|
20
|
+
const count = queued.patches.length;
|
|
21
|
+
if (preview?.version !== version || preview.count !== count) {
|
|
22
|
+
const seen = this.edytor.facade.dataPreview(target, queued.patches);
|
|
23
|
+
preview = { version, count, data: seen?.data ?? null };
|
|
156
24
|
}
|
|
25
|
+
return preview.data ?? base;
|
|
26
|
+
};
|
|
27
|
+
return propsProxy(current, (patches) => this.write(target, patches), (path) => {
|
|
28
|
+
const queued = pending();
|
|
29
|
+
return queued
|
|
30
|
+
? (this.edytor.facade.dataPreview(target, queued.patches)?.ids(path) ?? [])
|
|
31
|
+
: this.edytor.facade.dataItemIds(target, path);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** Queue `patches` on `target` for this task's dispatch (refused at once when the view refuses writes). */
|
|
35
|
+
write(target, patches) {
|
|
36
|
+
const { edytor } = this;
|
|
37
|
+
if (!edytor.dispatcher.permits())
|
|
38
|
+
return void edytor.patchData(target, patches);
|
|
39
|
+
const key = keyOf(target);
|
|
40
|
+
const queued = this.#pending.get(key);
|
|
41
|
+
if (queued)
|
|
42
|
+
queued.patches.push(...patches);
|
|
43
|
+
else
|
|
44
|
+
this.#pending.set(key, { target, patches: [...patches] });
|
|
45
|
+
if (this.#scheduled)
|
|
46
|
+
return;
|
|
47
|
+
this.#scheduled = true;
|
|
48
|
+
queueMicrotask(() => {
|
|
49
|
+
this.#scheduled = false;
|
|
50
|
+
if (!edytor.destroyed)
|
|
51
|
+
this.flush();
|
|
157
52
|
});
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
53
|
+
}
|
|
54
|
+
/** Dispatch the queued writes now: before any other operation of this view, and at the end of the task. */
|
|
55
|
+
flush() {
|
|
56
|
+
if (this.#pending.size === 0)
|
|
57
|
+
return;
|
|
58
|
+
const all = [...this.#pending.values()];
|
|
59
|
+
this.#pending.clear();
|
|
60
|
+
const { edytor } = this;
|
|
61
|
+
if (all.length === 1)
|
|
62
|
+
return void edytor.patchData(all[0].target, all[0].patches);
|
|
63
|
+
edytor.dispatcher.run('patchData', () => edytor.transact(() => all.forEach(({ target, patches }) => edytor.patchData(target, patches))));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -10,8 +10,7 @@
|
|
|
10
10
|
* lazily the marks at the caret and the selected string — is `project(value,
|
|
11
11
|
* doc)`, a pure function memoized per (value, index version).
|
|
12
12
|
*
|
|
13
|
-
* The view's `commit(value, cause)` (public: `select(value)`) is the only writer;
|
|
14
|
-
* `selection.state` is a compatibility getter over the projection, and the
|
|
13
|
+
* The view's `commit(value, cause)` (public: `select(value)`) is the only writer; the
|
|
15
14
|
* presence payload is `serialize(value)`.
|
|
16
15
|
*/
|
|
17
16
|
import type { BlockId, ContentItem } from '../crdt/index.js';
|
|
@@ -94,7 +93,9 @@ export type ProjectionDoc = Pick<EdytorDoc, 'version' | 'resolveAnchor' | 'compa
|
|
|
94
93
|
export declare const segmentsOf: (doc: ProjectionDoc, block: BlockId) => SelectionSegment[];
|
|
95
94
|
/** The projection of `value` at the document's current version, memoized per (value, version). */
|
|
96
95
|
export declare const project: (value: SelectionValue, doc: ProjectionDoc) => SelectionProjection;
|
|
97
|
-
/**
|
|
96
|
+
/** Two projections show the same endpoints (block and offset; two unresolved ones count as the same). */
|
|
97
|
+
export declare const sameEnds: (a: SelectionProjection, b: SelectionProjection) => boolean;
|
|
98
|
+
/** Why a selection was written. */
|
|
98
99
|
export type SelectCause = 'dom' | 'model' | 'repair' | 'history';
|
|
99
100
|
/** Value equality: kind, anchors (item + side), ids, pending marks. */
|
|
100
101
|
export declare const sameValue: (a: SelectionValue, b: SelectionValue) => boolean;
|
|
@@ -186,6 +186,11 @@ export const project = (value, doc) => {
|
|
|
186
186
|
memo.set(value, { doc, version, projection });
|
|
187
187
|
return projection;
|
|
188
188
|
};
|
|
189
|
+
/** Two projections show the same endpoints (block and offset; two unresolved ones count as the same). */
|
|
190
|
+
export const sameEnds = (a, b) => [a.start, a.end].every((p, i) => {
|
|
191
|
+
const q = i ? b.end : b.start;
|
|
192
|
+
return p?.block === q?.block && p?.offset === q?.offset;
|
|
193
|
+
});
|
|
189
194
|
const sameAnchor = (a, b) => a === b ||
|
|
190
195
|
(a.b === b.b &&
|
|
191
196
|
a.a.a === b.a.a &&
|
|
@@ -41,7 +41,7 @@ export type SuggestionOptions = {
|
|
|
41
41
|
id?: string;
|
|
42
42
|
/** Default `ready` with content, `streaming` without. */
|
|
43
43
|
status?: SuggestionStatus;
|
|
44
|
-
/** A name for the UI (
|
|
44
|
+
/** A name for the UI (an app's suggestion bar shows it). */
|
|
45
45
|
label?: string;
|
|
46
46
|
/** Offer "Try again": called by `retry()` once the content is emptied. */
|
|
47
47
|
onRetry?: (suggestion: Suggestion) => void;
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { REFUSED } from '../crdt/doc/plan.js';
|
|
2
2
|
import { textToBlocks } from '../clipboard/textBlocks.js';
|
|
3
3
|
import { selectedMembers, viewOf } from '../selection/visibility.js';
|
|
4
4
|
import { project, textSelection } from './selection.js';
|
|
5
5
|
import { cloneJson, jsonBlockToSpec } from '../utils/json.js';
|
|
6
6
|
import { id as mint } from '../utils.js';
|
|
7
|
-
const REFUSED = Object.freeze({ status: 'refused', ids: [] });
|
|
8
7
|
/** The block's `data-edytor-suggestion-replaced` (`empty`: folded, the preview stands in its place). */
|
|
9
8
|
export const replacedMark = ({ replaced, inPlace }) => replaced ? (inPlace ? 'empty' : '') : null;
|
|
10
|
-
const
|
|
9
|
+
const place = () => ({
|
|
11
10
|
before: [],
|
|
12
11
|
after: [],
|
|
13
12
|
inside: [],
|
|
@@ -15,6 +14,14 @@ const NONE = Object.freeze({
|
|
|
15
14
|
replaced: false,
|
|
16
15
|
inPlace: false
|
|
17
16
|
});
|
|
17
|
+
const NONE = Object.freeze(place());
|
|
18
|
+
/** The block positions, in the order a position names its side. */
|
|
19
|
+
const SIDES = ['after', 'before', 'inside', 'end'];
|
|
20
|
+
/** The side and block a block position names (none: a `replace`). */
|
|
21
|
+
const sideOf = (at) => {
|
|
22
|
+
const side = SIDES.find((side) => side in at);
|
|
23
|
+
return side && [side, at[side]];
|
|
24
|
+
};
|
|
18
25
|
export class Suggestion {
|
|
19
26
|
id;
|
|
20
27
|
/** The position, resolved: `replace: 'selection'` is the selection's blocks or text range. */
|
|
@@ -169,33 +176,18 @@ export class Suggestions {
|
|
|
169
176
|
if (!this.#list.length)
|
|
170
177
|
return places;
|
|
171
178
|
void this.edytor.valueRevision;
|
|
172
|
-
const at = (id) =>
|
|
173
|
-
if (!places.has(id))
|
|
174
|
-
places.set(id, {
|
|
175
|
-
before: [],
|
|
176
|
-
after: [],
|
|
177
|
-
inside: [],
|
|
178
|
-
end: [],
|
|
179
|
-
replaced: false,
|
|
180
|
-
inPlace: false
|
|
181
|
-
});
|
|
182
|
-
return places.get(id);
|
|
183
|
-
};
|
|
179
|
+
const at = (id) => places.get(id) ?? places.set(id, place()).get(id);
|
|
184
180
|
for (const s of this.#list) {
|
|
185
181
|
const { at: where } = s;
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
at(
|
|
190
|
-
else if ('inside' in where)
|
|
191
|
-
at(where.inside).inside.push(s);
|
|
192
|
-
else if ('end' in where) {
|
|
193
|
-
at(where.end).end.push(s);
|
|
182
|
+
const named = sideOf(where);
|
|
183
|
+
if (named) {
|
|
184
|
+
const [side, id] = named;
|
|
185
|
+
at(id)[side].push(s);
|
|
194
186
|
// Blocks past the first follow the block, as accepting places them.
|
|
195
|
-
if (s.content.length > 1)
|
|
196
|
-
at(
|
|
187
|
+
if (side === 'end' && s.content.length > 1)
|
|
188
|
+
at(id).after.push(s);
|
|
197
189
|
}
|
|
198
|
-
else {
|
|
190
|
+
else if ('replace' in where) {
|
|
199
191
|
const ids = this.#blocks(where);
|
|
200
192
|
if (Array.isArray(where.replace)) {
|
|
201
193
|
const inPlace = ids.every((id) => this.edytor.idToBlock.get(id)?.isEmpty);
|
|
@@ -265,36 +257,43 @@ export class Suggestions {
|
|
|
265
257
|
const block = (target && edytor.idToBlock.get(target)) || edytor.root;
|
|
266
258
|
const payload = { suggestion: { id: suggestion.id, at, content: suggestion.content } };
|
|
267
259
|
const out = edytor.dispatcher.dispatch('acceptSuggestion', payload, { block }, (_payload, plan = prepare()) => {
|
|
268
|
-
|
|
269
|
-
|
|
260
|
+
/** Write a stage in the command; answers the caret it decides. */
|
|
261
|
+
const write = (plan) => {
|
|
262
|
+
if (!('writes' in plan) || !plan.at)
|
|
263
|
+
return null;
|
|
264
|
+
edytor.dispatcher.write(plan);
|
|
265
|
+
return plan.at;
|
|
266
|
+
};
|
|
267
|
+
const caret = write(plan);
|
|
268
|
+
return range && caret ? write(place(caret)) : caret;
|
|
270
269
|
}, prepare);
|
|
271
270
|
if (out === undefined || (out === null && edytor.dispatcher.last?.status === 'refused'))
|
|
272
271
|
return REFUSED;
|
|
273
272
|
this.drop(suggestion);
|
|
274
273
|
if (out)
|
|
275
|
-
edytor.dispatcher.caret(
|
|
274
|
+
edytor.dispatcher.caret(out);
|
|
276
275
|
const status = edytor.dispatcher.last?.status === 'applied' ? 'applied' : 'noop';
|
|
277
276
|
return { status, ids: status === 'applied' ? ids : [] };
|
|
278
277
|
};
|
|
279
278
|
/** The flow target of a block position (at an `end`, the first block's content joins the text). */
|
|
280
279
|
#target = (at, flow) => {
|
|
281
280
|
const { facade } = this.edytor;
|
|
282
|
-
|
|
281
|
+
const [side, id] = sideOf(at) ?? [];
|
|
282
|
+
if (side === 'end') {
|
|
283
283
|
const [first, ...rest] = flow.lines;
|
|
284
284
|
if (first)
|
|
285
285
|
flow.lines = [
|
|
286
286
|
{ id: first.id, content: first.content, children: first.children },
|
|
287
287
|
...rest
|
|
288
288
|
];
|
|
289
|
-
return { block:
|
|
289
|
+
return { block: id, offset: facade.displayLength(id) };
|
|
290
290
|
}
|
|
291
|
-
if (
|
|
291
|
+
if (!id)
|
|
292
292
|
return { replace: at.replace };
|
|
293
|
-
if ('inside'
|
|
294
|
-
return { slot: { parent:
|
|
295
|
-
const id = 'after' in at ? at.after : at.before;
|
|
293
|
+
if (side === 'inside')
|
|
294
|
+
return { slot: { parent: id, index: facade.childrenIds(id).length } };
|
|
296
295
|
const { parent, index } = facade.positionOf(id) ?? { parent: null, index: 0 };
|
|
297
|
-
return { slot: { parent, index: index + ('after'
|
|
296
|
+
return { slot: { parent, index: index + (side === 'after' ? 1 : 0) } };
|
|
298
297
|
};
|
|
299
298
|
/** A range's endpoints in document order, or null when one no longer resolves. */
|
|
300
299
|
#range = ({ anchor, focus }) => {
|
|
@@ -303,17 +302,13 @@ export class Suggestions {
|
|
|
303
302
|
};
|
|
304
303
|
/** The blocks a position names (a range: its endpoints' blocks). */
|
|
305
304
|
#blocks = (at) => {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
if (
|
|
311
|
-
return [
|
|
312
|
-
|
|
313
|
-
return [at.end];
|
|
314
|
-
if (Array.isArray(at.replace))
|
|
315
|
-
return [...at.replace];
|
|
316
|
-
const range = this.#range(at.replace);
|
|
305
|
+
const named = sideOf(at);
|
|
306
|
+
if (named)
|
|
307
|
+
return [named[1]];
|
|
308
|
+
const { replace } = at;
|
|
309
|
+
if (Array.isArray(replace))
|
|
310
|
+
return [...replace];
|
|
311
|
+
const range = this.#range(replace);
|
|
317
312
|
return range ? [range.start.block, range.end.block] : [];
|
|
318
313
|
};
|
|
319
314
|
#alive = (at) => {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The view's uploads as the other layers see them: the one per view the
|
|
3
|
+
* first media plugin given an `upload` claims (`uploadHooks`), and whether it takes a
|
|
4
|
+
* file (a kind's `upload` accepts it). A file dragged over the view shows
|
|
5
|
+
* where it lands only when its uploads take it (`drop`, the plugin layer's
|
|
6
|
+
* `plugins/fileDrop.ts`); a view without uploads ignores dropped files.
|
|
7
|
+
*/
|
|
8
|
+
import type { Edytor } from '../edytor.svelte.js';
|
|
9
|
+
import type { DropAt } from './attempt.js';
|
|
10
|
+
/** Files dragged from outside over the view: where they land, shown. */
|
|
11
|
+
export interface FileDropPort {
|
|
12
|
+
/** A `dragover` of files: show where they land; `false` where none does (nothing shows). */
|
|
13
|
+
over(event: DragEvent): boolean;
|
|
14
|
+
/** The drop: the placement shown, re-resolved at the drop point, and nothing shows any more. */
|
|
15
|
+
at(event: DragEvent): DropAt | null;
|
|
16
|
+
/** The drag left the view, or ended: nothing shows. */
|
|
17
|
+
end(): void;
|
|
18
|
+
}
|
|
19
|
+
/** What the view's uploads answer about a file. */
|
|
20
|
+
export interface ViewUploads {
|
|
21
|
+
/** The kind that takes `file` (its record's `upload`), so a paste or a drop places it. */
|
|
22
|
+
kindOf(file: File): string | undefined;
|
|
23
|
+
/** Where dropped files land (the plugin layer's indicator). */
|
|
24
|
+
readonly drop: FileDropPort;
|
|
25
|
+
}
|
|
26
|
+
/** The view's uploads, when a plugin claimed them. */
|
|
27
|
+
export declare const viewUploads: (edytor: Edytor | undefined) => ViewUploads | undefined;
|
|
28
|
+
/** Claim the view's uploads for `uploads`: the first claim wins (`false` after it). */
|
|
29
|
+
export declare const claimUploads: (edytor: Edytor, uploads: ViewUploads) => boolean;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const views = new WeakMap();
|
|
2
|
+
/** The view's uploads, when a plugin claimed them. */
|
|
3
|
+
export const viewUploads = (edytor) => edytor && views.get(edytor);
|
|
4
|
+
/** Claim the view's uploads for `uploads`: the first claim wins (`false` after it). */
|
|
5
|
+
export const claimUploads = (edytor, uploads) => {
|
|
6
|
+
if (views.has(edytor))
|
|
7
|
+
return false;
|
|
8
|
+
views.set(edytor, uploads);
|
|
9
|
+
return true;
|
|
10
|
+
};
|
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
* through to the document; its JSON never shows the virtual paragraph.
|
|
15
15
|
*/
|
|
16
16
|
import type { BlockId } from '../crdt/index.js';
|
|
17
|
-
import type {
|
|
17
|
+
import type { DocFacade } from '../crdt/edytor-doc.js';
|
|
18
18
|
/** A virtual paragraph's id (materialized blocks keep theirs): what a peer's caret names. */
|
|
19
19
|
export declare const isVirtualId: (value: string) => boolean;
|
|
20
20
|
/** The document as a view reads it: `virtual()` names the shown virtual paragraph, if any. */
|
|
21
|
-
export type ViewDoc =
|
|
21
|
+
export type ViewDoc = DocFacade & {
|
|
22
22
|
virtual: () => BlockId | null;
|
|
23
23
|
};
|
|
24
|
-
export declare const virtualLens: (base:
|
|
24
|
+
export declare const virtualLens: (base: DocFacade,
|
|
25
25
|
/** The document decided its content (a pending document shows nothing). */
|
|
26
26
|
ready: () => boolean,
|
|
27
27
|
/** The root's default child type. */
|
package/dist/session/virtual.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { placedEnd } from '../crdt/flow.js';
|
|
2
|
-
import { bindNodes } from '../crdt/nodes.js';
|
|
3
2
|
import { applyPatch } from '../crdt/data.js';
|
|
3
|
+
import { REFUSED } from '../crdt/doc/plan.js';
|
|
4
4
|
import { id } from '../utils.js';
|
|
5
5
|
import { asBlockSpec } from '../utils/json.js';
|
|
6
6
|
/** A virtual paragraph's id (materialized blocks keep theirs): what a peer's caret names. */
|
|
7
7
|
export const isVirtualId = (value) => value.startsWith('v_');
|
|
8
|
-
const REFUSED = Object.freeze({ status: 'refused', ids: [] });
|
|
9
8
|
export const virtualLens = (base,
|
|
10
9
|
/** The document decided its content (a pending document shows nothing). */
|
|
11
10
|
ready,
|
|
@@ -61,33 +60,24 @@ roleOf) => {
|
|
|
61
60
|
const own = base.prepare[name];
|
|
62
61
|
prepare[name] = (...args) => when(...args) ?? own(...args);
|
|
63
62
|
};
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
over('setBlockType', (b, t) => (on(b) ? create([spec({ type: t })]) : undefined));
|
|
74
|
-
over('setBlockData', (b, data) => (on(b) ? create([spec({ data })]) : undefined));
|
|
75
|
-
over('patchData', (t, ops) => {
|
|
76
|
-
if (typeof t !== 'string' || !on(t))
|
|
77
|
-
return undefined;
|
|
63
|
+
const onIt = (name, when) => {
|
|
64
|
+
const plan = when;
|
|
65
|
+
over(name, (b, ...rest) => (on(b) ? plan(...rest) : undefined));
|
|
66
|
+
};
|
|
67
|
+
onIt('insertText', (_o, text, marks) => text ? create([spec({ content: [{ kind: 'text', text, marks }] })]) : noop());
|
|
68
|
+
onIt('insertInline', (_o, atom) => create([spec({ content: [{ kind: 'inline', ...atom, id: atom.id ?? id('i') }] })]));
|
|
69
|
+
onIt('splitBlock', (_o, newId, tail) => create([spec(), { id: newId, type: tail?.type ?? type(), data: tail?.data }]));
|
|
70
|
+
onIt('setBlockType', (t) => create([spec({ type: t })]));
|
|
71
|
+
onIt('patchData', (ops) => {
|
|
78
72
|
const data = applyPatch({}, ops);
|
|
79
73
|
return data ? create([spec({ data })]) : REFUSED;
|
|
80
74
|
});
|
|
81
|
-
|
|
82
|
-
? create([spec({ ...value, type: value.type ?? type() })])
|
|
83
|
-
: undefined);
|
|
84
|
-
// Enter at its end builds after it: the line is kept. What goes before it replaces it.
|
|
75
|
+
onIt('setBlock', (value) => create([spec({ ...value, type: value.type ?? type() })]));
|
|
85
76
|
over('insertBlocks', (dest, specs) => {
|
|
86
77
|
if (specs.length > 0 && dest.parent === null && dest.index > 0 && active())
|
|
87
78
|
return create([spec(), ...specs.map(asBlockSpec)]);
|
|
88
79
|
return on(dest.parent) ? create([spec({ children: specs.map(asBlockSpec) })]) : undefined;
|
|
89
80
|
});
|
|
90
|
-
over('insertBlock', (dest, s) => prepare.insertBlocks(dest, [s]));
|
|
91
81
|
over('insertFlow', (target, flow) => {
|
|
92
82
|
if ('replace' in target)
|
|
93
83
|
return target.replace.some(on) ? flowInto(flow, false) : undefined;
|
|
@@ -103,53 +93,41 @@ roleOf) => {
|
|
|
103
93
|
for (const name of [
|
|
104
94
|
'deleteText',
|
|
105
95
|
'formatRange',
|
|
106
|
-
'setMark',
|
|
107
|
-
'unsetMark',
|
|
108
96
|
'clearMarks',
|
|
109
97
|
'removeInline',
|
|
110
|
-
'setInlineData',
|
|
111
98
|
'mergeBackward',
|
|
112
99
|
'mergeForward',
|
|
113
100
|
'deleteBlock'
|
|
114
101
|
])
|
|
115
|
-
|
|
102
|
+
onIt(name, noop);
|
|
116
103
|
over('deleteBlocks', (ids) => ids.some(on) ? prepare.deleteBlocks(ids.filter((i) => !on(i))) : undefined);
|
|
117
|
-
|
|
118
|
-
over(name, (b, ..._) => (on(b) ? REFUSED : undefined));
|
|
104
|
+
// A move, nest, outdent or duplicate of it is refused: the document holds no such block.
|
|
119
105
|
const lens = Object.create(base);
|
|
120
106
|
const ops = Object.fromEntries(Object.keys(base.prepare).map((name) => [
|
|
121
107
|
name,
|
|
122
108
|
(...args) => base.apply(prepare[name](...args))
|
|
123
109
|
]));
|
|
124
|
-
let nodes;
|
|
125
110
|
Object.assign(lens, ops, {
|
|
126
111
|
prepare,
|
|
127
112
|
virtual: () => (active() ? vid : null),
|
|
128
|
-
block: (b) => (nodes ??= bindNodes(lens)).block(b),
|
|
129
113
|
// ── reads ────────────────────────────────────────────────────────
|
|
114
|
+
// The document answers an id it does not hold as a block with no
|
|
115
|
+
// parent, ancestors, neighbours, children, content, data items or
|
|
116
|
+
// place to move to or merge with: those reads pass through.
|
|
130
117
|
project: () => (active() ? { children: [projected()] } : base.project()),
|
|
131
|
-
childrenIds: (p) => p === null && active() ? [vid] :
|
|
118
|
+
childrenIds: (p) => (p === null && active() ? [vid] : base.childrenIds(p)),
|
|
132
119
|
childSlots: (p) => p === null && active() ? [{ id: vid, rank: '' }] : base.childSlots(p),
|
|
133
120
|
order: () => (active() ? [vid] : base.order()),
|
|
134
121
|
slotOf: (b) => (on(b) ? { parent: null, rank: '' } : base.slotOf(b)),
|
|
135
122
|
positionOf: (b) => (on(b) ? { parent: null, index: 0 } : base.positionOf(b)),
|
|
136
123
|
pathOf: (b) => (on(b) ? [0] : base.pathOf(b)),
|
|
137
|
-
parentOf: (b) => (on(b) ? null : base.parentOf(b)),
|
|
138
|
-
ancestorsOf: (b) => (on(b) ? [] : base.ancestorsOf(b)),
|
|
139
124
|
isVisibleBlock: (b) => on(b) || base.isVisibleBlock(b),
|
|
140
|
-
compare: (a, b) => (on(a) && on(b) ? 0 : base.compare(a, b)),
|
|
141
|
-
next: (b, ...rest) => (on(b) ? null : base.next(b, ...rest)),
|
|
142
|
-
previous: (b, ...rest) => on(b) ? null : base.previous(b, ...rest),
|
|
143
125
|
blockTypeOf: (b) => (on(b) ? type() : base.blockTypeOf(b)),
|
|
144
126
|
blockDataOf: (b) => (on(b) ? {} : base.blockDataOf(b)),
|
|
145
|
-
dataItemIds: (t, path) => typeof t === 'string' && on(t) ? [] : base.dataItemIds(t, path),
|
|
146
127
|
blockJSON: (b) => (on(b) ? { id: vid, type: type(), data: {} } : base.blockJSON(b)),
|
|
147
128
|
blockText: (b) => (on(b) ? '' : base.blockText(b)),
|
|
148
|
-
|
|
149
|
-
contentItems: (b) => (on(b) ? [] : base.contentItems(b)),
|
|
129
|
+
// Never computed (and cached) by the index for an id it does not hold.
|
|
150
130
|
runs: (b) => (on(b) ? [] : base.runs(b)),
|
|
151
|
-
canPlace: (ids, parent) => !ids.some(on) && !on(parent) && base.canPlace(ids, parent),
|
|
152
|
-
canMerge: (from, into) => !on(from) && !on(into) && base.canMerge(from, into),
|
|
153
131
|
anchorAt: (b, offset, affinity = 'left') => on(b)
|
|
154
132
|
? { b: vid, a: { i: null, a: affinity === 'left' ? -1 : 0 } }
|
|
155
133
|
: base.anchorAt(b, offset, affinity),
|
|
@@ -41,6 +41,7 @@ export declare const ownedOf: (edytor: Edytor, element: Element, entry: {
|
|
|
41
41
|
kind: Kind;
|
|
42
42
|
block: string;
|
|
43
43
|
name?: string;
|
|
44
|
+
owned?: () => Owned;
|
|
44
45
|
} | null) => Owned | null;
|
|
45
46
|
/** Heal `element` against `table`; answers whether anything was written. */
|
|
46
47
|
export declare const heal: (element: HTMLElement, table: Owned) => boolean;
|