kaze風
Table
テーブル
プレビュー
| 名前 | メール | 役割 |
|---|---|---|
| 堀内昌平 | shohei.horiuchi@norn.co.jp | 管理者 |
| 志摩このみ | konomi.shima@norn.co.jp | 編集者 |
| 野々村圭 | kei.nonomura@norn.co.jp | 閲覧者 |
並べ替え(売上の降順)
| 渋谷 | ¥4,820,000 | +12.4% |
| 梅田 | ¥3,915,000 | +3.1% |
| 天神 | ¥2,140,000 | −1.8% |
使いどころ
使う場面
- 同じ項目を持つ複数のデータを、行と列で比べる(ユーザー一覧、請求履歴、成績表)
- 数値の列は右揃えにして、桁をそろえる。TableCell に className="table__cell--numeric" を付けると、右揃えと等幅数字(tabular-nums)になる。見出しのセルは左揃えのまま
- 並べ替えられる列は、TableHead に onSort と sortDirection を渡す。見出しがボタンになり、矢印が付く。並べ替えの状態管理は useTableSort が引き受ける(押すたびに 昇順、降順、解除)
- 行数が多いときは compact で密度を上げる。Table は横にあふれると table-wrapper 内でスクロールする
使わない場面
- 1 件ずつの詳細表示や、列が 2 つ程度の項目と値の組。DescriptionList を使う
- 見た目を揃えるためのレイアウト。Grid や layout を使う
- モバイルで列が多い一覧をそのまま出すこと。重要な列に絞るか、List に切り替える
使い方
import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell, useTableSort } from "kaze-design-system";
const rows = [
{ store: "渋谷", sales: 4820000 },
{ store: "梅田", sales: 3915000 },
];
const { rows: sorted, getSortProps } = useTableSort(rows, {
initial: { key: "sales", direction: "descending" },
});
<Table>
<TableHeader>
<TableRow>
<TableHead {...getSortProps("store")}>店舗</TableHead>
<TableHead className="table__cell--numeric" {...getSortProps("sales")}>売上</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{sorted.map((row) => (
<TableRow key={row.store}>
<TableCell>{row.store}</TableCell>
<TableCell className="table__cell--numeric">{row.sales}</TableCell>
</TableRow>
))}
</TableBody>
</Table>プロパティ
| 名前 | 型 | デフォルト | 説明 |
|---|---|---|---|
compact | boolean | なし | 行の高さを詰める |
Table | コンポーネント | なし | テーブルのルート要素 |
TableHeader | サブコンポーネント | なし | テーブルのヘッダー部分(thead) |
TableBody | サブコンポーネント | なし | テーブルの本体部分(tbody) |
TableRow | サブコンポーネント | なし | テーブルの行(tr) |
TableHead | サブコンポーネント | なし | ヘッダーセル(th)。onSort を渡すと見出しが並べ替えボタンになり、sortDirection(ascending / descending / none)で矢印と aria-sort が決まる |
TableCell | サブコンポーネント | なし | データセル(td) |
型と必須かどうかはソースの型定義から自動で生成しています。表にない HTML 標準の属性(className や aria-* など)も、ルート要素にそのまま渡せます。
キーボード操作
| キー | 動作 |
|---|---|
| Tab | onSort がある列見出しのボタンにフォーカスを移す |
| Enter / Space | その列で並べ替える(昇順、降順、解除の順に切り替わる) |
アクセシビリティ
- TableHead は scope="col" が既定。行見出しの列には scope="row" を指定する
- 表のタイトルは、近くの見出しか aria-label / aria-labelledby で付ける。Table 自体は名前を持たない
- 並べ替え中の列には aria-sort が付く(並べ替えていない列には付けない)。並べ替えるかどうかは onSort で利用側が決める。選択の状態は、見た目だけにせずチェックボックスのラベルで伝える
- onSort を渡した見出しは <button> になる。Tab で見出しにフォーカスし、Enter か Space で並べ替える。矢印は装飾で、状態は aria-sort で伝わる
文言
- 列見出しは名詞で短く。単位は見出しに入れる(「金額(円)」)。セルごとに単位を繰り返さない
- 数値は小数の桁数をそろえ、3 桁区切りにする。空欄は「-」を使い、0 と区別する