アコーディオンAccordionExperimental

見出しをクリックすると該当セクションが開閉する縦積みの UI です。

プレビュー

状態とバリエーション

1つだけ開く

FAQ や設定説明では、1つだけ開ける構成にすると読み進めやすくなります。

アイコン変更

FAQ やヘルプでは、開く前は +、開いた後は × に回転するアイコンが自然な場合があります。

複数を同時に開く

比較しながら読む仕様や設定では、複数の項目を同時に開ける方が自然です。

支払い方法と請求書を管理します。

メンバーと権限を管理します。

無効化

開閉できない項目は薄い表示にし、ホバーで理由を補足します。

プロパティ

表は横にスクロールできます
プロパティ初期値説明
type"single" | "multiple"-同時に開ける項目数を指定します。
collapsibleboolean-single の時、開いている項目を再クリックで閉じられるようにします。
disabledboolean-アコーディオン全体の操作を無効化します。
defaultValuestring | string[]-初期表示で開く項目の value です。
indicator"chevron" | "plus" | "none""chevron"トリガー右端の開閉アイコンを指定します。FAQ では plus が使いやすい場合があります。
openLabel / closeLabelstring"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 の変化を見て「開く」と「閉じる」に文言が入れ替わります。文言は LocaleProviderstrings から取るので、日本語の画面では日本語で出ます。向きの変化だけだと小さい画面では読み取りにくいので、言葉を足しています。
  • 最後の行の罫線は引かない。Accordion の外枠が全周の境界線を描いているので、AccordionItemborder-b last:border-b-0 にしてあります。最後の項目だけ線が二重に見える粗さの直しです(#695)。
  • 見出しの構造は Radix に任せる。トリガーは AccordionPrimitive.Header の中の button なので、開閉と aria-expanded の対応付けを自分では書きません。そもそも何を折りたたんでよいか、1つずつ開くか複数開くか、という判断は資料に書いてあります。

使用コンポーネント

いつ・なぜ使うか(UIXHERO)

「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。