アコーディオンAccordionExperimental
見出しをクリックすると該当セクションが開閉する縦積みの UI です。
プレビュー
状態とバリエーション
1つだけ開く
FAQ や設定説明では、1つだけ開ける構成にすると読み進めやすくなります。
アイコン変更
FAQ やヘルプでは、開く前は +、開いた後は × に回転するアイコンが自然な場合があります。
複数を同時に開く
比較しながら読む仕様や設定では、複数の項目を同時に開ける方が自然です。
無効化
開閉できない項目は薄い表示にし、ホバーで理由を補足します。
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| type | "single" | "multiple" | - | 同時に開ける項目数を指定します。 |
| collapsible | boolean | - | single の時、開いている項目を再クリックで閉じられるようにします。 |
| disabled | boolean | - | アコーディオン全体の操作を無効化します。 |
| defaultValue | string | string[] | - | 初期表示で開く項目の value です。 |
| indicator | "chevron" | "plus" | "none" | "chevron" | トリガー右端の開閉アイコンを指定します。FAQ では plus が使いやすい場合があります。 |
| openLabel / closeLabel | string | "Open" / "Close" | アイコンホバー時に表示するツールチップ文言です。 |
使い方
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@gunjo/ui";
const sections = [
{
id: "billing",
title: "請求設定",
body: "支払い方法、請求書、更新日を確認できます。",
},
{
id: "team",
title: "チーム設定",
body: "メンバー招待と権限を管理できます。",
},
];
export function SettingsAccordion() {
return (
<Accordion type="single" collapsible className="w-full max-w-md">
{sections.map((section) => (
<AccordionItem key={section.id} value={section.id}>
<AccordionTrigger>{section.title}</AccordionTrigger>
<AccordionContent>{section.body}</AccordionContent>
</AccordionItem>
))}
</Accordion>
);
}設計の判断
- 開いているかどうかを、形と言葉の両方で出す。
AccordionTriggerの指標はchevron(開くと180度回る)・plus(開くと45度回って×に見える)・noneから選べます。さらに指標にはツールチップが付いていて、data-stateの変化を見て「開く」と「閉じる」に文言が入れ替わります。文言はLocaleProviderのstringsから取るので、日本語の画面では日本語で出ます。向きの変化だけだと小さい画面では読み取りにくいので、言葉を足しています。 - 最後の行の罫線は引かない。
Accordionの外枠が全周の境界線を描いているので、AccordionItemはborder-b last:border-b-0にしてあります。最後の項目だけ線が二重に見える粗さの直しです(#695)。 - 見出しの構造は Radix に任せる。トリガーは
AccordionPrimitive.Headerの中のbuttonなので、開閉とaria-expandedの対応付けを自分では書きません。そもそも何を折りたたんでよいか、1つずつ開くか複数開くか、という判断は資料に書いてあります。
使用コンポーネント
関連コンポーネント
いつ・なぜ使うか(UIXHERO)
「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。