テーマ設定

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-default1
--xy-edge-stroke-selected-default#555
--xy-connectionline-stroke-default#b1b1b7
--xy-connectionline-stroke-width-default1
--xy-attribution-background-color-defaultrgba(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-defaultinherit
--xy-node-border-default1px solid #1a192b
--xy-node-background-color-default#fff
--xy-node-group-background-color-defaultrgba(240, 240, 240, 0.25)
--xy-node-boxshadow-hover-default0 1px 4px 1px rgba(0, 0, 0, 0.08)
--xy-node-boxshadow-selected-default0 0 0 0.5px #1a192b
--xy-handle-background-color-default#1a192b
--xy-handle-border-color-default#fff
--xy-selection-background-color-defaultrgba(0, 89, 220, 0.08)
--xy-selection-border-default1px 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-defaultinherit
--xy-controls-button-color-hover-defaultinherit
--xy-controls-button-border-color-default#eee
--xy-controls-box-shadow-default0 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.updatingonReconnectを介して更新されている間、Edgeに追加されます。
.react-flow__edge-pathEdgeのSVG <path /> 要素です。
.react-flow__edge-textEdgeラベルのSVG <text /> 要素です。
.react-flow__edge-textbgEdgeラベルの後ろにある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-defaultNodeのタイプが"default"の場合に追加されます。
.react-flow__node-inputNodeのタイプが"input"の場合に追加されます。
.react-flow__node-outputNodeのタイプが"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を使用する完全な例については、この例をご覧ください!