xyflow
ノードベース UI を構築するためのオープンソースライブラリ群。React Flow と Svelte Flow を pnpm workspaces + Turborepo で管理するモノレポ。カスタムノード・エッジ・コントロール・ミニマップ・パンズームなどを即座に利用できる。
pnpm workspaces Turborepo TypeScript changesets reactflow.dev svelteflow.dev
パッケージ構成
React 向けのノードベース UI コンポーネント。TypeScript ジェネリクスで Node・Edge の型安全な拡張が可能。
Svelte 向けフロー UI。writable store で nodes / edges / viewport を管理する Svelte 流儀の API。
React / Svelte 双方が共有する純粋ロジック。型定義・パスユーティリティ・パンズーム・ドラッグ・ハンドルの実装を担う。
旧安定版。v11 ブランチで別途メンテナンス中。既存プロジェクトの継続利用に対応。
ReactFlow コンポーネント — 主要 Props
| Prop | 型 | 説明 |
|---|---|---|
nodes |
NodeType[] | 表示するノードの配列(controlled モード) |
edges |
EdgeType[] | 表示するエッジの配列(controlled モード) |
defaultNodes |
NodeType[] | 初期ノード(uncontrolled モード) |
nodeTypes |
Record<string, ComponentType> | カスタムノードコンポーネントのマップ |
edgeTypes |
Record<string, ComponentType> | カスタムエッジコンポーネントのマップ |
onNodesChange |
(changes: NodeChange[]) => void | ノード位置・選択・削除変更ハンドラ |
onEdgesChange |
(changes: EdgeChange[]) => void | エッジ選択・削除変更ハンドラ |
onConnect |
(connection: Connection) => void | ハンドルからのエッジ接続時ハンドラ |
snapToGrid |
boolean | ドラッグ時にグリッドスナップを有効化 |
fitView |
boolean | 初期表示時に全ノードが収まるよう自動ズーム |
colorMode |
"light" | "dark" | "system" | テーマカラーモード(v12 新機能) |
connectionMode |
ConnectionMode | Strict(ソース→ターゲット)/ Loose(任意→任意) |
プラグインコンポーネント
<MiniMap />
全体俯瞰ミニマップ。ノードカラーをカスタマイズ可能。
<Controls />
ズームイン・アウト・フィット・ロックボタン群。
<Background />
Dots / Lines / Cross の3種類の背景パターン。
<Panel />
フロー上に固定配置できる汎用コンテナ。位置指定可。
<Handle />
カスタムノード内の接続ポイント。type="source" / "target"。
<NodeToolbar />
ノード選択時に浮かぶツールバーコンテナ。
<NodeResizer />
ノードをドラッグでリサイズするハンドル。
<EdgeLabel />
エッジ中央に配置できるラベルコンポーネント。
フック一覧
useReactFlow()
ノード・エッジ操作・ビューポート制御の全メソッドを返す主力フック。getNodes()・setNodes()・fitView()など。
useNodesState(init)
[nodes, setNodes, onNodesChange] を返すコンビニエンスフック。controlled モードのボイラープレートを削減。
useEdgesState(init)
[edges, setEdges, onEdgesChange] を返す。useNodesState のエッジ版。
useNodes()
現在のノード配列を購読するセレクタフック。変更がある時のみ再レンダリング。
useEdges()
現在のエッジ配列を購読。useNodes の edges 版。
useViewport()
{ x, y, zoom } を返す。スクロール・ズーム状態の読み取り専用サブスクリプション。
useKeyPress(keyCode)
指定キーの押下状態を boolean で返す。ショートカット実装に。
useOnViewportChange(opts)
ビューポート変更の onStart / onChange / onEnd コールバックを登録。
useHandleConnections(opts)
特定ハンドルへの接続一覧を返す。ハンドルの接続状態に応じたスタイリングに。
useNodeConnections(opts)
ノード全体への接続一覧を取得。source / target でフィルタ可能。
useNodesData(ids)
指定ノード ID の data フィールドを型安全に取得する。
useInternalNode(id)
内部 Node オブジェクト(measured・positionAbsolute 含む)にアクセス。
Svelte Flow — API 対比
React Flow と同じ機能を持ちながら、Svelte の reactive store パラダイムに沿った API を提供。nodes / edges を writable() で持ち、リアクティビティは Svelte の仕組みに委ねる。
const [nodes, setNodes, onNodesChange]
= useNodesState(initialNodes);
<ReactFlow
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
>
<MiniMap />
<Controls />
<Background />
</ReactFlow>
const nodes = writable(initialNodes);
const edges = writable(initialEdges);
<SvelteFlow
{nodes}
{edges}
fitView
on:nodeclick={handleClick}
>
<Controls />
<Background variant={Dots} />
<MiniMap />
</SvelteFlow>
Svelte Flow エクスポート一覧
| カテゴリ | エクスポート |
|---|---|
| メインコンポーネント | SvelteFlow |
| エッジ | BezierEdge · StepEdge · SmoothStepEdge · StraightEdge · BaseEdge |
| プラグイン | Controls · Background · Minimap · NodeToolbar · EdgeToolbar · NodeResizer |
| コンポーネント | Handle · EdgeLabel · EdgeReconnectAnchor · SvelteFlowProvider · ViewportPortal · Panel |
| フック (Svelte 5 rune) | useSvelteFlow() · useUpdateNodeInternals() · useConnection() · useNodesData() · useNodeConnections() |
| ストア | useStore() |
はじめ方
# React Flow v12
npm install @xyflow/react
# Svelte Flow
npm install @xyflow/svelte
// React
import '@xyflow/react/dist/style.css';
// Svelte
import '@xyflow/svelte/dist/style.css';
import { useCallback } from 'react';
import {
ReactFlow, MiniMap, Controls, Background,
useNodesState, useEdgesState, addEdge,
} from '@xyflow/react';
import '@xyflow/react/dist/style.css';
const initialNodes = [
{ id: '1', position: { x: 0, y: 0 }, data: { label: 'Node 1' } },
{ id: '2', position: { x: 0, y: 100 }, data: { label: 'Node 2' } },
];
const initialEdges = [{ id: 'e1-2', source: '1', target: '2' }];
export default function Flow() {
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
const onConnect = useCallback(
(params) => setEdges((eds) => addEdge(params, eds)),
[setEdges],
);
return (
<ReactFlow
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
>
<MiniMap />
<Controls />
<Background />
</ReactFlow>
);
}
import { Handle, Position } from '@xyflow/react';
// 1. カスタムノードコンポーネント定義
function TextNode({ data }) {
return (
<div className="text-node">
<Handle type="target" position={Position.Top} />
<p>{data.label}</p>
<Handle type="source" position={Position.Bottom} />
</div>
);
}
// 2. nodeTypes に渡す
const nodeTypes = { text: TextNode };
// 3. ReactFlow に nodeTypes prop として渡す
<ReactFlow nodeTypes={nodeTypes} ... />