Foundation
PackagesUIComponentsTables

Table

データを行と列で表示するテーブルコンポーネント。請求書一覧、ユーザーリスト等の構造化データの表示に使用する。

いつ使うか

  • 構造化されたデータを行と列で表示するときに使用する
  • ヘッダー、フッター、キャプションを含む静的なテーブルレイアウトに使用する

いつ使わないか

  • ソート・フィルタ・ページネーション等のインタラクティブなデータ操作が必要な場合は DataTable を使用する
  • キーバリューペアの表示には、定義リスト (dl) の使用を検討する

Usage

import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from '@bi-shop-it/ui/table';

<Table>
  <TableHeader>
    <TableRow>
      <TableHead>名前</TableHead>
      <TableHead>メールアドレス</TableHead>
    </TableRow>
  </TableHeader>
  <TableBody>
    <TableRow>
      <TableCell>田中 太郎</TableCell>
      <TableCell>[email protected]</TableCell>
    </TableRow>
  </TableBody>
</Table>;

Props

すべてのコンポーネントは children: ReactNode を受け取る。

TableHead / TableCell

Propデフォルト説明
align'left' | 'center' | 'right''left'テキストの水平揃え
highlight'muted' | 'info' | 'success' | 'warning' | 'destructive'セルの背景色。意味ベースで指定する
sticky'left' | 'top' | ('left' | 'top')[]スクロール時にセルを固定する辺。縦横両方を固定する角セルは ['left', 'top'] を渡す
colSpannumber結合する列数
rowSpannumber結合する行数

TableCell は上記に加えて verticalAlign を受け取る。

Propデフォルト説明
verticalAlign'top' | 'middle' | 'bottom''middle'内容の垂直揃え

TableRow

Propデフォルト説明
highlight'muted' | 'info' | 'success' | 'warning' | 'destructive'行の背景色。意味ベースで指定する
onClick() => void行クリック時のハンドラ。指定時は行全体がクリック可能になりキーボード操作も有効

Table

Propデフォルト説明
maxHeight'sm' | 'md' | 'lg' | 'xl'スクロール領域の高さ上限。sticky="top" で縦方向にヘッダーを固定する場合に指定する

sticky="top" は、スクロール領域自体が縦スクロールしないと機能しない。maxHeight で高さを制限し、縦スクロールコンテナにする必要がある。

その他のコンポーネント

コンポーネントHTML 要素説明
Table<table>テーブルのルート。スクロール対応
TableHeader<thead>ヘッダー行のグループ
TableBody<tbody>データ行のグループ
TableFooter<tfoot>フッター行のグループ
TableRow<tr>テーブル行
TableCaption<caption>テーブルのキャプション

状態

デフォルト

キャプション、ヘッダー、フッターを含む完全なテーブル。

最近の請求書一覧
請求書番号ステータス支払方法金額
INV-001支払済銀行振込¥250,000
INV-002未払いクレジットカード¥150,000
INV-003支払済銀行振込¥350,000
INV-004支払済口座振替¥450,000
INV-005未払いクレジットカード¥550,000
合計¥1,750,000
<Table>
  <TableCaption>最近の請求書一覧</TableCaption>
  <TableHeader>
    <TableRow>
      <TableHead>請求書番号</TableHead>
      <TableHead>ステータス</TableHead>
      <TableHead>支払方法</TableHead>
      <TableHead align="right">金額</TableHead>
    </TableRow>
  </TableHeader>
  <TableBody>
    <TableRow>
      <TableCell>INV-001</TableCell>
      <TableCell>支払済</TableCell>
      <TableCell>銀行振込</TableCell>
      <TableCell align="right">¥250,000</TableCell>
    </TableRow>
  </TableBody>
  <TableFooter>
    <TableRow>
      <TableCell colSpan={3}>合計</TableCell>
      <TableCell align="right">¥1,750,000</TableCell>
    </TableRow>
  </TableFooter>
</Table>

シンプル

ヘッダーとデータ行のみのシンプルなテーブル。

名前メールアドレス役割
田中 太郎[email protected]管理者
佐藤 花子[email protected]編集者
鈴木 一郎[email protected]閲覧者
<Table>
  <TableHeader>
    <TableRow>
      <TableHead>名前</TableHead>
      <TableHead>メールアドレス</TableHead>
      <TableHead>役割</TableHead>
    </TableRow>
  </TableHeader>
  <TableBody>
    <TableRow>
      <TableCell>田中 太郎</TableCell>
      <TableCell>[email protected]</TableCell>
      <TableCell>管理者</TableCell>
    </TableRow>
  </TableBody>
</Table>

行クリック

TableRowonClick を渡すと、その行全体がクリック可能になる。マウスクリックに加え、フォーカス時の Enter / Space キーでも発火する。

名前メールアドレス
田中 太郎[email protected]
佐藤 花子[email protected]
鈴木 一郎[email protected]
<Table>
  <TableHeader>
    <TableRow>
      <TableHead>名前</TableHead>
      <TableHead>メールアドレス</TableHead>
    </TableRow>
  </TableHeader>
  <TableBody>
    {users.map((user) => (
      <TableRow key={user.id} onClick={() => router.push(`/users/${user.id}`)}>
        <TableCell>{user.name}</TableCell>
        <TableCell>{user.email}</TableCell>
      </TableRow>
    ))}
  </TableBody>
</Table>

行内に TextLink やボタン等のインタラクティブ要素を置く場合、そのままでは要素クリック時にも行の onClick が発火する。要素側で event.stopPropagation() してバブリングを止めること。

<TableRow onClick={() => handleRowClick(user.id)}>
  <TableCell>
    <button
      type="button"
      onClick={(event) => {
        event.stopPropagation();
        handleEdit(user.id);
      }}
    >
      編集
    </button>
  </TableCell>
</TableRow>

アクセシビリティ

コンポーネントが内部で処理すること

  • セマンティックな HTML テーブル要素(tabletheadtbodythtd)を使用する
  • data-slot 属性でコンポーネントの役割を識別可能にする
  • onClick 付きの TableRowrole="button"tabIndex={0}、Enter / Space キーハンドラを付与する

利用者が対応すること

  • テーブルの目的を説明する TableCaption を設定すること
  • 行内にインタラクティブ要素を置く場合は event.stopPropagation() で行クリックへのバブリングを止めること

関連コンポーネント

  • DataTable — TanStack Table と組み合わせたインタラクティブなデータテーブルに使用する
  • Card — テーブルをカードでラップして視覚的にグループ化する場合に使用する

On this page