diff --git a/package.json b/package.json index 274670c2..d87e4403 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "scripts": { "preinstall": "npx only-allow pnpm", "dev": "turbo run dev --parallel --concurrency 12", - "dev:svelte": "turbo run dev --filter=svelte --filter=system", - "dev:react": "turbo run dev --filter=react-examples ", + "dev:svelte": "turbo run dev --filter=svelte-examples...", + "dev:react": "turbo run dev --filter=react-examples...", "test:svelte": "pnpm --filter=playwright run test:svelte", "test:svelte:ui": "pnpm --filter=playwright run test:svelte:ui", "test:react": "pnpm --filter=playwright run test:react", diff --git a/packages/svelte/src/lib/components/KeyHandler/KeyHandler.svelte b/packages/svelte/src/lib/components/KeyHandler/KeyHandler.svelte index 77195ea2..f059ff8e 100644 --- a/packages/svelte/src/lib/components/KeyHandler/KeyHandler.svelte +++ b/packages/svelte/src/lib/components/KeyHandler/KeyHandler.svelte @@ -1,5 +1,5 @@ selectionKeyPressed.set(true) + ...selectionKeyDefinition, + callback: () => selectionKeyDefinition.key && selectionKeyPressed.set(true) } ], type: 'keydown' @@ -53,9 +79,8 @@ use:shortcut={{ trigger: [ { - key: selectionKeyString, - modifier: selectionKeyModifier, - callback: () => selectionKeyPressed.set(false) + ...selectionKeyDefinition, + callback: () => selectionKeyDefinition.key && selectionKeyPressed.set(false) } ], type: 'keyup' @@ -63,9 +88,8 @@ use:shortcut={{ trigger: [ { - key: multiSelectionKeyString, - modifier: multiSelectionKeyModifier, - callback: () => multiselectionKeyPressed.set(true) + ...multiSelectionKeyDefinition, + callback: () => multiSelectionKeyDefinition.key && multiselectionKeyPressed.set(true) } ], type: 'keydown' @@ -73,9 +97,8 @@ use:shortcut={{ trigger: [ { - key: multiSelectionKeyString, - modifier: multiSelectionKeyModifier, - callback: () => multiselectionKeyPressed.set(false) + ...multiSelectionKeyDefinition, + callback: () => multiSelectionKeyDefinition.key && multiselectionKeyPressed.set(false) } ], type: 'keyup' @@ -83,11 +106,8 @@ use:shortcut={{ trigger: [ { - key: deleteKeyString, - modifier: deleteKeyModifier, - callback: () => { - deleteKeyPressed.set(true); - } + ...deleteKeyDefinition, + callback: () => deleteKeyDefinition.key && deleteKeyPressed.set(true) } ], type: 'keydown' @@ -95,9 +115,8 @@ use:shortcut={{ trigger: [ { - key: deleteKeyString, - modifier: deleteKeyModifier, - callback: () => deleteKeyPressed.set(false) + ...deleteKeyDefinition, + callback: () => deleteKeyDefinition.key && deleteKeyPressed.set(false) } ], type: 'keyup' @@ -105,9 +124,8 @@ use:shortcut={{ trigger: [ { - key: panActivationKeyString, - modifier: panActivationKeyModifier, - callback: () => panActivationKeyPressed.set(true) + ...panActivationKeyDefinition, + callback: () => panActivationKeyDefinition.key && panActivationKeyPressed.set(true) } ], type: 'keydown' @@ -115,9 +133,26 @@ use:shortcut={{ trigger: [ { - key: panActivationKeyString, - modifier: panActivationKeyModifier, - callback: () => panActivationKeyPressed.set(false) + ...panActivationKeyDefinition, + callback: () => panActivationKeyDefinition.key && panActivationKeyPressed.set(false) + } + ], + type: 'keyup' + }} + use:shortcut={{ + trigger: [ + { + ...zoomActivationKeyDefinition, + callback: () => zoomActivationKeyDefinition.key && zoomActivationKeyPressed.set(true) + } + ], + type: 'keydown' + }} + use:shortcut={{ + trigger: [ + { + ...zoomActivationKeyDefinition, + callback: () => zoomActivationKeyDefinition.key && zoomActivationKeyPressed.set(false) } ], type: 'keyup' diff --git a/packages/svelte/src/lib/components/KeyHandler/types.ts b/packages/svelte/src/lib/components/KeyHandler/types.ts index de81d1c3..9a6ebe86 100644 --- a/packages/svelte/src/lib/components/KeyHandler/types.ts +++ b/packages/svelte/src/lib/components/KeyHandler/types.ts @@ -1,8 +1,9 @@ import type { KeyDefinition } from '$lib/types'; export type KeyHandlerProps = { - selectionKey?: KeyDefinition; - multiSelectionKey?: KeyDefinition; - deleteKey?: KeyDefinition; - panActivationKey?: KeyDefinition; + selectionKey?: KeyDefinition | null; + multiSelectionKey?: KeyDefinition | null; + deleteKey?: KeyDefinition | null; + panActivationKey?: KeyDefinition | null; + zoomActivationKey?: KeyDefinition | null; }; diff --git a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte index 0c74b4e0..c648d07b 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte +++ b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte @@ -34,6 +34,8 @@ export let selectionKey: $$Props['selectionKey'] = undefined; export let selectionMode: $$Props['selectionMode'] = undefined; export let panActivationKey: $$Props['panActivationKey'] = undefined; + export let multiSelectionKey: $$Props['multiSelectionKey'] = undefined; + export let zoomActivationKey: $$Props['zoomActivationKey'] = undefined; export let nodesDraggable: $$Props['nodesDraggable'] = undefined; export let nodesConnectable: $$Props['nodesConnectable'] = undefined; export let nodeDragThreshold: $$Props['nodeDragThreshold'] = undefined; @@ -166,7 +168,13 @@ {...$$restProps} role="application" > - + & { edges: Writable; nodeTypes?: NodeTypes; edgeTypes?: EdgeTypes; - selectionKey?: KeyDefinition; - panActivationKey?: KeyDefinition; - deleteKey?: KeyDefinition; + selectionKey?: KeyDefinition | null; + panActivationKey?: KeyDefinition | null; + deleteKey?: KeyDefinition | null; + multiSelectionKey?: KeyDefinition | null; + zoomActivationKey?: KeyDefinition | null; fitView?: boolean; fitViewOptions?: FitViewOptions; nodeOrigin?: NodeOrigin; diff --git a/packages/svelte/src/lib/container/Zoom/Zoom.svelte b/packages/svelte/src/lib/container/Zoom/Zoom.svelte index 116586ad..a00199a1 100644 --- a/packages/svelte/src/lib/container/Zoom/Zoom.svelte +++ b/packages/svelte/src/lib/container/Zoom/Zoom.svelte @@ -28,7 +28,8 @@ dragging, translateExtent, lib, - panActivationKeyPressed + panActivationKeyPressed, + zoomActivationKeyPressed } = useStore(); $: viewPort = initialViewport || { x: 0, y: 0, zoom: 1 }; @@ -55,7 +56,7 @@ panOnDrag: _panOnDrag, panOnScrollSpeed: 0.5, panOnScrollMode: panOnScrollMode || PanOnScrollMode.Free, - zoomActivationKeyPressed: false, + zoomActivationKeyPressed: $zoomActivationKeyPressed, preventScrolling: typeof preventScrolling === 'boolean' ? preventScrolling : true, noPanClassName: 'nopan', noWheelClassName: 'nowheel', diff --git a/packages/svelte/src/lib/store/initial-store.ts b/packages/svelte/src/lib/store/initial-store.ts index 4bb3d7af..2e40a719 100644 --- a/packages/svelte/src/lib/store/initial-store.ts +++ b/packages/svelte/src/lib/store/initial-store.ts @@ -105,6 +105,7 @@ export const getInitialStore = ({ multiselectionKeyPressed: writable(false), deleteKeyPressed: writable(false), panActivationKeyPressed: writable(false), + zoomActivationKeyPressed: writable(false), selectionRectMode: writable(null), selectionMode: writable(SelectionMode.Partial), nodeTypes: writable(initialNodeTypes), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b646fa44..05a5637d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3523,7 +3523,6 @@ packages: version: 8.11.2 engines: {node: '>=0.4.0'} hasBin: true - dev: true registry.npmjs.org/aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz} @@ -4395,7 +4394,7 @@ packages: dependencies: '@jridgewell/sourcemap-codec': registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.15 '@types/estree': registry.npmjs.org/@types/estree@1.0.3 - acorn: registry.npmjs.org/acorn@8.10.0 + acorn: registry.npmjs.org/acorn@8.11.2 estree-walker: registry.npmjs.org/estree-walker@3.0.3 periscopic: registry.npmjs.org/periscopic@3.1.0 @@ -6029,6 +6028,7 @@ packages: glob-parent: registry.npmjs.org/glob-parent@5.1.2 merge2: registry.npmjs.org/merge2@1.4.1 micromatch: registry.npmjs.org/micromatch@4.0.5 + dev: false registry.npmjs.org/fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz} @@ -10957,7 +10957,7 @@ packages: dependencies: '@jridgewell/trace-mapping': registry.npmjs.org/@jridgewell/trace-mapping@0.3.20 chokidar: registry.npmjs.org/chokidar@3.5.3 - fast-glob: registry.npmjs.org/fast-glob@3.3.1 + fast-glob: registry.npmjs.org/fast-glob@3.3.2 import-fresh: registry.npmjs.org/import-fresh@3.3.0 picocolors: registry.npmjs.org/picocolors@1.0.0 sade: registry.npmjs.org/sade@1.8.1 @@ -11230,7 +11230,7 @@ packages: '@ampproject/remapping': registry.npmjs.org/@ampproject/remapping@2.2.1 '@jridgewell/sourcemap-codec': registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.15 '@jridgewell/trace-mapping': registry.npmjs.org/@jridgewell/trace-mapping@0.3.20 - acorn: registry.npmjs.org/acorn@8.10.0 + acorn: registry.npmjs.org/acorn@8.11.2 aria-query: registry.npmjs.org/aria-query@5.3.0 axobject-query: registry.npmjs.org/axobject-query@3.2.1 code-red: registry.npmjs.org/code-red@1.0.4