Item
リスト、設定、ピッカー向けに、メディア、テキスト、操作を並べた行です。グループ化されたサーフェスと、行の間を滑るように移動するホバーハイライトを備えています。
pnpm dlx shadcn@latest add https://hextaui.com/r/item.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/item.tsx lib/motion.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
iOS の設定のような色付きのタイルにするには、アイコンのメディアに tone を指定し、中立的なタイルにするには未設定のままにします。項目は、render でリンク、ボタン、ラベルとしてレンダリングされると、インタラクティブになります。そのときに初めてホバー、押下、フォーカスのスタイルが付くため、静的な行がクリックできるように見えることはありません。
グループ化
variant="grouped" は項目を1つの面にまとめます。区切り線は自動で描画されてテキストの位置まで内側に寄り、先頭行と末尾行が外側の角を担い、ホバーまたはフォーカスされた行の隣の区切り線はフェードアウトします。
ホバー時のハイライト
グループ内のインタラクティブな項目は、1 つのハイライトを共有します。ハイライトはポインターの下の行に滑らかに移動し、その行の角を取り込みます。マウスまたはペンにのみ追従し、タッチには追従しません。オフにするには highlight={false} を指定します。画像メディアの角は、行と同心です。
選択可能
項目を Checkbox を囲む <label> として描画すると、行全体でチェックを切り替えられます。チェック済みのコントロール、または項目の aria-selected、aria-checked、aria-pressed によって、その行が選択状態になります。
バリアント
default は背景なし、outline は細い境界線、muted は淡い塗りつぶしです。
サイズ
size はパディング、gap、角丸、メディアをまとめて拡大縮小します。グループも gap を合わせて詰まります。
Avatar
デフォルトの <ItemMedia /> は内容を中央に配置するだけなので、Avatar や AvatarGroup をそのまま置けます。
ユーザー
人物のグループ化されたリスト。セパレーターは、メディアスロットの内容にかかわらずテキストの開始位置から始まるため、名前の下に揃います。
アクション
<ItemActions /> は、行の末尾にボタンを保持します。ボタンを含む項目自体は静的なままにして、リンクの中にボタンが入ることがないようにしてください。
ヘッダーとフッター
<ItemHeader /> と <ItemFooter /> は、コンテンツの上と下で一行分の幅を占めます。
Separator
デフォルトのグループでは、項目の間に <ItemSeparator /> を自分で配置します。
長いコンテンツ
タイトルは1行、説明は2行で切り詰められます。区切りのない文字列は行を広げずに折り返されます。
右から左
パディング、区切り線のインセット、シェブロンは文字の読み方向に従います。
| キー | アクション |
|---|---|
| Tab | リンクやボタンと同様に、ソースの順で次のインタラクティブな項目に移動します。 |
| Enter | リンクの項目では遷移し、ボタンの項目では押下されます。 |
| Space | ボタン項目を押すか、ラベル項目を切り替えます。 |
- 項目がプレーンな行である場合、グループはリストになります。リンクやボタンとしてレンダリングされた項目は独自の role を保ち、グループは list の role を外すため、マークアップは有効なままです。両方が必要な場合は、グループを
<ul>として、項目をリンクを包む<li>としてレンダリングしてください。 <ItemMedia variant="icon" />と山形アイコンは、スクリーンリーダーから隠されます。画像に意味がある場合は、適切な alt テキストを付けてください。- ハイライトは装飾です。キーボードフォーカスにはフォーカスリングが表示され、ハイライトがフォーカスを移動したりタブ順を変えたりすることはありません。
各パーツはデフォルトで <div> をレンダリングし、render と、その要素の属性を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
variant | "default" | "outline" | "muted" | "default" |
size | "default" | "sm" | "xs" | "default" |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="item" | CSSで項目を指定します。 |
data-variant | 現在のバリアント。 |
data-size | 現在のサイズ。 |
data-interactive | 項目がリンク、ボタン、ラベルとして描画されるときに付きます。 |
data-highlighted | グループのハイライトが当たっている間付きます。 |
--item-radius | 角丸の半径。メディアの角はこれから算出されます。size によって設定されます。 |
--item-px / --item-py / --item-gap | パディングと間隔。size によって設定されます。 |
--item-media-size | アイコンと画像メディアのサイズ。size によって設定されます。 |
--item-inset | グループ化された区切り線の開始位置。メディアが何であっても ItemContent に揃うように計測されます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
variantgrouped は項目を1つの面にまとめ、区切り線を自動で付けます。 | "default" | "grouped" | "default" |
highlightホバー時に、操作可能な項目の間を滑らかに移動するハイライトを1つ表示します。 | boolean | true |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="item-group" | CSSでグループを指定します。 |
data-variant | 現在のバリアント。 |
data-highlight | ホバーハイライトが有効なときに付きます。 |
--item-group-radius | グループ化された面の角丸の半径。最初と最後の項目はこれに従います。 |
data-slot="item-highlight" | ハイライト要素。data-visible と data-pressed を持ちます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
varianticon はアイコンをタイルに載せ、スクリーンリーダーからは隠します。image は正方形に切り抜きます。どちらも角は項目と同心になります。 | "default" | "icon" | "image" | "default" |
toneicon バリアントでは、iOS の設定アプリのように、タイルを単色で塗りつぶしてアイコンを白にします。未設定ならニュートラルなタイルになります。 | "gray" | "red" | "orange" | "yellow" | "green" | "teal" | "sky" | "blue" | "indigo" | "purple" | "pink" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="item-media" | CSS でメディアを指定します。 |
data-variant | 現在のバリアント。 |
data-tone | アイコンに tone を設定したときのタイルの色。 |
--item-media-tone | タイルの色。任意の色を指定するとカスタムトーンになります。 |
| 属性 | 説明 |
|---|---|
data-slot="item-content" | 行を埋めるように広がります。2 つ目のコンテンツブロックは、テキストの幅に収まります。 |
| 属性 | 説明 |
|---|---|
data-slot="item-title" | 1 行に収めます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <p> |
| 属性 | 説明 |
|---|---|
data-slot="item-description" | 2 行に収めます。 |
| 属性 | 説明 |
|---|---|
data-slot="item-actions" | CSS でアクションを指定します。 |
| 属性 | 説明 |
|---|---|
data-slot="item-header" | コンテンツの上にある全幅の行。 |
data-slot="item-footer" | コンテンツの下にある全幅の行。 |
末尾の山形アイコン。項目にホバーすると、読む方向にわずかに動きます。Tabler アイコンのすべての props を受け付けます。
| 属性 | 説明 |
|---|---|
data-slot="item-chevron" | CSS でシェブロンを指定します。 |
| 属性 | 説明 |
|---|---|
data-slot="item-separator" | role="separator" を持つ細い線。 |
- Motionすべてのコンポーネントがアニメーションに使うイージングカーブ、継続時間、モーション軽減のチェックと、サイズのモーフィングやスライドするハイライト用のフックです。
- Avatarイニシャルのフォールバック、ステータスバッジ、件数にまとめられる積み重ねグループを備えたユーザー写真です。
- Badge色付きのドットを持つステータスラベル、スライドして閉じる削除可能なタグ、新しい値へ回転するカウントです。
- Cardコンテンツをまとめるサーフェスです。3つのバリアント、端まで広がるメディア、同心円状の角丸、カード全体のリンクに対応します。
- Chartテーマ対応の色を持つRechartsのチャートです。1つの設定からラベルを読み取るツールチップと凡例、見えるフォーカスリングつきのキーボード操作に対応します。
- Data table実データのためのテーブルです。並べ替え、検索、行の選択、固定列、スティッキーヘッダー、ページネーションを備えています。