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
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
import { iconOf } from '../icons.js';
|
|
4
|
-
import type { ImageAlign } from './image.js';
|
|
5
2
|
import type { ImageControls } from './controls.svelte.js';
|
|
6
3
|
|
|
7
4
|
/**
|
|
8
5
|
* The image chrome (`ImageControls`), in the overlay: a resize handle on
|
|
9
|
-
* each side of the hovered image (Notion's pill, at mid-height)
|
|
10
|
-
* toolbar
|
|
11
|
-
* (a `toolbar` snippet replaces both, placed there). A press on the
|
|
12
|
-
* toolbar keeps the editor's focus; the alt field takes it. The toolbar's
|
|
13
|
-
* role and marks (`bar`) and the alt field's keys and focus (`altField`)
|
|
14
|
-
* are the controller's attachments, a custom `toolbar`'s too.
|
|
6
|
+
* each side of the hovered image (Notion's pill, at mid-height). The
|
|
7
|
+
* toolbar is the image toolbar plugin's.
|
|
15
8
|
*/
|
|
16
|
-
let { controls
|
|
17
|
-
$props();
|
|
9
|
+
let { controls }: { controls: ImageControls } = $props();
|
|
18
10
|
|
|
19
11
|
// The view turning readonly mid-drag drops the preview at once.
|
|
20
12
|
$effect(() => {
|
|
@@ -26,13 +18,6 @@
|
|
|
26
18
|
controls.invalidate();
|
|
27
19
|
});
|
|
28
20
|
|
|
29
|
-
const labels = $derived(controls.labels);
|
|
30
|
-
const aligns: { align: ImageAlign; label: string }[] = $derived([
|
|
31
|
-
{ align: 'left', label: labels.alignLeft },
|
|
32
|
-
{ align: 'center', label: labels.alignCenter },
|
|
33
|
-
{ align: 'right', label: labels.alignRight }
|
|
34
|
-
]);
|
|
35
|
-
const keep = (event: MouseEvent) => event.preventDefault();
|
|
36
21
|
/** The handle's hit box: 16px wide, inside the image's edge. */
|
|
37
22
|
const HANDLE = 16;
|
|
38
23
|
</script>
|
|
@@ -50,70 +35,9 @@
|
|
|
50
35
|
style:height="{box.height}px"
|
|
51
36
|
data-dragging={controls.drag ? 'true' : undefined}
|
|
52
37
|
data-selecting={controls.selecting ? 'true' : undefined}
|
|
53
|
-
|
|
54
|
-
onmousedown={(event) => controls.mousedown(event, side)}
|
|
38
|
+
{@attach controls.band.press((event) => controls.start(event, side))}
|
|
55
39
|
></div>
|
|
56
40
|
{/each}
|
|
57
|
-
{#if !controls.drag && toolbar}
|
|
58
|
-
<div
|
|
59
|
-
data-edytor-image-toolbar-slot
|
|
60
|
-
style:left="{box.x + box.width - 6}px"
|
|
61
|
-
style:top="{box.y + 6}px"
|
|
62
|
-
data-selecting={controls.selecting ? 'true' : undefined}
|
|
63
|
-
>
|
|
64
|
-
{@render toolbar(controls)}
|
|
65
|
-
</div>
|
|
66
|
-
{:else if !controls.drag}
|
|
67
|
-
<div
|
|
68
|
-
data-edytor-image-toolbar
|
|
69
|
-
role="toolbar"
|
|
70
|
-
aria-label={labels.toolbar}
|
|
71
|
-
style:left="{box.x + box.width - 6}px"
|
|
72
|
-
style:top="{box.y + 6}px"
|
|
73
|
-
data-selecting={controls.selecting ? 'true' : undefined}
|
|
74
|
-
{@attach controls.bar}
|
|
75
|
-
>
|
|
76
|
-
{#each aligns as { align, label } (align)}
|
|
77
|
-
<button
|
|
78
|
-
type="button"
|
|
79
|
-
data-edytor-image-align={align}
|
|
80
|
-
aria-label={label}
|
|
81
|
-
title={label}
|
|
82
|
-
aria-pressed={box.align === align}
|
|
83
|
-
onmousedown={keep}
|
|
84
|
-
onclick={() => controls.align(align)}
|
|
85
|
-
><span aria-hidden="true" style:mask-image={iconOf(`image.align-${align}`)}
|
|
86
|
-
></span></button
|
|
87
|
-
>
|
|
88
|
-
{/each}
|
|
89
|
-
<button
|
|
90
|
-
type="button"
|
|
91
|
-
data-edytor-image-alt-toggle
|
|
92
|
-
aria-label={labels.alt}
|
|
93
|
-
title={labels.alt}
|
|
94
|
-
aria-expanded={controls.editing === box.id}
|
|
95
|
-
onmousedown={keep}
|
|
96
|
-
onclick={controls.toggleAlt}
|
|
97
|
-
><span aria-hidden="true" style:mask-image={iconOf('image.alt')}></span></button
|
|
98
|
-
>
|
|
99
|
-
</div>
|
|
100
|
-
{#if controls.editing === box.id}
|
|
101
|
-
<div
|
|
102
|
-
data-edytor-image-alt-panel
|
|
103
|
-
style:left="{box.x + box.width - 6}px"
|
|
104
|
-
style:top="{box.y + 40}px"
|
|
105
|
-
>
|
|
106
|
-
<input
|
|
107
|
-
data-edytor-image-alt
|
|
108
|
-
aria-label={labels.alt}
|
|
109
|
-
placeholder={labels.altPlaceholder}
|
|
110
|
-
value={controls.alt}
|
|
111
|
-
oninput={(event) => controls.setAlt(event.currentTarget.value)}
|
|
112
|
-
{@attach controls.altField}
|
|
113
|
-
/>
|
|
114
|
-
</div>
|
|
115
|
-
{/if}
|
|
116
|
-
{/if}
|
|
117
41
|
{/if}
|
|
118
42
|
</div>
|
|
119
43
|
|
|
@@ -129,7 +53,8 @@
|
|
|
129
53
|
pointer-events: none;
|
|
130
54
|
}
|
|
131
55
|
|
|
132
|
-
/*
|
|
56
|
+
/* The handle's pill: at mid-height, inside the edge. Painted by a theme
|
|
57
|
+
* (`edytor/themes/notion.css`: Notion's dark pill with a light ring). */
|
|
133
58
|
[data-edytor-image-resize]::after {
|
|
134
59
|
content: '';
|
|
135
60
|
position: absolute;
|
|
@@ -138,91 +63,5 @@
|
|
|
138
63
|
width: 6px;
|
|
139
64
|
height: min(48px, 50%);
|
|
140
65
|
transform: translateY(-50%);
|
|
141
|
-
border-radius: 20px;
|
|
142
|
-
background: var(--edytor-image-handle-color, rgba(15, 15, 15, 0.6));
|
|
143
|
-
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.9);
|
|
144
|
-
opacity: 0.8;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
[data-edytor-image-resize]:hover::after,
|
|
148
|
-
[data-edytor-image-resize][data-dragging='true']::after {
|
|
149
|
-
opacity: 1;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/* A custom toolbar's place: the image's top right, sized to its markup. */
|
|
153
|
-
[data-edytor-image-toolbar-slot] {
|
|
154
|
-
position: absolute;
|
|
155
|
-
width: max-content;
|
|
156
|
-
transform: translateX(-100%);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
[data-edytor-image-toolbar] {
|
|
160
|
-
position: absolute;
|
|
161
|
-
display: flex;
|
|
162
|
-
gap: 2px;
|
|
163
|
-
/* The layer has no width: size to the buttons, not to it. */
|
|
164
|
-
width: max-content;
|
|
165
|
-
padding: 2px;
|
|
166
|
-
transform: translateX(-100%);
|
|
167
|
-
border-radius: 6px;
|
|
168
|
-
background: var(--edytor-image-toolbar-background, #fff);
|
|
169
|
-
box-shadow:
|
|
170
|
-
0 0 0 1px rgba(15, 15, 15, 0.05),
|
|
171
|
-
0 3px 6px rgba(15, 15, 15, 0.1);
|
|
172
|
-
font-size: 13px;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
[data-edytor-image-toolbar] button {
|
|
176
|
-
display: inline-flex;
|
|
177
|
-
align-items: center;
|
|
178
|
-
justify-content: center;
|
|
179
|
-
width: 26px;
|
|
180
|
-
height: 26px;
|
|
181
|
-
padding: 0;
|
|
182
|
-
border: 0;
|
|
183
|
-
border-radius: 4px;
|
|
184
|
-
background: transparent;
|
|
185
|
-
color: rgba(55, 53, 47, 0.65);
|
|
186
|
-
cursor: pointer;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
[data-edytor-image-toolbar] button:hover,
|
|
190
|
-
[data-edytor-image-toolbar] button[aria-pressed='true'],
|
|
191
|
-
[data-edytor-image-toolbar] button[aria-expanded='true'] {
|
|
192
|
-
background: rgba(55, 53, 47, 0.08);
|
|
193
|
-
color: rgb(55, 53, 47);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
[data-edytor-image-toolbar] button span {
|
|
197
|
-
width: 18px;
|
|
198
|
-
height: 18px;
|
|
199
|
-
background: currentColor;
|
|
200
|
-
mask-size: contain;
|
|
201
|
-
mask-repeat: no-repeat;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
[data-edytor-image-alt-panel] {
|
|
205
|
-
position: absolute;
|
|
206
|
-
width: 240px;
|
|
207
|
-
padding: 4px;
|
|
208
|
-
transform: translateX(-100%);
|
|
209
|
-
border-radius: 6px;
|
|
210
|
-
background: var(--edytor-image-toolbar-background, #fff);
|
|
211
|
-
box-shadow:
|
|
212
|
-
0 0 0 1px rgba(15, 15, 15, 0.05),
|
|
213
|
-
0 3px 6px rgba(15, 15, 15, 0.1);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
[data-edytor-image-alt] {
|
|
217
|
-
box-sizing: border-box;
|
|
218
|
-
width: 100%;
|
|
219
|
-
height: 28px;
|
|
220
|
-
padding: 0 8px;
|
|
221
|
-
border: 0;
|
|
222
|
-
border-radius: 4px;
|
|
223
|
-
background: rgba(242, 241, 238, 0.6);
|
|
224
|
-
box-shadow: inset 0 0 0 1px rgba(15, 15, 15, 0.1);
|
|
225
|
-
font: inherit;
|
|
226
|
-
outline: 0;
|
|
227
66
|
}
|
|
228
67
|
</style>
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import type { Snippet } from 'svelte';
|
|
2
1
|
import type { ImageControls } from './controls.svelte.js';
|
|
3
2
|
type $$ComponentProps = {
|
|
4
3
|
controls: ImageControls;
|
|
5
|
-
toolbar?: Snippet<[ImageControls]>;
|
|
6
4
|
};
|
|
7
5
|
declare const ImageChrome: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
8
6
|
type ImageChrome = ReturnType<typeof ImageChrome>;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
|
-
import
|
|
2
|
+
import { escapeHtml } from '../../clipboard/serializeClipboardFragment.js';
|
|
3
3
|
import type { Plugin, BlockSnippetPayload } from '../../plugins.js';
|
|
4
|
+
import { branded } from '../brand.js';
|
|
4
5
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
5
|
-
import
|
|
6
|
+
import EmptySlot from '../media/EmptySlot.svelte';
|
|
6
7
|
import ImageChrome from './ImageChrome.svelte';
|
|
7
8
|
import { imageKinds } from '../../crdt/semantics.js';
|
|
8
9
|
import {
|
|
9
10
|
imageAlignOf,
|
|
10
11
|
imageAltOf,
|
|
11
12
|
imageWidthOf,
|
|
12
|
-
imageLabels,
|
|
13
13
|
imgData,
|
|
14
14
|
isImageFile,
|
|
15
15
|
MAX_INLINE_IMAGE_BYTES,
|
|
@@ -19,11 +19,10 @@
|
|
|
19
19
|
storableImageSrc,
|
|
20
20
|
type ImageAlign
|
|
21
21
|
} from './image.js';
|
|
22
|
-
import { ImageControls } from './controls.svelte.js';
|
|
23
|
-
import type
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import { keywordsOf, labelsWith, type PartialLabels } from '../../labels.js';
|
|
22
|
+
import { ImageControls, imageControls } from './controls.svelte.js';
|
|
23
|
+
import { MEDIA_ICONS, type EmptyView } from '../media/empty.svelte.js';
|
|
24
|
+
import { imageEnglish, keywordsOf, labelsOf } from '../../labels.js';
|
|
25
|
+
import { listen } from '../../utils/listen.js';
|
|
27
26
|
|
|
28
27
|
export {
|
|
29
28
|
MAX_INLINE_IMAGE_BYTES,
|
|
@@ -34,58 +33,15 @@
|
|
|
34
33
|
type ImageAlign
|
|
35
34
|
};
|
|
36
35
|
|
|
37
|
-
export type ImagePluginOptions = {
|
|
38
|
-
/**
|
|
39
|
-
* Upload a file and answer its URL. Adds an Upload button to the empty
|
|
40
|
-
* block, and claims pasted and dropped image files: each is placed as an
|
|
41
|
-
* image block at once (one undo step) and filled with the URL this
|
|
42
|
-
* answers (the block shows the progress it reports). Without it only
|
|
43
|
-
* links are embedded.
|
|
44
|
-
*/
|
|
45
|
-
upload?: Uploader;
|
|
46
|
-
/** The words the block, its empty panel and its chrome show, over the English ones. */
|
|
47
|
-
labels?: PartialLabels<'image'>;
|
|
48
|
-
/**
|
|
49
|
-
* The slash menu's keywords of the image command (`block.image`), which
|
|
50
|
-
* replace its own.
|
|
51
|
-
*/
|
|
52
|
-
keywords?: Partial<Record<string, string[]>>;
|
|
53
|
-
/**
|
|
54
|
-
* Replace the toolbar over the hovered image (the alignments and the alt
|
|
55
|
-
* field); it renders while `controls.shown` and no handle drags, at the
|
|
56
|
-
* image's top right (`controls.box`). The resize handles stay the
|
|
57
|
-
* plugin's. Keep its behaviour with `{@attach controls.bar}` on the
|
|
58
|
-
* toolbar and `{@attach controls.altField}` on the alt field.
|
|
59
|
-
*/
|
|
60
|
-
toolbar?: Snippet<[ImageControls]>;
|
|
61
|
-
/**
|
|
62
|
-
* Replace an empty image's markup (Notion's "Add an image" and its link
|
|
63
|
-
* panel, or the placeholder of a readonly view): it receives the
|
|
64
|
-
* block's `ImageEmptyController` (`open`, `draft`, `failed`, `embed`,
|
|
65
|
-
* `upload`, `readonly`).
|
|
66
|
-
*/
|
|
67
|
-
empty?: Snippet<[ImageEmptyController]>;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
36
|
/** The data an image block reads (all optional). */
|
|
71
37
|
export type ImageData = { src?: string; alt?: string; width?: number; align?: ImageAlign };
|
|
72
38
|
|
|
73
|
-
const escape = (value: string) => value.replace(/[&<>"]/g, (c) => `&#${c.charCodeAt(0)};`);
|
|
74
39
|
const px = (width: number | undefined) => (width === undefined ? undefined : `${width}px`);
|
|
75
40
|
|
|
76
|
-
/** One view's image state: its
|
|
77
|
-
type View = {
|
|
78
|
-
upload?: Uploader;
|
|
79
|
-
controls: ImageControls;
|
|
80
|
-
uploads?: FileUploads;
|
|
81
|
-
empty?: Snippet<[ImageEmptyController]>;
|
|
82
|
-
};
|
|
41
|
+
/** One view's image state: its source rule, the chrome. */
|
|
42
|
+
type View = EmptyView & { controls: ImageControls };
|
|
83
43
|
/** By view; the first image plugin of a view owns it, as its kind's definition (first wins). */
|
|
84
44
|
const views = new WeakMap<Edytor, View>();
|
|
85
|
-
const imagePlugins = new WeakSet<Plugin>();
|
|
86
|
-
|
|
87
|
-
/** Recognize any image plugin instance (the component's default yields to yours). */
|
|
88
|
-
export const isImagePlugin = (plugin: Plugin) => imagePlugins.has(plugin);
|
|
89
45
|
|
|
90
46
|
/**
|
|
91
47
|
* Notion's image block: an "Add an image" panel until it has a source (a
|
|
@@ -93,40 +49,27 @@
|
|
|
93
49
|
* an editable caption, its alt text, width and alignment set from the
|
|
94
50
|
* chrome the plugin shows over it. Void: its only text is the caption.
|
|
95
51
|
*/
|
|
96
|
-
export const createImagePlugin = (
|
|
97
|
-
const { upload } = pluginOptions;
|
|
98
|
-
const labels = labelsWith('image', pluginOptions.labels);
|
|
52
|
+
export const createImagePlugin = (): Plugin => {
|
|
99
53
|
const plugin: Plugin = (edytor) => {
|
|
100
|
-
|
|
54
|
+
const labels = labelsOf(edytor, 'image', imageEnglish);
|
|
101
55
|
const own: View = {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
56
|
+
controls: new ImageControls(edytor),
|
|
57
|
+
// An accepted source; an inline image over the cap is never stored.
|
|
58
|
+
store: (block, value) => {
|
|
59
|
+
const src = safeImageSrc(value);
|
|
60
|
+
if (!src) return 'invalid';
|
|
61
|
+
if (oversizedInlineImage(src)) return 'inline';
|
|
62
|
+
block.edytor.patchData(block.id, [{ path: ['src'], value: src }]);
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
106
65
|
};
|
|
107
66
|
// The records read with no view (`plugin(undefined)`) keep no state.
|
|
108
67
|
if (edytor && !views.has(edytor)) {
|
|
109
68
|
views.set(edytor, own);
|
|
110
|
-
|
|
111
|
-
own.uploads?.register({
|
|
112
|
-
type: 'image',
|
|
113
|
-
accepts: isImageFile,
|
|
114
|
-
upload,
|
|
115
|
-
data: (_file, answer) => {
|
|
116
|
-
const src = storableImageSrc(answer);
|
|
117
|
-
return src ? { src } : null;
|
|
118
|
-
},
|
|
119
|
-
filled: (data) => safeImageSrc(data.src) !== null,
|
|
120
|
-
preview: true
|
|
121
|
-
});
|
|
69
|
+
imageControls.set(edytor, own.controls);
|
|
122
70
|
}
|
|
123
71
|
const owns = () => views.get(edytor) === own;
|
|
124
72
|
return {
|
|
125
|
-
// Pasted or dropped files (a drop replays the paste hooks): the
|
|
126
|
-
// view's uploads place a block per file of every kind that uploads.
|
|
127
|
-
onPaste: (payload) => {
|
|
128
|
-
if (owns()) own.uploads?.paste(payload);
|
|
129
|
-
},
|
|
130
73
|
// The chrome: in the overlay, for the image under the pointer.
|
|
131
74
|
onEdytorAttached: ({ node }) => {
|
|
132
75
|
if (!owns()) return;
|
|
@@ -135,26 +78,22 @@
|
|
|
135
78
|
const leave = (event: PointerEvent) =>
|
|
136
79
|
!controls.drag && controls.leave(event.relatedTarget);
|
|
137
80
|
const layer = edytor.overlay.layer;
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
node.addEventListener('pointerleave', leave);
|
|
142
|
-
layer?.addEventListener('pointerleave', leave);
|
|
81
|
+
const off = listen(node, 'pointerover', over);
|
|
82
|
+
const off2 = listen(node, 'pointerleave', leave);
|
|
83
|
+
const off3 = listen(layer, 'pointerleave', leave);
|
|
143
84
|
const unmount = edytor.overlay.mount(
|
|
144
85
|
ImageChrome,
|
|
145
|
-
{ controls
|
|
86
|
+
{ controls },
|
|
146
87
|
'edytor-image-chrome',
|
|
147
88
|
// Above the block handles (5) and the column bands (6): it sits on the image.
|
|
148
89
|
7,
|
|
149
90
|
controls.measure
|
|
150
91
|
);
|
|
151
92
|
return () => {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
offPress();
|
|
93
|
+
off();
|
|
94
|
+
off2();
|
|
95
|
+
off3();
|
|
156
96
|
unmount();
|
|
157
|
-
own.uploads?.destroy();
|
|
158
97
|
};
|
|
159
98
|
},
|
|
160
99
|
blocks: {
|
|
@@ -162,15 +101,21 @@
|
|
|
162
101
|
...imageKinds.image,
|
|
163
102
|
snippet: image,
|
|
164
103
|
element: 'figure',
|
|
104
|
+
// Image files: with the uploads plugin, an Upload and pasted or dropped files.
|
|
105
|
+
upload: {
|
|
106
|
+
accepts: isImageFile,
|
|
107
|
+
data: (_file, answer) => {
|
|
108
|
+
const src = storableImageSrc(answer);
|
|
109
|
+
return src ? { src } : null;
|
|
110
|
+
},
|
|
111
|
+
filled: (data) => safeImageSrc(data.src) !== null,
|
|
112
|
+
preview: true
|
|
113
|
+
},
|
|
165
114
|
presets: [
|
|
166
115
|
{
|
|
167
116
|
label: labels.image,
|
|
168
|
-
icon:
|
|
169
|
-
keywords: keywordsOf(
|
|
170
|
-
'block.image',
|
|
171
|
-
['picture', 'photo', 'img'],
|
|
172
|
-
pluginOptions.keywords
|
|
173
|
-
),
|
|
117
|
+
icon: MEDIA_ICONS.image,
|
|
118
|
+
keywords: keywordsOf(edytor, 'block.image', ['picture', 'photo', 'img']),
|
|
174
119
|
group: 'Media'
|
|
175
120
|
}
|
|
176
121
|
],
|
|
@@ -179,7 +124,7 @@
|
|
|
179
124
|
const width = imageWidthOf(block.data);
|
|
180
125
|
const align = imageAlignOf(block.data);
|
|
181
126
|
const img = src
|
|
182
|
-
? `<img src="${
|
|
127
|
+
? `<img src="${escapeHtml(src)}" alt="${escapeHtml(imageAltOf(block.data))}"${width ? ` width="${Math.round(width)}"` : ''}>`
|
|
183
128
|
: '';
|
|
184
129
|
const at = align === 'center' ? '' : ` data-align="${align}"`;
|
|
185
130
|
return `<figure${at}>${img}<figcaption>${caption}</figcaption></figure>`;
|
|
@@ -198,12 +143,8 @@
|
|
|
198
143
|
};
|
|
199
144
|
};
|
|
200
145
|
|
|
201
|
-
|
|
202
|
-
return plugin;
|
|
146
|
+
return branded('image', plugin);
|
|
203
147
|
};
|
|
204
|
-
|
|
205
|
-
/** The image block, links only. */
|
|
206
|
-
export const imagePlugin = createImagePlugin();
|
|
207
148
|
</script>
|
|
208
149
|
|
|
209
150
|
<!-- No whitespace before the caption (one node per block less to walk). -->
|
|
@@ -212,7 +153,6 @@
|
|
|
212
153
|
<!-- A suggestion's preview (no handle) reads only its data. -->
|
|
213
154
|
{@const view = block.handle ? views.get(block.handle.edytor) : undefined}
|
|
214
155
|
{@const src = safeImageSrc(block.data.src)}
|
|
215
|
-
{@const upload = src ? undefined : view?.uploads?.of(block.id)}
|
|
216
156
|
{#if src}
|
|
217
157
|
<div use:block.void data-edytor-image data-align={imageAlignOf(block.data)}>
|
|
218
158
|
<img
|
|
@@ -224,23 +164,12 @@
|
|
|
224
164
|
)}
|
|
225
165
|
/>
|
|
226
166
|
</div>
|
|
227
|
-
{:else if upload?.status === 'uploading'}
|
|
228
|
-
<div use:block.void data-edytor-image data-edytor-image-uploading data-align="center">
|
|
229
|
-
{#if upload.preview}<img src={upload.preview} alt="" draggable="false" />{/if}
|
|
230
|
-
<span data-edytor-image-progress role="status">
|
|
231
|
-
<progress value={upload.progress ?? undefined} max="1"></progress>
|
|
232
|
-
{imageLabels.of(block.handle?.edytor).uploading}
|
|
233
|
-
</span>
|
|
234
|
-
</div>
|
|
235
167
|
{:else}
|
|
236
168
|
<div use:block.void data-edytor-image-empty>
|
|
237
|
-
<
|
|
169
|
+
<EmptySlot
|
|
238
170
|
block={block.handle}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
error={upload?.status === 'failed' ? 'upload' : null}
|
|
242
|
-
landed={upload?.status === 'landed'}
|
|
243
|
-
empty={view?.empty}
|
|
171
|
+
kind="image"
|
|
172
|
+
viewOf={(edytor) => (edytor ? views.get(edytor) : undefined)}
|
|
244
173
|
/>
|
|
245
174
|
</div>
|
|
246
175
|
{/if}<!--
|
|
@@ -264,22 +193,4 @@
|
|
|
264
193
|
[data-edytor-image] img {
|
|
265
194
|
max-width: 100%;
|
|
266
195
|
}
|
|
267
|
-
[data-edytor-image-uploading] {
|
|
268
|
-
min-height: 48px;
|
|
269
|
-
border-radius: 4px;
|
|
270
|
-
background: rgba(55, 53, 47, 0.04);
|
|
271
|
-
}
|
|
272
|
-
[data-edytor-image-uploading] img {
|
|
273
|
-
opacity: 0.5;
|
|
274
|
-
}
|
|
275
|
-
[data-edytor-image-progress] {
|
|
276
|
-
position: absolute;
|
|
277
|
-
top: 8px;
|
|
278
|
-
right: 8px;
|
|
279
|
-
padding: 2px 8px;
|
|
280
|
-
border-radius: 4px;
|
|
281
|
-
background: rgba(15, 15, 15, 0.6);
|
|
282
|
-
color: #fff;
|
|
283
|
-
font-size: 12px;
|
|
284
|
-
}
|
|
285
196
|
</style>
|
|
@@ -1,43 +1,6 @@
|
|
|
1
|
-
import type { Snippet } from 'svelte';
|
|
2
1
|
import type { Plugin } from '../../plugins.js';
|
|
3
2
|
import { MAX_INLINE_IMAGE_BYTES, MIN_IMAGE_WIDTH, oversizedInlineImage, safeImageSrc, storableImageSrc, type ImageAlign } from './image.js';
|
|
4
|
-
import { ImageControls } from './controls.svelte.js';
|
|
5
|
-
import type { ImageEmptyController } from './empty.svelte.js';
|
|
6
|
-
import { type Uploader } from '../uploads.svelte.js';
|
|
7
|
-
import { type PartialLabels } from '../../labels.js';
|
|
8
3
|
export { MAX_INLINE_IMAGE_BYTES, MIN_IMAGE_WIDTH, oversizedInlineImage, safeImageSrc, storableImageSrc, type ImageAlign };
|
|
9
|
-
export type ImagePluginOptions = {
|
|
10
|
-
/**
|
|
11
|
-
* Upload a file and answer its URL. Adds an Upload button to the empty
|
|
12
|
-
* block, and claims pasted and dropped image files: each is placed as an
|
|
13
|
-
* image block at once (one undo step) and filled with the URL this
|
|
14
|
-
* answers (the block shows the progress it reports). Without it only
|
|
15
|
-
* links are embedded.
|
|
16
|
-
*/
|
|
17
|
-
upload?: Uploader;
|
|
18
|
-
/** The words the block, its empty panel and its chrome show, over the English ones. */
|
|
19
|
-
labels?: PartialLabels<'image'>;
|
|
20
|
-
/**
|
|
21
|
-
* The slash menu's keywords of the image command (`block.image`), which
|
|
22
|
-
* replace its own.
|
|
23
|
-
*/
|
|
24
|
-
keywords?: Partial<Record<string, string[]>>;
|
|
25
|
-
/**
|
|
26
|
-
* Replace the toolbar over the hovered image (the alignments and the alt
|
|
27
|
-
* field); it renders while `controls.shown` and no handle drags, at the
|
|
28
|
-
* image's top right (`controls.box`). The resize handles stay the
|
|
29
|
-
* plugin's. Keep its behaviour with `{@attach controls.bar}` on the
|
|
30
|
-
* toolbar and `{@attach controls.altField}` on the alt field.
|
|
31
|
-
*/
|
|
32
|
-
toolbar?: Snippet<[ImageControls]>;
|
|
33
|
-
/**
|
|
34
|
-
* Replace an empty image's markup (Notion's "Add an image" and its link
|
|
35
|
-
* panel, or the placeholder of a readonly view): it receives the
|
|
36
|
-
* block's `ImageEmptyController` (`open`, `draft`, `failed`, `embed`,
|
|
37
|
-
* `upload`, `readonly`).
|
|
38
|
-
*/
|
|
39
|
-
empty?: Snippet<[ImageEmptyController]>;
|
|
40
|
-
};
|
|
41
4
|
/** The data an image block reads (all optional). */
|
|
42
5
|
export type ImageData = {
|
|
43
6
|
src?: string;
|
|
@@ -45,17 +8,13 @@ export type ImageData = {
|
|
|
45
8
|
width?: number;
|
|
46
9
|
align?: ImageAlign;
|
|
47
10
|
};
|
|
48
|
-
/** Recognize any image plugin instance (the component's default yields to yours). */
|
|
49
|
-
export declare const isImagePlugin: (plugin: Plugin) => boolean;
|
|
50
11
|
/**
|
|
51
12
|
* Notion's image block: an "Add an image" panel until it has a source (a
|
|
52
13
|
* pasted link, or an upload when `upload` is given), then the image with
|
|
53
14
|
* an editable caption, its alt text, width and alignment set from the
|
|
54
15
|
* chrome the plugin shows over it. Void: its only text is the caption.
|
|
55
16
|
*/
|
|
56
|
-
export declare const createImagePlugin: (
|
|
57
|
-
/** The image block, links only. */
|
|
58
|
-
export declare const imagePlugin: Plugin;
|
|
17
|
+
export declare const createImagePlugin: () => Plugin;
|
|
59
18
|
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
60
19
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
61
20
|
$$bindings?: Bindings;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { ImageToolbar } from './toolbar.svelte.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The image toolbar's place: the app's `toolbar` at the top right of the
|
|
7
|
+
* image the chrome is on, while it shows and no handle drags.
|
|
8
|
+
*/
|
|
9
|
+
let { toolbar, snippet }: { toolbar: ImageToolbar; snippet: Snippet<[ImageToolbar]> } = $props();
|
|
10
|
+
const controls = $derived(toolbar.controls);
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
{#if controls.shown && controls.box && !controls.drag}
|
|
14
|
+
{@const box = controls.box}
|
|
15
|
+
<div
|
|
16
|
+
data-edytor-image-toolbar-slot
|
|
17
|
+
style:left="{box.x + box.width - 6}px"
|
|
18
|
+
style:top="{box.y + 6}px"
|
|
19
|
+
data-selecting={controls.selecting ? 'true' : undefined}
|
|
20
|
+
>
|
|
21
|
+
{@render snippet(toolbar)}
|
|
22
|
+
</div>
|
|
23
|
+
{/if}
|
|
24
|
+
|
|
25
|
+
<style>
|
|
26
|
+
/* The toolbar's place: the image's top right, sized to its markup. */
|
|
27
|
+
[data-edytor-image-toolbar-slot] {
|
|
28
|
+
position: absolute;
|
|
29
|
+
width: max-content;
|
|
30
|
+
transform: translateX(-100%);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* A text selection in progress: the chrome takes no pointer. */
|
|
34
|
+
[data-selecting='true'] {
|
|
35
|
+
pointer-events: none;
|
|
36
|
+
}
|
|
37
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { ImageToolbar } from './toolbar.svelte.js';
|
|
3
|
+
type $$ComponentProps = {
|
|
4
|
+
toolbar: ImageToolbar;
|
|
5
|
+
snippet: Snippet<[ImageToolbar]>;
|
|
6
|
+
};
|
|
7
|
+
declare const ImageToolbarHost: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
8
|
+
type ImageToolbarHost = ReturnType<typeof ImageToolbarHost>;
|
|
9
|
+
export default ImageToolbarHost;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import type { Attachment } from 'svelte/attachments';
|
|
2
1
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
3
|
-
import { type ImageLabels } from '../../labels.js';
|
|
4
2
|
import { type ImageAlign } from './image.js';
|
|
5
3
|
/** The hovered image, layer-relative: the `img` box, and its frame's width (the most it may take). */
|
|
6
4
|
export type ImageBox = {
|
|
@@ -39,20 +37,15 @@ type Drag = {
|
|
|
39
37
|
*/
|
|
40
38
|
export declare class ImageControls {
|
|
41
39
|
#private;
|
|
42
|
-
private edytor;
|
|
43
|
-
/** The words the chrome shows (the plugin's `labels`). */
|
|
44
|
-
readonly labels: ImageLabels;
|
|
45
40
|
/** The image block under the pointer. */
|
|
46
41
|
hovered: string | null;
|
|
47
|
-
/** The image whose alt field is open: the chrome stays on it. */
|
|
48
|
-
editing: string | null;
|
|
49
42
|
/** The measured box of the image the chrome is on. */
|
|
50
43
|
box: ImageBox | null;
|
|
44
|
+
constructor(
|
|
45
|
+
/** @internal */
|
|
46
|
+
edytor: Edytor);
|
|
51
47
|
/** The handle being dragged. */
|
|
52
|
-
drag: Drag | null;
|
|
53
|
-
constructor(edytor: Edytor,
|
|
54
|
-
/** The words the chrome shows (the plugin's `labels`). */
|
|
55
|
-
labels?: ImageLabels);
|
|
48
|
+
get drag(): Drag | null;
|
|
56
49
|
/** The view is readonly (reactive). */
|
|
57
50
|
get readonly(): boolean;
|
|
58
51
|
/** A text selection is in progress: the chrome takes no pointer. */
|
|
@@ -66,30 +59,7 @@ export declare class ImageControls {
|
|
|
66
59
|
get target(): string | null;
|
|
67
60
|
/** Whether the chrome shows: over an image of an editable view, or while a handle drags. */
|
|
68
61
|
get shown(): boolean;
|
|
69
|
-
/** Set the target image's alignment: one `patchData` command. */
|
|
70
|
-
align: (align: ImageAlign) => void;
|
|
71
|
-
/** The target image's alt text. */
|
|
72
|
-
get alt(): string;
|
|
73
|
-
/** Write the alt text as it is typed: the dispatcher groups the keystrokes into one step. */
|
|
74
|
-
setAlt: (alt: string) => void;
|
|
75
|
-
/** Open (or close) the alt field of the target image. */
|
|
76
|
-
toggleAlt: () => void;
|
|
77
|
-
/**
|
|
78
|
-
* The image's toolbar (`{@attach controls.bar}`): its `toolbar` role and
|
|
79
|
-
* name unless it has its own, the mark a press outside the alt field
|
|
80
|
-
* reads (a press on the toolbar keeps the field open, so its Alt button
|
|
81
|
-
* toggles it), and presses that keep the editor's focus.
|
|
82
|
-
*/
|
|
83
|
-
bar: Attachment<HTMLElement>;
|
|
84
|
-
/**
|
|
85
|
-
* The alt text field (`{@attach controls.altField}`): focused when it
|
|
86
|
-
* opens; Enter or Escape closes it and gives the editor its keys back,
|
|
87
|
-
* focus moving out of it (or of the element marked
|
|
88
|
-
* `data-edytor-image-alt-panel` around it) closes it, and a press on it
|
|
89
|
-
* keeps it open. Write its value with `setAlt`.
|
|
90
|
-
*/
|
|
91
|
-
altField: Attachment<HTMLInputElement>;
|
|
92
|
-
/** Close the alt field; with `keys`, the editor takes the keys back. */
|
|
93
|
-
closeAlt: (keys?: boolean) => void;
|
|
94
62
|
}
|
|
63
|
+
/** Each view's image chrome (the first image plugin listed claims it). */
|
|
64
|
+
export declare const imageControls: WeakMap<object, ImageControls>;
|
|
95
65
|
export {};
|