edytor 1.0.0-rc.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +47 -141
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.d.ts +6 -1
- package/dist/clipboard/htmlFlow.js +26 -13
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +22 -17
- package/dist/cloudflare/DocumentRoom.js +10 -5
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +20 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +9 -30
- package/dist/cloudflare/room/storage.js +52 -104
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +160 -119
- package/dist/components/Block.svelte.d.ts +8 -3
- package/dist/components/Content.svelte +91 -44
- package/dist/components/CustomMark.svelte +46 -0
- package/dist/components/CustomMark.svelte.d.ts +11 -0
- package/dist/components/Edytor.svelte +80 -95
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/InlineBlock.svelte +4 -9
- package/dist/components/Mark.svelte +46 -35
- package/dist/components/Mark.svelte.d.ts +7 -0
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +48 -14
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +8 -13
- package/dist/crdt/data.js +30 -70
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/{plugins/blockHandles → dnd}/autoScroll.d.ts +2 -1
- package/dist/{plugins/blockHandles → dnd}/autoScroll.js +3 -3
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +34 -64
- package/dist/edytor.svelte.js +118 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -184
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +33 -72
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +92 -72
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -13
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +91 -314
- package/dist/labels.js +180 -396
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -151
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +63 -97
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +247 -268
- package/dist/plugins/blockHandles/BlockHandles.svelte +46 -29
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +29 -23
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -162
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +20 -17
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +46 -1
- package/dist/plugins/blockHandles/geometry.js +51 -4
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +59 -28
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +180 -105
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +79 -0
- package/dist/plugins/chrome.js +87 -0
- package/dist/plugins/code/CodeHeader.svelte +12 -58
- package/dist/plugins/code/CodeHeader.svelte.d.ts +1 -0
- package/dist/plugins/code/CodePlugin.svelte +75 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +25 -0
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +9 -0
- package/dist/plugins/code/code.css +5 -100
- package/dist/plugins/code/header.svelte.d.ts +47 -0
- package/dist/plugins/code/header.svelte.js +141 -0
- package/dist/plugins/code/languageMenu.svelte.d.ts +84 -0
- package/dist/plugins/code/languageMenu.svelte.js +199 -0
- package/dist/plugins/code/languages.d.ts +21 -10
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -430
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +6 -7
- package/dist/plugins/comments/commentsPlugin.d.ts +31 -10
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +18 -129
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +2 -1
- package/dist/plugins/equation/EquationPlugin.svelte +123 -168
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +5 -3
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +74 -36
- package/dist/plugins/equation/equation.svelte.js +74 -66
- package/dist/plugins/equation/importUrl.d.ts +6 -0
- package/dist/plugins/equation/importUrl.js +6 -0
- package/dist/plugins/equation/katex.d.ts +8 -0
- package/dist/plugins/equation/katex.js +77 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +5 -151
- package/dist/plugins/image/ImagePlugin.svelte +49 -117
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -24
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -57
- package/dist/plugins/image/controls.svelte.js +51 -174
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +39 -24
- package/dist/plugins/index.js +30 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +15 -0
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +9 -0
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +46 -0
- package/dist/plugins/marquee/MarqueeController.svelte.js +243 -0
- package/dist/plugins/marquee/marquee.d.ts +33 -0
- package/dist/plugins/marquee/marquee.js +89 -0
- package/dist/plugins/marquee/marqueePlugin.d.ts +32 -0
- package/dist/plugins/marquee/marqueePlugin.js +68 -0
- package/dist/plugins/media/AudioPlugin.svelte +3 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +124 -112
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +20 -7
- package/dist/plugins/media/EmbedPlugin.svelte +93 -77
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +21 -9
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +35 -111
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +55 -112
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +69 -0
- package/dist/plugins/media/empty.svelte.js +111 -0
- package/dist/plugins/media/media.d.ts +93 -30
- package/dist/plugins/media/media.js +79 -86
- package/dist/plugins/media/urlPaste.svelte.d.ts +9 -32
- package/dist/plugins/media/urlPaste.svelte.js +46 -75
- package/dist/plugins/mention/MentionPlugin.svelte +47 -124
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +11 -23
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +52 -108
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +11 -23
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +25 -0
- package/dist/plugins/richtext/CalloutIcon.svelte.d.ts +9 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +25 -0
- package/dist/plugins/richtext/EmptyBody.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +272 -148
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +37 -18
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.d.ts +9 -0
- package/dist/plugins/richtext/body.js +16 -0
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +97 -0
- package/dist/plugins/richtext/calloutIcons.svelte.js +214 -0
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +18 -11
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +93 -35
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +11 -24
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +32 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -16
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +96 -127
- package/dist/plugins/table/TableChrome.svelte.d.ts +5 -1
- package/dist/plugins/table/TablePlugin.svelte +116 -171
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +110 -117
- package/dist/plugins/table/chrome.svelte.js +643 -289
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +55 -134
- package/dist/plugins/table/table.d.ts +26 -7
- package/dist/plugins/table/table.js +23 -49
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +29 -66
- package/dist/plugins/toolbar/ToolbarController.svelte.js +151 -76
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +14 -13
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +6 -45
- package/dist/plugins/triggers/TriggerController.svelte.js +51 -96
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +167 -60
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +12 -10
- package/dist/selection/pointer.svelte.js +154 -71
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +263 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +11 -8
- package/dist/selection/visibility.js +23 -8
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +33 -39
- package/dist/session/attempt.js +61 -53
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +18 -3
- package/dist/session/navigation.js +194 -153
- package/dist/session/ports.d.ts +7 -0
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +8 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +64 -47
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +32 -0
- package/dist/surface/lines.js +43 -0
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +73 -77
- package/dist/surface/overlay.d.ts +48 -6
- package/dist/surface/overlay.js +133 -23
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +315 -126
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -525
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -43
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -447
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -116
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -12
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -83
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -7
- package/dist/plugins/richtext/labels.d.ts +0 -5
- package/dist/plugins/richtext/labels.js +0 -3
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -360
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/toolbar/LinkCard.svelte +0 -118
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -7
- package/dist/plugins/toolbar/Toolbar.svelte +0 -400
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -144
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
|
@@ -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 {
|
|
@@ -7,7 +7,12 @@ export type ImportKinds = Pick<Edytor, 'blocks' | 'marks'> & Partial<Pick<Edytor
|
|
|
7
7
|
document: Pick<Edytor['document'], 'defaultChild'>;
|
|
8
8
|
};
|
|
9
9
|
type Values = Record<string, SerializableContent>;
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* The tag a kind writes for `data`: its export form's first tag, else its
|
|
12
|
+
* element's, else its content element's. A generic one (`div`, `span`) is
|
|
13
|
+
* none: an export form written as one (a callout's `<div data-edytor-callout>`)
|
|
14
|
+
* is found by its `parse` hook only.
|
|
15
|
+
*/
|
|
11
16
|
export declare const tagOf: (type: string, kind: BlockDefinition, data: Values) => string | undefined;
|
|
12
17
|
/**
|
|
13
18
|
* External HTML as a flow: the browser parses (inert: no script
|
|
@@ -33,14 +33,21 @@ const isGlyph = (node) => {
|
|
|
33
33
|
};
|
|
34
34
|
/** Tags that carry no meaning of their own: a kind rendering one is not found by it. */
|
|
35
35
|
const GENERIC = /^(div|span)$/;
|
|
36
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* The tag a kind writes for `data`: its export form's first tag, else its
|
|
38
|
+
* element's, else its content element's. A generic one (`div`, `span`) is
|
|
39
|
+
* none: an export form written as one (a callout's `<div data-edytor-callout>`)
|
|
40
|
+
* is found by its `parse` hook only.
|
|
41
|
+
*/
|
|
37
42
|
export const tagOf = (type, kind, data) => {
|
|
38
43
|
const { html, element, contentElement } = kind;
|
|
39
44
|
if (typeof html === 'string')
|
|
40
45
|
return html;
|
|
41
46
|
try {
|
|
42
|
-
if (html)
|
|
43
|
-
|
|
47
|
+
if (html) {
|
|
48
|
+
const tag = /^<([a-z][\w-]*)/i.exec(html({ type, data }, '', ''))?.[1]?.toLowerCase();
|
|
49
|
+
return tag && !GENERIC.test(tag) ? tag : undefined;
|
|
50
|
+
}
|
|
44
51
|
}
|
|
45
52
|
catch {
|
|
46
53
|
return undefined;
|
|
@@ -79,12 +86,12 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
79
86
|
for (const { data = {} } of kind.presets) {
|
|
80
87
|
const tag = tagOf(type, kind, data);
|
|
81
88
|
if (tag && !byTag.has(tag))
|
|
82
|
-
byTag.set(tag, { type, data });
|
|
89
|
+
byTag.set(tag, { type, kind, data });
|
|
83
90
|
}
|
|
84
91
|
const child = kind.rendersContent === false ? kind.defaultChild : undefined;
|
|
85
92
|
const tag = child && blocks.has(child) ? tagOf(child, blocks.get(child), {}) : undefined;
|
|
86
93
|
if (tag && !byTag.has(tag))
|
|
87
|
-
byTag.set(tag, { type, data: kind.presets[0].data ?? {}, lines: child });
|
|
94
|
+
byTag.set(tag, { type, kind, data: kind.presets[0].data ?? {}, lines: child });
|
|
88
95
|
}
|
|
89
96
|
const kindOf = (element) => {
|
|
90
97
|
// A glyph is text: no kind claims it.
|
|
@@ -93,7 +100,7 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
93
100
|
for (const [type, kind] of blocks) {
|
|
94
101
|
const data = kind.parse?.(element);
|
|
95
102
|
if (data)
|
|
96
|
-
return { type, data };
|
|
103
|
+
return { type, kind, data };
|
|
97
104
|
}
|
|
98
105
|
return byTag.get(element.localName);
|
|
99
106
|
};
|
|
@@ -122,7 +129,7 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
122
129
|
/** A void kind's element (an image): it shows no text, so a line it is met in ends there. */
|
|
123
130
|
const isVoid = (node) => {
|
|
124
131
|
const claim = node instanceof Element ? kindOf(node) : undefined;
|
|
125
|
-
return claim
|
|
132
|
+
return claim?.kind.void === true;
|
|
126
133
|
};
|
|
127
134
|
const text = (line, value, marks, pre) => {
|
|
128
135
|
const before = line.content.at(-1);
|
|
@@ -207,7 +214,7 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
207
214
|
}
|
|
208
215
|
// A void's only text is its caption: an `iframe`'s fallback, a `video`'s source list or
|
|
209
216
|
// a bookmark's link text is never content.
|
|
210
|
-
if (claim
|
|
217
|
+
if (claim?.kind.void) {
|
|
211
218
|
const line = { type: claim.type, data: claim.data, content: [] };
|
|
212
219
|
const caption = [...element.children].find((child) => child.localName === 'figcaption');
|
|
213
220
|
// A caption is one line: an element that would end it (an image) adds nothing.
|
|
@@ -218,7 +225,7 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
218
225
|
}
|
|
219
226
|
// A kind that shows no text of its own (a list, a layout, a column) takes none: its
|
|
220
227
|
// inline runs and a leading paragraph are lines of its default child, never hidden text.
|
|
221
|
-
if (claim
|
|
228
|
+
if (claim?.kind.rendersContent === false) {
|
|
222
229
|
const children = linesOf(element, kinds.document.defaultChild(claim.type));
|
|
223
230
|
return [
|
|
224
231
|
{ type: claim.type, data: claim.data, content: [], ...(children.length && { children }) }
|
|
@@ -243,7 +250,7 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
243
250
|
line: () => current,
|
|
244
251
|
apart: (inner) => {
|
|
245
252
|
// A void's own media (a figure's `img`) is part of it.
|
|
246
|
-
if (claim
|
|
253
|
+
if (claim?.kind.void)
|
|
247
254
|
return;
|
|
248
255
|
parts.push(...blockOf(inner, type));
|
|
249
256
|
current = { type: line.type, data: line.data, content: [] };
|
|
@@ -251,18 +258,24 @@ export const flowOfHtml = (kinds, html) => {
|
|
|
251
258
|
texts.add(current);
|
|
252
259
|
}
|
|
253
260
|
};
|
|
261
|
+
/** Whether a leading paragraph gave the element its text: one only, empty or not. */
|
|
262
|
+
let led = false;
|
|
254
263
|
for (const node of element.childNodes)
|
|
255
264
|
if (isVoid(node))
|
|
256
265
|
at.apart(node);
|
|
257
266
|
else if (!isBlock(node))
|
|
258
267
|
inline(node, at, {}, pre);
|
|
259
|
-
// A leading plain paragraph is the element's own text (`<li><p>Item</p></li
|
|
260
|
-
|
|
268
|
+
// A leading plain paragraph is the element's own text (`<li><p>Item</p></li>`,
|
|
269
|
+
// a callout's title): an empty one too, so the paragraph after it is a child.
|
|
270
|
+
else if (!led &&
|
|
271
|
+
!current.content.length &&
|
|
261
272
|
!current.children?.length &&
|
|
262
273
|
!kindOf(node) &&
|
|
263
|
-
!wraps(node))
|
|
274
|
+
!wraps(node)) {
|
|
275
|
+
led = true;
|
|
264
276
|
for (const child of node.childNodes)
|
|
265
277
|
inline(child, at, {}, pre);
|
|
278
|
+
}
|
|
266
279
|
else
|
|
267
280
|
(current.children ??= []).push(...blockOf(node, childType));
|
|
268
281
|
for (const part of texts)
|
|
@@ -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
|
};
|