edytor 1.0.0-rc.3 → 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 +27 -137
- 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.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 +19 -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/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 +39 -55
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +53 -96
- package/dist/components/Edytor.svelte.d.ts +8 -12
- 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 +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/dnd/autoScroll.js +1 -2
- 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 +116 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +185 -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 +1 -1
- package/dist/events/onDrop.js +27 -69
- 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 +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -14
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +81 -320
- package/dist/labels.js +180 -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 +39 -94
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +190 -247
- package/dist/plugins/blockHandles/BlockHandles.svelte +27 -17
- 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 +129 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +2 -1
- package/dist/plugins/blockHandles/geometry.js +6 -6
- 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 +3 -35
- package/dist/plugins/code/CodePlugin.svelte +50 -53
- 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 -19
- 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 -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 -165
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +2 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- 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/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 +45 -134
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -42
- 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.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 +31 -26
- package/dist/plugins/index.js +29 -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 +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 +3 -90
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -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 +35 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -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 +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -99
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +36 -44
- package/dist/plugins/media/empty.svelte.js +41 -45
- package/dist/plugins/media/media.d.ts +90 -44
- package/dist/plugins/media/media.js +77 -99
- 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 +42 -123
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +6 -25
- 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 +47 -107
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +6 -25
- 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 +161 -177
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +33 -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/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 +339 -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 +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +154 -59
- 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 +33 -39
- package/dist/session/attempt.js +61 -55
- 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 +3 -2
- package/dist/session/navigation.js +127 -168
- package/dist/session/ports.d.ts +2 -7
- 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/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 +263 -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/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type Snippet } from 'svelte';
|
|
2
2
|
import type { Attachment } from 'svelte/attachments';
|
|
3
3
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
4
|
-
import { type EquationLabels, type PartialLabels } from '../../labels.js';
|
|
5
4
|
/** The part of KaTeX the plugin uses: `katex.renderToString`. */
|
|
6
5
|
export type KatexLike = {
|
|
7
6
|
renderToString: (tex: string, options?: Record<string, unknown>) => string;
|
|
@@ -30,17 +29,42 @@ export type EquationPluginOptions = {
|
|
|
30
29
|
katex?: KatexLoader | string | false;
|
|
31
30
|
/** TeX macros every equation reads (`{ '\\RR': '\\mathbb{R}' }`). */
|
|
32
31
|
macros?: Record<string, string>;
|
|
33
|
-
/** The words the equations and their editor show, over the English ones. */
|
|
34
|
-
labels?: PartialLabels<'equation'>;
|
|
35
|
-
/** The slash menu's keywords by command id (`block.equation`, `equation.inline`), which replace its own. */
|
|
36
|
-
keywords?: Partial<Record<string, string[]>>;
|
|
37
32
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* (centered under a block equation
|
|
41
|
-
* source's field.
|
|
33
|
+
* The editor's panel and its words (the source's field, KaTeX's error, Done): it
|
|
34
|
+
* renders under the edited equation while `editor.target` is set
|
|
35
|
+
* (centered under a block equation; without it, nothing shows). Put
|
|
36
|
+
* `{@attach editor.field}` on the source's field.
|
|
42
37
|
*/
|
|
43
38
|
panel?: Snippet<[EquationEditor]>;
|
|
39
|
+
/**
|
|
40
|
+
* An empty equation's placeholder (default: `√x` and the view's
|
|
41
|
+
* `equation.blockPlaceholder` or `inlinePlaceholder`). A click on it
|
|
42
|
+
* opens the editor, as on any equation.
|
|
43
|
+
*/
|
|
44
|
+
placeholder?: Snippet<[EquationPlaceholderPayload]>;
|
|
45
|
+
/**
|
|
46
|
+
* An equation KaTeX cannot read (default: its source, marked invalid,
|
|
47
|
+
* KaTeX's message in its title).
|
|
48
|
+
*/
|
|
49
|
+
error?: Snippet<[EquationErrorPayload]>;
|
|
50
|
+
};
|
|
51
|
+
/** What an equation's `placeholder` snippet receives. */
|
|
52
|
+
export type EquationPlaceholderPayload = {
|
|
53
|
+
/** A block equation (`true`) or an inline one. */
|
|
54
|
+
display: boolean;
|
|
55
|
+
/** The view's placeholder for it (`equation.blockPlaceholder`, `inlinePlaceholder`). */
|
|
56
|
+
label: string;
|
|
57
|
+
};
|
|
58
|
+
/** What an equation's `error` snippet receives. */
|
|
59
|
+
export type EquationErrorPayload = {
|
|
60
|
+
/** A block equation (`true`) or an inline one. */
|
|
61
|
+
display: boolean;
|
|
62
|
+
/** Its TeX source. */
|
|
63
|
+
expression: string;
|
|
64
|
+
/** KaTeX's message. */
|
|
65
|
+
error: string;
|
|
66
|
+
/** The view's word for it (`equation.invalid`). */
|
|
67
|
+
label: string;
|
|
44
68
|
};
|
|
45
69
|
/** The data of a block equation and of an inline one: its TeX source. */
|
|
46
70
|
export type EquationData = {
|
|
@@ -87,23 +111,11 @@ export declare class EquationRenderer {
|
|
|
87
111
|
* the display asked (`display="block"`: a block), else `undefined`.
|
|
88
112
|
*/
|
|
89
113
|
export declare const parseEquation: (element: HTMLElement, display: boolean) => EquationData | undefined;
|
|
90
|
-
/** Each view's equation labels: the first equation plugin listed claims them, as its kinds. */
|
|
91
|
-
export declare const equationLabels: {
|
|
92
|
-
claim: (view: object | undefined, labels: EquationLabels) => void;
|
|
93
|
-
of: (view: object | undefined) => EquationLabels;
|
|
94
|
-
};
|
|
95
114
|
/** The equation being edited: a block equation, or an inline one (`atom`) in block `block`. */
|
|
96
115
|
export type EquationTarget = {
|
|
97
116
|
block: string;
|
|
98
117
|
atom?: string;
|
|
99
118
|
};
|
|
100
|
-
/** The edited equation's box, layer-relative. */
|
|
101
|
-
export type EquationBox = {
|
|
102
|
-
x: number;
|
|
103
|
-
y: number;
|
|
104
|
-
width: number;
|
|
105
|
-
height: number;
|
|
106
|
-
};
|
|
107
119
|
/**
|
|
108
120
|
* One view's equation editor (Notion's): a click on an equation of an
|
|
109
121
|
* editable view (Enter on a selected one, or a new empty one) opens its
|
|
@@ -117,7 +129,7 @@ export type EquationBox = {
|
|
|
117
129
|
*
|
|
118
130
|
* What a `panel` snippet receives: the equation being edited (`target`,
|
|
119
131
|
* `display` for a block one), its source (`expression`, written by
|
|
120
|
-
* `set`), KaTeX's error (`error`)
|
|
132
|
+
* `set`), KaTeX's error (`error`) and `close()`.
|
|
121
133
|
* Put `{@attach editor.field}` on the source's field: it takes the focus
|
|
122
134
|
* as the editor opens, Enter (Shift+Enter: a newline in a block equation)
|
|
123
135
|
* and Escape close the editor, and focus leaving the panel closes it.
|
|
@@ -125,8 +137,6 @@ export type EquationBox = {
|
|
|
125
137
|
export declare class EquationEditor {
|
|
126
138
|
#private;
|
|
127
139
|
private edytor;
|
|
128
|
-
/** The plugin's words (`editor`, `placeholder`, `done`, …). */
|
|
129
|
-
readonly labels: EquationLabels;
|
|
130
140
|
/** The equation being edited (reactive). */
|
|
131
141
|
target: EquationTarget | null;
|
|
132
142
|
/** The view is readonly (reactive): the editor closes. */
|
|
@@ -162,6 +172,9 @@ export declare class EquationEditor {
|
|
|
162
172
|
export type EquationView = {
|
|
163
173
|
renderer: EquationRenderer;
|
|
164
174
|
editor: EquationEditor;
|
|
175
|
+
/** The app's markup for an empty equation and an unreadable one, if any. */
|
|
176
|
+
placeholder?: Snippet<[EquationPlaceholderPayload]>;
|
|
177
|
+
error?: Snippet<[EquationErrorPayload]>;
|
|
165
178
|
};
|
|
166
179
|
/** By view. */
|
|
167
180
|
export declare const equationViews: WeakMap<Edytor, EquationView>;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { untrack } from 'svelte';
|
|
2
|
+
import { blockSelection } from '../../session/selection.js';
|
|
2
3
|
import { InlineBlock } from '../../block/inlineBlock.svelte.js';
|
|
3
4
|
import { takeKeys } from '../../events/onFocus.js';
|
|
4
|
-
import {
|
|
5
|
+
import { Anchored } from '../anchored.svelte.js';
|
|
6
|
+
import { escapeHtml } from '../../clipboard/serializeClipboardFragment.js';
|
|
7
|
+
import { all, listen } from '../../utils/listen.js';
|
|
5
8
|
/** The MathML annotation that carries an equation's TeX source. */
|
|
6
9
|
export const TEX = 'application/x-tex';
|
|
7
10
|
/** An equation's TeX source: its `expression`, a string. */
|
|
@@ -9,7 +12,6 @@ export const expressionOf = (data) => {
|
|
|
9
12
|
const value = data?.expression;
|
|
10
13
|
return typeof value === 'string' ? value : '';
|
|
11
14
|
};
|
|
12
|
-
const escape = (value) => value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
13
15
|
/** The cap of the drawings each renderer keeps. */
|
|
14
16
|
const CACHE = 256;
|
|
15
17
|
/**
|
|
@@ -71,7 +73,7 @@ export class EquationRenderer {
|
|
|
71
73
|
// TeX KaTeX cannot read: the source as text, below.
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
|
-
const source =
|
|
76
|
+
const source = escapeHtml(tex);
|
|
75
77
|
return (`<span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"${display ? ' display="block"' : ''}>` +
|
|
76
78
|
`<semantics><mrow><mtext>${source}</mtext></mrow><annotation encoding="${TEX}">${source}</annotation></semantics></math></span>`);
|
|
77
79
|
};
|
|
@@ -118,10 +120,6 @@ export const parseEquation = (element, display) => {
|
|
|
118
120
|
math.getAttribute('alttext');
|
|
119
121
|
return tex?.trim() ? { expression: tex.trim() } : undefined;
|
|
120
122
|
};
|
|
121
|
-
/** Each view's equation labels: the first equation plugin listed claims them, as its kinds. */
|
|
122
|
-
export const equationLabels = viewLabels('equation');
|
|
123
|
-
/** The overlay host the editor renders in (the overlay's mount names it). */
|
|
124
|
-
const HOST = '[data-edytor-equation-editor-host]';
|
|
125
123
|
/**
|
|
126
124
|
* One view's equation editor (Notion's): a click on an equation of an
|
|
127
125
|
* editable view (Enter on a selected one, or a new empty one) opens its
|
|
@@ -135,7 +133,7 @@ const HOST = '[data-edytor-equation-editor-host]';
|
|
|
135
133
|
*
|
|
136
134
|
* What a `panel` snippet receives: the equation being edited (`target`,
|
|
137
135
|
* `display` for a block one), its source (`expression`, written by
|
|
138
|
-
* `set`), KaTeX's error (`error`)
|
|
136
|
+
* `set`), KaTeX's error (`error`) and `close()`.
|
|
139
137
|
* Put `{@attach editor.field}` on the source's field: it takes the focus
|
|
140
138
|
* as the editor opens, Enter (Shift+Enter: a newline in a block equation)
|
|
141
139
|
* and Escape close the editor, and focus leaving the panel closes it.
|
|
@@ -143,23 +141,20 @@ const HOST = '[data-edytor-equation-editor-host]';
|
|
|
143
141
|
export class EquationEditor {
|
|
144
142
|
edytor;
|
|
145
143
|
renderer;
|
|
146
|
-
labels;
|
|
147
144
|
/** The equation being edited (reactive). */
|
|
148
145
|
target = $state.raw(null);
|
|
149
146
|
/**
|
|
150
|
-
*
|
|
147
|
+
* The editor's panel under the edited equation: its place, and what closes it.
|
|
151
148
|
* @internal
|
|
152
149
|
*/
|
|
153
|
-
|
|
150
|
+
panel;
|
|
154
151
|
/** @internal */
|
|
155
152
|
constructor(edytor,
|
|
156
153
|
/** @internal */
|
|
157
|
-
renderer
|
|
158
|
-
/** The plugin's words (`editor`, `placeholder`, `done`, …). */
|
|
159
|
-
labels = englishLabels.equation) {
|
|
154
|
+
renderer) {
|
|
160
155
|
this.edytor = edytor;
|
|
161
156
|
this.renderer = renderer;
|
|
162
|
-
this.
|
|
157
|
+
this.panel = new Anchored(edytor, 'edytor-equation-editor-host', () => (this.target ? this.#node(this.target) : undefined), () => this.close(false));
|
|
163
158
|
}
|
|
164
159
|
/** The view is readonly (reactive): the editor closes. */
|
|
165
160
|
get readonly() {
|
|
@@ -171,13 +166,7 @@ export class EquationEditor {
|
|
|
171
166
|
* @internal
|
|
172
167
|
*/
|
|
173
168
|
get place() {
|
|
174
|
-
|
|
175
|
-
if (!this.target || !box)
|
|
176
|
-
return null;
|
|
177
|
-
return {
|
|
178
|
-
left: this.display ? box.x + box.width / 2 : box.x,
|
|
179
|
-
top: box.y + box.height + 6
|
|
180
|
-
};
|
|
169
|
+
return this.target && this.panel.place(6, this.display);
|
|
181
170
|
}
|
|
182
171
|
/** A block equation is edited (a field of several lines). */
|
|
183
172
|
get display() {
|
|
@@ -213,9 +202,9 @@ export class EquationEditor {
|
|
|
213
202
|
const target = this.target;
|
|
214
203
|
if (!target || expression === this.expression)
|
|
215
204
|
return;
|
|
216
|
-
const
|
|
217
|
-
if (
|
|
218
|
-
|
|
205
|
+
const at = target.atom ? { block: target.block, atom: target.atom } : target.block;
|
|
206
|
+
if (target.atom ? this.#atom(target) : this.#block(target))
|
|
207
|
+
this.edytor.patchData(at, [{ path: ['expression'], value: expression }]);
|
|
219
208
|
};
|
|
220
209
|
/**
|
|
221
210
|
* Close the editor. An inline equation left empty is removed; then, with
|
|
@@ -227,7 +216,7 @@ export class EquationEditor {
|
|
|
227
216
|
if (!target)
|
|
228
217
|
return;
|
|
229
218
|
this.target = null;
|
|
230
|
-
this.box = null;
|
|
219
|
+
this.panel.box = null;
|
|
231
220
|
this.edytor.overlay.invalidate();
|
|
232
221
|
const block = this.#block(target);
|
|
233
222
|
if (!block)
|
|
@@ -239,7 +228,7 @@ export class EquationEditor {
|
|
|
239
228
|
return;
|
|
240
229
|
const offset = offsetOf(block, atom);
|
|
241
230
|
if (!expressionOf(atom.data) && this.edytor.dispatcher.permits()) {
|
|
242
|
-
block.
|
|
231
|
+
this.edytor.removeInline(block.id, atom.id);
|
|
243
232
|
if (keys)
|
|
244
233
|
selection.setCaret({ block, offset });
|
|
245
234
|
}
|
|
@@ -247,7 +236,7 @@ export class EquationEditor {
|
|
|
247
236
|
selection.setCaret({ block, offset: offset + 1 });
|
|
248
237
|
}
|
|
249
238
|
else if (keys)
|
|
250
|
-
selection.
|
|
239
|
+
selection.select(blockSelection([block.id]));
|
|
251
240
|
if (keys)
|
|
252
241
|
takeKeys(this.edytor);
|
|
253
242
|
};
|
|
@@ -270,8 +259,8 @@ export class EquationEditor {
|
|
|
270
259
|
this.close();
|
|
271
260
|
};
|
|
272
261
|
const element = node;
|
|
273
|
-
element
|
|
274
|
-
element
|
|
262
|
+
const off = listen(element, 'keydown', keydown);
|
|
263
|
+
const off2 = listen(element, 'focusout', this.panel.blurred);
|
|
275
264
|
// Each equation the editor opens on: the field takes the focus, the caret at the end.
|
|
276
265
|
$effect(() => {
|
|
277
266
|
if (!this.target)
|
|
@@ -283,64 +272,8 @@ export class EquationEditor {
|
|
|
283
272
|
node.setSelectionRange(node.value.length, node.value.length);
|
|
284
273
|
});
|
|
285
274
|
});
|
|
286
|
-
return ()
|
|
287
|
-
element.removeEventListener('keydown', keydown);
|
|
288
|
-
element.removeEventListener('focusout', this.#blurred);
|
|
289
|
-
};
|
|
275
|
+
return all(off, off2);
|
|
290
276
|
});
|
|
291
|
-
/**
|
|
292
|
-
* The view turned readonly: the editor closes, the equation as it is.
|
|
293
|
-
* @internal
|
|
294
|
-
*/
|
|
295
|
-
lock = () => this.close(false);
|
|
296
|
-
/**
|
|
297
|
-
* A press anywhere (capture): one outside the editor and its equation closes it.
|
|
298
|
-
* @internal
|
|
299
|
-
*/
|
|
300
|
-
pressed = (event) => {
|
|
301
|
-
const target = this.target;
|
|
302
|
-
if (!target)
|
|
303
|
-
return;
|
|
304
|
-
const at = event.target;
|
|
305
|
-
if (at?.closest?.(HOST))
|
|
306
|
-
return;
|
|
307
|
-
if (at instanceof Node && this.#node(target)?.contains(at))
|
|
308
|
-
return;
|
|
309
|
-
this.close(false);
|
|
310
|
-
};
|
|
311
|
-
/** Focus left the field for somewhere outside the editor: it closes. */
|
|
312
|
-
#blurred = (event) => {
|
|
313
|
-
const to = event.relatedTarget;
|
|
314
|
-
const panel = event.currentTarget?.closest(HOST);
|
|
315
|
-
// No new focus (the window went to the background): it stays.
|
|
316
|
-
if (!(to instanceof Node) || panel?.contains(to))
|
|
317
|
-
return;
|
|
318
|
-
this.close(false);
|
|
319
|
-
};
|
|
320
|
-
/**
|
|
321
|
-
* The overlay measure: the edited equation's box; gone, the editor closes.
|
|
322
|
-
* @internal
|
|
323
|
-
*/
|
|
324
|
-
measure = (host, origin) => {
|
|
325
|
-
const target = this.target;
|
|
326
|
-
const node = target ? this.#node(target) : null;
|
|
327
|
-
const rect = node?.isConnected ? node.getBoundingClientRect() : null;
|
|
328
|
-
const box = rect
|
|
329
|
-
? {
|
|
330
|
-
x: rect.left - origin.left,
|
|
331
|
-
y: rect.top - origin.top,
|
|
332
|
-
width: rect.width,
|
|
333
|
-
height: rect.height
|
|
334
|
-
}
|
|
335
|
-
: null;
|
|
336
|
-
return () => {
|
|
337
|
-
Object.assign(host.style, { position: 'absolute', left: '0px', top: '0px' });
|
|
338
|
-
if (target && !node)
|
|
339
|
-
return this.close(false);
|
|
340
|
-
if (!sameBox(box, this.box))
|
|
341
|
-
this.box = box;
|
|
342
|
-
};
|
|
343
|
-
};
|
|
344
277
|
#block = (target) => {
|
|
345
278
|
const block = this.edytor.idToBlock.get(target.block);
|
|
346
279
|
return block?.isInTree ? block : undefined;
|
|
@@ -368,10 +301,3 @@ const offsetOf = (block, atom) => {
|
|
|
368
301
|
};
|
|
369
302
|
/** By view. */
|
|
370
303
|
export const equationViews = new WeakMap();
|
|
371
|
-
const sameBox = (a, b) => a === b ||
|
|
372
|
-
(a !== null &&
|
|
373
|
-
b !== null &&
|
|
374
|
-
a.x === b.x &&
|
|
375
|
-
a.y === b.y &&
|
|
376
|
-
a.width === b.width &&
|
|
377
|
-
a.height === b.height);
|
|
@@ -21,21 +21,18 @@ const stylesheet = (href) => {
|
|
|
21
21
|
let link = [...head.querySelectorAll(`link[${MARK}]`)].find((known) => known.getAttribute('href') === href);
|
|
22
22
|
if (link?.sheet)
|
|
23
23
|
return Promise.resolve();
|
|
24
|
-
|
|
25
|
-
const done = () => resolve();
|
|
26
|
-
link?.addEventListener('load', done, { once: true });
|
|
27
|
-
link?.addEventListener('error', done, { once: true });
|
|
28
|
-
if (link)
|
|
29
|
-
return;
|
|
24
|
+
if (!link) {
|
|
30
25
|
link = document.createElement('link');
|
|
31
26
|
link.rel = 'stylesheet';
|
|
32
27
|
link.href = href;
|
|
33
28
|
link.setAttribute(MARK, '');
|
|
34
|
-
link.addEventListener('load', done, { once: true });
|
|
35
|
-
link.addEventListener('error', done, { once: true });
|
|
36
29
|
head.append(link);
|
|
30
|
+
}
|
|
31
|
+
const known = link;
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
for (const type of ['load', 'error'])
|
|
34
|
+
known.addEventListener(type, () => resolve(), { once: true });
|
|
37
35
|
});
|
|
38
|
-
return settled;
|
|
39
36
|
};
|
|
40
37
|
/** The KaTeX a module exports: itself, or its default export. */
|
|
41
38
|
const katexOf = (module) => {
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { Attachment } from 'svelte/attachments';
|
|
2
|
+
import type { Commands } from '../../plugins.js';
|
|
3
3
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
4
4
|
import type { CommandResult } from '../../session/commands.js';
|
|
5
5
|
import { type FindMatch } from './search.js';
|
|
6
|
-
import { type FindLabels } from '../../labels.js';
|
|
7
6
|
/** What `replaceMatches` (one command, one undo step) writes: each match replaced by `replacement`. */
|
|
8
|
-
export type ReplaceMatches =
|
|
7
|
+
export type ReplaceMatches = Commands['replaceMatches'];
|
|
9
8
|
/**
|
|
10
9
|
* The find bar's state and actions (`plugins/find`): the query, the matches
|
|
11
10
|
* in reading order, the current one and the replacements. It reads the
|
|
@@ -15,14 +14,10 @@ export type ReplaceMatches = BlockOperations['replaceMatches'];
|
|
|
15
14
|
export declare class FindController {
|
|
16
15
|
#private;
|
|
17
16
|
private edytor;
|
|
18
|
-
/** The words the bar shows (the plugin's `labels`): read them in a custom `bar`. */
|
|
19
|
-
readonly labels: FindLabels;
|
|
20
17
|
isOpen: boolean;
|
|
21
18
|
/** The replacement text. */
|
|
22
19
|
replacement: string;
|
|
23
|
-
constructor(edytor: Edytor
|
|
24
|
-
/** The words the bar shows (the plugin's `labels`): read them in a custom `bar`. */
|
|
25
|
-
labels?: FindLabels);
|
|
20
|
+
constructor(edytor: Edytor);
|
|
26
21
|
/** What the bar searches for; setting it shows the current match. */
|
|
27
22
|
get query(): string;
|
|
28
23
|
set query(value: string);
|
|
@@ -58,10 +53,10 @@ export declare class FindController {
|
|
|
58
53
|
replace: () => CommandResult["status"];
|
|
59
54
|
/** Replace every match: one command, one undo step. Answers its status. */
|
|
60
55
|
replaceAll: () => CommandResult["status"];
|
|
61
|
-
/** The query field (`
|
|
62
|
-
field:
|
|
63
|
-
/** The replacement field (`
|
|
64
|
-
replaceField:
|
|
56
|
+
/** The query field (`{@attach find.field}`): focused on each Mod+F; Enter, Shift+Enter, Escape, Mod+F. */
|
|
57
|
+
field: Attachment<HTMLInputElement>;
|
|
58
|
+
/** The replacement field (`{@attach find.replaceField}`): Enter replaces, Escape closes. */
|
|
59
|
+
replaceField: Attachment<HTMLInputElement>;
|
|
65
60
|
/** Stop following the document (the editor is going away). */
|
|
66
61
|
destroy: () => void;
|
|
67
62
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { untrack } from 'svelte';
|
|
1
2
|
import { marksForInsertion } from '../../session/editing/text.js';
|
|
2
|
-
import {
|
|
3
|
+
import { showText } from '../planned.js';
|
|
3
4
|
import { findMatches } from './search.js';
|
|
4
|
-
import {
|
|
5
|
+
import { listen } from '../../utils/listen.js';
|
|
6
|
+
import { takeKeys } from '../../events/onFocus.js';
|
|
5
7
|
/**
|
|
6
8
|
* The find bar's state and actions (`plugins/find`): the query, the matches
|
|
7
9
|
* in reading order, the current one and the replacements. It reads the
|
|
@@ -10,7 +12,6 @@ import { englishLabels } from '../../labels.js';
|
|
|
10
12
|
*/
|
|
11
13
|
export class FindController {
|
|
12
14
|
edytor;
|
|
13
|
-
labels;
|
|
14
15
|
isOpen = $state(false);
|
|
15
16
|
/** The replacement text. */
|
|
16
17
|
replacement = $state('');
|
|
@@ -25,11 +26,8 @@ export class FindController {
|
|
|
25
26
|
#at = $state.raw(null);
|
|
26
27
|
#off = null;
|
|
27
28
|
#field = null;
|
|
28
|
-
constructor(edytor
|
|
29
|
-
/** The words the bar shows (the plugin's `labels`): read them in a custom `bar`. */
|
|
30
|
-
labels = englishLabels.find) {
|
|
29
|
+
constructor(edytor) {
|
|
31
30
|
this.edytor = edytor;
|
|
32
|
-
this.labels = labels;
|
|
33
31
|
}
|
|
34
32
|
/** What the bar searches for; setting it shows the current match. */
|
|
35
33
|
get query() {
|
|
@@ -78,7 +76,7 @@ export class FindController {
|
|
|
78
76
|
*/
|
|
79
77
|
open = (query) => {
|
|
80
78
|
if (!this.isOpen || query !== undefined) {
|
|
81
|
-
const { startText, yStart } = this.edytor.selection.
|
|
79
|
+
const { startText, yStart } = this.edytor.selection.textRange();
|
|
82
80
|
this.#at = startText?.isInDocument
|
|
83
81
|
? this.edytor.facade.anchorAt(startText.blockId, startText.segStart + yStart, 'right')
|
|
84
82
|
: null;
|
|
@@ -109,9 +107,8 @@ export class FindController {
|
|
|
109
107
|
const start = block?.textAtOffset(match.offset);
|
|
110
108
|
const end = block?.textAtOffset(match.offset + match.length);
|
|
111
109
|
if (start && end)
|
|
112
|
-
this.edytor.selection.
|
|
113
|
-
this.edytor
|
|
114
|
-
this.edytor.node?.focus({ preventScroll: true });
|
|
110
|
+
this.edytor.selection.selectText(start.text, start.offset, end.text, end.offset);
|
|
111
|
+
takeKeys(this.edytor);
|
|
115
112
|
};
|
|
116
113
|
/** The next match becomes the current one (after the last, the first). */
|
|
117
114
|
next = () => this.#step(1);
|
|
@@ -135,48 +132,40 @@ export class FindController {
|
|
|
135
132
|
};
|
|
136
133
|
/** Replace every match: one command, one undo step. Answers its status. */
|
|
137
134
|
replaceAll = () => this.#replace(this.matches);
|
|
138
|
-
/** The query field (`
|
|
139
|
-
field = (node) => {
|
|
135
|
+
/** The query field (`{@attach find.field}`): focused on each Mod+F; Enter, Shift+Enter, Escape, Mod+F. */
|
|
136
|
+
field = (node) => untrack(() => {
|
|
140
137
|
this.#field = node;
|
|
141
138
|
this.#focus();
|
|
139
|
+
const off = this.#keys(node, true);
|
|
140
|
+
return () => {
|
|
141
|
+
off();
|
|
142
|
+
if (this.#field === node)
|
|
143
|
+
this.#field = null;
|
|
144
|
+
};
|
|
145
|
+
});
|
|
146
|
+
/** The replacement field (`{@attach find.replaceField}`): Enter replaces, Escape closes. */
|
|
147
|
+
replaceField = (node) => this.#keys(node, false);
|
|
148
|
+
/**
|
|
149
|
+
* A field's keys: Enter goes to the next match (Shift+Enter the previous
|
|
150
|
+
* one) in the query field and replaces in the replacement field, Escape
|
|
151
|
+
* closes, Mod+F selects the query.
|
|
152
|
+
*/
|
|
153
|
+
#keys = (node, query) => {
|
|
142
154
|
const keydown = (event) => {
|
|
143
155
|
if (event.isComposing)
|
|
144
156
|
return;
|
|
145
157
|
const mod = this.edytor.keymap.isMac ? event.metaKey : event.ctrlKey;
|
|
146
158
|
if (event.key === 'Enter')
|
|
147
|
-
(event.shiftKey ? this.previous : this.next)();
|
|
159
|
+
(query ? (event.shiftKey ? this.previous : this.next) : this.replace)();
|
|
148
160
|
else if (event.key === 'Escape')
|
|
149
161
|
this.close();
|
|
150
|
-
else if (mod && event.key.toLowerCase() === 'f')
|
|
162
|
+
else if (query && mod && event.key.toLowerCase() === 'f')
|
|
151
163
|
node.select();
|
|
152
164
|
else
|
|
153
165
|
return;
|
|
154
166
|
event.preventDefault();
|
|
155
167
|
};
|
|
156
|
-
node
|
|
157
|
-
return {
|
|
158
|
-
destroy: () => {
|
|
159
|
-
node.removeEventListener('keydown', keydown);
|
|
160
|
-
if (this.#field === node)
|
|
161
|
-
this.#field = null;
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
};
|
|
165
|
-
/** The replacement field (`use:find.replaceField`): Enter replaces, Escape closes. */
|
|
166
|
-
replaceField = (node) => {
|
|
167
|
-
const keydown = (event) => {
|
|
168
|
-
if (event.isComposing)
|
|
169
|
-
return;
|
|
170
|
-
if (event.key === 'Enter')
|
|
171
|
-
this.replace();
|
|
172
|
-
else if (event.key === 'Escape')
|
|
173
|
-
this.close();
|
|
174
|
-
else
|
|
175
|
-
return;
|
|
176
|
-
event.preventDefault();
|
|
177
|
-
};
|
|
178
|
-
node.addEventListener('keydown', keydown);
|
|
179
|
-
return { destroy: () => node.removeEventListener('keydown', keydown) };
|
|
168
|
+
return listen(node, 'keydown', keydown);
|
|
180
169
|
};
|
|
181
170
|
/** Stop following the document (the editor is going away). */
|
|
182
171
|
destroy = () => this.close({ select: false });
|
|
@@ -195,14 +184,8 @@ export class FindController {
|
|
|
195
184
|
*/
|
|
196
185
|
#show = () => {
|
|
197
186
|
const match = this.matches[this.current];
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
reveal(block);
|
|
201
|
-
block.textAtOffset(match.offset)?.text.node?.scrollIntoView?.({
|
|
202
|
-
block: 'nearest',
|
|
203
|
-
inline: 'nearest'
|
|
204
|
-
});
|
|
205
|
-
}
|
|
187
|
+
if (match)
|
|
188
|
+
showText(this.edytor, match.block, match.offset);
|
|
206
189
|
this.edytor.overlay.invalidate();
|
|
207
190
|
};
|
|
208
191
|
#focus = () => {
|
|
@@ -213,13 +196,13 @@ export class FindController {
|
|
|
213
196
|
};
|
|
214
197
|
/**
|
|
215
198
|
* The one write (`replaceMatches`): admission, hooks (the command, then
|
|
216
|
-
* each `
|
|
199
|
+
* each `deleteText` and `insertText` step), one transaction,
|
|
217
200
|
* one undo step. Each replacement takes the marks its match had in
|
|
218
201
|
* common, as typing over a selection does (`marksForInsertion`).
|
|
219
202
|
*/
|
|
220
203
|
#replace = (matches) => {
|
|
221
204
|
const { edytor } = this;
|
|
222
|
-
const { facade,
|
|
205
|
+
const { facade, idToBlock } = edytor;
|
|
223
206
|
if (!matches.length)
|
|
224
207
|
return 'noop';
|
|
225
208
|
const prepare = ({ matches, replacement }) =>
|
|
@@ -237,11 +220,7 @@ export class FindController {
|
|
|
237
220
|
];
|
|
238
221
|
}));
|
|
239
222
|
const payload = { matches, replacement: this.replacement };
|
|
240
|
-
const block = idToBlock.get(matches[0].block)
|
|
241
|
-
dispatcher.
|
|
242
|
-
if ('writes' in plan)
|
|
243
|
-
facade.apply(plan);
|
|
244
|
-
}, prepare);
|
|
245
|
-
return dispatcher.last?.operation === 'replaceMatches' ? dispatcher.last.status : 'refused';
|
|
223
|
+
const block = edytor.idToBlock.get(matches[0].block);
|
|
224
|
+
return edytor.dispatcher.plan('replaceMatches', payload, prepare, block).status;
|
|
246
225
|
};
|
|
247
226
|
}
|
|
@@ -2,17 +2,15 @@ import { type Snippet } from 'svelte';
|
|
|
2
2
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
3
3
|
import type { Plugin } from '../../plugins.js';
|
|
4
4
|
import { FindController } from './FindController.svelte.js';
|
|
5
|
-
import { type PartialLabels } from '../../labels.js';
|
|
6
5
|
export type FindPluginOptions = {
|
|
7
6
|
/**
|
|
8
|
-
*
|
|
9
|
-
* editor's top right
|
|
10
|
-
*
|
|
7
|
+
* The bar's markup and its words; it renders while `find.isOpen`, placed at the
|
|
8
|
+
* editor's top right (without it, Mod+F searches and highlights, and
|
|
9
|
+
* nothing else shows). Put `{@attach find.field}` on your query input (focused
|
|
10
|
+
* on each Mod+F; Enter, Shift+Enter, Escape) and `{@attach find.replaceField}`
|
|
11
11
|
* on your replacement input.
|
|
12
12
|
*/
|
|
13
13
|
bar?: Snippet<[FindController]>;
|
|
14
|
-
/** The words the bar shows, over the English ones. */
|
|
15
|
-
labels?: PartialLabels<'find'>;
|
|
16
14
|
};
|
|
17
15
|
/** The find plugin's controller of `edytor`; `undefined` when the plugin is not listed. */
|
|
18
16
|
export declare const findController: (edytor: Edytor) => FindController | undefined;
|
|
@@ -24,5 +22,3 @@ export declare const findController: (edytor: Edytor) => FindController | undefi
|
|
|
24
22
|
* replaces one or all as one command (`replaceMatches`) and one undo step.
|
|
25
23
|
*/
|
|
26
24
|
export declare const createFindPlugin: (options?: FindPluginOptions) => Plugin;
|
|
27
|
-
/** Find and replace with the built-in bar. */
|
|
28
|
-
export declare const findPlugin: Plugin;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { mount, unmount } from 'svelte';
|
|
2
|
-
import
|
|
3
|
-
import
|
|
2
|
+
import Ranges, { runOf } from '../../components/Ranges.svelte';
|
|
3
|
+
import { hidden } from '../../selection/visibility.js';
|
|
4
4
|
import { FindController } from './FindController.svelte.js';
|
|
5
|
-
import {
|
|
5
|
+
import { mountChrome } from '../chrome.js';
|
|
6
6
|
const controllers = new WeakMap();
|
|
7
|
+
/** Matches highlighted at most: past it, the count still tells. */
|
|
8
|
+
const MAX_HIGHLIGHTS = 1000;
|
|
7
9
|
/** The find plugin's controller of `edytor`; `undefined` when the plugin is not listed. */
|
|
8
10
|
export const findController = (edytor) => controllers.get(edytor);
|
|
9
11
|
/** At the editor's top right, inside the viewport; measured in the overlay's frame. */
|
|
@@ -27,13 +29,14 @@ const place = (edytor, find) => (host) => {
|
|
|
27
29
|
* replaces one or all as one command (`replaceMatches`) and one undo step.
|
|
28
30
|
*/
|
|
29
31
|
export const createFindPlugin = (options = {}) => (edytor) => {
|
|
30
|
-
const find = new FindController(edytor
|
|
32
|
+
const find = new FindController(edytor);
|
|
31
33
|
controllers.set(edytor, find);
|
|
32
34
|
return {
|
|
33
35
|
hotkeys: {
|
|
34
36
|
// Over a text range in one line, search for it.
|
|
35
37
|
'mod+f': ({ prevent }) => {
|
|
36
|
-
const { startText, endText, yStart, yEnd
|
|
38
|
+
const { startText, endText, yStart, yEnd } = edytor.selection.textRange();
|
|
39
|
+
const { isCollapsed } = edytor.selection.projection;
|
|
37
40
|
const selected = !isCollapsed && startText && startText === endText
|
|
38
41
|
? startText.stringContent.slice(yStart, yEnd)
|
|
39
42
|
: undefined;
|
|
@@ -42,8 +45,27 @@ export const createFindPlugin = (options = {}) => (edytor) => {
|
|
|
42
45
|
},
|
|
43
46
|
onEdytorAttached: () => {
|
|
44
47
|
const layer = edytor.overlay.layer;
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
// Each shown match (at most `MAX_HIGHLIGHTS`: past it, the count still tells); one
|
|
49
|
+
// in a closed toggle's body shows none until it is current, which opens the toggle.
|
|
50
|
+
const highlights = mount(Ranges, {
|
|
51
|
+
target: layer,
|
|
52
|
+
props: {
|
|
53
|
+
edytor,
|
|
54
|
+
name: 'find-match',
|
|
55
|
+
z: 18,
|
|
56
|
+
ranges: () => find.matches.slice(0, MAX_HIGHLIGHTS).flatMap(({ block, offset, length }, index) => {
|
|
57
|
+
const shown = edytor.idToBlock.get(block);
|
|
58
|
+
return shown && !hidden(shown)
|
|
59
|
+
? runOf(edytor, block, offset, length, index === find.current)
|
|
60
|
+
: [];
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
const unmountBar = mountChrome(edytor, options.bar, find, () => find.isOpen, {
|
|
65
|
+
name: 'edytor-find-host',
|
|
66
|
+
zIndex: 55,
|
|
67
|
+
measure: place(edytor, find)
|
|
68
|
+
});
|
|
47
69
|
return () => {
|
|
48
70
|
find.destroy();
|
|
49
71
|
unmountBar();
|
|
@@ -52,5 +74,3 @@ export const createFindPlugin = (options = {}) => (edytor) => {
|
|
|
52
74
|
}
|
|
53
75
|
};
|
|
54
76
|
};
|
|
55
|
-
/** Find and replace with the built-in bar. */
|
|
56
|
-
export const findPlugin = createFindPlugin();
|