Tree
ファイルや階層向けの、ネストされた展開可能な行。インデントガイド、コネクター線、連動するチェックボックス、先頭文字検索、完全なキーボード操作に対応しています。
pnpm dlx shadcn@latest add https://hextaui.com/r/tree.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/tree.tsx components/ui/checkbox.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
<TreeGroup /> を持つ項目はブランチです。シェブロンが付き、開閉でき、矢印キーに応答します。すべての項目に、ツリー内で一意の value が必要です。
インデントガイド
variant="lines" は階層ごとにガイドを描画します。選択またはフォーカスされた行を含むブランチのガイドが濃くなるため、深いツリーでも現在地がわかります。
コネクター
variant="connectors" は、ターミナルのツリー表示のように、各項目をエルボー型の線で親につなげます。バージョン、サイズ、件数には meta を使います。
チェックボックス
checkboxes を指定すると、ブランチをチェックすることで、その内側の有効な項目がすべてチェックされ、一部だけチェックされたブランチにはダッシュが表示されます。ブランチのチェックは、後から読み込む子要素のチェックとしても数えられます。行をクリックするとチェックされ、シェブロンで開閉します。
ナビゲーション
render で行をリンクとして描画します。現在のページを selectedValues に渡してそのセクションを開き、その行に aria-current を設定します。
複数選択
selectionMode="multiple" はファイルマネージャーのように動作します。クリックで1行を選択し、Cmd/Ctrl+クリックで追加または削除し、Shift+クリックで範囲を選択します。タッチスクリーンでは、タップで行の追加または削除を行います。
制御
expandedValues と onExpandedValuesChange で、開いているブランチを自前の状態で保持します。この例では、再帰関数を使ってデータからツリーも構築しています。
遅延読み込み
<TreeItem /> の onExpandedChange で子要素を取得します。子要素が届くまで無効な読み込み行を描画すれば、ブランチはシェブロンを保ちます。
小
size="sm" は、サイドバー向けに行を短く、インデントを狭くします。どちらのサイズでも、タッチスクリーンでは行が大きくなります。
無効
無効な項目は選択、チェック、展開ができず、矢印キーでもスキップされます。無効なブランチの内側の項目も無効になります。
長い名前
名前は省略記号で切り詰められ、meta は表示されたままです。ホバー時に完全な名前を表示するには title を渡します。
右から左
インデント、コネクター、シェブロンが反転し、左右の矢印キーも入れ替わります。
| キー | アクション |
|---|---|
| ↓ | フォーカスを次に見える行に移します。 |
| ↑ | フォーカスを前に見える行に移します。 |
| → | 閉じているブランチを開きます。開いているブランチでは、フォーカスを最初の子要素に移します。 |
| ← | 開いているブランチを閉じます。それ以外では、フォーカスを親に移します。 |
| Home | フォーカスを最初の行に移します。 |
| End | フォーカスを最後に見える行に移します。 |
| Enter | 行を選択し、ブランチであれば開閉します。リンク行ではリンクをたどります。 |
| Space | 行を選択し、複数選択モードでは追加または削除し、チェックボックスがある場合はチェックします。 |
| Shift + ↑Shift + ↓ | 複数選択モードで選択範囲を拡張します。 |
| Cmd/Ctrl + A | 複数選択モードで、見えているすべての行を選択します。 |
| * | フォーカスされている行と同じ階層のすべてのブランチを開きます。 |
| a–z | 入力した文字で始まる名前を持つ次の行にフォーカスを移します。 |
ツリーは WAI-ARIA の tree view パターンに従います。各行が treeitem で、aria-owns を通じて自分のグループを所有するため、行の名前はその行自身のラベルだけになり、リンク行は本物のリンクとして機能します。タブ順に入る行は常に1つだけです。フォーカスされた行を含むブランチが閉じると、フォーカスは失われず、そのブランチに移ります。
閉じたグループもページ内に残るため、ブラウザーのページ内検索は一致箇所の周囲のフォルダーを開き、ブランチをチェックするとその内側のすべての項目が対象になります。ツリーに aria-label を付けてください。
ブランチは Base UI の collapsible で開閉します。<TreeItem /> と <TreeGroup /> は、ラップしているパーツの props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
variant | "default" | "lines" | "connectors" | "default" |
size | "default" | "sm" | "default" |
selectionMode | "none" | "single" | "multiple" | "single" |
selectedValues | string[] | – |
defaultSelectedValues | string[] | – |
onSelectedValuesChange | (values: string[]) => void | – |
expandedValues | string[] | – |
defaultExpandedValues | string[] | – |
onExpandedValuesChange | (values: string[]) => void | – |
checkboxes連動するチェックボックスを表示します。行は選択ではなくチェックされます。 | boolean | false |
checkedValuesチェックされた項目。リスト内のブランチは、その子要素をチェックしたものとして数えられます。 | string[] | – |
defaultCheckedValues | string[] | – |
onCheckedValuesChangeチェックされたすべての葉と、完全にチェックされたすべてのブランチとともに呼ばれます。 | (values: string[]) => void | – |
disabled | boolean | false |
hiddenUntilFoundページ内検索が、一致箇所の周囲の閉じたブランチを開けるようにします。 | boolean | true |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="tree" | CSSでルートを指定します。 |
data-variant | 現在のバリアント。 |
data-size | 現在のサイズ。 |
--tree-row-height | 行の高さ。タッチスクリーンでは大きくなります。 |
--tree-indent | 各階層のインデント幅。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
value必須。ツリー内で一意。 | string | – |
disabled | boolean | false |
onExpandedChangeこの項目が開閉したときに呼ばれます。 | (expanded: boolean) => void | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="tree-item" | CSSで項目を指定します。 |
data-open | 項目が開いているときに付与されます。 |
data-disabled | 項目が無効のときに存在します。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
iconラベルの前に表示されます。 | ReactNode | – |
expandedIconブランチが開いている間、icon にクロスフェードで切り替わります。 | ReactNode | – |
metaサイズ、件数、ステータスなど、行の末尾に表示されます。 | ReactNode | – |
className | string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="tree-item-label" | CSS で行を指定します。 |
data-value | 項目の値。 |
data-expanded | ブランチが開いているときに付きます。 |
data-selected | 行が選択されているときに付きます。 |
data-checked | 行がチェックされているときに付きます。 |
data-indeterminate | 一部の子要素だけがチェックされているときに付きます。 |
data-disabled | 項目が無効のときに存在します。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
className内側のラッパーに適用されるため、パディングが高さのアニメーションと干渉しません。 | string | – |
| 属性 | 説明 |
|---|---|
data-slot="tree-group" | CSSでグループを指定します。 |
data-open | グループが開いているときに付きます。 |
data-starting-style | グループが表示アニメーション中に付きます。 |
data-ending-style | グループが非表示アニメーション中に付きます。 |
--collapsible-panel-height | グループの計測された高さ。高さのアニメーションに使われます。 |
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Avatarイニシャルのフォールバック、ステータスバッジ、件数にまとめられる積み重ねグループを備えたユーザー写真です。
- Badge色付きのドットを持つステータスラベル、スライドして閉じる削除可能なタグ、新しい値へ回転するカウントです。
- Cardコンテンツをまとめるサーフェスです。3つのバリアント、端まで広がるメディア、同心円状の角丸、カード全体のリンクに対応します。
- Chartテーマ対応の色を持つRechartsのチャートです。1つの設定からラベルを読み取るツールチップと凡例、見えるフォーカスリングつきのキーボード操作に対応します。
- Data table実データのためのテーブルです。並べ替え、検索、行の選択、固定列、スティッキーヘッダー、ページネーションを備えています。
使用しているブロック
Tree の上に構築されるブロック。
- Diff Reviewエージェントによる編集を、反映される前にファイルをまたいで確認します。件数つきのファイルツリー、変更ごと、ファイルごと、またはすべてに対する承認と却下、任意の行や範囲に付けてエージェントへ返せるコメント、ユニファイドビューとスプリットビュー、単語単位のハイライト、取り消し、ストリーミングされる編集、チャット向けの「Edited 4 files」サマリーを備えています。
- Tool Callsエージェントの動作を、1ステップにつき1行で表示します。読み取りと検索は短い要約にまとめられ、編集、コマンド、承認、エラーは表示されたままになります。各ステップは、ファイル、差分、ターミナル、結果といった実際のビューに展開できます。AI SDKのすべてのツール状態に対応し、理由を添えて断る承認も含みます。