edytor 1.0.0-rc.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -39
- package/dist/block/block.svelte.d.ts +11 -84
- package/dist/block/block.svelte.js +30 -134
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +11 -9
- package/dist/block/inlineBlock.svelte.js +18 -21
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.js +7 -7
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +4 -17
- package/dist/cloudflare/DocumentRoom.js +3 -5
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +25 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +3 -32
- package/dist/cloudflare/room/storage.js +33 -108
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/awarenessSelection.d.ts +22 -1
- package/dist/collaboration/awarenessSelection.js +42 -0
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +42 -56
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +82 -99
- package/dist/components/Edytor.svelte.d.ts +16 -13
- package/dist/components/InlineBlock.svelte +1 -1
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +2 -5
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +18 -13
- package/dist/crdt/data.js +49 -71
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +8 -5
- package/dist/crdt/doc/reads.js +49 -50
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +32 -115
- package/dist/crdt/document.js +216 -302
- package/dist/crdt/edytor-doc.d.ts +689 -90
- package/dist/crdt/edytor-doc.js +74 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +32 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +8 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/props.d.ts +32 -0
- package/dist/crdt/props.js +172 -0
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/dnd/autoScroll.js +1 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.d.ts +2 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.js +52 -60
- package/dist/{plugins/blockHandles → dnd}/geometry.d.ts +4 -3
- package/dist/{plugins/blockHandles → dnd}/geometry.js +6 -6
- package/dist/dnd/placement.d.ts +200 -0
- package/dist/dnd/placement.js +426 -0
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +46 -63
- package/dist/edytor.svelte.js +126 -181
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -181
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +64 -78
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +45 -67
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +14 -1
- package/dist/events/onPaste.js +51 -76
- package/dist/index.d.ts +11 -15
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +83 -320
- package/dist/labels.js +181 -408
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -154
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +21 -196
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +158 -573
- package/dist/plugins/blockHandles/BlockHandles.svelte +15 -23
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +45 -38
- package/dist/plugins/chrome.js +59 -36
- package/dist/plugins/code/CodeHeader.svelte +8 -38
- package/dist/plugins/code/CodePlugin.svelte +53 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +16 -125
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
- package/dist/plugins/code/code.css +5 -117
- package/dist/plugins/code/header.svelte.d.ts +2 -11
- package/dist/plugins/code/header.svelte.js +11 -38
- package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
- package/dist/plugins/code/languageMenu.svelte.js +30 -160
- package/dist/plugins/code/languages.d.ts +9 -22
- package/dist/plugins/code/languages.js +39 -128
- package/dist/plugins/columns/ColumnResize.svelte +16 -27
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/gaps.d.ts +7 -5
- package/dist/plugins/columns/gaps.js +11 -6
- package/dist/plugins/columns/resize.svelte.d.ts +17 -54
- package/dist/plugins/columns/resize.svelte.js +80 -173
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -431
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
- package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +16 -130
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
- package/dist/plugins/equation/EquationPlugin.svelte +109 -172
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +3 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.css +7 -0
- package/dist/plugins/equation/equation.svelte.d.ts +37 -24
- package/dist/plugins/equation/equation.svelte.js +20 -94
- package/dist/plugins/equation/katex.js +6 -9
- package/dist/plugins/fileDrop.d.ts +28 -0
- package/dist/plugins/fileDrop.js +116 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +6 -167
- package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
- package/dist/plugins/image/ImagePlugin.svelte +71 -151
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +12 -41
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -36
- package/dist/plugins/image/controls.svelte.js +43 -212
- package/dist/plugins/image/image.css +17 -0
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +30 -26
- package/dist/plugins/index.js +28 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +10 -9
- package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
- package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
- package/dist/plugins/marquee/marquee.js +4 -21
- package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
- package/dist/plugins/marquee/marqueePlugin.js +16 -15
- package/dist/plugins/media/AudioPlugin.svelte +13 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +11 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
- package/dist/plugins/media/EmbedPlugin.svelte +82 -86
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +45 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +21 -4
- package/dist/plugins/media/MediaEmpty.svelte +51 -90
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +200 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +34 -0
- package/dist/plugins/media/UploadPreview.svelte +32 -0
- package/dist/plugins/media/UploadPreview.svelte.d.ts +11 -0
- package/dist/plugins/media/VideoPlugin.svelte +14 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +12 -5
- package/dist/plugins/media/empty.svelte.d.ts +47 -46
- package/dist/plugins/media/empty.svelte.js +67 -60
- package/dist/plugins/media/media.d.ts +97 -44
- package/dist/plugins/media/media.js +77 -99
- package/dist/plugins/media/upload.css +23 -0
- package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
- package/dist/plugins/media/urlPaste.svelte.js +32 -102
- package/dist/plugins/mention/MentionPlugin.svelte +84 -126
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +17 -27
- package/dist/plugins/mention/mention.css +6 -0
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +154 -109
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +19 -26
- package/dist/plugins/pageLink/pageLink.css +6 -0
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +13 -20
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +174 -183
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +34 -34
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.js +2 -2
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
- package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/richtext/richtext.css +6 -0
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +40 -124
- package/dist/plugins/table/TablePlugin.svelte +106 -168
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +38 -141
- package/dist/plugins/table/chrome.svelte.js +340 -589
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +16 -152
- package/dist/plugins/table/table.d.ts +15 -14
- package/dist/plugins/table/table.js +22 -16
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +4 -68
- package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
- package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +55 -24
- package/dist/plugins/uploads.svelte.js +123 -50
- package/dist/plugins.d.ts +187 -66
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +8 -10
- package/dist/selection/pointer.svelte.js +32 -73
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +224 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +3 -8
- package/dist/selection/visibility.js +7 -5
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +43 -39
- package/dist/session/attempt.js +62 -55
- package/dist/session/bindings.js +117 -145
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +208 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +16 -21
- package/dist/session/inputRules.d.ts +6 -3
- package/dist/session/inputRules.js +78 -83
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +43 -10
- package/dist/session/moves.js +101 -59
- package/dist/session/navigation.d.ts +10 -2
- package/dist/session/navigation.js +140 -172
- package/dist/session/ports.d.ts +2 -7
- package/dist/session/props.d.ts +25 -25
- package/dist/session/props.js +62 -159
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +5 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +42 -47
- package/dist/session/uploads.d.ts +29 -0
- package/dist/session/uploads.js +10 -0
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +2 -2
- package/dist/surface/lines.js +1 -1
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +52 -72
- package/dist/surface/overlay.d.ts +41 -3
- package/dist/surface/overlay.js +92 -37
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +272 -106
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -554
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -61
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -335
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -93
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
- package/dist/plugins/image/empty.svelte.d.ts +0 -56
- package/dist/plugins/image/empty.svelte.js +0 -83
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
- package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/labels.d.ts +0 -9
- package/dist/plugins/richtext/labels.js +0 -7
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/table/dragPreview.d.ts +0 -29
- package/dist/plugins/table/dragPreview.js +0 -103
- package/dist/plugins/toolbar/LinkCard.svelte +0 -122
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
- package/dist/plugins/toolbar/Toolbar.svelte +0 -349
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
- /package/dist/{plugins/columns → dnd}/stacking.d.ts +0 -0
- /package/dist/{plugins/columns → dnd}/stacking.js +0 -0
|
@@ -2,22 +2,34 @@ import { untrack } from 'svelte';
|
|
|
2
2
|
import { autoScrollFor } from '../../dnd/autoScroll.js';
|
|
3
3
|
import { draggable, dropTargetForElements, setCustomNativeDragPreview } from '../../dnd/pragmatic.js';
|
|
4
4
|
import { EDYTOR_BLOCK_DRAG_MIME } from '../../events/onDrop.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { attribute
|
|
8
|
-
import {
|
|
5
|
+
import { takeKeys } from '../../events/onFocus.js';
|
|
6
|
+
import { pin } from '../../surface/overlay.js';
|
|
7
|
+
import { attribute } from '../chrome.js';
|
|
8
|
+
import { ChromeList, holdKeys, menuKey, optionAttachment } from '../list.svelte.js';
|
|
9
|
+
import { BandDrag, bandKey } from '../bands.svelte.js';
|
|
10
|
+
import { all, listen } from '../../utils/listen.js';
|
|
11
|
+
import { dragPreview } from '../blockHandles/dragPreview.js';
|
|
9
12
|
import { caretCell, deleteColumn, deleteRows, gridOf, insertColumn, insertRow, moveColumn, moveRows, widthOf } from './table.js';
|
|
10
13
|
/** The drag data key naming the chrome a row's or a column's drag is from. */
|
|
11
14
|
const MOVE = Symbol('edytor table move');
|
|
12
15
|
/** How far past the table's box a drag still aims at it (the grips stand outside it). */
|
|
13
16
|
const GUTTER = 32;
|
|
14
|
-
|
|
15
|
-
const trackWidths = (grid) => (grid.ownerDocument.defaultView?.getComputedStyle(grid).gridTemplateColumns ?? '')
|
|
16
|
-
.split(/\s+/)
|
|
17
|
-
.map((w) => Number.parseFloat(w))
|
|
18
|
-
.filter((w) => Number.isFinite(w));
|
|
17
|
+
const styleOf = (node) => node.ownerDocument.defaultView?.getComputedStyle(node);
|
|
19
18
|
/** A computed length in pixels, `0` when none. */
|
|
20
19
|
const px = (value) => Number.parseFloat(value ?? '') || 0;
|
|
20
|
+
/** The resolved widths of `grid`'s columns, as laid out (none where nothing is). */
|
|
21
|
+
const trackWidths = (grid) => (styleOf(grid)?.gridTemplateColumns ?? '')
|
|
22
|
+
.split(/\s+/)
|
|
23
|
+
.map(Number.parseFloat)
|
|
24
|
+
.filter(Number.isFinite);
|
|
25
|
+
/** The grid element of a table block. */
|
|
26
|
+
const gridNode = (table) => table?.node?.querySelector('[data-edytor-table-grid]');
|
|
27
|
+
/** A table's stored column entries (`data.columns`), each found by its column id. */
|
|
28
|
+
const entriesOf = (table) => {
|
|
29
|
+
const stored = table.edytor.facade.blockDataOf(table.id)?.columns;
|
|
30
|
+
return Array.isArray(stored) ? stored : [];
|
|
31
|
+
};
|
|
32
|
+
const entryIndex = (entries, id) => entries.findIndex((c) => c?.id === id);
|
|
21
33
|
/**
|
|
22
34
|
* The table's chrome (`table.*`), in the overlay: while the pointer is over
|
|
23
35
|
* a table of an editable view, a `+` under it (a row at its end) and one
|
|
@@ -30,26 +42,22 @@ const px = (value) => Number.parseFloat(value ?? '') || 0;
|
|
|
30
42
|
* drops the preview. Every action is a table command (`table.ts`): refused
|
|
31
43
|
* when the view is readonly.
|
|
32
44
|
*
|
|
33
|
-
* What a
|
|
45
|
+
* What a `menu` snippet receives: the open menu (`menu`), its rows
|
|
34
46
|
* (`items`, each a `MenuItemPayload`), the keyboard's row (`index`), the
|
|
35
|
-
* attachments that
|
|
36
|
-
* the menu's element, `option(index)`
|
|
37
|
-
*
|
|
47
|
+
* attachments that give it the keys and the ARIA (`popup` and `keys` on
|
|
48
|
+
* the menu's element, `option(index)` on each row) and `close()`.
|
|
49
|
+
* A grip's own attachment is its payload's `grip`.
|
|
38
50
|
*/
|
|
39
|
-
export class TableChrome {
|
|
40
|
-
edytor;
|
|
41
|
-
labels;
|
|
51
|
+
export class TableChrome extends ChromeList {
|
|
42
52
|
columnWidth;
|
|
43
53
|
minColumnWidth;
|
|
44
54
|
/**
|
|
45
|
-
* The table, row and column under the pointer.
|
|
55
|
+
* The table, row and column (their ids) under the pointer.
|
|
46
56
|
* @internal
|
|
47
57
|
*/
|
|
48
58
|
hovered = $state(null);
|
|
49
59
|
/** What the open grip menu acts on (`null`: none is open). */
|
|
50
60
|
menu = $state(null);
|
|
51
|
-
/** The keyboard's row of the open menu, in `rows` (never a disabled one). */
|
|
52
|
-
index = $state(0);
|
|
53
61
|
/**
|
|
54
62
|
* The measured table the chrome is for.
|
|
55
63
|
* @internal
|
|
@@ -61,10 +69,10 @@ export class TableChrome {
|
|
|
61
69
|
*/
|
|
62
70
|
dragging = $state(false);
|
|
63
71
|
/**
|
|
64
|
-
* The column resize in progress.
|
|
72
|
+
* The column resize (its drag in progress, `band.drag`).
|
|
65
73
|
* @internal
|
|
66
74
|
*/
|
|
67
|
-
|
|
75
|
+
band;
|
|
68
76
|
/**
|
|
69
77
|
* The row's or column's drag in progress (`table.drag`).
|
|
70
78
|
* @internal
|
|
@@ -77,11 +85,7 @@ export class TableChrome {
|
|
|
77
85
|
* @internal
|
|
78
86
|
*/
|
|
79
87
|
cell = null;
|
|
80
|
-
constructor(
|
|
81
|
-
/** @internal */
|
|
82
|
-
edytor,
|
|
83
|
-
/** The words the chrome shows and says (the plugin's `labels`). */
|
|
84
|
-
labels,
|
|
88
|
+
constructor(edytor,
|
|
85
89
|
/**
|
|
86
90
|
* A column's width when it sets none, and the narrowest a resize leaves.
|
|
87
91
|
* @internal
|
|
@@ -89,21 +93,30 @@ export class TableChrome {
|
|
|
89
93
|
columnWidth,
|
|
90
94
|
/** @internal */
|
|
91
95
|
minColumnWidth) {
|
|
92
|
-
|
|
93
|
-
|
|
96
|
+
super(edytor, 'table-menu', 'menu', (node) => {
|
|
97
|
+
const kind = this.menu?.kind;
|
|
98
|
+
if (!kind)
|
|
99
|
+
return null;
|
|
100
|
+
node.setAttribute('data-edytor-table-menu', kind);
|
|
101
|
+
return {};
|
|
102
|
+
});
|
|
94
103
|
this.columnWidth = columnWidth;
|
|
95
104
|
this.minColumnWidth = minColumnWidth;
|
|
105
|
+
this.band = new BandDrag(edytor);
|
|
106
|
+
}
|
|
107
|
+
get count() {
|
|
108
|
+
return this.#rows.length;
|
|
96
109
|
}
|
|
97
110
|
/** The view is readonly (reactive): the chrome shows nothing. */
|
|
98
111
|
get readonly() {
|
|
99
112
|
return this.edytor.readonly;
|
|
100
113
|
}
|
|
101
114
|
/**
|
|
102
|
-
*
|
|
115
|
+
* The column resize in progress.
|
|
103
116
|
* @internal
|
|
104
117
|
*/
|
|
105
|
-
get
|
|
106
|
-
return this.drag
|
|
118
|
+
get drag() {
|
|
119
|
+
return this.band.drag;
|
|
107
120
|
}
|
|
108
121
|
/**
|
|
109
122
|
* The table the chrome is for: the one a band drags or a grip moves, a
|
|
@@ -114,27 +127,24 @@ export class TableChrome {
|
|
|
114
127
|
return (this.drag?.table ?? this.moving?.table ?? this.menu?.table ?? this.hovered?.table ?? null);
|
|
115
128
|
}
|
|
116
129
|
/**
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*/
|
|
120
|
-
get gripRow() {
|
|
121
|
-
return this.menu?.kind === 'row' ? this.menu.row : (this.hovered?.row ?? null);
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* The column (by position) the column grip stands for: the open menu's, else the hovered one.
|
|
125
|
-
* @internal
|
|
130
|
+
* What the `kind` grip stands for now (the open menu's row or column,
|
|
131
|
+
* else the hovered one): its table, id and position; `null` when none.
|
|
126
132
|
*/
|
|
127
|
-
|
|
128
|
-
|
|
133
|
+
#source(kind) {
|
|
134
|
+
const table = this.block(this.table);
|
|
135
|
+
const grid = gridOf(table);
|
|
136
|
+
const id = this.menu?.kind === kind ? this.menu.id : this.hovered?.[kind];
|
|
137
|
+
const ids = kind === 'row' ? grid?.rows.map((row) => row.id) : grid?.columns;
|
|
138
|
+
const index = id ? (ids?.indexOf(id) ?? -1) : -1;
|
|
139
|
+
return table && grid && index >= 0 ? { table, grid, id: id, index } : null;
|
|
129
140
|
}
|
|
130
141
|
/**
|
|
131
142
|
* The selection changed: a caret in a cell is the one the block menu acts on.
|
|
132
143
|
* @internal
|
|
133
144
|
*/
|
|
134
145
|
track = () => {
|
|
135
|
-
if (this.edytor.selection.value.kind
|
|
136
|
-
|
|
137
|
-
this.cell = caretCell(this.edytor)?.id ?? null;
|
|
146
|
+
if (this.edytor.selection.value.kind === 'text')
|
|
147
|
+
this.cell = caretCell(this.edytor)?.id ?? null;
|
|
138
148
|
};
|
|
139
149
|
/**
|
|
140
150
|
* Whether the chrome shows (on its table all through a band's or a grip's drag).
|
|
@@ -159,8 +169,8 @@ export class TableChrome {
|
|
|
159
169
|
* @internal
|
|
160
170
|
*/
|
|
161
171
|
inView = (x) => {
|
|
162
|
-
const
|
|
163
|
-
return !!
|
|
172
|
+
const view = this.layout?.view;
|
|
173
|
+
return !!view && x >= view.left - 1 && x <= view.right + 1;
|
|
164
174
|
};
|
|
165
175
|
/**
|
|
166
176
|
* The grid's visible span, horizontally, layer-relative.
|
|
@@ -175,36 +185,39 @@ export class TableChrome {
|
|
|
175
185
|
return { left, width: Math.max(0, right - left) };
|
|
176
186
|
}
|
|
177
187
|
/**
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
* @internal
|
|
188
|
+
* The open menu's or the hovered row's and column's lines in the
|
|
189
|
+
* measured table, with their positions.
|
|
181
190
|
*/
|
|
182
|
-
|
|
191
|
+
#lines(kind) {
|
|
183
192
|
const layout = this.layout;
|
|
184
|
-
const id = this.
|
|
185
|
-
const
|
|
186
|
-
const
|
|
187
|
-
return layout
|
|
188
|
-
? { kind: 'row', id: row.id, index, x: layout.left, y: row.top + row.height / 2 }
|
|
189
|
-
: null;
|
|
193
|
+
const id = this.menu?.kind === kind ? this.menu.id : this.hovered?.[kind];
|
|
194
|
+
const lines = (kind === 'row' ? layout?.rows : layout?.columns) ?? [];
|
|
195
|
+
const index = lines.findIndex((line) => line.id === id);
|
|
196
|
+
return index < 0 ? null : { layout: layout, index, id: id };
|
|
190
197
|
}
|
|
191
198
|
/**
|
|
192
|
-
* Where the
|
|
193
|
-
* the
|
|
194
|
-
*
|
|
199
|
+
* Where the grips stand, layer-relative, the point each centers on: the
|
|
200
|
+
* row grip on the left edge of the part of the grid its box shows
|
|
201
|
+
* (`table.overflow`: the box's edge once the grid is scrolled), at the middle of the row it stands
|
|
202
|
+
* for; the column grip on its top edge, at the middle of the column it
|
|
203
|
+
* stands for, while that middle shows (the grip a drag started from
|
|
204
|
+
* stays, its source, even scrolled out of view).
|
|
195
205
|
* @internal
|
|
196
206
|
*/
|
|
197
|
-
get
|
|
198
|
-
const
|
|
199
|
-
const
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
207
|
+
get grips() {
|
|
208
|
+
const row = this.#lines('row');
|
|
209
|
+
const column = this.#lines('column');
|
|
210
|
+
const r = row && row.layout.rows[row.index];
|
|
211
|
+
const c = column && column.layout.columns[column.index];
|
|
212
|
+
const x = c ? c.left + c.width / 2 : 0;
|
|
213
|
+
return [
|
|
214
|
+
...(row && r
|
|
215
|
+
? [{ ...row, kind: 'row', x: this.span.left, y: r.top + r.height / 2 }]
|
|
216
|
+
: []),
|
|
217
|
+
...(column && (this.moving?.kind === 'column' || this.inView(x))
|
|
218
|
+
? [{ ...column, kind: 'column', x, y: column.layout.top }]
|
|
219
|
+
: [])
|
|
220
|
+
];
|
|
208
221
|
}
|
|
209
222
|
/**
|
|
210
223
|
* Where the `+` under the table stands (as wide as the grid shows) and
|
|
@@ -214,31 +227,55 @@ export class TableChrome {
|
|
|
214
227
|
get bars() {
|
|
215
228
|
const layout = this.layout;
|
|
216
229
|
if (!layout)
|
|
217
|
-
return
|
|
230
|
+
return [];
|
|
218
231
|
const { left, width } = this.span;
|
|
219
232
|
const right = layout.left + layout.width;
|
|
220
|
-
return
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
? { left: right + 2, top: layout.top, height: layout.height }
|
|
224
|
-
:
|
|
225
|
-
|
|
233
|
+
return [
|
|
234
|
+
{ kind: 'row', left, top: layout.top + layout.height + 2, width },
|
|
235
|
+
...(this.inView(right)
|
|
236
|
+
? [{ kind: 'column', left: right + 2, top: layout.top, height: layout.height }]
|
|
237
|
+
: [])
|
|
238
|
+
];
|
|
226
239
|
}
|
|
227
240
|
/**
|
|
228
241
|
* Where the open menu stands: under its grip.
|
|
229
242
|
* @internal
|
|
230
243
|
*/
|
|
231
244
|
get menuPlace() {
|
|
232
|
-
const
|
|
233
|
-
const
|
|
234
|
-
if (!
|
|
245
|
+
const kind = this.menu?.kind;
|
|
246
|
+
const at = kind && this.#lines(kind);
|
|
247
|
+
if (!at)
|
|
235
248
|
return null;
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
249
|
+
const { layout, index } = at;
|
|
250
|
+
if (kind === 'row') {
|
|
251
|
+
const row = layout.rows[index];
|
|
252
|
+
return { left: this.span.left - 9, top: row.top + Math.min(row.height, 28) };
|
|
239
253
|
}
|
|
240
|
-
const column = layout.columns[
|
|
241
|
-
return
|
|
254
|
+
const column = layout.columns[index];
|
|
255
|
+
return { left: column.left + column.width / 2 - 12, top: layout.top + 10 };
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* The drop line of a grip's drag, layer-relative: between two rows
|
|
259
|
+
* (columns), where the drop would land.
|
|
260
|
+
* @internal
|
|
261
|
+
*/
|
|
262
|
+
get line() {
|
|
263
|
+
const move = this.moving;
|
|
264
|
+
const gap = move?.gap ?? null;
|
|
265
|
+
const layout = this.layout;
|
|
266
|
+
if (!move || gap === null || !layout)
|
|
267
|
+
return null;
|
|
268
|
+
const row = move.kind === 'row';
|
|
269
|
+
const lines = row ? layout.rows : layout.columns.map((c) => ({ top: c.left, height: c.width }));
|
|
270
|
+
const last = lines.at(-1);
|
|
271
|
+
const at = lines[gap]?.top ?? (last && last.top + last.height);
|
|
272
|
+
if (at === undefined)
|
|
273
|
+
return null;
|
|
274
|
+
if (row)
|
|
275
|
+
return { kind: move.kind, gap, left: this.span.left, top: at - 2, width: this.span.width };
|
|
276
|
+
return this.inView(at)
|
|
277
|
+
? { kind: move.kind, gap, left: at - 2, top: layout.top, height: layout.height }
|
|
278
|
+
: null;
|
|
242
279
|
}
|
|
243
280
|
/**
|
|
244
281
|
* The width column `index` of `table` shows (its `data.columns` entry, the
|
|
@@ -247,53 +284,47 @@ export class TableChrome {
|
|
|
247
284
|
*/
|
|
248
285
|
width = (table, index, column) => {
|
|
249
286
|
const drag = this.drag;
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
const next = this.nextWidth(drag);
|
|
254
|
-
if (next !== undefined)
|
|
255
|
-
return next;
|
|
256
|
-
}
|
|
257
|
-
return widthOf(column, this.columnWidth);
|
|
287
|
+
const at = drag?.table === table ? index - drag.column : -1;
|
|
288
|
+
const preview = at === 0 ? this.#dragWidth(drag) : at === 1 ? this.#nextWidth(drag) : undefined;
|
|
289
|
+
return preview ?? widthOf(column, this.columnWidth);
|
|
258
290
|
};
|
|
259
291
|
/** The resize's width: the pointer's, between the minimum and the room's (`table.width.fit`). */
|
|
260
|
-
dragWidth = (drag) => Math.max(this.minColumnWidth, Math.min(drag.max, Math.round(drag.width + drag.at - drag.from)));
|
|
292
|
+
#dragWidth = (drag) => Math.max(this.minColumnWidth, Math.min(drag.max, Math.round(drag.width + drag.at - drag.from)));
|
|
261
293
|
/**
|
|
262
|
-
* The right neighbour's width while column `drag.column` is
|
|
294
|
+
* The right neighbour's width while column `drag.column` is `#dragWidth`
|
|
263
295
|
* (`table.width.neighbour`): the column grows into the free room first,
|
|
264
296
|
* then what it gains past it comes off its neighbour, down to the
|
|
265
297
|
* minimum; a narrowing gives nothing back.
|
|
266
298
|
*/
|
|
267
|
-
nextWidth(drag) {
|
|
299
|
+
#nextWidth(drag) {
|
|
268
300
|
if (drag.next === undefined)
|
|
269
301
|
return undefined;
|
|
270
|
-
const take = Math.max(0, this
|
|
302
|
+
const take = Math.max(0, this.#dragWidth(drag) - drag.width - drag.slack);
|
|
271
303
|
return Math.max(Math.min(drag.next, this.minColumnWidth), drag.next - take);
|
|
272
304
|
}
|
|
273
305
|
/**
|
|
274
306
|
* The widths `table`'s grid shows, by position (its columns' stored
|
|
275
307
|
* widths, else the default one): what its template reads, the model's.
|
|
276
308
|
*/
|
|
277
|
-
widthsOf(table) {
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
const entries = Array.isArray(stored) ? stored : [];
|
|
281
|
-
return columns.map((id) => widthOf(entries.find((c) => c?.id === id), this.columnWidth));
|
|
309
|
+
#widthsOf(table) {
|
|
310
|
+
const entries = entriesOf(table);
|
|
311
|
+
return (gridOf(table)?.columns ?? []).map((id) => widthOf(entries[entryIndex(entries, id)], this.columnWidth));
|
|
282
312
|
}
|
|
283
313
|
/**
|
|
284
|
-
* A resize of column `column` of
|
|
285
|
-
* `table.width.neighbour`): the column may grow by the
|
|
286
|
-
* leaves free and by what its right neighbour can give
|
|
287
|
-
* minimum), so the table never gets wider; it may always narrow.
|
|
314
|
+
* A resize of column `column` of the measured table, pressed at `from`
|
|
315
|
+
* (`table.width.fit`, `table.width.neighbour`): the column may grow by the
|
|
316
|
+
* room the table leaves free and by what its right neighbour can give
|
|
317
|
+
* (down to the minimum), so the table never gets wider; it may always narrow.
|
|
288
318
|
*/
|
|
289
|
-
resize(
|
|
290
|
-
const
|
|
319
|
+
#resize(column, from, at) {
|
|
320
|
+
const layout = this.layout;
|
|
321
|
+
const table = this.block(layout?.table);
|
|
322
|
+
const widths = table ? this.#widthsOf(table) : [];
|
|
291
323
|
const width = widths[column];
|
|
292
|
-
if (width === undefined)
|
|
324
|
+
if (!layout || !table || width === undefined)
|
|
293
325
|
return null;
|
|
294
326
|
const next = widths[column + 1];
|
|
295
|
-
const
|
|
296
|
-
const slack = Math.max(0, room - total);
|
|
327
|
+
const slack = Math.max(0, layout.room - widths.reduce((sum, w) => sum + w, 0));
|
|
297
328
|
const gives = next === undefined ? 0 : next - Math.min(next, this.minColumnWidth);
|
|
298
329
|
const max = Math.floor(width + slack + gives);
|
|
299
330
|
return { table: table.id, column, from, at, width, max, slack, next };
|
|
@@ -308,20 +339,17 @@ export class TableChrome {
|
|
|
308
339
|
return;
|
|
309
340
|
const element = target instanceof Element ? target : null;
|
|
310
341
|
const cell = element?.closest('[data-edytor-table-cell], [data-edytor-table-pad]');
|
|
311
|
-
const
|
|
312
|
-
const
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
const was = this.hovered;
|
|
321
|
-
if (was?.table === next?.table && was?.row === next?.row && was?.column === next?.column)
|
|
322
|
-
return;
|
|
342
|
+
const table = element?.closest('[data-edytor-table]')?.dataset.edytorId;
|
|
343
|
+
const grid = gridOf(this.block(table));
|
|
344
|
+
const next = table && grid
|
|
345
|
+
? {
|
|
346
|
+
table,
|
|
347
|
+
row: cell?.closest('[data-edytor-table-row]')?.dataset.edytorId ?? null,
|
|
348
|
+
column: grid.columns[Number(cell?.dataset.edytorColumn)] ?? null
|
|
349
|
+
}
|
|
350
|
+
: null;
|
|
323
351
|
// Over the chrome (a grip, the `+`), the row and column it is for stay.
|
|
324
|
-
if (next ===
|
|
352
|
+
if (JSON.stringify(next) === JSON.stringify(this.hovered) || (!next && this.menu))
|
|
325
353
|
return;
|
|
326
354
|
this.hovered = next;
|
|
327
355
|
this.edytor.overlay.invalidate();
|
|
@@ -344,27 +372,27 @@ export class TableChrome {
|
|
|
344
372
|
* @internal
|
|
345
373
|
*/
|
|
346
374
|
measure = (host, origin) => {
|
|
347
|
-
const layout = this.shown ? this
|
|
375
|
+
const layout = this.shown ? this.#read(origin) : null;
|
|
348
376
|
return () => {
|
|
349
|
-
|
|
350
|
-
if (
|
|
377
|
+
pin(host);
|
|
378
|
+
if (JSON.stringify(layout) !== JSON.stringify(this.layout))
|
|
351
379
|
this.layout = layout;
|
|
352
380
|
};
|
|
353
381
|
};
|
|
354
|
-
read(origin) {
|
|
382
|
+
#read(origin) {
|
|
355
383
|
const table = this.block(this.table);
|
|
356
|
-
const grid =
|
|
384
|
+
const grid = gridNode(table);
|
|
357
385
|
const columns = gridOf(table)?.columns;
|
|
358
386
|
if (!table || !grid?.isConnected || !columns)
|
|
359
387
|
return null;
|
|
360
388
|
const box = grid.getBoundingClientRect();
|
|
361
389
|
const widths = trackWidths(grid);
|
|
362
|
-
|
|
390
|
+
const left = box.left - origin.left;
|
|
391
|
+
let x = left;
|
|
363
392
|
const cols = columns.map((id, i) => {
|
|
364
393
|
const width = widths[i] ?? this.columnWidth;
|
|
365
|
-
const col = { id, left: x, width };
|
|
366
394
|
x += width;
|
|
367
|
-
return
|
|
395
|
+
return { id, left: x - width, width };
|
|
368
396
|
});
|
|
369
397
|
const rows = table.children.flatMap((row) => {
|
|
370
398
|
const rect = row.node?.getBoundingClientRect();
|
|
@@ -373,44 +401,33 @@ export class TableChrome {
|
|
|
373
401
|
// The box the grid scrolls in: its client box is what shows, and the room.
|
|
374
402
|
const scroller = grid.closest('[data-edytor-table-scroll]') ?? grid.parentElement;
|
|
375
403
|
const inner = scroller?.clientWidth ?? 0;
|
|
376
|
-
const clip = inner > 0 ? scroller
|
|
377
|
-
const style =
|
|
378
|
-
const
|
|
379
|
-
const left = clip ? clip.left + (scroller?.clientLeft ?? 0) - origin.left : 0;
|
|
404
|
+
const clip = inner > 0 ? scroller.getBoundingClientRect() : undefined;
|
|
405
|
+
const style = styleOf(grid);
|
|
406
|
+
const at = clip ? clip.left + scroller.clientLeft - origin.left : 0;
|
|
380
407
|
return {
|
|
381
408
|
table: table.id,
|
|
382
|
-
left
|
|
409
|
+
left,
|
|
383
410
|
top: box.top - origin.top,
|
|
384
|
-
width: Math.min(box.width, x -
|
|
411
|
+
width: Math.min(box.width, x - left) || box.width,
|
|
385
412
|
height: box.height,
|
|
386
413
|
rows,
|
|
387
414
|
columns: cols,
|
|
388
|
-
view: clip ? { left, right:
|
|
389
|
-
room: clip ? inner -
|
|
415
|
+
view: clip ? { left: at, right: at + inner } : { left: -Infinity, right: Infinity },
|
|
416
|
+
room: clip ? inner - px(style?.borderLeftWidth) - px(style?.borderRightWidth) : Infinity
|
|
390
417
|
};
|
|
391
418
|
}
|
|
392
419
|
/**
|
|
393
|
-
* Open the menu
|
|
394
|
-
*
|
|
420
|
+
* Open the `kind` grip's menu on the row or column it stands for, its
|
|
421
|
+
* first row that can run the keyboard's, or close it when it is open
|
|
422
|
+
* there (a grip's click).
|
|
395
423
|
*/
|
|
396
|
-
open = (menu) => {
|
|
397
|
-
const same = this.menu?.kind === menu.kind &&
|
|
398
|
-
this.menu.table === menu.table &&
|
|
399
|
-
(menu.kind === 'row'
|
|
400
|
-
? this.menu.row === menu.row
|
|
401
|
-
: this.menu.column === menu.column);
|
|
402
|
-
this.menu = same ? null : menu;
|
|
403
|
-
if (!same)
|
|
404
|
-
this.index = Math.max(0, this.#enabled()[0] ?? 0);
|
|
405
|
-
this.edytor.overlay.invalidate();
|
|
406
|
-
};
|
|
407
|
-
/** Open the `kind` grip's menu on the row or column it stands for, or close it (a grip's click). */
|
|
408
424
|
toggle = (kind) => {
|
|
409
|
-
const source = this
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
425
|
+
const source = this.#source(kind);
|
|
426
|
+
const open = this.menu?.kind === kind;
|
|
427
|
+
this.menu = open || !source ? null : { kind, table: source.table.id, id: source.id };
|
|
428
|
+
if (this.menu)
|
|
429
|
+
this.index = Math.max(0, this.#rows.findIndex((row) => !row.disabled));
|
|
430
|
+
this.edytor.overlay.invalidate();
|
|
414
431
|
};
|
|
415
432
|
/** Whether a menu is open (reactive). */
|
|
416
433
|
get isOpen() {
|
|
@@ -422,76 +439,75 @@ export class TableChrome {
|
|
|
422
439
|
this.edytor.overlay.invalidate();
|
|
423
440
|
takeKeys(this.edytor);
|
|
424
441
|
};
|
|
425
|
-
/**
|
|
426
|
-
|
|
427
|
-
|
|
442
|
+
/**
|
|
443
|
+
* The open menu's rows: insert before and after, move back and forth,
|
|
444
|
+
* delete (whether each can run now; the last deletes).
|
|
445
|
+
*/
|
|
446
|
+
get #rows() {
|
|
447
|
+
const kind = this.menu?.kind;
|
|
448
|
+
const at = kind && this.#source(kind);
|
|
449
|
+
if (!at)
|
|
450
|
+
return [];
|
|
451
|
+
const { table, grid, id, index } = at;
|
|
452
|
+
const row = kind === 'row';
|
|
453
|
+
const block = this.edytor.idToBlock.get(id);
|
|
454
|
+
const last = (row ? grid.rows : grid.columns).length - 1;
|
|
455
|
+
const insert = (to) => (row ? insertRow(table, to, true) : insertColumn(table, to));
|
|
456
|
+
const move = (to) => (row ? moveRows(table, [block], to) : moveColumn(table, id, to));
|
|
457
|
+
const [before, after, back, forth] = row
|
|
458
|
+
? ['above', 'below', 'up', 'down']
|
|
459
|
+
: ['left', 'right', 'left', 'right'];
|
|
460
|
+
return [
|
|
461
|
+
{ id: `insert-${before}`, disabled: false, run: () => insert(index) },
|
|
462
|
+
{ id: `insert-${after}`, disabled: false, run: () => insert(index + 1) },
|
|
463
|
+
{ id: `move-${back}`, disabled: index === 0, run: () => move(index - 1) },
|
|
464
|
+
{ id: `move-${forth}`, disabled: index === last, run: () => move(index + 1) },
|
|
465
|
+
{
|
|
466
|
+
id: `delete-${kind}`,
|
|
467
|
+
disabled: false,
|
|
468
|
+
run: () => (row ? deleteRows(table, [block]) : deleteColumn(table, id))
|
|
469
|
+
}
|
|
470
|
+
];
|
|
428
471
|
}
|
|
429
|
-
/** A row's element id (page-unique), for `aria-activedescendant`. */
|
|
430
|
-
rowId = (row) => this.edytor.popups.idOf(`table-menu-${row.id}`);
|
|
431
|
-
/** The positions in `rows` of the rows that can run now. */
|
|
432
|
-
#enabled = () => this.rows.flatMap((row, index) => (row.isEnabled() ? [index] : []));
|
|
433
472
|
/**
|
|
434
|
-
* The open menu's rows for
|
|
473
|
+
* The open menu's rows for your `menu`: each the row shape every menu
|
|
435
474
|
* shares (`run` runs it and closes the menu, `select` makes it the
|
|
436
475
|
* keyboard's, `option` its attributes), whether it can run now
|
|
437
|
-
* (`disabled`)
|
|
476
|
+
* (`disabled`) and whether it deletes (`danger`).
|
|
438
477
|
*/
|
|
439
478
|
get items() {
|
|
440
|
-
return this
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
disabled
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
479
|
+
return this.#rows.map(({ id, disabled, run }, index) => ({
|
|
480
|
+
item: { id },
|
|
481
|
+
id: this.rowId(index),
|
|
482
|
+
selected: index === this.index,
|
|
483
|
+
disabled,
|
|
484
|
+
danger: id.startsWith('delete'),
|
|
485
|
+
run: () => {
|
|
486
|
+
if (disabled)
|
|
487
|
+
return;
|
|
488
|
+
this.menu = this.hovered = null;
|
|
489
|
+
takeKeys(this.edytor);
|
|
490
|
+
run();
|
|
491
|
+
this.edytor.overlay.invalidate();
|
|
492
|
+
},
|
|
493
|
+
select: () => {
|
|
494
|
+
if (!disabled)
|
|
495
|
+
this.index = index;
|
|
496
|
+
},
|
|
497
|
+
option: this.option(index)
|
|
498
|
+
}));
|
|
458
499
|
}
|
|
459
500
|
/**
|
|
460
|
-
* The
|
|
461
|
-
*
|
|
462
|
-
* `aria-disabled` when it cannot run now
|
|
463
|
-
*
|
|
501
|
+
* The attachment of the open menu's row at `index`
|
|
502
|
+
* (`{@attach chrome.option(index)}`). Its id, `menuitem` role,
|
|
503
|
+
* `aria-disabled` when it cannot run now; the keyboard's row scrolls into
|
|
504
|
+
* view. The menu's element takes
|
|
505
|
+
* `data-edytor-table-menu` (the kind it is open on) from `popup`.
|
|
464
506
|
*/
|
|
465
|
-
option
|
|
466
|
-
const
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
};
|
|
470
|
-
/**
|
|
471
|
-
* The menu's element (`{@attach chrome.popup}`): its id, `menu` role and
|
|
472
|
-
* name (Row options, Column options) unless it has its own, presses that
|
|
473
|
-
* keep the focus, and its publication to the view's root
|
|
474
|
-
* (`edytor.popups`: `aria-controls`, `aria-haspopup`) while it is in
|
|
475
|
-
* the page; `data-edytor-table-menu` names the kind it is open on.
|
|
476
|
-
*/
|
|
477
|
-
popup = (node) => untrack(() => {
|
|
478
|
-
node.id = this.menuId;
|
|
479
|
-
if (!node.hasAttribute('role'))
|
|
480
|
-
node.setAttribute('role', 'menu');
|
|
481
|
-
const named = node.hasAttribute('aria-label') || node.hasAttribute('aria-labelledby');
|
|
482
|
-
node.addEventListener('mousedown', keepFocus);
|
|
483
|
-
$effect(() => {
|
|
484
|
-
const kind = this.menu?.kind;
|
|
485
|
-
if (!kind)
|
|
486
|
-
return;
|
|
487
|
-
node.setAttribute('data-edytor-table-menu', kind);
|
|
488
|
-
if (!named)
|
|
489
|
-
attribute(node, 'aria-label', kind === 'row' ? this.labels.rowMenu : this.labels.columnMenu);
|
|
490
|
-
this.edytor.popups.set('table-menu', { id: this.menuId, haspopup: 'menu' });
|
|
491
|
-
return () => this.edytor.popups.set('table-menu', null);
|
|
492
|
-
});
|
|
493
|
-
return () => node.removeEventListener('mousedown', keepFocus);
|
|
494
|
-
});
|
|
507
|
+
option(index) {
|
|
508
|
+
const extra = this.#rows[index]?.disabled ? { 'aria-disabled': true } : {};
|
|
509
|
+
return optionAttachment(this.rowId(index), 'menuitem', index === this.index, extra);
|
|
510
|
+
}
|
|
495
511
|
/**
|
|
496
512
|
* The element that holds the menu's keyboard (`{@attach chrome.keys}`,
|
|
497
513
|
* the menu's own): it takes the focus when it mounts and names the
|
|
@@ -503,51 +519,29 @@ export class TableChrome {
|
|
|
503
519
|
keys = (node) => untrack(() => {
|
|
504
520
|
if (!node.hasAttribute('tabindex'))
|
|
505
521
|
node.tabIndex = -1;
|
|
506
|
-
|
|
507
|
-
node.focus({ preventScroll: true });
|
|
508
|
-
node.addEventListener('keydown', this.#keydown);
|
|
509
|
-
$effect(() => {
|
|
510
|
-
const row = this.rows[this.index];
|
|
511
|
-
attribute(node, 'aria-activedescendant', inPage(node, row && this.rowId(row)));
|
|
512
|
-
});
|
|
513
|
-
return () => node.removeEventListener('keydown', this.#keydown);
|
|
522
|
+
return holdKeys(node, this.#keydown, () => this.rowId(this.index));
|
|
514
523
|
});
|
|
515
524
|
/** The menu's keys (`keys`). */
|
|
516
525
|
#keydown = (event) => {
|
|
517
526
|
if (event.defaultPrevented || event.isComposing)
|
|
518
527
|
return;
|
|
519
|
-
const
|
|
520
|
-
const
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
const index = key === 'Home' ? enabled[0] : enabled.at(-1);
|
|
530
|
-
if (index !== undefined)
|
|
531
|
-
this.index = index;
|
|
532
|
-
}
|
|
533
|
-
else if (key === 'Enter' || key === ' ') {
|
|
534
|
-
const row = this.rows[this.index];
|
|
535
|
-
if (row)
|
|
536
|
-
this.runRow(row);
|
|
537
|
-
}
|
|
538
|
-
else if (key === 'Escape' || key === 'Tab')
|
|
539
|
-
this.close();
|
|
540
|
-
else
|
|
541
|
-
return;
|
|
542
|
-
event.preventDefault();
|
|
543
|
-
event.stopPropagation();
|
|
528
|
+
const items = this.items;
|
|
529
|
+
const menu = {
|
|
530
|
+
at: this.index,
|
|
531
|
+
count: items.length,
|
|
532
|
+
to: (index) => (this.index = index),
|
|
533
|
+
pick: () => items[this.index]?.run(),
|
|
534
|
+
close: this.close
|
|
535
|
+
};
|
|
536
|
+
if (menuKey(event, menu, { usable: (index) => !items[index].disabled }))
|
|
537
|
+
event.stopPropagation();
|
|
544
538
|
};
|
|
545
539
|
/**
|
|
546
540
|
* The `kind` grip's attachment (`{@attach}` it on a grip's element; a
|
|
547
541
|
* `grip` snippet's payload carries it): in an editable view, dragging it
|
|
548
542
|
* moves its row or column within its table (`table.drag`); a click with
|
|
549
543
|
* no drag opens or closes its menu; ArrowDown opens the menu, Escape
|
|
550
|
-
* closes it and gives the keys back to the editor. It
|
|
544
|
+
* closes it and gives the keys back to the editor. It carries
|
|
551
545
|
* `aria-haspopup`, `aria-expanded`, `aria-controls` while its menu is
|
|
552
546
|
* open, and `data-dragging` during its drag. A press on it is never
|
|
553
547
|
* prevented: that would stop the native drag.
|
|
@@ -555,11 +549,14 @@ export class TableChrome {
|
|
|
555
549
|
gripOf = (kind) => (this.#grips[kind] ??= (node) => untrack(() => this.#grip(node, kind)));
|
|
556
550
|
#grips = {};
|
|
557
551
|
#grip = (node, kind) => {
|
|
558
|
-
if (!node.hasAttribute('aria-label') && !node.hasAttribute('aria-labelledby'))
|
|
559
|
-
node.setAttribute('aria-label', kind === 'row' ? this.labels.rowMenu : this.labels.columnMenu);
|
|
560
552
|
node.setAttribute('aria-haspopup', 'menu');
|
|
561
|
-
|
|
562
|
-
|
|
553
|
+
$effect(() => {
|
|
554
|
+
const open = this.menu?.kind === kind;
|
|
555
|
+
attribute(node, 'aria-expanded', String(open));
|
|
556
|
+
attribute(node, 'aria-controls', open ? this.listId : undefined);
|
|
557
|
+
attribute(node, 'data-dragging', this.moving?.kind === kind ? 'true' : undefined);
|
|
558
|
+
});
|
|
559
|
+
const off = all(listen(node, 'click', () => this.toggle(kind)), listen(node, 'keydown', (event) => {
|
|
563
560
|
// Escape gives the keys back to the editor (closing the menu if open).
|
|
564
561
|
if (event.key === 'Escape')
|
|
565
562
|
this.close();
|
|
@@ -569,244 +566,58 @@ export class TableChrome {
|
|
|
569
566
|
return;
|
|
570
567
|
event.preventDefault();
|
|
571
568
|
event.stopPropagation();
|
|
572
|
-
}
|
|
573
|
-
node.addEventListener('click', click);
|
|
574
|
-
node.addEventListener('keydown', keydown);
|
|
575
|
-
$effect(() => {
|
|
576
|
-
const open = this.menu?.kind === kind;
|
|
577
|
-
attribute(node, 'aria-expanded', String(open));
|
|
578
|
-
attribute(node, 'aria-controls', open ? this.menuId : undefined);
|
|
579
|
-
attribute(node, 'data-dragging', this.moving?.kind === kind ? 'true' : undefined);
|
|
580
|
-
});
|
|
581
|
-
const cleanup = draggable({
|
|
569
|
+
}), draggable({
|
|
582
570
|
element: node,
|
|
583
|
-
canDrag: () => !this.edytor.readonly && this.edytor.dispatcher.permits() && this
|
|
571
|
+
canDrag: () => !this.edytor.readonly && this.edytor.dispatcher.permits() && this.#source(kind) !== null,
|
|
584
572
|
getInitialData: () => ({ [MOVE]: this }),
|
|
585
573
|
// The editor's own drag: no view takes it as a foreign drop.
|
|
586
574
|
getInitialDataForExternal: () => {
|
|
587
|
-
const source = this
|
|
588
|
-
return {
|
|
575
|
+
const source = this.#source(kind);
|
|
576
|
+
return {
|
|
577
|
+
[EDYTOR_BLOCK_DRAG_MIME]: (kind === 'row' ? source?.id : source?.table.id) ?? ''
|
|
578
|
+
};
|
|
589
579
|
},
|
|
590
|
-
onGenerateDragPreview: ({ nativeSetDragImage, location }) => this
|
|
580
|
+
onGenerateDragPreview: ({ nativeSetDragImage, location }) => this.#begin(kind, node, location.current.input, nativeSetDragImage),
|
|
591
581
|
// The drag library tells the source before the drop target: the drop runs first.
|
|
592
|
-
onDrop: () => queueMicrotask(() =>
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
};
|
|
599
|
-
|
|
600
|
-
/** The rows of the open menu. */
|
|
601
|
-
get rows() {
|
|
602
|
-
const menu = this.menu;
|
|
603
|
-
const table = this.block(menu?.table);
|
|
604
|
-
const grid = gridOf(table);
|
|
605
|
-
if (!menu || !table || !grid)
|
|
606
|
-
return [];
|
|
607
|
-
const { labels } = this;
|
|
608
|
-
if (menu.kind === 'row') {
|
|
609
|
-
const index = grid.rows.findIndex((r) => r.id === menu.row);
|
|
610
|
-
const row = this.edytor.idToBlock.get(menu.row);
|
|
611
|
-
if (index < 0 || !row)
|
|
612
|
-
return [];
|
|
613
|
-
const last = grid.rows.length - 1;
|
|
614
|
-
return [
|
|
615
|
-
{
|
|
616
|
-
id: 'insert-above',
|
|
617
|
-
label: labels.insertAbove,
|
|
618
|
-
icon: 'action.up',
|
|
619
|
-
isEnabled: () => true,
|
|
620
|
-
run: () => insertRow(table, index, true)
|
|
621
|
-
},
|
|
622
|
-
{
|
|
623
|
-
id: 'insert-below',
|
|
624
|
-
label: labels.insertBelow,
|
|
625
|
-
icon: 'action.down',
|
|
626
|
-
isEnabled: () => true,
|
|
627
|
-
run: () => insertRow(table, index + 1, true)
|
|
628
|
-
},
|
|
629
|
-
{
|
|
630
|
-
id: 'move-up',
|
|
631
|
-
label: labels.moveUp,
|
|
632
|
-
icon: 'action.up',
|
|
633
|
-
isEnabled: () => index > 0,
|
|
634
|
-
run: () => moveRows(table, [row], index - 1)
|
|
635
|
-
},
|
|
636
|
-
{
|
|
637
|
-
id: 'move-down',
|
|
638
|
-
label: labels.moveDown,
|
|
639
|
-
icon: 'action.down',
|
|
640
|
-
isEnabled: () => index < last,
|
|
641
|
-
run: () => moveRows(table, [row], index + 1)
|
|
642
|
-
},
|
|
643
|
-
{
|
|
644
|
-
id: 'delete-row',
|
|
645
|
-
label: labels.deleteRow,
|
|
646
|
-
icon: 'action.delete',
|
|
647
|
-
danger: true,
|
|
648
|
-
isEnabled: () => true,
|
|
649
|
-
run: () => deleteRows(table, [row])
|
|
650
|
-
}
|
|
651
|
-
];
|
|
652
|
-
}
|
|
653
|
-
const index = menu.column;
|
|
654
|
-
const column = grid.columns[index];
|
|
655
|
-
if (column === undefined)
|
|
656
|
-
return [];
|
|
657
|
-
const last = grid.columns.length - 1;
|
|
658
|
-
return [
|
|
659
|
-
{
|
|
660
|
-
id: 'insert-left',
|
|
661
|
-
label: labels.insertLeft,
|
|
662
|
-
icon: 'table.left',
|
|
663
|
-
isEnabled: () => true,
|
|
664
|
-
run: () => insertColumn(table, index)
|
|
665
|
-
},
|
|
666
|
-
{
|
|
667
|
-
id: 'insert-right',
|
|
668
|
-
label: labels.insertRight,
|
|
669
|
-
icon: 'table.right',
|
|
670
|
-
isEnabled: () => true,
|
|
671
|
-
run: () => insertColumn(table, index + 1)
|
|
672
|
-
},
|
|
673
|
-
{
|
|
674
|
-
id: 'move-left',
|
|
675
|
-
label: labels.moveLeft,
|
|
676
|
-
icon: 'table.left',
|
|
677
|
-
isEnabled: () => index > 0,
|
|
678
|
-
run: () => moveColumn(table, index, index - 1)
|
|
679
|
-
},
|
|
680
|
-
{
|
|
681
|
-
id: 'move-right',
|
|
682
|
-
label: labels.moveRight,
|
|
683
|
-
icon: 'table.right',
|
|
684
|
-
isEnabled: () => index < last,
|
|
685
|
-
run: () => moveColumn(table, index, index + 1)
|
|
686
|
-
},
|
|
687
|
-
{
|
|
688
|
-
id: 'delete-column',
|
|
689
|
-
label: labels.deleteColumn,
|
|
690
|
-
icon: 'action.delete',
|
|
691
|
-
danger: true,
|
|
692
|
-
isEnabled: () => true,
|
|
693
|
-
run: () => deleteColumn(table, index)
|
|
694
|
-
}
|
|
695
|
-
];
|
|
696
|
-
}
|
|
697
|
-
/** Run a menu row, then close the menu. */
|
|
698
|
-
runRow = (row) => {
|
|
699
|
-
if (!row.isEnabled())
|
|
700
|
-
return;
|
|
701
|
-
this.menu = null;
|
|
702
|
-
this.hovered = null;
|
|
703
|
-
takeKeys(this.edytor);
|
|
704
|
-
row.run();
|
|
705
|
-
this.edytor.overlay.invalidate();
|
|
706
|
-
};
|
|
707
|
-
/** The `+` under the table: a row at its end, the caret in its first cell. */
|
|
708
|
-
addRow = () => {
|
|
709
|
-
const table = this.block(this.table);
|
|
710
|
-
const grid = gridOf(table);
|
|
711
|
-
if (!table || !grid)
|
|
712
|
-
return;
|
|
713
|
-
takeKeys(this.edytor);
|
|
714
|
-
insertRow(table, grid.rows.length, true);
|
|
582
|
+
onDrop: () => queueMicrotask(() => {
|
|
583
|
+
for (const release of this.#releases.splice(0))
|
|
584
|
+
release();
|
|
585
|
+
this.moving = null;
|
|
586
|
+
this.edytor.overlay.invalidate();
|
|
587
|
+
})
|
|
588
|
+
}));
|
|
589
|
+
return off;
|
|
715
590
|
};
|
|
716
|
-
/**
|
|
717
|
-
|
|
591
|
+
/**
|
|
592
|
+
* The `+` under the table (`row`: a row at its end, the caret in its
|
|
593
|
+
* first cell) or beside it (a column at its end).
|
|
594
|
+
* @internal
|
|
595
|
+
*/
|
|
596
|
+
add = (kind) => {
|
|
718
597
|
const table = this.block(this.table);
|
|
719
598
|
const grid = gridOf(table);
|
|
720
599
|
if (!table || !grid)
|
|
721
600
|
return;
|
|
722
601
|
takeKeys(this.edytor);
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
* @internal
|
|
728
|
-
*/
|
|
729
|
-
mousedown = (event, column) => {
|
|
730
|
-
event.preventDefault();
|
|
731
|
-
if (isLonePress(this.edytor, event))
|
|
732
|
-
this.start(event, column);
|
|
602
|
+
if (kind === 'row')
|
|
603
|
+
insertRow(table, grid.rows.length, true);
|
|
604
|
+
else
|
|
605
|
+
insertColumn(table, grid.columns.length);
|
|
733
606
|
};
|
|
734
607
|
/**
|
|
735
|
-
* Press on column `column`'s band
|
|
736
|
-
* the
|
|
737
|
-
*
|
|
608
|
+
* Press on column `column`'s band (its `pointerdown`, or its lone
|
|
609
|
+
* `mousedown`): the drag starts; the preview follows the pointer and the
|
|
610
|
+
* release writes the width (`#release`); Escape, a cancel or the view
|
|
611
|
+
* turning readonly drop the preview, nothing written.
|
|
738
612
|
* @internal
|
|
739
613
|
*/
|
|
740
614
|
start = (event, column) => {
|
|
741
|
-
const
|
|
742
|
-
const
|
|
743
|
-
if (
|
|
744
|
-
return;
|
|
745
|
-
const col = layout.columns[column];
|
|
746
|
-
if (!col)
|
|
747
|
-
return;
|
|
748
|
-
event.preventDefault();
|
|
749
|
-
event.stopPropagation();
|
|
750
|
-
const target = event.currentTarget;
|
|
751
|
-
const pointer = event.type === 'pointerdown';
|
|
752
|
-
if (pointer)
|
|
753
|
-
target?.setPointerCapture?.(event.pointerId);
|
|
754
|
-
const table = this.block(layout.table);
|
|
755
|
-
if (!table)
|
|
756
|
-
return;
|
|
757
|
-
const drag = this.resize(table, column, layout.room, event.clientX, event.clientX);
|
|
758
|
-
if (!drag)
|
|
615
|
+
const drag = this.band.drag ? null : this.#resize(column, event.clientX, event.clientX);
|
|
616
|
+
const shown = this.layout?.columns[column]?.width;
|
|
617
|
+
if (!drag || shown === undefined)
|
|
759
618
|
return;
|
|
760
619
|
// The press starts from the width the grid shows.
|
|
761
|
-
this.
|
|
762
|
-
const document = target?.ownerDocument ?? edytor.node?.ownerDocument;
|
|
763
|
-
const tracked = pointer ? document : document?.defaultView;
|
|
764
|
-
const [moves, ups] = pointer ? ['pointermove', 'pointerup'] : ['mousemove', 'mouseup'];
|
|
765
|
-
const move = (moved) => {
|
|
766
|
-
if (!this.drag)
|
|
767
|
-
return;
|
|
768
|
-
if (!edytor.dispatcher.permits())
|
|
769
|
-
return end(moved);
|
|
770
|
-
this.drag.at = moved.clientX;
|
|
771
|
-
edytor.overlay.invalidate();
|
|
772
|
-
};
|
|
773
|
-
const end = (ended) => {
|
|
774
|
-
tracked?.removeEventListener(moves, move);
|
|
775
|
-
tracked?.removeEventListener(ups, end);
|
|
776
|
-
tracked?.removeEventListener('pointercancel', end);
|
|
777
|
-
document?.removeEventListener('keydown', escape, true);
|
|
778
|
-
const drag = this.drag;
|
|
779
|
-
if (drag && ended.type === ups) {
|
|
780
|
-
drag.at = ended.clientX;
|
|
781
|
-
this.release(drag);
|
|
782
|
-
takeKeys(edytor);
|
|
783
|
-
}
|
|
784
|
-
this.drag = null;
|
|
785
|
-
edytor.overlay.invalidate();
|
|
786
|
-
};
|
|
787
|
-
const escape = (key) => {
|
|
788
|
-
if (key.key !== 'Escape')
|
|
789
|
-
return;
|
|
790
|
-
key.preventDefault();
|
|
791
|
-
key.stopPropagation();
|
|
792
|
-
end(key);
|
|
793
|
-
};
|
|
794
|
-
this.#cancel = () => end(new Event('cancel'));
|
|
795
|
-
tracked?.addEventListener(moves, move);
|
|
796
|
-
tracked?.addEventListener(ups, end);
|
|
797
|
-
if (pointer)
|
|
798
|
-
tracked?.addEventListener('pointercancel', end);
|
|
799
|
-
document?.addEventListener('keydown', escape, true);
|
|
800
|
-
edytor.overlay.invalidate();
|
|
801
|
-
};
|
|
802
|
-
#cancel = null;
|
|
803
|
-
/**
|
|
804
|
-
* The view turned readonly mid-drag: the preview goes, nothing written.
|
|
805
|
-
* @internal
|
|
806
|
-
*/
|
|
807
|
-
lock = () => {
|
|
808
|
-
if (this.drag && !this.edytor.dispatcher.permits())
|
|
809
|
-
this.#cancel?.();
|
|
620
|
+
this.band.start(event, { ...drag, width: shown, max: Math.max(drag.max, shown) }, (drag) => drag && this.#release(drag));
|
|
810
621
|
};
|
|
811
622
|
/**
|
|
812
623
|
* A key on a focused band: ArrowRight/ArrowLeft widen or narrow the
|
|
@@ -815,22 +626,10 @@ export class TableChrome {
|
|
|
815
626
|
* @internal
|
|
816
627
|
*/
|
|
817
628
|
key = (event, column) => {
|
|
818
|
-
event
|
|
819
|
-
|
|
820
|
-
event.preventDefault();
|
|
821
|
-
return takeKeys(this.edytor);
|
|
822
|
-
}
|
|
823
|
-
const step = { ArrowLeft: -1, ArrowRight: 1 }[event.key];
|
|
824
|
-
if (step === undefined)
|
|
825
|
-
return;
|
|
826
|
-
event.preventDefault();
|
|
827
|
-
const layout = this.layout;
|
|
828
|
-
const table = this.block(layout?.table);
|
|
829
|
-
if (!layout || !table || this.drag)
|
|
830
|
-
return;
|
|
831
|
-
const drag = this.resize(table, column, layout.room, 0, step * (event.shiftKey ? 32 : 8));
|
|
629
|
+
const step = bandKey(this.edytor, this.band, event, { ArrowLeft: -1, ArrowRight: 1 });
|
|
630
|
+
const drag = step && this.#resize(column, 0, step * (event.shiftKey ? 32 : 8));
|
|
832
631
|
if (drag)
|
|
833
|
-
this
|
|
632
|
+
this.#release(drag);
|
|
834
633
|
};
|
|
835
634
|
/**
|
|
836
635
|
* The release: column `drag.column`'s width, and its right neighbour's
|
|
@@ -840,123 +639,88 @@ export class TableChrome {
|
|
|
840
639
|
* first entry naming it), never by position: the stored array may hold
|
|
841
640
|
* an entry the grid does not show.
|
|
842
641
|
*/
|
|
843
|
-
release(drag) {
|
|
642
|
+
#release(drag) {
|
|
844
643
|
const table = this.block(drag.table);
|
|
845
644
|
const columns = gridOf(table)?.columns;
|
|
846
|
-
if (!table || !columns)
|
|
847
|
-
return;
|
|
848
|
-
const { facade } = table.edytor;
|
|
849
|
-
const stored = facade.blockDataOf(table.id)?.columns;
|
|
850
|
-
const entries = Array.isArray(stored) ? stored : [];
|
|
851
|
-
const items = facade.dataItemIds(table.id, ['columns']);
|
|
852
|
-
const write = (index, width) => {
|
|
853
|
-
const id = columns[index];
|
|
854
|
-
const at = entries.findIndex((c) => c?.id === id);
|
|
855
|
-
const item = at < 0 || id === undefined ? undefined : items[at];
|
|
856
|
-
if (item === undefined || width === undefined)
|
|
857
|
-
return [];
|
|
858
|
-
if (width === widthOf(entries[at], this.columnWidth))
|
|
859
|
-
return [];
|
|
860
|
-
return [{ path: ['columns', item, 'width'], value: width }];
|
|
861
|
-
};
|
|
862
|
-
const own = write(drag.column, this.dragWidth(drag));
|
|
863
|
-
if (!own.length && columns[drag.column] === undefined)
|
|
645
|
+
if (!table || !columns || columns[drag.column] === undefined)
|
|
864
646
|
return;
|
|
865
|
-
const
|
|
647
|
+
const entries = entriesOf(table);
|
|
648
|
+
const items = table.edytor.facade.dataItemIds(table.id, ['columns']);
|
|
649
|
+
const ops = [this.#dragWidth(drag), this.#nextWidth(drag)].flatMap((width, i) => {
|
|
650
|
+
const at = entryIndex(entries, columns[drag.column + i]);
|
|
651
|
+
const item = items[at];
|
|
652
|
+
return at < 0 || item === undefined || width === undefined
|
|
653
|
+
? []
|
|
654
|
+
: width === widthOf(entries[at], this.columnWidth)
|
|
655
|
+
? []
|
|
656
|
+
: [{ path: ['columns', item, 'width'], value: width }];
|
|
657
|
+
});
|
|
866
658
|
if (ops.length)
|
|
867
|
-
|
|
868
|
-
}
|
|
869
|
-
/** What the row grip or the column grip stands for now: its table, the row's or column's id, its position. */
|
|
870
|
-
source(kind) {
|
|
871
|
-
const table = this.block(this.table);
|
|
872
|
-
const grid = gridOf(table);
|
|
873
|
-
if (!table || !grid)
|
|
874
|
-
return null;
|
|
875
|
-
if (kind === 'row') {
|
|
876
|
-
const id = this.gripRow;
|
|
877
|
-
const index = grid.rows.findIndex((r) => r.id === id);
|
|
878
|
-
return id && index >= 0 ? { table, id, index } : null;
|
|
879
|
-
}
|
|
880
|
-
const index = this.gripColumn;
|
|
881
|
-
const id = index === null ? undefined : grid.columns[index];
|
|
882
|
-
return index === null || id === undefined ? null : { table, id, index };
|
|
659
|
+
this.edytor.patchData(table.id, ops);
|
|
883
660
|
}
|
|
884
661
|
/** The drop target and auto-scroll of the drag in progress, released when it ends. */
|
|
885
662
|
#releases = [];
|
|
886
|
-
/**
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
663
|
+
/**
|
|
664
|
+
* The drag starts: what it moves; its ghost, the row's cells side by side
|
|
665
|
+
* or the column's one under the other, at their columns' widths (the
|
|
666
|
+
* blocks' ghost, `dragPreview`); the page as its drop target; auto-scroll.
|
|
667
|
+
*/
|
|
668
|
+
#begin(kind, node, pointer, nativeSetDragImage) {
|
|
669
|
+
const source = this.#source(kind);
|
|
670
|
+
const root = this.edytor.node;
|
|
671
|
+
if (!source || !root)
|
|
890
672
|
return;
|
|
891
|
-
const { table } = source;
|
|
673
|
+
const { table, grid, id, index } = source;
|
|
892
674
|
this.menu = null;
|
|
893
|
-
this.moving = { kind, table: table.id, id
|
|
894
|
-
const
|
|
895
|
-
|
|
675
|
+
this.moving = { kind, table: table.id, id, gap: null };
|
|
676
|
+
const widths = this.#widthsOf(table);
|
|
677
|
+
const cells = (kind === 'row' ? grid.rows[index].cells : grid.rows.map((r) => r.cells[index])).flatMap((cell) => (cell && this.edytor.idToBlock.get(cell)?.node) || []);
|
|
678
|
+
if (nativeSetDragImage && cells.length) {
|
|
679
|
+
const preview = dragPreview(root, cells, pointer, kind === 'row' ? widths : [widths[index]]);
|
|
896
680
|
setCustomNativeDragPreview({
|
|
897
681
|
nativeSetDragImage,
|
|
898
682
|
getOffset: preview.offset,
|
|
899
683
|
render: ({ container }) => container.append(preview.element)
|
|
900
684
|
});
|
|
685
|
+
}
|
|
901
686
|
const ours = (data) => data[MOVE] === this;
|
|
902
687
|
// The page is the target: the line follows the pointer from the grips, outside the grid.
|
|
903
688
|
this.#releases.push(dropTargetForElements({
|
|
904
689
|
element: node.ownerDocument.body,
|
|
905
690
|
canDrop: ({ source }) => ours(source.data),
|
|
906
|
-
onDragEnter: ({ location }) => this
|
|
907
|
-
onDrag: ({ location }) => this
|
|
908
|
-
onDragLeave: () => this
|
|
909
|
-
onDrop: ({ location }) => this
|
|
691
|
+
onDragEnter: ({ location }) => this.#aim(location.current.input),
|
|
692
|
+
onDrag: ({ location }) => this.#aim(location.current.input),
|
|
693
|
+
onDragLeave: () => this.#aim(null),
|
|
694
|
+
onDrop: ({ location }) => this.#drop(location.current.input)
|
|
910
695
|
}));
|
|
911
696
|
const scroller = table.node?.querySelector('[data-edytor-table-scroll]');
|
|
912
697
|
if (scroller)
|
|
913
698
|
this.#releases.push(autoScrollFor(scroller, ours));
|
|
914
699
|
this.edytor.overlay.invalidate();
|
|
915
700
|
}
|
|
916
|
-
/** The ghost: the row's cells side by side, or the column's cells one under the other. */
|
|
917
|
-
preview(kind, { table, index }, pointer) {
|
|
918
|
-
const grid = gridOf(table);
|
|
919
|
-
const gridNode = table.node?.querySelector('[data-edytor-table-grid]');
|
|
920
|
-
if (!grid || !gridNode)
|
|
921
|
-
return null;
|
|
922
|
-
const document = gridNode.ownerDocument;
|
|
923
|
-
const nodeOf = (id) => (id ? this.edytor.idToBlock.get(id)?.node : null) ?? null;
|
|
924
|
-
const widths = this.widthsOf(table);
|
|
925
|
-
const heights = grid.rows.map((r) => nodeOf(r.id)?.getBoundingClientRect().height ?? 0);
|
|
926
|
-
const box = gridNode.getBoundingClientRect();
|
|
927
|
-
if (kind === 'row') {
|
|
928
|
-
const row = nodeOf(grid.rows[index]?.id)?.getBoundingClientRect() ?? box;
|
|
929
|
-
const cells = grid.rows[index]?.cells.map(nodeOf) ?? [];
|
|
930
|
-
return tablePreview(document, [cells], widths, [heights[index] ?? 0], row, pointer);
|
|
931
|
-
}
|
|
932
|
-
const left = box.left + widths.slice(0, index).reduce((sum, w) => sum + w, 0);
|
|
933
|
-
const width = widths[index] ?? this.columnWidth;
|
|
934
|
-
const column = new DOMRect(left, box.top, width, box.height);
|
|
935
|
-
const cells = grid.rows.map((r) => [nodeOf(r.cells[index])]);
|
|
936
|
-
return tablePreview(document, cells, [width], heights, column, pointer);
|
|
937
|
-
}
|
|
938
701
|
/**
|
|
939
702
|
* Where the moving row or column would land at `input` (`table.drag`):
|
|
940
703
|
* its gap, by the rows' (columns') middles, and its position once moved;
|
|
941
704
|
* `null` outside the table (past its box and the gutter) and at its own
|
|
942
705
|
* place (the gap before or after it).
|
|
943
706
|
*/
|
|
944
|
-
landing(input) {
|
|
707
|
+
#landing(input) {
|
|
945
708
|
const move = this.moving;
|
|
946
709
|
const table = this.block(move?.table);
|
|
947
710
|
const grid = gridOf(table);
|
|
948
|
-
const
|
|
949
|
-
|
|
711
|
+
const node = gridNode(table);
|
|
712
|
+
const box = table?.node?.getBoundingClientRect();
|
|
713
|
+
if (!move || !input || !box || !grid || !node)
|
|
950
714
|
return null;
|
|
951
|
-
const box = table.node.getBoundingClientRect();
|
|
952
715
|
const { clientX: x, clientY: y } = input;
|
|
953
716
|
if (x < box.left - GUTTER ||
|
|
954
717
|
x > box.right + GUTTER ||
|
|
955
718
|
y < box.top - GUTTER ||
|
|
956
719
|
y > box.bottom + GUTTER)
|
|
957
720
|
return null;
|
|
958
|
-
|
|
721
|
+
// The gap: the rows' (columns', from the grid's left border) middles before the pointer.
|
|
959
722
|
let gap = 0;
|
|
723
|
+
let from;
|
|
960
724
|
if (move.kind === 'row') {
|
|
961
725
|
from = grid.rows.findIndex((r) => r.id === move.id);
|
|
962
726
|
for (const row of grid.rows) {
|
|
@@ -967,25 +731,20 @@ export class TableChrome {
|
|
|
967
731
|
}
|
|
968
732
|
else {
|
|
969
733
|
from = grid.columns.indexOf(move.id);
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
if (x > left + width / 2)
|
|
734
|
+
let left = node.getBoundingClientRect().left + px(styleOf(node)?.borderLeftWidth);
|
|
735
|
+
for (const width of trackWidths(node))
|
|
736
|
+
if (x > (left += width) - width / 2)
|
|
974
737
|
gap++;
|
|
975
|
-
left += width;
|
|
976
|
-
}
|
|
977
738
|
}
|
|
978
739
|
if (from < 0 || gap === from || gap === from + 1)
|
|
979
740
|
return null;
|
|
980
741
|
return { gap, to: gap > from ? gap - 1 : gap };
|
|
981
742
|
}
|
|
982
743
|
/** The pointer moved during the drag: the drop line follows it. */
|
|
983
|
-
aim(input) {
|
|
744
|
+
#aim(input) {
|
|
984
745
|
const move = this.moving;
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
const gap = this.landing(input)?.gap ?? null;
|
|
988
|
-
if (gap === move.gap)
|
|
746
|
+
const gap = this.#landing(input)?.gap ?? null;
|
|
747
|
+
if (!move || gap === move.gap)
|
|
989
748
|
return;
|
|
990
749
|
move.gap = gap;
|
|
991
750
|
this.edytor.overlay.invalidate();
|
|
@@ -995,9 +754,9 @@ export class TableChrome {
|
|
|
995
754
|
* `moveColumn`: one command, one undo step), the keys go to the editor;
|
|
996
755
|
* nothing where no line shows.
|
|
997
756
|
*/
|
|
998
|
-
drop(input) {
|
|
757
|
+
#drop(input) {
|
|
999
758
|
const move = this.moving;
|
|
1000
|
-
const landing = this
|
|
759
|
+
const landing = this.#landing(input);
|
|
1001
760
|
const table = this.block(move?.table);
|
|
1002
761
|
if (!move)
|
|
1003
762
|
return;
|
|
@@ -1013,12 +772,4 @@ export class TableChrome {
|
|
|
1013
772
|
moveColumn(table, move.id, landing.to);
|
|
1014
773
|
takeKeys(this.edytor);
|
|
1015
774
|
}
|
|
1016
|
-
/** The drag ended, dropped or cancelled: no line, no target; the chrome follows the pointer again. */
|
|
1017
|
-
finish() {
|
|
1018
|
-
for (const release of this.#releases.splice(0))
|
|
1019
|
-
release();
|
|
1020
|
-
this.moving = null;
|
|
1021
|
-
this.edytor.overlay.invalidate();
|
|
1022
|
-
}
|
|
1023
775
|
}
|
|
1024
|
-
const sameLayout = (a, b) => a === b || (a !== null && b !== null && JSON.stringify(a) === JSON.stringify(b));
|