edytor 1.0.0-rc.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +27 -137
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.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 +19 -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/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 +39 -55
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +53 -96
- package/dist/components/Edytor.svelte.d.ts +8 -12
- 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 +8 -13
- package/dist/crdt/data.js +30 -70
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/dnd/autoScroll.js +1 -2
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +34 -64
- package/dist/edytor.svelte.js +116 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +185 -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 +1 -1
- package/dist/events/onDrop.js +27 -69
- 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 +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -14
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +81 -320
- package/dist/labels.js +180 -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 +39 -94
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +190 -247
- package/dist/plugins/blockHandles/BlockHandles.svelte +27 -17
- 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 +129 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +2 -1
- package/dist/plugins/blockHandles/geometry.js +6 -6
- 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 +3 -35
- package/dist/plugins/code/CodePlugin.svelte +50 -53
- 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 -19
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -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 -165
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +2 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- 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/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 +45 -134
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -42
- 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.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 +31 -26
- package/dist/plugins/index.js +29 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +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 +3 -90
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -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 +35 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -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 +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -99
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +36 -44
- package/dist/plugins/media/empty.svelte.js +41 -45
- package/dist/plugins/media/media.d.ts +90 -44
- package/dist/plugins/media/media.js +77 -99
- 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 +42 -123
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +6 -25
- 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 +47 -107
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +6 -25
- 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 +161 -177
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +33 -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/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 +339 -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 +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +154 -59
- 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 +33 -39
- package/dist/session/attempt.js +61 -55
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +3 -2
- package/dist/session/navigation.js +127 -168
- package/dist/session/ports.d.ts +2 -7
- 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/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 +263 -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/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
|
@@ -3,32 +3,30 @@ import type { InlineBlockDefinition } from '../plugins.js';
|
|
|
3
3
|
import type { JSONInlineBlock } from '../utils/json.js';
|
|
4
4
|
import type { Block } from './block.svelte.js';
|
|
5
5
|
/**
|
|
6
|
-
* An id-only inline-atom handle: atom `id`, shown in
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* the
|
|
6
|
+
* An id-only, read-only inline-atom handle: atom `id`, shown in block
|
|
7
|
+
* `blockId`. Getters read the document index; writes are the view's
|
|
8
|
+
* operations (`edytor.patchData({ block: atom.blockId, atom: atom.id }, …)`).
|
|
9
|
+
* `node` is the element that renders it (a Surface fact). A reactive reader
|
|
10
|
+
* of a getter depends on the block's cell, so it re-runs when a commit
|
|
11
|
+
* changes the block's content.
|
|
10
12
|
*/
|
|
11
13
|
export declare class InlineBlock {
|
|
12
14
|
#private;
|
|
13
|
-
_def: "inline";
|
|
14
15
|
readonly: boolean;
|
|
15
16
|
readonly edytor: Edytor;
|
|
16
17
|
readonly id: string;
|
|
17
18
|
/** The block that shows the atom (the view updates it when the atom moves). */
|
|
18
19
|
blockId: string;
|
|
19
20
|
node: HTMLElement | undefined;
|
|
20
|
-
private attachedNodes;
|
|
21
21
|
constructor(edytor: Edytor, blockId: string, id: string);
|
|
22
22
|
get parent(): Block;
|
|
23
23
|
get selected(): boolean;
|
|
24
24
|
get type(): string;
|
|
25
|
-
/** The atom's `data
|
|
26
|
-
get data(): Record<string, any
|
|
25
|
+
/** The atom's `data`; a reactive reader depends on its block's cell. */
|
|
26
|
+
get data(): Readonly<Record<string, any>>;
|
|
27
27
|
get definition(): InlineBlockDefinition;
|
|
28
28
|
/** Position among the block's content parts. */
|
|
29
29
|
get index(): number;
|
|
30
|
-
/** Replace the atom's `data` — its block's `patchData` command (readonly, hooks). */
|
|
31
|
-
setData: (data: Record<string, unknown>) => void;
|
|
32
30
|
/** The atom is shown by a live block. */
|
|
33
31
|
get isInDocument(): boolean;
|
|
34
32
|
get value(): JSONInlineBlock;
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { propsProxy } from '../session/props.js';
|
|
2
1
|
const INLINE_EDGE_CARET_THRESHOLD_PX = 4;
|
|
3
2
|
const isTextPart = (part) => part !== undefined && !(part instanceof InlineBlock);
|
|
4
3
|
/**
|
|
5
|
-
* An id-only inline-atom handle: atom `id`, shown in
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* the
|
|
4
|
+
* An id-only, read-only inline-atom handle: atom `id`, shown in block
|
|
5
|
+
* `blockId`. Getters read the document index; writes are the view's
|
|
6
|
+
* operations (`edytor.patchData({ block: atom.blockId, atom: atom.id }, …)`).
|
|
7
|
+
* `node` is the element that renders it (a Surface fact). A reactive reader
|
|
8
|
+
* of a getter depends on the block's cell, so it re-runs when a commit
|
|
9
|
+
* changes the block's content.
|
|
9
10
|
*/
|
|
10
11
|
export class InlineBlock {
|
|
11
|
-
_def = 'inline';
|
|
12
12
|
readonly = false;
|
|
13
13
|
edytor;
|
|
14
14
|
id;
|
|
15
15
|
/** The block that shows the atom (the view updates it when the atom moves). */
|
|
16
16
|
blockId;
|
|
17
17
|
node;
|
|
18
|
-
attachedNodes = new Set();
|
|
18
|
+
#attachedNodes = new Set();
|
|
19
19
|
constructor(edytor, blockId, id) {
|
|
20
20
|
this.edytor = edytor;
|
|
21
21
|
this.blockId = blockId;
|
|
@@ -37,13 +37,9 @@ export class InlineBlock {
|
|
|
37
37
|
get type() {
|
|
38
38
|
return this.#item?.type ?? '';
|
|
39
39
|
}
|
|
40
|
-
|
|
41
|
-
/** The atom's `data` as a live proxy (`session/props.ts`): writes are its block's `patchData` commands. */
|
|
40
|
+
/** The atom's `data`; a reactive reader depends on its block's cell. */
|
|
42
41
|
get data() {
|
|
43
|
-
return
|
|
44
|
-
this.edytor.cells?.get(this.blockId);
|
|
45
|
-
return this.#item?.data ?? {};
|
|
46
|
-
}, (ops) => this.parent.patchData({ atom: this.id, ops }), (path) => this.edytor.facade.dataItemIds({ block: this.blockId, atom: this.id }, path)));
|
|
42
|
+
return this.#item?.data ?? {};
|
|
47
43
|
}
|
|
48
44
|
get definition() {
|
|
49
45
|
return this.edytor.inlineBlocks.get(this.type) ?? {};
|
|
@@ -52,10 +48,6 @@ export class InlineBlock {
|
|
|
52
48
|
get index() {
|
|
53
49
|
return this.parent.content.indexOf(this);
|
|
54
50
|
}
|
|
55
|
-
/** Replace the atom's `data` — its block's `patchData` command (readonly, hooks). */
|
|
56
|
-
setData = (data) => {
|
|
57
|
-
this.parent.patchData({ atom: this.id, ops: [{ path: [], value: data }] });
|
|
58
|
-
};
|
|
59
51
|
/** The atom is shown by a live block. */
|
|
60
52
|
get isInDocument() {
|
|
61
53
|
return this.parent.isInTree && this.#item !== undefined;
|
|
@@ -68,7 +60,7 @@ export class InlineBlock {
|
|
|
68
60
|
node.setAttribute('contenteditable', 'false');
|
|
69
61
|
node.dataset.edytorId = this.id;
|
|
70
62
|
node.dataset.edytorInlineBlock = this.type;
|
|
71
|
-
this
|
|
63
|
+
this.#attachedNodes.add(node);
|
|
72
64
|
this.edytor.nodeToInlineBlock.set(node, this);
|
|
73
65
|
this.node = node;
|
|
74
66
|
const release = this.edytor.surface.register(node, 'atom', this.blockId);
|
|
@@ -86,9 +78,9 @@ export class InlineBlock {
|
|
|
86
78
|
const [before, after] = [content[index - 1], content[index + 1]];
|
|
87
79
|
const { selection } = this.edytor;
|
|
88
80
|
if (event.clientX <= rect.left + INLINE_EDGE_CARET_THRESHOLD_PX && isTextPart(before))
|
|
89
|
-
return selection.
|
|
81
|
+
return selection.selectText(before, before.length);
|
|
90
82
|
if (event.clientX >= rect.right - INLINE_EDGE_CARET_THRESHOLD_PX && isTextPart(after))
|
|
91
|
-
return selection.
|
|
83
|
+
return selection.selectText(after, 0);
|
|
92
84
|
selection.selectInlineBlock(this);
|
|
93
85
|
this.edytor.ports.surface.clear();
|
|
94
86
|
// The atom took the press: the caret the browser still leaves for it
|
|
@@ -99,9 +91,9 @@ export class InlineBlock {
|
|
|
99
91
|
return {
|
|
100
92
|
destroy: () => {
|
|
101
93
|
node.removeEventListener('pointerdown', selectInlineBlock);
|
|
102
|
-
this
|
|
94
|
+
this.#attachedNodes.delete(node);
|
|
103
95
|
if (this.node === node) {
|
|
104
|
-
this.node = this
|
|
96
|
+
this.node = this.#attachedNodes.values().next().value;
|
|
105
97
|
}
|
|
106
98
|
this.edytor.nodeToInlineBlock.delete(node);
|
|
107
99
|
release();
|
|
@@ -1,28 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Text } from '../text/text.svelte.js';
|
|
3
|
-
import { sliceTextValue } from '../block/contentRange.js';
|
|
4
|
-
import { cloneJson } from '../utils/json.js';
|
|
1
|
+
import { sliceContent } from '../block/contentRange.js';
|
|
5
2
|
import { rangeCovers, selectedMembers } from '../selection/visibility.js';
|
|
6
3
|
import { liftLayouts } from '../selection/replaceSelection.js';
|
|
7
|
-
const extractContentRange = (block, startText, startOffset, endText, endOffset) => {
|
|
8
|
-
const content = [];
|
|
9
|
-
const startIndex = block.content.indexOf(startText);
|
|
10
|
-
const endIndex = block.content.indexOf(endText);
|
|
11
|
-
for (const [index, part] of block.content.entries()) {
|
|
12
|
-
if (index < startIndex || index > endIndex) {
|
|
13
|
-
continue;
|
|
14
|
-
}
|
|
15
|
-
if (part instanceof InlineBlock) {
|
|
16
|
-
// An atom's `value.data` is a shallow copy of the index's: clone it.
|
|
17
|
-
content.push(cloneJson(part.value));
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
const start = part === startText ? startOffset : 0;
|
|
21
|
-
const end = part === endText ? endOffset : part.length;
|
|
22
|
-
content.push(...sliceTextValue(part.value, start, end));
|
|
23
|
-
}
|
|
24
|
-
return content;
|
|
25
|
-
};
|
|
26
4
|
/**
|
|
27
5
|
* Block values nested as in the document, members only: a child that is not
|
|
28
6
|
* a member is left out, a member under a non-member starts a top-level entry.
|
|
@@ -43,30 +21,6 @@ const nestMembers = (blocks, valueOf) => {
|
|
|
43
21
|
}
|
|
44
22
|
return out;
|
|
45
23
|
};
|
|
46
|
-
const extractBlockRange = (edytor) => {
|
|
47
|
-
const { blocks, startBlock, endBlock, startText, endText, yStart, yEnd } = edytor.selection.state;
|
|
48
|
-
if (!startBlock || !endBlock || !startText || !endText || blocks.length === 0) {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
// A hidden block (a closed toggle's body) is copied exactly when the range's
|
|
52
|
-
// delete removes it, so a cut, or a copy then Backspace, never loses or
|
|
53
|
-
// duplicates it (`del.range.hidden-body`).
|
|
54
|
-
const copied = blocks.filter(rangeCovers(edytor));
|
|
55
|
-
// `block.value` is the document's serializer output: fresh JSON, no clone.
|
|
56
|
-
return nestMembers(copied, (block) => {
|
|
57
|
-
const value = block.value;
|
|
58
|
-
if (block === startBlock) {
|
|
59
|
-
value.content = extractContentRange(block, startText, yStart, block.lastText, block.lastText.length);
|
|
60
|
-
}
|
|
61
|
-
if (block === endBlock) {
|
|
62
|
-
value.content = extractContentRange(block, block.firstText, 0, endText, yEnd);
|
|
63
|
-
}
|
|
64
|
-
if (startBlock === endBlock) {
|
|
65
|
-
value.content = extractContentRange(block, startText, yStart, endText, yEnd);
|
|
66
|
-
}
|
|
67
|
-
return value;
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
24
|
/**
|
|
71
25
|
* `fragment` without the marks whose record says `copy: false` (a
|
|
72
26
|
* comment's anchor, `comment:<id>`: Notion copies the text, not the
|
|
@@ -101,8 +55,9 @@ const withoutUncopied = (edytor, fragment) => {
|
|
|
101
55
|
};
|
|
102
56
|
export const createEdytorClipboardFragment = (edytor) => withoutUncopied(edytor, fragmentOf(edytor));
|
|
103
57
|
const fragmentOf = (edytor) => {
|
|
58
|
+
const { selection, idToBlock } = edytor;
|
|
104
59
|
// A layout the block selection covers whole is copied as the layout.
|
|
105
|
-
const selectedBlocks = selectedMembers(edytor, liftLayouts(
|
|
60
|
+
const selectedBlocks = selectedMembers(edytor, liftLayouts(selection.selectedBlocks));
|
|
106
61
|
if (selectedBlocks.length > 0) {
|
|
107
62
|
return {
|
|
108
63
|
version: 1,
|
|
@@ -114,26 +69,29 @@ const fragmentOf = (edytor) => {
|
|
|
114
69
|
whole: true
|
|
115
70
|
};
|
|
116
71
|
}
|
|
117
|
-
|
|
118
|
-
|
|
72
|
+
// The range in block offsets: `block.value` is the document's serializer output (fresh JSON).
|
|
73
|
+
const { start, end, isCollapsed, isBlockSpanning, blocks } = selection.projection;
|
|
74
|
+
const startBlock = start && idToBlock.get(start.block);
|
|
75
|
+
if (!start || !end || !startBlock || isCollapsed)
|
|
119
76
|
return null;
|
|
77
|
+
if (!isBlockSpanning) {
|
|
78
|
+
const content = sliceContent(startBlock.value.content, start.offset, end.offset);
|
|
79
|
+
return { version: 1, source: 'edytor', kind: 'content', blockType: startBlock.type, content };
|
|
120
80
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
version: 1,
|
|
126
|
-
source: 'edytor',
|
|
127
|
-
kind: 'blocks',
|
|
128
|
-
blocks
|
|
129
|
-
}
|
|
130
|
-
: null;
|
|
131
|
-
}
|
|
81
|
+
// A hidden block (a closed toggle's body) is copied exactly when the range's
|
|
82
|
+
// delete removes it, so a cut, or a copy then Backspace, never loses or
|
|
83
|
+
// duplicates it (`del.range.hidden-body`).
|
|
84
|
+
const copied = blocks.flatMap((id) => idToBlock.get(id) ?? []).filter(rangeCovers(edytor));
|
|
132
85
|
return {
|
|
133
86
|
version: 1,
|
|
134
87
|
source: 'edytor',
|
|
135
|
-
kind: '
|
|
136
|
-
|
|
137
|
-
|
|
88
|
+
kind: 'blocks',
|
|
89
|
+
blocks: nestMembers(copied, (block) => {
|
|
90
|
+
const value = block.value;
|
|
91
|
+
const [first, last] = [block.id === start.block, block.id === end.block];
|
|
92
|
+
if (first || last)
|
|
93
|
+
value.content = sliceContent(value.content, first ? start.offset : 0, last ? end.offset : Infinity);
|
|
94
|
+
return value;
|
|
95
|
+
})
|
|
138
96
|
};
|
|
139
97
|
};
|
|
@@ -1,51 +1,26 @@
|
|
|
1
1
|
import { EDYTOR_FRAGMENT_ATTRIBUTE, EDYTOR_FRAGMENT_MIME } from './types.js';
|
|
2
2
|
import { encodeClipboardJson, serializeClipboardFragmentToHtml, serializeClipboardFragmentToPlainText } from './serializeClipboardFragment.js';
|
|
3
|
-
|
|
4
|
-
const isRecord = (value) => Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
3
|
+
import { isObject } from '../crdt/data.js';
|
|
5
4
|
const decodeJson = (value) => JSON.parse(decodeURIComponent(atob(value)));
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return value.marks === undefined || isRecord(value.marks);
|
|
11
|
-
};
|
|
5
|
+
/** A kind's name: a non-empty string. */
|
|
6
|
+
const isName = (value) => typeof value === 'string' && value.length > 0;
|
|
7
|
+
/** Every item of a list (absent: none) passes `valid`. */
|
|
8
|
+
const all = (value, valid, optional = false) => (optional && value === undefined) || (Array.isArray(value) && value.every(valid));
|
|
12
9
|
// Input is JSON (a parsed payload, or `cloneJsonSafe` on the programmatic path): no value walk.
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
if (value.children !== undefined) {
|
|
25
|
-
if (!Array.isArray(value.children) || !value.children.every(isValidBlock)) {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return true;
|
|
30
|
-
};
|
|
10
|
+
/** A text (its marks a record) or an inline atom (its kind named). */
|
|
11
|
+
const isPart = (value) => isObject(value) &&
|
|
12
|
+
((typeof value.text === 'string' && (value.marks === undefined || isObject(value.marks))) ||
|
|
13
|
+
isName(value.type));
|
|
14
|
+
const isBlock = (value) => isObject(value) &&
|
|
15
|
+
isName(value.type) &&
|
|
16
|
+
all(value.content, isPart, true) &&
|
|
17
|
+
all(value.children, isBlock, true);
|
|
31
18
|
export const isValidEdytorClipboardFragment = (value) => {
|
|
32
|
-
if (!value ||
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
const fragment = value;
|
|
36
|
-
if (fragment.version !== 1 || fragment.source !== 'edytor') {
|
|
19
|
+
if (!isObject(value) || value.version !== 1 || value.source !== 'edytor')
|
|
37
20
|
return false;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
if (fragment.kind === 'content') {
|
|
43
|
-
return (typeof fragment.blockType === 'string' &&
|
|
44
|
-
fragment.blockType.length > 0 &&
|
|
45
|
-
Array.isArray(fragment.content) &&
|
|
46
|
-
fragment.content.every(isValidContentPart));
|
|
47
|
-
}
|
|
48
|
-
return false;
|
|
21
|
+
if (value.kind === 'blocks')
|
|
22
|
+
return all(value.blocks, isBlock);
|
|
23
|
+
return value.kind === 'content' && isName(value.blockType) && all(value.content, isPart);
|
|
49
24
|
};
|
|
50
25
|
const parseEncodedFragment = (encoded) => {
|
|
51
26
|
try {
|
|
@@ -86,12 +86,12 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
86
86
|
for (const { data = {} } of kind.presets) {
|
|
87
87
|
const tag = tagOf(type, kind, data);
|
|
88
88
|
if (tag && !byTag.has(tag))
|
|
89
|
-
byTag.set(tag, { type, data });
|
|
89
|
+
byTag.set(tag, { type, kind, data });
|
|
90
90
|
}
|
|
91
91
|
const child = kind.rendersContent === false ? kind.defaultChild : undefined;
|
|
92
92
|
const tag = child && blocks.has(child) ? tagOf(child, blocks.get(child), {}) : undefined;
|
|
93
93
|
if (tag && !byTag.has(tag))
|
|
94
|
-
byTag.set(tag, { type, data: kind.presets[0].data ?? {}, lines: child });
|
|
94
|
+
byTag.set(tag, { type, kind, data: kind.presets[0].data ?? {}, lines: child });
|
|
95
95
|
}
|
|
96
96
|
const kindOf = (element) => {
|
|
97
97
|
// A glyph is text: no kind claims it.
|
|
@@ -100,7 +100,7 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
100
100
|
for (const [type, kind] of blocks) {
|
|
101
101
|
const data = kind.parse?.(element);
|
|
102
102
|
if (data)
|
|
103
|
-
return { type, data };
|
|
103
|
+
return { type, kind, data };
|
|
104
104
|
}
|
|
105
105
|
return byTag.get(element.localName);
|
|
106
106
|
};
|
|
@@ -129,7 +129,7 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
129
129
|
/** A void kind's element (an image): it shows no text, so a line it is met in ends there. */
|
|
130
130
|
const isVoid = (node) => {
|
|
131
131
|
const claim = node instanceof Element ? kindOf(node) : undefined;
|
|
132
|
-
return claim
|
|
132
|
+
return claim?.kind.void === true;
|
|
133
133
|
};
|
|
134
134
|
const text = (line, value, marks, pre) => {
|
|
135
135
|
const before = line.content.at(-1);
|
|
@@ -214,7 +214,7 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
214
214
|
}
|
|
215
215
|
// A void's only text is its caption: an `iframe`'s fallback, a `video`'s source list or
|
|
216
216
|
// a bookmark's link text is never content.
|
|
217
|
-
if (claim
|
|
217
|
+
if (claim?.kind.void) {
|
|
218
218
|
const line = { type: claim.type, data: claim.data, content: [] };
|
|
219
219
|
const caption = [...element.children].find((child) => child.localName === 'figcaption');
|
|
220
220
|
// A caption is one line: an element that would end it (an image) adds nothing.
|
|
@@ -225,7 +225,7 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
225
225
|
}
|
|
226
226
|
// A kind that shows no text of its own (a list, a layout, a column) takes none: its
|
|
227
227
|
// inline runs and a leading paragraph are lines of its default child, never hidden text.
|
|
228
|
-
if (claim
|
|
228
|
+
if (claim?.kind.rendersContent === false) {
|
|
229
229
|
const children = linesOf(element, kinds.document.defaultChild(claim.type));
|
|
230
230
|
return [
|
|
231
231
|
{ type: claim.type, data: claim.data, content: [], ...(children.length && { children }) }
|
|
@@ -250,7 +250,7 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
250
250
|
line: () => current,
|
|
251
251
|
apart: (inner) => {
|
|
252
252
|
// A void's own media (a figure's `img`) is part of it.
|
|
253
|
-
if (claim
|
|
253
|
+
if (claim?.kind.void)
|
|
254
254
|
return;
|
|
255
255
|
parts.push(...blockOf(inner, type));
|
|
256
256
|
current = { type: line.type, data: line.data, content: [] };
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { keepsSelectedBlocks, replaceSelectionWithCollapsedTarget } from '../selection/replaceSelection.js';
|
|
1
|
+
import { keepsSelectedBlocks, replaceSelectionWithCollapsedTarget, caretLeft } from '../selection/replaceSelection.js';
|
|
2
2
|
import { selectedMembers } from '../selection/visibility.js';
|
|
3
3
|
import { cloneJsonSafe, jsonBlockToSpec, jsonContentToItems } from '../utils/json.js';
|
|
4
4
|
import { id } from '../utils.js';
|
|
5
|
+
import { noSelection } from '../session/selection.js';
|
|
5
6
|
import { caretAt } from '../session/attempt.js';
|
|
6
7
|
import { isValidEdytorClipboardFragment } from './fragmentData.js';
|
|
7
8
|
import { hasBlockMarkdown, textToBlocks } from './textBlocks.js';
|
|
@@ -58,10 +59,10 @@ export const pasteFlow = (edytor, flow, { at, selection } = {}) => {
|
|
|
58
59
|
if (!replace.length && !block)
|
|
59
60
|
return;
|
|
60
61
|
const target = block ? { block: block.id, offset: p.text.segStart + p.offset } : { replace };
|
|
61
|
-
const
|
|
62
|
+
const end = caretLeft(edytor, edytor.insertFlow(target, flow));
|
|
62
63
|
if (replace.length)
|
|
63
|
-
edytor.selection.
|
|
64
|
-
caretAt(edytor, text, offset);
|
|
64
|
+
edytor.selection.select(noSelection);
|
|
65
|
+
caretAt(edytor, end?.text, end?.offset ?? 0);
|
|
65
66
|
};
|
|
66
67
|
/** Programmatic insertion: the fragment is untrusted input, projected to JSON and validated here. */
|
|
67
68
|
export const insertEdytorClipboardFragment = async (edytor, fragment) => {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { project } from '../session/selection.js';
|
|
2
2
|
import { viewOf } from '../selection/visibility.js';
|
|
3
|
-
import { applyAt, caretOf } from '../edytor.utils.js';
|
|
4
3
|
import { flowOfFragment } from './insertClipboardFragment.js';
|
|
5
4
|
const drags = new WeakMap();
|
|
6
5
|
/** The view's text drag in progress, if any. */
|
|
@@ -41,6 +40,13 @@ export const dropText = (edytor, drag, to) => {
|
|
|
41
40
|
/** Both halves at the current version, as hooks see them (a copy: the placement). */
|
|
42
41
|
const prepare = ({ from, to, copy }) => copy ? place(to) : facade.compose(place(to), remove(from));
|
|
43
42
|
const block = edytor.idToBlock.get(to.block);
|
|
43
|
+
/** Write a stage in the command; answers the caret it decides. */
|
|
44
|
+
const write = (plan) => {
|
|
45
|
+
if (!('writes' in plan) || !plan.at)
|
|
46
|
+
return null;
|
|
47
|
+
dispatcher.write(plan);
|
|
48
|
+
return plan.at;
|
|
49
|
+
};
|
|
44
50
|
/** Where the content went: its start and its end, bound to the placed text. */
|
|
45
51
|
const placed = {};
|
|
46
52
|
const payload = { from: { start, end }, to, copy };
|
|
@@ -51,29 +57,31 @@ export const dropText = (edytor, drag, to) => {
|
|
|
51
57
|
const first = facade.anchorAt(from.start.block, from.start.offset, 'right');
|
|
52
58
|
const last = facade.anchorAt(from.end.block, from.end.offset, 'left');
|
|
53
59
|
placed.from = facade.anchorAt(to.block, to.offset, 'left');
|
|
54
|
-
const at =
|
|
60
|
+
const at = write(place(to));
|
|
55
61
|
placed.to = at && facade.anchorAt(at.block, at.offset, 'left');
|
|
56
62
|
if (copy || !at)
|
|
57
63
|
return;
|
|
58
64
|
const [a, b] = [first && facade.resolveAnchor(first), last && facade.resolveAnchor(last)];
|
|
59
65
|
if (!a || !b)
|
|
60
66
|
return;
|
|
61
|
-
|
|
67
|
+
write(remove({
|
|
62
68
|
start: { block: a.blockId, offset: a.offset },
|
|
63
69
|
end: { block: b.blockId, offset: b.offset }
|
|
64
70
|
}));
|
|
65
71
|
}, prepare);
|
|
66
72
|
if (dispatcher.last?.status !== 'applied' || !placed.to)
|
|
67
73
|
return keep();
|
|
74
|
+
/** The text and offset an anchor resolves to. */
|
|
68
75
|
const point = (anchor) => {
|
|
69
76
|
const hit = anchor && facade.resolveAnchor(anchor);
|
|
70
|
-
|
|
77
|
+
const at = hit && edytor.idToBlock.get(hit.blockId)?.textAtOffset(hit.offset);
|
|
78
|
+
return at ? [at.text, at.offset] : [null, 0];
|
|
71
79
|
};
|
|
72
|
-
const [startText, startOffset] =
|
|
73
|
-
const [endText, endOffset] =
|
|
80
|
+
const [startText, startOffset] = point(placed.from);
|
|
81
|
+
const [endText, endOffset] = point(placed.to);
|
|
74
82
|
if (startText && endText)
|
|
75
|
-
edytor.selection.
|
|
83
|
+
edytor.selection.selectText(startText, startOffset, endText, endOffset);
|
|
76
84
|
else if (endText)
|
|
77
|
-
edytor.selection.
|
|
85
|
+
edytor.selection.selectText(endText, endOffset);
|
|
78
86
|
return true;
|
|
79
87
|
};
|
|
@@ -3,5 +3,7 @@ import type { EdytorClipboardFragment } from './types.js';
|
|
|
3
3
|
/** The records the export reads: each kind, mark and atom declares its own forms. */
|
|
4
4
|
export type ExportKinds = Pick<Edytor, 'blocks' | 'marks' | 'inlineBlocks'>;
|
|
5
5
|
export declare const encodeClipboardJson: (value: unknown) => string;
|
|
6
|
+
/** `value` escaped for an HTML text or a double-quoted attribute: every kind's export reads it. */
|
|
7
|
+
export declare const escapeHtml: (value: string) => string;
|
|
6
8
|
export declare const serializeClipboardFragmentToPlainText: (fragment: EdytorClipboardFragment, kinds: ExportKinds) => string;
|
|
7
9
|
export declare const serializeClipboardFragmentToHtml: (fragment: EdytorClipboardFragment, kinds: ExportKinds) => string;
|
|
@@ -2,7 +2,8 @@ import { EDYTOR_FRAGMENT_ATTRIBUTE } from './types.js';
|
|
|
2
2
|
import { isTextPart } from '../block/contentRange.js';
|
|
3
3
|
import { colorClasses } from '../block/colors.js';
|
|
4
4
|
export const encodeClipboardJson = (value) => btoa(encodeURIComponent(JSON.stringify(value)));
|
|
5
|
-
|
|
5
|
+
/** `value` escaped for an HTML text or a double-quoted attribute: every kind's export reads it. */
|
|
6
|
+
export const escapeHtml = (value) => value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
6
7
|
/** A tag form wraps `inner`; attributes left `undefined` are omitted. */
|
|
7
8
|
const tag = (name, inner, attributes = {}) => `<${name}${Object.entries(attributes)
|
|
8
9
|
.map(([key, value]) => (value === undefined ? '' : ` ${key}="${escapeHtml(value)}"`))
|
|
@@ -17,11 +18,17 @@ const textHtml = (part, kinds) => {
|
|
|
17
18
|
}
|
|
18
19
|
return html;
|
|
19
20
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
/** The content as HTML, or as plain text: an atom by its kind's form (`html`, `plain`). */
|
|
22
|
+
const contentOf = (content = [], kinds, html) => content
|
|
23
|
+
.map((part) => {
|
|
24
|
+
if (isTextPart(part))
|
|
25
|
+
return html ? textHtml(part, kinds) : part.text;
|
|
26
|
+
const atom = kinds.inlineBlocks.get(part.type);
|
|
27
|
+
return html
|
|
28
|
+
? (atom?.html?.(part.data) ??
|
|
29
|
+
`<span data-edytor-inline-block="${escapeHtml(part.type)}"></span>`)
|
|
30
|
+
: (atom?.plain?.(part.data) ?? '');
|
|
31
|
+
})
|
|
25
32
|
.join('');
|
|
26
33
|
/** `classes` added to the first element of `html` (the block's own), beside a class it has. */
|
|
27
34
|
const withClasses = (html, classes) => classes
|
|
@@ -33,37 +40,34 @@ const withClasses = (html, classes) => classes
|
|
|
33
40
|
return `<${name}${merged}${end}>`;
|
|
34
41
|
})
|
|
35
42
|
: html;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const
|
|
43
|
+
/** A block and its subtree as HTML (its colours as Notion's classes), or as plain text. */
|
|
44
|
+
const blockOf = (block, kinds, html) => {
|
|
45
|
+
const content = contentOf(block.content, kinds, html);
|
|
46
|
+
const kids = block.children?.map((child) => blockOf(child, kinds, html)) ?? [];
|
|
47
|
+
const kind = kinds.blocks.get(block.type);
|
|
48
|
+
if (!html) {
|
|
49
|
+
const children = kids.filter(Boolean).join('\n');
|
|
50
|
+
return kind?.plain
|
|
51
|
+
? kind.plain(block, content, children)
|
|
52
|
+
: [content, children].filter(Boolean).join('\n');
|
|
53
|
+
}
|
|
54
|
+
const children = kids.join('');
|
|
55
|
+
const form = kind?.html;
|
|
56
|
+
const out = !form
|
|
41
57
|
? `<p>${content}</p>${children}`
|
|
42
58
|
: typeof form === 'string'
|
|
43
59
|
? tag(form, content + children)
|
|
44
60
|
: form(block, content, children);
|
|
45
61
|
// A block's colours as Notion's export names them (`block-color-red`).
|
|
46
|
-
return withClasses(
|
|
47
|
-
};
|
|
48
|
-
const contentPlain = (content = [], kinds) => content
|
|
49
|
-
.map((part) => isTextPart(part) ? part.text : (kinds.inlineBlocks.get(part.type)?.plain?.(part.data) ?? ''))
|
|
50
|
-
.join('');
|
|
51
|
-
const blockPlain = (block, kinds) => {
|
|
52
|
-
const content = contentPlain(block.content, kinds);
|
|
53
|
-
const children = block.children
|
|
54
|
-
?.map((child) => blockPlain(child, kinds))
|
|
55
|
-
.filter(Boolean)
|
|
56
|
-
.join('\n') ?? '';
|
|
57
|
-
const form = kinds.blocks.get(block.type)?.plain;
|
|
58
|
-
return form ? form(block, content, children) : [content, children].filter(Boolean).join('\n');
|
|
62
|
+
return withClasses(out, colorClasses(block.data));
|
|
59
63
|
};
|
|
60
64
|
export const serializeClipboardFragmentToPlainText = (fragment, kinds) => fragment.kind === 'blocks'
|
|
61
|
-
? fragment.blocks.map((block) =>
|
|
62
|
-
:
|
|
65
|
+
? fragment.blocks.map((block) => blockOf(block, kinds, false)).join('\n')
|
|
66
|
+
: contentOf(fragment.content, kinds, false);
|
|
63
67
|
export const serializeClipboardFragmentToHtml = (fragment, kinds) => {
|
|
64
68
|
const encoded = encodeClipboardJson(fragment);
|
|
65
69
|
const html = fragment.kind === 'blocks'
|
|
66
|
-
? fragment.blocks.map((block) =>
|
|
67
|
-
: `<p>${
|
|
70
|
+
? fragment.blocks.map((block) => blockOf(block, kinds, true)).join('')
|
|
71
|
+
: `<p>${contentOf(fragment.content, kinds, true)}</p>`;
|
|
68
72
|
return `<meta charset="utf-8"><span ${EDYTOR_FRAGMENT_ATTRIBUTE}="${encoded}" hidden></span>${html}`;
|
|
69
73
|
};
|
|
@@ -52,11 +52,9 @@
|
|
|
52
52
|
* left out of the ack), the rest applied. Compaction reclaims the
|
|
53
53
|
* waiting deletes of client ids no user registered and no socket holds;
|
|
54
54
|
* `dropWaitingDeletes()` every one.
|
|
55
|
-
* - storage format:
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* pending records stay v1. A container without `storage` (0.1.0-next.22)
|
|
59
|
-
* is all v1, and its next compaction rewrites it.
|
|
55
|
+
* - storage format: every record holds an update in the engine's one
|
|
56
|
+
* encoding; a snapshot is compressed in place after it is stored
|
|
57
|
+
* (`#compressLater`) and inflated at start (`inflate`).
|
|
60
58
|
* - a Step2 serves the STORED state: the engine's pending structs (waiting
|
|
61
59
|
* for a dependency, never stored) are not served.
|
|
62
60
|
* - a frame larger than `maxFrameBytes` (32 MiB) goes out as chunks the
|
|
@@ -389,12 +387,6 @@ export type RoomLogEntry = {
|
|
|
389
387
|
edytor: 'fault';
|
|
390
388
|
reason: 'storage' | 'internal';
|
|
391
389
|
detail: string;
|
|
392
|
-
} | {
|
|
393
|
-
edytor: 'convert';
|
|
394
|
-
from: number;
|
|
395
|
-
to: number;
|
|
396
|
-
blocks: number;
|
|
397
|
-
bytes: number;
|
|
398
390
|
} | {
|
|
399
391
|
edytor: 'move';
|
|
400
392
|
moveId: string;
|
|
@@ -411,12 +403,11 @@ export type RoomLogEntry = {
|
|
|
411
403
|
};
|
|
412
404
|
/** `pending`: deletes of items the room does not hold yet (they wait for them). */
|
|
413
405
|
type RowKind = 'generation' | 'update' | 'snapshot' | 'pending';
|
|
414
|
-
/** A stored record, reassembled: its kind, record number
|
|
406
|
+
/** A stored record, reassembled: its kind, record number and bytes. */
|
|
415
407
|
export type StoredRecord = {
|
|
416
408
|
kind: RowKind;
|
|
417
409
|
record: number;
|
|
418
410
|
bytes: Uint8Array<ArrayBuffer>;
|
|
419
|
-
v2: boolean;
|
|
420
411
|
};
|
|
421
412
|
/** A block as `validate` reads it, before or after a frame. */
|
|
422
413
|
export type ValidatedBlock = {
|
|
@@ -626,10 +617,6 @@ export declare class AttachedDocument {
|
|
|
626
617
|
} | {
|
|
627
618
|
kind: 'restored';
|
|
628
619
|
records: number;
|
|
629
|
-
} | {
|
|
630
|
-
kind: 'converted';
|
|
631
|
-
from: number;
|
|
632
|
-
records: number;
|
|
633
620
|
};
|
|
634
621
|
/** The room's parts and what they share (`room/context.ts`). */
|
|
635
622
|
private readonly room;
|
|
@@ -52,11 +52,9 @@
|
|
|
52
52
|
* left out of the ack), the rest applied. Compaction reclaims the
|
|
53
53
|
* waiting deletes of client ids no user registered and no socket holds;
|
|
54
54
|
* `dropWaitingDeletes()` every one.
|
|
55
|
-
* - storage format:
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* pending records stay v1. A container without `storage` (0.1.0-next.22)
|
|
59
|
-
* is all v1, and its next compaction rewrites it.
|
|
55
|
+
* - storage format: every record holds an update in the engine's one
|
|
56
|
+
* encoding; a snapshot is compressed in place after it is stored
|
|
57
|
+
* (`#compressLater`) and inflated at start (`inflate`).
|
|
60
58
|
* - a Step2 serves the STORED state: the engine's pending structs (waiting
|
|
61
59
|
* for a dependency, never stored) are not served.
|
|
62
60
|
* - a frame larger than `maxFrameBytes` (32 MiB) goes out as chunks the
|