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,31 +1,60 @@
|
|
|
1
|
+
import { attach } from '../chrome.js';
|
|
2
|
+
import { mediaKinds } from '../../crdt/semantics.js';
|
|
1
3
|
import { sanitizeLinkHref } from '../richtext/richTextOperations.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
+
import { escapeHtml } from '../../clipboard/serializeClipboardFragment.js';
|
|
5
|
+
import { keywordsOf, labelsOf, mediaEnglish } from '../../labels.js';
|
|
6
|
+
import { MEDIA_ICONS } from './empty.svelte.js';
|
|
7
|
+
export { MEDIA_ICONS };
|
|
8
|
+
/** A media block's link opens a new tab without the opener (and tells the target nothing). */
|
|
9
|
+
export const LINK_REL = 'noopener noreferrer nofollow';
|
|
4
10
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
11
|
+
* A media block's link's attachment: a new tab without the opener
|
|
12
|
+
* (`target`, `rel`), and `own` (`draggable="false"`: no drag of its own; a
|
|
13
|
+
* file's `download` name). The default markup writes the same, so a server
|
|
14
|
+
* render's link is safe too; its `href` is the markup's.
|
|
7
15
|
*/
|
|
8
|
-
export const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
15
|
-
const empties = new WeakMap();
|
|
16
|
+
export const mediaLink = (own = {}) => attach({ target: '_blank', rel: LINK_REL, ...own });
|
|
17
|
+
/** The app's markup for a media kind's own control in `view`, if any. */
|
|
18
|
+
export const mediaControl = (kind, control) => (view) => mediaView(view, kind)?.[control];
|
|
19
|
+
const views = new WeakMap();
|
|
20
|
+
/** The view's media kind, when a plugin of it is listed there. */
|
|
21
|
+
export const mediaView = (edytor, kind) => edytor && views.get(edytor)?.[kind];
|
|
16
22
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
23
|
+
* A media kind's plugin (Notion's): a void `figure` with an editable
|
|
24
|
+
* caption, its preset (its icon, `keywords`, its name in the view's
|
|
25
|
+
* `media` labels), and its view
|
|
26
|
+
* (`MediaView`), which the first plugin of the kind listed claims. `own`
|
|
27
|
+
* answers the kind's own parts: how it stores a source, its hooks and its
|
|
28
|
+
* record (its snippet, its export and import); `claims` says whether this
|
|
29
|
+
* plugin claimed the kind in `edytor`.
|
|
19
30
|
*/
|
|
20
|
-
export const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
export const mediaPlugin = (kind, keywords, own) => (edytor) => {
|
|
32
|
+
const kinds = edytor && (views.get(edytor) ?? {});
|
|
33
|
+
const claims = !!kinds && !kinds[kind];
|
|
34
|
+
const { hooks, record, ...view } = own(edytor, claims);
|
|
35
|
+
if (claims)
|
|
36
|
+
views.set(edytor, {
|
|
37
|
+
...kinds,
|
|
38
|
+
[kind]: view
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
...hooks,
|
|
42
|
+
blocks: {
|
|
43
|
+
[kind]: {
|
|
44
|
+
...mediaKinds[kind],
|
|
45
|
+
element: 'figure',
|
|
46
|
+
presets: [
|
|
47
|
+
{
|
|
48
|
+
label: labelsOf(edytor, 'media', mediaEnglish)[kind],
|
|
49
|
+
icon: MEDIA_ICONS[kind],
|
|
50
|
+
keywords: keywordsOf(edytor, `block.${kind}`, keywords),
|
|
51
|
+
group: 'Media'
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
...record
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
29
58
|
};
|
|
30
59
|
/**
|
|
31
60
|
* A web page's URL a media block may store or render: the link sanitizer's
|
|
@@ -61,10 +90,9 @@ export const EMBED_SANDBOX = 'allow-scripts allow-same-origin allow-popups allow
|
|
|
61
90
|
/** The frame's permissions (`allow`): what a player needs, nothing that reads the viewer. */
|
|
62
91
|
export const EMBED_ALLOW = 'fullscreen; picture-in-picture; encrypted-media; clipboard-write';
|
|
63
92
|
const ID = /^[\w-]{1,128}$/;
|
|
64
|
-
const
|
|
65
|
-
/** `
|
|
66
|
-
const
|
|
67
|
-
const youtubeHost = hostIs('youtube.com', 'www.youtube.com', 'm.youtube.com', 'music.youtube.com', 'www.youtube-nocookie.com');
|
|
93
|
+
const HASH = /^[\da-f]{1,32}$/i;
|
|
94
|
+
/** `url`'s path segments (empty ones dropped) when its host is one of `hosts`, else none. */
|
|
95
|
+
const on = (url, ...hosts) => hosts.includes(url.hostname.toLowerCase()) ? url.pathname.split('/').filter(Boolean) : [];
|
|
68
96
|
/** A YouTube start time (`t=42`, `t=42s`, `start=42`) in seconds. */
|
|
69
97
|
const youtubeStart = (url) => {
|
|
70
98
|
const t = url.searchParams.get('t') ?? url.searchParams.get('start');
|
|
@@ -73,16 +101,14 @@ const youtubeStart = (url) => {
|
|
|
73
101
|
const youtube = {
|
|
74
102
|
name: 'YouTube',
|
|
75
103
|
embed: (url) => {
|
|
76
|
-
const [first, second] =
|
|
104
|
+
const [first, second] = on(url, 'youtu.be', 'youtube.com', 'www.youtube.com', 'm.youtube.com', 'music.youtube.com', 'www.youtube-nocookie.com');
|
|
77
105
|
const id = url.hostname.toLowerCase() === 'youtu.be'
|
|
78
106
|
? first
|
|
79
|
-
:
|
|
80
|
-
?
|
|
81
|
-
: first
|
|
82
|
-
?
|
|
83
|
-
:
|
|
84
|
-
? second
|
|
85
|
-
: undefined;
|
|
107
|
+
: first === 'watch'
|
|
108
|
+
? url.searchParams.get('v')
|
|
109
|
+
: first && ['shorts', 'embed', 'live'].includes(first)
|
|
110
|
+
? second
|
|
111
|
+
: undefined;
|
|
86
112
|
return id && /^[\w-]{11}$/.test(id)
|
|
87
113
|
? `https://www.youtube-nocookie.com/embed/${id}${youtubeStart(url)}`
|
|
88
114
|
: null;
|
|
@@ -91,26 +117,19 @@ const youtube = {
|
|
|
91
117
|
const vimeo = {
|
|
92
118
|
name: 'Vimeo',
|
|
93
119
|
embed: (url) => {
|
|
94
|
-
const
|
|
95
|
-
const [id, hash] =
|
|
96
|
-
? parts
|
|
97
|
-
: hostIs('player.vimeo.com')(url) && parts[0] === 'video'
|
|
98
|
-
? parts.slice(1)
|
|
99
|
-
: [];
|
|
120
|
+
const [player, ...video] = on(url, 'player.vimeo.com');
|
|
121
|
+
const [id, hash] = player === 'video' ? video : on(url, 'vimeo.com', 'www.vimeo.com');
|
|
100
122
|
if (!id || !/^\d{1,12}$/.test(id))
|
|
101
123
|
return null;
|
|
102
|
-
const h = hash &&
|
|
103
|
-
return `https://player.vimeo.com/video/${id}${h &&
|
|
124
|
+
const h = hash && HASH.test(hash) ? hash : url.searchParams.get('h');
|
|
125
|
+
return `https://player.vimeo.com/video/${id}${h && HASH.test(h) ? `?h=${h}` : ''}`;
|
|
104
126
|
}
|
|
105
127
|
};
|
|
106
128
|
const loom = {
|
|
107
129
|
name: 'Loom',
|
|
108
130
|
embed: (url) => {
|
|
109
|
-
const [kind, id] =
|
|
110
|
-
return
|
|
111
|
-
(kind === 'share' || kind === 'embed') &&
|
|
112
|
-
id &&
|
|
113
|
-
/^[\da-f]{32}$/i.test(id)
|
|
131
|
+
const [kind, id] = on(url, 'loom.com', 'www.loom.com');
|
|
132
|
+
return (kind === 'share' || kind === 'embed') && id && /^[\da-f]{32}$/i.test(id)
|
|
114
133
|
? `https://www.loom.com/embed/${id}`
|
|
115
134
|
: null;
|
|
116
135
|
}
|
|
@@ -118,24 +137,19 @@ const loom = {
|
|
|
118
137
|
const figma = {
|
|
119
138
|
name: 'Figma',
|
|
120
139
|
embed: (url) => {
|
|
121
|
-
const [kind, key] =
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
140
|
+
const [kind, key] = on(url, 'figma.com', 'www.figma.com');
|
|
141
|
+
return key &&
|
|
142
|
+
ID.test(key) &&
|
|
143
|
+
['file', 'design', 'proto', 'board', 'slides', 'deck'].includes(kind)
|
|
144
|
+
? `https://www.figma.com/embed?embed_host=edytor&url=${encodeURIComponent(url.href)}`
|
|
145
|
+
: null;
|
|
127
146
|
}
|
|
128
147
|
};
|
|
129
148
|
const codepen = {
|
|
130
149
|
name: 'CodePen',
|
|
131
150
|
embed: (url) => {
|
|
132
|
-
const [user, kind, id] =
|
|
133
|
-
return
|
|
134
|
-
user &&
|
|
135
|
-
ID.test(user) &&
|
|
136
|
-
(kind === 'pen' || kind === 'embed') &&
|
|
137
|
-
id &&
|
|
138
|
-
ID.test(id)
|
|
151
|
+
const [user, kind, id] = on(url, 'codepen.io');
|
|
152
|
+
return user && ID.test(user) && (kind === 'pen' || kind === 'embed') && id && ID.test(id)
|
|
139
153
|
? `https://codepen.io/${user}/embed/${id}?default-tab=result`
|
|
140
154
|
: null;
|
|
141
155
|
},
|
|
@@ -144,9 +158,7 @@ const codepen = {
|
|
|
144
158
|
const spotify = {
|
|
145
159
|
name: 'Spotify',
|
|
146
160
|
embed: (url) => {
|
|
147
|
-
let parts =
|
|
148
|
-
if (!hostIs('open.spotify.com')(url))
|
|
149
|
-
return null;
|
|
161
|
+
let parts = on(url, 'open.spotify.com');
|
|
150
162
|
if (parts[0] === 'embed' || /^intl-[a-z-]+$/i.test(parts[0] ?? ''))
|
|
151
163
|
parts = parts.slice(1);
|
|
152
164
|
const [kind, id] = parts;
|
|
@@ -237,38 +249,4 @@ export const claimed = (element, tag) => {
|
|
|
237
249
|
};
|
|
238
250
|
/** An imported `video`'s or `audio`'s source: its `src`, else its first `source`'s. */
|
|
239
251
|
export const mediaSourceOf = (element) => safeMediaSrc(element?.getAttribute('src') ?? element?.querySelector('source[src]')?.getAttribute('src'));
|
|
240
|
-
|
|
241
|
-
export const escapeHtml = (value) => value.replace(/[&<>"']/g, (c) => `&#${c.charCodeAt(0)};`);
|
|
242
|
-
/** The files each media kind takes: a video, an audio track, any other file. */
|
|
243
|
-
const ACCEPTS = {
|
|
244
|
-
video: (file) => /^video\//i.test(file.type),
|
|
245
|
-
audio: (file) => /^audio\//i.test(file.type),
|
|
246
|
-
file: () => true
|
|
247
|
-
};
|
|
248
|
-
/**
|
|
249
|
-
* Register `type`'s uploads on the view's (`media.files`): with an
|
|
250
|
-
* `upload`, the files it takes (the file kind: any no other kind takes)
|
|
251
|
-
* become its blocks. Answers the paste hook to list, or `undefined`
|
|
252
|
-
* without an `upload` or a view.
|
|
253
|
-
*/
|
|
254
|
-
export const mediaUploads = (edytor, type, upload) => {
|
|
255
|
-
const uploads = upload ? fileUploads(edytor) : undefined;
|
|
256
|
-
if (!uploads || !upload)
|
|
257
|
-
return undefined;
|
|
258
|
-
uploads.register({
|
|
259
|
-
type,
|
|
260
|
-
accepts: ACCEPTS[type],
|
|
261
|
-
fallback: type === 'file',
|
|
262
|
-
upload,
|
|
263
|
-
data: (file, answer) => {
|
|
264
|
-
const src = safeMediaSrc(answer);
|
|
265
|
-
if (!src)
|
|
266
|
-
return null;
|
|
267
|
-
return type === 'file'
|
|
268
|
-
? { src, name: file.name || fileNameOf(src), size: file.size }
|
|
269
|
-
: { src };
|
|
270
|
-
},
|
|
271
|
-
filled: (data) => safeMediaSrc(data.src) !== null
|
|
272
|
-
});
|
|
273
|
-
return uploads.paste;
|
|
274
|
-
};
|
|
252
|
+
export { escapeHtml };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* Loaded by the preview's module: a file uploading, drawn by the plugin when
|
|
2
|
+
the view has no empty markup (`createMediaEmptyPlugin`). */
|
|
3
|
+
[data-edytor-upload] {
|
|
4
|
+
display: flex;
|
|
5
|
+
position: relative;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
gap: 6px;
|
|
8
|
+
}
|
|
9
|
+
[data-edytor-upload] img {
|
|
10
|
+
display: block;
|
|
11
|
+
max-width: 100%;
|
|
12
|
+
}
|
|
13
|
+
[data-edytor-upload] progress {
|
|
14
|
+
width: 100%;
|
|
15
|
+
height: 4px;
|
|
16
|
+
}
|
|
17
|
+
[data-edytor-upload-image] progress {
|
|
18
|
+
position: absolute;
|
|
19
|
+
right: 8px;
|
|
20
|
+
bottom: 8px;
|
|
21
|
+
left: 8px;
|
|
22
|
+
width: auto;
|
|
23
|
+
}
|
|
@@ -1,27 +1,22 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
|
-
import type { Attachment } from 'svelte/attachments';
|
|
3
2
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
4
3
|
import type { Block } from '../../block/block.svelte.js';
|
|
5
4
|
import type { PluginDefinitions, PluginOperations } from '../../plugins.js';
|
|
6
5
|
import type { SerializableContent } from '../../utils/json.js';
|
|
7
|
-
import {
|
|
8
|
-
import { type OptionAttributes } from '../chrome.js';
|
|
6
|
+
import { ChromeList } from '../list.svelte.js';
|
|
9
7
|
/** A kind a pasted URL can turn its line into (the embed's, the bookmark's). */
|
|
10
8
|
export type UrlPasteOffer = {
|
|
11
9
|
/** The kind the line becomes. */
|
|
12
10
|
type: string;
|
|
13
|
-
/** The menu row. */
|
|
14
|
-
label: string;
|
|
15
11
|
icon: string;
|
|
16
12
|
/** The block's data for `url`, or `null` when this kind takes no such URL (no provider plays it). */
|
|
17
13
|
data: (url: string) => Record<string, SerializableContent> | null;
|
|
18
14
|
/** After the line became the kind (a bookmark's unfurl). */
|
|
19
15
|
created?: (block: Block, url: string) => void;
|
|
20
16
|
};
|
|
21
|
-
/** One row of the menu: keep the link, or an offer. */
|
|
17
|
+
/** One row of the menu: keep the link (`link`), or an offer (its kind). */
|
|
22
18
|
export type UrlPasteOption = {
|
|
23
19
|
id: string;
|
|
24
|
-
label: string;
|
|
25
20
|
icon: string;
|
|
26
21
|
offer?: UrlPasteOffer;
|
|
27
22
|
};
|
|
@@ -37,11 +32,8 @@ export type UrlPasteOption = {
|
|
|
37
32
|
* One controller per view, shared by the plugins that make offers: the
|
|
38
33
|
* first one listed carries its hooks (`urlPaste`).
|
|
39
34
|
*/
|
|
40
|
-
export declare class UrlPasteController {
|
|
35
|
+
export declare class UrlPasteController extends ChromeList {
|
|
41
36
|
#private;
|
|
42
|
-
readonly edytor: Edytor;
|
|
43
|
-
/** The words the menu shows: the labels of the plugin that made the first offer. */
|
|
44
|
-
readonly labels: MediaLabels;
|
|
45
37
|
readonly offers: UrlPasteOffer[];
|
|
46
38
|
/** The open menu: the line, the URL, the rows. */
|
|
47
39
|
open: {
|
|
@@ -49,33 +41,10 @@ export declare class UrlPasteController {
|
|
|
49
41
|
url: string;
|
|
50
42
|
options: UrlPasteOption[];
|
|
51
43
|
} | null;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
constructor(edytor: Edytor,
|
|
55
|
-
/** The words the menu shows: the labels of the plugin that made the first offer. */
|
|
56
|
-
labels?: MediaLabels);
|
|
44
|
+
constructor(edytor: Edytor);
|
|
45
|
+
protected get count(): number;
|
|
57
46
|
get readonly(): boolean;
|
|
58
|
-
/** The listbox's element id (page-unique), for `aria-controls`. */
|
|
59
|
-
get listId(): string;
|
|
60
|
-
/** The element id of the row at `index` (page-unique), for `aria-activedescendant`. */
|
|
61
|
-
optionId: (index: number) => string;
|
|
62
|
-
/**
|
|
63
|
-
* The attributes of the row at `index`: spread them on its element
|
|
64
|
-
* (`{...controller.option(index)}`): its id, `role="option"`,
|
|
65
|
-
* `aria-selected` and `data-selected` for the keyboard's row.
|
|
66
|
-
*/
|
|
67
|
-
option: (index: number) => OptionAttributes;
|
|
68
|
-
/**
|
|
69
|
-
* The listbox (`{@attach controller.popup}`): it takes the menu's id, its
|
|
70
|
-
* `listbox` role and name unless it has its own, keeps the editor's focus
|
|
71
|
-
* on a press, and is published to the view's root (`edytor.popups`) with
|
|
72
|
-
* its highlighted row while the menu is open: the editor keeps the
|
|
73
|
-
* keyboard (its keys move and pick).
|
|
74
|
-
*/
|
|
75
|
-
popup: Attachment<HTMLElement>;
|
|
76
47
|
close: () => void;
|
|
77
|
-
/** Move the keyboard's row; answers whether the menu took the key. */
|
|
78
|
-
move: (step: number) => boolean;
|
|
79
48
|
/** Pick a row: keep the link, or turn the line into the offer's kind. */
|
|
80
49
|
pick: (option?: UrlPasteOption | undefined) => void;
|
|
81
50
|
}
|
|
@@ -86,4 +55,4 @@ export declare class UrlPasteController {
|
|
|
86
55
|
* per kind: the first listed wins, as its definition does (a plugin listed
|
|
87
56
|
* twice offers once). The menu's markup is the first `menu` passed.
|
|
88
57
|
*/
|
|
89
|
-
export declare const urlPaste: (edytor: Edytor, offer: UrlPasteOffer,
|
|
58
|
+
export declare const urlPaste: (edytor: Edytor, offer: UrlPasteOffer, menu?: Snippet<[UrlPasteController]>) => PluginOperations & PluginDefinitions;
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { placeNear } from '../../surface/overlay.js';
|
|
2
2
|
import { onPress } from '../../events/onFocus.js';
|
|
3
|
-
import {
|
|
4
|
-
import { id } from '../../utils.js';
|
|
3
|
+
import { convertToKind, holdsNothing } from '../../kinds.js';
|
|
5
4
|
import { pastedLink } from '../richtext/richTextOperations.js';
|
|
6
5
|
import { safeWebUrl } from './media.js';
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import { identify, inPage, keepFocus, optionAttributes } from '../chrome.js';
|
|
6
|
+
import { mountChrome } from '../chrome.js';
|
|
7
|
+
import { ChromeList, inPage, listHotkeys } from '../list.svelte.js';
|
|
10
8
|
/**
|
|
11
9
|
* Pasting a bare URL on an empty line (Notion): the URL lands as a link at
|
|
12
10
|
* once (one `insertFromPaste` step, its own undo step) and a menu under the
|
|
@@ -19,19 +17,15 @@ import { identify, inPage, keepFocus, optionAttributes } from '../chrome.js';
|
|
|
19
17
|
* One controller per view, shared by the plugins that make offers: the
|
|
20
18
|
* first one listed carries its hooks (`urlPaste`).
|
|
21
19
|
*/
|
|
22
|
-
export class UrlPasteController {
|
|
23
|
-
edytor;
|
|
24
|
-
labels;
|
|
20
|
+
export class UrlPasteController extends ChromeList {
|
|
25
21
|
offers = [];
|
|
26
22
|
/** The open menu: the line, the URL, the rows. */
|
|
27
23
|
open = $state(null);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
this.edytor = edytor;
|
|
34
|
-
this.labels = labels;
|
|
24
|
+
constructor(edytor) {
|
|
25
|
+
super(edytor, 'url-paste', 'listbox', (node) => this.open && { active: inPage(node, this.rowId(this.index)) });
|
|
26
|
+
}
|
|
27
|
+
get count() {
|
|
28
|
+
return this.open?.options.length ?? 0;
|
|
35
29
|
}
|
|
36
30
|
get readonly() {
|
|
37
31
|
return this.edytor.readonly;
|
|
@@ -42,41 +36,10 @@ export class UrlPasteController {
|
|
|
42
36
|
claimMenu(menu) {
|
|
43
37
|
this.#menu ??= menu;
|
|
44
38
|
}
|
|
45
|
-
/** The listbox's element id (page-unique), for `aria-controls`. */
|
|
46
|
-
get listId() {
|
|
47
|
-
return this.edytor.popups.idOf('url-paste');
|
|
48
|
-
}
|
|
49
|
-
/** The element id of the row at `index` (page-unique), for `aria-activedescendant`. */
|
|
50
|
-
optionId = (index) => this.edytor.popups.idOf(`url-paste-option-${index}`);
|
|
51
|
-
/**
|
|
52
|
-
* The attributes of the row at `index`: spread them on its element
|
|
53
|
-
* (`{...controller.option(index)}`): its id, `role="option"`,
|
|
54
|
-
* `aria-selected` and `data-selected` for the keyboard's row.
|
|
55
|
-
*/
|
|
56
|
-
option = (index) => optionAttributes(this.optionId(index), 'option', index === this.index);
|
|
57
|
-
/**
|
|
58
|
-
* The listbox (`{@attach controller.popup}`): it takes the menu's id, its
|
|
59
|
-
* `listbox` role and name unless it has its own, keeps the editor's focus
|
|
60
|
-
* on a press, and is published to the view's root (`edytor.popups`) with
|
|
61
|
-
* its highlighted row while the menu is open: the editor keeps the
|
|
62
|
-
* keyboard (its keys move and pick).
|
|
63
|
-
*/
|
|
64
|
-
popup = (node) => {
|
|
65
|
-
identify(node, this.listId, 'listbox', this.labels.pasteAs);
|
|
66
|
-
node.addEventListener('mousedown', keepFocus);
|
|
67
|
-
$effect(() => {
|
|
68
|
-
if (!this.open)
|
|
69
|
-
return;
|
|
70
|
-
const active = inPage(node, this.optionId(this.index));
|
|
71
|
-
this.edytor.popups.set('url-paste', { id: this.listId, haspopup: 'listbox', active });
|
|
72
|
-
return () => this.edytor.popups.set('url-paste', null);
|
|
73
|
-
});
|
|
74
|
-
return () => node.removeEventListener('mousedown', keepFocus);
|
|
75
|
-
};
|
|
76
39
|
/** The rows for `url`: Link, then each offer that takes it. @internal */
|
|
77
|
-
optionsFor = (url) => [
|
|
78
|
-
{ id: 'link',
|
|
79
|
-
...this.offers.flatMap((offer) => offer.data(url) ? [{ id: offer.type,
|
|
40
|
+
#optionsFor = (url) => [
|
|
41
|
+
{ id: 'link', icon: '🔗' },
|
|
42
|
+
...this.offers.flatMap((offer) => offer.data(url) ? [{ id: offer.type, icon: offer.icon, offer }] : [])
|
|
80
43
|
];
|
|
81
44
|
/**
|
|
82
45
|
* The paste (plugin `onPaste`, so a Shift+paste never reaches it): a
|
|
@@ -87,16 +50,17 @@ export class UrlPasteController {
|
|
|
87
50
|
paste = ({ e, prevent }) => {
|
|
88
51
|
const { edytor } = this;
|
|
89
52
|
const { selection } = edytor;
|
|
90
|
-
if (selection.value.kind !== 'text' || !selection.
|
|
53
|
+
if (selection.value.kind !== 'text' || !selection.projection.isCollapsed)
|
|
91
54
|
return;
|
|
92
55
|
const { projection } = selection;
|
|
93
56
|
if (projection.islandRoot !== null || projection.voidRoot !== null)
|
|
94
57
|
return;
|
|
95
|
-
const {
|
|
58
|
+
const { startText: text } = selection.textRange();
|
|
59
|
+
const block = text?.parent;
|
|
96
60
|
if (!block?.convertible || !text || !holdsNothing(edytor, block))
|
|
97
61
|
return;
|
|
98
62
|
const url = safeWebUrl(pastedLink(e.clipboardData?.getData('text/plain')));
|
|
99
|
-
const options = url ? this
|
|
63
|
+
const options = url ? this.#optionsFor(url) : [];
|
|
100
64
|
if (!url || options.length < 2)
|
|
101
65
|
return;
|
|
102
66
|
prevent(() => {
|
|
@@ -105,7 +69,7 @@ export class UrlPasteController {
|
|
|
105
69
|
? { link: { href: url } }
|
|
106
70
|
: {};
|
|
107
71
|
edytor.dispatcher.run('insertFromPaste', () => {
|
|
108
|
-
|
|
72
|
+
edytor.insertText(block.id, text.segStart, url, marks);
|
|
109
73
|
edytor.dispatcher.caret(edytor.idToBlock.get(block.id)?.firstText, url.length);
|
|
110
74
|
});
|
|
111
75
|
if (edytor.dispatcher.last?.status !== 'applied')
|
|
@@ -119,23 +83,15 @@ export class UrlPasteController {
|
|
|
119
83
|
if (this.open)
|
|
120
84
|
this.open = null;
|
|
121
85
|
};
|
|
122
|
-
/** Move the keyboard's row; answers whether the menu took the key. */
|
|
123
|
-
move = (step) => {
|
|
124
|
-
if (!this.open)
|
|
125
|
-
return false;
|
|
126
|
-
const count = this.open.options.length;
|
|
127
|
-
this.index = (this.index + step + count) % count;
|
|
128
|
-
return true;
|
|
129
|
-
};
|
|
130
86
|
/** The caret still rests at the end of the pasted URL, in its line. @internal */
|
|
131
87
|
stays = () => {
|
|
132
88
|
const { open, edytor } = this;
|
|
133
|
-
const { value,
|
|
89
|
+
const { value, projection } = edytor.selection;
|
|
134
90
|
return Boolean(open &&
|
|
135
91
|
value.kind === 'text' &&
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
92
|
+
projection.isCollapsed &&
|
|
93
|
+
projection.start?.block === open.block &&
|
|
94
|
+
projection.start.offset === open.url.length);
|
|
139
95
|
};
|
|
140
96
|
/** Pick a row: keep the link, or turn the line into the offer's kind. */
|
|
141
97
|
pick = (option = this.open?.options[this.index]) => {
|
|
@@ -149,35 +105,17 @@ export class UrlPasteController {
|
|
|
149
105
|
const data = offer.data(open.url);
|
|
150
106
|
if (!block?.isInTree || !block.convertible || !data)
|
|
151
107
|
return;
|
|
108
|
+
// Turn into the offer's kind, the caret at its start (the URL is the block's whole text).
|
|
152
109
|
const value = { type: offer.type, data, content: [] };
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
if (
|
|
156
|
-
|
|
157
|
-
edytor.dispatcher.caret(converted.firstText, 0);
|
|
158
|
-
offer.created?.(converted, open.url);
|
|
110
|
+
const converted = convertToKind(edytor, block, { value, replaces: false }, true) &&
|
|
111
|
+
edytor.idToBlock.get(block.id);
|
|
112
|
+
if (converted)
|
|
113
|
+
offer.created?.(converted, open.url);
|
|
159
114
|
};
|
|
160
115
|
/** The hooks of the plugin carrying the menu. @internal */
|
|
161
116
|
hooks = () => ({
|
|
162
117
|
onPaste: this.paste,
|
|
163
|
-
hotkeys: {
|
|
164
|
-
arrowdown: ({ prevent }) => {
|
|
165
|
-
if (this.move(1))
|
|
166
|
-
prevent();
|
|
167
|
-
},
|
|
168
|
-
arrowup: ({ prevent }) => {
|
|
169
|
-
if (this.move(-1))
|
|
170
|
-
prevent();
|
|
171
|
-
},
|
|
172
|
-
enter: ({ prevent }) => {
|
|
173
|
-
if (this.open)
|
|
174
|
-
prevent(() => this.pick());
|
|
175
|
-
},
|
|
176
|
-
escape: ({ prevent }) => {
|
|
177
|
-
if (this.open)
|
|
178
|
-
prevent(() => this.close());
|
|
179
|
-
}
|
|
180
|
-
},
|
|
118
|
+
hotkeys: listHotkeys(() => this.open !== null && { move: this.move, pick: () => this.pick(), close: this.close }),
|
|
181
119
|
onAfterOperation: () => this.close(),
|
|
182
120
|
onSelectionChange: () => {
|
|
183
121
|
if (this.open && !this.stays())
|
|
@@ -190,7 +128,7 @@ export class UrlPasteController {
|
|
|
190
128
|
this.close();
|
|
191
129
|
};
|
|
192
130
|
const offPress = onPress(this.edytor, node.ownerDocument, outside, true);
|
|
193
|
-
const unmount = this.edytor
|
|
131
|
+
const unmount = mountChrome(this.edytor, this.#menu, this, () => this.open, { name: 'edytor-url-paste-host', zIndex: 50, measure: this.measure }, this.close);
|
|
194
132
|
return () => {
|
|
195
133
|
offPress();
|
|
196
134
|
unmount();
|
|
@@ -206,16 +144,8 @@ export class UrlPasteController {
|
|
|
206
144
|
const block = edytor.idToBlock.get(open.block);
|
|
207
145
|
if (!block?.isInTree)
|
|
208
146
|
return () => this.close();
|
|
209
|
-
const view = host.ownerDocument.defaultView;
|
|
210
147
|
const rect = (block.firstText?.node ?? block.node)?.getBoundingClientRect();
|
|
211
|
-
|
|
212
|
-
return;
|
|
213
|
-
const width = host.firstElementChild?.getBoundingClientRect().width || 220;
|
|
214
|
-
const height = host.firstElementChild?.getBoundingClientRect().height || 120;
|
|
215
|
-
const left = `${Math.max(8, Math.min(rect.left, view.innerWidth - width - 8))}px`;
|
|
216
|
-
const below = rect.bottom + height + 8 < view.innerHeight;
|
|
217
|
-
const top = `${Math.max(8, below ? rect.bottom + 4 : rect.top - height - 4)}px`;
|
|
218
|
-
return () => Object.assign(host.style, { left, top });
|
|
148
|
+
return rect && placeNear(host, rect, [220, 120], { gap: 4 });
|
|
219
149
|
};
|
|
220
150
|
}
|
|
221
151
|
const controllers = new WeakMap();
|
|
@@ -226,7 +156,7 @@ const controllers = new WeakMap();
|
|
|
226
156
|
* per kind: the first listed wins, as its definition does (a plugin listed
|
|
227
157
|
* twice offers once). The menu's markup is the first `menu` passed.
|
|
228
158
|
*/
|
|
229
|
-
export const urlPaste = (edytor, offer,
|
|
159
|
+
export const urlPaste = (edytor, offer, menu) => {
|
|
230
160
|
const known = controllers.get(edytor);
|
|
231
161
|
if (known) {
|
|
232
162
|
if (!known.offers.some(({ type }) => type === offer.type))
|
|
@@ -234,7 +164,7 @@ export const urlPaste = (edytor, offer, labels, menu) => {
|
|
|
234
164
|
known.claimMenu(menu);
|
|
235
165
|
return {};
|
|
236
166
|
}
|
|
237
|
-
const controller = new UrlPasteController(edytor
|
|
167
|
+
const controller = new UrlPasteController(edytor);
|
|
238
168
|
controllers.set(edytor, controller);
|
|
239
169
|
controller.offers.push(offer);
|
|
240
170
|
controller.claimMenu(menu);
|