edytor 1.0.0-rc.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +47 -141
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.d.ts +6 -1
- package/dist/clipboard/htmlFlow.js +26 -13
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +22 -17
- package/dist/cloudflare/DocumentRoom.js +10 -5
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +20 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +9 -30
- package/dist/cloudflare/room/storage.js +52 -104
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +160 -119
- package/dist/components/Block.svelte.d.ts +8 -3
- package/dist/components/Content.svelte +91 -44
- package/dist/components/CustomMark.svelte +46 -0
- package/dist/components/CustomMark.svelte.d.ts +11 -0
- package/dist/components/Edytor.svelte +80 -95
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/InlineBlock.svelte +4 -9
- package/dist/components/Mark.svelte +46 -35
- package/dist/components/Mark.svelte.d.ts +7 -0
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +48 -14
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +8 -13
- package/dist/crdt/data.js +30 -70
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/{plugins/blockHandles → dnd}/autoScroll.d.ts +2 -1
- package/dist/{plugins/blockHandles → dnd}/autoScroll.js +3 -3
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +34 -64
- package/dist/edytor.svelte.js +118 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -184
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +33 -72
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +92 -72
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -13
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +91 -314
- package/dist/labels.js +180 -396
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -151
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +63 -97
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +247 -268
- package/dist/plugins/blockHandles/BlockHandles.svelte +46 -29
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +29 -23
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -162
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +20 -17
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +46 -1
- package/dist/plugins/blockHandles/geometry.js +51 -4
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +59 -28
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +180 -105
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +79 -0
- package/dist/plugins/chrome.js +87 -0
- package/dist/plugins/code/CodeHeader.svelte +12 -58
- package/dist/plugins/code/CodeHeader.svelte.d.ts +1 -0
- package/dist/plugins/code/CodePlugin.svelte +75 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +25 -0
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +9 -0
- package/dist/plugins/code/code.css +5 -100
- package/dist/plugins/code/header.svelte.d.ts +47 -0
- package/dist/plugins/code/header.svelte.js +141 -0
- package/dist/plugins/code/languageMenu.svelte.d.ts +84 -0
- package/dist/plugins/code/languageMenu.svelte.js +199 -0
- package/dist/plugins/code/languages.d.ts +21 -10
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -430
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +6 -7
- package/dist/plugins/comments/commentsPlugin.d.ts +31 -10
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +18 -129
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +2 -1
- package/dist/plugins/equation/EquationPlugin.svelte +123 -168
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +5 -3
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +74 -36
- package/dist/plugins/equation/equation.svelte.js +74 -66
- package/dist/plugins/equation/importUrl.d.ts +6 -0
- package/dist/plugins/equation/importUrl.js +6 -0
- package/dist/plugins/equation/katex.d.ts +8 -0
- package/dist/plugins/equation/katex.js +77 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +5 -151
- package/dist/plugins/image/ImagePlugin.svelte +49 -117
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -24
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -57
- package/dist/plugins/image/controls.svelte.js +51 -174
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +39 -24
- package/dist/plugins/index.js +30 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +15 -0
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +9 -0
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +46 -0
- package/dist/plugins/marquee/MarqueeController.svelte.js +243 -0
- package/dist/plugins/marquee/marquee.d.ts +33 -0
- package/dist/plugins/marquee/marquee.js +89 -0
- package/dist/plugins/marquee/marqueePlugin.d.ts +32 -0
- package/dist/plugins/marquee/marqueePlugin.js +68 -0
- package/dist/plugins/media/AudioPlugin.svelte +3 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +124 -112
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +20 -7
- package/dist/plugins/media/EmbedPlugin.svelte +93 -77
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +21 -9
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +35 -111
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +55 -112
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +69 -0
- package/dist/plugins/media/empty.svelte.js +111 -0
- package/dist/plugins/media/media.d.ts +93 -30
- package/dist/plugins/media/media.js +79 -86
- package/dist/plugins/media/urlPaste.svelte.d.ts +9 -32
- package/dist/plugins/media/urlPaste.svelte.js +46 -75
- package/dist/plugins/mention/MentionPlugin.svelte +47 -124
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +11 -23
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +52 -108
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +11 -23
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +25 -0
- package/dist/plugins/richtext/CalloutIcon.svelte.d.ts +9 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +25 -0
- package/dist/plugins/richtext/EmptyBody.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +272 -148
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +37 -18
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.d.ts +9 -0
- package/dist/plugins/richtext/body.js +16 -0
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +97 -0
- package/dist/plugins/richtext/calloutIcons.svelte.js +214 -0
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +18 -11
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +93 -35
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +11 -24
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +32 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -16
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +96 -127
- package/dist/plugins/table/TableChrome.svelte.d.ts +5 -1
- package/dist/plugins/table/TablePlugin.svelte +116 -171
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +110 -117
- package/dist/plugins/table/chrome.svelte.js +643 -289
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +55 -134
- package/dist/plugins/table/table.d.ts +26 -7
- package/dist/plugins/table/table.js +23 -49
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +29 -66
- package/dist/plugins/toolbar/ToolbarController.svelte.js +151 -76
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +14 -13
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +6 -45
- package/dist/plugins/triggers/TriggerController.svelte.js +51 -96
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +167 -60
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +12 -10
- package/dist/selection/pointer.svelte.js +154 -71
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +263 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +11 -8
- package/dist/selection/visibility.js +23 -8
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +33 -39
- package/dist/session/attempt.js +61 -53
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +18 -3
- package/dist/session/navigation.js +194 -153
- package/dist/session/ports.d.ts +7 -0
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +8 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +64 -47
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +32 -0
- package/dist/surface/lines.js +43 -0
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +73 -77
- package/dist/surface/overlay.d.ts +48 -6
- package/dist/surface/overlay.js +133 -23
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +315 -126
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -525
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -43
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -447
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -116
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -12
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -83
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -7
- package/dist/plugins/richtext/labels.d.ts +0 -5
- package/dist/plugins/richtext/labels.js +0 -3
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -360
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/toolbar/LinkCard.svelte +0 -118
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -7
- package/dist/plugins/toolbar/Toolbar.svelte +0 -400
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -144
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
|
@@ -1,34 +1,43 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { getContext } from 'svelte';
|
|
3
3
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
4
|
-
import {
|
|
4
|
+
import { equationEnglish, labelsOf } from '../../labels.js';
|
|
5
|
+
import { equationViews } from './equation.svelte.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* An equation as drawn: KaTeX's markup, its source while KaTeX loads (or
|
|
8
|
-
* with no loader), the source marked invalid when KaTeX cannot read it
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* with no loader), the source marked invalid when KaTeX cannot read it
|
|
10
|
+
* (the app's `error` snippet, if any), or the placeholder when it is
|
|
11
|
+
* empty (the app's `placeholder`, if any). Reads its view's renderer from
|
|
12
|
+
* the editor it renders in (a suggestion's preview included).
|
|
11
13
|
*/
|
|
12
14
|
let { expression, display }: { expression: string; display: boolean } = $props();
|
|
13
15
|
|
|
14
16
|
const edytor = getContext<Edytor | undefined>('edytor');
|
|
15
17
|
const view = $derived(edytor ? equationViews.get(edytor) : undefined);
|
|
16
|
-
const labels = $derived(
|
|
18
|
+
const labels = $derived(labelsOf(edytor, 'equation', equationEnglish));
|
|
17
19
|
const drawn = $derived(expression ? (view?.renderer.draw(expression, display) ?? null) : null);
|
|
18
20
|
</script>
|
|
19
21
|
|
|
20
22
|
{#if !expression}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
{@const label = display ? labels.blockPlaceholder : labels.inlinePlaceholder}
|
|
24
|
+
{#if view?.placeholder}{@render view.placeholder({ display, label })}{:else}<span
|
|
25
|
+
data-edytor-equation-placeholder
|
|
26
|
+
><span aria-hidden="true" data-edytor-equation-icon>√x</span>{label}</span
|
|
27
|
+
>{/if}
|
|
26
28
|
{:else if drawn && 'html' in drawn}
|
|
27
29
|
<!-- KaTeX's markup, drawn untrusted (`trust: false`). -->
|
|
28
30
|
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
|
|
29
31
|
{@html drawn.html}
|
|
30
32
|
{:else if drawn}
|
|
31
|
-
|
|
33
|
+
{#if view?.error}{@render view.error({
|
|
34
|
+
display,
|
|
35
|
+
expression,
|
|
36
|
+
error: drawn.error,
|
|
37
|
+
label: labels.invalid
|
|
38
|
+
})}{:else}<span data-edytor-equation-error title="{labels.invalid}: {drawn.error}"
|
|
39
|
+
>{expression}</span
|
|
40
|
+
>{/if}
|
|
32
41
|
{:else}
|
|
33
42
|
<span data-edytor-equation-source>{expression}</span>
|
|
34
43
|
{/if}
|
|
@@ -1,27 +1,70 @@
|
|
|
1
|
+
import { type Snippet } from 'svelte';
|
|
2
|
+
import type { Attachment } from 'svelte/attachments';
|
|
1
3
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
2
|
-
import { type EquationLabels, type PartialLabels } from '../../labels.js';
|
|
3
4
|
/** The part of KaTeX the plugin uses: `katex.renderToString`. */
|
|
4
5
|
export type KatexLike = {
|
|
5
6
|
renderToString: (tex: string, options?: Record<string, unknown>) => string;
|
|
6
7
|
};
|
|
7
|
-
/** Loads KaTeX when an equation first shows: `() => import('katex')
|
|
8
|
+
/** Loads KaTeX when an equation first shows: `() => import('katex')` from your bundle. */
|
|
8
9
|
export type KatexLoader = () => Promise<KatexLike | {
|
|
9
10
|
default: KatexLike;
|
|
10
11
|
}>;
|
|
11
12
|
export type EquationPluginOptions = {
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* Where KaTeX comes from, loaded the first time an equation is drawn in a
|
|
15
|
+
* browser (a server render shows the TeX source and loads nothing):
|
|
16
|
+
*
|
|
17
|
+
* - absent: jsDelivr (`KATEX_CDN`, KaTeX `KATEX_VERSION`): its module and
|
|
18
|
+
* its stylesheet, added once to the page's head; your app bundles and
|
|
19
|
+
* imports nothing.
|
|
20
|
+
* - a URL: another copy of KaTeX's `dist` files (`katex.mjs`,
|
|
21
|
+
* `katex.min.css` and its `fonts/`), as for jsDelivr.
|
|
22
|
+
* - a loader, `() => import('katex')`: KaTeX from your bundle (the
|
|
23
|
+
* optional peer dependency); import its stylesheet,
|
|
24
|
+
* `katex/dist/katex.min.css`, in your app.
|
|
25
|
+
* - `false`: none; an equation shows its TeX source.
|
|
26
|
+
*
|
|
27
|
+
* If KaTeX fails to load, equations keep showing their source.
|
|
17
28
|
*/
|
|
18
|
-
katex?: KatexLoader;
|
|
29
|
+
katex?: KatexLoader | string | false;
|
|
19
30
|
/** TeX macros every equation reads (`{ '\\RR': '\\mathbb{R}' }`). */
|
|
20
31
|
macros?: Record<string, string>;
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
/**
|
|
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.
|
|
37
|
+
*/
|
|
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;
|
|
25
68
|
};
|
|
26
69
|
/** The data of a block equation and of an inline one: its TeX source. */
|
|
27
70
|
export type EquationData = {
|
|
@@ -68,23 +111,11 @@ export declare class EquationRenderer {
|
|
|
68
111
|
* the display asked (`display="block"`: a block), else `undefined`.
|
|
69
112
|
*/
|
|
70
113
|
export declare const parseEquation: (element: HTMLElement, display: boolean) => EquationData | undefined;
|
|
71
|
-
/** Each view's equation labels: the first equation plugin listed claims them, as its kinds. */
|
|
72
|
-
export declare const equationLabels: {
|
|
73
|
-
claim: (view: object | undefined, labels: EquationLabels) => void;
|
|
74
|
-
of: (view: object | undefined) => EquationLabels;
|
|
75
|
-
};
|
|
76
114
|
/** The equation being edited: a block equation, or an inline one (`atom`) in block `block`. */
|
|
77
115
|
export type EquationTarget = {
|
|
78
116
|
block: string;
|
|
79
117
|
atom?: string;
|
|
80
118
|
};
|
|
81
|
-
/** The edited equation's box, layer-relative. */
|
|
82
|
-
export type EquationBox = {
|
|
83
|
-
x: number;
|
|
84
|
-
y: number;
|
|
85
|
-
width: number;
|
|
86
|
-
height: number;
|
|
87
|
-
};
|
|
88
119
|
/**
|
|
89
120
|
* One view's equation editor (Notion's): a click on an equation of an
|
|
90
121
|
* editable view (Enter on a selected one, or a new empty one) opens its
|
|
@@ -95,17 +126,21 @@ export type EquationBox = {
|
|
|
95
126
|
* press or a focus outside close it; an inline equation closed empty is
|
|
96
127
|
* removed. The editor then gives the keys back: a block equation stays
|
|
97
128
|
* selected, the caret goes after an inline one.
|
|
129
|
+
*
|
|
130
|
+
* What a `panel` snippet receives: the equation being edited (`target`,
|
|
131
|
+
* `display` for a block one), its source (`expression`, written by
|
|
132
|
+
* `set`), KaTeX's error (`error`) and `close()`.
|
|
133
|
+
* Put `{@attach editor.field}` on the source's field: it takes the focus
|
|
134
|
+
* as the editor opens, Enter (Shift+Enter: a newline in a block equation)
|
|
135
|
+
* and Escape close the editor, and focus leaving the panel closes it.
|
|
98
136
|
*/
|
|
99
137
|
export declare class EquationEditor {
|
|
100
138
|
#private;
|
|
101
139
|
private edytor;
|
|
102
|
-
readonly renderer: EquationRenderer;
|
|
103
|
-
readonly labels: EquationLabels;
|
|
104
140
|
/** The equation being edited (reactive). */
|
|
105
141
|
target: EquationTarget | null;
|
|
106
|
-
/**
|
|
107
|
-
|
|
108
|
-
constructor(edytor: Edytor, renderer: EquationRenderer, labels?: EquationLabels);
|
|
142
|
+
/** The view is readonly (reactive): the editor closes. */
|
|
143
|
+
get readonly(): boolean;
|
|
109
144
|
/** A block equation is edited (a field of several lines). */
|
|
110
145
|
get display(): boolean;
|
|
111
146
|
/** The edited equation's TeX source (reactive through its block's cell). */
|
|
@@ -124,19 +159,22 @@ export declare class EquationEditor {
|
|
|
124
159
|
* caret after the inline one.
|
|
125
160
|
*/
|
|
126
161
|
close: (keys?: boolean) => void;
|
|
127
|
-
/**
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
162
|
+
/**
|
|
163
|
+
* The source's field (`{@attach editor.field}`, a `textarea` or an
|
|
164
|
+
* `input`): it takes the focus as the editor opens, the caret at the end
|
|
165
|
+
* of the source. Enter closes the editor (Shift+Enter in a block
|
|
166
|
+
* equation is a newline), Escape too; the editor's own keys never see
|
|
167
|
+
* them. Focus leaving the panel for somewhere else closes it.
|
|
168
|
+
*/
|
|
169
|
+
field: Attachment<HTMLTextAreaElement | HTMLInputElement>;
|
|
135
170
|
}
|
|
136
171
|
/** A view's equations: the first equation plugin listed in it owns them, as its kinds. */
|
|
137
172
|
export type EquationView = {
|
|
138
173
|
renderer: EquationRenderer;
|
|
139
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]>;
|
|
140
178
|
};
|
|
141
179
|
/** By view. */
|
|
142
180
|
export declare const equationViews: WeakMap<Edytor, EquationView>;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import { untrack } from 'svelte';
|
|
2
|
+
import { blockSelection } from '../../session/selection.js';
|
|
1
3
|
import { InlineBlock } from '../../block/inlineBlock.svelte.js';
|
|
2
4
|
import { takeKeys } from '../../events/onFocus.js';
|
|
3
|
-
import {
|
|
5
|
+
import { Anchored } from '../anchored.svelte.js';
|
|
6
|
+
import { escapeHtml } from '../../clipboard/serializeClipboardFragment.js';
|
|
7
|
+
import { all, listen } from '../../utils/listen.js';
|
|
4
8
|
/** The MathML annotation that carries an equation's TeX source. */
|
|
5
9
|
export const TEX = 'application/x-tex';
|
|
6
10
|
/** An equation's TeX source: its `expression`, a string. */
|
|
@@ -8,7 +12,6 @@ export const expressionOf = (data) => {
|
|
|
8
12
|
const value = data?.expression;
|
|
9
13
|
return typeof value === 'string' ? value : '';
|
|
10
14
|
};
|
|
11
|
-
const escape = (value) => value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
12
15
|
/** The cap of the drawings each renderer keeps. */
|
|
13
16
|
const CACHE = 256;
|
|
14
17
|
/**
|
|
@@ -70,7 +73,7 @@ export class EquationRenderer {
|
|
|
70
73
|
// TeX KaTeX cannot read: the source as text, below.
|
|
71
74
|
}
|
|
72
75
|
}
|
|
73
|
-
const source =
|
|
76
|
+
const source = escapeHtml(tex);
|
|
74
77
|
return (`<span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"${display ? ' display="block"' : ''}>` +
|
|
75
78
|
`<semantics><mrow><mtext>${source}</mtext></mrow><annotation encoding="${TEX}">${source}</annotation></semantics></math></span>`);
|
|
76
79
|
};
|
|
@@ -117,8 +120,6 @@ export const parseEquation = (element, display) => {
|
|
|
117
120
|
math.getAttribute('alttext');
|
|
118
121
|
return tex?.trim() ? { expression: tex.trim() } : undefined;
|
|
119
122
|
};
|
|
120
|
-
/** Each view's equation labels: the first equation plugin listed claims them, as its kinds. */
|
|
121
|
-
export const equationLabels = viewLabels('equation');
|
|
122
123
|
/**
|
|
123
124
|
* One view's equation editor (Notion's): a click on an equation of an
|
|
124
125
|
* editable view (Enter on a selected one, or a new empty one) opens its
|
|
@@ -129,19 +130,43 @@ export const equationLabels = viewLabels('equation');
|
|
|
129
130
|
* press or a focus outside close it; an inline equation closed empty is
|
|
130
131
|
* removed. The editor then gives the keys back: a block equation stays
|
|
131
132
|
* selected, the caret goes after an inline one.
|
|
133
|
+
*
|
|
134
|
+
* What a `panel` snippet receives: the equation being edited (`target`,
|
|
135
|
+
* `display` for a block one), its source (`expression`, written by
|
|
136
|
+
* `set`), KaTeX's error (`error`) and `close()`.
|
|
137
|
+
* Put `{@attach editor.field}` on the source's field: it takes the focus
|
|
138
|
+
* as the editor opens, Enter (Shift+Enter: a newline in a block equation)
|
|
139
|
+
* and Escape close the editor, and focus leaving the panel closes it.
|
|
132
140
|
*/
|
|
133
141
|
export class EquationEditor {
|
|
134
142
|
edytor;
|
|
135
143
|
renderer;
|
|
136
|
-
labels;
|
|
137
144
|
/** The equation being edited (reactive). */
|
|
138
145
|
target = $state.raw(null);
|
|
139
|
-
/**
|
|
140
|
-
|
|
141
|
-
|
|
146
|
+
/**
|
|
147
|
+
* The editor's panel under the edited equation: its place, and what closes it.
|
|
148
|
+
* @internal
|
|
149
|
+
*/
|
|
150
|
+
panel;
|
|
151
|
+
/** @internal */
|
|
152
|
+
constructor(edytor,
|
|
153
|
+
/** @internal */
|
|
154
|
+
renderer) {
|
|
142
155
|
this.edytor = edytor;
|
|
143
156
|
this.renderer = renderer;
|
|
144
|
-
this.
|
|
157
|
+
this.panel = new Anchored(edytor, 'edytor-equation-editor-host', () => (this.target ? this.#node(this.target) : undefined), () => this.close(false));
|
|
158
|
+
}
|
|
159
|
+
/** The view is readonly (reactive): the editor closes. */
|
|
160
|
+
get readonly() {
|
|
161
|
+
return this.edytor.readonly;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Where the panel stands: under the edited equation (a block one's
|
|
165
|
+
* middle, an inline one's start), layer-relative.
|
|
166
|
+
* @internal
|
|
167
|
+
*/
|
|
168
|
+
get place() {
|
|
169
|
+
return this.target && this.panel.place(6, this.display);
|
|
145
170
|
}
|
|
146
171
|
/** A block equation is edited (a field of several lines). */
|
|
147
172
|
get display() {
|
|
@@ -177,9 +202,9 @@ export class EquationEditor {
|
|
|
177
202
|
const target = this.target;
|
|
178
203
|
if (!target || expression === this.expression)
|
|
179
204
|
return;
|
|
180
|
-
const
|
|
181
|
-
if (
|
|
182
|
-
|
|
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 }]);
|
|
183
208
|
};
|
|
184
209
|
/**
|
|
185
210
|
* Close the editor. An inline equation left empty is removed; then, with
|
|
@@ -191,7 +216,7 @@ export class EquationEditor {
|
|
|
191
216
|
if (!target)
|
|
192
217
|
return;
|
|
193
218
|
this.target = null;
|
|
194
|
-
this.box = null;
|
|
219
|
+
this.panel.box = null;
|
|
195
220
|
this.edytor.overlay.invalidate();
|
|
196
221
|
const block = this.#block(target);
|
|
197
222
|
if (!block)
|
|
@@ -203,7 +228,7 @@ export class EquationEditor {
|
|
|
203
228
|
return;
|
|
204
229
|
const offset = offsetOf(block, atom);
|
|
205
230
|
if (!expressionOf(atom.data) && this.edytor.dispatcher.permits()) {
|
|
206
|
-
block.
|
|
231
|
+
this.edytor.removeInline(block.id, atom.id);
|
|
207
232
|
if (keys)
|
|
208
233
|
selection.setCaret({ block, offset });
|
|
209
234
|
}
|
|
@@ -211,54 +236,44 @@ export class EquationEditor {
|
|
|
211
236
|
selection.setCaret({ block, offset: offset + 1 });
|
|
212
237
|
}
|
|
213
238
|
else if (keys)
|
|
214
|
-
selection.
|
|
239
|
+
selection.select(blockSelection([block.id]));
|
|
215
240
|
if (keys)
|
|
216
241
|
takeKeys(this.edytor);
|
|
217
242
|
};
|
|
218
|
-
/**
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
const panel = event.currentTarget?.closest('[data-edytor-equation-editor]');
|
|
236
|
-
// No new focus (the window went to the background): it stays.
|
|
237
|
-
if (!(to instanceof Node) || panel?.contains(to))
|
|
238
|
-
return;
|
|
239
|
-
this.close(false);
|
|
240
|
-
};
|
|
241
|
-
/** The overlay measure: the edited equation's box; gone, the editor closes. */
|
|
242
|
-
measure = (host, origin) => {
|
|
243
|
-
const target = this.target;
|
|
244
|
-
const node = target ? this.#node(target) : null;
|
|
245
|
-
const rect = node?.isConnected ? node.getBoundingClientRect() : null;
|
|
246
|
-
const box = rect
|
|
247
|
-
? {
|
|
248
|
-
x: rect.left - origin.left,
|
|
249
|
-
y: rect.top - origin.top,
|
|
250
|
-
width: rect.width,
|
|
251
|
-
height: rect.height
|
|
252
|
-
}
|
|
253
|
-
: null;
|
|
254
|
-
return () => {
|
|
255
|
-
Object.assign(host.style, { position: 'absolute', left: '0px', top: '0px' });
|
|
256
|
-
if (target && !node)
|
|
257
|
-
return this.close(false);
|
|
258
|
-
if (!sameBox(box, this.box))
|
|
259
|
-
this.box = box;
|
|
243
|
+
/**
|
|
244
|
+
* The source's field (`{@attach editor.field}`, a `textarea` or an
|
|
245
|
+
* `input`): it takes the focus as the editor opens, the caret at the end
|
|
246
|
+
* of the source. Enter closes the editor (Shift+Enter in a block
|
|
247
|
+
* equation is a newline), Escape too; the editor's own keys never see
|
|
248
|
+
* them. Focus leaving the panel for somewhere else closes it.
|
|
249
|
+
*/
|
|
250
|
+
field = (node) => untrack(() => {
|
|
251
|
+
const keydown = (event) => {
|
|
252
|
+
if (event.isComposing)
|
|
253
|
+
return;
|
|
254
|
+
const enter = event.key === 'Enter' && !(event.shiftKey && this.display);
|
|
255
|
+
if (!enter && event.key !== 'Escape')
|
|
256
|
+
return;
|
|
257
|
+
event.preventDefault();
|
|
258
|
+
event.stopPropagation();
|
|
259
|
+
this.close();
|
|
260
260
|
};
|
|
261
|
-
|
|
261
|
+
const element = node;
|
|
262
|
+
const off = listen(element, 'keydown', keydown);
|
|
263
|
+
const off2 = listen(element, 'focusout', this.panel.blurred);
|
|
264
|
+
// Each equation the editor opens on: the field takes the focus, the caret at the end.
|
|
265
|
+
$effect(() => {
|
|
266
|
+
if (!this.target)
|
|
267
|
+
return;
|
|
268
|
+
untrack(() => {
|
|
269
|
+
if (node.ownerDocument.activeElement === node)
|
|
270
|
+
return;
|
|
271
|
+
node.focus({ preventScroll: true });
|
|
272
|
+
node.setSelectionRange(node.value.length, node.value.length);
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
return all(off, off2);
|
|
276
|
+
});
|
|
262
277
|
#block = (target) => {
|
|
263
278
|
const block = this.edytor.idToBlock.get(target.block);
|
|
264
279
|
return block?.isInTree ? block : undefined;
|
|
@@ -286,10 +301,3 @@ const offsetOf = (block, atom) => {
|
|
|
286
301
|
};
|
|
287
302
|
/** By view. */
|
|
288
303
|
export const equationViews = new WeakMap();
|
|
289
|
-
const sameBox = (a, b) => a === b ||
|
|
290
|
-
(a !== null &&
|
|
291
|
-
b !== null &&
|
|
292
|
-
a.x === b.x &&
|
|
293
|
-
a.y === b.y &&
|
|
294
|
-
a.width === b.width &&
|
|
295
|
-
a.height === b.height);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A module fetched by URL at run time (KaTeX from a CDN), left to the
|
|
3
|
+
* browser: no bundler follows it (`@vite-ignore`, `webpackIgnore`). Its own
|
|
4
|
+
* module, so a test can stand in for the network.
|
|
5
|
+
*/
|
|
6
|
+
export declare const importUrl: (url: string) => Promise<unknown>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A module fetched by URL at run time (KaTeX from a CDN), left to the
|
|
3
|
+
* browser: no bundler follows it (`@vite-ignore`, `webpackIgnore`). Its own
|
|
4
|
+
* module, so a test can stand in for the network.
|
|
5
|
+
*/
|
|
6
|
+
export const importUrl = (url) => import(/* @vite-ignore */ /* webpackIgnore: true */ url);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The KaTeX version the default loader fetches: the one edytor is tested with. */
|
|
2
|
+
export declare const KATEX_VERSION = "0.18.7";
|
|
3
|
+
/**
|
|
4
|
+
* Where the default loader fetches KaTeX: jsDelivr's copy of the npm
|
|
5
|
+
* package's `dist`, at `KATEX_VERSION` exactly (`katex.mjs`,
|
|
6
|
+
* `katex.min.css`, and the fonts the stylesheet names).
|
|
7
|
+
*/
|
|
8
|
+
export declare const KATEX_CDN = "https://cdn.jsdelivr.net/npm/katex@0.18.7/dist/";
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { importUrl } from './importUrl.js';
|
|
2
|
+
/** The KaTeX version the default loader fetches: the one edytor is tested with. */
|
|
3
|
+
export const KATEX_VERSION = '0.18.7';
|
|
4
|
+
/**
|
|
5
|
+
* Where the default loader fetches KaTeX: jsDelivr's copy of the npm
|
|
6
|
+
* package's `dist`, at `KATEX_VERSION` exactly (`katex.mjs`,
|
|
7
|
+
* `katex.min.css`, and the fonts the stylesheet names).
|
|
8
|
+
*/
|
|
9
|
+
export const KATEX_CDN = `https://cdn.jsdelivr.net/npm/katex@${KATEX_VERSION}/dist/`;
|
|
10
|
+
/** Each base's KaTeX, loading or loaded; a failed load is forgotten, so a later view tries again. */
|
|
11
|
+
const loads = new Map();
|
|
12
|
+
/** The `katex` attribute of the stylesheets this module adds to a head. */
|
|
13
|
+
const MARK = 'data-edytor-katex';
|
|
14
|
+
/**
|
|
15
|
+
* KaTeX's stylesheet at `href`, added once to the document's head; settles
|
|
16
|
+
* when it loaded or failed (a failed stylesheet leaves KaTeX's markup
|
|
17
|
+
* unstyled, never the equation undrawn).
|
|
18
|
+
*/
|
|
19
|
+
const stylesheet = (href) => {
|
|
20
|
+
const head = document.head;
|
|
21
|
+
let link = [...head.querySelectorAll(`link[${MARK}]`)].find((known) => known.getAttribute('href') === href);
|
|
22
|
+
if (link?.sheet)
|
|
23
|
+
return Promise.resolve();
|
|
24
|
+
if (!link) {
|
|
25
|
+
link = document.createElement('link');
|
|
26
|
+
link.rel = 'stylesheet';
|
|
27
|
+
link.href = href;
|
|
28
|
+
link.setAttribute(MARK, '');
|
|
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 });
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
/** The KaTeX a module exports: itself, or its default export. */
|
|
38
|
+
const katexOf = (module) => {
|
|
39
|
+
const own = module;
|
|
40
|
+
const katex = typeof own?.renderToString === 'function' ? own : own?.default;
|
|
41
|
+
if (typeof katex?.renderToString !== 'function')
|
|
42
|
+
throw new Error('No KaTeX in the module');
|
|
43
|
+
return katex;
|
|
44
|
+
};
|
|
45
|
+
/** A base URL ending with one `/`. */
|
|
46
|
+
const baseOf = (base) => (base.endsWith('/') ? base : `${base}/`);
|
|
47
|
+
/**
|
|
48
|
+
* A loader of KaTeX from `base` (a URL holding KaTeX's `dist` files, by
|
|
49
|
+
* default `KATEX_CDN`): `katex.mjs` imported and `katex.min.css` added to
|
|
50
|
+
* the document's head, once per base; it resolves once both settled.
|
|
51
|
+
* Browser only: without a document it rejects and fetches nothing.
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
export const cdnKatex = (base = KATEX_CDN) => () => {
|
|
55
|
+
const root = baseOf(base);
|
|
56
|
+
if (typeof document === 'undefined')
|
|
57
|
+
return Promise.reject(new Error('KaTeX loads in a browser only'));
|
|
58
|
+
let pending = loads.get(root);
|
|
59
|
+
if (!pending) {
|
|
60
|
+
pending = Promise.all([
|
|
61
|
+
importUrl(`${root}katex.mjs`),
|
|
62
|
+
stylesheet(`${root}katex.min.css`)
|
|
63
|
+
]).then(([module]) => katexOf(module));
|
|
64
|
+
loads.set(root, pending);
|
|
65
|
+
pending.catch(() => {
|
|
66
|
+
if (loads.get(root) === pending)
|
|
67
|
+
loads.delete(root);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return pending;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* The loader the plugin's `katex` option names: its own loader, a base URL
|
|
74
|
+
* (`cdnKatex`), none for `false`, else jsDelivr (`KATEX_CDN`).
|
|
75
|
+
* @internal
|
|
76
|
+
*/
|
|
77
|
+
export const katexLoaderOf = (option) => option === false ? undefined : typeof option === 'function' ? option : cdnKatex(option);
|
|
@@ -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
|
}
|