Merge pull request #5528 from xyflow/resizer-update-keep-aspect

NodeResizer: Make parameters dynamic
This commit is contained in:
Moritz Klack
2025-10-01 11:22:35 +02:00
committed by GitHub
9 changed files with 74 additions and 14 deletions

View File

@@ -1,7 +1,9 @@
import { memo, FC } from 'react';
import { Handle, Position, NodeProps, NodeResizer } from '@xyflow/react';
import { Handle, Position, NodeProps, NodeResizer, useKeyPress } from '@xyflow/react';
const DefaultResizerNode: FC<NodeProps> = ({ data, selected }) => {
const keepAspectRatio = useKeyPress('k');
return (
<>
<NodeResizer
@@ -14,7 +16,7 @@ const DefaultResizerNode: FC<NodeProps> = ({ data, selected }) => {
onResizeStart={data.onResizeStart ?? undefined}
onResize={data.onResize ?? undefined}
onResizeEnd={data.onResizeEnd ?? undefined}
keepAspectRatio={data.keepAspectRatio ?? undefined}
keepAspectRatio={keepAspectRatio || (data.keepAspectRatio ?? undefined)}
/>
<Handle type="target" position={Position.Left} />
<div>{data.label}</div>

View File

@@ -9,6 +9,7 @@
import '@xyflow/svelte/dist/style.css';
import type { ResizeNode } from './types';
import { store } from './store.svelte';
const nodeTypes = {
defaultResizer: DefaultResizer,
@@ -139,6 +140,15 @@
let snapToGrid = $state(false);
</script>
<svelte:window
on:keydown={(e) => {
if (e.key === 'k') store.keepAspectRatio = true;
}}
on:keyup={(e) => {
if (e.key === 'k') store.keepAspectRatio = false;
}}
/>
<SvelteFlow
bind:nodes
bind:edges

View File

@@ -1,6 +1,7 @@
<script lang="ts">
import { Handle, Position, type NodeProps, NodeResizeControl, type Node } from '@xyflow/svelte';
import type { ResizeNode } from './types';
import { store } from './store.svelte';
let { data }: NodeProps<ResizeNode> = $props();
</script>
@@ -14,7 +15,7 @@
onResizeStart={data.onResizeStart ?? undefined}
onResize={data.onResize ?? undefined}
onResizeEnd={data.onResizeEnd ?? undefined}
keepAspectRatio={data.keepAspectRatio ?? undefined}
keepAspectRatio={store.keepAspectRatio || (data.keepAspectRatio ?? undefined)}
style="background: transparent; border: none;"
>
<svg

View File

@@ -2,6 +2,8 @@
import { Handle, NodeResizer, Position, type NodeProps } from '@xyflow/svelte';
import type { ResizeNode } from './types';
import { store } from './store.svelte';
let { data, selected }: NodeProps<ResizeNode> = $props();
</script>
@@ -15,7 +17,7 @@
onResizeStart={data.onResizeStart ?? undefined}
onResize={data.onResize ?? undefined}
onResizeEnd={data.onResizeEnd ?? undefined}
keepAspectRatio={data.keepAspectRatio ?? undefined}
keepAspectRatio={store.keepAspectRatio || (data.keepAspectRatio ?? undefined)}
/>
<Handle type="target" position={Position.Left} />
<div>{data.label}</div>

View File

@@ -1,6 +1,7 @@
<script lang="ts">
import { Handle, NodeResizeControl, Position, type NodeProps } from '@xyflow/svelte';
import type { ResizeNode } from './types';
import { store } from './store.svelte';
let { data }: NodeProps<ResizeNode> = $props();
</script>
@@ -14,7 +15,7 @@
onResizeStart={data.onResizeStart ?? undefined}
onResize={data.onResize ?? undefined}
onResizeEnd={data.onResizeEnd ?? undefined}
keepAspectRatio={data.keepAspectRatio ?? undefined}
keepAspectRatio={store.keepAspectRatio || (data.keepAspectRatio ?? undefined)}
color="red"
position={Position.Left}
/>

View File

@@ -1,6 +1,7 @@
<script lang="ts">
import { Handle, NodeResizeControl, Position, type NodeProps } from '@xyflow/svelte';
import type { ResizeNode } from './types';
import { store } from './store.svelte';
let { data }: NodeProps<ResizeNode> = $props();
</script>
@@ -14,7 +15,7 @@
onResizeStart={data.onResizeStart ?? undefined}
onResize={data.onResize ?? undefined}
onResizeEnd={data.onResizeEnd ?? undefined}
keepAspectRatio={data.keepAspectRatio ?? undefined}
keepAspectRatio={store.keepAspectRatio || (data.keepAspectRatio ?? undefined)}
color="red"
position={Position.Top}
/>

View File

@@ -0,0 +1,14 @@
function createStore() {
let keepAspectRatio = $state(false);
return {
get keepAspectRatio() {
return keepAspectRatio;
},
set keepAspectRatio(value: boolean) {
keepAspectRatio = value;
}
};
}
export const store = createStore();