Vercel の UI SDK 0.1.0-beta.1 上に構築。API は変わる可能性があります。
Tree
Vercel の UI SDK 上のツリービュー。ファイルや入れ子のページ向けで、ファイルパス、チェックボックス、リンク、必要時に読み込む子項目に対応します。
- データ表示コンポーネント
- 7 個のパーツ
- 12 個の例
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-tree.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/ui-sdk-tree.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
UI SDK は ui-sdk というカスケードレイヤーに少しだけ独自の CSS を追加します。自分のクラスが優先されるよう、グローバルスタイルシートの先頭、Tailwind の import より上でこのレイヤーを宣言してください。
中に TreeGroup を持つ項目は枝になります。各項目に一意の value を、ツリーにアクセシブルな名前を付けます。フォーカスは項目に留まり、見える行はそのラベルなので、選択・現在・フォーカスのスタイルはすべてラベルに付けます。
子を渡さずに items を渡すと、矢印付きのスタイル済みの行が描画されます。各項目は value、label、任意の children を持ちます。
ファイルエクスプローラーには paths を渡します。フォルダーが先に並びます。activation="automatic" では矢印キーで選択され、Promise を返す onAction は完了まで行を保留中にします。
mode="multiple" では Cmd または Ctrl クリックで項目を切り替え、Shift で範囲を広げます。expandOnPress={false} にすると展開は矢印アイコンと矢印キーだけで行います。
checkable を付け、各ラベルに TreeItemCheckbox を置きます。枝をチェックすると中身がすべてチェックされ、一部だけチェックされた枝にはダッシュが出ます。
href を持つ項目はリンクとして描画されます。mode="none" と current を指定すると、現在のページに aria-current が付き、親が開き、タブ移動先になります。
子がまだない項目に branch を付けると、初めて開いたときに loadChildren が走ります。読み込み中は矢印がスピナーに、失敗すると再試行アイコンに変わります。Archive は一度だけ失敗します。
variant="lines" は開いた各グループにインデントのガイド線を描き、size="sm" は行を低くします。
createTreeController() のコントローラーで、どこからでも項目の展開・折りたたみ・選択・表示ができます。
hiddenUntilFound では閉じたグループもページに残るため、ブラウザーのページ内検索で Phobos が見つかり、Mars が開いて表示されます。
行は右からインデントされ、矢印は左を向き、左右の矢印キーが入れ替わります。
| キー | アクション |
|---|---|
| ↓↑ | 次または前の表示中の項目に移動します。 |
| → | 枝を開くか、最初の子に移動します。 |
| ← | 枝を閉じるか、親に移動します。 |
| HomeEnd | 最初または最後の表示中の項目に移動します。 |
| Alt→ | 枝とその中身をすべて開きます。 |
| * | フォーカス中の枝と同じ階層の枝をすべて開きます。 |
| Enter | 項目を選択してアクションを実行するか、リンク先へ移動します。 |
| Space | チェック可能なツリーでは項目をチェックし、それ以外では選択します。 |
| Shift↓ | 複数選択を広げます。 |
| ⌘A | 複数選択モードで表示中の項目をすべて選択します。 |
ツリーはタブ移動先が 1 つの WAI-ARIA ツリービューパターンに従います。Tab では現在のページ、選択中の項目、または最初の項目に移動します。文字を入力すると、その文字で始まる次の項目に移動します。遅い onAction の実行中は 1 秒後にスクリーンリーダーが pendingAnnouncement を読み上げるので、ページの言語で設定してください。
モーションが許可されている場合のみ、グループは高さのアニメーションで開閉します。タッチ画面では行が高くなり、強制カラーモードでは選択中と現在の行に輪郭線が付きます。
各パーツは同名の UI SDK パーツをラップし、render やパーツの状態を受け取る関数にもできる className を含むすべての props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
items階層全体。子を渡さない場合、ツリーはここからスタイル済みの行を描画します。 | TreeItemData[] | – |
pathsファイルパス。フォルダーは枝になり、/ で終わるパスは空のフォルダーです。 | string[] | – |
mode | "single" | "multiple" | "none" | "single" |
value | string | string[] | null | – |
defaultValue | string | string[] | null | – |
onValueChange | (value, details) => void | – |
activation | "automatic" | "manual" | "manual" |
expanded | string[] | – |
defaultExpanded | string[] | – |
onExpandedChange | (expanded, details) => void | – |
expandOnPress | boolean | true |
checkable | boolean | false |
checked | string[] | – |
defaultChecked | string[] | – |
onCheckedChange | (checked, details) => void | – |
checkStrategy | "leaf" | "trunk" | "branch" | "independent" | "leaf" |
onAction押したときや Enter で実行されます。Promise を返すと項目が保留中になります。 | (value, details) => unknown | – |
pendingAnnouncement | string | – |
loadChildren | (value, { signal }) => Promise<unknown> | – |
current | string | null | – |
disabled | boolean | false |
hiddenUntilFound | boolean | false |
keepMounted | boolean | false |
variant | "default" | "lines" | "default" |
size | "default" | "sm" | "default" |
controllercreateTreeController() から作成します。 | TreeController | – |
| 属性 | 説明 |
|---|---|
data-slot="tree" | CSS でツリーを指定します。 |
data-variant | バリアント:default または lines。 |
data-size | サイズ:default または sm。 |
--tree-row-height | 各行の高さ。size で設定します。 |
--tree-indent | 各階層のインデント幅。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
valueツリー内で一意。 | string | – |
branch子を後で読み込む枝に指定します。 | boolean | – |
disabled | boolean | false |
labelラベルがプレーンテキストでないときに、先行入力で照合するテキスト。 | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| 属性 | 説明 |
|---|---|
data-slot="tree-item" | CSS で項目を指定します。フォーカスを持ちます。 |
data-level | 1 から始まる深さ。 |
data-branch | 枝に付きます。 |
data-expanded | 枝が開いている間に付きます。 |
--tree-level | フラットなリストをインデントするための深さ。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | – |
| 属性 | 説明 |
|---|---|
data-slot="tree-label" | CSS で行を指定します。 |
data-selected | 項目が選択されている間に付きます。 |
data-current | 現在のページの項目に付きます。 |
data-expanded | 枝が開いている間に付きます。 |
data-pending | 項目の onAction の実行中に付きます。 |
data-disabled | 項目が無効のときに存在します。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
children既定は山形の矢印、読み込み中はスピナー、失敗後は再試行アイコンです。 | ReactNode | (state) => ReactNode | – |
| 属性 | 説明 |
|---|---|
data-slot="tree-indicator" | CSS でシェブロンを指定します。 |
data-loading | 子の読み込み中に付きます。 |
data-failed | 子の読み込みに失敗した後に付きます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
children既定はチェック、混在時はダッシュです。 | ReactNode | (state) => ReactNode | – |
| 属性 | 説明 |
|---|---|
data-slot="tree-checkbox" | CSS でチェックボックスを指定します。 |
data-checked | チェック中に付きます。 |
data-indeterminate | 枝が一部だけチェックされている間に付きます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
keepMounted | boolean | – |
hiddenUntilFound | boolean | – |
| 属性 | 説明 |
|---|---|
data-slot="tree-group" | CSS でグループを指定します。 |
data-open | 開いている間存在します。 |
--tree-group-height | アニメーション中のグループの高さ。 |
- Avatarイニシャルのフォールバック、ステータスバッジ、件数にまとめられる積み重ねグループを備えたユーザー写真です。
- Badge色付きのドットを持つステータスラベル、スライドして閉じる削除可能なタグ、新しい値へ回転するカウントです。
- Cardコンテンツをまとめるサーフェスです。3つのバリアント、端まで広がるメディア、同心円状の角丸、カード全体のリンクに対応します。
- Chartテーマ対応の色を持つRechartsのチャートです。1つの設定からラベルを読み取るツールチップと凡例、見えるフォーカスリングつきのキーボード操作に対応します。
- Data table実データのためのテーブルです。並べ替え、検索、行の選択、固定列、スティッキーヘッダー、ページネーションを備えています。
- Itemリスト、設定、ピッカー向けに、メディア、テキスト、操作を並べた行です。グループ化されたサーフェスと、行の間を滑るように移動するホバーハイライトを備えています。