テーマ設定
React Flowは、高度なカスタマイズを念頭に置いて構築されました。多くのユーザーがReact Flowのルックアンドフィールを完全に変え、独自のブランドやデザインシステムに適合させています。このガイドでは、React Flowの外観をカスタマイズするさまざまな方法を紹介します。
デフォルトスタイル
React Flowのデフォルトスタイルは、組み込みノードで作業を開始するのに十分です。これらは、パディング、ボーダー半径、アニメーション化されたエッジなどのスタイルについて、いくつかの適切なデフォルトを提供します。以下にその外観を示します。
App.jsx
ファイルまたはその他のエントリポイントでインポートすることで、通常はこれらのデフォルトスタイルをロードします。
import '@xyflow/react/dist/style.css';
カスタムノードとエッジに深入ることなく、React Flowの基本的な外観をスタイリングするには3つの方法があります。
style
プロップによるインラインスタイルの適用- カスタムCSSによる組み込みクラスの上書き
- React Flowが使用するCSS変数のオーバーライド
組み込みのダークモードとライトモード
ダークモードの例に示されているように、colorMode
プロップ('dark'、'light'、または'system')を使用して、組み込みのカラーモードのいずれかを選択できます。
import ReactFlow from '@xyflow/react';
export default function Flow() {
return <ReactFlow colorMode="dark" nodes={[...]} edges={[...]} />
}
colorMode
プロップを使用すると、React Flowはルート要素(.react-flow
)にクラスを追加し、これを使用してカラーモードに基づいてフローをスタイル設定できます。
.dark .react-flow__node {
background: #777;
color: white;
}
.light .react-flow__node {
background: white;
color: #111;
}
style
プロップによるカスタマイズ
フローのルックアンドフィールのカスタマイズを開始する最も簡単な方法は、多くのReact Flowコンポーネントにあるstyle
プロップを使用して、独自のCSSをインラインで追加することです。
import ReactFlow from '@xyflow/react'
const styles = {
background: 'red',
width: '100%',
height: 300,
};
export default function Flow() {
return <ReactFlow style={styles} nodes={[...]} edges={[...]} />
}
CSS変数
デフォルトスタイルを完全に置き換えるのではなく、全体的なルックアンドフィールを調整するだけの場合、ライブラリ全体で使用しているCSS変数のいくつかをオーバーライドできます。
これらの変数は、ほとんどが自明です。以下は、調整する可能性のあるすべての変数と、参照のためのデフォルト値を示す表です。
変数名 | デフォルト |
---|---|
--xy-edge-stroke-default | #b1b1b7 |
--xy-edge-stroke-width-default | 1 |
--xy-edge-stroke-selected-default | #555 |
--xy-connectionline-stroke-default | #b1b1b7 |
--xy-connectionline-stroke-width-default | 1 |
--xy-attribution-background-color-default | rgba(255, 255, 255, 0.5) |
--xy-minimap-background-color-default | #fff |
--xy-background-pattern-dot-color-default | #91919a |
--xy-background-pattern-line-color-default | #eee |
--xy-background-pattern-cross-color-default | #e2e2e2 |
--xy-node-color-default | inherit |
--xy-node-border-default | 1px solid #1a192b |
--xy-node-background-color-default | #fff |
--xy-node-group-background-color-default | rgba(240, 240, 240, 0.25) |
--xy-node-boxshadow-hover-default | 0 1px 4px 1px rgba(0, 0, 0, 0.08) |
--xy-node-boxshadow-selected-default | 0 0 0 0.5px #1a192b |
--xy-handle-background-color-default | #1a192b |
--xy-handle-border-color-default | #fff |
--xy-selection-background-color-default | rgba(0, 89, 220, 0.08) |
--xy-selection-border-default | 1px dotted rgba(0, 89, 220, 0.8) |
--xy-controls-button-background-color-default | #fefefe |
--xy-controls-button-background-color-hover-default | #f4f4f4 |
--xy-controls-button-color-default | inherit |
--xy-controls-button-color-hover-default | inherit |
--xy-controls-button-border-color-default | #eee |
--xy-controls-box-shadow-default | 0 0 2px 1px rgba(0, 0, 0, 0.08) |
これらの変数は、React Flowのさまざまな要素のデフォルトを定義するために使用されます。つまり、要素ごとにインラインスタイルまたはカスタムクラスによってオーバーライドできます。これらの変数をオーバーライドする場合は、次のようにします。
.react-flow {
--xy-node-background-color-default: #ff5050;
}
これらの変数は.react-flow
と:root
の下で定義されていることに注意してください。
組み込みクラスの上書き
インラインスタイルの多用はアンチパターンだと考える人もいます。その場合は、React Flowが使用する組み込みクラスを独自のCSSでオーバーライドできます。React Flowにはあらゆる種類の要素に多くのクラスが添付されていますが、オーバーライドする可能性のあるクラスは以下にリストされています。
クラス名 | 説明 |
---|---|
.react-flow | 最外側のコンテナ |
.react-flow__renderer | 内部コンテナ |
.react-flow__zoompane | ズームとパンペイン |
.react-flow__selectionpane | 選択ペイン |
.react-flow__selection | ユーザー選択 |
.react-flow__edges | フロー内のすべてエッジを含む要素 |
.react-flow__edge | フロー内の各Edge に適用されます。 |
.react-flow__edge.selected | 選択時にEdge に追加されます。 |
.react-flow__edge.animated | その`animated`プロパティが`true`の場合、Edge に追加されます。 |
.react-flow__edge.updating | onReconnect を介して更新されている間、Edge に追加されます。 |
.react-flow__edge-path | Edge のSVG <path /> 要素です。 |
.react-flow__edge-text | Edge ラベルのSVG <text /> 要素です。 |
.react-flow__edge-textbg | Edge ラベルの後ろにあるSVG <text /> 要素です。 |
.react-flow__connection | 現在の接続線に適用されます。 |
.react-flow__connection-path | 接続線のSVG <path /> です。 |
.react-flow__nodes | フロー内のすべてのノードを含む要素です。 |
.react-flow__node | フロー内の各Node に適用されます。 |
.react-flow__node.selected | 選択されたNode に追加されます。 |
.react-flow__node-default | Node のタイプが"default" の場合に追加されます。 |
.react-flow__node-input | Node のタイプが"input" の場合に追加されます。 |
.react-flow__node-output | Node のタイプが"output" の場合に追加されます。 |
.react-flow__nodesselection | ノードの選択 |
.react-flow__nodesselection-rect | ノード選択矩形 |
.react-flow__handle | 各<Handle /> コンポーネントに適用されます。 |
.react-flow__handle-top | ハンドルのPosition が"top" に設定されている場合に適用されます。 |
.react-flow__handle-right | ハンドルのPosition が"right" に設定されている場合に適用されます。 |
.react-flow__handle-bottom | ハンドルのPosition が"bottom" に設定されている場合に適用されます。 |
.react-flow__handle-left | ハンドルのPosition が"left" に設定されている場合に適用されます。 |
.connectingfrom | 接続線がハンドルの上に来ている場合、ハンドルに追加されます。 |
.connectingto | 接続線がハンドルの上に来ている場合、ハンドルに追加されます。 |
.valid | 接続線がハンドルの上にあり、接続が有効な場合、ハンドルに追加されます。 |
.react-flow__background | <Background /> コンポーネントに適用されます。 |
.react-flow__minimap | <MiniMap /> コンポーネントに適用されます。 |
.react-flow__controls | <Controls /> コンポーネントに適用されます。 |
ソースコードを調べて他のクラスを上書きしようとする場合は注意してください。一部のクラスは内部的に使用されており、ライブラリの機能には必須です。それらを置き換えると、予期しないバグやエラーが発生する可能性があります!
サードパーティソリューション
React Flowのデフォルトのスタイルを完全に無効にして、代わりにサードパーティのスタイルソリューションを使用することを選択できます。これを行う場合は、基本スタイルをインポートし続ける必要があります。
import '@xyflow/react/dist/base.css';
これらの基本スタイルは、React Flowが正しく機能するために**必須**です。インポートしない場合、または独自のスタイルで上書きした場合、予期しない動作をする可能性があります!
Styled Components
<MiniMap />
など、直接レンダリングする多くのコンポーネントは、className
プロパティとstyle
プロパティの両方をサポートしています。つまり、Styled Componentsなど、好きなスタイルソリューションを使用できます。
import { MiniMap } from '@xyflow/react';
const StyledMiniMap = styled(MiniMap)`
background-color: ${(props) => props.theme.bg};
.react-flow__minimap-mask {
fill: ${(props) => props.theme.minimapMaskBg};
}
.react-flow__minimap-node {
fill: ${(props) => props.theme.nodeBg};
stroke: none;
}
`;
React FlowでStyled Componentsを使用する完全な例については、この例をご覧ください!
Tailwind CSS
カスタムノードとエッジは単なるReactコンポーネントであり、任意のスタイルソリューションを使用してスタイルを設定できます。たとえば、ノードのスタイル設定にTailwindを使用できます。
function CustomNode({ data }) {
return (
<div className="px-4 py-2 shadow-md rounded-md bg-white border-2 border-stone-400">
<div className="flex">
<div className="rounded-full w-12 h-12 flex justify-center items-center bg-gray-100">
{data.emoji}
</div>
<div className="ml-2">
<div className="text-lg font-bold">{data.name}</div>
<div className="text-gray-500">{data.job}</div>
</div>
</div>
<Handle
type="target"
position={Position.Top}
className="w-16 !bg-teal-500"
/>
<Handle
type="source"
position={Position.Bottom}
className="w-16 !bg-teal-500"
/>
</div>
);
}
デフォルトのスタイルを上書きする場合は、React Flowの基本スタイルの後にTailwindのエントリーポイントをインポートしてください。
import '@xyflow/react/dist/style.css';
import 'tailwind.css';
React FlowでTailwindを使用する完全な例については、この例をご覧ください!