diff --git a/examples/react/src/examples/Figma/index.tsx b/examples/react/src/examples/Figma/index.tsx index 6780b6cb..f6daab75 100644 --- a/examples/react/src/examples/Figma/index.tsx +++ b/examples/react/src/examples/Figma/index.tsx @@ -34,6 +34,7 @@ const BasicFlow = () => { selectionMode={SelectionMode.Partial} panOnDrag={panOnDrag} panOnScroll + paneClickDistance={2} zoomActivationKeyCode="Meta" multiSelectionKeyCode={MULTI_SELECT_KEY} onPaneContextMenu={onPaneContextMenu} diff --git a/packages/react/src/components/StoreUpdater/index.tsx b/packages/react/src/components/StoreUpdater/index.tsx index 73b6000a..2eb926d8 100644 --- a/packages/react/src/components/StoreUpdater/index.tsx +++ b/packages/react/src/components/StoreUpdater/index.tsx @@ -69,7 +69,6 @@ const reactFlowFieldsToTrack = [ 'onBeforeDelete', 'debug', 'autoPanSpeed', - 'paneClickDistance', 'ariaLabelConfig', ] as const; @@ -93,7 +92,6 @@ const selector = (s: ReactFlowState) => ({ setNodeExtent: s.setNodeExtent, reset: s.reset, setDefaultNodesAndEdges: s.setDefaultNodesAndEdges, - setPaneClickDistance: s.setPaneClickDistance, }); const initPrevValues = { @@ -124,7 +122,6 @@ export function StoreUpdater(); @@ -155,7 +152,6 @@ export function StoreUpdater({ onViewportChange={onViewportChange} isControlledViewport={isControlledViewport} paneClickDistance={paneClickDistance} + selectionOnDrag={_selectionOnDrag} > ({ isSelecting={!!isSelecting} selectionMode={selectionMode} selectionKeyPressed={selectionKeyPressed} + paneClickDistance={paneClickDistance} selectionOnDrag={_selectionOnDrag} > {children} diff --git a/packages/react/src/container/Pane/index.tsx b/packages/react/src/container/Pane/index.tsx index ef86be3f..aadac2e0 100644 --- a/packages/react/src/container/Pane/index.tsx +++ b/packages/react/src/container/Pane/index.tsx @@ -39,6 +39,7 @@ type PaneProps = { | 'onPaneMouseMove' | 'onPaneMouseLeave' | 'selectionOnDrag' + | 'paneClickDistance' > >; diff --git a/packages/react/src/container/ReactFlow/index.tsx b/packages/react/src/container/ReactFlow/index.tsx index 33b5ee54..bd20242f 100644 --- a/packages/react/src/container/ReactFlow/index.tsx +++ b/packages/react/src/container/ReactFlow/index.tsx @@ -309,7 +309,6 @@ function ReactFlow( nodeDragThreshold={nodeDragThreshold} connectionDragThreshold={connectionDragThreshold} onBeforeDelete={onBeforeDelete} - paneClickDistance={paneClickDistance} debug={debug} ariaLabelConfig={ariaLabelConfig} /> diff --git a/packages/react/src/container/ZoomPane/index.tsx b/packages/react/src/container/ZoomPane/index.tsx index bce2b2b7..67babfa2 100644 --- a/packages/react/src/container/ZoomPane/index.tsx +++ b/packages/react/src/container/ZoomPane/index.tsx @@ -12,12 +12,7 @@ import type { ReactFlowState } from '../../types'; type ZoomPaneProps = Omit< FlowRendererProps, - | 'deleteKeyCode' - | 'selectionKeyCode' - | 'multiSelectionKeyCode' - | 'noDragClassName' - | 'disableKeyboardA11y' - | 'selectionOnDrag' + 'deleteKeyCode' | 'selectionKeyCode' | 'multiSelectionKeyCode' | 'noDragClassName' | 'disableKeyboardA11y' > & { isControlledViewport: boolean; }; @@ -49,6 +44,7 @@ export function ZoomPane({ onViewportChange, isControlledViewport, paneClickDistance, + selectionOnDrag, }: ZoomPaneProps) { const store = useStoreApi(); const zoomPane = useRef(null); @@ -77,7 +73,6 @@ export function ZoomPane({ maxZoom, translateExtent, viewport: defaultViewport, - paneClickDistance, onDraggingChange: (paneDragging: boolean) => store.setState({ paneDragging }), onPanZoomStart: (event, vp) => { const { onViewportChangeStart, onMoveStart } = store.getState(); @@ -128,6 +123,8 @@ export function ZoomPane({ lib, onTransformChange, connectionInProgress, + selectionOnDrag, + paneClickDistance, }); }, [ onPaneContextMenu, @@ -146,6 +143,8 @@ export function ZoomPane({ lib, onTransformChange, connectionInProgress, + selectionOnDrag, + paneClickDistance, ]); return ( diff --git a/packages/react/src/store/index.ts b/packages/react/src/store/index.ts index 085f8b1e..3254bdfa 100644 --- a/packages/react/src/store/index.ts +++ b/packages/react/src/store/index.ts @@ -312,9 +312,6 @@ const createStore = ({ set({ translateExtent }); }, - setPaneClickDistance: (clickDistance) => { - get().panZoom?.setClickDistance(clickDistance); - }, resetSelectedElements: () => { const { edges, nodes, triggerNodeChanges, triggerEdgeChanges, elementsSelectable } = get(); diff --git a/packages/react/src/types/store.ts b/packages/react/src/types/store.ts index 1fe0d308..59a05127 100644 --- a/packages/react/src/types/store.ts +++ b/packages/react/src/types/store.ts @@ -175,7 +175,6 @@ export type ReactFlowActions = { triggerEdgeChanges: (changes: EdgeChange[]) => void; panBy: PanBy; setCenter: SetCenter; - setPaneClickDistance: (distance: number) => void; }; export type ReactFlowState = ReactFlowStore< diff --git a/packages/svelte/src/lib/actions/zoom/index.ts b/packages/svelte/src/lib/actions/zoom/index.ts index 27d7328f..0fd7d72d 100644 --- a/packages/svelte/src/lib/actions/zoom/index.ts +++ b/packages/svelte/src/lib/actions/zoom/index.ts @@ -35,6 +35,7 @@ type ZoomParams = { userSelectionActive: boolean; lib: string; paneClickDistance: number; + selectionOnDrag?: boolean; onTransformChange: (transform: Transform) => void; onDraggingChange: (dragging: boolean) => void; connectionInProgress: boolean; @@ -49,7 +50,6 @@ export default function zoom(domNode: Element, params: ZoomParams) { onPanZoom, onPanZoomEnd, translateExtent, - paneClickDistance, setPanZoomInstance, onDraggingChange, onTransformChange @@ -61,7 +61,6 @@ export default function zoom(domNode: Element, params: ZoomParams) { maxZoom, translateExtent, viewport: initialViewport, - paneClickDistance, onPanZoom, onPanZoomStart, onPanZoomEnd, diff --git a/packages/svelte/src/lib/container/Pane/types.ts b/packages/svelte/src/lib/container/Pane/types.ts index 8442834e..f0cef4df 100644 --- a/packages/svelte/src/lib/container/Pane/types.ts +++ b/packages/svelte/src/lib/container/Pane/types.ts @@ -5,6 +5,7 @@ import type { SvelteFlowStore } from '$lib/store/types'; export type PaneProps = { store: SvelteFlowStore; panOnDrag?: boolean | number[]; + paneClickDistance: number; selectionOnDrag?: boolean; onselectionstart?: (event: PointerEvent) => void; onselectionend?: (event: PointerEvent) => void; diff --git a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte index d16a3890..d92ff2d6 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte +++ b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte @@ -156,6 +156,7 @@ {panOnScrollSpeed} {panOnDrag} {paneClickDistance} + {selectionOnDrag} {onmovestart} {onmove} {onmoveend} @@ -168,6 +169,7 @@ {onselectionstart} {onselectionend} {panOnDrag} + {paneClickDistance} {selectionOnDrag} > diff --git a/packages/svelte/src/lib/container/Zoom/Zoom.svelte b/packages/svelte/src/lib/container/Zoom/Zoom.svelte index 70971e46..761cffef 100644 --- a/packages/svelte/src/lib/container/Zoom/Zoom.svelte +++ b/packages/svelte/src/lib/container/Zoom/Zoom.svelte @@ -16,6 +16,7 @@ panOnScroll, panOnScrollSpeed, paneClickDistance, + selectionOnDrag, onmovestart, onmove, onmoveend, @@ -69,6 +70,7 @@ translateExtent: store.translateExtent, lib: 'svelte', paneClickDistance, + selectionOnDrag, onTransformChange: (transform: Transform) => { store.viewport = { x: transform[0], y: transform[1], zoom: transform[2] }; }, diff --git a/packages/svelte/src/lib/container/Zoom/types.ts b/packages/svelte/src/lib/container/Zoom/types.ts index 8573fbcb..b9e5bf93 100644 --- a/packages/svelte/src/lib/container/Zoom/types.ts +++ b/packages/svelte/src/lib/container/Zoom/types.ts @@ -14,6 +14,7 @@ export type ZoomProps( elements: T[], elementsToDeselect: Set | null = null @@ -393,7 +389,6 @@ export function createStore void; setMaxZoom: (maxZoom: number) => void; setTranslateExtent: (extent: CoordinateExtent) => void; - setPaneClickDistance: (distance: number) => void; fitView: (options?: FitViewOptions) => Promise; setCenter: SetCenter; updateNodePositions: UpdateNodePositions; diff --git a/packages/system/src/types/panzoom.ts b/packages/system/src/types/panzoom.ts index 7fa54e97..11291868 100644 --- a/packages/system/src/types/panzoom.ts +++ b/packages/system/src/types/panzoom.ts @@ -9,7 +9,6 @@ export type PanZoomParams = { domNode: Element; minZoom: number; maxZoom: number; - paneClickDistance: number; viewport: Viewport; translateExtent: CoordinateExtent; onDraggingChange: OnDraggingChange; @@ -43,6 +42,8 @@ export type PanZoomUpdateOptions = { lib: string; onTransformChange: OnTransformChange; connectionInProgress: boolean; + paneClickDistance: number; + selectionOnDrag?: boolean; }; export type PanZoomInstance = { diff --git a/packages/system/src/xypanzoom/XYPanZoom.ts b/packages/system/src/xypanzoom/XYPanZoom.ts index 85b8ba1c..ee1a763e 100644 --- a/packages/system/src/xypanzoom/XYPanZoom.ts +++ b/packages/system/src/xypanzoom/XYPanZoom.ts @@ -37,7 +37,6 @@ export function XYPanZoom({ domNode, minZoom, maxZoom, - paneClickDistance, translateExtent, viewport, onPanZoom, @@ -55,10 +54,7 @@ export function XYPanZoom({ isPanScrolling: false, }; const bbox = domNode.getBoundingClientRect(); - const d3ZoomInstance = zoom() - .clickDistance(!isNumeric(paneClickDistance) || paneClickDistance < 0 ? 0 : paneClickDistance) - .scaleExtent([minZoom, maxZoom]) - .translateExtent(translateExtent); + const d3ZoomInstance = zoom().scaleExtent([minZoom, maxZoom]).translateExtent(translateExtent); const d3Selection = select(domNode).call(d3ZoomInstance); setViewportConstrained( @@ -109,6 +105,8 @@ export function XYPanZoom({ lib, onTransformChange, connectionInProgress, + paneClickDistance, + selectionOnDrag, }: PanZoomUpdateOptions) { if (userSelectionActive && !zoomPanValues.isZoomingOrPanning) { destroy(); @@ -116,6 +114,10 @@ export function XYPanZoom({ const isPanOnScroll = panOnScroll && !zoomActivationKeyPressed && !userSelectionActive; + d3ZoomInstance.clickDistance( + selectionOnDrag ? Infinity : !isNumeric(paneClickDistance) || paneClickDistance < 0 ? 0 : paneClickDistance + ); + const wheelHandler = isPanOnScroll ? createPanOnScrollHandler({ zoomPanValues,