Merge pull request #5344 from xyflow/feat/connection-drag-threshold

Add connectionDragThreshold
This commit is contained in:
Moritz Klack
2025-06-25 16:40:49 +02:00
committed by GitHub
18 changed files with 90 additions and 17 deletions
@@ -1,7 +1,7 @@
<script lang="ts">
import { useStore } from '$lib/store';
import type { Edge } from '$lib/types';
import { XYHandle, type HandleType } from '@xyflow/system';
import { XYHandle, type HandleType, type OnConnectStart } from '@xyflow/system';
import { getContext } from 'svelte';
import { EdgeLabel } from '../EdgeLabel';
import type { EdgeReconnectAnchorProps } from './types';
@@ -12,6 +12,7 @@
position,
class: className,
size = 25,
dragThreshold = 1,
children,
...rest
}: EdgeReconnectAnchorProps = $props();
@@ -52,8 +53,11 @@
let newEdge: Edge | undefined;
let edge = edgeLookup.get(edgeId)!;
reconnecting = true;
onreconnectstart?.(event, edge, type);
const _onConnectStart: OnConnectStart = (evt, params) => {
reconnecting = true;
onreconnectstart?.(event, edge, type);
onconnectstart?.(evt, params);
};
const opposite =
type === 'target'
@@ -79,7 +83,7 @@
cancelConnection,
panBy,
isValidConnection,
onConnectStart: onconnectstart,
onConnectStart: _onConnectStart,
onConnectEnd: onconnectend,
onConnect: (connection) => {
newEdge = { ...edge, ...connection };
@@ -97,7 +101,8 @@
},
updateConnection,
getTransform: () => [store.viewport.x, store.viewport.y, store.viewport.zoom],
getFromHandle: () => store.connection.fromHandle
getFromHandle: () => store.connection.fromHandle,
dragThreshold: dragThreshold ?? store.connectionDragThreshold
});
};
</script>
@@ -10,4 +10,5 @@ export type EdgeReconnectAnchorProps = {
position?: XYPosition;
size?: number;
children?: Snippet;
dragThreshold?: number;
} & HTMLAttributes<HTMLDivElement>;
@@ -139,7 +139,8 @@
store.onconnectend?.(event, connectionState);
},
getTransform: () => [store.viewport.x, store.viewport.y, store.viewport.zoom],
getFromHandle: () => store.connection.fromHandle
getFromHandle: () => store.connection.fromHandle,
dragThreshold: store.connectionDragThreshold
});
}
}
@@ -64,6 +64,7 @@
fitViewOptions,
nodeOrigin,
nodeDragThreshold,
connectionDragThreshold,
minZoom,
maxZoom,
initialViewport,
@@ -170,6 +170,12 @@ export type SvelteFlowProps<
* @default 0
*/
nodeClickDistance?: number;
/**
* The threshold in pixels that the mouse must move before a connection line starts to drag.
* This is useful to prevent accidental connections when clicking on a handle.
* @default 1
*/
connectionDragThreshold?: number;
/** Minimum zoom level
* @default 0.5
*/
@@ -286,6 +286,7 @@ export function getInitialStore<NodeType extends Node = Node, EdgeType extends E
autoPanOnNodeDrag: boolean = $derived(signals.props.autoPanOnNodeDrag ?? true);
autoPanOnConnect: boolean = $derived(signals.props.autoPanOnConnect ?? true);
autoPanOnNodeFocus: boolean = $derived(signals.props.autoPanOnNodeFocus ?? true);
connectionDragThreshold: number = $derived(signals.props.connectionDragThreshold ?? 1);
fitViewQueued: boolean = signals.props.fitView ?? false;
fitViewOptions: FitViewOptions | undefined = signals.props.fitViewOptions;