chore(examples): only use bundle
This commit is contained in:
@@ -5,13 +5,10 @@ import {
|
|||||||
Node,
|
Node,
|
||||||
ReactFlowProvider,
|
ReactFlowProvider,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
} from '@react-flow/core';
|
|
||||||
|
|
||||||
import {
|
|
||||||
Background,
|
Background,
|
||||||
BackgroundProps,
|
BackgroundProps,
|
||||||
BackgroundVariant,
|
BackgroundVariant,
|
||||||
} from '@react-flow/background';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import styles from './style.module.css';
|
import styles from './style.module.css';
|
||||||
|
|
||||||
@@ -23,10 +20,7 @@ const initialNodes: Node[] = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const Flow: FC<{ id: string; bgProps: BackgroundProps }> = ({
|
const Flow: FC<{ id: string; bgProps: BackgroundProps }> = ({ id, bgProps }) => {
|
||||||
id,
|
|
||||||
bgProps,
|
|
||||||
}) => {
|
|
||||||
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -41,14 +35,8 @@ const Flow: FC<{ id: string; bgProps: BackgroundProps }> = ({
|
|||||||
const Backgrounds: FC = () => (
|
const Backgrounds: FC = () => (
|
||||||
<div className={styles.wrapper}>
|
<div className={styles.wrapper}>
|
||||||
<Flow id="flow-a" bgProps={{ variant: BackgroundVariant.Dots }} />
|
<Flow id="flow-a" bgProps={{ variant: BackgroundVariant.Dots }} />
|
||||||
<Flow
|
<Flow id="flow-b" bgProps={{ variant: BackgroundVariant.Lines, gap: [50, 50] }} />
|
||||||
id="flow-b"
|
<Flow id="flow-c" bgProps={{ variant: BackgroundVariant.Cross, gap: [100, 50] }} />
|
||||||
bgProps={{ variant: BackgroundVariant.Lines, gap: [50, 50] }}
|
|
||||||
/>
|
|
||||||
<Flow
|
|
||||||
id="flow-c"
|
|
||||||
bgProps={{ variant: BackgroundVariant.Cross, gap: [100, 50] }}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ import {
|
|||||||
ReactFlowProvider,
|
ReactFlowProvider,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/core';
|
Background,
|
||||||
import { Background, BackgroundVariant } from '@react-flow/background';
|
BackgroundVariant,
|
||||||
|
} from '@react-flow/bunde';
|
||||||
|
|
||||||
const defaultNodes: Node[] = [
|
const defaultNodes: Node[] = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
import React, { FC } from 'react';
|
import React, { FC } from 'react';
|
||||||
import { ConnectionLineComponentProps } from '@react-flow/core';
|
import { ConnectionLineComponentProps } from '@react-flow/bundle';
|
||||||
|
|
||||||
const ConnectionLine: FC<ConnectionLineComponentProps> = ({
|
const ConnectionLine: FC<ConnectionLineComponentProps> = ({ fromX, fromY, toX, toY }) => {
|
||||||
fromX,
|
|
||||||
fromY,
|
|
||||||
toX,
|
|
||||||
toY,
|
|
||||||
}) => {
|
|
||||||
return (
|
return (
|
||||||
<g>
|
<g>
|
||||||
<path
|
<path
|
||||||
@@ -16,14 +11,7 @@ const ConnectionLine: FC<ConnectionLineComponentProps> = ({
|
|||||||
className="animated"
|
className="animated"
|
||||||
d={`M${fromX},${fromY} C ${fromX} ${toY} ${fromX} ${toY} ${toX},${toY}`}
|
d={`M${fromX},${fromY} C ${fromX} ${toY} ${fromX} ${toY} ${toX},${toY}`}
|
||||||
/>
|
/>
|
||||||
<circle
|
<circle cx={toX} cy={toY} fill="#fff" r={3} stroke="#222" strokeWidth={1.5} />
|
||||||
cx={toX}
|
|
||||||
cy={toY}
|
|
||||||
fill="#fff"
|
|
||||||
r={3}
|
|
||||||
stroke="#222"
|
|
||||||
strokeWidth={1.5}
|
|
||||||
/>
|
|
||||||
</g>
|
</g>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ import {
|
|||||||
Edge,
|
Edge,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/core';
|
Background,
|
||||||
import { Background, BackgroundVariant } from '@react-flow/background';
|
BackgroundVariant,
|
||||||
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import ConnectionLine from './ConnectionLine';
|
import ConnectionLine from './ConnectionLine';
|
||||||
|
|
||||||
@@ -25,10 +26,7 @@ const initialEdges: Edge[] = [];
|
|||||||
const ConnectionLineFlow = () => {
|
const ConnectionLineFlow = () => {
|
||||||
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)), [setEdges]);
|
||||||
(params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
import React, { memo, FC, CSSProperties } from 'react';
|
import React, { memo, FC, CSSProperties } from 'react';
|
||||||
import {
|
import { Handle, Position, NodeProps, Connection, Edge } from '@react-flow/bundle';
|
||||||
Handle,
|
|
||||||
Position,
|
|
||||||
NodeProps,
|
|
||||||
Connection,
|
|
||||||
Edge,
|
|
||||||
} from '@react-flow/renderer';
|
|
||||||
|
|
||||||
const targetHandleStyle: CSSProperties = { background: '#555' };
|
const targetHandleStyle: CSSProperties = { background: '#555' };
|
||||||
const sourceHandleStyleA: CSSProperties = { ...targetHandleStyle, top: 10 };
|
const sourceHandleStyleA: CSSProperties = { ...targetHandleStyle, top: 10 };
|
||||||
@@ -15,27 +9,16 @@ const sourceHandleStyleB: CSSProperties = {
|
|||||||
top: 'auto',
|
top: 'auto',
|
||||||
};
|
};
|
||||||
|
|
||||||
const onConnect = (params: Connection | Edge) =>
|
const onConnect = (params: Connection | Edge) => console.log('handle onConnect', params);
|
||||||
console.log('handle onConnect', params);
|
|
||||||
|
|
||||||
const ColorSelectorNode: FC<NodeProps> = ({ data, isConnectable }) => {
|
const ColorSelectorNode: FC<NodeProps> = ({ data, isConnectable }) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Handle
|
<Handle type="target" position={Position.Left} style={targetHandleStyle} onConnect={onConnect} />
|
||||||
type="target"
|
|
||||||
position={Position.Left}
|
|
||||||
style={targetHandleStyle}
|
|
||||||
onConnect={onConnect}
|
|
||||||
/>
|
|
||||||
<div>
|
<div>
|
||||||
Custom Color Picker Node: <strong>{data.color}</strong>
|
Custom Color Picker Node: <strong>{data.color}</strong>
|
||||||
</div>
|
</div>
|
||||||
<input
|
<input className="nodrag" type="color" onChange={data.onChange} defaultValue={data.color} />
|
||||||
className="nodrag"
|
|
||||||
type="color"
|
|
||||||
onChange={data.onChange}
|
|
||||||
defaultValue={data.color}
|
|
||||||
/>
|
|
||||||
<Handle
|
<Handle
|
||||||
type="source"
|
type="source"
|
||||||
position={Position.Right}
|
position={Position.Right}
|
||||||
@@ -46,13 +29,7 @@ const ColorSelectorNode: FC<NodeProps> = ({ data, isConnectable }) => {
|
|||||||
console.log('You trigger mousedown event', e);
|
console.log('You trigger mousedown event', e);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Handle
|
<Handle type="source" position={Position.Right} id="b" style={sourceHandleStyleB} isConnectable={isConnectable} />
|
||||||
type="source"
|
|
||||||
position={Position.Right}
|
|
||||||
id="b"
|
|
||||||
style={sourceHandleStyleB}
|
|
||||||
isConnectable={isConnectable}
|
|
||||||
/>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
Connection,
|
Connection,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import ColorSelectorNode from './ColorSelectorNode';
|
import ColorSelectorNode from './ColorSelectorNode';
|
||||||
|
|
||||||
@@ -120,9 +120,7 @@ const CustomNodeFlow = () => {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const onConnect = (connection: Connection) =>
|
const onConnect = (connection: Connection) =>
|
||||||
setEdges((eds) =>
|
setEdges((eds) => addEdge({ ...connection, animated: true, style: { stroke: '#fff' } }, eds));
|
||||||
addEdge({ ...connection, animated: true, style: { stroke: '#fff' } }, eds)
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
|
|||||||
@@ -5,8 +5,9 @@ import {
|
|||||||
Node,
|
Node,
|
||||||
Edge,
|
Edge,
|
||||||
ReactFlowProvider,
|
ReactFlowProvider,
|
||||||
} from '@react-flow/core';
|
Background,
|
||||||
import { Background, BackgroundVariant } from '@react-flow/background';
|
BackgroundVariant,
|
||||||
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
const defaultNodes: Node[] = [
|
const defaultNodes: Node[] = [
|
||||||
{
|
{
|
||||||
@@ -77,12 +78,7 @@ const DefaultNodes = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow defaultNodes={defaultNodes} defaultEdges={defaultEdges} defaultEdgeOptions={defaultEdgeOptions} fitView>
|
||||||
defaultNodes={defaultNodes}
|
|
||||||
defaultEdges={defaultEdges}
|
|
||||||
defaultEdgeOptions={defaultEdgeOptions}
|
|
||||||
fitView
|
|
||||||
>
|
|
||||||
<Background variant={BackgroundVariant.Lines} />
|
<Background variant={BackgroundVariant.Lines} />
|
||||||
|
|
||||||
<div style={{ position: 'absolute', right: 10, top: 10, zIndex: 4 }}>
|
<div style={{ position: 'absolute', right: 10, top: 10, zIndex: 4 }}>
|
||||||
|
|||||||
@@ -1,15 +1,8 @@
|
|||||||
import React, { memo, FC } from 'react';
|
import React, { memo, FC } from 'react';
|
||||||
|
|
||||||
import {
|
import { Handle, Position, NodeProps, Connection, Edge } from '@react-flow/bundle';
|
||||||
Handle,
|
|
||||||
Position,
|
|
||||||
NodeProps,
|
|
||||||
Connection,
|
|
||||||
Edge,
|
|
||||||
} from '@react-flow/core';
|
|
||||||
|
|
||||||
const onConnect = (params: Connection | Edge) =>
|
const onConnect = (params: Connection | Edge) => console.log('handle onConnect', params);
|
||||||
console.log('handle onConnect', params);
|
|
||||||
|
|
||||||
const labelStyle = {
|
const labelStyle = {
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
@@ -28,12 +21,11 @@ const dragHandleStyle = {
|
|||||||
const ColorSelectorNode: FC<NodeProps> = () => {
|
const ColorSelectorNode: FC<NodeProps> = () => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Handle type='target' position={Position.Left} onConnect={onConnect} />
|
<Handle type="target" position={Position.Left} onConnect={onConnect} />
|
||||||
<div style={labelStyle}>
|
<div style={labelStyle}>
|
||||||
Only draggable here →{' '}
|
Only draggable here → <span className="custom-drag-handle" style={dragHandleStyle} />
|
||||||
<span className='custom-drag-handle' style={dragHandleStyle} />
|
|
||||||
</div>
|
</div>
|
||||||
<Handle type='source' position={Position.Right} />
|
<Handle type="source" position={Position.Right} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import {
|
|||||||
Node,
|
Node,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/core';
|
Controls,
|
||||||
import { Controls } from '@react-flow/controls';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import Sidebar from './Sidebar';
|
import Sidebar from './Sidebar';
|
||||||
|
|
||||||
@@ -34,13 +34,11 @@ let id = 0;
|
|||||||
const getId = () => `dndnode_${id++}`;
|
const getId = () => `dndnode_${id++}`;
|
||||||
|
|
||||||
const DnDFlow = () => {
|
const DnDFlow = () => {
|
||||||
const [reactFlowInstance, setReactFlowInstance] =
|
const [reactFlowInstance, setReactFlowInstance] = useState<ReactFlowInstance>();
|
||||||
useState<ReactFlowInstance>();
|
|
||||||
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
||||||
|
|
||||||
const onConnect = (params: Connection | Edge) =>
|
const onConnect = (params: Connection | Edge) => setEdges((eds) => addEdge(params, eds));
|
||||||
setEdges((eds) => addEdge(params, eds));
|
|
||||||
const onInit = (rfi: ReactFlowInstance) => setReactFlowInstance(rfi);
|
const onInit = (rfi: ReactFlowInstance) => setReactFlowInstance(rfi);
|
||||||
|
|
||||||
const onDrop = (event: DragEvent) => {
|
const onDrop = (event: DragEvent) => {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import {
|
|||||||
Edge,
|
Edge,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import { getElements } from './utils';
|
import { getElements } from './utils';
|
||||||
|
|
||||||
@@ -31,8 +31,7 @@ const deleteKeyCode = ['AltLeft+KeyD', 'Backspace'];
|
|||||||
const EdgeTypesFlow = () => {
|
const EdgeTypesFlow = () => {
|
||||||
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
const onConnect = (params: Connection | Edge) =>
|
const onConnect = (params: Connection | Edge) => setEdges((eds) => addEdge(params, eds));
|
||||||
setEdges((eds) => addEdge(params, eds));
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Edge, Node, Position } from '@react-flow/core';
|
import { Edge, Node, Position } from '@react-flow/bundle';
|
||||||
|
|
||||||
const nodeWidth = 80;
|
const nodeWidth = 80;
|
||||||
const nodeGapWidth = nodeWidth * 2;
|
const nodeGapWidth = nodeWidth * 2;
|
||||||
@@ -54,18 +54,10 @@ const getNodeId = (): string => (id++).toString();
|
|||||||
export function getElements(): { nodes: Node[]; edges: Edge[] } {
|
export function getElements(): { nodes: Node[]; edges: Edge[] } {
|
||||||
const initialElements = { nodes: [] as Node[], edges: [] as Edge[] };
|
const initialElements = { nodes: [] as Node[], edges: [] as Edge[] };
|
||||||
|
|
||||||
for (
|
for (let sourceTargetIndex = 0; sourceTargetIndex < sourceTargetPositions.length; sourceTargetIndex++) {
|
||||||
let sourceTargetIndex = 0;
|
|
||||||
sourceTargetIndex < sourceTargetPositions.length;
|
|
||||||
sourceTargetIndex++
|
|
||||||
) {
|
|
||||||
const currSourceTargetPos = sourceTargetPositions[sourceTargetIndex];
|
const currSourceTargetPos = sourceTargetPositions[sourceTargetIndex];
|
||||||
|
|
||||||
for (
|
for (let edgeTypeIndex = 0; edgeTypeIndex < edgeTypes.length; edgeTypeIndex++) {
|
||||||
let edgeTypeIndex = 0;
|
|
||||||
edgeTypeIndex < edgeTypes.length;
|
|
||||||
edgeTypeIndex++
|
|
||||||
) {
|
|
||||||
const currEdgeType = edgeTypes[edgeTypeIndex];
|
const currEdgeType = edgeTypes[edgeTypeIndex];
|
||||||
|
|
||||||
for (let offsetIndex = 0; offsetIndex < offsets.length; offsetIndex++) {
|
for (let offsetIndex = 0; offsetIndex < offsets.length; offsetIndex++) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { FC } from 'react';
|
import React, { FC } from 'react';
|
||||||
import { EdgeProps, getBezierPath } from '@react-flow/core';
|
import { EdgeProps, getBezierPath } from '@react-flow/bundle';
|
||||||
|
|
||||||
const CustomEdge: FC<EdgeProps> = ({
|
const CustomEdge: FC<EdgeProps> = ({
|
||||||
id,
|
id,
|
||||||
@@ -22,14 +22,9 @@ const CustomEdge: FC<EdgeProps> = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<path id={id} className='react-flow__edge-path' d={edgePath} />
|
<path id={id} className="react-flow__edge-path" d={edgePath} />
|
||||||
<text>
|
<text>
|
||||||
<textPath
|
<textPath href={`#${id}`} style={{ fontSize: '12px' }} startOffset="50%" textAnchor="middle">
|
||||||
href={`#${id}`}
|
|
||||||
style={{ fontSize: '12px' }}
|
|
||||||
startOffset='50%'
|
|
||||||
textAnchor='middle'
|
|
||||||
>
|
|
||||||
{data.text}
|
{data.text}
|
||||||
</textPath>
|
</textPath>
|
||||||
</text>
|
</text>
|
||||||
|
|||||||
@@ -1,10 +1,5 @@
|
|||||||
import React, { FC } from 'react';
|
import React, { FC } from 'react';
|
||||||
import {
|
import { EdgeProps, getBezierPath, EdgeText, getBezierEdgeCenter } from '@react-flow/bundle';
|
||||||
EdgeProps,
|
|
||||||
getBezierPath,
|
|
||||||
EdgeText,
|
|
||||||
getBezierEdgeCenter,
|
|
||||||
} from '@react-flow/core';
|
|
||||||
|
|
||||||
const CustomEdge: FC<EdgeProps> = ({
|
const CustomEdge: FC<EdgeProps> = ({
|
||||||
id,
|
id,
|
||||||
@@ -33,7 +28,7 @@ const CustomEdge: FC<EdgeProps> = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<path id={id} className='react-flow__edge-path' d={edgePath} />
|
<path id={id} className="react-flow__edge-path" d={edgePath} />
|
||||||
<EdgeText
|
<EdgeText
|
||||||
x={centerX}
|
x={centerX}
|
||||||
y={centerY}
|
y={centerY}
|
||||||
|
|||||||
@@ -12,23 +12,18 @@ import {
|
|||||||
Node,
|
Node,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import CustomEdge from './CustomEdge';
|
import CustomEdge from './CustomEdge';
|
||||||
import CustomEdge2 from './CustomEdge2';
|
import CustomEdge2 from './CustomEdge2';
|
||||||
|
|
||||||
const onNodeDragStop = (_: MouseEvent, node: Node) =>
|
const onNodeDragStop = (_: MouseEvent, node: Node) => console.log('drag stop', node);
|
||||||
console.log('drag stop', node);
|
|
||||||
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
||||||
const onEdgeClick = (_: MouseEvent, edge: Edge) => console.log('click', edge);
|
const onEdgeClick = (_: MouseEvent, edge: Edge) => console.log('click', edge);
|
||||||
const onEdgeDoubleClick = (_: MouseEvent, edge: Edge) =>
|
const onEdgeDoubleClick = (_: MouseEvent, edge: Edge) => console.log('dblclick', edge);
|
||||||
console.log('dblclick', edge);
|
const onEdgeMouseEnter = (_: MouseEvent, edge: Edge) => console.log('enter', edge);
|
||||||
const onEdgeMouseEnter = (_: MouseEvent, edge: Edge) =>
|
const onEdgeMouseMove = (_: MouseEvent, edge: Edge) => console.log('move', edge);
|
||||||
console.log('enter', edge);
|
const onEdgeMouseLeave = (_: MouseEvent, edge: Edge) => console.log('leave', edge);
|
||||||
const onEdgeMouseMove = (_: MouseEvent, edge: Edge) =>
|
|
||||||
console.log('move', edge);
|
|
||||||
const onEdgeMouseLeave = (_: MouseEvent, edge: Edge) =>
|
|
||||||
console.log('leave', edge);
|
|
||||||
|
|
||||||
const initialNodes: Node[] = [
|
const initialNodes: Node[] = [
|
||||||
{
|
{
|
||||||
@@ -189,10 +184,7 @@ const defaultViewport = {
|
|||||||
const EdgesFlow = () => {
|
const EdgesFlow = () => {
|
||||||
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)), [setEdges]);
|
||||||
(params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
|
|||||||
@@ -12,13 +12,11 @@ import {
|
|||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
ReactFlowInstance,
|
ReactFlowInstance,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
const onInit = (reactFlowInstance: ReactFlowInstance) =>
|
const onInit = (reactFlowInstance: ReactFlowInstance) => console.log('flow loaded:', reactFlowInstance);
|
||||||
console.log('flow loaded:', reactFlowInstance);
|
|
||||||
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
||||||
const onNodeDragStop = (_: MouseEvent, node: Node) =>
|
const onNodeDragStop = (_: MouseEvent, node: Node) => console.log('drag stop', node);
|
||||||
console.log('drag stop', node);
|
|
||||||
|
|
||||||
const buttonStyle: CSSProperties = {
|
const buttonStyle: CSSProperties = {
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
@@ -31,10 +29,7 @@ const EmptyFlow = () => {
|
|||||||
const [nodes, setNodes, onNodesChange] = useNodesState([]);
|
const [nodes, setNodes, onNodesChange] = useNodesState([]);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
||||||
|
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((params: Connection | Edge) => setEdges((els) => addEdge(params, els)), [setEdges]);
|
||||||
(params: Connection | Edge) => setEdges((els) => addEdge(params, els)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
const addRandomNode = () => {
|
const addRandomNode = () => {
|
||||||
const nodeId = (nodes.length + 1).toString();
|
const nodeId = (nodes.length + 1).toString();
|
||||||
const newNode: Node = {
|
const newNode: Node = {
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
import React, { FC } from 'react';
|
import React, { FC } from 'react';
|
||||||
import {
|
import { getBezierPath, ConnectionLineComponentProps, Node } from '@react-flow/bundle';
|
||||||
getBezierPath,
|
|
||||||
ConnectionLineComponentProps,
|
|
||||||
Node,
|
|
||||||
} from '@react-flow/core';
|
|
||||||
|
|
||||||
import { getEdgeParams } from './utils';
|
import { getEdgeParams } from './utils';
|
||||||
|
|
||||||
@@ -37,21 +33,8 @@ const FloatingConnectionLine: FC<ConnectionLineComponentProps> = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<g>
|
<g>
|
||||||
<path
|
<path fill="none" stroke="#222" strokeWidth={1.5} className="animated" d={d} />
|
||||||
fill='none'
|
<circle cx={targetX} cy={targetY} fill="#fff" r={3} stroke="#222" strokeWidth={1.5} />
|
||||||
stroke='#222'
|
|
||||||
strokeWidth={1.5}
|
|
||||||
className='animated'
|
|
||||||
d={d}
|
|
||||||
/>
|
|
||||||
<circle
|
|
||||||
cx={targetX}
|
|
||||||
cy={targetY}
|
|
||||||
fill='#fff'
|
|
||||||
r={3}
|
|
||||||
stroke='#222'
|
|
||||||
strokeWidth={1.5}
|
|
||||||
/>
|
|
||||||
</g>
|
</g>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,10 +1,5 @@
|
|||||||
import React, { FC, useMemo, CSSProperties } from 'react';
|
import React, { FC, useMemo, CSSProperties } from 'react';
|
||||||
import {
|
import { EdgeProps, useStore, getBezierPath, ReactFlowState } from '@react-flow/bundle';
|
||||||
EdgeProps,
|
|
||||||
useStore,
|
|
||||||
getBezierPath,
|
|
||||||
ReactFlowState,
|
|
||||||
} from '@react-flow/core';
|
|
||||||
|
|
||||||
import { getEdgeParams } from './utils';
|
import { getEdgeParams } from './utils';
|
||||||
|
|
||||||
@@ -13,23 +8,14 @@ const nodeSelector = (s: ReactFlowState) => s.nodeInternals;
|
|||||||
const FloatingEdge: FC<EdgeProps> = ({ id, source, target, style }) => {
|
const FloatingEdge: FC<EdgeProps> = ({ id, source, target, style }) => {
|
||||||
const nodeInternals = useStore(nodeSelector);
|
const nodeInternals = useStore(nodeSelector);
|
||||||
|
|
||||||
const sourceNode = useMemo(
|
const sourceNode = useMemo(() => nodeInternals.get(source), [source, nodeInternals]);
|
||||||
() => nodeInternals.get(source),
|
const targetNode = useMemo(() => nodeInternals.get(target), [target, nodeInternals]);
|
||||||
[source, nodeInternals]
|
|
||||||
);
|
|
||||||
const targetNode = useMemo(
|
|
||||||
() => nodeInternals.get(target),
|
|
||||||
[target, nodeInternals]
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!sourceNode || !targetNode) {
|
if (!sourceNode || !targetNode) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { sx, sy, tx, ty, sourcePos, targetPos } = getEdgeParams(
|
const { sx, sy, tx, ty, sourcePos, targetPos } = getEdgeParams(sourceNode, targetNode);
|
||||||
sourceNode,
|
|
||||||
targetNode
|
|
||||||
);
|
|
||||||
|
|
||||||
const d = getBezierPath({
|
const d = getBezierPath({
|
||||||
sourceX: sx,
|
sourceX: sx,
|
||||||
@@ -41,13 +27,8 @@ const FloatingEdge: FC<EdgeProps> = ({ id, source, target, style }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<g className='react-flow__connection'>
|
<g className="react-flow__connection">
|
||||||
<path
|
<path id={id} className="react-flow__edge-path" d={d} style={style as CSSProperties} />
|
||||||
id={id}
|
|
||||||
className='react-flow__edge-path'
|
|
||||||
d={d}
|
|
||||||
style={style as CSSProperties}
|
|
||||||
/>
|
|
||||||
</g>
|
</g>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
Connection,
|
Connection,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import styles from './style.module.css';
|
import styles from './style.module.css';
|
||||||
|
|
||||||
@@ -17,8 +17,7 @@ import FloatingConnectionLine from './FloatingConnectionLine';
|
|||||||
import FloatingEdge from './FloatingEdge';
|
import FloatingEdge from './FloatingEdge';
|
||||||
import { createElements } from './utils';
|
import { createElements } from './utils';
|
||||||
|
|
||||||
const onInit = (reactFlowInstance: ReactFlowInstance) =>
|
const onInit = (reactFlowInstance: ReactFlowInstance) => reactFlowInstance.fitView();
|
||||||
reactFlowInstance.fitView();
|
|
||||||
|
|
||||||
const { nodes: initialNodes, edges: initialEdges } =
|
const { nodes: initialNodes, edges: initialEdges } =
|
||||||
typeof window !== 'undefined' ? createElements() : { nodes: [], edges: [] };
|
typeof window !== 'undefined' ? createElements() : { nodes: [], edges: [] };
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
import React, { Position, XYPosition, Node, Edge } from '@react-flow/core';
|
import { Position, XYPosition, Node, Edge } from '@react-flow/bundle';
|
||||||
|
|
||||||
// this helper function returns the intersection point
|
// this helper function returns the intersection point
|
||||||
// of the line between the center of the intersectionNode and the target node
|
// of the line between the center of the intersectionNode and the target node
|
||||||
function getNodeIntersection(
|
function getNodeIntersection(intersectionNode: Node, targetNode: Node): XYPosition {
|
||||||
intersectionNode: Node,
|
|
||||||
targetNode: Node
|
|
||||||
): XYPosition {
|
|
||||||
// https://math.stackexchange.com/questions/1724792/an-algorithm-for-finding-the-intersection-point-between-a-center-of-vision-and-a
|
// https://math.stackexchange.com/questions/1724792/an-algorithm-for-finding-the-intersection-point-between-a-center-of-vision-and-a
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
|||||||
@@ -8,10 +8,9 @@ import {
|
|||||||
Node,
|
Node,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/core';
|
MiniMap,
|
||||||
|
Controls,
|
||||||
import { Controls } from '@react-flow/controls';
|
} from '@react-flow/bundle';
|
||||||
import { MiniMap } from '@react-flow/minimap';
|
|
||||||
|
|
||||||
const initialNodes: Node[] = [
|
const initialNodes: Node[] = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
import React, {
|
import React, { useState, MouseEvent as ReactMouseEvent, WheelEvent } from 'react';
|
||||||
useState,
|
|
||||||
MouseEvent as ReactMouseEvent,
|
|
||||||
WheelEvent,
|
|
||||||
} from 'react';
|
|
||||||
import {
|
import {
|
||||||
ReactFlow,
|
ReactFlow,
|
||||||
addEdge,
|
addEdge,
|
||||||
@@ -13,10 +9,9 @@ import {
|
|||||||
Viewport,
|
Viewport,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/core';
|
Controls,
|
||||||
|
MiniMap,
|
||||||
import { Controls } from '@react-flow/controls';
|
} from '@react-flow/bundle';
|
||||||
import { MiniMap } from '@react-flow/minimap';
|
|
||||||
|
|
||||||
const initialNodes: Node[] = [
|
const initialNodes: Node[] = [
|
||||||
{
|
{
|
||||||
@@ -35,27 +30,19 @@ const initialEdges: Edge[] = [
|
|||||||
{ id: 'e1-3', source: '1', target: '3' },
|
{ id: 'e1-3', source: '1', target: '3' },
|
||||||
];
|
];
|
||||||
|
|
||||||
const onNodeDragStart = (_: ReactMouseEvent, node: Node) =>
|
const onNodeDragStart = (_: ReactMouseEvent, node: Node) => console.log('drag start', node);
|
||||||
console.log('drag start', node);
|
const onNodeDragStop = (_: ReactMouseEvent, node: Node) => console.log('drag stop', node);
|
||||||
const onNodeDragStop = (_: ReactMouseEvent, node: Node) =>
|
const onNodeClick = (_: ReactMouseEvent, node: Node) => console.log('click', node);
|
||||||
console.log('drag stop', node);
|
const onEdgeClick = (_: ReactMouseEvent, edge: Edge) => console.log('click', edge);
|
||||||
const onNodeClick = (_: ReactMouseEvent, node: Node) =>
|
const onPaneClick = (event: ReactMouseEvent) => console.log('onPaneClick', event);
|
||||||
console.log('click', node);
|
|
||||||
const onEdgeClick = (_: ReactMouseEvent, edge: Edge) =>
|
|
||||||
console.log('click', edge);
|
|
||||||
const onPaneClick = (event: ReactMouseEvent) =>
|
|
||||||
console.log('onPaneClick', event);
|
|
||||||
const onPaneScroll = (event?: WheelEvent) => console.log('onPaneScroll', event);
|
const onPaneScroll = (event?: WheelEvent) => console.log('onPaneScroll', event);
|
||||||
const onPaneContextMenu = (event: ReactMouseEvent) =>
|
const onPaneContextMenu = (event: ReactMouseEvent) => console.log('onPaneContextMenu', event);
|
||||||
console.log('onPaneContextMenu', event);
|
const onMoveEnd = (_: TouchEvent | MouseEvent, viewport: Viewport) => console.log('onMoveEnd', viewport);
|
||||||
const onMoveEnd = (_: TouchEvent | MouseEvent, viewport: Viewport) =>
|
|
||||||
console.log('onMoveEnd', viewport);
|
|
||||||
|
|
||||||
const InteractionFlow = () => {
|
const InteractionFlow = () => {
|
||||||
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
const onConnect = (params: Connection | Edge) =>
|
const onConnect = (params: Connection | Edge) => setEdges((els) => addEdge(params, els));
|
||||||
setEdges((els) => addEdge(params, els));
|
|
||||||
|
|
||||||
const [isSelectable, setIsSelectable] = useState<boolean>(false);
|
const [isSelectable, setIsSelectable] = useState<boolean>(false);
|
||||||
const [isDraggable, setIsDraggable] = useState<boolean>(false);
|
const [isDraggable, setIsDraggable] = useState<boolean>(false);
|
||||||
@@ -63,15 +50,12 @@ const InteractionFlow = () => {
|
|||||||
const [zoomOnScroll, setZoomOnScroll] = useState<boolean>(false);
|
const [zoomOnScroll, setZoomOnScroll] = useState<boolean>(false);
|
||||||
const [zoomOnPinch, setZoomOnPinch] = useState<boolean>(false);
|
const [zoomOnPinch, setZoomOnPinch] = useState<boolean>(false);
|
||||||
const [panOnScroll, setPanOnScroll] = useState<boolean>(false);
|
const [panOnScroll, setPanOnScroll] = useState<boolean>(false);
|
||||||
const [panOnScrollMode, setPanOnScrollMode] = useState<PanOnScrollMode>(
|
const [panOnScrollMode, setPanOnScrollMode] = useState<PanOnScrollMode>(PanOnScrollMode.Free);
|
||||||
PanOnScrollMode.Free
|
|
||||||
);
|
|
||||||
const [zoomOnDoubleClick, setZoomOnDoubleClick] = useState<boolean>(false);
|
const [zoomOnDoubleClick, setZoomOnDoubleClick] = useState<boolean>(false);
|
||||||
const [panOnDrag, setPanOnDrag] = useState<boolean>(true);
|
const [panOnDrag, setPanOnDrag] = useState<boolean>(true);
|
||||||
const [captureZoomClick, setCaptureZoomClick] = useState<boolean>(false);
|
const [captureZoomClick, setCaptureZoomClick] = useState<boolean>(false);
|
||||||
const [captureZoomScroll, setCaptureZoomScroll] = useState<boolean>(false);
|
const [captureZoomScroll, setCaptureZoomScroll] = useState<boolean>(false);
|
||||||
const [captureElementClick, setCaptureElementClick] =
|
const [captureElementClick, setCaptureElementClick] = useState<boolean>(false);
|
||||||
useState<boolean>(false);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
@@ -180,9 +164,7 @@ const InteractionFlow = () => {
|
|||||||
<select
|
<select
|
||||||
id="panonscrollmode"
|
id="panonscrollmode"
|
||||||
value={panOnScrollMode}
|
value={panOnScrollMode}
|
||||||
onChange={(event) =>
|
onChange={(event) => setPanOnScrollMode(event.target.value as PanOnScrollMode)}
|
||||||
setPanOnScrollMode(event.target.value as PanOnScrollMode)
|
|
||||||
}
|
|
||||||
className="react-flow__panonscrollmode"
|
className="react-flow__panonscrollmode"
|
||||||
>
|
>
|
||||||
<option value="free">free</option>
|
<option value="free">free</option>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
useEdgesState,
|
useEdgesState,
|
||||||
MarkerType,
|
MarkerType,
|
||||||
EdgeMarker,
|
EdgeMarker,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import dagre from 'dagre';
|
import dagre from 'dagre';
|
||||||
|
|
||||||
@@ -78,10 +78,7 @@ const LayoutFlow = () => {
|
|||||||
eds.map((e) => ({
|
eds.map((e) => ({
|
||||||
...e,
|
...e,
|
||||||
markerEnd: {
|
markerEnd: {
|
||||||
type:
|
type: (e.markerEnd as EdgeMarker)?.type === MarkerType.Arrow ? MarkerType.ArrowClosed : MarkerType.Arrow,
|
||||||
(e.markerEnd as EdgeMarker)?.type === MarkerType.Arrow
|
|
||||||
? MarkerType.ArrowClosed
|
|
||||||
: MarkerType.Arrow,
|
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Node, Edge, XYPosition, MarkerType } from '@react-flow/core';
|
import { Node, Edge, XYPosition, MarkerType } from '@react-flow/bundle';
|
||||||
|
|
||||||
const position: XYPosition = { x: 0, y: 0 };
|
const position: XYPosition = { x: 0, y: 0 };
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
MarkerType,
|
MarkerType,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import styles from './multiflows.module.css';
|
import styles from './multiflows.module.css';
|
||||||
|
|
||||||
@@ -58,8 +58,7 @@ const Flow: FC<{ id: string }> = ({ id }) => {
|
|||||||
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
|
|
||||||
const onConnect = (params: Edge | Connection) =>
|
const onConnect = (params: Edge | Connection) => setEdges((eds) => addEdge(params, eds));
|
||||||
setEdges((eds) => addEdge(params, eds));
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlowProvider>
|
<ReactFlowProvider>
|
||||||
|
|||||||
@@ -11,10 +11,9 @@ import {
|
|||||||
Edge,
|
Edge,
|
||||||
ReactFlowInstance,
|
ReactFlowInstance,
|
||||||
Connection,
|
Connection,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
const onNodeDragStop = (_: MouseEvent, node: Node) =>
|
const onNodeDragStop = (_: MouseEvent, node: Node) => console.log('drag stop', node);
|
||||||
console.log('drag stop', node);
|
|
||||||
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
||||||
const onEdgeClick = (_: MouseEvent, edge: Edge) => console.log('click', edge);
|
const onEdgeClick = (_: MouseEvent, edge: Edge) => console.log('click', edge);
|
||||||
|
|
||||||
@@ -110,10 +109,7 @@ const NestedFlow = () => {
|
|||||||
},
|
},
|
||||||
[setEdges]
|
[setEdges]
|
||||||
);
|
);
|
||||||
const onInit = useCallback(
|
const onInit = useCallback((reactFlowInstance: ReactFlowInstance) => setRfInstance(reactFlowInstance), []);
|
||||||
(reactFlowInstance: ReactFlowInstance) => setRfInstance(reactFlowInstance),
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
|
|
||||||
const updatePos = () => {
|
const updatePos = () => {
|
||||||
setNodes((nds) => {
|
setNodes((nds) => {
|
||||||
|
|||||||
@@ -1,15 +1,6 @@
|
|||||||
import React, { CSSProperties, useCallback } from 'react';
|
import React, { CSSProperties, useCallback } from 'react';
|
||||||
|
|
||||||
import {
|
import { ReactFlow, addEdge, Node, Position, Connection, Edge, useNodesState, useEdgesState } from '@react-flow/bundle';
|
||||||
ReactFlow,
|
|
||||||
addEdge,
|
|
||||||
Node,
|
|
||||||
Position,
|
|
||||||
Connection,
|
|
||||||
Edge,
|
|
||||||
useNodesState,
|
|
||||||
useEdgesState,
|
|
||||||
} from '@react-flow/core';
|
|
||||||
|
|
||||||
const initialNodes: Node[] = [
|
const initialNodes: Node[] = [
|
||||||
{
|
{
|
||||||
@@ -29,9 +20,7 @@ const initialNodes: Node[] = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const initialEdges: Edge[] = [
|
const initialEdges: Edge[] = [{ id: 'e1-2', source: '1', type: 'smoothstep', target: '2', animated: true }];
|
||||||
{ id: 'e1-2', source: '1', type: 'smoothstep', target: '2', animated: true },
|
|
||||||
];
|
|
||||||
|
|
||||||
const buttonStyle: CSSProperties = {
|
const buttonStyle: CSSProperties = {
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
@@ -43,10 +32,7 @@ const buttonStyle: CSSProperties = {
|
|||||||
const NodeTypeChangeFlow = () => {
|
const NodeTypeChangeFlow = () => {
|
||||||
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)), [setEdges]);
|
||||||
(params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
const changeType = () => {
|
const changeType = () => {
|
||||||
setNodes((nds) =>
|
setNodes((nds) =>
|
||||||
nds.map((node) => {
|
nds.map((node) => {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
NodeTypes,
|
NodeTypes,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/core';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
const initialNodes: Node[] = [
|
const initialNodes: Node[] = [
|
||||||
{
|
{
|
||||||
@@ -68,10 +68,7 @@ const NodeTypeChangeFlow = () => {
|
|||||||
const [nodeTypesId, setNodeTypesId] = useState<string>('a');
|
const [nodeTypesId, setNodeTypesId] = useState<string>('a');
|
||||||
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)), [setEdges]);
|
||||||
(params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
const changeType = () => setNodeTypesId((nt) => (nt === 'a' ? 'b' : 'a'));
|
const changeType = () => setNodeTypesId((nt) => (nt === 'a' ? 'b' : 'a'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
import React, {
|
import React, { MouseEvent as ReactMouseEvent, CSSProperties, useCallback } from 'react';
|
||||||
MouseEvent as ReactMouseEvent,
|
|
||||||
CSSProperties,
|
|
||||||
useCallback,
|
|
||||||
} from 'react';
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ReactFlow,
|
ReactFlow,
|
||||||
@@ -16,63 +12,42 @@ import {
|
|||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
OnSelectionChangeParams,
|
OnSelectionChangeParams,
|
||||||
} from '@react-flow/core';
|
Controls,
|
||||||
|
Background,
|
||||||
|
MiniMap,
|
||||||
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import { Controls } from '@react-flow/controls';
|
const onNodeDragStart = (_: ReactMouseEvent, node: Node, nodes: Node[]) => console.log('drag start', node, nodes);
|
||||||
import { Background } from '@react-flow/background';
|
const onNodeDrag = (_: ReactMouseEvent, node: Node, nodes: Node[]) => console.log('drag', node, nodes);
|
||||||
import { MiniMap } from '@react-flow/minimap';
|
const onNodeDragStop = (_: ReactMouseEvent, node: Node, nodes: Node[]) => console.log('drag stop', node, nodes);
|
||||||
|
const onNodeDoubleClick = (_: ReactMouseEvent, node: Node) => console.log('node double click', node);
|
||||||
const onNodeDragStart = (_: ReactMouseEvent, node: Node, nodes: Node[]) =>
|
const onPaneClick = (event: ReactMouseEvent) => console.log('pane click', event);
|
||||||
console.log('drag start', node, nodes);
|
const onPaneScroll = (event?: ReactMouseEvent) => console.log('pane scroll', event);
|
||||||
const onNodeDrag = (_: ReactMouseEvent, node: Node, nodes: Node[]) =>
|
const onPaneContextMenu = (event: ReactMouseEvent) => console.log('pane context menu', event);
|
||||||
console.log('drag', node, nodes);
|
const onSelectionDrag = (_: ReactMouseEvent, nodes: Node[]) => console.log('selection drag', nodes);
|
||||||
const onNodeDragStop = (_: ReactMouseEvent, node: Node, nodes: Node[]) =>
|
const onSelectionDragStart = (_: ReactMouseEvent, nodes: Node[]) => console.log('selection drag start', nodes);
|
||||||
console.log('drag stop', node, nodes);
|
const onSelectionDragStop = (_: ReactMouseEvent, nodes: Node[]) => console.log('selection drag stop', nodes);
|
||||||
const onNodeDoubleClick = (_: ReactMouseEvent, node: Node) =>
|
|
||||||
console.log('node double click', node);
|
|
||||||
const onPaneClick = (event: ReactMouseEvent) =>
|
|
||||||
console.log('pane click', event);
|
|
||||||
const onPaneScroll = (event?: ReactMouseEvent) =>
|
|
||||||
console.log('pane scroll', event);
|
|
||||||
const onPaneContextMenu = (event: ReactMouseEvent) =>
|
|
||||||
console.log('pane context menu', event);
|
|
||||||
const onSelectionDrag = (_: ReactMouseEvent, nodes: Node[]) =>
|
|
||||||
console.log('selection drag', nodes);
|
|
||||||
const onSelectionDragStart = (_: ReactMouseEvent, nodes: Node[]) =>
|
|
||||||
console.log('selection drag start', nodes);
|
|
||||||
const onSelectionDragStop = (_: ReactMouseEvent, nodes: Node[]) =>
|
|
||||||
console.log('selection drag stop', nodes);
|
|
||||||
const onSelectionContextMenu = (event: ReactMouseEvent, nodes: Node[]) => {
|
const onSelectionContextMenu = (event: ReactMouseEvent, nodes: Node[]) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
console.log('selection context menu', nodes);
|
console.log('selection context menu', nodes);
|
||||||
};
|
};
|
||||||
const onNodeClick = (_: ReactMouseEvent, node: Node) =>
|
const onNodeClick = (_: ReactMouseEvent, node: Node) => console.log('node click:', node);
|
||||||
console.log('node click:', node);
|
|
||||||
|
|
||||||
const onSelectionChange = ({ nodes, edges }: OnSelectionChangeParams) =>
|
const onSelectionChange = ({ nodes, edges }: OnSelectionChangeParams) => console.log('selection change', nodes, edges);
|
||||||
console.log('selection change', nodes, edges);
|
|
||||||
const onInit = (reactFlowInstance: ReactFlowInstance) => {
|
const onInit = (reactFlowInstance: ReactFlowInstance) => {
|
||||||
console.log('pane ready:', reactFlowInstance);
|
console.log('pane ready:', reactFlowInstance);
|
||||||
};
|
};
|
||||||
|
|
||||||
const onMoveStart = (_: MouseEvent | TouchEvent, viewport: Viewport) =>
|
const onMoveStart = (_: MouseEvent | TouchEvent, viewport: Viewport) => console.log('zoom/move start', viewport);
|
||||||
console.log('zoom/move start', viewport);
|
const onMoveEnd = (_: MouseEvent | TouchEvent, viewport: Viewport) => console.log('zoom/move end', viewport);
|
||||||
const onMoveEnd = (_: MouseEvent | TouchEvent, viewport: Viewport) =>
|
const onEdgeContextMenu = (_: ReactMouseEvent, edge: Edge) => console.log('edge context menu', edge);
|
||||||
console.log('zoom/move end', viewport);
|
const onEdgeMouseEnter = (_: ReactMouseEvent, edge: Edge) => console.log('edge mouse enter', edge);
|
||||||
const onEdgeContextMenu = (_: ReactMouseEvent, edge: Edge) =>
|
const onEdgeMouseMove = (_: ReactMouseEvent, edge: Edge) => console.log('edge mouse move', edge);
|
||||||
console.log('edge context menu', edge);
|
const onEdgeMouseLeave = (_: ReactMouseEvent, edge: Edge) => console.log('edge mouse leave', edge);
|
||||||
const onEdgeMouseEnter = (_: ReactMouseEvent, edge: Edge) =>
|
const onEdgeDoubleClick = (_: ReactMouseEvent, edge: Edge) => console.log('edge double click', edge);
|
||||||
console.log('edge mouse enter', edge);
|
|
||||||
const onEdgeMouseMove = (_: ReactMouseEvent, edge: Edge) =>
|
|
||||||
console.log('edge mouse move', edge);
|
|
||||||
const onEdgeMouseLeave = (_: ReactMouseEvent, edge: Edge) =>
|
|
||||||
console.log('edge mouse leave', edge);
|
|
||||||
const onEdgeDoubleClick = (_: ReactMouseEvent, edge: Edge) =>
|
|
||||||
console.log('edge double click', edge);
|
|
||||||
const onNodesDelete = (nodes: Node[]) => console.log('nodes delete', nodes);
|
const onNodesDelete = (nodes: Node[]) => console.log('nodes delete', nodes);
|
||||||
const onEdgesDelete = (edges: Edge[]) => console.log('edges delete', edges);
|
const onEdgesDelete = (edges: Edge[]) => console.log('edges delete', edges);
|
||||||
const onPaneMouseMove = (e: ReactMouseEvent) =>
|
const onPaneMouseMove = (e: ReactMouseEvent) => console.log('pane move', e.clientX);
|
||||||
console.log('pane move', e.clientX);
|
|
||||||
|
|
||||||
const initialNodes: Node[] = [
|
const initialNodes: Node[] = [
|
||||||
{
|
{
|
||||||
@@ -122,11 +97,7 @@ const initialNodes: Node[] = [
|
|||||||
label: (
|
label: (
|
||||||
<>
|
<>
|
||||||
You can find the docs on{' '}
|
You can find the docs on{' '}
|
||||||
<a
|
<a href="https://github.com/wbkd/react-flow" target="_blank" rel="noopener noreferrer">
|
||||||
href="https://github.com/wbkd/react-flow"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
>
|
|
||||||
Github
|
Github
|
||||||
</a>
|
</a>
|
||||||
</>
|
</>
|
||||||
@@ -215,10 +186,7 @@ const nodeColor = (n: Node): string => {
|
|||||||
const OverviewFlow = () => {
|
const OverviewFlow = () => {
|
||||||
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)), [setEdges]);
|
||||||
(params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
@@ -259,11 +227,7 @@ const OverviewFlow = () => {
|
|||||||
onEdgesDelete={onEdgesDelete}
|
onEdgesDelete={onEdgesDelete}
|
||||||
onPaneMouseMove={onPaneMouseMove}
|
onPaneMouseMove={onPaneMouseMove}
|
||||||
>
|
>
|
||||||
<MiniMap
|
<MiniMap nodeStrokeColor={nodeStrokeColor} nodeColor={nodeColor} nodeBorderRadius={2} />
|
||||||
nodeStrokeColor={nodeStrokeColor}
|
|
||||||
nodeColor={nodeColor}
|
|
||||||
nodeBorderRadius={2}
|
|
||||||
/>
|
|
||||||
<Controls />
|
<Controls />
|
||||||
<Background color="#aaa" gap={25} />
|
<Background color="#aaa" gap={25} />
|
||||||
</ReactFlow>
|
</ReactFlow>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useStore, useStoreApi } from '@react-flow/core';
|
import { useStore, useStoreApi } from '@react-flow/bundle';
|
||||||
|
|
||||||
import styles from './provider.module.css';
|
import styles from './provider.module.css';
|
||||||
|
|
||||||
@@ -16,19 +16,16 @@ const Sidebar = () => {
|
|||||||
return (
|
return (
|
||||||
<aside className={styles.aside}>
|
<aside className={styles.aside}>
|
||||||
<div className={styles.description}>
|
<div className={styles.description}>
|
||||||
This is an example of how you can access the internal state outside of
|
This is an example of how you can access the internal state outside of the ReactFlow component.
|
||||||
the ReactFlow component.
|
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.title}>Zoom & pan transform</div>
|
<div className={styles.title}>Zoom & pan transform</div>
|
||||||
<div className={styles.transform}>
|
<div className={styles.transform}>
|
||||||
[{transform[0].toFixed(2)}, {transform[1].toFixed(2)},{' '}
|
[{transform[0].toFixed(2)}, {transform[1].toFixed(2)}, {transform[2].toFixed(2)}]
|
||||||
{transform[2].toFixed(2)}]
|
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.title}>Nodes</div>
|
<div className={styles.title}>Nodes</div>
|
||||||
{Array.from(nodeInternals).map(([, node]) => (
|
{Array.from(nodeInternals).map(([, node]) => (
|
||||||
<div key={node.id}>
|
<div key={node.id}>
|
||||||
Node {node.id} - x: {node.position.x.toFixed(2)}, y:{' '}
|
Node {node.id} - x: {node.position.x.toFixed(2)}, y: {node.position.y.toFixed(2)}
|
||||||
{node.position.y.toFixed(2)}
|
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
|
|||||||
@@ -11,15 +11,14 @@ import {
|
|||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
ReactFlowInstance,
|
ReactFlowInstance,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import Sidebar from './Sidebar';
|
import Sidebar from './Sidebar';
|
||||||
|
|
||||||
import styles from './provider.module.css';
|
import styles from './provider.module.css';
|
||||||
|
|
||||||
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
||||||
const onInit = (reactFlowInstance: ReactFlowInstance) =>
|
const onInit = (reactFlowInstance: ReactFlowInstance) => console.log('pane ready:', reactFlowInstance);
|
||||||
console.log('pane ready:', reactFlowInstance);
|
|
||||||
|
|
||||||
const initialNodes: Node[] = [
|
const initialNodes: Node[] = [
|
||||||
{
|
{
|
||||||
@@ -41,10 +40,7 @@ const initialEdges: Edge[] = [
|
|||||||
const ProviderFlow = () => {
|
const ProviderFlow = () => {
|
||||||
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((params: Edge | Connection) => setEdges((els) => addEdge(params, els)), [setEdges]);
|
||||||
(params: Edge | Connection) => setEdges((els) => addEdge(params, els)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.providerflow}>
|
<div className={styles.providerflow}>
|
||||||
|
|||||||
@@ -1,10 +1,5 @@
|
|||||||
import React, { memo, useCallback, Dispatch, FC } from 'react';
|
import React, { memo, useCallback, Dispatch, FC } from 'react';
|
||||||
import {
|
import { useReactFlow, Edge, Node, ReactFlowJsonObject } from '@react-flow/bundle';
|
||||||
useReactFlow,
|
|
||||||
Edge,
|
|
||||||
Node,
|
|
||||||
ReactFlowJsonObject,
|
|
||||||
} from '@react-flow/core';
|
|
||||||
import localforage from 'localforage';
|
import localforage from 'localforage';
|
||||||
|
|
||||||
import styles from './save.module.css';
|
import styles from './save.module.css';
|
||||||
@@ -33,9 +28,7 @@ const Controls: FC<ControlsProps> = ({ setNodes, setEdges }) => {
|
|||||||
|
|
||||||
const onRestore = useCallback(() => {
|
const onRestore = useCallback(() => {
|
||||||
const restoreFlow = async () => {
|
const restoreFlow = async () => {
|
||||||
const flow: ReactFlowJsonObject | null = await localforage.getItem(
|
const flow: ReactFlowJsonObject | null = await localforage.getItem(flowKey);
|
||||||
flowKey
|
|
||||||
);
|
|
||||||
|
|
||||||
if (flow) {
|
if (flow) {
|
||||||
const { x, y, zoom } = flow.viewport;
|
const { x, y, zoom } = flow.viewport;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
Edge,
|
Edge,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/core';
|
} from '@react-flow/bundle';
|
||||||
import Controls from './Controls';
|
import Controls from './Controls';
|
||||||
|
|
||||||
const initialNodes: Node[] = [
|
const initialNodes: Node[] = [
|
||||||
@@ -21,10 +21,7 @@ const initialEdges: Edge[] = [{ id: 'e1-2', source: '1', target: '2' }];
|
|||||||
const SaveRestore = () => {
|
const SaveRestore = () => {
|
||||||
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)), [setEdges]);
|
||||||
(params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlowProvider>
|
<ReactFlowProvider>
|
||||||
|
|||||||
@@ -10,10 +10,10 @@ import {
|
|||||||
addEdge,
|
addEdge,
|
||||||
applyEdgeChanges,
|
applyEdgeChanges,
|
||||||
EdgeChange,
|
EdgeChange,
|
||||||
} from '@react-flow/core';
|
Controls,
|
||||||
import { Controls } from '@react-flow/controls';
|
Background,
|
||||||
import { Background } from '@react-flow/background';
|
MiniMap,
|
||||||
import { MiniMap } from '@react-flow/minimap';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import { getNodesAndEdges } from './utils';
|
import { getNodesAndEdges } from './utils';
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
import { Node, Edge } from '@react-flow/core';
|
import { Node, Edge } from '@react-flow/bundle';
|
||||||
|
|
||||||
type ElementsCollection = {
|
type ElementsCollection = {
|
||||||
nodes: Node[];
|
nodes: Node[];
|
||||||
edges: Edge[];
|
edges: Edge[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export function getNodesAndEdges(
|
export function getNodesAndEdges(xElements = 10, yElements = 10): ElementsCollection {
|
||||||
xElements: number = 10,
|
|
||||||
yElements: number = 10
|
|
||||||
): ElementsCollection {
|
|
||||||
const initialNodes = [];
|
const initialNodes = [];
|
||||||
const initialEdges: Edge[] = [];
|
const initialEdges: Edge[] = [];
|
||||||
let nodeId = 1;
|
let nodeId = 1;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React, { memo, FC, CSSProperties } from 'react';
|
import React, { memo, FC, CSSProperties } from 'react';
|
||||||
|
|
||||||
import { Handle, NodeProps, Position } from '@react-flow/core';
|
import { Handle, NodeProps, Position } from '@react-flow/bundle';
|
||||||
|
|
||||||
const infoStyle: CSSProperties = { fontSize: 11 };
|
const infoStyle: CSSProperties = { fontSize: 11 };
|
||||||
const idStyle: CSSProperties = {
|
const idStyle: CSSProperties = {
|
||||||
@@ -14,12 +14,12 @@ const idStyle: CSSProperties = {
|
|||||||
const DebugNode: FC<NodeProps> = ({ zIndex, xPos, yPos, id }) => {
|
const DebugNode: FC<NodeProps> = ({ zIndex, xPos, yPos, id }) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Handle type='target' position={Position.Top} />
|
<Handle type="target" position={Position.Top} />
|
||||||
<div style={idStyle}>{id}</div>
|
<div style={idStyle}>{id}</div>
|
||||||
<div style={infoStyle}>
|
<div style={infoStyle}>
|
||||||
x:{Math.round(xPos || 0)} y:{Math.round(yPos || 0)} z:{zIndex}
|
x:{Math.round(xPos || 0)} y:{Math.round(yPos || 0)} z:{zIndex}
|
||||||
</div>
|
</div>
|
||||||
<Handle type='source' position={Position.Bottom} />
|
<Handle type="source" position={Position.Bottom} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,17 +9,15 @@ import {
|
|||||||
MarkerType,
|
MarkerType,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/core';
|
Controls,
|
||||||
import { Controls } from '@react-flow/controls';
|
MiniMap,
|
||||||
import { Background } from '@react-flow/background';
|
Background,
|
||||||
import { MiniMap } from '@react-flow/minimap';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import DebugNode from './DebugNode';
|
import DebugNode from './DebugNode';
|
||||||
|
|
||||||
const onNodeDrag = (_: MouseEvent, node: Node, nodes: Node[]) =>
|
const onNodeDrag = (_: MouseEvent, node: Node, nodes: Node[]) => console.log('drag', node, nodes);
|
||||||
console.log('drag', node, nodes);
|
const onNodeDragStop = (_: MouseEvent, node: Node, nodes: Node[]) => console.log('drag stop', node, nodes);
|
||||||
const onNodeDragStop = (_: MouseEvent, node: Node, nodes: Node[]) =>
|
|
||||||
console.log('drag stop', node, nodes);
|
|
||||||
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
||||||
const onEdgeClick = (_: MouseEvent, edge: Edge) => console.log('click', edge);
|
const onEdgeClick = (_: MouseEvent, edge: Edge) => console.log('click', edge);
|
||||||
|
|
||||||
@@ -150,14 +148,8 @@ const Subflow = () => {
|
|||||||
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
|
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((connection: Connection) => setEdges((eds) => addEdge(connection, eds)), [setEdges]);
|
||||||
(connection: Connection) => setEdges((eds) => addEdge(connection, eds)),
|
const onInit = useCallback((reactFlowInstance: ReactFlowInstance) => setRfInstance(reactFlowInstance), []);
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
const onInit = useCallback(
|
|
||||||
(reactFlowInstance: ReactFlowInstance) => setRfInstance(reactFlowInstance),
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
|
|
||||||
const updatePos = () => {
|
const updatePos = () => {
|
||||||
setNodes((nds) => {
|
setNodes((nds) => {
|
||||||
|
|||||||
@@ -1,16 +1,7 @@
|
|||||||
import React, { MouseEvent, useCallback } from 'react';
|
import React, { MouseEvent, useCallback } from 'react';
|
||||||
import {
|
import { ReactFlow, addEdge, Node, Connection, Edge, useNodesState, useEdgesState } from '@react-flow/bundle';
|
||||||
ReactFlow,
|
|
||||||
addEdge,
|
|
||||||
Node,
|
|
||||||
Connection,
|
|
||||||
Edge,
|
|
||||||
useNodesState,
|
|
||||||
useEdgesState,
|
|
||||||
} from '@react-flow/core';
|
|
||||||
|
|
||||||
const onNodeDragStop = (_: MouseEvent, node: Node) =>
|
const onNodeDragStop = (_: MouseEvent, node: Node) => console.log('drag stop', node);
|
||||||
console.log('drag stop', node);
|
|
||||||
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
|
||||||
|
|
||||||
const nodesA: Node[] = [
|
const nodesA: Node[] = [
|
||||||
@@ -96,10 +87,7 @@ const BasicFlow = () => {
|
|||||||
const [nodes, setNodes, onNodesChange] = useNodesState(nodesA);
|
const [nodes, setNodes, onNodesChange] = useNodesState(nodesA);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(edgesA);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(edgesA);
|
||||||
|
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)), [setEdges]);
|
||||||
(params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
|
|||||||
@@ -1,14 +1,5 @@
|
|||||||
import React, { useCallback } from 'react';
|
import React, { useCallback } from 'react';
|
||||||
import {
|
import { ReactFlow, Node, Edge, useNodesState, useEdgesState, Position, Connection, addEdge } from '@react-flow/bundle';
|
||||||
ReactFlow,
|
|
||||||
Node,
|
|
||||||
Edge,
|
|
||||||
useNodesState,
|
|
||||||
useEdgesState,
|
|
||||||
Position,
|
|
||||||
Connection,
|
|
||||||
addEdge,
|
|
||||||
} from '@react-flow/core';
|
|
||||||
|
|
||||||
import styles from './touch-device.module.css';
|
import styles from './touch-device.module.css';
|
||||||
|
|
||||||
@@ -34,20 +25,11 @@ const initialEdges: Edge[] = [];
|
|||||||
const TouchDeviceFlow = () => {
|
const TouchDeviceFlow = () => {
|
||||||
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((connection: Connection) => setEdges((eds) => addEdge(connection, eds)), [setEdges]);
|
||||||
(connection: Connection) => setEdges((eds) => addEdge(connection, eds)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
const onConnectStart = useCallback(() => console.log('connect start'), []);
|
const onConnectStart = useCallback(() => console.log('connect start'), []);
|
||||||
const onConnectEnd = useCallback(() => console.log('connect end'), []);
|
const onConnectEnd = useCallback(() => console.log('connect end'), []);
|
||||||
const onClickConnectStart = useCallback(
|
const onClickConnectStart = useCallback(() => console.log('click connect start'), []);
|
||||||
() => console.log('click connect start'),
|
const onClickConnectEnd = useCallback(() => console.log('click connect end'), []);
|
||||||
[]
|
|
||||||
);
|
|
||||||
const onClickConnectEnd = useCallback(
|
|
||||||
() => console.log('click connect end'),
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React, { memo, FC, CSSProperties } from 'react';
|
import React, { memo, FC, CSSProperties } from 'react';
|
||||||
|
|
||||||
import { Handle, Position, NodeProps } from '@react-flow/core';
|
import { Handle, Position, NodeProps } from '@react-flow/bundle';
|
||||||
|
|
||||||
const nodeStyles: CSSProperties = {
|
const nodeStyles: CSSProperties = {
|
||||||
padding: '10px 15px',
|
padding: '10px 15px',
|
||||||
@@ -11,10 +11,10 @@ const CustomNode: FC<NodeProps> = ({ id }) => {
|
|||||||
return (
|
return (
|
||||||
<div style={nodeStyles}>
|
<div style={nodeStyles}>
|
||||||
<div>node {id}</div>
|
<div>node {id}</div>
|
||||||
<Handle type='source' id='left' position={Position.Left} />
|
<Handle type="source" id="left" position={Position.Left} />
|
||||||
<Handle type='source' id='right' position={Position.Right} />
|
<Handle type="source" id="right" position={Position.Right} />
|
||||||
<Handle type='source' id='top' position={Position.Top} />
|
<Handle type="source" id="top" position={Position.Top} />
|
||||||
<Handle type='source' id='bottom' position={Position.Bottom} />
|
<Handle type="source" id="bottom" position={Position.Bottom} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import {
|
|||||||
updateEdge,
|
updateEdge,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/core';
|
} from '@react-flow/bundle';
|
||||||
import CustomNode from './CustomNode';
|
import CustomNode from './CustomNode';
|
||||||
|
|
||||||
const initialNodes: Node[] = [
|
const initialNodes: Node[] = [
|
||||||
@@ -184,8 +184,7 @@ const UpdateNodeInternalsFlow = () => {
|
|||||||
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
|
|
||||||
const onConnect = (params: Edge | Connection) =>
|
const onConnect = (params: Edge | Connection) => setEdges((els) => addEdge(params, els));
|
||||||
setEdges((els) => addEdge(params, els));
|
|
||||||
const { project } = useReactFlow();
|
const { project } = useReactFlow();
|
||||||
const onEdgeUpdate = (oldEdge: Edge, newConnection: Connection) =>
|
const onEdgeUpdate = (oldEdge: Edge, newConnection: Connection) =>
|
||||||
setEdges((els) => updateEdge(oldEdge, newConnection, els));
|
setEdges((els) => updateEdge(oldEdge, newConnection, els));
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import {
|
|||||||
NodeChange,
|
NodeChange,
|
||||||
EdgeChange,
|
EdgeChange,
|
||||||
HandleType,
|
HandleType,
|
||||||
} from '@react-flow/core';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import { Controls } from '@react-flow/controls';
|
import { Controls } from '@react-flow/controls';
|
||||||
|
|
||||||
@@ -59,17 +59,11 @@ const initialNodes: Node[] = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const initialEdges = [
|
const initialEdges = [{ id: 'e1-2', source: '1', target: '2', label: 'This is a draggable edge' }];
|
||||||
{ id: 'e1-2', source: '1', target: '2', label: 'This is a draggable edge' },
|
|
||||||
];
|
|
||||||
|
|
||||||
const onInit = (reactFlowInstance: ReactFlowInstance) =>
|
const onInit = (reactFlowInstance: ReactFlowInstance) => reactFlowInstance.fitView();
|
||||||
reactFlowInstance.fitView();
|
const onEdgeUpdateStart = (_: React.MouseEvent, edge: Edge, handleType: HandleType) =>
|
||||||
const onEdgeUpdateStart = (
|
console.log(`start update ${handleType} handle`, edge);
|
||||||
_: React.MouseEvent,
|
|
||||||
edge: Edge,
|
|
||||||
handleType: HandleType
|
|
||||||
) => console.log(`start update ${handleType} handle`, edge);
|
|
||||||
const onEdgeUpdateEnd = (_: MouseEvent, edge: Edge, handleType: HandleType) =>
|
const onEdgeUpdateEnd = (_: MouseEvent, edge: Edge, handleType: HandleType) =>
|
||||||
console.log(`end update ${handleType} handle`, edge);
|
console.log(`end update ${handleType} handle`, edge);
|
||||||
|
|
||||||
@@ -78,8 +72,7 @@ const UpdatableEdge = () => {
|
|||||||
const [edges, setEdges] = useState<Edge[]>(initialEdges);
|
const [edges, setEdges] = useState<Edge[]>(initialEdges);
|
||||||
const onEdgeUpdate = (oldEdge: Edge, newConnection: Connection) =>
|
const onEdgeUpdate = (oldEdge: Edge, newConnection: Connection) =>
|
||||||
setEdges((els) => updateEdge(oldEdge, newConnection, els));
|
setEdges((els) => updateEdge(oldEdge, newConnection, els));
|
||||||
const onConnect = (connection: Connection) =>
|
const onConnect = (connection: Connection) => setEdges((els) => addEdge(connection, els));
|
||||||
setEdges((els) => addEdge(connection, els));
|
|
||||||
|
|
||||||
const onNodesChange = useCallback((changes: NodeChange[]) => {
|
const onNodesChange = useCallback((changes: NodeChange[]) => {
|
||||||
console.log(changes);
|
console.log(changes);
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import {
|
import { ReactFlow, Node, Edge, useNodesState, useEdgesState } from '@react-flow/bundle';
|
||||||
ReactFlow,
|
|
||||||
Node,
|
|
||||||
Edge,
|
|
||||||
useNodesState,
|
|
||||||
useEdgesState,
|
|
||||||
} from '@react-flow/core';
|
|
||||||
|
|
||||||
import styles from './updatenode.module.css';
|
import styles from './updatenode.module.css';
|
||||||
|
|
||||||
@@ -77,21 +71,14 @@ const UpdateNode = () => {
|
|||||||
>
|
>
|
||||||
<div className={styles.controls}>
|
<div className={styles.controls}>
|
||||||
<label>label:</label>
|
<label>label:</label>
|
||||||
<input
|
<input value={nodeName} onChange={(evt) => setNodeName(evt.target.value)} />
|
||||||
value={nodeName}
|
|
||||||
onChange={(evt) => setNodeName(evt.target.value)}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<label className={styles.bgLabel}>background:</label>
|
<label className={styles.bgLabel}>background:</label>
|
||||||
<input value={nodeBg} onChange={(evt) => setNodeBg(evt.target.value)} />
|
<input value={nodeBg} onChange={(evt) => setNodeBg(evt.target.value)} />
|
||||||
|
|
||||||
<div className="updatenode__checkboxwrapper">
|
<div className="updatenode__checkboxwrapper">
|
||||||
<label>hidden:</label>
|
<label>hidden:</label>
|
||||||
<input
|
<input type="checkbox" checked={nodeHidden} onChange={(evt) => setNodeHidden(evt.target.checked)} />
|
||||||
type="checkbox"
|
|
||||||
checked={nodeHidden}
|
|
||||||
onChange={(evt) => setNodeHidden(evt.target.checked)}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</ReactFlow>
|
</ReactFlow>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useKeyPress } from '@react-flow/core';
|
import { useKeyPress } from '@react-flow/bundle';
|
||||||
|
|
||||||
const UseKeyPressComponent = () => {
|
const UseKeyPressComponent = () => {
|
||||||
const metaPressed = useKeyPress(['Meta']);
|
const metaPressed = useKeyPress(['Meta']);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
Edge,
|
Edge,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
const initialNodes: Node[] = [
|
const initialNodes: Node[] = [
|
||||||
{
|
{
|
||||||
@@ -53,8 +53,7 @@ const getId = () => `${id++}`;
|
|||||||
const UseZoomPanHelperFlow = () => {
|
const UseZoomPanHelperFlow = () => {
|
||||||
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||||
const onConnect = (params: Connection | Edge) =>
|
const onConnect = (params: Connection | Edge) => setEdges((eds) => addEdge(params, eds));
|
||||||
setEdges((eds) => addEdge(params, eds));
|
|
||||||
const {
|
const {
|
||||||
project,
|
project,
|
||||||
setCenter,
|
setCenter,
|
||||||
@@ -117,10 +116,7 @@ const UseZoomPanHelperFlow = () => {
|
|||||||
addEdges({ id: 'e3-4', source: '3', target: '4' });
|
addEdges({ id: 'e3-4', source: '3', target: '4' });
|
||||||
}, [addEdges]);
|
}, [addEdges]);
|
||||||
|
|
||||||
const onResetNodes = useCallback(
|
const onResetNodes = useCallback(() => setNodesHook(initialNodes), [setNodesHook]);
|
||||||
() => setNodesHook(initialNodes),
|
|
||||||
[setNodesHook]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
@@ -138,9 +134,7 @@ const UseZoomPanHelperFlow = () => {
|
|||||||
<div style={{ position: 'absolute', left: 0, top: 0, zIndex: 100 }}>
|
<div style={{ position: 'absolute', left: 0, top: 0, zIndex: 100 }}>
|
||||||
<button onClick={() => zoomIn({ duration: 1200 })}>zoomIn</button>
|
<button onClick={() => zoomIn({ duration: 1200 })}>zoomIn</button>
|
||||||
<button onClick={() => zoomOut({ duration: 0 })}>zoomOut</button>
|
<button onClick={() => zoomOut({ duration: 0 })}>zoomOut</button>
|
||||||
<button onClick={() => fitView({ duration: 1200, padding: 0.3 })}>
|
<button onClick={() => fitView({ duration: 1200, padding: 0.3 })}>fitView</button>
|
||||||
fitView
|
|
||||||
</button>
|
|
||||||
<button onClick={onAddNode}>add node</button>
|
<button onClick={onAddNode}>add node</button>
|
||||||
<button onClick={onResetNodes}>reset nodes</button>
|
<button onClick={onResetNodes}>reset nodes</button>
|
||||||
<button onClick={logNodes}>useNodes</button>
|
<button onClick={logNodes}>useNodes</button>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { memo, FC, useMemo, CSSProperties } from 'react';
|
import React, { memo, FC, useMemo, CSSProperties } from 'react';
|
||||||
import { Handle, Position, NodeProps } from '@react-flow/core';
|
import { Handle, Position, NodeProps } from '@react-flow/bundle';
|
||||||
|
|
||||||
const nodeStyles: CSSProperties = { padding: 10, border: '1px solid #ddd' };
|
const nodeStyles: CSSProperties = { padding: 10, border: '1px solid #ddd' };
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ const CustomNode: FC<NodeProps> = ({ data }) => {
|
|||||||
return (
|
return (
|
||||||
<Handle
|
<Handle
|
||||||
key={handleId}
|
key={handleId}
|
||||||
type='source'
|
type="source"
|
||||||
position={Position.Right}
|
position={Position.Right}
|
||||||
id={handleId}
|
id={handleId}
|
||||||
style={{ top: 10 * i + data.handlePosition * 10 }}
|
style={{ top: 10 * i + data.handlePosition * 10 }}
|
||||||
@@ -23,7 +23,7 @@ const CustomNode: FC<NodeProps> = ({ data }) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={nodeStyles}>
|
<div style={nodeStyles}>
|
||||||
<Handle type='target' position={Position.Left} />
|
<Handle type="target" position={Position.Left} />
|
||||||
<div>output handle count: {data.handleCount}</div>
|
<div>output handle count: {data.handleCount}</div>
|
||||||
{handles}
|
{handles}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import {
|
|||||||
Position,
|
Position,
|
||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
} from '@react-flow/core';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import CustomNode from './CustomNode';
|
import CustomNode from './CustomNode';
|
||||||
|
|
||||||
@@ -48,10 +48,7 @@ const getId = (): string => `${id++}`;
|
|||||||
const UpdateNodeInternalsFlow = () => {
|
const UpdateNodeInternalsFlow = () => {
|
||||||
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback((params: Edge | Connection) => setEdges((els) => addEdge(params, els)), [setEdges]);
|
||||||
(params: Edge | Connection) => setEdges((els) => addEdge(params, els)),
|
|
||||||
[setEdges]
|
|
||||||
);
|
|
||||||
|
|
||||||
const updateNodeInternals = useUpdateNodeInternals();
|
const updateNodeInternals = useUpdateNodeInternals();
|
||||||
const { project } = useReactFlow();
|
const { project } = useReactFlow();
|
||||||
@@ -98,10 +95,7 @@ const UpdateNodeInternalsFlow = () => {
|
|||||||
);
|
);
|
||||||
}, [setNodes]);
|
}, [setNodes]);
|
||||||
|
|
||||||
const updateNode = useCallback(
|
const updateNode = useCallback(() => updateNodeInternals('1'), [updateNodeInternals]);
|
||||||
() => updateNodeInternals('1'),
|
|
||||||
[updateNodeInternals]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import {
|
|||||||
useNodesState,
|
useNodesState,
|
||||||
useEdgesState,
|
useEdgesState,
|
||||||
OnConnectStartParams,
|
OnConnectStartParams,
|
||||||
} from '@react-flow/core';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
import styles from './validation.module.css';
|
import styles from './validation.module.css';
|
||||||
|
|
||||||
@@ -28,27 +28,15 @@ const isValidConnection = (connection: Connection) => connection.target === 'B';
|
|||||||
const CustomInput: FC<NodeProps> = () => (
|
const CustomInput: FC<NodeProps> = () => (
|
||||||
<>
|
<>
|
||||||
<div>Only connectable with B</div>
|
<div>Only connectable with B</div>
|
||||||
<Handle
|
<Handle type="source" position={Position.Right} isValidConnection={isValidConnection} />
|
||||||
type="source"
|
|
||||||
position={Position.Right}
|
|
||||||
isValidConnection={isValidConnection}
|
|
||||||
/>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
const CustomNode: FC<NodeProps> = ({ id }) => (
|
const CustomNode: FC<NodeProps> = ({ id }) => (
|
||||||
<>
|
<>
|
||||||
<Handle
|
<Handle type="target" position={Position.Left} isValidConnection={isValidConnection} />
|
||||||
type="target"
|
|
||||||
position={Position.Left}
|
|
||||||
isValidConnection={isValidConnection}
|
|
||||||
/>
|
|
||||||
<div>{id}</div>
|
<div>{id}</div>
|
||||||
<Handle
|
<Handle type="source" position={Position.Right} isValidConnection={isValidConnection} />
|
||||||
type="source"
|
|
||||||
position={Position.Right}
|
|
||||||
isValidConnection={isValidConnection}
|
|
||||||
/>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import {
|
|||||||
Node,
|
Node,
|
||||||
Edge,
|
Edge,
|
||||||
useReactFlow,
|
useReactFlow,
|
||||||
} from '@react-flow/renderer';
|
} from '@react-flow/bundle';
|
||||||
|
|
||||||
const onNodeDrag = (_: MouseEvent, node: Node) => console.log('drag', node);
|
const onNodeDrag = (_: MouseEvent, node: Node) => console.log('drag', node);
|
||||||
const onNodeDragStop = (_: MouseEvent, node: Node) => console.log('drag stop', node);
|
const onNodeDragStop = (_: MouseEvent, node: Node) => console.log('drag stop', node);
|
||||||
|
|||||||
Reference in New Issue
Block a user