diff --git a/examples/vite-app/src/examples/Figma/index.tsx b/examples/vite-app/src/examples/Figma/index.tsx index d6063dde..3ea30022 100644 --- a/examples/vite-app/src/examples/Figma/index.tsx +++ b/examples/vite-app/src/examples/Figma/index.tsx @@ -4,7 +4,6 @@ import ReactFlow, { BackgroundVariant, Node, Edge, - useReactFlow, useKeyPress, SelectionMode, } from 'reactflow'; @@ -23,42 +22,9 @@ const initialEdges: Edge[] = [ { id: 'e1-3', source: '1', target: '3' }, ]; -const defaultEdgeOptions = { zIndex: 0 }; - -const logEvent = (e: any) => console.log(e); - -const onPaneClick = (e: any) => console.log('click pane', e); - const BasicFlow = () => { - const instance = useReactFlow(); const spaceBarPressed = useKeyPress('Space'); - const updatePos = () => { - instance.setNodes((nodes) => - nodes.map((node) => { - node.position = { - x: Math.random() * 400, - y: Math.random() * 400, - }; - - return node; - }) - ); - }; - - const logToObject = () => console.log(instance.toObject()); - const resetTransform = () => instance.setViewport({ x: 0, y: 0, zoom: 1 }); - - const toggleClassnames = () => { - instance.setNodes((nodes) => - nodes.map((node) => { - node.className = node.className === 'light' ? 'dark' : 'light'; - - return node; - }) - ); - }; - return ( { selectionMode={SelectionMode.Partial} panOnDrag={spaceBarPressed ? true : 'RightClick'} panOnScroll - onPaneContextMenu={logEvent} - zoomActivationKeyCode={'Meta'} + zoomActivationKeyCode="Meta" multiSelectionKeyCode={MULTI_SELECT_KEY} - className="react-flow-basic-example" - minZoom={0.2} - maxZoom={4} - onPaneClick={onPaneClick} fitView - defaultEdgeOptions={defaultEdgeOptions} selectNodesOnDrag={false} > - - -
- - - - -
+
); }; diff --git a/packages/core/src/container/FlowRenderer/index.tsx b/packages/core/src/container/FlowRenderer/index.tsx index 164d2adc..ae2d4a1d 100644 --- a/packages/core/src/container/FlowRenderer/index.tsx +++ b/packages/core/src/container/FlowRenderer/index.tsx @@ -48,6 +48,7 @@ const FlowRenderer = ({ onSelectionStart, onSelectionEnd, multiSelectionKeyCode, + panActivationKeyCode, zoomActivationKeyCode, elementsSelectable, zoomOnScroll, @@ -91,6 +92,7 @@ const FlowRenderer = ({ translateExtent={translateExtent} minZoom={minZoom} maxZoom={maxZoom} + panActivationKeyCode={panActivationKeyCode} zoomActivationKeyCode={zoomActivationKeyCode} preventScrolling={preventScrolling} noWheelClassName={noWheelClassName} diff --git a/packages/core/src/container/GraphView/index.tsx b/packages/core/src/container/GraphView/index.tsx index fac6cab9..425d9180 100644 --- a/packages/core/src/container/GraphView/index.tsx +++ b/packages/core/src/container/GraphView/index.tsx @@ -61,6 +61,7 @@ const GraphView = ({ selectionOnDrag, selectionMode, multiSelectionKeyCode, + panActivationKeyCode, zoomActivationKeyCode, deleteKeyCode, onlyRenderVisibleElements, @@ -119,6 +120,7 @@ const GraphView = ({ onSelectionStart={onSelectionStart} onSelectionEnd={onSelectionEnd} multiSelectionKeyCode={multiSelectionKeyCode} + panActivationKeyCode={panActivationKeyCode} zoomActivationKeyCode={zoomActivationKeyCode} elementsSelectable={elementsSelectable} onMove={onMove} diff --git a/packages/core/src/container/ReactFlow/index.tsx b/packages/core/src/container/ReactFlow/index.tsx index 183df8c0..6b9fbacc 100644 --- a/packages/core/src/container/ReactFlow/index.tsx +++ b/packages/core/src/container/ReactFlow/index.tsx @@ -103,6 +103,7 @@ const ReactFlow = forwardRef( selectionKeyCode = 'Shift', selectionOnDrag = false, selectionMode = SelectionMode.Full, + panActivationKeyCode = 'Space', multiSelectionKeyCode = 'Meta', zoomActivationKeyCode = 'Meta', snapToGrid = false, @@ -201,6 +202,7 @@ const ReactFlow = forwardRef( selectionMode={selectionMode} deleteKeyCode={deleteKeyCode} multiSelectionKeyCode={multiSelectionKeyCode} + panActivationKeyCode={panActivationKeyCode} zoomActivationKeyCode={zoomActivationKeyCode} onlyRenderVisibleElements={onlyRenderVisibleElements} selectNodesOnDrag={selectNodesOnDrag} diff --git a/packages/core/src/container/ZoomPane/index.tsx b/packages/core/src/container/ZoomPane/index.tsx index 50d36458..3a476865 100644 --- a/packages/core/src/container/ZoomPane/index.tsx +++ b/packages/core/src/container/ZoomPane/index.tsx @@ -53,11 +53,12 @@ const ZoomPane = ({ panOnScrollMode = PanOnScrollMode.Free, zoomOnDoubleClick = true, elementsSelectable, - panOnDrag = true, + panOnDrag: _panOnDrag = true, defaultViewport, translateExtent, minZoom, maxZoom, + panActivationKeyCode, zoomActivationKeyCode, preventScrolling = true, children, @@ -72,6 +73,8 @@ const ZoomPane = ({ const prevTransform = useRef({ x: 0, y: 0, zoom: 0 }); const { d3Zoom, d3Selection, d3ZoomHandler, userSelectionActive } = useStore(selector, shallow); const zoomActivationKeyPressed = useKeyPress(zoomActivationKeyCode); + const panActivationKeyPressed = useKeyPress(panActivationKeyCode); + const panOnDrag = _panOnDrag || panActivationKeyPressed; useResizeHandler(zoomPane); diff --git a/packages/core/src/types/component-props.ts b/packages/core/src/types/component-props.ts index 551b98bb..d0caf183 100644 --- a/packages/core/src/types/component-props.ts +++ b/packages/core/src/types/component-props.ts @@ -99,6 +99,7 @@ export type ReactFlowProps = HTMLAttributes & { selectionKeyCode?: KeyCode | null; selectionOnDrag?: boolean; selectionMode?: SelectionMode; + panActivationKeyCode?: KeyCode | null; multiSelectionKeyCode?: KeyCode | null; zoomActivationKeyCode?: KeyCode | null; snapToGrid?: boolean;