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
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { PresencePoint } from '../collaboration/awarenessSelection.js';
|
|
3
|
+
import type { Edytor } from '../edytor.svelte.js';
|
|
4
|
+
|
|
5
|
+
/** A run of text the overlay marks: its ends, and whether it is the current one (`data-current`). */
|
|
6
|
+
export type MarkedRange = { start: PresencePoint; end: PresencePoint; current?: boolean };
|
|
7
|
+
|
|
8
|
+
/** The run of `length` at block offset `offset` of block `id` (none where it is not shown). */
|
|
9
|
+
export const runOf = (
|
|
10
|
+
edytor: Edytor,
|
|
11
|
+
id: string,
|
|
12
|
+
offset: number,
|
|
13
|
+
length: number,
|
|
14
|
+
current?: boolean
|
|
15
|
+
): MarkedRange[] => {
|
|
16
|
+
const block = edytor.idToBlock.get(id);
|
|
17
|
+
const [start, end] = [block?.textAtOffset(offset), block?.textAtOffset(offset + length)];
|
|
18
|
+
return start && end ? [{ start, end, current }] : [];
|
|
19
|
+
};
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<script lang="ts">
|
|
23
|
+
import { onMount } from 'svelte';
|
|
24
|
+
import { rangeRects, type RemoteSelectionRect } from '../collaboration/remoteSelection.js';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Runs of text marked in the overlay (never inside the host), one
|
|
28
|
+
* rectangle per line box, measured once per frame: the find matches, the
|
|
29
|
+
* text a `replace` suggestion removes, the comment being written. Each
|
|
30
|
+
* rectangle carries `data-edytor-<name>` (`data-current` on the current
|
|
31
|
+
* run's); the layer is `z`.
|
|
32
|
+
*/
|
|
33
|
+
let {
|
|
34
|
+
edytor,
|
|
35
|
+
name,
|
|
36
|
+
z,
|
|
37
|
+
ranges
|
|
38
|
+
}: { edytor: Edytor; name: string; z: number; ranges: () => MarkedRange[] } = $props();
|
|
39
|
+
|
|
40
|
+
let rects: (RemoteSelectionRect & { current?: boolean })[] = $state([]);
|
|
41
|
+
|
|
42
|
+
onMount(() =>
|
|
43
|
+
edytor.overlay.add((origin) => {
|
|
44
|
+
const next = ranges().flatMap(({ start, end, current }) =>
|
|
45
|
+
rangeRects(edytor, start, end, origin).map((rect) => ({ ...rect, current }))
|
|
46
|
+
);
|
|
47
|
+
if (next.length || rects.length) return () => (rects = next);
|
|
48
|
+
})
|
|
49
|
+
);
|
|
50
|
+
// What the runs read changed: the overlay measures again.
|
|
51
|
+
$effect(() => {
|
|
52
|
+
void ranges();
|
|
53
|
+
edytor.overlay.invalidate();
|
|
54
|
+
});
|
|
55
|
+
</script>
|
|
56
|
+
|
|
57
|
+
<div data-edytor-ranges={name} contenteditable="false" aria-hidden="true" style:z-index={z}>
|
|
58
|
+
{#each rects as rect, index (index)}
|
|
59
|
+
<span
|
|
60
|
+
{...{ [`data-edytor-${name}`]: '' }}
|
|
61
|
+
data-current={rect.current || undefined}
|
|
62
|
+
style:left={`${rect.left}px`}
|
|
63
|
+
style:top={`${rect.top}px`}
|
|
64
|
+
style:width={`${rect.width}px`}
|
|
65
|
+
style:height={`${rect.height}px`}
|
|
66
|
+
></span>
|
|
67
|
+
{/each}
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<style>
|
|
71
|
+
[data-edytor-ranges] {
|
|
72
|
+
position: absolute;
|
|
73
|
+
left: 0;
|
|
74
|
+
top: 0;
|
|
75
|
+
pointer-events: none;
|
|
76
|
+
}
|
|
77
|
+
[data-edytor-ranges] > span {
|
|
78
|
+
position: absolute;
|
|
79
|
+
}
|
|
80
|
+
:global([data-edytor-find-match]) {
|
|
81
|
+
border-radius: 2px;
|
|
82
|
+
background: var(--edytor-find-match, rgb(255 212 0 / 0.3));
|
|
83
|
+
mix-blend-mode: multiply;
|
|
84
|
+
}
|
|
85
|
+
:global([data-edytor-find-match][data-current]) {
|
|
86
|
+
background: var(--edytor-find-current, rgb(255 166 0 / 0.55));
|
|
87
|
+
}
|
|
88
|
+
:global([data-edytor-suggestion-range]) {
|
|
89
|
+
background: var(--edytor-suggestion-removed, rgb(235 87 87 / 0.18));
|
|
90
|
+
border-bottom: 1px solid var(--edytor-suggestion-removed-line, rgb(235 87 87 / 0.6));
|
|
91
|
+
}
|
|
92
|
+
:global([data-edytor-comment-draft]) {
|
|
93
|
+
background: var(--edytor-comment-active, rgb(255 212 0 / 0.42));
|
|
94
|
+
mix-blend-mode: multiply;
|
|
95
|
+
}
|
|
96
|
+
</style>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PresencePoint } from '../collaboration/awarenessSelection.js';
|
|
2
|
+
import type { Edytor } from '../edytor.svelte.js';
|
|
3
|
+
/** A run of text the overlay marks: its ends, and whether it is the current one (`data-current`). */
|
|
4
|
+
export type MarkedRange = {
|
|
5
|
+
start: PresencePoint;
|
|
6
|
+
end: PresencePoint;
|
|
7
|
+
current?: boolean;
|
|
8
|
+
};
|
|
9
|
+
/** The run of `length` at block offset `offset` of block `id` (none where it is not shown). */
|
|
10
|
+
export declare const runOf: (edytor: Edytor, id: string, offset: number, length: number, current?: boolean) => MarkedRange[];
|
|
11
|
+
type $$ComponentProps = {
|
|
12
|
+
edytor: Edytor;
|
|
13
|
+
name: string;
|
|
14
|
+
z: number;
|
|
15
|
+
ranges: () => MarkedRange[];
|
|
16
|
+
};
|
|
17
|
+
declare const Ranges: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
18
|
+
type Ranges = ReturnType<typeof Ranges>;
|
|
19
|
+
export default Ranges;
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import type { Edytor } from '../edytor.svelte.js';
|
|
4
4
|
import type { Suggestion } from '../session/suggestions.svelte.js';
|
|
5
5
|
import { previewCells } from '../surface/cells.js';
|
|
6
|
+
import { editorEnglish, labelsOf } from '../labels.js';
|
|
6
7
|
import Block from './Block.svelte';
|
|
7
8
|
|
|
8
9
|
/**
|
|
@@ -28,12 +29,12 @@
|
|
|
28
29
|
data-edytor-suggestion={suggestion.id}
|
|
29
30
|
data-status={suggestion.status}
|
|
30
31
|
contenteditable="false"
|
|
31
|
-
aria-label={suggestion.label ?? edytor.
|
|
32
|
+
aria-label={suggestion.label ?? labelsOf(edytor, 'editor', editorEnglish).suggestion}
|
|
32
33
|
role="group"
|
|
33
34
|
use:edytor.surface.preview={suggestion.id}
|
|
34
35
|
onmousedown={cancel}
|
|
35
36
|
>
|
|
36
|
-
{#each cells as cell (cell.id)}<Block
|
|
37
|
+
{#each cells as cell (cell.id)}<Block kid={cell} />{/each}
|
|
37
38
|
</div>
|
|
38
39
|
|
|
39
40
|
<style>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { getContext } from 'svelte';
|
|
3
3
|
import type { Edytor } from '../edytor.svelte.js';
|
|
4
|
-
import type
|
|
4
|
+
import { rendersMark, type RenderDelta } from '../surface/cells.js';
|
|
5
5
|
import { Text } from '../text/text.svelte.js';
|
|
6
6
|
import Mark, { customAt } from './Mark.svelte';
|
|
7
7
|
import CustomMark from './CustomMark.svelte';
|
|
@@ -61,10 +61,7 @@
|
|
|
61
61
|
|
|
62
62
|
/** A delta's marks this view renders (an unknown mark renders its text only). */
|
|
63
63
|
const rendered = (delta: RenderDelta): RenderDelta => {
|
|
64
|
-
const known = delta.marks.filter(([name]) =>
|
|
65
|
-
const definition = edytor.marks.get(name);
|
|
66
|
-
return Boolean(definition?.snippet || definition?.tag);
|
|
67
|
-
});
|
|
64
|
+
const known = delta.marks.filter(([name]) => rendersMark(edytor.marks, name));
|
|
68
65
|
return known.length === delta.marks.length ? delta : { text: delta.text, marks: known };
|
|
69
66
|
};
|
|
70
67
|
const shown = $derived(empty ? FILLER : deltas);
|
package/dist/crdt/admission.d.ts
CHANGED
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
* gate here, in the same order, with the same refusal semantics:
|
|
6
6
|
*
|
|
7
7
|
* 1. **`assertUsableDoc`** — is this a v14 engine doc at all
|
|
8
|
-
* ({@link UnsupportedDocError} `'foreign'`)
|
|
9
|
-
* layout that must be migrated rather than adopted (`'legacy'`)?
|
|
8
|
+
* ({@link UnsupportedDocError} `'foreign'`)?
|
|
10
9
|
* 2. **`assertSchema`** — does the committed schema manifest allow
|
|
11
10
|
* this build to own the doc ({@link SchemaMismatchError}:
|
|
12
11
|
* `'unversioned'` content with no version stamp, `'unsupported'`
|
|
@@ -43,8 +42,6 @@
|
|
|
43
42
|
* from the engine's pending store pending store discarded; a
|
|
44
43
|
* stamp that got in anyway (raw
|
|
45
44
|
* apply) makes the doc read-only
|
|
46
|
-
* v13 migration `bindLegacyReader` gate → rebuild via legacy DB byte-identical; no
|
|
47
|
-
* document-level `init` → `loadDocument` v14 generation activated
|
|
48
45
|
*
|
|
49
46
|
* TWO LAYERS. The transport layer (`providers/*`, `protocols/*`) proves
|
|
50
47
|
* the generation of every frame and container and refuses updates that
|
|
@@ -108,8 +105,6 @@ export declare class UndecodableUpdateError extends Error {
|
|
|
108
105
|
* - {@link UnsupportedDocError} `'foreign'` — not a v14 engine doc
|
|
109
106
|
* (foreign roots/engines may still attach *content* later; this is
|
|
110
107
|
* about doc shape);
|
|
111
|
-
* - {@link UnsupportedDocError} `'legacy'` — v13-era layout present;
|
|
112
|
-
* route through `crdt/migration` instead of attaching;
|
|
113
108
|
* - {@link SchemaMismatchError} `'unversioned' | 'unsupported' |
|
|
114
109
|
* 'foreign'` — a schema claim this build cannot own.
|
|
115
110
|
*
|
|
@@ -137,9 +132,7 @@ export declare const bindAdmission: (Y: EngineApi) => {
|
|
|
137
132
|
* Throws {@link UndecodableUpdateError} for payloads that fail to
|
|
138
133
|
* decode/integrate at all, then the usual typed refusals.
|
|
139
134
|
*/
|
|
140
|
-
admitUpdate: (update: Uint8Array | ReadonlyArray<Uint8Array
|
|
141
|
-
v2: Uint8Array;
|
|
142
|
-
}>, docName?: string, options?: {
|
|
135
|
+
admitUpdate: (update: Uint8Array | ReadonlyArray<Uint8Array>, docName?: string, options?: {
|
|
143
136
|
/** Prepare the scratch doc before anything is applied (e.g. its `gcFilter`). */
|
|
144
137
|
prepare?: (doc: YDoc) => void;
|
|
145
138
|
}) => YDoc;
|
package/dist/crdt/admission.js
CHANGED
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
* gate here, in the same order, with the same refusal semantics:
|
|
6
6
|
*
|
|
7
7
|
* 1. **`assertUsableDoc`** — is this a v14 engine doc at all
|
|
8
|
-
* ({@link UnsupportedDocError} `'foreign'`)
|
|
9
|
-
* layout that must be migrated rather than adopted (`'legacy'`)?
|
|
8
|
+
* ({@link UnsupportedDocError} `'foreign'`)?
|
|
10
9
|
* 2. **`assertSchema`** — does the committed schema manifest allow
|
|
11
10
|
* this build to own the doc ({@link SchemaMismatchError}:
|
|
12
11
|
* `'unversioned'` content with no version stamp, `'unsupported'`
|
|
@@ -43,8 +42,6 @@
|
|
|
43
42
|
* from the engine's pending store pending store discarded; a
|
|
44
43
|
* stamp that got in anyway (raw
|
|
45
44
|
* apply) makes the doc read-only
|
|
46
|
-
* v13 migration `bindLegacyReader` gate → rebuild via legacy DB byte-identical; no
|
|
47
|
-
* document-level `init` → `loadDocument` v14 generation activated
|
|
48
45
|
*
|
|
49
46
|
* TWO LAYERS. The transport layer (`providers/*`, `protocols/*`) proves
|
|
50
47
|
* the generation of every frame and container and refuses updates that
|
|
@@ -92,8 +89,6 @@ export class UndecodableUpdateError extends Error {
|
|
|
92
89
|
* - {@link UnsupportedDocError} `'foreign'` — not a v14 engine doc
|
|
93
90
|
* (foreign roots/engines may still attach *content* later; this is
|
|
94
91
|
* about doc shape);
|
|
95
|
-
* - {@link UnsupportedDocError} `'legacy'` — v13-era layout present;
|
|
96
|
-
* route through `crdt/migration` instead of attaching;
|
|
97
92
|
* - {@link SchemaMismatchError} `'unversioned' | 'unsupported' |
|
|
98
93
|
* 'foreign'` — a schema claim this build cannot own.
|
|
99
94
|
*
|
|
@@ -138,10 +133,9 @@ export const bindAdmission = (Y) => ({
|
|
|
138
133
|
admitUpdate: (update, docName = 'loaded document', options = {}) => {
|
|
139
134
|
const doc = keepingReplaced(new Y.Doc());
|
|
140
135
|
options.prepare?.(doc);
|
|
141
|
-
const apply = (part) =>
|
|
136
|
+
const apply = (part) => Y.applyUpdate(doc, part);
|
|
142
137
|
try {
|
|
143
|
-
// Several updates
|
|
144
|
-
// transaction, with no merge pass.
|
|
138
|
+
// Several updates are applied in one transaction, with no merge pass.
|
|
145
139
|
if (update instanceof Uint8Array)
|
|
146
140
|
apply(update);
|
|
147
141
|
else
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* pre-existing per-edit records.
|
|
2
|
+
* Attribution surface: the actor dictionary and the per-block records.
|
|
4
3
|
*
|
|
5
4
|
* The per-edit capture pipeline of earlier builds (immutable `a/<nonce>/<seq>` ContentMap records
|
|
6
5
|
* written in a follow-up transaction per committed edit, projected onto
|
|
@@ -23,25 +22,15 @@
|
|
|
23
22
|
* also travel inside `encode()` output, so `loadDocument` restores the
|
|
24
23
|
* dictionary without republishing.
|
|
25
24
|
*
|
|
26
|
-
* LEGACY RECORDS — documents saved by
|
|
27
|
-
* under the same root. They are plain replicated state
|
|
28
|
-
* verbatim by `encode()`/sync
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* ordinary attribute-record merge.
|
|
33
|
-
*
|
|
34
|
-
* RETENTION — `a/` state is retained as long as it exists in the
|
|
35
|
-
* document (no GC of the records themselves); `live()`/renderer
|
|
36
|
-
* projections are gone, and the engine no longer ships concrete
|
|
37
|
-
* renderers (fork patch YP8, UPSTREAM.md) — consumers that need a rendered view over
|
|
38
|
-
* legacy records implement the engine's `AbstractRenderer` over the
|
|
39
|
-
* `ContentMap` `legacy()` returns and pass it to `toDelta({renderer})`.
|
|
25
|
+
* LEGACY RECORDS — documents saved by early builds carry `a/` per-edit
|
|
26
|
+
* records under the same root. They are plain replicated state, preserved
|
|
27
|
+
* verbatim by `encode()`/sync (no GC of the records themselves); nothing
|
|
28
|
+
* reads them. This build never writes new `a/` records; old replicas that
|
|
29
|
+
* still do simply append more keys — convergence is the ordinary
|
|
30
|
+
* attribute-record merge.
|
|
40
31
|
*/
|
|
41
32
|
import type { EngineApi, EngineDoc } from '../engine-api.js';
|
|
42
|
-
import type * as Engine from '../vendor/yjs/dts/index.js';
|
|
43
33
|
import { ATTRIBUTION_ROOT } from '../schema.js';
|
|
44
|
-
import { type JSONBlock } from '../../utils/json.js';
|
|
45
34
|
import { type BlockAttribution } from './block.js';
|
|
46
35
|
/** Reserved replicated root for all attribution metadata (`SCHEMA.roots.attribution`). */
|
|
47
36
|
export { ATTRIBUTION_ROOT };
|
|
@@ -63,7 +52,7 @@ export type ActorProfile = {
|
|
|
63
52
|
color?: string;
|
|
64
53
|
};
|
|
65
54
|
/**
|
|
66
|
-
* The document-level attribution surface. `actors`/`actorOf`/`
|
|
55
|
+
* The document-level attribution surface. `actors`/`actorOf`/`block`
|
|
67
56
|
* read replicated doc state directly — they resolve remote-applied
|
|
68
57
|
* records identically and stay correct as old replicas append records.
|
|
69
58
|
*/
|
|
@@ -78,16 +67,6 @@ export type DocumentAttribution = {
|
|
|
78
67
|
* actor id; only the resolvable profile changes.
|
|
79
68
|
*/
|
|
80
69
|
setProfile(profile: ActorProfile): void;
|
|
81
|
-
/**
|
|
82
|
-
* Merged read over the pre-existing `a/` records written by the
|
|
83
|
-
* retired per-edit capture pipeline: `{inserts, deletes}` IdMaps in
|
|
84
|
-
* the native ContentMap shape, decoded fresh per call. Returns `null`
|
|
85
|
-
* when the document carries no legacy records. For a rendered history
|
|
86
|
-
* view, implement the engine's `AbstractRenderer` over it (the engine
|
|
87
|
-
* ships no concrete renderer); the ordinary
|
|
88
|
-
* runs/projection surface does not consult it.
|
|
89
|
-
*/
|
|
90
|
-
legacy(): Engine.ContentMap | null;
|
|
91
70
|
/**
|
|
92
71
|
* Compact per-block attribution for `blockId`
|
|
93
72
|
* (`{createdBy, contributors, lastChangedBy}` — durable actor ids,
|
|
@@ -103,48 +82,6 @@ export type DocumentAttribution = {
|
|
|
103
82
|
* present it as "written by" for visible text.
|
|
104
83
|
*/
|
|
105
84
|
block(blockId: string): BlockAttribution | undefined;
|
|
106
|
-
/**
|
|
107
|
-
* Opt-in bounded lineage ring for `blockId` — the block's subtree
|
|
108
|
-
* snapshots captured just BEFORE displacing events: another actor's
|
|
109
|
-
* first write (an `l` handoff), a delete, or an undo/redo touching the
|
|
110
|
-
* block. Oldest → newest, capped at the document's configured
|
|
111
|
-
* `lineage.depth`; `undefined` when the block carries no record (and
|
|
112
|
-
* empty when the feature is off or nothing has been displaced yet).
|
|
113
|
-
*
|
|
114
|
-
* The cap is enforced HERE, at read: concurrent appends under
|
|
115
|
-
* partition can transiently store `depth + n` entries (the
|
|
116
|
-
* append-side trim only sees the writer's own ring) until the
|
|
117
|
-
* replicated watermark trim converges the stored ring — this view
|
|
118
|
-
* never returns more than `depth`. A replica configured `depth: 0`
|
|
119
|
-
* (writes off) instead sees the ring's own retention bound — the
|
|
120
|
-
* deepest depth any surviving entry's writer used.
|
|
121
|
-
*
|
|
122
|
-
* Each entry's `block` is a deep-copied `JSONBlock` — restoring an
|
|
123
|
-
* entry is an ordinary `setBlock`-class edit (which itself lands a
|
|
124
|
-
* new entry, displacing the state it overwrote). Entries on a dead
|
|
125
|
-
* block stay readable here — the record survives deletion — but a
|
|
126
|
-
* reincarnated block id starts a FRESH ring: old history never
|
|
127
|
-
* contaminates the new incarnation.
|
|
128
|
-
*/
|
|
129
|
-
history(blockId: string): BlockLineageEntry[] | undefined;
|
|
130
|
-
};
|
|
131
|
-
/** A public lineage entry — the expanded form of the compact wire record. */
|
|
132
|
-
export type BlockLineageEntry = {
|
|
133
|
-
/** The displaced owner (absent when the block was unattributed at capture). */
|
|
134
|
-
actor?: string;
|
|
135
|
-
/** The actor whose edit displaced the state (or whose undo/redo touched the block). */
|
|
136
|
-
by: string;
|
|
137
|
-
/**
|
|
138
|
-
* Ring position at append — a display aid only. It can REPEAT (a trim
|
|
139
|
-
* rewinds the position counter, and concurrent replicas assign the
|
|
140
|
-
* same position independently): never an entry id — array order is
|
|
141
|
-
* the truth.
|
|
142
|
-
*/
|
|
143
|
-
seq: number;
|
|
144
|
-
/** Wall-clock capture time — display only, never ordering. */
|
|
145
|
-
time?: number;
|
|
146
|
-
/** The displaced subtree snapshot (deep-copied — safe to keep/mutate). */
|
|
147
|
-
block: JSONBlock;
|
|
148
85
|
};
|
|
149
86
|
export type AttributionController = {
|
|
150
87
|
/** The public read surface handed to `EdytorDocument.attribution`. */
|
|
@@ -157,13 +94,15 @@ export type AttributionController = {
|
|
|
157
94
|
type AttachOptions = {
|
|
158
95
|
actor: AttributionActor;
|
|
159
96
|
};
|
|
97
|
+
/** The display profile of `actor`: its name and color, those it has. */
|
|
98
|
+
export declare const profileOf: (actor: AttributionActor) => ActorProfile;
|
|
160
99
|
/**
|
|
161
100
|
* Bind the attribution service to a concrete engine — same injection
|
|
162
101
|
* pattern as `bindEdytorDoc`/`bindDocument`. Lifecycle is owned by the
|
|
163
102
|
* calling document: one controller per `EdytorDocument`, attached in the
|
|
164
103
|
* constructor, released on destroy.
|
|
165
104
|
*/
|
|
166
|
-
export declare const bindAttribution: (
|
|
105
|
+
export declare const bindAttribution: (_Y: EngineApi) => {
|
|
167
106
|
attach: (doc: EngineDoc, opts: AttachOptions) => AttributionController;
|
|
168
107
|
};
|
|
169
108
|
export type AttributionBinding = ReturnType<typeof bindAttribution>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ATTRIBUTION_ROOT } from '../schema.js';
|
|
2
|
-
import {
|
|
3
|
-
import { blockAttributionOf, lineageOf, lineageWatermarkOf } from './block.js';
|
|
2
|
+
import { blockAttributionOf } from './block.js';
|
|
4
3
|
/** Reserved replicated root for all attribution metadata (`SCHEMA.roots.attribution`). */
|
|
5
4
|
export { ATTRIBUTION_ROOT };
|
|
6
5
|
/**
|
|
@@ -9,7 +8,6 @@ export { ATTRIBUTION_ROOT };
|
|
|
9
8
|
* out of undo capture; tooling classifies it as bookkeeping.
|
|
10
9
|
*/
|
|
11
10
|
export const ATTRIBUTION_ORIGIN = Symbol('edytor.attribution');
|
|
12
|
-
const RECORD_PREFIX = 'a/'; // legacy immutable per-transaction ContentMap records
|
|
13
11
|
const ACTOR_PREFIX = 'u/'; // actorId → profile records
|
|
14
12
|
const CLIENT_PREFIX = 'c/'; // replica clientID → actorId records
|
|
15
13
|
const sanitizeProfile = (value) => {
|
|
@@ -21,7 +19,8 @@ const sanitizeProfile = (value) => {
|
|
|
21
19
|
out.color = v.color;
|
|
22
20
|
return out;
|
|
23
21
|
};
|
|
24
|
-
|
|
22
|
+
/** The display profile of `actor`: its name and color, those it has. */
|
|
23
|
+
export const profileOf = (actor) => ({
|
|
25
24
|
...(actor.name !== undefined ? { name: actor.name } : {}),
|
|
26
25
|
...(actor.color !== undefined ? { color: actor.color } : {})
|
|
27
26
|
});
|
|
@@ -31,7 +30,7 @@ const profileOf = (actor) => ({
|
|
|
31
30
|
* calling document: one controller per `EdytorDocument`, attached in the
|
|
32
31
|
* constructor, released on destroy.
|
|
33
32
|
*/
|
|
34
|
-
export const bindAttribution = (
|
|
33
|
+
export const bindAttribution = (_Y) => {
|
|
35
34
|
/**
|
|
36
35
|
* Attach the actor dictionary to `doc`: publishes this replica's
|
|
37
36
|
* `c/`+`u/` records and returns the read-through view. No listeners —
|
|
@@ -74,55 +73,9 @@ export const bindAttribution = (Y) => {
|
|
|
74
73
|
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
75
74
|
},
|
|
76
75
|
setProfile,
|
|
77
|
-
legacy: () => {
|
|
78
|
-
const inserts = Y.createIdMap();
|
|
79
|
-
const deletes = Y.createIdMap();
|
|
80
|
-
let found = false;
|
|
81
|
-
for (const key of root.attrKeys()) {
|
|
82
|
-
if (!key.startsWith(RECORD_PREFIX))
|
|
83
|
-
continue;
|
|
84
|
-
const value = root.getAttr(key);
|
|
85
|
-
if (!(value instanceof Uint8Array))
|
|
86
|
-
continue;
|
|
87
|
-
let change;
|
|
88
|
-
try {
|
|
89
|
-
change = Y.decodeContentMap(value);
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
continue; // malformed record — skip, never poison the merged map
|
|
93
|
-
}
|
|
94
|
-
Y.insertIntoIdMap(inserts, change.inserts);
|
|
95
|
-
Y.insertIntoIdMap(deletes, change.deletes);
|
|
96
|
-
found = true;
|
|
97
|
-
}
|
|
98
|
-
return found ? Y.createContentMap(inserts, deletes) : null;
|
|
99
|
-
},
|
|
100
76
|
// `b/<id>` records live on the `blockattr` root and `l` on
|
|
101
77
|
// the block node — plain replicated reads, no observer needed.
|
|
102
|
-
block: (blockId) => blockAttributionOf(doc, blockId)
|
|
103
|
-
// Opt-in ring (`lineage.depth`): read the record's list items
|
|
104
|
-
// capped at the ring's watermark — the max depth of surviving
|
|
105
|
-
// entries, identical to the bound appends and the receive-side
|
|
106
|
-
// trim enforce, so every replica reads the SAME ring for the
|
|
107
|
-
// same stored state regardless of its own `lineage.depth`.
|
|
108
|
-
// (Concurrent appends can store a transient excess until the
|
|
109
|
-
// trim converges it.) Deep-copy each entry — the stored `j`
|
|
110
|
-
// snapshot is shared replicated state and must not be mutable
|
|
111
|
-
// through this view.
|
|
112
|
-
history: (blockId) => {
|
|
113
|
-
const entries = lineageOf(doc, blockId);
|
|
114
|
-
if (entries === undefined)
|
|
115
|
-
return undefined;
|
|
116
|
-
const cap = lineageWatermarkOf(entries);
|
|
117
|
-
const visible = entries.length > cap ? entries.slice(entries.length - cap) : entries;
|
|
118
|
-
return visible.map((e) => ({
|
|
119
|
-
...(e.a !== undefined ? { actor: e.a } : {}),
|
|
120
|
-
by: e.by,
|
|
121
|
-
seq: e.s,
|
|
122
|
-
...(e.t !== undefined ? { time: e.t } : {}),
|
|
123
|
-
block: cloneJson(e.j)
|
|
124
|
-
}));
|
|
125
|
-
}
|
|
78
|
+
block: (blockId) => blockAttributionOf(doc, blockId)
|
|
126
79
|
};
|
|
127
80
|
return {
|
|
128
81
|
view,
|
|
@@ -77,51 +77,6 @@ export type BlockAttribution = {
|
|
|
77
77
|
/** The actor whose state change currently wins the LWW resolution. */
|
|
78
78
|
lastChangedBy?: ActorId;
|
|
79
79
|
};
|
|
80
|
-
/**
|
|
81
|
-
* One bounded-lineage checkpoint on a block's `brec` record — the block's
|
|
82
|
-
* subtree JSON captured JUST BEFORE a displacing edit: an `l` handoff
|
|
83
|
-
* (another actor's first write), a delete, or an undo/redo touching the
|
|
84
|
-
* block. Entries live as list items on the record node itself, appended
|
|
85
|
-
* and ring-trimmed to the document's configured depth inside the owning
|
|
86
|
-
* op's transaction — they die with the record on reincarnation. Compact
|
|
87
|
-
* wire keys keep the replicated payload small; the public surface
|
|
88
|
-
* (`attribution.history`) re-expands them.
|
|
89
|
-
*/
|
|
90
|
-
export type LineageEntry = {
|
|
91
|
-
/** The displaced owner — the `l` winner when captured (absent when unattributed). */
|
|
92
|
-
a?: ActorId;
|
|
93
|
-
/** The actor whose edit displaced the state (or whose undo/redo touched the block). */
|
|
94
|
-
by: ActorId;
|
|
95
|
-
/**
|
|
96
|
-
* Ring position at append — a display aid only. It can REPEAT (after a
|
|
97
|
-
* trim the position counter rewinds, and concurrent replicas assign
|
|
98
|
-
* the same position independently): never an entry id — list order is
|
|
99
|
-
* the truth.
|
|
100
|
-
*/
|
|
101
|
-
s: number;
|
|
102
|
-
/** Wall-clock capture time — display only, never ordering. */
|
|
103
|
-
t?: number;
|
|
104
|
-
/** The displaced subtree snapshot (a `JSONBlock`). */
|
|
105
|
-
j: unknown;
|
|
106
|
-
/**
|
|
107
|
-
* The appending writer's configured ring depth. THE retention bound is
|
|
108
|
-
* the MAX of surviving entries' `d` — enforced identically by
|
|
109
|
-
* `appendLineage` (same-tx trim), `attachRingTrim` (receive-side
|
|
110
|
-
* repair), and `history()` (read view), so a shallow replica can never
|
|
111
|
-
* evict a deeper writer's surviving history on ANY path. Entries
|
|
112
|
-
* written before `d` existed leave it absent → the ring is exempt from
|
|
113
|
-
* trimming entirely (the writers' bound is unknowable — evict
|
|
114
|
-
* nothing).
|
|
115
|
-
*/
|
|
116
|
-
d?: number;
|
|
117
|
-
};
|
|
118
|
-
/**
|
|
119
|
-
* The ring's retention bound — the deepest `lineage.depth` any surviving
|
|
120
|
-
* entry's writer was configured with. `POSITIVE_INFINITY` when ANY entry
|
|
121
|
-
* lacks `d` (pre-watermark data): without knowing every writer's bound,
|
|
122
|
-
* no entry may be evicted on their behalf.
|
|
123
|
-
*/
|
|
124
|
-
export declare const lineageWatermarkOf: (entries: LineageEntry[]) => number;
|
|
125
80
|
export { BLOCK_ATTR_ROOT, LAST_CHANGED_ATTR };
|
|
126
81
|
/** The `k/` member set on a `b/` record node. */
|
|
127
82
|
export declare const contributorsOfRecord: (rec: EngineNode | null) => Set<ActorId>;
|
|
@@ -131,12 +86,6 @@ export declare const contributorsOfRecord: (rec: EngineNode | null) => Set<Actor
|
|
|
131
86
|
* carries no attribution at all (system/foreign content stays unlabeled).
|
|
132
87
|
*/
|
|
133
88
|
export declare const blockAttributionOf: (doc: EngineDoc, id: BlockId) => BlockAttribution | undefined;
|
|
134
|
-
/**
|
|
135
|
-
* Read one block's lineage ring, oldest → newest — or `undefined` when
|
|
136
|
-
* the block carries no record. Entries are the stored content values;
|
|
137
|
-
* callers deep-copy before exposing them publicly.
|
|
138
|
-
*/
|
|
139
|
-
export declare const lineageOf: (doc: EngineDoc, id: BlockId) => LineageEntry[] | undefined;
|
|
140
89
|
/**
|
|
141
90
|
* Bound write helpers. `stampChange`/`stampCreated`/`unionContributors`
|
|
142
91
|
* must be called INSIDE the operation's `doc.transact` — they perform
|
|
@@ -169,32 +118,5 @@ export declare const bindBlockAttribution: (Y: EngineApi) => {
|
|
|
169
118
|
* The merger itself lands via `stampChange` on the survivor.
|
|
170
119
|
*/
|
|
171
120
|
unionContributors: (doc: EngineDoc, intoId: BlockId, fromId: BlockId) => void;
|
|
172
|
-
/**
|
|
173
|
-
* Append a displaced-state checkpoint to the block's ring and trim
|
|
174
|
-
* to the ring's watermark — `max` of surviving entries' `d`,
|
|
175
|
-
* including the fresh one. The caller captures `entry.j` BEFORE its
|
|
176
|
-
* model write (see `lineagePending` in `edytor-doc.ts`) and calls
|
|
177
|
-
* this only after the write proves out, so a refused write appends
|
|
178
|
-
* nothing. The watermark is THE retention policy — identical on
|
|
179
|
-
* append, on receive (`attachRingTrim`), and on read — so a shallow
|
|
180
|
-
* replica never evicts a deeper writer's surviving history, and the
|
|
181
|
-
* bound shrinks only once the deepest entries have themselves
|
|
182
|
-
* aged out. Concurrent appends under partition can still merge a
|
|
183
|
-
* ring past the watermark — neither side saw the other's entry —
|
|
184
|
-
* which the receive-side repair converges back.
|
|
185
|
-
*/
|
|
186
|
-
appendLineage: (doc: EngineDoc, id: BlockId, entry: Omit<LineageEntry, "s" | "d">, depth: number) => void;
|
|
187
|
-
/**
|
|
188
|
-
* The block's lineage ring, oldest → newest — or `undefined` when
|
|
189
|
-
* the block has no record at all. Entries are the stored content
|
|
190
|
-
* values; the public surface copies them before handing them out.
|
|
191
|
-
*/
|
|
192
|
-
lineageOf: (doc: EngineDoc, id: BlockId) => LineageEntry[] | undefined;
|
|
193
|
-
/**
|
|
194
|
-
* Attach the doc's shared ring-watermark repair — once per doc for
|
|
195
|
-
* the doc's lifetime (module-level dedupe). See the module-level comment
|
|
196
|
-
* below.
|
|
197
|
-
*/
|
|
198
|
-
attachRingTrim: (doc: EngineDoc) => void;
|
|
199
121
|
};
|
|
200
122
|
export type BlockAttributionApi = ReturnType<typeof bindBlockAttribution>;
|