edytor 1.0.0-rc.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -39
- package/dist/block/block.svelte.d.ts +11 -84
- package/dist/block/block.svelte.js +30 -134
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +11 -9
- package/dist/block/inlineBlock.svelte.js +18 -21
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.js +7 -7
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +4 -17
- package/dist/cloudflare/DocumentRoom.js +3 -5
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +25 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +3 -32
- package/dist/cloudflare/room/storage.js +33 -108
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/awarenessSelection.d.ts +22 -1
- package/dist/collaboration/awarenessSelection.js +42 -0
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +42 -56
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +82 -99
- package/dist/components/Edytor.svelte.d.ts +16 -13
- package/dist/components/InlineBlock.svelte +1 -1
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +2 -5
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +18 -13
- package/dist/crdt/data.js +49 -71
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +8 -5
- package/dist/crdt/doc/reads.js +49 -50
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +32 -115
- package/dist/crdt/document.js +216 -302
- package/dist/crdt/edytor-doc.d.ts +689 -90
- package/dist/crdt/edytor-doc.js +74 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +32 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +8 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/props.d.ts +32 -0
- package/dist/crdt/props.js +172 -0
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/dnd/autoScroll.js +1 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.d.ts +2 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.js +52 -60
- package/dist/{plugins/blockHandles → dnd}/geometry.d.ts +4 -3
- package/dist/{plugins/blockHandles → dnd}/geometry.js +6 -6
- package/dist/dnd/placement.d.ts +200 -0
- package/dist/dnd/placement.js +426 -0
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +46 -63
- package/dist/edytor.svelte.js +126 -181
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -181
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +64 -78
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +45 -67
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +14 -1
- package/dist/events/onPaste.js +51 -76
- package/dist/index.d.ts +11 -15
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +83 -320
- package/dist/labels.js +181 -408
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -154
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +21 -196
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +158 -573
- package/dist/plugins/blockHandles/BlockHandles.svelte +15 -23
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +45 -38
- package/dist/plugins/chrome.js +59 -36
- package/dist/plugins/code/CodeHeader.svelte +8 -38
- package/dist/plugins/code/CodePlugin.svelte +53 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +16 -125
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
- package/dist/plugins/code/code.css +5 -117
- package/dist/plugins/code/header.svelte.d.ts +2 -11
- package/dist/plugins/code/header.svelte.js +11 -38
- package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
- package/dist/plugins/code/languageMenu.svelte.js +30 -160
- package/dist/plugins/code/languages.d.ts +9 -22
- package/dist/plugins/code/languages.js +39 -128
- package/dist/plugins/columns/ColumnResize.svelte +16 -27
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/gaps.d.ts +7 -5
- package/dist/plugins/columns/gaps.js +11 -6
- package/dist/plugins/columns/resize.svelte.d.ts +17 -54
- package/dist/plugins/columns/resize.svelte.js +80 -173
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -431
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
- package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +16 -130
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
- package/dist/plugins/equation/EquationPlugin.svelte +109 -172
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +3 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.css +7 -0
- package/dist/plugins/equation/equation.svelte.d.ts +37 -24
- package/dist/plugins/equation/equation.svelte.js +20 -94
- package/dist/plugins/equation/katex.js +6 -9
- package/dist/plugins/fileDrop.d.ts +28 -0
- package/dist/plugins/fileDrop.js +116 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +6 -167
- package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
- package/dist/plugins/image/ImagePlugin.svelte +71 -151
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +12 -41
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -36
- package/dist/plugins/image/controls.svelte.js +43 -212
- package/dist/plugins/image/image.css +17 -0
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +30 -26
- package/dist/plugins/index.js +28 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +10 -9
- package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
- package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
- package/dist/plugins/marquee/marquee.js +4 -21
- package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
- package/dist/plugins/marquee/marqueePlugin.js +16 -15
- package/dist/plugins/media/AudioPlugin.svelte +13 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +11 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
- package/dist/plugins/media/EmbedPlugin.svelte +82 -86
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +45 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +21 -4
- package/dist/plugins/media/MediaEmpty.svelte +51 -90
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +200 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +34 -0
- package/dist/plugins/media/UploadPreview.svelte +32 -0
- package/dist/plugins/media/UploadPreview.svelte.d.ts +11 -0
- package/dist/plugins/media/VideoPlugin.svelte +14 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +12 -5
- package/dist/plugins/media/empty.svelte.d.ts +47 -46
- package/dist/plugins/media/empty.svelte.js +67 -60
- package/dist/plugins/media/media.d.ts +97 -44
- package/dist/plugins/media/media.js +77 -99
- package/dist/plugins/media/upload.css +23 -0
- package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
- package/dist/plugins/media/urlPaste.svelte.js +32 -102
- package/dist/plugins/mention/MentionPlugin.svelte +84 -126
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +17 -27
- package/dist/plugins/mention/mention.css +6 -0
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +154 -109
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +19 -26
- package/dist/plugins/pageLink/pageLink.css +6 -0
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +13 -20
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +174 -183
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +34 -34
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.js +2 -2
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
- package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/richtext/richtext.css +6 -0
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +40 -124
- package/dist/plugins/table/TablePlugin.svelte +106 -168
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +38 -141
- package/dist/plugins/table/chrome.svelte.js +340 -589
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +16 -152
- package/dist/plugins/table/table.d.ts +15 -14
- package/dist/plugins/table/table.js +22 -16
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +4 -68
- package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
- package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +55 -24
- package/dist/plugins/uploads.svelte.js +123 -50
- package/dist/plugins.d.ts +187 -66
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +8 -10
- package/dist/selection/pointer.svelte.js +32 -73
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +224 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +3 -8
- package/dist/selection/visibility.js +7 -5
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +43 -39
- package/dist/session/attempt.js +62 -55
- package/dist/session/bindings.js +117 -145
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +208 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +16 -21
- package/dist/session/inputRules.d.ts +6 -3
- package/dist/session/inputRules.js +78 -83
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +43 -10
- package/dist/session/moves.js +101 -59
- package/dist/session/navigation.d.ts +10 -2
- package/dist/session/navigation.js +140 -172
- package/dist/session/ports.d.ts +2 -7
- package/dist/session/props.d.ts +25 -25
- package/dist/session/props.js +62 -159
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +5 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +42 -47
- package/dist/session/uploads.d.ts +29 -0
- package/dist/session/uploads.js +10 -0
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +2 -2
- package/dist/surface/lines.js +1 -1
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +52 -72
- package/dist/surface/overlay.d.ts +41 -3
- package/dist/surface/overlay.js +92 -37
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +272 -106
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -554
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -61
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -335
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -93
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
- package/dist/plugins/image/empty.svelte.d.ts +0 -56
- package/dist/plugins/image/empty.svelte.js +0 -83
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
- package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/labels.d.ts +0 -9
- package/dist/plugins/richtext/labels.js +0 -7
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/table/dragPreview.d.ts +0 -29
- package/dist/plugins/table/dragPreview.js +0 -103
- package/dist/plugins/toolbar/LinkCard.svelte +0 -122
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
- package/dist/plugins/toolbar/Toolbar.svelte +0 -349
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
- /package/dist/{plugins/columns → dnd}/stacking.d.ts +0 -0
- /package/dist/{plugins/columns → dnd}/stacking.js +0 -0
|
@@ -1,57 +1,65 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { Plugin } from '../../plugins.js';
|
|
4
|
+
import { emptyHosts } from './EmptySlot.svelte';
|
|
5
|
+
import Self from './MediaEmpty.svelte';
|
|
6
|
+
|
|
7
|
+
export type MediaEmptyOptions = {
|
|
8
|
+
/**
|
|
9
|
+
* An empty image's or media block's markup and its words (Notion's "Add
|
|
10
|
+
* an image", "Embed a video"… and their link panel, a pasted or dropped
|
|
11
|
+
* file's upload, or a readonly view's placeholder): it receives the
|
|
12
|
+
* block's `MediaEmptyController` (`kind` says which: image, embed,
|
|
13
|
+
* bookmark, file, video, audio).
|
|
14
|
+
*/
|
|
15
|
+
empty: Snippet<[MediaEmptyController]>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The empty image and media blocks' chrome: your `empty` snippet for each
|
|
20
|
+
* of them (without the plugin, an empty block shows nothing). The first
|
|
21
|
+
* listed claims the view.
|
|
22
|
+
*/
|
|
23
|
+
export const createMediaEmptyPlugin =
|
|
24
|
+
({ empty }: MediaEmptyOptions): Plugin =>
|
|
25
|
+
(edytor) => {
|
|
26
|
+
if (edytor && !emptyHosts.has(edytor)) emptyHosts.set(edytor, { Host: Self, empty });
|
|
27
|
+
return {};
|
|
28
|
+
};
|
|
29
|
+
</script>
|
|
30
|
+
|
|
1
31
|
<script lang="ts">
|
|
2
|
-
import {
|
|
32
|
+
import { untrack } from 'svelte';
|
|
3
33
|
import type { Block } from '../../block/block.svelte.js';
|
|
4
34
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
5
|
-
import {
|
|
6
|
-
import { MediaEmptyController } from './empty.svelte.js';
|
|
7
|
-
import { fileUploads
|
|
35
|
+
import type { MediaKind } from './media.js';
|
|
36
|
+
import { MediaEmptyController, type EmptyView } from './empty.svelte.js';
|
|
37
|
+
import { fileUploads } from '../uploads.svelte.js';
|
|
8
38
|
|
|
9
39
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* its error; data answered while the block was not shown fills it as soon
|
|
19
|
-
* as it shows. Its state is a `MediaEmptyController`, which the view's
|
|
20
|
-
* `empty` snippet for the kind renders instead of this markup.
|
|
40
|
+
* An image's or a media block's empty state: a `MediaEmptyController`,
|
|
41
|
+
* which the view's `empty` snippet draws. The kind in the
|
|
42
|
+
* block's view (`viewOf`) stores the link, or an uploaded file's URL
|
|
43
|
+
* (only on a block still empty when it lands). A readonly view, or a
|
|
44
|
+
* suggestion's preview (no `block`), may not write: no control may run
|
|
45
|
+
* `upload`. A pasted or dropped file shows its upload (`pending`); a
|
|
46
|
+
* failed one opens the panel with its error; data answered while the
|
|
47
|
+
* block was not shown fills it as soon as it shows.
|
|
21
48
|
*/
|
|
22
49
|
let {
|
|
23
50
|
block,
|
|
24
51
|
kind,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
upload,
|
|
28
|
-
link,
|
|
29
|
-
file
|
|
52
|
+
viewOf,
|
|
53
|
+
empty
|
|
30
54
|
}: {
|
|
31
55
|
block: Block | undefined;
|
|
32
|
-
|
|
33
|
-
kind:
|
|
34
|
-
|
|
35
|
-
/** The
|
|
36
|
-
|
|
37
|
-
upload?: Uploader;
|
|
38
|
-
link: (value: string) => boolean;
|
|
39
|
-
file?: (file: File, src: string) => boolean;
|
|
56
|
+
kind: MediaKind | 'image';
|
|
57
|
+
/** The kind in a view: how it stores a source. */
|
|
58
|
+
viewOf: (edytor: Edytor | undefined) => EmptyView | undefined;
|
|
59
|
+
/** The view's `empty` snippet. */
|
|
60
|
+
empty: Snippet<[MediaEmptyController]>;
|
|
40
61
|
} = $props();
|
|
41
|
-
|
|
42
|
-
const view = getContext<Edytor>('edytor');
|
|
43
|
-
const panel = untrack(
|
|
44
|
-
() =>
|
|
45
|
-
new MediaEmptyController(block, kind, icon, () => mediaLabels[kind].of(view), {
|
|
46
|
-
accept,
|
|
47
|
-
upload,
|
|
48
|
-
link: (value) => link(value),
|
|
49
|
-
file: file && ((picked, src) => file(picked, src))
|
|
50
|
-
})
|
|
51
|
-
);
|
|
52
|
-
const empty = untrack(() => mediaEmpty.of(block?.edytor ?? view, kind));
|
|
53
|
-
const labels = $derived(panel.labels);
|
|
54
|
-
const { placeholder, submit, invalid } = $derived(panel.kindLabels);
|
|
62
|
+
const panel = untrack(() => new MediaEmptyController(block, kind, viewOf(block?.edytor)));
|
|
55
63
|
/** The upload of a pasted or dropped file into this block, if any. */
|
|
56
64
|
const pending = $derived(panel.pending);
|
|
57
65
|
// After the flush that shows the block: never inside the transaction that showed it.
|
|
@@ -71,51 +79,4 @@
|
|
|
71
79
|
});
|
|
72
80
|
</script>
|
|
73
81
|
|
|
74
|
-
{
|
|
75
|
-
{@render empty(panel)}
|
|
76
|
-
{:else if pending?.status === 'uploading'}
|
|
77
|
-
<div data-edytor-media-uploading role="status">
|
|
78
|
-
<span aria-hidden="true">{icon}</span>
|
|
79
|
-
<progress value={pending.progress ?? undefined} max="1"></progress>
|
|
80
|
-
{labels.uploading}
|
|
81
|
-
</div>
|
|
82
|
-
{:else if panel.readonly}
|
|
83
|
-
<div data-edytor-media-placeholder><span aria-hidden="true">{icon}</span> {panel.label}</div>
|
|
84
|
-
{:else}
|
|
85
|
-
<button
|
|
86
|
-
type="button"
|
|
87
|
-
data-edytor-media-add
|
|
88
|
-
onmousedown={(event) => event.preventDefault()}
|
|
89
|
-
onclick={panel.toggle}><span aria-hidden="true">{icon}</span> {panel.label}</button
|
|
90
|
-
>
|
|
91
|
-
{#if panel.open}
|
|
92
|
-
<div data-edytor-media-form>
|
|
93
|
-
<input
|
|
94
|
-
{placeholder}
|
|
95
|
-
aria-label={placeholder}
|
|
96
|
-
bind:value={panel.draft}
|
|
97
|
-
{@attach panel.field}
|
|
98
|
-
/>
|
|
99
|
-
<button type="button" onclick={() => panel.embed()}>{submit}</button>
|
|
100
|
-
{#if panel.canUpload}
|
|
101
|
-
<label data-edytor-media-upload>
|
|
102
|
-
{labels.upload}
|
|
103
|
-
<input
|
|
104
|
-
type="file"
|
|
105
|
-
{accept}
|
|
106
|
-
hidden
|
|
107
|
-
onchange={(event) => {
|
|
108
|
-
const picked = event.currentTarget.files?.[0];
|
|
109
|
-
if (picked) void panel.upload(picked);
|
|
110
|
-
}}
|
|
111
|
-
/>
|
|
112
|
-
</label>
|
|
113
|
-
{/if}
|
|
114
|
-
{#if panel.failed === 'upload'}
|
|
115
|
-
<small data-edytor-media-error="upload">{labels.uploadFailed}</small>
|
|
116
|
-
{:else if panel.failed}
|
|
117
|
-
<small data-edytor-media-error="invalid">{invalid}</small>
|
|
118
|
-
{/if}
|
|
119
|
-
</div>
|
|
120
|
-
{/if}
|
|
121
|
-
{/if}
|
|
82
|
+
{@render empty(panel)}
|
|
@@ -1,16 +1,32 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { Plugin } from '../../plugins.js';
|
|
3
|
+
export type MediaEmptyOptions = {
|
|
4
|
+
/**
|
|
5
|
+
* An empty image's or media block's markup and its words (Notion's "Add
|
|
6
|
+
* an image", "Embed a video"… and their link panel, a pasted or dropped
|
|
7
|
+
* file's upload, or a readonly view's placeholder): it receives the
|
|
8
|
+
* block's `MediaEmptyController` (`kind` says which: image, embed,
|
|
9
|
+
* bookmark, file, video, audio).
|
|
10
|
+
*/
|
|
11
|
+
empty: Snippet<[MediaEmptyController]>;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* The empty image and media blocks' chrome: your `empty` snippet for each
|
|
15
|
+
* of them (without the plugin, an empty block shows nothing). The first
|
|
16
|
+
* listed claims the view.
|
|
17
|
+
*/
|
|
18
|
+
export declare const createMediaEmptyPlugin: ({ empty }: MediaEmptyOptions) => Plugin;
|
|
1
19
|
import type { Block } from '../../block/block.svelte.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
20
|
+
import type { Edytor } from '../../edytor.svelte.js';
|
|
21
|
+
import type { MediaKind } from './media.js';
|
|
22
|
+
import { MediaEmptyController, type EmptyView } from './empty.svelte.js';
|
|
4
23
|
type $$ComponentProps = {
|
|
5
24
|
block: Block | undefined;
|
|
6
|
-
|
|
7
|
-
kind:
|
|
8
|
-
|
|
9
|
-
/** The
|
|
10
|
-
|
|
11
|
-
upload?: Uploader;
|
|
12
|
-
link: (value: string) => boolean;
|
|
13
|
-
file?: (file: File, src: string) => boolean;
|
|
25
|
+
kind: MediaKind | 'image';
|
|
26
|
+
/** The kind in a view: how it stores a source. */
|
|
27
|
+
viewOf: (edytor: Edytor | undefined) => EmptyView | undefined;
|
|
28
|
+
/** The view's `empty` snippet. */
|
|
29
|
+
empty: Snippet<[MediaEmptyController]>;
|
|
14
30
|
};
|
|
15
31
|
declare const MediaEmpty: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
16
32
|
type MediaEmpty = ReturnType<typeof MediaEmpty>;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import type { BlockDefinition, BlockSnippetPayload, Plugin } from '../../plugins.js';
|
|
3
|
+
import EmptySlot from './EmptySlot.svelte';
|
|
4
|
+
import Control from '../Control.svelte';
|
|
5
|
+
import { labelsOf, mediaEnglish } from '../../labels.js';
|
|
6
|
+
import { emptyHosts } from './EmptySlot.svelte';
|
|
7
|
+
import UploadPreview from './UploadPreview.svelte';
|
|
8
|
+
import { fileUploads, uploadHooks, type Uploader } from '../uploads.svelte.js';
|
|
9
|
+
import {
|
|
10
|
+
claimed,
|
|
11
|
+
escapeHtml,
|
|
12
|
+
fileNameOf,
|
|
13
|
+
mediaControl,
|
|
14
|
+
mediaLink,
|
|
15
|
+
mediaPlugin,
|
|
16
|
+
mediaSourceOf,
|
|
17
|
+
mediaView,
|
|
18
|
+
safeMediaSrc,
|
|
19
|
+
LINK_REL,
|
|
20
|
+
type FileRowPayload,
|
|
21
|
+
type MediaView
|
|
22
|
+
} from './media.js';
|
|
23
|
+
|
|
24
|
+
type SourceKind = 'video' | 'audio' | 'file';
|
|
25
|
+
|
|
26
|
+
/** The view's file row markup, if the app gave one. */
|
|
27
|
+
const rowOf = mediaControl('file', 'row');
|
|
28
|
+
|
|
29
|
+
/** The files each kind takes: a video, an audio track, any other file. */
|
|
30
|
+
const ACCEPTS: Record<SourceKind, (file: File) => boolean> = {
|
|
31
|
+
video: (file) => /^video\//i.test(file.type),
|
|
32
|
+
audio: (file) => /^audio\//i.test(file.type),
|
|
33
|
+
file: () => true
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The data a source stores: a `safeMediaSrc`, and a file's name (the
|
|
38
|
+
* uploaded `file`'s, else its URL's last segment) and size; `null` for
|
|
39
|
+
* no source.
|
|
40
|
+
*/
|
|
41
|
+
const sourceData = (kind: SourceKind, value: string, file?: File) => {
|
|
42
|
+
const src = safeMediaSrc(value);
|
|
43
|
+
if (!src) return null;
|
|
44
|
+
return kind === 'file'
|
|
45
|
+
? { src, name: file?.name || fileNameOf(src), ...(file ? { size: file.size } : {}) }
|
|
46
|
+
: { src };
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The plugin of a kind holding one source (a video, an audio track, an
|
|
51
|
+
* attachment; Notion's): a media kind (`mediaPlugin`) drawn by this
|
|
52
|
+
* snippet, a link or an uploaded file stored as one data write (a file's
|
|
53
|
+
* whole data, its source, name and size; a video's or audio track's
|
|
54
|
+
* `src`), and with an `upload` (its uploader), the pasted, dropped and
|
|
55
|
+
* picked files it takes (`media.files`). A video or an audio track
|
|
56
|
+
* exports as its tag in a `figure` and imports from one (bare, or in a
|
|
57
|
+
* `figure`) with a safe `src` or `source`; the file kind brings its own
|
|
58
|
+
* (`record`), and its `row` markup (`own`).
|
|
59
|
+
*/
|
|
60
|
+
export const sourcePlugin = (
|
|
61
|
+
kind: SourceKind,
|
|
62
|
+
keywords: string[],
|
|
63
|
+
record: Partial<BlockDefinition> = {
|
|
64
|
+
html: (block, caption) => {
|
|
65
|
+
const src = safeMediaSrc(block.data?.src);
|
|
66
|
+
// The tag, then its attributes: `<video src="…" controls></video>`.
|
|
67
|
+
const media = src ? `<${kind}` + ` src="${escapeHtml(src)}" controls></${kind}>` : '';
|
|
68
|
+
return `<figure>${media}<figcaption>${caption}</figcaption></figure>`;
|
|
69
|
+
},
|
|
70
|
+
parse: (el) => {
|
|
71
|
+
const src = mediaSourceOf(claimed(el, kind));
|
|
72
|
+
return src ? { src } : undefined;
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
own: Pick<MediaView, 'row'> = {},
|
|
76
|
+
upload?: Uploader
|
|
77
|
+
): Plugin =>
|
|
78
|
+
mediaPlugin(kind, keywords, (edytor) => {
|
|
79
|
+
return {
|
|
80
|
+
...own,
|
|
81
|
+
hooks: uploadHooks(edytor, upload),
|
|
82
|
+
store: (block, value, file) => {
|
|
83
|
+
const data = sourceData(kind, value, file);
|
|
84
|
+
if (!data) return 'invalid';
|
|
85
|
+
if (kind === 'file') block.edytor.patchData(block.id, [{ path: [], value: data }]);
|
|
86
|
+
else block.edytor.patchData(block.id, [{ path: ['src'], value: data.src }]);
|
|
87
|
+
return null;
|
|
88
|
+
},
|
|
89
|
+
record: {
|
|
90
|
+
snippet: source,
|
|
91
|
+
// Its files, with an `upload`: an Upload and pasted or dropped files.
|
|
92
|
+
...(upload && {
|
|
93
|
+
upload: {
|
|
94
|
+
send: upload,
|
|
95
|
+
accepts: ACCEPTS[kind],
|
|
96
|
+
fallback: kind === 'file',
|
|
97
|
+
data: (file: File, answer: string) => sourceData(kind, answer, file),
|
|
98
|
+
filled: (data: Record<string, unknown>) => safeMediaSrc(data.src) !== null
|
|
99
|
+
}
|
|
100
|
+
}),
|
|
101
|
+
...record
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
</script>
|
|
106
|
+
|
|
107
|
+
<!--
|
|
108
|
+
A file (its name and size, linking to it), a video or an audio track in
|
|
109
|
+
the browser's player, or the empty block until it has a source; its
|
|
110
|
+
caption below.
|
|
111
|
+
-->
|
|
112
|
+
{#snippet source({ block, content }: BlockSnippetPayload<Record<string, unknown>>)}
|
|
113
|
+
{@const src = safeMediaSrc(block.data.src)}
|
|
114
|
+
{@const pending =
|
|
115
|
+
block.handle && !src ? fileUploads(block.handle.edytor)?.of(block.id) : undefined}
|
|
116
|
+
{#if src && block.type === 'file'}
|
|
117
|
+
{@const name =
|
|
118
|
+
typeof block.data.name === 'string' && block.data.name ? block.data.name : fileNameOf(src)}
|
|
119
|
+
{@const size = typeof block.data.size === 'number' ? block.data.size : undefined}
|
|
120
|
+
<div use:block.void data-edytor-file>
|
|
121
|
+
<Control
|
|
122
|
+
own={rowOf}
|
|
123
|
+
{initial}
|
|
124
|
+
payload={{
|
|
125
|
+
block: block.handle,
|
|
126
|
+
src,
|
|
127
|
+
name,
|
|
128
|
+
size,
|
|
129
|
+
sizeLabel:
|
|
130
|
+
size === undefined
|
|
131
|
+
? ''
|
|
132
|
+
: labelsOf(block.handle?.edytor, 'media', mediaEnglish).fileSize(size),
|
|
133
|
+
uploading: false,
|
|
134
|
+
progress: null,
|
|
135
|
+
link: mediaLink({ draggable: 'false', download: name })
|
|
136
|
+
}}
|
|
137
|
+
/>
|
|
138
|
+
</div>
|
|
139
|
+
{:else if !src && pending?.status === 'uploading' && !emptyHosts.has(block.handle!.edytor)}
|
|
140
|
+
<!-- An upload with no empty markup to draw it: the file's name and size at once, its progress. -->
|
|
141
|
+
<div use:block.void data-edytor-media-empty>
|
|
142
|
+
{#if block.type === 'file' && pending.preview}
|
|
143
|
+
<Control
|
|
144
|
+
own={rowOf}
|
|
145
|
+
{initial}
|
|
146
|
+
payload={{
|
|
147
|
+
block: block.handle,
|
|
148
|
+
src: pending.preview,
|
|
149
|
+
name: pending.name,
|
|
150
|
+
size: pending.size,
|
|
151
|
+
sizeLabel: labelsOf(block.handle?.edytor, 'media', mediaEnglish).fileSize(pending.size),
|
|
152
|
+
uploading: true,
|
|
153
|
+
progress: pending.progress,
|
|
154
|
+
link: mediaLink({ draggable: 'false', download: pending.name })
|
|
155
|
+
}}
|
|
156
|
+
/>
|
|
157
|
+
{:else}
|
|
158
|
+
<UploadPreview upload={pending} />
|
|
159
|
+
{/if}
|
|
160
|
+
</div>
|
|
161
|
+
{:else if src && block.type === 'video'}
|
|
162
|
+
<div use:block.void data-edytor-video>
|
|
163
|
+
<!-- svelte-ignore a11y_media_has_caption -->
|
|
164
|
+
<video
|
|
165
|
+
{src}
|
|
166
|
+
controls
|
|
167
|
+
preload="metadata"
|
|
168
|
+
playsinline
|
|
169
|
+
draggable="false"
|
|
170
|
+
style="display: block; width: 100%"
|
|
171
|
+
></video>
|
|
172
|
+
</div>
|
|
173
|
+
{:else if src}
|
|
174
|
+
<div use:block.void data-edytor-audio>
|
|
175
|
+
<audio {src} controls preload="metadata" style="display: block; width: 100%"></audio>
|
|
176
|
+
</div>
|
|
177
|
+
{:else}
|
|
178
|
+
<div use:block.void data-edytor-media-empty>
|
|
179
|
+
<EmptySlot
|
|
180
|
+
block={block.handle}
|
|
181
|
+
kind={block.type as SourceKind}
|
|
182
|
+
viewOf={(edytor) => mediaView(edytor, block.type as SourceKind)}
|
|
183
|
+
/>
|
|
184
|
+
</div>
|
|
185
|
+
{/if}
|
|
186
|
+
<!-- The core renders the kind's <figure> around this markup. -->
|
|
187
|
+
<!-- svelte-ignore a11y_figcaption_parent -->
|
|
188
|
+
<figcaption>{@render content()}</figcaption>
|
|
189
|
+
{/snippet}
|
|
190
|
+
|
|
191
|
+
<!-- A file: its name and size, a link downloading it. -->
|
|
192
|
+
{#snippet initial({ src, name, sizeLabel, link, uploading, progress }: FileRowPayload)}
|
|
193
|
+
<a href={src} target="_blank" rel={LINK_REL} draggable="false" download={name} {@attach link}>
|
|
194
|
+
<span aria-hidden="true">📎</span>
|
|
195
|
+
<span data-edytor-file-name>{name}</span>
|
|
196
|
+
{#if sizeLabel}<span data-edytor-file-size>{sizeLabel}</span>{/if}
|
|
197
|
+
</a>
|
|
198
|
+
{#if uploading}<progress data-edytor-file-progress value={progress ?? undefined} max="1"
|
|
199
|
+
></progress>{/if}
|
|
200
|
+
{/snippet}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { BlockDefinition, Plugin } from '../../plugins.js';
|
|
2
|
+
import { type Uploader } from '../uploads.svelte.js';
|
|
3
|
+
import { type MediaView } from './media.js';
|
|
4
|
+
type SourceKind = 'video' | 'audio' | 'file';
|
|
5
|
+
/**
|
|
6
|
+
* The plugin of a kind holding one source (a video, an audio track, an
|
|
7
|
+
* attachment; Notion's): a media kind (`mediaPlugin`) drawn by this
|
|
8
|
+
* snippet, a link or an uploaded file stored as one data write (a file's
|
|
9
|
+
* whole data, its source, name and size; a video's or audio track's
|
|
10
|
+
* `src`), and with an `upload` (its uploader), the pasted, dropped and
|
|
11
|
+
* picked files it takes (`media.files`). A video or an audio track
|
|
12
|
+
* exports as its tag in a `figure` and imports from one (bare, or in a
|
|
13
|
+
* `figure`) with a safe `src` or `source`; the file kind brings its own
|
|
14
|
+
* (`record`), and its `row` markup (`own`).
|
|
15
|
+
*/
|
|
16
|
+
export declare const sourcePlugin: (kind: SourceKind, keywords: string[], record?: Partial<BlockDefinition>, own?: Pick<MediaView, "row">, upload?: Uploader) => Plugin;
|
|
17
|
+
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> {
|
|
18
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
19
|
+
$$bindings?: Bindings;
|
|
20
|
+
} & Exports;
|
|
21
|
+
(internal: unknown, props: {
|
|
22
|
+
$$events?: Events;
|
|
23
|
+
$$slots?: Slots;
|
|
24
|
+
}): Exports & {
|
|
25
|
+
$set?: any;
|
|
26
|
+
$on?: any;
|
|
27
|
+
};
|
|
28
|
+
z_$$bindings?: Bindings;
|
|
29
|
+
}
|
|
30
|
+
declare const SourceBlock: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
31
|
+
[evt: string]: CustomEvent<any>;
|
|
32
|
+
}, {}, {}, string>;
|
|
33
|
+
type SourceBlock = InstanceType<typeof SourceBlock>;
|
|
34
|
+
export default SourceBlock;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import './upload.css';
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
import { getContext } from 'svelte';
|
|
7
|
+
import type { Edytor } from '../../edytor.svelte.js';
|
|
8
|
+
import type { FileUpload } from '../uploads.svelte.js';
|
|
9
|
+
import { labelsOf, mediaEnglish } from '../../labels.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A file uploading, the plugin's own markup when the view has no empty
|
|
13
|
+
* markup to draw it: an image at once from its object URL (this view's
|
|
14
|
+
* only, never stored) with the progress over it; another file's name and
|
|
15
|
+
* size, then the progress (indeterminate until `upload` reports one).
|
|
16
|
+
*/
|
|
17
|
+
let {
|
|
18
|
+
upload,
|
|
19
|
+
image = false
|
|
20
|
+
}: { upload: Extract<FileUpload, { status: 'uploading' }>; image?: boolean } = $props();
|
|
21
|
+
const labels = labelsOf(getContext<Edytor>('edytor'), 'media', mediaEnglish);
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<div data-edytor-upload data-edytor-upload-image={image ? '' : undefined} role="status">
|
|
25
|
+
{#if image && upload.preview}
|
|
26
|
+
<img src={upload.preview} alt={upload.name} draggable="false" />
|
|
27
|
+
{:else}
|
|
28
|
+
<span data-edytor-file-name>{upload.name}</span>
|
|
29
|
+
<span data-edytor-file-size>{labels.fileSize(upload.size)}</span>
|
|
30
|
+
{/if}
|
|
31
|
+
<progress value={upload.progress ?? undefined} max="1" aria-label={labels.uploading}></progress>
|
|
32
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import './upload.css';
|
|
2
|
+
import type { FileUpload } from '../uploads.svelte.js';
|
|
3
|
+
type $$ComponentProps = {
|
|
4
|
+
upload: Extract<FileUpload, {
|
|
5
|
+
status: 'uploading';
|
|
6
|
+
}>;
|
|
7
|
+
image?: boolean;
|
|
8
|
+
};
|
|
9
|
+
declare const UploadPreview: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
10
|
+
type UploadPreview = ReturnType<typeof UploadPreview>;
|
|
11
|
+
export default UploadPreview;
|
|
@@ -1,107 +1,24 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
|
-
import type { Plugin
|
|
3
|
-
import
|
|
4
|
-
import type {
|
|
5
|
-
import MediaEmpty from './MediaEmpty.svelte';
|
|
6
|
-
import { mediaKinds } from '../../crdt/semantics.js';
|
|
7
|
-
import { keywordsOf, labelsWith } from '../../labels.js';
|
|
8
|
-
import {
|
|
9
|
-
claimed,
|
|
10
|
-
escapeHtml,
|
|
11
|
-
mediaLabels,
|
|
12
|
-
mediaEmpty,
|
|
13
|
-
mediaSourceOf,
|
|
14
|
-
safeMediaSrc,
|
|
15
|
-
mediaUploads,
|
|
16
|
-
type MediaPluginOptions
|
|
17
|
-
} from './media.js';
|
|
2
|
+
import type { Plugin } from '../../plugins.js';
|
|
3
|
+
import { sourcePlugin } from './SourceBlock.svelte';
|
|
4
|
+
import type { Uploader } from '../uploads.svelte.js';
|
|
18
5
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
6
|
+
export type VideoPluginOptions = {
|
|
7
|
+
/**
|
|
8
|
+
* Upload a video file and answer its URL: an empty block's Upload, and
|
|
9
|
+
* the pasted and dropped video files, each placed as a block at once
|
|
10
|
+
* (one undo step), showing its name and progress, then filled with the
|
|
11
|
+
* URL this answers. Without it, videos are only linked.
|
|
12
|
+
*/
|
|
13
|
+
upload?: Uploader;
|
|
26
14
|
};
|
|
27
15
|
|
|
28
16
|
/**
|
|
29
17
|
* Notion's video block: a video file (an `http(s)` link, or an upload
|
|
30
18
|
* through `upload`) in the browser's player, with an editable caption.
|
|
31
|
-
* A YouTube or Vimeo link is an embed (`
|
|
19
|
+
* A YouTube or Vimeo link is an embed (`createEmbedPlugin()`). Void: its only
|
|
32
20
|
* text is the caption.
|
|
33
21
|
*/
|
|
34
|
-
export const createVideoPlugin =
|
|
35
|
-
(
|
|
36
|
-
(edytor) => {
|
|
37
|
-
// First wins, as for the kind: a second listing never replaces it.
|
|
38
|
-
const first = !!edytor && !uploadOf.has(edytor);
|
|
39
|
-
if (first) uploadOf.set(edytor, options.upload);
|
|
40
|
-
const onPaste = first ? mediaUploads(edytor, 'video', options.upload) : undefined;
|
|
41
|
-
const labels = labelsWith('media', options.labels);
|
|
42
|
-
mediaLabels.video.claim(edytor, labels);
|
|
43
|
-
mediaEmpty.claim(edytor, 'video', options.empty);
|
|
44
|
-
return {
|
|
45
|
-
...(onPaste ? { onPaste } : {}),
|
|
46
|
-
blocks: {
|
|
47
|
-
video: {
|
|
48
|
-
...mediaKinds.video,
|
|
49
|
-
snippet: video,
|
|
50
|
-
element: 'figure',
|
|
51
|
-
presets: [
|
|
52
|
-
{
|
|
53
|
-
label: labels.video.label,
|
|
54
|
-
icon: '🎬',
|
|
55
|
-
keywords: keywordsOf('block.video', ['movie', 'mp4', 'clip'], options.keywords),
|
|
56
|
-
group: 'Media'
|
|
57
|
-
}
|
|
58
|
-
],
|
|
59
|
-
html: (block, caption) => {
|
|
60
|
-
const src = safeMediaSrc(block.data?.src);
|
|
61
|
-
const media = src ? `<video src="${escapeHtml(src)}" controls></video>` : '';
|
|
62
|
-
return `<figure>${media}<figcaption>${caption}</figcaption></figure>`;
|
|
63
|
-
},
|
|
64
|
-
// A `video` (bare, or in a `figure`) with a safe `src` or `source`.
|
|
65
|
-
parse: (el) => {
|
|
66
|
-
const src = mediaSourceOf(claimed(el, 'video'));
|
|
67
|
-
return src ? { src } : undefined;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
/** The video block, links only. */
|
|
75
|
-
export const videoPlugin = createVideoPlugin();
|
|
22
|
+
export const createVideoPlugin = ({ upload }: VideoPluginOptions = {}): Plugin =>
|
|
23
|
+
sourcePlugin('video', ['movie', 'mp4', 'clip'], undefined, {}, upload);
|
|
76
24
|
</script>
|
|
77
|
-
|
|
78
|
-
{#snippet video({ block, content }: BlockSnippetPayload<{ src?: string }>)}
|
|
79
|
-
{@const src = safeMediaSrc(block.data.src)}
|
|
80
|
-
{#if src}
|
|
81
|
-
<div use:block.void data-edytor-video>
|
|
82
|
-
<!-- svelte-ignore a11y_media_has_caption -->
|
|
83
|
-
<video
|
|
84
|
-
{src}
|
|
85
|
-
controls
|
|
86
|
-
preload="metadata"
|
|
87
|
-
playsinline
|
|
88
|
-
draggable="false"
|
|
89
|
-
style="display: block; width: 100%"
|
|
90
|
-
></video>
|
|
91
|
-
</div>
|
|
92
|
-
{:else}
|
|
93
|
-
<div use:block.void data-edytor-media-empty>
|
|
94
|
-
<MediaEmpty
|
|
95
|
-
block={block.handle}
|
|
96
|
-
kind="video"
|
|
97
|
-
icon="🎬"
|
|
98
|
-
accept="video/*"
|
|
99
|
-
upload={block.handle && uploadOf.get(block.handle.edytor)}
|
|
100
|
-
link={(value) => videoLink(block.handle, value)}
|
|
101
|
-
/>
|
|
102
|
-
</div>
|
|
103
|
-
{/if}
|
|
104
|
-
<!-- The core renders the kind's <figure> around this markup. -->
|
|
105
|
-
<!-- svelte-ignore a11y_figcaption_parent -->
|
|
106
|
-
<figcaption>{@render content()}</figcaption>
|
|
107
|
-
{/snippet}
|
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import type { Plugin } from '../../plugins.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { Uploader } from '../uploads.svelte.js';
|
|
3
|
+
export type VideoPluginOptions = {
|
|
4
|
+
/**
|
|
5
|
+
* Upload a video file and answer its URL: an empty block's Upload, and
|
|
6
|
+
* the pasted and dropped video files, each placed as a block at once
|
|
7
|
+
* (one undo step), showing its name and progress, then filled with the
|
|
8
|
+
* URL this answers. Without it, videos are only linked.
|
|
9
|
+
*/
|
|
10
|
+
upload?: Uploader;
|
|
11
|
+
};
|
|
3
12
|
/**
|
|
4
13
|
* Notion's video block: a video file (an `http(s)` link, or an upload
|
|
5
14
|
* through `upload`) in the browser's player, with an editable caption.
|
|
6
|
-
* A YouTube or Vimeo link is an embed (`
|
|
15
|
+
* A YouTube or Vimeo link is an embed (`createEmbedPlugin()`). Void: its only
|
|
7
16
|
* text is the caption.
|
|
8
17
|
*/
|
|
9
|
-
export declare const createVideoPlugin: (
|
|
10
|
-
/** The video block, links only. */
|
|
11
|
-
export declare const videoPlugin: Plugin;
|
|
18
|
+
export declare const createVideoPlugin: ({ upload }?: VideoPluginOptions) => Plugin;
|
|
12
19
|
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> {
|
|
13
20
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
14
21
|
$$bindings?: Bindings;
|