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
package/README.md
CHANGED
|
@@ -17,19 +17,19 @@
|
|
|
17
17
|
|
|
18
18
|
Edytor aims to be for Svelte what Slate.js is for React: a heavily customizable editor with an API to build any kind of collaborative rich text editor.
|
|
19
19
|
|
|
20
|
-
> **
|
|
20
|
+
> **2.0.** Edytor `2.0.0` is on npm as `edytor`: its API follows semantic versioning, and every change is listed in the changelog. It has no production track record yet: read the [limitations](https://edytor.dev/docs/reference/limitations) before you build on it. Issues and PRs are welcome: when you report a bug, include the document's JSON value.
|
|
21
21
|
|
|
22
22
|
## Features
|
|
23
23
|
|
|
24
|
-
- **Notion-style editing out of the box.** `<Edytor />` alone is a rich text editor with
|
|
25
|
-
- **Pages and a table of contents, opt-in.** `createPagePlugin` links a block to another document (a page per room, opened and named by your app), and `
|
|
26
|
-
- **Columns, opt-in.** List `
|
|
27
|
-
- **Tables, opt-in.** List `
|
|
24
|
+
- **Notion-style editing out of the box.** `<Edytor />` alone is a rich text editor with block handles: headings, toggle headings, lists, to-dos, toggles, callouts, quotes, dividers, ten marks and Notion's hotkeys. Add the Notion theme, a block menu (block colours; drag one block, or every block the selection covers), a slash menu, a selection toolbar, markdown shortcuts (`createMarkdownShortcutsPlugin()`) code blocks and images (`createImagePlugin({ upload })`).
|
|
25
|
+
- **Pages and a table of contents, opt-in.** `createPagePlugin` links a block to another document (a page per room, opened and named by your app), and `createTocPlugin()` lists the headings live ([Page](https://edytor.dev/docs/plugins/page), [Table of contents](https://edytor.dev/docs/plugins/table-of-contents)).
|
|
26
|
+
- **Columns, opt-in.** List `createColumnsPlugin()` for Notion's multi-column layouts: drag a block to the edge of another to put them side by side, or pick "2 columns" to "5 columns"; drag the gap to resize. Layouts converge across collaborators and the room ([Columns](https://edytor.dev/docs/plugins/columns)).
|
|
27
|
+
- **Tables, opt-in.** List `createTablePlugin()` for Notion's simple table: cells of text, <kbd>Tab</kbd> between them, rows and columns added, moved and deleted from the table's edges and grips, resizable columns, header row and column, HTML tables pasted and copied. Concurrent row and column edits converge on every replica ([Table](https://edytor.dev/docs/plugins/table)).
|
|
28
28
|
- **Mentions, page links and your own triggers.** `createMentionPlugin` (`@` people) and `createPageLinkPlugin` (`[[` pages) take your app's search; a plugin's `inputRules` (`:smile:` → 😄) and `triggers` (a menu on a typed character) declare the rest ([Input rules and triggers](https://edytor.dev/docs/plugins/input-rules)).
|
|
29
29
|
- **Comments, opt-in.** `createCommentsPlugin` adds Notion's comment threads: select text, press Comment, and the thread shows in a sidebar beside it with replies, Resolve and Re-open. The room keeps the threads beside the document and sends each change live; the anchor follows the text through edits and is not copied ([Comments](https://edytor.dev/docs/plugins/comments)).
|
|
30
30
|
- **Your markup.** Blocks, marks and inline atoms render through your Svelte snippets; the slash menu, toolbar, block menu and handles take a snippet and keep their behavior.
|
|
31
|
-
- **Your language.** Every word the
|
|
32
|
-
- **Synced properties.** `block.data`, `atom.data` and `edytor.data`
|
|
31
|
+
- **Your language.** Every word the package shows or says, slash keywords included, comes from one labels dictionary the view takes (`<Edytor labels>`); your chrome's words are your markup's; English by default ([Localization](https://edytor.dev/docs/customization/localization)).
|
|
32
|
+
- **Synced properties.** `block.data`, `atom.data` and `edytor.data` are plain Svelte state at any depth (`block.data.meta.author = 'Ada'`, `block.data.tags.push('x')`, `delete block.data.draft`), each write an undoable operation; each property and each array item syncs on its own, so concurrent edits of different properties, or of different items of one array, merge.
|
|
33
33
|
- **AI suggestions.** `edytor.suggestions.add(position, content)` proposes text, paragraphs, lists, to-dos or images after, before or inside a block, at the end of its text, or in place of the selection; it streams in, shows only on your screen, and becomes one undo step when accepted ([Suggestions](https://edytor.dev/docs/editor/suggestions)).
|
|
34
34
|
- **Plugins that can veto anything.** Every command is prepared before it writes; plugins see the command and each planned step and can refuse or replace it.
|
|
35
35
|
- **Real-time collaboration.** One `EdytorDocument` shared by any number of views, or none (headless). Presence cursors, identity-preserving moves, splits and merges, and undo that only takes back your own edits.
|
|
@@ -45,47 +45,29 @@ The pre-release is on npm under the `next` tag. Name the tag: a bare `edytor` is
|
|
|
45
45
|
pnpm add edytor
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
-
`svelte@^5` is a peer dependency. Do not install `yjs`: the v14 engine is vendored (`edytor/crdt`). See [installation](https://edytor.dev/docs/getting-started) and [platform support](https://edytor.dev/docs/reference/platform-support) (Chrome
|
|
48
|
+
`svelte@^5` is a peer dependency. Do not install `yjs`: the v14 engine is vendored (`edytor/crdt`). See [installation](https://edytor.dev/docs/getting-started) and [platform support](https://edytor.dev/docs/reference/platform-support) (Baseline 2024: Chrome and Edge 120, Firefox 125, Safari 17.4 and later; real phones are not tested yet).
|
|
49
49
|
|
|
50
50
|
## Quick start
|
|
51
51
|
|
|
52
52
|
```svelte
|
|
53
53
|
<script lang="ts">
|
|
54
|
-
import {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
markdownShortcutsPlugin,
|
|
58
|
-
slashMenuPlugin,
|
|
59
|
-
toolbarPlugin,
|
|
60
|
-
blockMenuPlugin,
|
|
61
|
-
richTextPlaceholder,
|
|
62
|
-
type JSONDoc
|
|
63
|
-
} from 'edytor';
|
|
64
|
-
import 'edytor/themes/notion.css';
|
|
65
|
-
|
|
66
|
-
const value: JSONDoc = {
|
|
54
|
+
import { Edytor, createCodePlugin, type JSONDoc } from 'edytor';
|
|
55
|
+
|
|
56
|
+
let value = $state<JSONDoc>({
|
|
67
57
|
children: [{ type: 'paragraph', content: [{ text: 'Hello, World!' }] }]
|
|
68
|
-
};
|
|
69
|
-
const plugins = [
|
|
70
|
-
codePlugin,
|
|
71
|
-
markdownShortcutsPlugin,
|
|
72
|
-
slashMenuPlugin,
|
|
73
|
-
toolbarPlugin,
|
|
74
|
-
blockMenuPlugin
|
|
75
|
-
];
|
|
58
|
+
});
|
|
76
59
|
</script>
|
|
77
60
|
|
|
78
|
-
<
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
{plugins}
|
|
82
|
-
placeholder={richTextPlaceholder}
|
|
83
|
-
onChange={(root) => console.log(root)}
|
|
84
|
-
/>
|
|
85
|
-
</div>
|
|
61
|
+
<Edytor {value} plugins={[createCodePlugin()]} onChange={(next) => (value = next)} />
|
|
62
|
+
|
|
63
|
+
<p>{value.children?.length ?? 0} blocks</p>
|
|
86
64
|
```
|
|
87
65
|
|
|
88
|
-
|
|
66
|
+
`<Edytor>` renders on the server and hydrates, so it works in any route. It includes rich text; each other block kind, block moves from the keyboard (`createArrowMovePlugin()`), and file drops (a media plugin given an `upload`) is a plugin you add, here code blocks; nesting blocks (<kbd>Tab</kbd>, drops inside a block) is the `allowNesting` option, off by default. `onChange` hands you the document after every change ([quick start](https://edytor.dev/docs/getting-started/quick-start)).
|
|
67
|
+
|
|
68
|
+
The package draws no menu, toolbar or block handle: each is a snippet you pass its plugin ([menus and handles](https://edytor.dev/docs/customization/menus)). The demo's Notion-style ones are in [`src/routes/chrome`](https://github.com/beynar/edytor/tree/master/src/routes/chrome), ready to copy into your app ([ready-made menus](https://edytor.dev/docs/customization/ready-made-menus)).
|
|
69
|
+
|
|
70
|
+
To collaborate, name a room and a server running the [`edytor/cloudflare` room](https://edytor.dev/docs/server/quick-start):
|
|
89
71
|
|
|
90
72
|
```svelte
|
|
91
73
|
<Edytor
|
|
@@ -105,7 +87,7 @@ The [documentation site](https://edytor.dev/docs) is the single source for the A
|
|
|
105
87
|
- [Editor](https://edytor.dev/docs/editor/edytor-component): the component, commands, selection, history, clipboard, readonly
|
|
106
88
|
- [Plugins](https://edytor.dev/docs/plugins) and [customization](https://edytor.dev/docs/customization/blocks): bundled plugins, custom blocks and marks, [hotkeys and editing behavior](https://edytor.dev/docs/customization/hotkeys)
|
|
107
89
|
- [Collaboration](https://edytor.dev/docs/collaboration) and [server](https://edytor.dev/docs/server/quick-start): documents, providers, presence, the Durable Object room and its protocol
|
|
108
|
-
- [Reference](https://edytor.dev/docs/reference/document-api): the document API, [troubleshooting](https://edytor.dev/docs/reference/troubleshooting), the [changelog](https://edytor.dev/docs/reference/migration) (with [migration from 0.0.11](https://edytor.dev/docs/reference/migration#upgrading-from-0011)),
|
|
90
|
+
- [Reference](https://edytor.dev/docs/reference/document-api): the document API, [troubleshooting](https://edytor.dev/docs/reference/troubleshooting), the [changelog](https://edytor.dev/docs/reference/migration) (with [migration from 0.0.11](https://edytor.dev/docs/reference/migration#upgrading-from-0011)), limitations, [platform support](https://edytor.dev/docs/reference/platform-support)
|
|
109
91
|
|
|
110
92
|
## Contributing
|
|
111
93
|
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { Text } from '../text/text.svelte.js';
|
|
2
2
|
import type { Edytor } from '../edytor.svelte.js';
|
|
3
|
-
import type { JSONBlock
|
|
4
|
-
import { type BlockOperations } from './block.utils.js';
|
|
3
|
+
import type { JSONBlock } from '../utils/json.js';
|
|
5
4
|
import type { BlockDefinition } from '../plugins.js';
|
|
6
|
-
import { InlineBlock } from './inlineBlock.svelte.js';
|
|
7
|
-
import type { DocBlock } from '../crdt/index.js';
|
|
5
|
+
import type { InlineBlock } from './inlineBlock.svelte.js';
|
|
8
6
|
/** Mark an element inside a block's markup as non-editable chrome (`block.void`, a preview's too). */
|
|
9
7
|
export declare const voidChrome: (node: HTMLElement) => void;
|
|
10
8
|
/**
|
|
11
|
-
* An id-only block handle: every getter reads the document index
|
|
12
|
-
* (transaction-aware)
|
|
13
|
-
*
|
|
9
|
+
* An id-only, read-only block handle: every getter reads the document index
|
|
10
|
+
* (transaction-aware). Writes are the view's operations, with the block's id
|
|
11
|
+
* (`edytor.splitBlock(block.id, …)`). The view keeps one handle per id
|
|
12
|
+
* (`edytor.idToBlock`); `node` is the element the core renders for it.
|
|
14
13
|
*
|
|
15
14
|
* A reactive reader (a template, a `$derived`, an `$effect`) of a getter
|
|
16
15
|
* depends on the cells the answer comes from (this block's, its parent's,
|
|
@@ -25,28 +24,21 @@ export declare class Block {
|
|
|
25
24
|
node?: HTMLElement;
|
|
26
25
|
constructor(edytor: Edytor, id: string);
|
|
27
26
|
get isRoot(): boolean;
|
|
28
|
-
/** The typed document node — `null` for the root. */
|
|
29
|
-
get model(): DocBlock | null;
|
|
30
27
|
/** The display parent (the root for a top-level block); none for the root or a dead block. */
|
|
31
28
|
get parent(): Block | undefined;
|
|
32
29
|
get children(): Block[];
|
|
33
30
|
/** Text segments and inline atoms, alternating, starting and ending with a text. */
|
|
34
31
|
get content(): (Text | InlineBlock)[];
|
|
35
32
|
get type(): string;
|
|
36
|
-
/** Retype the block — the `setBlock` command (readonly, hooks, `dispatcher.last`). */
|
|
37
|
-
set type(value: string);
|
|
38
33
|
/**
|
|
39
|
-
* The block's `data` as
|
|
40
|
-
*
|
|
41
|
-
*
|
|
34
|
+
* The block's `data` as plain state: reactive at any depth (through the
|
|
35
|
+
* block's cell), and writable (`block.data.color = 'red'`,
|
|
36
|
+
* `block.data.tags.push('x')`, `delete block.data.color`). Each write is
|
|
37
|
+
* the `patchData` operation, dispatched (`session/props`). The root's is
|
|
38
|
+
* the document's data (`edytor.data`).
|
|
42
39
|
*/
|
|
43
40
|
get data(): Record<string, any>;
|
|
44
41
|
get definition(): BlockDefinition;
|
|
45
|
-
/**
|
|
46
|
-
* Replace the block's `data` — a `patchData` command of its root (readonly,
|
|
47
|
-
* hooks, `dispatcher.last`); `block.model.setData` is the raw document write.
|
|
48
|
-
*/
|
|
49
|
-
setData: (data: Record<string, unknown>) => void;
|
|
50
42
|
get selected(): boolean;
|
|
51
43
|
get focused(): boolean;
|
|
52
44
|
/** May this block move at all: `canPlace` without a destination (drag handles). */
|
|
@@ -109,71 +101,6 @@ export declare class Block {
|
|
|
109
101
|
get firstText(): Text | undefined;
|
|
110
102
|
/** The last text of this block's own content (see {@link firstText}). */
|
|
111
103
|
get lastText(): Text | undefined;
|
|
112
|
-
addChildBlock: (payload: {
|
|
113
|
-
block: JSONBlock;
|
|
114
|
-
index: number;
|
|
115
|
-
}) => Block;
|
|
116
|
-
addChildBlocks: (payload: {
|
|
117
|
-
blocks: JSONBlock[];
|
|
118
|
-
index: number;
|
|
119
|
-
}) => Block[];
|
|
120
|
-
insertBlockAfter: (payload: {
|
|
121
|
-
block: JSONBlock;
|
|
122
|
-
}) => Block | null | undefined;
|
|
123
|
-
insertBlockBefore: (payload: {
|
|
124
|
-
block: JSONBlock;
|
|
125
|
-
}) => Block | null | undefined;
|
|
126
|
-
splitBlock: (payload: {
|
|
127
|
-
index: number;
|
|
128
|
-
text: Text;
|
|
129
|
-
}) => Block | null | undefined;
|
|
130
|
-
duplicateBlock: (payload?: {} | undefined) => Block | null | undefined;
|
|
131
|
-
removeBlock: (payload?: {
|
|
132
|
-
keepChildren?: boolean;
|
|
133
|
-
} | undefined) => void;
|
|
134
|
-
unNestBlock: (this: Block, payload?: {} | undefined) => Block | null;
|
|
135
|
-
mergeBlockBackward: (payload?: {} | undefined) => Block | null | undefined;
|
|
136
|
-
mergeBlockForward: (payload?: {} | undefined) => Block | null | undefined;
|
|
137
|
-
nestBlock: (this: Block, payload?: {} | undefined) => Block | null;
|
|
138
|
-
setBlock: (payload: {
|
|
139
|
-
value: Partial<JSONBlock>;
|
|
140
|
-
}) => void;
|
|
141
|
-
moveBlock: (this: Block, payload: {
|
|
142
|
-
path: number[];
|
|
143
|
-
beside?: import("./block.utils.js").BlockBeside;
|
|
144
|
-
}) => Block | null;
|
|
145
|
-
moveBlocks: (this: Block, payload: {
|
|
146
|
-
blocks: Block[];
|
|
147
|
-
path: number[];
|
|
148
|
-
beside?: import("./block.utils.js").BlockBeside;
|
|
149
|
-
}) => Block[];
|
|
150
|
-
pushContentIntoBlock: (payload: {
|
|
151
|
-
value: (Text | InlineBlock)[];
|
|
152
|
-
}) => void;
|
|
153
|
-
removeInlineBlock: (payload: {
|
|
154
|
-
index: number;
|
|
155
|
-
}) => void;
|
|
156
|
-
patchData: (payload: {
|
|
157
|
-
ops: import("../crdt/index.js").DataPatch[];
|
|
158
|
-
atom?: string;
|
|
159
|
-
}) => void;
|
|
160
|
-
/**
|
|
161
|
-
* Insert an inline atom: at `offset` of the block's content (block
|
|
162
|
-
* offsets, an inline atom counting 1; a caret's), or at `index` of the
|
|
163
|
-
* text segment `text`. One `addInlineBlock` operation (its payload names
|
|
164
|
-
* the segment). Answers the text segment right after the atom, where a
|
|
165
|
-
* caret goes (`null` when it was not written, `undefined` when refused).
|
|
166
|
-
*/
|
|
167
|
-
addInlineBlock: (payload: BlockOperations["addInlineBlock"] | {
|
|
168
|
-
offset: number;
|
|
169
|
-
block: JSONInlineBlock;
|
|
170
|
-
}) => Text | null | undefined;
|
|
171
|
-
normalizeContent: () => void;
|
|
172
|
-
normalizeChildren: () => void;
|
|
173
|
-
deleteContentAtRange: (payload: {
|
|
174
|
-
start: [number, number];
|
|
175
|
-
end: [number, number];
|
|
176
|
-
}) => void;
|
|
177
104
|
/** Mark an element inside the block's markup as non-editable chrome (a header, a caption bar). */
|
|
178
105
|
void: (node: HTMLElement) => void;
|
|
179
106
|
/**
|
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import { Text } from '../text/text.svelte.js';
|
|
2
|
-
import { batch, removeInlineBlock, addChildBlock, insertBlockAfter, insertBlockBefore, mergeBlockBackward, mergeBlockForward, nestBlock, removeBlock, setBlock, splitBlock, prepareSplit, duplicateBlock, prepareDuplicate, prepareSet, prepareMove, prepareMoves, prepareInsertAfter, prepareInsertBefore, prepareRemove, prepareMergeBackward, prepareMergeForward, prepareUnNest, prepareNest, prepareRemoveInline, preparePatch, patchData, prepareDeleteRange, addChildBlocks, pushContentIntoBlock, unNestBlock, moveBlock, moveBlocks, normalizeContent, addInlineBlock, textAfterAtom, blockOf, deleteContentAtRange, normalizeChildren } from './block.utils.js';
|
|
3
|
-
import { jsonBlockToSpec, jsonContentToItems } from '../utils/json.js';
|
|
4
|
-
import { InlineBlock } from './inlineBlock.svelte.js';
|
|
5
|
-
import { revealed } from '../selection/replaceSelection.js';
|
|
6
|
-
import { propsProxy } from '../session/props.js';
|
|
7
2
|
/** Mark an element inside a block's markup as non-editable chrome (`block.void`, a preview's too). */
|
|
8
3
|
export const voidChrome = (node) => {
|
|
9
4
|
node.setAttribute('data-edytor-void', `true`);
|
|
@@ -11,9 +6,10 @@ export const voidChrome = (node) => {
|
|
|
11
6
|
node.setAttribute('contenteditable', 'false');
|
|
12
7
|
};
|
|
13
8
|
/**
|
|
14
|
-
* An id-only block handle: every getter reads the document index
|
|
15
|
-
* (transaction-aware)
|
|
16
|
-
*
|
|
9
|
+
* An id-only, read-only block handle: every getter reads the document index
|
|
10
|
+
* (transaction-aware). Writes are the view's operations, with the block's id
|
|
11
|
+
* (`edytor.splitBlock(block.id, …)`). The view keeps one handle per id
|
|
12
|
+
* (`edytor.idToBlock`); `node` is the element the core renders for it.
|
|
17
13
|
*
|
|
18
14
|
* A reactive reader (a template, a `$derived`, an `$effect`) of a getter
|
|
19
15
|
* depends on the cells the answer comes from (this block's, its parent's,
|
|
@@ -46,10 +42,6 @@ export class Block {
|
|
|
46
42
|
else
|
|
47
43
|
cells?.get(id);
|
|
48
44
|
}
|
|
49
|
-
/** The typed document node — `null` for the root. */
|
|
50
|
-
get model() {
|
|
51
|
-
return this.isRoot ? null : this.edytor.facade.block(this.id);
|
|
52
|
-
}
|
|
53
45
|
/** The display parent (the root for a top-level block); none for the root or a dead block. */
|
|
54
46
|
get parent() {
|
|
55
47
|
if (this.isRoot)
|
|
@@ -83,19 +75,19 @@ export class Block {
|
|
|
83
75
|
this.#track();
|
|
84
76
|
return this.edytor.facade.blockTypeOf(this.id) ?? '';
|
|
85
77
|
}
|
|
86
|
-
/** Retype the block — the `setBlock` command (readonly, hooks, `dispatcher.last`). */
|
|
87
|
-
set type(value) {
|
|
88
|
-
this.setBlock({ value: { type: value } });
|
|
89
|
-
}
|
|
90
78
|
#data;
|
|
91
79
|
#props;
|
|
92
80
|
/**
|
|
93
|
-
* The block's `data` as
|
|
94
|
-
*
|
|
95
|
-
*
|
|
81
|
+
* The block's `data` as plain state: reactive at any depth (through the
|
|
82
|
+
* block's cell), and writable (`block.data.color = 'red'`,
|
|
83
|
+
* `block.data.tags.push('x')`, `delete block.data.color`). Each write is
|
|
84
|
+
* the `patchData` operation, dispatched (`session/props`). The root's is
|
|
85
|
+
* the document's data (`edytor.data`).
|
|
96
86
|
*/
|
|
97
87
|
get data() {
|
|
98
|
-
|
|
88
|
+
if (this.isRoot)
|
|
89
|
+
return this.edytor.data;
|
|
90
|
+
return (this.#props ??= this.edytor.dataWrites.proxy(this.id, () => this.#current()));
|
|
99
91
|
}
|
|
100
92
|
#current() {
|
|
101
93
|
const { facade, cells } = this.edytor;
|
|
@@ -108,14 +100,6 @@ export class Block {
|
|
|
108
100
|
get definition() {
|
|
109
101
|
return this.edytor.definitionOf(this.type);
|
|
110
102
|
}
|
|
111
|
-
/**
|
|
112
|
-
* Replace the block's `data` — a `patchData` command of its root (readonly,
|
|
113
|
-
* hooks, `dispatcher.last`); `block.model.setData` is the raw document write.
|
|
114
|
-
*/
|
|
115
|
-
setData = (data) => {
|
|
116
|
-
// Non-JSON values are coerced at the document boundary (`sanitizeWireJson`).
|
|
117
|
-
this.patchData({ ops: [{ path: [], value: data }] });
|
|
118
|
-
};
|
|
119
103
|
get selected() {
|
|
120
104
|
return this.edytor.selection.isSelected(this);
|
|
121
105
|
}
|
|
@@ -140,27 +124,27 @@ export class Block {
|
|
|
140
124
|
}
|
|
141
125
|
/** @internal */
|
|
142
126
|
get firstEditableText() {
|
|
143
|
-
|
|
144
|
-
// content slot holds a Text with no `node`. Scan ALL children: the
|
|
145
|
-
// first child can be noneditable (a void divider) while a later
|
|
146
|
-
// child owns the text the caret must land in.
|
|
147
|
-
const own = this.content.find((part) => part instanceof Text && part.node != null);
|
|
148
|
-
if (own)
|
|
149
|
-
return own;
|
|
150
|
-
for (const child of this.children) {
|
|
151
|
-
const text = child.firstEditableText;
|
|
152
|
-
if (text)
|
|
153
|
-
return text;
|
|
154
|
-
}
|
|
155
|
-
return undefined;
|
|
127
|
+
return this.#editable(false);
|
|
156
128
|
}
|
|
157
129
|
/** @internal */
|
|
158
130
|
get lastEditableText() {
|
|
159
|
-
|
|
131
|
+
return this.#editable(true);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The first (or `last`) editable text of the block's own content, else
|
|
135
|
+
* of its subtree. Only a RENDERED text part is editable — a container's
|
|
136
|
+
* phantom content slot holds a Text with no `node`. Every child is
|
|
137
|
+
* scanned: the first can be noneditable (a void divider) while a later
|
|
138
|
+
* one owns the text the caret must land in.
|
|
139
|
+
*/
|
|
140
|
+
#editable(last) {
|
|
141
|
+
const rendered = (part) => part instanceof Text && part.node != null;
|
|
142
|
+
const own = last ? this.content.findLast(rendered) : this.content.find(rendered);
|
|
160
143
|
if (own)
|
|
161
144
|
return own;
|
|
162
|
-
|
|
163
|
-
|
|
145
|
+
const children = this.children;
|
|
146
|
+
for (const child of last ? children.reverse() : children) {
|
|
147
|
+
const text = child.#editable(last);
|
|
164
148
|
if (text)
|
|
165
149
|
return text;
|
|
166
150
|
}
|
|
@@ -305,40 +289,6 @@ export class Block {
|
|
|
305
289
|
return this.children.at(-1)?.lastText;
|
|
306
290
|
return this.rendersContent ? this.content.findLast((p) => p instanceof Text) : undefined;
|
|
307
291
|
}
|
|
308
|
-
addChildBlock = batch('addChildBlock', addChildBlock);
|
|
309
|
-
addChildBlocks = batch('addChildBlocks', addChildBlocks);
|
|
310
|
-
insertBlockAfter = batch('insertBlockAfter', insertBlockAfter, prepareInsertAfter, blockOf);
|
|
311
|
-
insertBlockBefore = batch('insertBlockBefore', insertBlockBefore, prepareInsertBefore, blockOf);
|
|
312
|
-
splitBlock = batch('splitBlock', splitBlock, prepareSplit, blockOf);
|
|
313
|
-
duplicateBlock = batch('duplicateBlock', duplicateBlock, prepareDuplicate, blockOf);
|
|
314
|
-
removeBlock = batch('removeBlock', removeBlock, prepareRemove);
|
|
315
|
-
unNestBlock = revealed(batch('unNestBlock', unNestBlock, prepareUnNest));
|
|
316
|
-
mergeBlockBackward = batch('mergeBlockBackward', mergeBlockBackward, prepareMergeBackward, blockOf);
|
|
317
|
-
mergeBlockForward = batch('mergeBlockForward', mergeBlockForward, prepareMergeForward, blockOf);
|
|
318
|
-
nestBlock = revealed(batch('nestBlock', nestBlock, prepareNest));
|
|
319
|
-
setBlock = batch('setBlock', setBlock, prepareSet);
|
|
320
|
-
moveBlock = revealed(batch('moveBlock', moveBlock, prepareMove));
|
|
321
|
-
moveBlocks = revealed(batch('moveBlocks', moveBlocks, prepareMoves));
|
|
322
|
-
pushContentIntoBlock = batch('pushContentIntoBlock', pushContentIntoBlock);
|
|
323
|
-
removeInlineBlock = batch('removeInlineBlock', removeInlineBlock, prepareRemoveInline);
|
|
324
|
-
patchData = batch('patchData', patchData, preparePatch);
|
|
325
|
-
#addInline = batch('addInlineBlock', addInlineBlock, undefined, textAfterAtom);
|
|
326
|
-
/**
|
|
327
|
-
* Insert an inline atom: at `offset` of the block's content (block
|
|
328
|
-
* offsets, an inline atom counting 1; a caret's), or at `index` of the
|
|
329
|
-
* text segment `text`. One `addInlineBlock` operation (its payload names
|
|
330
|
-
* the segment). Answers the text segment right after the atom, where a
|
|
331
|
-
* caret goes (`null` when it was not written, `undefined` when refused).
|
|
332
|
-
*/
|
|
333
|
-
addInlineBlock = (payload) => {
|
|
334
|
-
if (!('offset' in payload))
|
|
335
|
-
return this.#addInline(payload);
|
|
336
|
-
const at = this.textAtOffset(Math.max(0, payload.offset));
|
|
337
|
-
return at ? this.#addInline({ index: at.offset, text: at.text, block: payload.block }) : null;
|
|
338
|
-
};
|
|
339
|
-
normalizeContent = batch('normalizeContent', normalizeContent);
|
|
340
|
-
normalizeChildren = batch('normalizeChildren', normalizeChildren);
|
|
341
|
-
deleteContentAtRange = batch('deleteContentAtRange', deleteContentAtRange, prepareDeleteRange);
|
|
342
292
|
/** Mark an element inside the block's markup as non-editable chrome (a header, a caption bar). */
|
|
343
293
|
void = voidChrome;
|
|
344
294
|
/**
|
|
@@ -366,60 +316,6 @@ export class Block {
|
|
|
366
316
|
}
|
|
367
317
|
return hit;
|
|
368
318
|
};
|
|
369
|
-
// ── JSON insertion (specs are data; `new Block({block})` is gone) ──
|
|
370
|
-
/**
|
|
371
|
-
* Insert children at `index`: a JSON spec is created (its id kept, minted
|
|
372
|
-
* when missing); a block handle moves there with its identity. A raw
|
|
373
|
-
* write for the editor's own commands: nothing on a view whose dispatcher
|
|
374
|
-
* refuses writes (readonly, a read-only document).
|
|
375
|
-
* @internal
|
|
376
|
-
*/
|
|
377
|
-
insertChildren = (index, blocks) => {
|
|
378
|
-
if (!this.edytor.dispatcher.permits())
|
|
379
|
-
return;
|
|
380
|
-
const { facade } = this.edytor;
|
|
381
|
-
const parent = this.isRoot ? null : this.id;
|
|
382
|
-
blocks.forEach((block, k) => {
|
|
383
|
-
if (block instanceof Block)
|
|
384
|
-
block.model?.moveTo({ parent: this.model, index: index + k });
|
|
385
|
-
else
|
|
386
|
-
facade.insertBlock({ parent, index: index + k }, jsonBlockToSpec(block));
|
|
387
|
-
});
|
|
388
|
-
};
|
|
389
|
-
/**
|
|
390
|
-
* Delete `length` visible children from `index`, each with its subtree (a
|
|
391
|
-
* document delete). Raw, as `insertChildren`.
|
|
392
|
-
* @internal
|
|
393
|
-
*/
|
|
394
|
-
deleteChildren = (index, length = 1) => {
|
|
395
|
-
if (!this.edytor.dispatcher.permits())
|
|
396
|
-
return;
|
|
397
|
-
const ids = this.edytor.facade.childrenIds(this.isRoot ? null : this.id);
|
|
398
|
-
for (const id of ids.slice(index, index + length).reverse())
|
|
399
|
-
this.edytor.facade.block(id).delete({ keepChildren: false });
|
|
400
|
-
};
|
|
401
|
-
/**
|
|
402
|
-
* Insert content before part `index` (a text segment or an inline atom):
|
|
403
|
-
* each entry is a text's runs or an atom, as JSON. Raw, as `insertChildren`.
|
|
404
|
-
* @internal
|
|
405
|
-
*/
|
|
406
|
-
insertParts = (index, parts) => {
|
|
407
|
-
if (!this.edytor.dispatcher.permits())
|
|
408
|
-
return;
|
|
409
|
-
const model = this.model;
|
|
410
|
-
if (!model)
|
|
411
|
-
return;
|
|
412
|
-
const all = this.edytor.idToBlock.parts(this.id);
|
|
413
|
-
let at = all[index]?.start ?? model.length;
|
|
414
|
-
for (const item of jsonContentToItems(parts.flat())) {
|
|
415
|
-
if (item.kind === 'inline')
|
|
416
|
-
model.insertInline(at++, item);
|
|
417
|
-
else if (item.text) {
|
|
418
|
-
model.insertText(at, item.text, item.marks);
|
|
419
|
-
at += item.text.length;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
};
|
|
423
319
|
/** The declared view state (`open` on a `details`) the block's last element held. */
|
|
424
320
|
#viewState = [];
|
|
425
321
|
/**
|
|
@@ -428,14 +324,14 @@ export class Block {
|
|
|
428
324
|
* view state: an open toggle stays open.
|
|
429
325
|
* @internal
|
|
430
326
|
*/
|
|
431
|
-
attach = (node) => {
|
|
327
|
+
attach = (node, owned) => {
|
|
432
328
|
const names = this.definition.viewState ?? [];
|
|
433
329
|
const read = (from) => names.flatMap((name) => (from.hasAttribute(name) ? [[name, from.getAttribute(name)]] : []));
|
|
434
330
|
for (const [name, value] of this.node ? read(this.node) : this.#viewState)
|
|
435
331
|
if (names.includes(name))
|
|
436
332
|
node.setAttribute(name, value);
|
|
437
333
|
this.node = node;
|
|
438
|
-
const release = this.edytor.surface.register(node, 'block', this.id);
|
|
334
|
+
const release = this.edytor.surface.register(node, 'block', this.id, undefined, owned);
|
|
439
335
|
// Its attributes follow its own selected and focused membership.
|
|
440
336
|
this.edytor.selection.keep(this);
|
|
441
337
|
// A block laid out again with no commit moves the chrome beside it (the overlay measures).
|
package/dist/block/colors.d.ts
CHANGED
|
@@ -14,15 +14,6 @@ import type { Block } from './block.svelte.js';
|
|
|
14
14
|
import type { Edytor } from '../edytor.svelte.js';
|
|
15
15
|
/** Notion's palette: the colour names a block may hold, in menu order ("Default" is none). */
|
|
16
16
|
export declare const BLOCK_COLORS: readonly ["gray", "brown", "orange", "yellow", "green", "blue", "purple", "pink", "red"];
|
|
17
|
-
/**
|
|
18
|
-
* Notion's light values of the palette: the fallbacks of the theme tokens
|
|
19
|
-
* (`--edytor-color-<name>`, `--edytor-background-<name>`), as the core's
|
|
20
|
-
* stylesheet (`Block.svelte`) and the Notion theme write them.
|
|
21
|
-
*/
|
|
22
|
-
export declare const BLOCK_PALETTE: Record<(typeof BLOCK_COLORS)[number], {
|
|
23
|
-
color: string;
|
|
24
|
-
background: string;
|
|
25
|
-
}>;
|
|
26
17
|
/** A block's colour fields: its text colour and its background. */
|
|
27
18
|
export type BlockColorField = 'color' | 'background';
|
|
28
19
|
/** `value` as a colour name, or `undefined`. */
|
package/dist/block/colors.js
CHANGED
|
@@ -10,22 +10,6 @@ export const BLOCK_COLORS = [
|
|
|
10
10
|
'pink',
|
|
11
11
|
'red'
|
|
12
12
|
];
|
|
13
|
-
/**
|
|
14
|
-
* Notion's light values of the palette: the fallbacks of the theme tokens
|
|
15
|
-
* (`--edytor-color-<name>`, `--edytor-background-<name>`), as the core's
|
|
16
|
-
* stylesheet (`Block.svelte`) and the Notion theme write them.
|
|
17
|
-
*/
|
|
18
|
-
export const BLOCK_PALETTE = {
|
|
19
|
-
gray: { color: '#7d7a75', background: '#f0efed' },
|
|
20
|
-
brown: { color: '#9f765a', background: '#f5ede9' },
|
|
21
|
-
orange: { color: '#d27b2d', background: '#fbebde' },
|
|
22
|
-
yellow: { color: '#cb9434', background: '#f9f3dc' },
|
|
23
|
-
green: { color: '#50946e', background: '#e8f1ec' },
|
|
24
|
-
blue: { color: '#387dc9', background: '#e5f2fc' },
|
|
25
|
-
purple: { color: '#9a6bb4', background: '#f3ebf9' },
|
|
26
|
-
pink: { color: '#c14c8a', background: '#fae9f1' },
|
|
27
|
-
red: { color: '#cf5148', background: '#fce9e7' }
|
|
28
|
-
};
|
|
29
13
|
/**
|
|
30
14
|
* A colour name the core renders: lowercase letters, digits and hyphens,
|
|
31
15
|
* starting with a letter (an app's own name, such as `teal`, renders too,
|
|
@@ -67,8 +51,7 @@ export const setBlockColor = (edytor, blocks, field, value) => {
|
|
|
67
51
|
if (!painted.length)
|
|
68
52
|
return false;
|
|
69
53
|
const applied = edytor.dispatcher.each('setBlockColor', painted, (block) => {
|
|
70
|
-
|
|
71
|
-
return edytor.dispatcher.last?.status === 'applied';
|
|
54
|
+
return edytor.patchData(block.id, [{ path: [field], value: name }]).status === 'applied';
|
|
72
55
|
});
|
|
73
56
|
return applied.some(Boolean);
|
|
74
57
|
};
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { JSONInlineBlock, JSONText } from '../utils/json.js';
|
|
2
2
|
export type JSONContentPart = JSONText | JSONInlineBlock;
|
|
3
3
|
export declare const isTextPart: (part: JSONContentPart) => part is JSONText;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* The parts of `content` inside display offsets `[from, to)` (an inline atom
|
|
6
|
+
* counts 1): the texts sliced, an empty slice dropped, the atoms whole.
|
|
7
|
+
*/
|
|
8
|
+
export declare const sliceContent: (content?: readonly JSONContentPart[], from?: number, to?: number) => JSONContentPart[];
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
export const isTextPart = (part) => 'text' in part;
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
/**
|
|
3
|
+
* The parts of `content` inside display offsets `[from, to)` (an inline atom
|
|
4
|
+
* counts 1): the texts sliced, an empty slice dropped, the atoms whole.
|
|
5
|
+
*/
|
|
6
|
+
export const sliceContent = (content = [], from = 0, to = Infinity) => {
|
|
7
|
+
const out = [];
|
|
8
|
+
let at = 0;
|
|
9
|
+
for (const part of content) {
|
|
10
|
+
const start = at;
|
|
11
|
+
at += isTextPart(part) ? part.text.length : 1;
|
|
12
|
+
if (at <= from || start >= to)
|
|
10
13
|
continue;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
result.push({
|
|
15
|
-
text: part.text.slice(textStart, textEnd),
|
|
16
|
-
...(part.marks ? { marks: part.marks } : {})
|
|
17
|
-
});
|
|
14
|
+
out.push(isTextPart(part)
|
|
15
|
+
? { ...part, text: part.text.slice(Math.max(0, from - start), to - start) }
|
|
16
|
+
: part);
|
|
18
17
|
}
|
|
19
|
-
return
|
|
18
|
+
return out;
|
|
20
19
|
};
|
|
@@ -3,32 +3,34 @@ import type { InlineBlockDefinition } from '../plugins.js';
|
|
|
3
3
|
import type { JSONInlineBlock } from '../utils/json.js';
|
|
4
4
|
import type { Block } from './block.svelte.js';
|
|
5
5
|
/**
|
|
6
|
-
* An id-only inline-atom handle: atom `id`, shown in
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* the
|
|
6
|
+
* An id-only, read-only inline-atom handle: atom `id`, shown in block
|
|
7
|
+
* `blockId`. Getters read the document index; writes are the view's
|
|
8
|
+
* operations (`edytor.patchData({ block: atom.blockId, atom: atom.id }, …)`).
|
|
9
|
+
* `node` is the element that renders it (a Surface fact). A reactive reader
|
|
10
|
+
* of a getter depends on the block's cell, so it re-runs when a commit
|
|
11
|
+
* changes the block's content.
|
|
10
12
|
*/
|
|
11
13
|
export declare class InlineBlock {
|
|
12
14
|
#private;
|
|
13
|
-
_def: "inline";
|
|
14
15
|
readonly: boolean;
|
|
15
16
|
readonly edytor: Edytor;
|
|
16
17
|
readonly id: string;
|
|
17
18
|
/** The block that shows the atom (the view updates it when the atom moves). */
|
|
18
19
|
blockId: string;
|
|
19
20
|
node: HTMLElement | undefined;
|
|
20
|
-
private attachedNodes;
|
|
21
21
|
constructor(edytor: Edytor, blockId: string, id: string);
|
|
22
22
|
get parent(): Block;
|
|
23
23
|
get selected(): boolean;
|
|
24
24
|
get type(): string;
|
|
25
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* The atom's `data` as plain state: reactive at any depth (through its
|
|
27
|
+
* block's cell), and writable; each write is its `patchData` operation
|
|
28
|
+
* (`session/props`).
|
|
29
|
+
*/
|
|
26
30
|
get data(): Record<string, any>;
|
|
27
31
|
get definition(): InlineBlockDefinition;
|
|
28
32
|
/** Position among the block's content parts. */
|
|
29
33
|
get index(): number;
|
|
30
|
-
/** Replace the atom's `data` — its block's `patchData` command (readonly, hooks). */
|
|
31
|
-
setData: (data: Record<string, unknown>) => void;
|
|
32
34
|
/** The atom is shown by a live block. */
|
|
33
35
|
get isInDocument(): boolean;
|
|
34
36
|
get value(): JSONInlineBlock;
|