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
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A code block's header (`code.language`): the block's language, a button
|
|
3
|
+
* that opens the view's language list (`LanguageMenu`) and Copy. One per
|
|
4
|
+
* rendered code block with the app's `header` snippet, whose attachment
|
|
5
|
+
* (`button`) gives its markup the keys and the ARIA.
|
|
6
|
+
*/
|
|
7
|
+
import { untrack } from 'svelte';
|
|
8
|
+
import { Text } from '../../text/text.svelte.js';
|
|
9
|
+
import { attribute } from '../chrome.js';
|
|
10
|
+
import { languageOf } from './languages.js';
|
|
11
|
+
import { all, listen } from '../../utils/listen.js';
|
|
12
|
+
/** How long Copy reads Copied after a copy, in milliseconds. */
|
|
13
|
+
const COPIED_FOR = 1200;
|
|
14
|
+
/** A code block's text: its lines, joined by newlines. */
|
|
15
|
+
const codeText = (code) => code.children
|
|
16
|
+
.map((line) => line.content.map((part) => (part instanceof Text ? part.stringContent : '')).join(''))
|
|
17
|
+
.join('\n');
|
|
18
|
+
/**
|
|
19
|
+
* What a code plugin's `header` snippet receives: the code block's
|
|
20
|
+
* language (`language`, its id; `label`, as shown), whether the language may be changed here
|
|
21
|
+
* (`editable`: an editable view, not a suggestion's preview), the list's
|
|
22
|
+
* state (`expanded`), the actions (`toggle`, the list's own `pick`, `copy`, and
|
|
23
|
+
* `copied` for a moment after a copy) and the plugin's `labels`. Put
|
|
24
|
+
* `{@attach header.button}` on the element that opens the language list:
|
|
25
|
+
* it opens it on a click, ArrowDown or ArrowUp, Escape gives the keys back
|
|
26
|
+
* to the editor, the toolbar's shortcut at a caret in the block reaches it, and it carries
|
|
27
|
+
* the ARIA (`aria-haspopup`, `aria-expanded`, `aria-controls`, its name).
|
|
28
|
+
*/
|
|
29
|
+
export class CodeHeader {
|
|
30
|
+
view;
|
|
31
|
+
settings;
|
|
32
|
+
menu;
|
|
33
|
+
/** Copy just copied: the button may read Copied (reactive, for a moment). */
|
|
34
|
+
copied = $state(false);
|
|
35
|
+
#timer;
|
|
36
|
+
/** @internal */
|
|
37
|
+
constructor(
|
|
38
|
+
/**
|
|
39
|
+
* The code block as its snippet reads it.
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
view,
|
|
43
|
+
/** @internal */
|
|
44
|
+
settings,
|
|
45
|
+
/**
|
|
46
|
+
* The view's language list (none in a view without one).
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
menu) {
|
|
50
|
+
this.view = view;
|
|
51
|
+
this.settings = settings;
|
|
52
|
+
this.menu = menu;
|
|
53
|
+
}
|
|
54
|
+
/** The code block; `undefined` in a suggestion's preview. */
|
|
55
|
+
get block() {
|
|
56
|
+
return this.view().handle;
|
|
57
|
+
}
|
|
58
|
+
/** The block's language id: its `data.language`, else the plugin's default (reactive). */
|
|
59
|
+
get language() {
|
|
60
|
+
return languageOf(this.view().data, this.settings);
|
|
61
|
+
}
|
|
62
|
+
/** The language's label; a language the plugin does not list shows its id (reactive). */
|
|
63
|
+
get label() {
|
|
64
|
+
const language = this.language;
|
|
65
|
+
return this.settings.languages.find((row) => row.id === language)?.label ?? language;
|
|
66
|
+
}
|
|
67
|
+
/** The view is readonly (reactive). */
|
|
68
|
+
get readonly() {
|
|
69
|
+
return this.view().handle?.edytor.readonly ?? true;
|
|
70
|
+
}
|
|
71
|
+
/** The language may be changed here: an editable view, not a suggestion's preview (reactive). */
|
|
72
|
+
get editable() {
|
|
73
|
+
return Boolean(this.menu && this.view().handle && !this.readonly);
|
|
74
|
+
}
|
|
75
|
+
/** The language list is open on this block (reactive). */
|
|
76
|
+
get expanded() {
|
|
77
|
+
const block = this.view().handle;
|
|
78
|
+
return Boolean(block && this.menu?.isOpenFor(block.id));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Open the language list under the header's button, or close it (`keys`:
|
|
82
|
+
* the keyboard opened it, so the keys go back to the button after).
|
|
83
|
+
*/
|
|
84
|
+
toggle = (keys = false) => {
|
|
85
|
+
const block = this.view().handle;
|
|
86
|
+
if (block && this.editable)
|
|
87
|
+
this.menu?.toggle(block.id, keys);
|
|
88
|
+
};
|
|
89
|
+
/** Copy the block's code to the clipboard; `copied` reads true for a moment. */
|
|
90
|
+
copy = async () => {
|
|
91
|
+
const block = this.view().handle;
|
|
92
|
+
// A suggestion's preview has no block to copy.
|
|
93
|
+
if (!block)
|
|
94
|
+
return;
|
|
95
|
+
await navigator.clipboard.writeText(codeText(block));
|
|
96
|
+
this.copied = true;
|
|
97
|
+
clearTimeout(this.#timer);
|
|
98
|
+
this.#timer = setTimeout(() => (this.copied = false), COPIED_FOR);
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* The element that opens the language list (`{@attach header.button}`, a
|
|
102
|
+
* `button`): a click opens or closes it (from Enter or Space, the keys
|
|
103
|
+
* opened it and get it back), ArrowDown or ArrowUp opens it, Escape gives
|
|
104
|
+
* the keys back to the editor; a press keeps the editor's selection. It
|
|
105
|
+
* carries `aria-haspopup="listbox"`, `aria-expanded`, `aria-controls`
|
|
106
|
+
* while the list is open, and its name ("Code language: SQL") unless
|
|
107
|
+
* you set one; the toolbar's shortcut at a caret in the block focuses it.
|
|
108
|
+
*/
|
|
109
|
+
button = (node) => untrack(() => {
|
|
110
|
+
node.setAttribute('data-edytor-code-language-button', '');
|
|
111
|
+
node.setAttribute('aria-haspopup', 'listbox');
|
|
112
|
+
const mousedown = (event) => event.preventDefault();
|
|
113
|
+
// A click from Enter or Space has no pointer (`detail` 0): the keys opened it.
|
|
114
|
+
const click = (event) => this.toggle(event.detail === 0);
|
|
115
|
+
const keydown = (event) => {
|
|
116
|
+
if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
|
|
117
|
+
if (!this.expanded)
|
|
118
|
+
this.toggle(true);
|
|
119
|
+
}
|
|
120
|
+
else if (event.key === 'Escape')
|
|
121
|
+
this.menu?.release();
|
|
122
|
+
else
|
|
123
|
+
return;
|
|
124
|
+
event.preventDefault();
|
|
125
|
+
};
|
|
126
|
+
const off = listen(node, 'mousedown', mousedown);
|
|
127
|
+
const off2 = listen(node, 'click', click);
|
|
128
|
+
const off3 = listen(node, 'keydown', keydown);
|
|
129
|
+
$effect(() => {
|
|
130
|
+
const expanded = this.expanded;
|
|
131
|
+
attribute(node, 'aria-expanded', String(expanded));
|
|
132
|
+
attribute(node, 'aria-controls', expanded ? this.menu?.listId : undefined);
|
|
133
|
+
});
|
|
134
|
+
return all(off, off2, off3);
|
|
135
|
+
});
|
|
136
|
+
/**
|
|
137
|
+
* The header is gone: Copied's timer goes with it.
|
|
138
|
+
* @internal
|
|
139
|
+
*/
|
|
140
|
+
dispose = () => clearTimeout(this.#timer);
|
|
141
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Attachment } from 'svelte/attachments';
|
|
2
|
+
import type { Edytor } from '../../edytor.svelte.js';
|
|
3
|
+
import { type MenuItemPayload } from '../chrome.js';
|
|
4
|
+
import { ChromeList } from '../list.svelte.js';
|
|
5
|
+
/** A row of the language list: a language id and its label as shown. */
|
|
6
|
+
export type LanguageRow = {
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* One row of the language list, for your `menu`: the row shape every
|
|
12
|
+
* menu shares (`item` is the language, `run` picks it), and whether it is
|
|
13
|
+
* the block's own language (`current`, the demo's ✓).
|
|
14
|
+
*/
|
|
15
|
+
export type LanguageMenuItem = MenuItemPayload<LanguageRow> & {
|
|
16
|
+
/** It is the block's language. */
|
|
17
|
+
current: boolean;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* One view's code language list (Notion's): the header's language button
|
|
21
|
+
* opens it in the overlay under the button, a search field over the
|
|
22
|
+
* languages (by label or id), the block's own marked. The field holds the
|
|
23
|
+
* keys: the arrows move the highlighted row, Enter picks it, Escape
|
|
24
|
+
* closes. A pick writes the block's `data.language` (one `patchData`
|
|
25
|
+
* command, one undo step). Opened by the keys, the list gives them back to
|
|
26
|
+
* its button; opened by a press, to the editor. A press or a focus outside
|
|
27
|
+
* closes it, as readonly does.
|
|
28
|
+
*
|
|
29
|
+
* What a `menu` snippet receives: the open list (`open`), the query
|
|
30
|
+
* and its rows (`query`, `items`, each a `MenuItemPayload`), the keyboard's
|
|
31
|
+
* row (`index`), `search`, `pick` and `close`, and
|
|
32
|
+
* the attachments that give it the keys and the ARIA: `keys` on the
|
|
33
|
+
* search field, `popup` on the list, `option(index)` on each row.
|
|
34
|
+
*/
|
|
35
|
+
export declare class LanguageMenu extends ChromeList {
|
|
36
|
+
#private;
|
|
37
|
+
/** The code block whose list is open, and whether the keys opened it (reactive). */
|
|
38
|
+
open: {
|
|
39
|
+
block: string;
|
|
40
|
+
keys: boolean;
|
|
41
|
+
} | null;
|
|
42
|
+
/** The search field's text. */
|
|
43
|
+
query: string;
|
|
44
|
+
/** The view is readonly (reactive): the list closes. */
|
|
45
|
+
get readonly(): boolean;
|
|
46
|
+
/** The open block's language id. */
|
|
47
|
+
get current(): string | null;
|
|
48
|
+
/** The rows the query keeps: a language the plugin does not list first (the block's own), then the list. */
|
|
49
|
+
get rows(): readonly LanguageRow[];
|
|
50
|
+
/**
|
|
51
|
+
* The rows for your `menu`: each the row shape every menu shares
|
|
52
|
+
* (`run` picks it, `select` highlights it, `option` its attributes), and
|
|
53
|
+
* whether it is the block's language (`current`).
|
|
54
|
+
*/
|
|
55
|
+
get items(): LanguageMenuItem[];
|
|
56
|
+
protected get count(): number;
|
|
57
|
+
/** Whether `block`'s list is open. */
|
|
58
|
+
isOpenFor: (block: string) => boolean;
|
|
59
|
+
/** Open `block`'s list (`keys`: the keyboard opened it), or close it when it is open. */
|
|
60
|
+
toggle: (block: string, keys: boolean) => void;
|
|
61
|
+
/** A new query: the first row it keeps is highlighted. */
|
|
62
|
+
search: (query: string) => void;
|
|
63
|
+
/** Pick `row` (the highlighted one): the block's language, one undo step; the list closes. */
|
|
64
|
+
pick: (row?: LanguageRow | undefined) => void;
|
|
65
|
+
/**
|
|
66
|
+
* Close the list; the keys go back to its button (`button`), to the
|
|
67
|
+
* editor (`editor`: its caret where it was), or stay where a press or a
|
|
68
|
+
* focus put them (`null`).
|
|
69
|
+
*/
|
|
70
|
+
close: (keys?: "button" | "editor" | null) => void;
|
|
71
|
+
/**
|
|
72
|
+
* The search field (`{@attach menu.keys}`): it takes the focus as the
|
|
73
|
+
* list opens and is its `combobox` (unless it has a role), naming the
|
|
74
|
+
* list and the highlighted row (`aria-controls`,
|
|
75
|
+
* `aria-activedescendant`). ArrowDown and ArrowUp move the highlighted
|
|
76
|
+
* row (around the ends), Enter picks it, Escape closes the list (the
|
|
77
|
+
* keys back to the button when they opened it, else to the editor);
|
|
78
|
+
* none reaches the editor. Focus leaving the list and its button closes
|
|
79
|
+
* it.
|
|
80
|
+
*/
|
|
81
|
+
keys: Attachment<HTMLElement>;
|
|
82
|
+
}
|
|
83
|
+
/** Each view's language list (the first code plugin listed owns it). */
|
|
84
|
+
export declare const languageMenus: WeakMap<Edytor, LanguageMenu>;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { untrack } from 'svelte';
|
|
2
|
+
import { takeKeys } from '../../events/onFocus.js';
|
|
3
|
+
import { attribute } from '../chrome.js';
|
|
4
|
+
import { ChromeList, holdKeys } from '../list.svelte.js';
|
|
5
|
+
import { Anchored } from '../anchored.svelte.js';
|
|
6
|
+
import { languageOf } from './languages.js';
|
|
7
|
+
import { all, listen } from '../../utils/listen.js';
|
|
8
|
+
/**
|
|
9
|
+
* One view's code language list (Notion's): the header's language button
|
|
10
|
+
* opens it in the overlay under the button, a search field over the
|
|
11
|
+
* languages (by label or id), the block's own marked. The field holds the
|
|
12
|
+
* keys: the arrows move the highlighted row, Enter picks it, Escape
|
|
13
|
+
* closes. A pick writes the block's `data.language` (one `patchData`
|
|
14
|
+
* command, one undo step). Opened by the keys, the list gives them back to
|
|
15
|
+
* its button; opened by a press, to the editor. A press or a focus outside
|
|
16
|
+
* closes it, as readonly does.
|
|
17
|
+
*
|
|
18
|
+
* What a `menu` snippet receives: the open list (`open`), the query
|
|
19
|
+
* and its rows (`query`, `items`, each a `MenuItemPayload`), the keyboard's
|
|
20
|
+
* row (`index`), `search`, `pick` and `close`, and
|
|
21
|
+
* the attachments that give it the keys and the ARIA: `keys` on the
|
|
22
|
+
* search field, `popup` on the list, `option(index)` on each row.
|
|
23
|
+
*/
|
|
24
|
+
export class LanguageMenu extends ChromeList {
|
|
25
|
+
settings;
|
|
26
|
+
/** The code block whose list is open, and whether the keys opened it (reactive). */
|
|
27
|
+
open = $state.raw(null);
|
|
28
|
+
/** The search field's text. */
|
|
29
|
+
query = $state('');
|
|
30
|
+
/**
|
|
31
|
+
* The list's panel under its button: its place, and what closes it.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
panel;
|
|
35
|
+
/** @internal */
|
|
36
|
+
constructor(edytor,
|
|
37
|
+
/** @internal */
|
|
38
|
+
settings) {
|
|
39
|
+
super(edytor, 'code-languages', 'listbox');
|
|
40
|
+
this.settings = settings;
|
|
41
|
+
this.panel = new Anchored(edytor, 'edytor-code-language-host', () => (this.open ? this.#button(this.open.block) : undefined), () => this.close());
|
|
42
|
+
}
|
|
43
|
+
/** The view is readonly (reactive): the list closes. */
|
|
44
|
+
get readonly() {
|
|
45
|
+
return this.edytor.readonly;
|
|
46
|
+
}
|
|
47
|
+
/** The open block's language id. */
|
|
48
|
+
get current() {
|
|
49
|
+
const open = this.open;
|
|
50
|
+
if (!open)
|
|
51
|
+
return null;
|
|
52
|
+
return languageOf(this.edytor.idToBlock.get(open.block)?.data, this.settings);
|
|
53
|
+
}
|
|
54
|
+
/** The rows the query keeps: a language the plugin does not list first (the block's own), then the list. */
|
|
55
|
+
get rows() {
|
|
56
|
+
const current = this.current;
|
|
57
|
+
const listed = this.settings.languages;
|
|
58
|
+
const all = current && !listed.some((row) => row.id === current)
|
|
59
|
+
? [{ id: current, label: current }, ...listed]
|
|
60
|
+
: listed;
|
|
61
|
+
const query = this.query.trim().toLowerCase();
|
|
62
|
+
if (!query)
|
|
63
|
+
return all;
|
|
64
|
+
return all.filter((row) => row.label.toLowerCase().includes(query) || row.id.toLowerCase().includes(query));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The rows for your `menu`: each the row shape every menu shares
|
|
68
|
+
* (`run` picks it, `select` highlights it, `option` its attributes), and
|
|
69
|
+
* whether it is the block's language (`current`).
|
|
70
|
+
*/
|
|
71
|
+
get items() {
|
|
72
|
+
const current = this.current;
|
|
73
|
+
return this.rows.map((row, index) => ({
|
|
74
|
+
item: row,
|
|
75
|
+
id: this.rowId(index),
|
|
76
|
+
selected: index === this.index,
|
|
77
|
+
current: row.id === current,
|
|
78
|
+
run: () => this.pick(row),
|
|
79
|
+
select: () => (this.index = index),
|
|
80
|
+
option: this.option(index)
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
get count() {
|
|
84
|
+
return this.rows.length;
|
|
85
|
+
}
|
|
86
|
+
/** Whether `block`'s list is open. */
|
|
87
|
+
isOpenFor = (block) => this.open?.block === block;
|
|
88
|
+
/** Open `block`'s list (`keys`: the keyboard opened it), or close it when it is open. */
|
|
89
|
+
toggle = (block, keys) => {
|
|
90
|
+
if (this.isOpenFor(block))
|
|
91
|
+
return this.close(keys ? 'button' : 'editor');
|
|
92
|
+
if (!this.edytor.dispatcher.permits() || !this.edytor.idToBlock.get(block)?.isInTree)
|
|
93
|
+
return;
|
|
94
|
+
this.query = '';
|
|
95
|
+
this.open = { block, keys };
|
|
96
|
+
this.index = Math.max(0, this.rows.findIndex((row) => row.id === this.current));
|
|
97
|
+
this.edytor.overlay.invalidate();
|
|
98
|
+
};
|
|
99
|
+
/** A new query: the first row it keeps is highlighted. */
|
|
100
|
+
search = (query) => {
|
|
101
|
+
this.query = query;
|
|
102
|
+
this.index = 0;
|
|
103
|
+
};
|
|
104
|
+
/** Pick `row` (the highlighted one): the block's language, one undo step; the list closes. */
|
|
105
|
+
pick = (row = this.rows[this.index]) => {
|
|
106
|
+
const open = this.open;
|
|
107
|
+
if (!open || !row)
|
|
108
|
+
return;
|
|
109
|
+
const block = this.edytor.idToBlock.get(open.block);
|
|
110
|
+
if (block?.isInTree && row.id !== this.current)
|
|
111
|
+
block.edytor.patchData(block.id, [{ path: ['language'], value: row.id }]);
|
|
112
|
+
this.close(open.keys ? 'button' : 'editor');
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Close the list; the keys go back to its button (`button`), to the
|
|
116
|
+
* editor (`editor`: its caret where it was), or stay where a press or a
|
|
117
|
+
* focus put them (`null`).
|
|
118
|
+
*/
|
|
119
|
+
close = (keys = null) => {
|
|
120
|
+
const open = this.open;
|
|
121
|
+
if (!open)
|
|
122
|
+
return;
|
|
123
|
+
this.open = null;
|
|
124
|
+
this.panel.box = null;
|
|
125
|
+
this.query = '';
|
|
126
|
+
this.edytor.overlay.invalidate();
|
|
127
|
+
if (keys === 'button')
|
|
128
|
+
this.#button(open.block)?.focus({ preventScroll: true });
|
|
129
|
+
else if (keys === 'editor') {
|
|
130
|
+
takeKeys(this.edytor);
|
|
131
|
+
this.edytor.selection.display();
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* The search field (`{@attach menu.keys}`): it takes the focus as the
|
|
136
|
+
* list opens and is its `combobox` (unless it has a role), naming the
|
|
137
|
+
* list and the highlighted row (`aria-controls`,
|
|
138
|
+
* `aria-activedescendant`). ArrowDown and ArrowUp move the highlighted
|
|
139
|
+
* row (around the ends), Enter picks it, Escape closes the list (the
|
|
140
|
+
* keys back to the button when they opened it, else to the editor);
|
|
141
|
+
* none reaches the editor. Focus leaving the list and its button closes
|
|
142
|
+
* it.
|
|
143
|
+
*/
|
|
144
|
+
keys = (node) => untrack(() => {
|
|
145
|
+
if (!node.hasAttribute('role'))
|
|
146
|
+
node.setAttribute('role', 'combobox');
|
|
147
|
+
node.setAttribute('aria-expanded', 'true');
|
|
148
|
+
node.setAttribute('aria-autocomplete', 'list');
|
|
149
|
+
attribute(node, 'aria-controls', this.listId);
|
|
150
|
+
const off2 = listen(node, 'focusout', this.panel.blurred);
|
|
151
|
+
const off = holdKeys(node, this.#keydown, () => this.rows.length ? this.rowId(this.index) : undefined);
|
|
152
|
+
return all(off, off2);
|
|
153
|
+
});
|
|
154
|
+
/** The search field's keys (`keys`). */
|
|
155
|
+
#keydown = (event) => {
|
|
156
|
+
if (event.isComposing)
|
|
157
|
+
return;
|
|
158
|
+
const step = { ArrowDown: 1, ArrowUp: -1 }[event.key];
|
|
159
|
+
if (step)
|
|
160
|
+
this.move(step);
|
|
161
|
+
else if (event.key === 'Enter')
|
|
162
|
+
this.pick();
|
|
163
|
+
else if (event.key === 'Escape')
|
|
164
|
+
this.close(this.open?.keys ? 'button' : 'editor');
|
|
165
|
+
else
|
|
166
|
+
return;
|
|
167
|
+
event.preventDefault();
|
|
168
|
+
event.stopPropagation();
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* The keys back to the editor from a language button (its Escape): the
|
|
172
|
+
* host takes the focus, the caret shown where the selection is.
|
|
173
|
+
* @internal
|
|
174
|
+
*/
|
|
175
|
+
release = () => {
|
|
176
|
+
this.close();
|
|
177
|
+
takeKeys(this.edytor);
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* The language button of the code block holding a caret (where Alt+F10
|
|
181
|
+
* takes the keys, as to a toolbar), if any.
|
|
182
|
+
* @internal
|
|
183
|
+
*/
|
|
184
|
+
buttonAtCaret = () => {
|
|
185
|
+
const { startText } = this.edytor.selection.textRange();
|
|
186
|
+
const { isCollapsed } = this.edytor.selection.projection;
|
|
187
|
+
const startBlock = startText?.parent;
|
|
188
|
+
const code = startBlock?.type === 'codeLine' ? startBlock.parent : null;
|
|
189
|
+
if (!isCollapsed || !code || this.edytor.readonly)
|
|
190
|
+
return null;
|
|
191
|
+
return this.#button(code.id);
|
|
192
|
+
};
|
|
193
|
+
/** The language button of code block `block`, in this view (the header's `button` attachment marks it). */
|
|
194
|
+
#button = (block) => this.edytor.idToBlock
|
|
195
|
+
.get(block)
|
|
196
|
+
?.node?.querySelector('[data-edytor-code-language-button]') ?? null;
|
|
197
|
+
}
|
|
198
|
+
/** Each view's language list (the first code plugin listed owns it). */
|
|
199
|
+
export const languageMenus = new WeakMap();
|
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
import { type LanguageDefinition } from '@tanstack/highlight/core';
|
|
9
9
|
import type { JSONText } from '../../utils/json.js';
|
|
10
10
|
import type { Edytor } from '../../edytor.svelte.js';
|
|
11
|
-
import
|
|
11
|
+
import type { Snippet } from 'svelte';
|
|
12
|
+
import type { CodeHeader } from './header.svelte.js';
|
|
13
|
+
import type { LanguageMenu } from './languageMenu.svelte.js';
|
|
12
14
|
/** A language a code block may be in. */
|
|
13
15
|
export type CodeLanguage = {
|
|
14
16
|
/** Stored in the code block's `data.language`. */
|
|
@@ -37,26 +39,35 @@ export declare const loadCodeLanguage: (language: CodeLanguage) => Promise<void>
|
|
|
37
39
|
*/
|
|
38
40
|
export declare const tokenizeCode: (code: string, language: CodeLanguage | undefined) => JSONText[];
|
|
39
41
|
export type CodePluginOptions = {
|
|
40
|
-
/** The languages a code block may be in, in the header's order. Default `CODE_LANGUAGES`. */
|
|
42
|
+
/** The languages a code block may be in, in the header's order, with their names. Default `CODE_LANGUAGES`. */
|
|
41
43
|
languages?: readonly CodeLanguage[];
|
|
42
44
|
/** The language of a code block whose `data.language` is unset. Default `'javascript'`. */
|
|
43
45
|
defaultLanguage?: string;
|
|
44
46
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
+
* A code block's header (the language's button and Copy) and its words: it renders
|
|
48
|
+
* above the code, in the block's non-editable part (without it, no
|
|
49
|
+
* header). Put `{@attach header.button}` on the element that opens the
|
|
50
|
+
* language list.
|
|
47
51
|
*/
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
|
|
52
|
+
header?: Snippet<[CodeHeader]>;
|
|
53
|
+
/**
|
|
54
|
+
* The language list: it renders under the header's button while
|
|
55
|
+
* `menu.open` is set (without it, nothing shows). Put `{@attach menu.keys}` on its search field,
|
|
56
|
+
* `{@attach menu.popup}` on the list, and `{@attach item.option}` on each
|
|
57
|
+
* row of `menu.items` (its highlight from `item.selected`). The first code
|
|
58
|
+
* plugin listed in a view owns its list.
|
|
59
|
+
*/
|
|
60
|
+
menu?: Snippet<[LanguageMenu]>;
|
|
51
61
|
};
|
|
52
62
|
export type CodeSettings = {
|
|
53
63
|
languages: readonly CodeLanguage[];
|
|
54
64
|
defaultLanguage: string;
|
|
55
|
-
|
|
65
|
+
/** The app's header markup, if any. */
|
|
66
|
+
header?: Snippet<[CodeHeader]>;
|
|
67
|
+
/** The app's language list markup, if any. */
|
|
68
|
+
menu?: Snippet<[LanguageMenu]>;
|
|
56
69
|
};
|
|
57
70
|
export declare const DEFAULT_CODE_SETTINGS: CodeSettings;
|
|
58
|
-
/** A language's label as shown: the labels' `languages` entry for its id, else its own. */
|
|
59
|
-
export declare const languageLabel: (language: CodeLanguage, { labels }: CodeSettings) => string;
|
|
60
71
|
/** Each view's code options, for its code blocks' header (which reads them through its view). */
|
|
61
72
|
export declare const codeSettings: WeakMap<Edytor, CodeSettings>;
|
|
62
73
|
/** A code block's language id: its `data.language`, else the default. */
|
|
@@ -8,132 +8,48 @@
|
|
|
8
8
|
import { createHighlighter } from '@tanstack/highlight/core';
|
|
9
9
|
import { jsx } from '@tanstack/highlight/languages/jsx';
|
|
10
10
|
import { SvelteMap } from 'svelte/reactivity';
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
/** The grammars more than one language loads. */
|
|
12
|
+
const css = () => import('@tanstack/highlight/languages/css');
|
|
13
|
+
const ts = () => import('@tanstack/highlight/languages/ts');
|
|
14
|
+
const html = () => import('@tanstack/highlight/languages/html');
|
|
15
|
+
const scripts = () => Promise.all([css(), import('@tanstack/highlight/languages/js'), ts()]).then(([{ css }, { js }, { ts }]) => [css, js, ts]);
|
|
16
|
+
/**
|
|
17
|
+
* A listed language: its lines are tokenized with `grammar` (its id unless
|
|
18
|
+
* named), the definition the module `load` imports exports by that name; a
|
|
19
|
+
* markup grammar (`embeds`) also loads the style and script grammars it embeds.
|
|
20
|
+
*/
|
|
21
|
+
const language = (id, label, load, grammar = id, embeds = false) => ({
|
|
22
|
+
id,
|
|
23
|
+
label,
|
|
24
|
+
grammar,
|
|
25
|
+
load: () => Promise.all([load(), embeds ? scripts() : []]).then(([module, embedded]) => [
|
|
26
|
+
module[grammar],
|
|
27
|
+
...embedded
|
|
28
|
+
])
|
|
29
|
+
});
|
|
19
30
|
/** The default languages, after Notion's list, sorted by label (Plain text first). */
|
|
20
31
|
export const CODE_LANGUAGES = [
|
|
21
32
|
{ id: 'plaintext', label: 'Plain text' },
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
id: 'cpp',
|
|
30
|
-
label: 'C++',
|
|
31
|
-
grammar: 'cpp',
|
|
32
|
-
load: () => import('@tanstack/highlight/languages/cpp').then((m) => [m.cpp])
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
id: 'css',
|
|
36
|
-
label: 'CSS',
|
|
37
|
-
grammar: 'css',
|
|
38
|
-
load: () => import('@tanstack/highlight/languages/css').then((m) => [m.css])
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
id: 'diff',
|
|
42
|
-
label: 'Diff',
|
|
43
|
-
grammar: 'diff',
|
|
44
|
-
load: () => import('@tanstack/highlight/languages/diff').then((m) => [m.diff])
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
id: 'docker',
|
|
48
|
-
label: 'Docker',
|
|
49
|
-
grammar: 'dockerfile',
|
|
50
|
-
load: () => import('@tanstack/highlight/languages/dockerfile').then((m) => [m.dockerfile])
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
id: 'go',
|
|
54
|
-
label: 'Go',
|
|
55
|
-
grammar: 'go',
|
|
56
|
-
load: () => import('@tanstack/highlight/languages/go').then((m) => [m.go])
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
id: 'html',
|
|
60
|
-
label: 'HTML',
|
|
61
|
-
grammar: 'html',
|
|
62
|
-
load: markup(() => import('@tanstack/highlight/languages/html').then((m) => m.html))
|
|
63
|
-
},
|
|
33
|
+
language('bash', 'Bash', () => import('@tanstack/highlight/languages/shell'), 'shell'),
|
|
34
|
+
language('cpp', 'C++', () => import('@tanstack/highlight/languages/cpp')),
|
|
35
|
+
language('css', 'CSS', css),
|
|
36
|
+
language('diff', 'Diff', () => import('@tanstack/highlight/languages/diff')),
|
|
37
|
+
language('docker', 'Docker', () => import('@tanstack/highlight/languages/dockerfile'), 'dockerfile'),
|
|
38
|
+
language('go', 'Go', () => import('@tanstack/highlight/languages/go')),
|
|
39
|
+
language('html', 'HTML', html, 'html', true),
|
|
64
40
|
{ id: 'javascript', label: 'JavaScript', grammar: 'jsx', load: async () => [jsx] },
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
{
|
|
78
|
-
id: 'mermaid',
|
|
79
|
-
label: 'Mermaid',
|
|
80
|
-
grammar: 'mermaid',
|
|
81
|
-
load: () => import('@tanstack/highlight/languages/mermaid').then((m) => [m.mermaid])
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
id: 'php',
|
|
85
|
-
label: 'PHP',
|
|
86
|
-
grammar: 'php',
|
|
87
|
-
load: () => import('@tanstack/highlight/languages/php').then((m) => [m.php])
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
id: 'python',
|
|
91
|
-
label: 'Python',
|
|
92
|
-
grammar: 'python',
|
|
93
|
-
load: () => import('@tanstack/highlight/languages/python').then((m) => [m.python])
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
id: 'sql',
|
|
97
|
-
label: 'SQL',
|
|
98
|
-
grammar: 'sql',
|
|
99
|
-
load: () => import('@tanstack/highlight/languages/sql').then((m) => [m.sql])
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
id: 'svelte',
|
|
103
|
-
label: 'Svelte',
|
|
104
|
-
grammar: 'svelte',
|
|
105
|
-
load: markup(() => import('@tanstack/highlight/languages/svelte').then((m) => m.svelte))
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
id: 'toml',
|
|
109
|
-
label: 'TOML',
|
|
110
|
-
grammar: 'toml',
|
|
111
|
-
load: () => import('@tanstack/highlight/languages/toml').then((m) => [m.toml])
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
id: 'typescript',
|
|
115
|
-
label: 'TypeScript',
|
|
116
|
-
grammar: 'ts',
|
|
117
|
-
load: () => import('@tanstack/highlight/languages/ts').then((m) => [m.ts])
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
id: 'vue',
|
|
121
|
-
label: 'Vue',
|
|
122
|
-
grammar: 'vue',
|
|
123
|
-
load: markup(() => import('@tanstack/highlight/languages/vue').then((m) => m.vue))
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
id: 'xml',
|
|
127
|
-
label: 'XML',
|
|
128
|
-
grammar: 'html',
|
|
129
|
-
load: () => import('@tanstack/highlight/languages/html').then((m) => [m.html])
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
id: 'yaml',
|
|
133
|
-
label: 'YAML',
|
|
134
|
-
grammar: 'yaml',
|
|
135
|
-
load: () => import('@tanstack/highlight/languages/yaml').then((m) => [m.yaml])
|
|
136
|
-
}
|
|
41
|
+
language('json', 'JSON', () => import('@tanstack/highlight/languages/json')),
|
|
42
|
+
language('markdown', 'Markdown', () => import('@tanstack/highlight/languages/markdown')),
|
|
43
|
+
language('mermaid', 'Mermaid', () => import('@tanstack/highlight/languages/mermaid')),
|
|
44
|
+
language('php', 'PHP', () => import('@tanstack/highlight/languages/php')),
|
|
45
|
+
language('python', 'Python', () => import('@tanstack/highlight/languages/python')),
|
|
46
|
+
language('sql', 'SQL', () => import('@tanstack/highlight/languages/sql')),
|
|
47
|
+
language('svelte', 'Svelte', () => import('@tanstack/highlight/languages/svelte'), 'svelte', true),
|
|
48
|
+
language('toml', 'TOML', () => import('@tanstack/highlight/languages/toml')),
|
|
49
|
+
language('typescript', 'TypeScript', ts, 'ts'),
|
|
50
|
+
language('vue', 'Vue', () => import('@tanstack/highlight/languages/vue'), 'vue', true),
|
|
51
|
+
language('xml', 'XML', html, 'html'),
|
|
52
|
+
language('yaml', 'YAML', () => import('@tanstack/highlight/languages/yaml'))
|
|
137
53
|
];
|
|
138
54
|
/**
|
|
139
55
|
* The grammars loaded so far, by name, shared by every editor (a grammar is
|
|
@@ -181,11 +97,8 @@ export const tokenizeCode = (code, language) => {
|
|
|
181
97
|
};
|
|
182
98
|
export const DEFAULT_CODE_SETTINGS = {
|
|
183
99
|
languages: CODE_LANGUAGES,
|
|
184
|
-
defaultLanguage: 'javascript'
|
|
185
|
-
labels: englishLabels.code
|
|
100
|
+
defaultLanguage: 'javascript'
|
|
186
101
|
};
|
|
187
|
-
/** A language's label as shown: the labels' `languages` entry for its id, else its own. */
|
|
188
|
-
export const languageLabel = (language, { labels }) => labels.languages[language.id] ?? language.label;
|
|
189
102
|
/** Each view's code options, for its code blocks' header (which reads them through its view). */
|
|
190
103
|
export const codeSettings = new WeakMap();
|
|
191
104
|
/** A code block's language id: its `data.language`, else the default. */
|