edytor 1.0.0-rc.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +47 -141
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.d.ts +6 -1
- package/dist/clipboard/htmlFlow.js +26 -13
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +22 -17
- package/dist/cloudflare/DocumentRoom.js +10 -5
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +20 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +9 -30
- package/dist/cloudflare/room/storage.js +52 -104
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +160 -119
- package/dist/components/Block.svelte.d.ts +8 -3
- package/dist/components/Content.svelte +91 -44
- package/dist/components/CustomMark.svelte +46 -0
- package/dist/components/CustomMark.svelte.d.ts +11 -0
- package/dist/components/Edytor.svelte +80 -95
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/InlineBlock.svelte +4 -9
- package/dist/components/Mark.svelte +46 -35
- package/dist/components/Mark.svelte.d.ts +7 -0
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +48 -14
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +8 -13
- package/dist/crdt/data.js +30 -70
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/{plugins/blockHandles → dnd}/autoScroll.d.ts +2 -1
- package/dist/{plugins/blockHandles → dnd}/autoScroll.js +3 -3
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +34 -64
- package/dist/edytor.svelte.js +118 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -184
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +33 -72
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +92 -72
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -13
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +91 -314
- package/dist/labels.js +180 -396
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -151
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +63 -97
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +247 -268
- package/dist/plugins/blockHandles/BlockHandles.svelte +46 -29
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +29 -23
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -162
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +20 -17
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +46 -1
- package/dist/plugins/blockHandles/geometry.js +51 -4
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +59 -28
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +180 -105
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +79 -0
- package/dist/plugins/chrome.js +87 -0
- package/dist/plugins/code/CodeHeader.svelte +12 -58
- package/dist/plugins/code/CodeHeader.svelte.d.ts +1 -0
- package/dist/plugins/code/CodePlugin.svelte +75 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +25 -0
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +9 -0
- package/dist/plugins/code/code.css +5 -100
- package/dist/plugins/code/header.svelte.d.ts +47 -0
- package/dist/plugins/code/header.svelte.js +141 -0
- package/dist/plugins/code/languageMenu.svelte.d.ts +84 -0
- package/dist/plugins/code/languageMenu.svelte.js +199 -0
- package/dist/plugins/code/languages.d.ts +21 -10
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -430
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +6 -7
- package/dist/plugins/comments/commentsPlugin.d.ts +31 -10
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +18 -129
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +2 -1
- package/dist/plugins/equation/EquationPlugin.svelte +123 -168
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +5 -3
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +74 -36
- package/dist/plugins/equation/equation.svelte.js +74 -66
- package/dist/plugins/equation/importUrl.d.ts +6 -0
- package/dist/plugins/equation/importUrl.js +6 -0
- package/dist/plugins/equation/katex.d.ts +8 -0
- package/dist/plugins/equation/katex.js +77 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +5 -151
- package/dist/plugins/image/ImagePlugin.svelte +49 -117
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -24
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -57
- package/dist/plugins/image/controls.svelte.js +51 -174
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +39 -24
- package/dist/plugins/index.js +30 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +15 -0
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +9 -0
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +46 -0
- package/dist/plugins/marquee/MarqueeController.svelte.js +243 -0
- package/dist/plugins/marquee/marquee.d.ts +33 -0
- package/dist/plugins/marquee/marquee.js +89 -0
- package/dist/plugins/marquee/marqueePlugin.d.ts +32 -0
- package/dist/plugins/marquee/marqueePlugin.js +68 -0
- package/dist/plugins/media/AudioPlugin.svelte +3 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +124 -112
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +20 -7
- package/dist/plugins/media/EmbedPlugin.svelte +93 -77
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +21 -9
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +35 -111
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +55 -112
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +69 -0
- package/dist/plugins/media/empty.svelte.js +111 -0
- package/dist/plugins/media/media.d.ts +93 -30
- package/dist/plugins/media/media.js +79 -86
- package/dist/plugins/media/urlPaste.svelte.d.ts +9 -32
- package/dist/plugins/media/urlPaste.svelte.js +46 -75
- package/dist/plugins/mention/MentionPlugin.svelte +47 -124
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +11 -23
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +52 -108
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +11 -23
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +25 -0
- package/dist/plugins/richtext/CalloutIcon.svelte.d.ts +9 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +25 -0
- package/dist/plugins/richtext/EmptyBody.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +272 -148
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +37 -18
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.d.ts +9 -0
- package/dist/plugins/richtext/body.js +16 -0
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +97 -0
- package/dist/plugins/richtext/calloutIcons.svelte.js +214 -0
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +18 -11
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +93 -35
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +11 -24
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +32 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -16
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +96 -127
- package/dist/plugins/table/TableChrome.svelte.d.ts +5 -1
- package/dist/plugins/table/TablePlugin.svelte +116 -171
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +110 -117
- package/dist/plugins/table/chrome.svelte.js +643 -289
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +55 -134
- package/dist/plugins/table/table.d.ts +26 -7
- package/dist/plugins/table/table.js +23 -49
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +29 -66
- package/dist/plugins/toolbar/ToolbarController.svelte.js +151 -76
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +14 -13
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +6 -45
- package/dist/plugins/triggers/TriggerController.svelte.js +51 -96
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +167 -60
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +12 -10
- package/dist/selection/pointer.svelte.js +154 -71
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +263 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +11 -8
- package/dist/selection/visibility.js +23 -8
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +33 -39
- package/dist/session/attempt.js +61 -53
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +18 -3
- package/dist/session/navigation.js +194 -153
- package/dist/session/ports.d.ts +7 -0
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +8 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +64 -47
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +32 -0
- package/dist/surface/lines.js +43 -0
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +73 -77
- package/dist/surface/overlay.d.ts +48 -6
- package/dist/surface/overlay.js +133 -23
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +315 -126
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -525
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -43
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -447
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -116
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -12
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -83
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -7
- package/dist/plugins/richtext/labels.d.ts +0 -5
- package/dist/plugins/richtext/labels.js +0 -3
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -360
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/toolbar/LinkCard.svelte +0 -118
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -7
- package/dist/plugins/toolbar/Toolbar.svelte +0 -400
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -144
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
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
|
+
> **1.0.** Edytor `1.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 images and 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 (`
|
|
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 images and 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()`) and code blocks.
|
|
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` read
|
|
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` read like plain objects, and `edytor.patchData(id, [{ path, value }])` writes them; 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,21 +45,51 @@ 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
|
+
The package draws no menu, toolbar or block handle: each is a snippet you pass its plugin. Without them the editor works but shows none. The demo's ready-made, Notion-style ones are one copy away: copy [`src/routes/chrome`](https://github.com/beynar/edytor/tree/master/src/routes/chrome) into your app, make its imports name the package, and pass its plugins ([quick start](https://edytor.dev/docs/getting-started/quick-start#the-ready-made-menus-and-handles)):
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx degit beynar/edytor/src/routes/chrome src/lib/chrome
|
|
56
|
+
sed -i.bak 's#\$lib/index\.js#edytor#' src/lib/chrome/*.ts src/lib/chrome/*.svelte && rm src/lib/chrome/*.bak
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Take the folder of the version you install, by its tag (`beynar/edytor/src/routes/chrome#v1.0.0`): without one you get `master`'s, which follows the next release.
|
|
60
|
+
|
|
52
61
|
```svelte
|
|
53
62
|
<script lang="ts">
|
|
63
|
+
import { Edytor } from 'edytor';
|
|
64
|
+
import 'edytor/themes/notion.css';
|
|
54
65
|
import {
|
|
55
|
-
Edytor,
|
|
56
|
-
codePlugin,
|
|
57
|
-
markdownShortcutsPlugin,
|
|
58
66
|
slashMenuPlugin,
|
|
59
67
|
toolbarPlugin,
|
|
68
|
+
blockHandlesPlugin,
|
|
60
69
|
blockMenuPlugin,
|
|
70
|
+
codePlugin
|
|
71
|
+
} from '$lib/chrome/plugins';
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<div class="edytor-notion">
|
|
75
|
+
<Edytor
|
|
76
|
+
plugins={[slashMenuPlugin, toolbarPlugin, blockHandlesPlugin, blockMenuPlugin, codePlugin]}
|
|
77
|
+
/>
|
|
78
|
+
</div>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Or draw a menu yourself: your snippet draws it, the plugin gives it its keys and ARIA.
|
|
82
|
+
|
|
83
|
+
```svelte
|
|
84
|
+
<script lang="ts">
|
|
85
|
+
import {
|
|
86
|
+
Edytor,
|
|
87
|
+
createCodePlugin,
|
|
88
|
+
createSlashMenuPlugin,
|
|
89
|
+
createMarkdownShortcutsPlugin,
|
|
61
90
|
richTextPlaceholder,
|
|
62
|
-
type JSONDoc
|
|
91
|
+
type JSONDoc,
|
|
92
|
+
type SlashMenuController
|
|
63
93
|
} from 'edytor';
|
|
64
94
|
import 'edytor/themes/notion.css';
|
|
65
95
|
|
|
@@ -67,25 +97,35 @@ pnpm add edytor
|
|
|
67
97
|
children: [{ type: 'paragraph', content: [{ text: 'Hello, World!' }] }]
|
|
68
98
|
};
|
|
69
99
|
const plugins = [
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
100
|
+
// Notion's hints in empty blocks.
|
|
101
|
+
() => ({ placeholder: richTextPlaceholder }),
|
|
102
|
+
createCodePlugin(),
|
|
103
|
+
createMarkdownShortcutsPlugin(),
|
|
104
|
+
createSlashMenuPlugin({ menu })
|
|
75
105
|
];
|
|
76
106
|
</script>
|
|
77
107
|
|
|
108
|
+
<!-- Your snippet draws the menu; the plugin's attachments give it its keys and ARIA. -->
|
|
109
|
+
{#snippet menu(slash: SlashMenuController)}
|
|
110
|
+
<ul {@attach slash.popup}>
|
|
111
|
+
{#each slash.commands as command, index (command.id)}
|
|
112
|
+
<li
|
|
113
|
+
data-selected={slash.index === index}
|
|
114
|
+
{@attach slash.option(index)}
|
|
115
|
+
onclick={() => void slash.run(command)}
|
|
116
|
+
>
|
|
117
|
+
{command.label}
|
|
118
|
+
</li>
|
|
119
|
+
{/each}
|
|
120
|
+
</ul>
|
|
121
|
+
{/snippet}
|
|
122
|
+
|
|
78
123
|
<div class="edytor-notion">
|
|
79
|
-
<Edytor
|
|
80
|
-
{value}
|
|
81
|
-
{plugins}
|
|
82
|
-
placeholder={richTextPlaceholder}
|
|
83
|
-
onChange={(root) => console.log(root)}
|
|
84
|
-
/>
|
|
124
|
+
<Edytor {value} {plugins} onChange={(root) => console.log(root)} />
|
|
85
125
|
</div>
|
|
86
126
|
```
|
|
87
127
|
|
|
88
|
-
An editable editor is client-only: in SvelteKit, mount it once the page has hydrated ([quick start](https://edytor.dev/docs/getting-started/quick-start#mount-it-in-a-page)). `<Edytor>` adds the rich text, image, arrow-move and suggestions plugins after yours, and
|
|
128
|
+
An editable editor is client-only: in SvelteKit, mount it once the page has hydrated ([quick start](https://edytor.dev/docs/getting-started/quick-start#mount-it-in-a-page)). `<Edytor>` adds the rich text, image, arrow-move and suggestions plugins after yours. Every menu, toolbar, handle and panel is drawn by a snippet, yours or the demo's ([menus and handles](https://edytor.dev/docs/customization/menus)). To collaborate, name a room and a server running the [`edytor/cloudflare` room](https://edytor.dev/docs/server/quick-start):
|
|
89
129
|
|
|
90
130
|
```svelte
|
|
91
131
|
<Edytor
|
|
@@ -105,7 +145,7 @@ The [documentation site](https://edytor.dev/docs) is the single source for the A
|
|
|
105
145
|
- [Editor](https://edytor.dev/docs/editor/edytor-component): the component, commands, selection, history, clipboard, readonly
|
|
106
146
|
- [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
147
|
- [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)),
|
|
148
|
+
- [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
149
|
|
|
110
150
|
## Contributing
|
|
111
151
|
|
|
@@ -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,19 @@ 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
|
|
40
|
-
*
|
|
41
|
-
*
|
|
34
|
+
* The block's `data`, read-your-writes; a reactive reader depends on the
|
|
35
|
+
* block's cell. The root's is the document's data (`edytor.data`). Write
|
|
36
|
+
* it with `edytor.patchData(block.id, patches)`.
|
|
42
37
|
*/
|
|
43
|
-
get data(): Record<string, any
|
|
38
|
+
get data(): Readonly<Record<string, any>>;
|
|
44
39
|
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
40
|
get selected(): boolean;
|
|
51
41
|
get focused(): boolean;
|
|
52
42
|
/** May this block move at all: `canPlace` without a destination (drag handles). */
|
|
@@ -109,71 +99,6 @@ export declare class Block {
|
|
|
109
99
|
get firstText(): Text | undefined;
|
|
110
100
|
/** The last text of this block's own content (see {@link firstText}). */
|
|
111
101
|
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
102
|
/** Mark an element inside the block's markup as non-editable chrome (a header, a caption bar). */
|
|
178
103
|
void: (node: HTMLElement) => void;
|
|
179
104
|
/**
|
|
@@ -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,21 +75,15 @@ 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
|
-
#props;
|
|
92
79
|
/**
|
|
93
|
-
* The block's `data
|
|
94
|
-
*
|
|
95
|
-
*
|
|
80
|
+
* The block's `data`, read-your-writes; a reactive reader depends on the
|
|
81
|
+
* block's cell. The root's is the document's data (`edytor.data`). Write
|
|
82
|
+
* it with `edytor.patchData(block.id, patches)`.
|
|
96
83
|
*/
|
|
97
84
|
get data() {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
#current() {
|
|
85
|
+
if (this.isRoot)
|
|
86
|
+
return this.edytor.docData();
|
|
101
87
|
const { facade, cells } = this.edytor;
|
|
102
88
|
cells?.get(this.id);
|
|
103
89
|
const version = facade.version;
|
|
@@ -108,19 +94,11 @@ export class Block {
|
|
|
108
94
|
get definition() {
|
|
109
95
|
return this.edytor.definitionOf(this.type);
|
|
110
96
|
}
|
|
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
97
|
get selected() {
|
|
120
|
-
return this.edytor.selection.
|
|
98
|
+
return this.edytor.selection.isSelected(this);
|
|
121
99
|
}
|
|
122
100
|
get focused() {
|
|
123
|
-
return this.edytor.selection.
|
|
101
|
+
return this.edytor.selection.isFocused(this) && !this.selected;
|
|
124
102
|
}
|
|
125
103
|
/** May this block move at all: `canPlace` without a destination (drag handles). */
|
|
126
104
|
get movable() {
|
|
@@ -140,27 +118,27 @@ export class Block {
|
|
|
140
118
|
}
|
|
141
119
|
/** @internal */
|
|
142
120
|
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;
|
|
121
|
+
return this.#editable(false);
|
|
156
122
|
}
|
|
157
123
|
/** @internal */
|
|
158
124
|
get lastEditableText() {
|
|
159
|
-
|
|
125
|
+
return this.#editable(true);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* The first (or `last`) editable text of the block's own content, else
|
|
129
|
+
* of its subtree. Only a RENDERED text part is editable — a container's
|
|
130
|
+
* phantom content slot holds a Text with no `node`. Every child is
|
|
131
|
+
* scanned: the first can be noneditable (a void divider) while a later
|
|
132
|
+
* one owns the text the caret must land in.
|
|
133
|
+
*/
|
|
134
|
+
#editable(last) {
|
|
135
|
+
const rendered = (part) => part instanceof Text && part.node != null;
|
|
136
|
+
const own = last ? this.content.findLast(rendered) : this.content.find(rendered);
|
|
160
137
|
if (own)
|
|
161
138
|
return own;
|
|
162
|
-
|
|
163
|
-
|
|
139
|
+
const children = this.children;
|
|
140
|
+
for (const child of last ? children.reverse() : children) {
|
|
141
|
+
const text = child.#editable(last);
|
|
164
142
|
if (text)
|
|
165
143
|
return text;
|
|
166
144
|
}
|
|
@@ -195,10 +173,24 @@ export class Block {
|
|
|
195
173
|
return this.edytor.facade.isVisibleBlock(this.id);
|
|
196
174
|
}
|
|
197
175
|
get nextBlock() {
|
|
198
|
-
return this
|
|
176
|
+
return this.#sibling(1);
|
|
199
177
|
}
|
|
200
178
|
get previousBlock() {
|
|
201
|
-
return this
|
|
179
|
+
return this.#sibling(-1);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The sibling `step` places away (none past either end): one id read, no
|
|
183
|
+
* handle for every sibling (a top-level block's are the whole page's).
|
|
184
|
+
* Tracks what `parent` and `index` track: this block's cell and its
|
|
185
|
+
* parent's child list.
|
|
186
|
+
*/
|
|
187
|
+
#sibling(step) {
|
|
188
|
+
const parent = this.parent;
|
|
189
|
+
if (!parent)
|
|
190
|
+
return null;
|
|
191
|
+
const ids = this.edytor.facade.childrenIds(parent.isRoot ? null : parent.id);
|
|
192
|
+
const id = ids[this.index + step];
|
|
193
|
+
return id === undefined ? null : this.edytor.idToBlock.block(id);
|
|
202
194
|
}
|
|
203
195
|
get closestPreviousBlock() {
|
|
204
196
|
return this.edytor.blockBefore(this);
|
|
@@ -291,40 +283,6 @@ export class Block {
|
|
|
291
283
|
return this.children.at(-1)?.lastText;
|
|
292
284
|
return this.rendersContent ? this.content.findLast((p) => p instanceof Text) : undefined;
|
|
293
285
|
}
|
|
294
|
-
addChildBlock = batch('addChildBlock', addChildBlock);
|
|
295
|
-
addChildBlocks = batch('addChildBlocks', addChildBlocks);
|
|
296
|
-
insertBlockAfter = batch('insertBlockAfter', insertBlockAfter, prepareInsertAfter, blockOf);
|
|
297
|
-
insertBlockBefore = batch('insertBlockBefore', insertBlockBefore, prepareInsertBefore, blockOf);
|
|
298
|
-
splitBlock = batch('splitBlock', splitBlock, prepareSplit, blockOf);
|
|
299
|
-
duplicateBlock = batch('duplicateBlock', duplicateBlock, prepareDuplicate, blockOf);
|
|
300
|
-
removeBlock = batch('removeBlock', removeBlock, prepareRemove);
|
|
301
|
-
unNestBlock = revealed(batch('unNestBlock', unNestBlock, prepareUnNest));
|
|
302
|
-
mergeBlockBackward = batch('mergeBlockBackward', mergeBlockBackward, prepareMergeBackward, blockOf);
|
|
303
|
-
mergeBlockForward = batch('mergeBlockForward', mergeBlockForward, prepareMergeForward, blockOf);
|
|
304
|
-
nestBlock = revealed(batch('nestBlock', nestBlock, prepareNest));
|
|
305
|
-
setBlock = batch('setBlock', setBlock, prepareSet);
|
|
306
|
-
moveBlock = revealed(batch('moveBlock', moveBlock, prepareMove));
|
|
307
|
-
moveBlocks = revealed(batch('moveBlocks', moveBlocks, prepareMoves));
|
|
308
|
-
pushContentIntoBlock = batch('pushContentIntoBlock', pushContentIntoBlock);
|
|
309
|
-
removeInlineBlock = batch('removeInlineBlock', removeInlineBlock, prepareRemoveInline);
|
|
310
|
-
patchData = batch('patchData', patchData, preparePatch);
|
|
311
|
-
#addInline = batch('addInlineBlock', addInlineBlock, undefined, textAfterAtom);
|
|
312
|
-
/**
|
|
313
|
-
* Insert an inline atom: at `offset` of the block's content (block
|
|
314
|
-
* offsets, an inline atom counting 1; a caret's), or at `index` of the
|
|
315
|
-
* text segment `text`. One `addInlineBlock` operation (its payload names
|
|
316
|
-
* the segment). Answers the text segment right after the atom, where a
|
|
317
|
-
* caret goes (`null` when it was not written, `undefined` when refused).
|
|
318
|
-
*/
|
|
319
|
-
addInlineBlock = (payload) => {
|
|
320
|
-
if (!('offset' in payload))
|
|
321
|
-
return this.#addInline(payload);
|
|
322
|
-
const at = this.textAtOffset(Math.max(0, payload.offset));
|
|
323
|
-
return at ? this.#addInline({ index: at.offset, text: at.text, block: payload.block }) : null;
|
|
324
|
-
};
|
|
325
|
-
normalizeContent = batch('normalizeContent', normalizeContent);
|
|
326
|
-
normalizeChildren = batch('normalizeChildren', normalizeChildren);
|
|
327
|
-
deleteContentAtRange = batch('deleteContentAtRange', deleteContentAtRange, prepareDeleteRange);
|
|
328
286
|
/** Mark an element inside the block's markup as non-editable chrome (a header, a caption bar). */
|
|
329
287
|
void = voidChrome;
|
|
330
288
|
/**
|
|
@@ -352,60 +310,6 @@ export class Block {
|
|
|
352
310
|
}
|
|
353
311
|
return hit;
|
|
354
312
|
};
|
|
355
|
-
// ── JSON insertion (specs are data; `new Block({block})` is gone) ──
|
|
356
|
-
/**
|
|
357
|
-
* Insert children at `index`: a JSON spec is created (its id kept, minted
|
|
358
|
-
* when missing); a block handle moves there with its identity. A raw
|
|
359
|
-
* write for the editor's own commands: nothing on a view whose dispatcher
|
|
360
|
-
* refuses writes (readonly, a read-only document).
|
|
361
|
-
* @internal
|
|
362
|
-
*/
|
|
363
|
-
insertChildren = (index, blocks) => {
|
|
364
|
-
if (!this.edytor.dispatcher.permits())
|
|
365
|
-
return;
|
|
366
|
-
const { facade } = this.edytor;
|
|
367
|
-
const parent = this.isRoot ? null : this.id;
|
|
368
|
-
blocks.forEach((block, k) => {
|
|
369
|
-
if (block instanceof Block)
|
|
370
|
-
block.model?.moveTo({ parent: this.model, index: index + k });
|
|
371
|
-
else
|
|
372
|
-
facade.insertBlock({ parent, index: index + k }, jsonBlockToSpec(block));
|
|
373
|
-
});
|
|
374
|
-
};
|
|
375
|
-
/**
|
|
376
|
-
* Delete `length` visible children from `index`, each with its subtree (a
|
|
377
|
-
* document delete). Raw, as `insertChildren`.
|
|
378
|
-
* @internal
|
|
379
|
-
*/
|
|
380
|
-
deleteChildren = (index, length = 1) => {
|
|
381
|
-
if (!this.edytor.dispatcher.permits())
|
|
382
|
-
return;
|
|
383
|
-
const ids = this.edytor.facade.childrenIds(this.isRoot ? null : this.id);
|
|
384
|
-
for (const id of ids.slice(index, index + length).reverse())
|
|
385
|
-
this.edytor.facade.block(id).delete({ keepChildren: false });
|
|
386
|
-
};
|
|
387
|
-
/**
|
|
388
|
-
* Insert content before part `index` (a text segment or an inline atom):
|
|
389
|
-
* each entry is a text's runs or an atom, as JSON. Raw, as `insertChildren`.
|
|
390
|
-
* @internal
|
|
391
|
-
*/
|
|
392
|
-
insertParts = (index, parts) => {
|
|
393
|
-
if (!this.edytor.dispatcher.permits())
|
|
394
|
-
return;
|
|
395
|
-
const model = this.model;
|
|
396
|
-
if (!model)
|
|
397
|
-
return;
|
|
398
|
-
const all = this.edytor.idToBlock.parts(this.id);
|
|
399
|
-
let at = all[index]?.start ?? model.length;
|
|
400
|
-
for (const item of jsonContentToItems(parts.flat())) {
|
|
401
|
-
if (item.kind === 'inline')
|
|
402
|
-
model.insertInline(at++, item);
|
|
403
|
-
else if (item.text) {
|
|
404
|
-
model.insertText(at, item.text, item.marks);
|
|
405
|
-
at += item.text.length;
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
};
|
|
409
313
|
/** The declared view state (`open` on a `details`) the block's last element held. */
|
|
410
314
|
#viewState = [];
|
|
411
315
|
/**
|
|
@@ -414,14 +318,16 @@ export class Block {
|
|
|
414
318
|
* view state: an open toggle stays open.
|
|
415
319
|
* @internal
|
|
416
320
|
*/
|
|
417
|
-
attach = (node) => {
|
|
321
|
+
attach = (node, owned) => {
|
|
418
322
|
const names = this.definition.viewState ?? [];
|
|
419
323
|
const read = (from) => names.flatMap((name) => (from.hasAttribute(name) ? [[name, from.getAttribute(name)]] : []));
|
|
420
324
|
for (const [name, value] of this.node ? read(this.node) : this.#viewState)
|
|
421
325
|
if (names.includes(name))
|
|
422
326
|
node.setAttribute(name, value);
|
|
423
327
|
this.node = node;
|
|
424
|
-
const release = this.edytor.surface.register(node, 'block', this.id);
|
|
328
|
+
const release = this.edytor.surface.register(node, 'block', this.id, undefined, owned);
|
|
329
|
+
// Its attributes follow its own selected and focused membership.
|
|
330
|
+
this.edytor.selection.keep(this);
|
|
425
331
|
// A block laid out again with no commit moves the chrome beside it (the overlay measures).
|
|
426
332
|
const unobserve = this.edytor.overlay.observe(node);
|
|
427
333
|
const onDestroy = this.edytor.plugins.flatMap((plugin) => {
|
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
|
};
|