edytor 1.0.0-rc.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +47 -141
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.d.ts +6 -1
- package/dist/clipboard/htmlFlow.js +26 -13
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +22 -17
- package/dist/cloudflare/DocumentRoom.js +10 -5
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +20 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +9 -30
- package/dist/cloudflare/room/storage.js +52 -104
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +160 -119
- package/dist/components/Block.svelte.d.ts +8 -3
- package/dist/components/Content.svelte +91 -44
- package/dist/components/CustomMark.svelte +46 -0
- package/dist/components/CustomMark.svelte.d.ts +11 -0
- package/dist/components/Edytor.svelte +80 -95
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/InlineBlock.svelte +4 -9
- package/dist/components/Mark.svelte +46 -35
- package/dist/components/Mark.svelte.d.ts +7 -0
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +48 -14
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +8 -13
- package/dist/crdt/data.js +30 -70
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/{plugins/blockHandles → dnd}/autoScroll.d.ts +2 -1
- package/dist/{plugins/blockHandles → dnd}/autoScroll.js +3 -3
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +34 -64
- package/dist/edytor.svelte.js +118 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -184
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +33 -72
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +92 -72
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -13
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +91 -314
- package/dist/labels.js +180 -396
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -151
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +63 -97
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +247 -268
- package/dist/plugins/blockHandles/BlockHandles.svelte +46 -29
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +29 -23
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -162
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +20 -17
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +46 -1
- package/dist/plugins/blockHandles/geometry.js +51 -4
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +59 -28
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +180 -105
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +79 -0
- package/dist/plugins/chrome.js +87 -0
- package/dist/plugins/code/CodeHeader.svelte +12 -58
- package/dist/plugins/code/CodeHeader.svelte.d.ts +1 -0
- package/dist/plugins/code/CodePlugin.svelte +75 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +25 -0
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +9 -0
- package/dist/plugins/code/code.css +5 -100
- package/dist/plugins/code/header.svelte.d.ts +47 -0
- package/dist/plugins/code/header.svelte.js +141 -0
- package/dist/plugins/code/languageMenu.svelte.d.ts +84 -0
- package/dist/plugins/code/languageMenu.svelte.js +199 -0
- package/dist/plugins/code/languages.d.ts +21 -10
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -430
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +6 -7
- package/dist/plugins/comments/commentsPlugin.d.ts +31 -10
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +18 -129
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +2 -1
- package/dist/plugins/equation/EquationPlugin.svelte +123 -168
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +5 -3
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +74 -36
- package/dist/plugins/equation/equation.svelte.js +74 -66
- package/dist/plugins/equation/importUrl.d.ts +6 -0
- package/dist/plugins/equation/importUrl.js +6 -0
- package/dist/plugins/equation/katex.d.ts +8 -0
- package/dist/plugins/equation/katex.js +77 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +5 -151
- package/dist/plugins/image/ImagePlugin.svelte +49 -117
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -24
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -57
- package/dist/plugins/image/controls.svelte.js +51 -174
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +39 -24
- package/dist/plugins/index.js +30 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +15 -0
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +9 -0
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +46 -0
- package/dist/plugins/marquee/MarqueeController.svelte.js +243 -0
- package/dist/plugins/marquee/marquee.d.ts +33 -0
- package/dist/plugins/marquee/marquee.js +89 -0
- package/dist/plugins/marquee/marqueePlugin.d.ts +32 -0
- package/dist/plugins/marquee/marqueePlugin.js +68 -0
- package/dist/plugins/media/AudioPlugin.svelte +3 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +124 -112
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +20 -7
- package/dist/plugins/media/EmbedPlugin.svelte +93 -77
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +21 -9
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +35 -111
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +55 -112
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +69 -0
- package/dist/plugins/media/empty.svelte.js +111 -0
- package/dist/plugins/media/media.d.ts +93 -30
- package/dist/plugins/media/media.js +79 -86
- package/dist/plugins/media/urlPaste.svelte.d.ts +9 -32
- package/dist/plugins/media/urlPaste.svelte.js +46 -75
- package/dist/plugins/mention/MentionPlugin.svelte +47 -124
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +11 -23
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +52 -108
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +11 -23
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +25 -0
- package/dist/plugins/richtext/CalloutIcon.svelte.d.ts +9 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +25 -0
- package/dist/plugins/richtext/EmptyBody.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +272 -148
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +37 -18
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.d.ts +9 -0
- package/dist/plugins/richtext/body.js +16 -0
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +97 -0
- package/dist/plugins/richtext/calloutIcons.svelte.js +214 -0
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +18 -11
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +93 -35
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +11 -24
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +32 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -16
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +96 -127
- package/dist/plugins/table/TableChrome.svelte.d.ts +5 -1
- package/dist/plugins/table/TablePlugin.svelte +116 -171
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +110 -117
- package/dist/plugins/table/chrome.svelte.js +643 -289
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +55 -134
- package/dist/plugins/table/table.d.ts +26 -7
- package/dist/plugins/table/table.js +23 -49
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +29 -66
- package/dist/plugins/toolbar/ToolbarController.svelte.js +151 -76
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +14 -13
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +6 -45
- package/dist/plugins/triggers/TriggerController.svelte.js +51 -96
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +167 -60
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +12 -10
- package/dist/selection/pointer.svelte.js +154 -71
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +263 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +11 -8
- package/dist/selection/visibility.js +23 -8
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +33 -39
- package/dist/session/attempt.js +61 -53
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +18 -3
- package/dist/session/navigation.js +194 -153
- package/dist/session/ports.d.ts +7 -0
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +8 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +64 -47
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +32 -0
- package/dist/surface/lines.js +43 -0
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +73 -77
- package/dist/surface/overlay.d.ts +48 -6
- package/dist/surface/overlay.js +133 -23
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +315 -126
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -525
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -43
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -447
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -116
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -12
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -83
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -7
- package/dist/plugins/richtext/labels.d.ts +0 -5
- package/dist/plugins/richtext/labels.js +0 -3
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -360
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/toolbar/LinkCard.svelte +0 -118
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -7
- package/dist/plugins/toolbar/Toolbar.svelte +0 -400
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -144
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
|
@@ -1,12 +1,23 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import type { Plugin, BlockSnippetPayload } from '../../plugins.js';
|
|
3
3
|
import type { Block } from '../../block/block.svelte.js';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import { urlPaste } from './urlPaste.svelte.js';
|
|
8
|
-
import {
|
|
9
|
-
|
|
4
|
+
import EmptySlot from './EmptySlot.svelte';
|
|
5
|
+
import Control from '../Control.svelte';
|
|
6
|
+
import type { Snippet } from 'svelte';
|
|
7
|
+
import { urlPaste, type UrlPasteController } from './urlPaste.svelte.js';
|
|
8
|
+
import {
|
|
9
|
+
MEDIA_ICONS,
|
|
10
|
+
escapeHtml,
|
|
11
|
+
mediaControl,
|
|
12
|
+
mediaLink,
|
|
13
|
+
mediaPlugin,
|
|
14
|
+
mediaView,
|
|
15
|
+
safeWebUrl,
|
|
16
|
+
LINK_REL,
|
|
17
|
+
type BookmarkCardPayload
|
|
18
|
+
} from './media.js';
|
|
19
|
+
|
|
20
|
+
export type { BookmarkCardPayload };
|
|
10
21
|
|
|
11
22
|
/** What an `unfurl` answers about a page; every field optional. */
|
|
12
23
|
export type BookmarkPreview = {
|
|
@@ -25,14 +36,24 @@
|
|
|
25
36
|
* set from the panel or the paste menu; without it the card shows the URL.
|
|
26
37
|
*/
|
|
27
38
|
unfurl?: (url: string) => Promise<BookmarkPreview | null | undefined>;
|
|
28
|
-
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
/**
|
|
40
|
+
* The menu a URL pasted on an empty line opens (Link, Embed, Bookmark);
|
|
41
|
+
* it renders while `controller.open`, under the line (without it, the
|
|
42
|
+
* link is kept and nothing shows). The
|
|
43
|
+
* view's one menu takes the first `menu` its embed and bookmark
|
|
44
|
+
* plugins pass. Its keys stay the editor's; keep its ARIA with
|
|
45
|
+
* `{@attach controller.popup}` on the list and
|
|
46
|
+
* `{@attach controller.option(index)}` on each row.
|
|
47
|
+
*/
|
|
48
|
+
menu?: Snippet<[UrlPasteController]>;
|
|
49
|
+
/**
|
|
50
|
+
* The card of a bookmark with a link (default: Notion's, the title,
|
|
51
|
+
* description and URL beside the cover): `<a href={card.url}
|
|
52
|
+
* {@attach card.link}>`. The first bookmark plugin listed in a view gives its card.
|
|
53
|
+
*/
|
|
54
|
+
card?: Snippet<[BookmarkCardPayload]>;
|
|
32
55
|
};
|
|
33
56
|
|
|
34
|
-
const unfurlOf = new WeakMap<Edytor, BookmarkPluginOptions['unfurl']>();
|
|
35
|
-
|
|
36
57
|
/** A preview's text field, trimmed and capped: it is stored in the document. */
|
|
37
58
|
const text = (value: unknown, max: number) =>
|
|
38
59
|
typeof value === 'string' && value.trim() ? value.trim().slice(0, max) : undefined;
|
|
@@ -56,39 +77,8 @@
|
|
|
56
77
|
*/
|
|
57
78
|
const UNFURL_ORIGIN = Symbol('edytor.bookmark.unfurl');
|
|
58
79
|
|
|
59
|
-
/**
|
|
60
|
-
|
|
61
|
-
* one data write outside the undo history (`UNFURL_ORIGIN`), when the
|
|
62
|
-
* block still is that bookmark in a view that may write.
|
|
63
|
-
*/
|
|
64
|
-
const fill = async (block: Block, url: string) => {
|
|
65
|
-
const unfurl = unfurlOf.get(block.edytor);
|
|
66
|
-
if (!unfurl || block.edytor.readonly) return;
|
|
67
|
-
let preview: BookmarkPreview | null | undefined;
|
|
68
|
-
try {
|
|
69
|
-
preview = await unfurl(url);
|
|
70
|
-
} catch {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const data = previewData(preview);
|
|
74
|
-
const { edytor, id } = block;
|
|
75
|
-
const live = edytor.idToBlock.get(id);
|
|
76
|
-
if (!Object.keys(data).length || !live?.isInTree || !edytor.dispatcher.permits()) return;
|
|
77
|
-
if (live.type !== 'bookmark' || edytor.facade.blockDataOf(id)?.url !== url) return;
|
|
78
|
-
const patches = Object.entries(data).map(([key, value]) => ({ path: [key], value }));
|
|
79
|
-
edytor.doc.transact(
|
|
80
|
-
() => edytor.facade.apply(edytor.facade.prepare.patchData(id, patches)),
|
|
81
|
-
UNFURL_ORIGIN
|
|
82
|
-
);
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
const bookmarkLink = (block: Block | undefined, value: string) => {
|
|
86
|
-
const url = safeWebUrl(value);
|
|
87
|
-
if (!block || !url) return false;
|
|
88
|
-
block.data.url = url;
|
|
89
|
-
void fill(block, url);
|
|
90
|
-
return true;
|
|
91
|
-
};
|
|
80
|
+
/** The view's card markup, if the app gave one. */
|
|
81
|
+
const cardOf = mediaControl('bookmark', 'card');
|
|
92
82
|
|
|
93
83
|
/**
|
|
94
84
|
* Notion's web bookmark: a card linking to a page, with its title,
|
|
@@ -96,95 +86,101 @@
|
|
|
96
86
|
* editable caption. Void: its only text is the caption. Pasting an
|
|
97
87
|
* `http(s)` link on an empty line offers "Bookmark".
|
|
98
88
|
*/
|
|
99
|
-
export const createBookmarkPlugin =
|
|
100
|
-
(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
89
|
+
export const createBookmarkPlugin = (options: BookmarkPluginOptions = {}): Plugin =>
|
|
90
|
+
mediaPlugin('bookmark', ['link', 'url', 'preview', 'unfurl'], (edytor) => {
|
|
91
|
+
/**
|
|
92
|
+
* Ask `unfurl` about `url` and store its answer on `block`, as one
|
|
93
|
+
* data write outside the undo history (`UNFURL_ORIGIN`), when the
|
|
94
|
+
* block still is that bookmark in a view that may write. The view's
|
|
95
|
+
* is the first bookmark plugin's listed (first wins, as for the
|
|
96
|
+
* kind): its store and its paste offer call this.
|
|
97
|
+
*/
|
|
98
|
+
const fill = async (block: Block, url: string) => {
|
|
99
|
+
const { unfurl } = options;
|
|
100
|
+
if (!unfurl || block.edytor.readonly) return;
|
|
101
|
+
let preview: BookmarkPreview | null | undefined;
|
|
102
|
+
try {
|
|
103
|
+
preview = await unfurl(url);
|
|
104
|
+
} catch {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const data = previewData(preview);
|
|
108
|
+
const { edytor, id } = block;
|
|
109
|
+
const live = edytor.idToBlock.get(id);
|
|
110
|
+
if (!Object.keys(data).length || !live?.isInTree || !edytor.dispatcher.permits()) return;
|
|
111
|
+
if (live.type !== 'bookmark' || edytor.facade.blockDataOf(id)?.url !== url) return;
|
|
112
|
+
const patches = Object.entries(data).map(([key, value]) => ({ path: [key], value }));
|
|
113
|
+
edytor.doc.transact(
|
|
114
|
+
() => edytor.facade.apply(edytor.facade.prepare.patchData(id, patches)),
|
|
115
|
+
UNFURL_ORIGIN
|
|
116
|
+
);
|
|
117
|
+
};
|
|
106
118
|
return {
|
|
107
|
-
|
|
119
|
+
card: options.card,
|
|
120
|
+
store: (block, value) => {
|
|
121
|
+
const url = safeWebUrl(value);
|
|
122
|
+
if (!url) return 'invalid';
|
|
123
|
+
block.edytor.patchData(block.id, [{ path: ['url'], value: url }]);
|
|
124
|
+
void fill(block, url);
|
|
125
|
+
return null;
|
|
126
|
+
},
|
|
127
|
+
hooks: urlPaste(
|
|
108
128
|
edytor,
|
|
109
129
|
{
|
|
110
130
|
type: 'bookmark',
|
|
111
|
-
|
|
112
|
-
icon: '🔖',
|
|
131
|
+
icon: MEDIA_ICONS.bookmark,
|
|
113
132
|
data: (url) => ({ url }),
|
|
114
133
|
created: (block, url) => void fill(block, url)
|
|
115
134
|
},
|
|
116
|
-
|
|
135
|
+
options.menu
|
|
117
136
|
),
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
html: (block, caption) => {
|
|
136
|
-
const url = safeWebUrl(block.data?.url);
|
|
137
|
-
const title = text(block.data?.title, 300) ?? url;
|
|
138
|
-
const link = url ? `<a href="${escapeHtml(url)}">${escapeHtml(title!)}</a>` : '';
|
|
139
|
-
return `<figure data-edytor-bookmark>${link}<figcaption>${caption}</figcaption></figure>`;
|
|
140
|
-
},
|
|
141
|
-
plain: (block, caption) =>
|
|
142
|
-
[safeWebUrl(block.data?.url), caption].filter(Boolean).join('\n'),
|
|
143
|
-
// Its own export: a `figure[data-edytor-bookmark]` holding the link.
|
|
144
|
-
parse: (el) => {
|
|
145
|
-
if (el.localName !== 'figure' || !el.hasAttribute('data-edytor-bookmark')) return;
|
|
146
|
-
const anchor = el.querySelector('a[href]');
|
|
147
|
-
const url = safeWebUrl(anchor?.getAttribute('href'));
|
|
148
|
-
const title = text(anchor?.textContent, 300);
|
|
149
|
-
return url ? { url, ...(title && title !== url ? { title } : {}) } : undefined;
|
|
150
|
-
}
|
|
137
|
+
record: {
|
|
138
|
+
snippet: bookmark,
|
|
139
|
+
html: (block, caption) => {
|
|
140
|
+
const url = safeWebUrl(block.data?.url);
|
|
141
|
+
const title = text(block.data?.title, 300) ?? url;
|
|
142
|
+
const link = url ? `<a href="${escapeHtml(url)}">${escapeHtml(title!)}</a>` : '';
|
|
143
|
+
return `<figure data-edytor-bookmark>${link}<figcaption>${caption}</figcaption></figure>`;
|
|
144
|
+
},
|
|
145
|
+
plain: (block, caption) =>
|
|
146
|
+
[safeWebUrl(block.data?.url), caption].filter(Boolean).join('\n'),
|
|
147
|
+
// Its own export: a `figure[data-edytor-bookmark]` holding the link.
|
|
148
|
+
parse: (el) => {
|
|
149
|
+
if (el.localName !== 'figure' || !el.hasAttribute('data-edytor-bookmark')) return;
|
|
150
|
+
const anchor = el.querySelector('a[href]');
|
|
151
|
+
const url = safeWebUrl(anchor?.getAttribute('href'));
|
|
152
|
+
const title = text(anchor?.textContent, 300);
|
|
153
|
+
return url ? { url, ...(title && title !== url ? { title } : {}) } : undefined;
|
|
151
154
|
}
|
|
152
155
|
}
|
|
153
156
|
};
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
/** The bookmark block, without unfurling: the card shows the URL. */
|
|
157
|
-
export const bookmarkPlugin = createBookmarkPlugin();
|
|
157
|
+
});
|
|
158
158
|
</script>
|
|
159
159
|
|
|
160
160
|
{#snippet bookmark({ block, content }: BlockSnippetPayload<Record<string, unknown>>)}
|
|
161
161
|
{@const url = safeWebUrl(block.data.url)}
|
|
162
162
|
{#if url}
|
|
163
|
-
{@const title = text(block.data.title, 300)}
|
|
164
|
-
{@const description = text(block.data.description, 1000)}
|
|
165
|
-
{@const image = safeWebUrl(block.data.image)}
|
|
166
|
-
{@const icon = safeWebUrl(block.data.icon)}
|
|
167
163
|
<div use:block.void data-edytor-bookmark>
|
|
168
|
-
<
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
164
|
+
<Control
|
|
165
|
+
own={cardOf}
|
|
166
|
+
{initial}
|
|
167
|
+
payload={{
|
|
168
|
+
block: block.handle,
|
|
169
|
+
url,
|
|
170
|
+
title: text(block.data.title, 300),
|
|
171
|
+
description: text(block.data.description, 1000),
|
|
172
|
+
image: safeWebUrl(block.data.image) ?? undefined,
|
|
173
|
+
icon: safeWebUrl(block.data.icon) ?? undefined,
|
|
174
|
+
link: mediaLink({ draggable: 'false' })
|
|
175
|
+
}}
|
|
176
|
+
/>
|
|
180
177
|
</div>
|
|
181
178
|
{:else}
|
|
182
179
|
<div use:block.void data-edytor-media-empty>
|
|
183
|
-
<
|
|
180
|
+
<EmptySlot
|
|
184
181
|
block={block.handle}
|
|
185
182
|
kind="bookmark"
|
|
186
|
-
|
|
187
|
-
link={(value) => bookmarkLink(block.handle, value)}
|
|
183
|
+
viewOf={(edytor) => mediaView(edytor, 'bookmark')}
|
|
188
184
|
/>
|
|
189
185
|
</div>
|
|
190
186
|
{/if}
|
|
@@ -192,3 +188,19 @@
|
|
|
192
188
|
<!-- svelte-ignore a11y_figcaption_parent -->
|
|
193
189
|
<figcaption>{@render content()}</figcaption>
|
|
194
190
|
{/snippet}
|
|
191
|
+
|
|
192
|
+
<!-- Notion's card: the page's title, description and URL (with its icon) beside its cover. -->
|
|
193
|
+
{#snippet initial({ url, title, description, image, icon, link }: BookmarkCardPayload)}
|
|
194
|
+
<a href={url} target="_blank" rel={LINK_REL} draggable="false" {@attach link}>
|
|
195
|
+
<span data-edytor-bookmark-text>
|
|
196
|
+
<span data-edytor-bookmark-title>{title ?? url}</span>
|
|
197
|
+
{#if description}<span data-edytor-bookmark-description>{description}</span>{/if}
|
|
198
|
+
<span data-edytor-bookmark-url>
|
|
199
|
+
{#if icon}<img src={icon} alt="" draggable="false" />{/if}<span>{url}</span>
|
|
200
|
+
</span>
|
|
201
|
+
</span>
|
|
202
|
+
{#if image}
|
|
203
|
+
<span data-edytor-bookmark-cover><img src={image} alt="" draggable="false" /></span>
|
|
204
|
+
{/if}
|
|
205
|
+
</a>
|
|
206
|
+
{/snippet}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { Plugin } from '../../plugins.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { type UrlPasteController } from './urlPaste.svelte.js';
|
|
4
|
+
import { type BookmarkCardPayload } from './media.js';
|
|
5
|
+
export type { BookmarkCardPayload };
|
|
3
6
|
/** What an `unfurl` answers about a page; every field optional. */
|
|
4
7
|
export type BookmarkPreview = {
|
|
5
8
|
title?: string;
|
|
@@ -16,10 +19,22 @@ export type BookmarkPluginOptions = {
|
|
|
16
19
|
* set from the panel or the paste menu; without it the card shows the URL.
|
|
17
20
|
*/
|
|
18
21
|
unfurl?: (url: string) => Promise<BookmarkPreview | null | undefined>;
|
|
19
|
-
/**
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* The menu a URL pasted on an empty line opens (Link, Embed, Bookmark);
|
|
24
|
+
* it renders while `controller.open`, under the line (without it, the
|
|
25
|
+
* link is kept and nothing shows). The
|
|
26
|
+
* view's one menu takes the first `menu` its embed and bookmark
|
|
27
|
+
* plugins pass. Its keys stay the editor's; keep its ARIA with
|
|
28
|
+
* `{@attach controller.popup}` on the list and
|
|
29
|
+
* `{@attach controller.option(index)}` on each row.
|
|
30
|
+
*/
|
|
31
|
+
menu?: Snippet<[UrlPasteController]>;
|
|
32
|
+
/**
|
|
33
|
+
* The card of a bookmark with a link (default: Notion's, the title,
|
|
34
|
+
* description and URL beside the cover): `<a href={card.url}
|
|
35
|
+
* {@attach card.link}>`. The first bookmark plugin listed in a view gives its card.
|
|
36
|
+
*/
|
|
37
|
+
card?: Snippet<[BookmarkCardPayload]>;
|
|
23
38
|
};
|
|
24
39
|
/**
|
|
25
40
|
* Notion's web bookmark: a card linking to a page, with its title,
|
|
@@ -28,8 +43,6 @@ export type BookmarkPluginOptions = {
|
|
|
28
43
|
* `http(s)` link on an empty line offers "Bookmark".
|
|
29
44
|
*/
|
|
30
45
|
export declare const createBookmarkPlugin: (options?: BookmarkPluginOptions) => Plugin;
|
|
31
|
-
/** The bookmark block, without unfurling: the card shows the URL. */
|
|
32
|
-
export declare const bookmarkPlugin: Plugin;
|
|
33
46
|
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> {
|
|
34
47
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
35
48
|
$$bindings?: Bindings;
|
|
@@ -1,48 +1,68 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import type { Plugin, BlockSnippetPayload } from '../../plugins.js';
|
|
3
3
|
import type { Block } from '../../block/block.svelte.js';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import { urlPaste } from './urlPaste.svelte.js';
|
|
8
|
-
import { keywordsOf, labelsWith, type PartialLabels } from '../../labels.js';
|
|
4
|
+
import EmptySlot from './EmptySlot.svelte';
|
|
5
|
+
import Control from '../Control.svelte';
|
|
6
|
+
import type { Snippet } from 'svelte';
|
|
7
|
+
import { urlPaste, type UrlPasteController } from './urlPaste.svelte.js';
|
|
9
8
|
import {
|
|
10
9
|
EMBED_ALLOW,
|
|
11
10
|
EMBED_PROVIDERS,
|
|
12
11
|
EMBED_SANDBOX,
|
|
12
|
+
MEDIA_ICONS,
|
|
13
13
|
claimed,
|
|
14
14
|
embedSourceOf,
|
|
15
|
-
mediaLabels,
|
|
16
15
|
escapeHtml,
|
|
16
|
+
mediaControl,
|
|
17
|
+
mediaLink,
|
|
18
|
+
LINK_REL,
|
|
19
|
+
mediaPlugin,
|
|
20
|
+
mediaView,
|
|
17
21
|
safeWebUrl,
|
|
22
|
+
type EmbedFallbackPayload,
|
|
18
23
|
type EmbedProvider
|
|
19
24
|
} from './media.js';
|
|
20
25
|
|
|
21
|
-
export {
|
|
26
|
+
export {
|
|
27
|
+
EMBED_ALLOW,
|
|
28
|
+
EMBED_PROVIDERS,
|
|
29
|
+
EMBED_SANDBOX,
|
|
30
|
+
embedSourceOf,
|
|
31
|
+
type EmbedFallbackPayload,
|
|
32
|
+
type EmbedProvider
|
|
33
|
+
};
|
|
22
34
|
|
|
23
35
|
export type EmbedPluginOptions = {
|
|
24
36
|
/** The allowlist (default {@link EMBED_PROVIDERS}); a link none of them plays shows no frame. */
|
|
25
37
|
providers?: readonly EmbedProvider[];
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
38
|
+
/**
|
|
39
|
+
* The menu a URL pasted on an empty line opens (Link, Embed, Bookmark);
|
|
40
|
+
* it renders while `controller.open`, under the line (without it, the
|
|
41
|
+
* link is kept and nothing shows). The
|
|
42
|
+
* view's one menu takes the first `menu` its embed and bookmark
|
|
43
|
+
* plugins pass. Its keys stay the editor's; keep its ARIA with
|
|
44
|
+
* `{@attach controller.popup}` on the list and
|
|
45
|
+
* `{@attach controller.option(index)}` on each row.
|
|
46
|
+
*/
|
|
47
|
+
menu?: Snippet<[UrlPasteController]>;
|
|
48
|
+
/**
|
|
49
|
+
* An embed whose link no allowed provider plays (a peer may store any),
|
|
50
|
+
* or a suggestion's preview: a plain link, never a frame (default: the
|
|
51
|
+
* URL as a link): `<a href={fallback.url} {@attach fallback.link}>`. The first embed
|
|
52
|
+
* plugin listed in a view gives it.
|
|
53
|
+
*/
|
|
54
|
+
fallback?: Snippet<[EmbedFallbackPayload]>;
|
|
30
55
|
};
|
|
31
56
|
|
|
32
|
-
|
|
57
|
+
/** The view's fallback markup, if the app gave one. */
|
|
58
|
+
const fallbackOf = mediaControl('embed', 'fallback');
|
|
59
|
+
|
|
33
60
|
/**
|
|
34
61
|
* The view's allowlist: the first embed plugin listed in it (first wins,
|
|
35
62
|
* as for the kind). Never a broader list: no entry plays nothing.
|
|
36
63
|
*/
|
|
37
|
-
const providers = (block: Block | undefined) =>
|
|
38
|
-
|
|
39
|
-
/** Store `value` as the block's link when a provider plays it; answers whether it did. */
|
|
40
|
-
const embedLink = (block: Block | undefined, value: string) => {
|
|
41
|
-
const url = safeWebUrl(value);
|
|
42
|
-
if (!block || !url || !embedSourceOf(url, providers(block))) return false;
|
|
43
|
-
block.data.url = url;
|
|
44
|
-
return true;
|
|
45
|
-
};
|
|
64
|
+
const providers = (block: Block | undefined) =>
|
|
65
|
+
mediaView(block?.edytor, 'embed')?.providers ?? [];
|
|
46
66
|
|
|
47
67
|
/**
|
|
48
68
|
* Notion's embed block: an "Embed a link" panel until it has a link, then
|
|
@@ -53,66 +73,54 @@
|
|
|
53
73
|
* text is the caption. Pasting a link a provider plays on an empty line
|
|
54
74
|
* offers "Embed".
|
|
55
75
|
*/
|
|
56
|
-
export const createEmbedPlugin =
|
|
57
|
-
|
|
58
|
-
(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
76
|
+
export const createEmbedPlugin = (options: EmbedPluginOptions = {}): Plugin => {
|
|
77
|
+
const allowed = options.providers ?? EMBED_PROVIDERS;
|
|
78
|
+
return mediaPlugin(
|
|
79
|
+
'embed',
|
|
80
|
+
['iframe', 'youtube', 'vimeo', 'loom', 'figma', 'codepen', 'spotify'],
|
|
81
|
+
(edytor) => ({
|
|
82
|
+
providers: allowed,
|
|
83
|
+
fallback: options.fallback,
|
|
84
|
+
// The block's link, when a provider plays it.
|
|
85
|
+
store: (block, value) => {
|
|
86
|
+
const url = safeWebUrl(value);
|
|
87
|
+
if (!url || !embedSourceOf(url, allowed)) return 'invalid';
|
|
88
|
+
block.edytor.patchData(block.id, [{ path: ['url'], value: url }]);
|
|
89
|
+
return null;
|
|
90
|
+
},
|
|
91
|
+
hooks: urlPaste(
|
|
65
92
|
edytor,
|
|
66
93
|
{
|
|
67
94
|
type: 'embed',
|
|
68
|
-
|
|
69
|
-
icon: '⧉',
|
|
95
|
+
icon: MEDIA_ICONS.embed,
|
|
70
96
|
data: (url) => (embedSourceOf(url, allowed) ? { url } : null)
|
|
71
97
|
},
|
|
72
|
-
|
|
98
|
+
options.menu
|
|
73
99
|
),
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
{
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const url = safeWebUrl(block.data?.url);
|
|
94
|
-
const media = player
|
|
95
|
-
? `<iframe src="${escapeHtml(player.src)}" title="${escapeHtml(player.provider.name)}" sandbox="${EMBED_SANDBOX}" allowfullscreen></iframe>`
|
|
96
|
-
: url
|
|
97
|
-
? `<a href="${escapeHtml(url)}">${escapeHtml(url)}</a>`
|
|
98
|
-
: '';
|
|
99
|
-
return `<figure>${media}<figcaption>${caption}</figcaption></figure>`;
|
|
100
|
-
},
|
|
101
|
-
plain: (block, caption) =>
|
|
102
|
-
[safeWebUrl(block.data?.url), caption].filter(Boolean).join('\n'),
|
|
103
|
-
// An allowlisted `iframe` (bare, or in a `figure`): its `src` is the link.
|
|
104
|
-
parse: (el) => {
|
|
105
|
-
const src = claimed(el, 'iframe')?.getAttribute('src');
|
|
106
|
-
const url = embedSourceOf(src, allowed) && safeWebUrl(src);
|
|
107
|
-
return url ? { url } : undefined;
|
|
108
|
-
}
|
|
100
|
+
record: {
|
|
101
|
+
snippet: embed,
|
|
102
|
+
html: (block, caption) => {
|
|
103
|
+
const player = embedSourceOf(block.data?.url, allowed);
|
|
104
|
+
const url = safeWebUrl(block.data?.url);
|
|
105
|
+
const media = player
|
|
106
|
+
? `<iframe src="${escapeHtml(player.src)}" title="${escapeHtml(player.provider.name)}" sandbox="${EMBED_SANDBOX}" allowfullscreen></iframe>`
|
|
107
|
+
: url
|
|
108
|
+
? `<a href="${escapeHtml(url)}">${escapeHtml(url)}</a>`
|
|
109
|
+
: '';
|
|
110
|
+
return `<figure>${media}<figcaption>${caption}</figcaption></figure>`;
|
|
111
|
+
},
|
|
112
|
+
plain: (block, caption) =>
|
|
113
|
+
[safeWebUrl(block.data?.url), caption].filter(Boolean).join('\n'),
|
|
114
|
+
// An allowlisted `iframe` (bare, or in a `figure`): its `src` is the link.
|
|
115
|
+
parse: (el) => {
|
|
116
|
+
const src = claimed(el, 'iframe')?.getAttribute('src');
|
|
117
|
+
const url = embedSourceOf(src, allowed) && safeWebUrl(src);
|
|
118
|
+
return url ? { url } : undefined;
|
|
109
119
|
}
|
|
110
120
|
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
/** The embed block with the default providers. */
|
|
115
|
-
export const embedPlugin = createEmbedPlugin();
|
|
121
|
+
})
|
|
122
|
+
);
|
|
123
|
+
};
|
|
116
124
|
</script>
|
|
117
125
|
|
|
118
126
|
{#snippet embed({ block, content }: BlockSnippetPayload<{ url?: string }>)}
|
|
@@ -141,15 +149,18 @@
|
|
|
141
149
|
<!-- A link no provider plays (a peer may store any), or a suggestion's preview (no handle, so no
|
|
142
150
|
view's allowlist): a plain link, never a frame. -->
|
|
143
151
|
<div use:block.void data-edytor-embed-unsupported>
|
|
144
|
-
<
|
|
152
|
+
<Control
|
|
153
|
+
own={fallbackOf}
|
|
154
|
+
{initial}
|
|
155
|
+
payload={{ block: block.handle, url, link: mediaLink() }}
|
|
156
|
+
/>
|
|
145
157
|
</div>
|
|
146
158
|
{:else}
|
|
147
159
|
<div use:block.void data-edytor-media-empty>
|
|
148
|
-
<
|
|
160
|
+
<EmptySlot
|
|
149
161
|
block={block.handle}
|
|
150
162
|
kind="embed"
|
|
151
|
-
|
|
152
|
-
link={(value) => embedLink(block.handle, value)}
|
|
163
|
+
viewOf={(edytor) => mediaView(edytor, 'embed')}
|
|
153
164
|
/>
|
|
154
165
|
</div>
|
|
155
166
|
{/if}
|
|
@@ -157,3 +168,8 @@
|
|
|
157
168
|
<!-- svelte-ignore a11y_figcaption_parent -->
|
|
158
169
|
<figcaption>{@render content()}</figcaption>
|
|
159
170
|
{/snippet}
|
|
171
|
+
|
|
172
|
+
<!-- The link itself. -->
|
|
173
|
+
{#snippet initial({ url, link }: EmbedFallbackPayload)}
|
|
174
|
+
<a href={url} target="_blank" rel={LINK_REL} {@attach link}>{url}</a>
|
|
175
|
+
{/snippet}
|
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
import type { Plugin } from '../../plugins.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { type UrlPasteController } from './urlPaste.svelte.js';
|
|
4
|
+
import { EMBED_ALLOW, EMBED_PROVIDERS, EMBED_SANDBOX, embedSourceOf, type EmbedFallbackPayload, type EmbedProvider } from './media.js';
|
|
5
|
+
export { EMBED_ALLOW, EMBED_PROVIDERS, EMBED_SANDBOX, embedSourceOf, type EmbedFallbackPayload, type EmbedProvider };
|
|
5
6
|
export type EmbedPluginOptions = {
|
|
6
7
|
/** The allowlist (default {@link EMBED_PROVIDERS}); a link none of them plays shows no frame. */
|
|
7
8
|
providers?: readonly EmbedProvider[];
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
/**
|
|
10
|
+
* The menu a URL pasted on an empty line opens (Link, Embed, Bookmark);
|
|
11
|
+
* it renders while `controller.open`, under the line (without it, the
|
|
12
|
+
* link is kept and nothing shows). The
|
|
13
|
+
* view's one menu takes the first `menu` its embed and bookmark
|
|
14
|
+
* plugins pass. Its keys stay the editor's; keep its ARIA with
|
|
15
|
+
* `{@attach controller.popup}` on the list and
|
|
16
|
+
* `{@attach controller.option(index)}` on each row.
|
|
17
|
+
*/
|
|
18
|
+
menu?: Snippet<[UrlPasteController]>;
|
|
19
|
+
/**
|
|
20
|
+
* An embed whose link no allowed provider plays (a peer may store any),
|
|
21
|
+
* or a suggestion's preview: a plain link, never a frame (default: the
|
|
22
|
+
* URL as a link): `<a href={fallback.url} {@attach fallback.link}>`. The first embed
|
|
23
|
+
* plugin listed in a view gives it.
|
|
24
|
+
*/
|
|
25
|
+
fallback?: Snippet<[EmbedFallbackPayload]>;
|
|
12
26
|
};
|
|
13
27
|
/**
|
|
14
28
|
* Notion's embed block: an "Embed a link" panel until it has a link, then
|
|
@@ -20,8 +34,6 @@ export type EmbedPluginOptions = {
|
|
|
20
34
|
* offers "Embed".
|
|
21
35
|
*/
|
|
22
36
|
export declare const createEmbedPlugin: (options?: EmbedPluginOptions) => Plugin;
|
|
23
|
-
/** The embed block with the default providers. */
|
|
24
|
-
export declare const embedPlugin: Plugin;
|
|
25
37
|
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> {
|
|
26
38
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
27
39
|
$$bindings?: Bindings;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { Component, Snippet } from 'svelte';
|
|
3
|
+
import type { Block } from '../../block/block.svelte.js';
|
|
4
|
+
import type { Edytor } from '../../edytor.svelte.js';
|
|
5
|
+
import type { MediaKind } from './media.js';
|
|
6
|
+
import type { EmptyView, MediaEmptyController } from './empty.svelte.js';
|
|
7
|
+
|
|
8
|
+
/** What an empty image or media block renders in its view: the media empty plugin's host and snippet. */
|
|
9
|
+
type EmptyHost = {
|
|
10
|
+
Host: Component<{
|
|
11
|
+
block: Block | undefined;
|
|
12
|
+
kind: MediaKind | 'image';
|
|
13
|
+
viewOf: (edytor: Edytor | undefined) => EmptyView | undefined;
|
|
14
|
+
empty: Snippet<[MediaEmptyController]>;
|
|
15
|
+
}>;
|
|
16
|
+
empty: Snippet<[MediaEmptyController]>;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** Each view's empty-block chrome (the first media empty plugin listed claims it). */
|
|
20
|
+
export const emptyHosts = new WeakMap<object, EmptyHost>();
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<script lang="ts">
|
|
24
|
+
import { getContext, untrack } from 'svelte';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Where an empty image or media block shows its empty state: the view's
|
|
28
|
+
* media empty plugin's host, when one is listed (else nothing). The view
|
|
29
|
+
* rendering it is the block's, or a suggestion preview's.
|
|
30
|
+
*/
|
|
31
|
+
let {
|
|
32
|
+
block,
|
|
33
|
+
kind,
|
|
34
|
+
viewOf
|
|
35
|
+
}: {
|
|
36
|
+
block: Block | undefined;
|
|
37
|
+
kind: MediaKind | 'image';
|
|
38
|
+
viewOf: (edytor: Edytor | undefined) => EmptyView | undefined;
|
|
39
|
+
} = $props();
|
|
40
|
+
const view = getContext<Edytor>('edytor');
|
|
41
|
+
const host = untrack(() => emptyHosts.get(block?.edytor ?? view));
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
{#if host}<host.Host {block} {kind} {viewOf} empty={host.empty} />{/if}
|