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
|
@@ -12,12 +12,6 @@
|
|
|
12
12
|
/** The peers' carets and ranges, positioned by the overlay once per frame. */
|
|
13
13
|
let selections: RenderedRemoteSelection[] = $state([]);
|
|
14
14
|
|
|
15
|
-
const rectStyle = (rect: RemoteSelectionRect, color: string) =>
|
|
16
|
-
`left:${rect.left}px;top:${rect.top}px;width:${rect.width}px;height:${rect.height}px;background:${color};`;
|
|
17
|
-
|
|
18
|
-
const cursorStyle = (rect: RemoteSelectionRect, color: string) =>
|
|
19
|
-
`left:${rect.left}px;top:${rect.top}px;height:${rect.height}px;background:${color};`;
|
|
20
|
-
|
|
21
15
|
const rectKey = (rect: RemoteSelectionRect) =>
|
|
22
16
|
`${rect.left}:${rect.top}:${rect.width}:${rect.height}`;
|
|
23
17
|
|
|
@@ -42,19 +36,25 @@
|
|
|
42
36
|
<span
|
|
43
37
|
data-edytor-remote-selection
|
|
44
38
|
data-client-id={selection.clientId}
|
|
45
|
-
style={
|
|
39
|
+
style:left="{rect.left}px"
|
|
40
|
+
style:top="{rect.top}px"
|
|
41
|
+
style:width="{rect.width}px"
|
|
42
|
+
style:height="{rect.height}px"
|
|
43
|
+
style:--edytor-remote-color={selection.color}
|
|
46
44
|
></span>
|
|
47
45
|
{/each}
|
|
46
|
+
<!-- The peer's colour is a variable a theme paints with (its label inherits it). -->
|
|
48
47
|
<span
|
|
49
48
|
data-edytor-remote-cursor
|
|
50
49
|
data-edytor-remote-block={selection.block ? '' : undefined}
|
|
51
50
|
data-client-id={selection.clientId}
|
|
52
|
-
style={
|
|
51
|
+
style:left="{selection.cursor.left}px"
|
|
52
|
+
style:top="{selection.cursor.top}px"
|
|
53
|
+
style:height="{selection.cursor.height}px"
|
|
54
|
+
style:--edytor-remote-color={selection.color}
|
|
53
55
|
>
|
|
54
56
|
{#if selection.label}
|
|
55
|
-
<span data-edytor-remote-cursor-label
|
|
56
|
-
{selection.label}
|
|
57
|
-
</span>
|
|
57
|
+
<span data-edytor-remote-cursor-label>{selection.label}</span>
|
|
58
58
|
{/if}
|
|
59
59
|
</span>
|
|
60
60
|
{/each}
|
|
@@ -69,23 +69,19 @@
|
|
|
69
69
|
z-index: 20;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
/* Placed here; painted by a theme in each peer's `--edytor-remote-color`
|
|
73
|
+
* (`edytor/themes/notion.css`). */
|
|
72
74
|
[data-edytor-remote-selection] {
|
|
73
|
-
opacity: 0.18;
|
|
74
75
|
position: absolute;
|
|
75
76
|
}
|
|
76
77
|
|
|
77
78
|
[data-edytor-remote-cursor] {
|
|
78
|
-
border-radius: 999px;
|
|
79
79
|
position: absolute;
|
|
80
80
|
width: 2px;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
[data-edytor-remote-cursor-label] {
|
|
84
|
-
border-radius: 999px;
|
|
85
|
-
color: white;
|
|
86
|
-
font: 500 11px/1.4 sans-serif;
|
|
87
84
|
left: 0;
|
|
88
|
-
padding: 1px 6px;
|
|
89
85
|
position: absolute;
|
|
90
86
|
top: -1.6em;
|
|
91
87
|
transform: translateX(-1px);
|
|
@@ -56,6 +56,20 @@ export type AwarenessLike = {
|
|
|
56
56
|
getLocalState: () => Record<string, unknown> | null;
|
|
57
57
|
setLocalState: (state: Record<string, unknown> | null) => void;
|
|
58
58
|
};
|
|
59
|
+
/**
|
|
60
|
+
* The awareness a view's presence writer reads and writes: its own state,
|
|
61
|
+
* every client's state, and the `change` event (the real `Awareness`).
|
|
62
|
+
*/
|
|
63
|
+
export type PresenceSource = AwarenessLike & {
|
|
64
|
+
clientID: number;
|
|
65
|
+
getStates: () => Map<number, Record<string, unknown>>;
|
|
66
|
+
on: (name: 'change', listener: () => void) => void;
|
|
67
|
+
off: (name: 'change', listener: () => void) => void;
|
|
68
|
+
};
|
|
69
|
+
/** Another person online: their client id and the fields of their `user` state (`name`, `color`, …), the document's actor name and colour when `user` has none. */
|
|
70
|
+
export type PresencePeer = EdytorAwarenessUser & Record<string, unknown> & {
|
|
71
|
+
clientId: number;
|
|
72
|
+
};
|
|
59
73
|
/** A client-local presence key, minted once by the view that owns the entry. */
|
|
60
74
|
export declare const mintPresenceKey: () => string;
|
|
61
75
|
/**
|
|
@@ -90,9 +104,16 @@ export declare class PresenceWriter {
|
|
|
90
104
|
private readonly awareness;
|
|
91
105
|
private readonly key;
|
|
92
106
|
throttle: number;
|
|
93
|
-
constructor(awareness:
|
|
107
|
+
constructor(awareness: PresenceSource, key: string, { share, throttle }?: PresenceOptions);
|
|
94
108
|
get share(): PresenceShare;
|
|
95
109
|
set share(share: PresenceShare);
|
|
110
|
+
/**
|
|
111
|
+
* The other people online: every client but this one, by client id,
|
|
112
|
+
* each `{ clientId, name?, color?, …user }`. Reactive: read in markup or
|
|
113
|
+
* an effect, it updates when someone joins, leaves or changes their
|
|
114
|
+
* state; the awareness listener exists only while something reads it.
|
|
115
|
+
*/
|
|
116
|
+
get peers(): PresencePeer[];
|
|
96
117
|
/** Publish `payload` (the full selection; `focus`: the block holding its focus) as this view shares it, within the throttle. */
|
|
97
118
|
write(payload: PresenceSelection | null, focus?: string | null): void;
|
|
98
119
|
/** Remove this view's entry and drop a held write (the view's teardown). */
|
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
import { isRecord, jsonEquals } from '../utils/json.js';
|
|
2
|
+
import { createSubscriber } from 'svelte/reactivity';
|
|
3
|
+
/** Every client but this one, by client id. */
|
|
4
|
+
const readPeers = (awareness) => [...awareness.getStates()]
|
|
5
|
+
.filter(([clientId]) => clientId !== awareness.clientID)
|
|
6
|
+
.sort(([a], [b]) => a - b)
|
|
7
|
+
.map(([clientId, state]) => {
|
|
8
|
+
const actor = isRecord(state.actor) ? state.actor : {};
|
|
9
|
+
const user = isRecord(state.user) ? state.user : {};
|
|
10
|
+
const peer = { ...user, clientId };
|
|
11
|
+
if (peer.name === undefined && typeof actor.name === 'string')
|
|
12
|
+
peer.name = actor.name;
|
|
13
|
+
if (peer.color === undefined && typeof actor.color === 'string')
|
|
14
|
+
peer.color = actor.color;
|
|
15
|
+
return peer;
|
|
16
|
+
});
|
|
2
17
|
let presenceKeys = 0;
|
|
3
18
|
/** A client-local presence key, minted once by the view that owns the entry. */
|
|
4
19
|
export const mintPresenceKey = () => `view-${++presenceKeys}`;
|
|
@@ -50,6 +65,21 @@ export class PresenceWriter {
|
|
|
50
65
|
#held;
|
|
51
66
|
/** The last payload and focused block handed in, kept so a share change republishes at once. */
|
|
52
67
|
#latest = [null, null];
|
|
68
|
+
/** The peers while someone reads them reactively (`undefined`: recompute). */
|
|
69
|
+
#peers;
|
|
70
|
+
#watched = false;
|
|
71
|
+
#subscribe = createSubscriber((update) => {
|
|
72
|
+
const changed = () => {
|
|
73
|
+
this.#peers = undefined;
|
|
74
|
+
update();
|
|
75
|
+
};
|
|
76
|
+
this.#watched = true;
|
|
77
|
+
this.awareness.on('change', changed);
|
|
78
|
+
return () => {
|
|
79
|
+
this.awareness.off('change', changed);
|
|
80
|
+
[this.#watched, this.#peers] = [false, undefined];
|
|
81
|
+
};
|
|
82
|
+
});
|
|
53
83
|
constructor(awareness, key, { share = 'caret', throttle = DEFAULT_PRESENCE_THROTTLE } = {}) {
|
|
54
84
|
this.awareness = awareness;
|
|
55
85
|
this.key = key;
|
|
@@ -65,6 +95,18 @@ export class PresenceWriter {
|
|
|
65
95
|
this.#share = share;
|
|
66
96
|
this.write(...this.#latest);
|
|
67
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* The other people online: every client but this one, by client id,
|
|
100
|
+
* each `{ clientId, name?, color?, …user }`. Reactive: read in markup or
|
|
101
|
+
* an effect, it updates when someone joins, leaves or changes their
|
|
102
|
+
* state; the awareness listener exists only while something reads it.
|
|
103
|
+
*/
|
|
104
|
+
get peers() {
|
|
105
|
+
this.#subscribe();
|
|
106
|
+
if (!this.#watched)
|
|
107
|
+
return readPeers(this.awareness);
|
|
108
|
+
return (this.#peers ??= readPeers(this.awareness));
|
|
109
|
+
}
|
|
68
110
|
/** Publish `payload` (the full selection; `focus`: the block holding its focus) as this view shares it, within the throttle. */
|
|
69
111
|
write(payload, focus = null) {
|
|
70
112
|
this.#latest = [payload, focus];
|
|
@@ -30,9 +30,9 @@ export type CommentsClient = {
|
|
|
30
30
|
*/
|
|
31
31
|
attach?(document: CommentDocument): (() => void) | void;
|
|
32
32
|
};
|
|
33
|
-
/** What a client reads and writes of a document: its blocks' content, and a
|
|
33
|
+
/** What a client reads and writes of a document: its blocks' content, and its marks (a removal). */
|
|
34
34
|
export type CommentDocument = CommentAnchorSource & {
|
|
35
|
-
|
|
35
|
+
formatRange(block: string, offset: number, length: number, marks: Record<string, unknown>): unknown;
|
|
36
36
|
transact<T>(fn: () => T): T;
|
|
37
37
|
};
|
|
38
38
|
/** Options of {@link createCommentsClient}. */
|
|
@@ -128,6 +128,6 @@ const removeAnchors = (document, id) => {
|
|
|
128
128
|
return;
|
|
129
129
|
document.transact(() => {
|
|
130
130
|
for (const run of [...runs].reverse())
|
|
131
|
-
document.
|
|
131
|
+
document.formatRange(run.block, run.offset, run.length, { [`${COMMENT_MARK}:${id}`]: null });
|
|
132
132
|
});
|
|
133
133
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The version history
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* The version history: a room's stored versions, a read-only preview of one
|
|
3
|
+
* with the blocks changed since highlighted, and Restore / Undo restore
|
|
4
|
+
* (`VersionHistory`; site `server/history-panel`). The panel's markup is
|
|
5
|
+
* the app's.
|
|
5
6
|
*/
|
|
6
|
-
export { default as HistoryPanel } from './HistoryPanel.svelte';
|
|
7
7
|
export { createHistoryClient, HistoryRequestError, type HistoryClient, type HistoryClientOptions, type HistoryRestoreResult, type HistoryUndoResult, type HistoryVersion } from './client.js';
|
|
8
8
|
export { versionDiff, type VersionChange, type VersionDiff } from './diff.js';
|
|
9
|
-
export {
|
|
9
|
+
export { VersionHistory, type VersionHistoryStatus, type VersionHistoryOptions } from './panel.svelte.js';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The version history
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* The version history: a room's stored versions, a read-only preview of one
|
|
3
|
+
* with the blocks changed since highlighted, and Restore / Undo restore
|
|
4
|
+
* (`VersionHistory`; site `server/history-panel`). The panel's markup is
|
|
5
|
+
* the app's.
|
|
5
6
|
*/
|
|
6
|
-
export { default as HistoryPanel } from './HistoryPanel.svelte';
|
|
7
7
|
export { createHistoryClient, HistoryRequestError } from './client.js';
|
|
8
8
|
export { versionDiff } from './diff.js';
|
|
9
|
-
export {
|
|
9
|
+
export { VersionHistory } from './panel.svelte.js';
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { EdytorDocument } from '../../crdt/document.js';
|
|
2
|
+
import type { Plugin } from '../../plugins.js';
|
|
3
|
+
import type { JSONDoc } from '../../utils/json.js';
|
|
4
|
+
import { type HistoryClient, type HistoryRestoreResult, type HistoryUndoResult, type HistoryVersion } from './client.js';
|
|
5
|
+
import { type VersionChange } from './diff.js';
|
|
6
|
+
import type { Attachment } from 'svelte/attachments';
|
|
7
|
+
/**
|
|
8
|
+
* The last outcome to announce (`''`: none): a restore in flight or done
|
|
9
|
+
* (`unchanged`: the page already matched), the previewed version gone
|
|
10
|
+
* (`unavailable`), an undo done or with nothing to undo, a request refused
|
|
11
|
+
* (`denied`: a `401` or `403`) or failed. Your panel says it in its words.
|
|
12
|
+
*/
|
|
13
|
+
export type VersionHistoryStatus = '' | 'restoring' | 'restored' | 'unchanged' | 'unavailable' | 'undone' | 'nothingToUndo' | 'denied' | 'failed';
|
|
14
|
+
export type VersionHistoryOptions = {
|
|
15
|
+
/** Where the versions come from: `createHistoryClient(…)`, or any object with `list`, `read`, `restore` and `undo`. */
|
|
16
|
+
client: HistoryClient;
|
|
17
|
+
/** The live document the preview is compared with. Without it, no change is highlighted. */
|
|
18
|
+
document?: EdytorDocument;
|
|
19
|
+
/** The preview's plugins: the ones the live view uses, so every kind renders as it does there. */
|
|
20
|
+
plugins?: Plugin[];
|
|
21
|
+
/** The locale dates and times are written in (default the browser's). */
|
|
22
|
+
locale?: string | string[];
|
|
23
|
+
/** The id prefix of the list's rows (page-unique: `$props.id()`). */
|
|
24
|
+
id?: string;
|
|
25
|
+
/** After a restore the room answered. */
|
|
26
|
+
onRestore?: (result: HistoryRestoreResult) => void;
|
|
27
|
+
/** After an undo the room answered. */
|
|
28
|
+
onUndo?: (result: HistoryUndoResult) => void;
|
|
29
|
+
/** A request failed (`status` is `denied` or `failed`). */
|
|
30
|
+
onError?: (error: unknown) => void;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* A view of a room's versions, made in a component's script (its effects
|
|
34
|
+
* list the versions, and follow the live document's commits). Read its
|
|
35
|
+
* state reactively; `select`, `restore`, `undo` and `refresh` act.
|
|
36
|
+
*/
|
|
37
|
+
export declare class VersionHistory {
|
|
38
|
+
#private;
|
|
39
|
+
/** The versions, newest first (`null` while the first list loads). */
|
|
40
|
+
versions: HistoryVersion[] | null;
|
|
41
|
+
/** The previewed version's key. */
|
|
42
|
+
selected: string | null;
|
|
43
|
+
/** The previewed version's JSON, once read (`null` while it loads or when it is gone). */
|
|
44
|
+
shown: JSONDoc | null;
|
|
45
|
+
/** The previewed version is being read. */
|
|
46
|
+
reading: boolean;
|
|
47
|
+
/** A restore or an undo is in flight. */
|
|
48
|
+
busy: boolean;
|
|
49
|
+
/** A restore this view applied, which `undo` can take back. */
|
|
50
|
+
undoable: boolean;
|
|
51
|
+
/** The last outcome, to announce (`aria-live`) in your words. */
|
|
52
|
+
status: VersionHistoryStatus;
|
|
53
|
+
/** The last outcome failed. */
|
|
54
|
+
failed: boolean;
|
|
55
|
+
/** Highlight the blocks added, removed and changed since the version. */
|
|
56
|
+
highlight: boolean;
|
|
57
|
+
constructor(options: VersionHistoryOptions);
|
|
58
|
+
/** The previewed version against the live document: its counts and the changed blocks. */
|
|
59
|
+
diff: import("./diff.js").VersionDiff | null;
|
|
60
|
+
/** What the preview renders: the version, with the blocks removed since when highlighting. */
|
|
61
|
+
preview: JSONDoc | null;
|
|
62
|
+
/** A key for the preview: it remounts when what it renders changes (`value` is read once). */
|
|
63
|
+
previewKey: string | null;
|
|
64
|
+
/** The blocks changed since the version, by id, while highlighting (else none). */
|
|
65
|
+
changes: ReadonlyMap<string, VersionChange>;
|
|
66
|
+
/** The preview's plugins: the highlights of the changes (read live), then the app's. */
|
|
67
|
+
previewPlugins: Plugin[];
|
|
68
|
+
/** The previewed version, as listed. */
|
|
69
|
+
selectedVersion: HistoryVersion | null;
|
|
70
|
+
/** List the versions again; keeps the selection when it is still listed, else selects the newest. */
|
|
71
|
+
refresh: () => Promise<void>;
|
|
72
|
+
/** Preview the version `key` (`null`: none). */
|
|
73
|
+
select: (key: string | null) => Promise<void>;
|
|
74
|
+
/** Restore the previewed version (the room writes it as one change). */
|
|
75
|
+
restore: () => Promise<void>;
|
|
76
|
+
/** Take back the restore this view applied. */
|
|
77
|
+
undo: () => Promise<void>;
|
|
78
|
+
/** A version's day (`Oct 8, 2026`), in `locale`; its half of the day is `entry.slot`. */
|
|
79
|
+
dateOf: (entry: HistoryVersion) => string;
|
|
80
|
+
/** When a version was saved, in `locale`. */
|
|
81
|
+
timeOf: (entry: HistoryVersion) => string;
|
|
82
|
+
/**
|
|
83
|
+
* The attachment of the version at `index`'s row
|
|
84
|
+
* (`{@attach history.option(index)}`, on its focusable element):
|
|
85
|
+
* `role="option"`, its id, `aria-selected`, the list's one tab stop when
|
|
86
|
+
* it is selected, else the first.
|
|
87
|
+
*/
|
|
88
|
+
option: (index: number) => Attachment<HTMLElement>;
|
|
89
|
+
/** The list's attachment (`{@attach history.keys}`): the arrows, Home and End move the selection and the focus. */
|
|
90
|
+
keys: Attachment<HTMLElement>;
|
|
91
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The version history's controller (`VersionHistory`): a room's stored
|
|
3
|
+
* versions, the one previewed and its changes since (`versionDiff`), and
|
|
4
|
+
* Restore / Undo restore. The app draws the panel: the list (its rows'
|
|
5
|
+
* `option(index)` and the list's `keys`, attachments), the preview (`<Edytor readonly
|
|
6
|
+
* value={history.preview} plugins={history.previewPlugins}>`), the status.
|
|
7
|
+
*/
|
|
8
|
+
import { untrack } from 'svelte';
|
|
9
|
+
import { HistoryRequestError } from './client.js';
|
|
10
|
+
import { versionDiff } from './diff.js';
|
|
11
|
+
import { versionHighlightsPlugin } from './versionHighlights.js';
|
|
12
|
+
import { optionAttachment } from '../../plugins/list.svelte.js';
|
|
13
|
+
import { listen } from '../../utils/listen.js';
|
|
14
|
+
/** No change highlighted. */
|
|
15
|
+
const NONE = new Map();
|
|
16
|
+
/**
|
|
17
|
+
* A view of a room's versions, made in a component's script (its effects
|
|
18
|
+
* list the versions, and follow the live document's commits). Read its
|
|
19
|
+
* state reactively; `select`, `restore`, `undo` and `refresh` act.
|
|
20
|
+
*/
|
|
21
|
+
export class VersionHistory {
|
|
22
|
+
/** The versions, newest first (`null` while the first list loads). */
|
|
23
|
+
versions = $state.raw(null);
|
|
24
|
+
/** The previewed version's key. */
|
|
25
|
+
selected = $state(null);
|
|
26
|
+
/** The previewed version's JSON, once read (`null` while it loads or when it is gone). */
|
|
27
|
+
shown = $state.raw(null);
|
|
28
|
+
/** The previewed version is being read. */
|
|
29
|
+
reading = $state(false);
|
|
30
|
+
/** A restore or an undo is in flight. */
|
|
31
|
+
busy = $state(false);
|
|
32
|
+
/** A restore this view applied, which `undo` can take back. */
|
|
33
|
+
undoable = $state(false);
|
|
34
|
+
/** The last outcome, to announce (`aria-live`) in your words. */
|
|
35
|
+
status = $state('');
|
|
36
|
+
/** The last outcome failed. */
|
|
37
|
+
failed = $state(false);
|
|
38
|
+
/** Highlight the blocks added, removed and changed since the version. */
|
|
39
|
+
highlight = $state(true);
|
|
40
|
+
/** The live document as JSON, read again at each of its commits. */
|
|
41
|
+
#current = $state.raw(null);
|
|
42
|
+
/** The request serial: an older answer never replaces a newer one. */
|
|
43
|
+
#serial = 0;
|
|
44
|
+
#options;
|
|
45
|
+
constructor(options) {
|
|
46
|
+
this.#options = options;
|
|
47
|
+
$effect(() => {
|
|
48
|
+
const document = options.document;
|
|
49
|
+
if (!document)
|
|
50
|
+
return void (this.#current = null);
|
|
51
|
+
this.#current = document.toJSON();
|
|
52
|
+
return document.onChange(() => (this.#current = document.toJSON()));
|
|
53
|
+
});
|
|
54
|
+
$effect(() => untrack(() => void this.refresh()));
|
|
55
|
+
}
|
|
56
|
+
/** The previewed version against the live document: its counts and the changed blocks. */
|
|
57
|
+
diff = $derived.by(() => this.shown && this.#current ? versionDiff(this.shown, this.#current) : null);
|
|
58
|
+
/** What the preview renders: the version, with the blocks removed since when highlighting. */
|
|
59
|
+
preview = $derived.by(() => this.shown && (this.highlight && this.diff ? this.diff.preview : this.shown));
|
|
60
|
+
/** A key for the preview: it remounts when what it renders changes (`value` is read once). */
|
|
61
|
+
previewKey = $derived.by(() => this.preview && JSON.stringify(this.preview));
|
|
62
|
+
/** The blocks changed since the version, by id, while highlighting (else none). */
|
|
63
|
+
changes = $derived.by(() => (this.highlight && this.diff ? this.diff.changes : NONE));
|
|
64
|
+
/** The preview's plugins: the highlights of the changes (read live), then the app's. */
|
|
65
|
+
previewPlugins = $derived.by(() => [
|
|
66
|
+
versionHighlightsPlugin(() => this.changes),
|
|
67
|
+
...(this.#options.plugins ?? [])
|
|
68
|
+
]);
|
|
69
|
+
/** The previewed version, as listed. */
|
|
70
|
+
selectedVersion = $derived.by(() => this.versions?.find((entry) => entry.key === this.selected) ?? null);
|
|
71
|
+
#fail = (error) => {
|
|
72
|
+
this.failed = true;
|
|
73
|
+
this.status =
|
|
74
|
+
error instanceof HistoryRequestError && (error.status === 401 || error.status === 403)
|
|
75
|
+
? 'denied'
|
|
76
|
+
: 'failed';
|
|
77
|
+
this.#options.onError?.(error);
|
|
78
|
+
};
|
|
79
|
+
/** List the versions again; keeps the selection when it is still listed, else selects the newest. */
|
|
80
|
+
refresh = async () => {
|
|
81
|
+
try {
|
|
82
|
+
const listed = await this.#options.client.list();
|
|
83
|
+
this.versions = listed;
|
|
84
|
+
if (this.selected === null || !listed.some((entry) => entry.key === this.selected))
|
|
85
|
+
void this.select(listed[0]?.key ?? null);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
this.versions = this.versions ?? [];
|
|
89
|
+
this.#fail(error);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
/** Preview the version `key` (`null`: none). */
|
|
93
|
+
select = async (key) => {
|
|
94
|
+
this.selected = key;
|
|
95
|
+
this.shown = null;
|
|
96
|
+
this.failed = false;
|
|
97
|
+
this.status = '';
|
|
98
|
+
const mine = ++this.#serial;
|
|
99
|
+
if (key === null)
|
|
100
|
+
return;
|
|
101
|
+
this.reading = true;
|
|
102
|
+
try {
|
|
103
|
+
const json = await this.#options.client.read(key);
|
|
104
|
+
if (mine !== this.#serial)
|
|
105
|
+
return;
|
|
106
|
+
this.shown = json;
|
|
107
|
+
if (json === null) {
|
|
108
|
+
this.failed = true;
|
|
109
|
+
this.status = 'unavailable';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (mine === this.#serial)
|
|
114
|
+
this.#fail(error);
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
if (mine === this.#serial)
|
|
118
|
+
this.reading = false;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
/** Restore the previewed version (the room writes it as one change). */
|
|
122
|
+
restore = async () => {
|
|
123
|
+
const { selected } = this;
|
|
124
|
+
if (selected === null || this.busy)
|
|
125
|
+
return;
|
|
126
|
+
this.busy = true;
|
|
127
|
+
this.failed = false;
|
|
128
|
+
this.status = 'restoring';
|
|
129
|
+
try {
|
|
130
|
+
const result = await this.#options.client.restore(selected);
|
|
131
|
+
if (result.status === 'applied')
|
|
132
|
+
this.undoable = true;
|
|
133
|
+
// A version gone since it was listed: list again, then say so.
|
|
134
|
+
if (result.status === 'refused')
|
|
135
|
+
await this.refresh();
|
|
136
|
+
this.failed = result.status === 'refused';
|
|
137
|
+
this.status =
|
|
138
|
+
result.status === 'applied'
|
|
139
|
+
? 'restored'
|
|
140
|
+
: result.status === 'noop'
|
|
141
|
+
? 'unchanged'
|
|
142
|
+
: 'unavailable';
|
|
143
|
+
this.#options.onRestore?.(result);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
this.#fail(error);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
this.busy = false;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
/** Take back the restore this view applied. */
|
|
153
|
+
undo = async () => {
|
|
154
|
+
if (this.busy)
|
|
155
|
+
return;
|
|
156
|
+
this.busy = true;
|
|
157
|
+
this.failed = false;
|
|
158
|
+
try {
|
|
159
|
+
const result = await this.#options.client.undo();
|
|
160
|
+
this.undoable = false;
|
|
161
|
+
this.status = result.status === 'applied' ? 'undone' : 'nothingToUndo';
|
|
162
|
+
this.#options.onUndo?.(result);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
this.#fail(error);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
this.busy = false;
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
/** A version's day (`Oct 8, 2026`), in `locale`; its half of the day is `entry.slot`. */
|
|
172
|
+
dateOf = (entry) => {
|
|
173
|
+
const day = new Date(`${entry.date}T00:00:00Z`);
|
|
174
|
+
return Number.isNaN(day.getTime())
|
|
175
|
+
? entry.date
|
|
176
|
+
: new Intl.DateTimeFormat(this.#options.locale, {
|
|
177
|
+
dateStyle: 'medium',
|
|
178
|
+
timeZone: 'UTC'
|
|
179
|
+
}).format(day);
|
|
180
|
+
};
|
|
181
|
+
/** When a version was saved, in `locale`. */
|
|
182
|
+
timeOf = (entry) => {
|
|
183
|
+
const at = new Date(entry.at);
|
|
184
|
+
return Number.isNaN(at.getTime())
|
|
185
|
+
? ''
|
|
186
|
+
: new Intl.DateTimeFormat(this.#options.locale, {
|
|
187
|
+
dateStyle: 'medium',
|
|
188
|
+
timeStyle: 'short'
|
|
189
|
+
}).format(at);
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* The attachment of the version at `index`'s row
|
|
193
|
+
* (`{@attach history.option(index)}`, on its focusable element):
|
|
194
|
+
* `role="option"`, its id, `aria-selected`, the list's one tab stop when
|
|
195
|
+
* it is selected, else the first.
|
|
196
|
+
*/
|
|
197
|
+
option = (index) => {
|
|
198
|
+
const selected = this.versions?.[index]?.key === this.selected;
|
|
199
|
+
return optionAttachment(`${this.#options.id ?? 'edytor-history'}-version-${index}`, 'option', selected, { tabindex: selected || (this.selected === null && index === 0) ? 0 : -1 }, false);
|
|
200
|
+
};
|
|
201
|
+
/** The list's attachment (`{@attach history.keys}`): the arrows, Home and End move the selection and the focus. */
|
|
202
|
+
keys = (node) => listen(node, 'keydown', this.#keydown);
|
|
203
|
+
#keydown = (event) => {
|
|
204
|
+
const { versions } = this;
|
|
205
|
+
if (!versions?.length)
|
|
206
|
+
return;
|
|
207
|
+
const at = versions.findIndex((entry) => entry.key === this.selected);
|
|
208
|
+
const next = {
|
|
209
|
+
ArrowDown: Math.min(versions.length - 1, at + 1),
|
|
210
|
+
ArrowUp: Math.max(0, at - 1),
|
|
211
|
+
Home: 0,
|
|
212
|
+
End: versions.length - 1
|
|
213
|
+
}[event.key];
|
|
214
|
+
if (next === undefined)
|
|
215
|
+
return;
|
|
216
|
+
event.preventDefault();
|
|
217
|
+
const key = versions[next].key;
|
|
218
|
+
if (key !== this.selected)
|
|
219
|
+
void this.select(key);
|
|
220
|
+
const list = event.currentTarget;
|
|
221
|
+
list.querySelectorAll('[role="option"]')[next]?.focus();
|
|
222
|
+
};
|
|
223
|
+
}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sync factories of the package root (`import { createIndexeddbSync }
|
|
3
|
+
* from 'edytor'`): the provider stack bound once to the vendored engine
|
|
4
|
+
* (`crdt/providers/bound.ts`, shared with `edytor/protocol`'s raw provider
|
|
5
|
+
* classes). The factories themselves live in ONE place, `bindProviders(Y)`
|
|
6
|
+
* in `src/lib/crdt/providers/index.ts`.
|
|
7
|
+
*/
|
|
8
|
+
import { prefetch as prefetchStack } from '../crdt/providers/bound.js';
|
|
9
|
+
import { documentSnapshot as snapshotOf, lastUpdated as lastUpdatedOf } from '../crdt/providers/index.js';
|
|
1
10
|
import { type Awareness, type EdytorSync, type EdytorSyncCleanup, type EdytorSyncPayload, type IndexeddbSyncOptions as CrdtIndexeddbSyncOptions, type ProviderStack, type WebsocketSync, type WebsocketSyncOptions as CrdtWebsocketSyncOptions, type YDoc } from '../crdt/index.js';
|
|
2
11
|
export type { EdytorSync, EdytorSyncCleanup, EdytorSyncPayload, WebsocketSync, Awareness, YDoc };
|
|
3
12
|
export type IndexeddbSyncOptions = CrdtIndexeddbSyncOptions;
|
|
@@ -9,8 +18,8 @@ export declare const createIndexeddbSync: (name: string) => EdytorSync;
|
|
|
9
18
|
export declare const createWebsocketSync: (options: WebsocketSyncOptions) => WebsocketSync;
|
|
10
19
|
export declare const clearDocument: ProviderStack['clearDocument'];
|
|
11
20
|
/** Keep a document's local copy fresh without opening it (sync once, then close). */
|
|
12
|
-
export declare const prefetch:
|
|
21
|
+
export declare const prefetch: typeof prefetchStack;
|
|
13
22
|
/** When a room last stored a change: one authorized HTTP request, no document opened. */
|
|
14
|
-
export declare const lastUpdated:
|
|
23
|
+
export declare const lastUpdated: typeof lastUpdatedOf;
|
|
15
24
|
/** A room's document as JSON (one authorized HTTP request), for `<Edytor snapshot>`. */
|
|
16
|
-
export declare const documentSnapshot:
|
|
25
|
+
export declare const documentSnapshot: typeof snapshotOf;
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* classes). The factories themselves live in ONE place, `bindProviders(Y)`
|
|
6
6
|
* in `src/lib/crdt/providers/index.ts`.
|
|
7
7
|
*/
|
|
8
|
-
import { providers } from '../crdt/providers/bound.js';
|
|
8
|
+
import { prefetch as prefetchStack, providers } from '../crdt/providers/bound.js';
|
|
9
|
+
import { documentSnapshot as snapshotOf, lastUpdated as lastUpdatedOf } from '../crdt/providers/index.js';
|
|
9
10
|
import {} from '../crdt/index.js';
|
|
10
11
|
export const createIndexeddbSync = providers.createIndexeddbSync;
|
|
11
12
|
export const createWebsocketSync = providers.createWebsocketSync;
|
|
@@ -15,8 +16,8 @@ export const createWebsocketSync = providers.createWebsocketSync;
|
|
|
15
16
|
// (`../crdt/providers/indexeddb`), which `nodenext` consumers reject.
|
|
16
17
|
export const clearDocument = providers.clearDocument;
|
|
17
18
|
/** Keep a document's local copy fresh without opening it (sync once, then close). */
|
|
18
|
-
export const prefetch =
|
|
19
|
+
export const prefetch = prefetchStack;
|
|
19
20
|
/** When a room last stored a change: one authorized HTTP request, no document opened. */
|
|
20
|
-
export const lastUpdated =
|
|
21
|
+
export const lastUpdated = lastUpdatedOf;
|
|
21
22
|
/** A room's document as JSON (one authorized HTTP request), for `<Edytor snapshot>`. */
|
|
22
|
-
export const documentSnapshot =
|
|
23
|
+
export const documentSnapshot = snapshotOf;
|