ToggleGroup
ToggleGroupは、複数のToggleをグループ化してオン/オフを管理するコンポーネントです。単一選択または複数選択モードをサポートします。
Playground
<ToggleGroup type="single" variant="outline" defaultValue="grid">
<ToggleGroup.Item value="grid" aria-label="Grid view">
<LayoutGrid />
</ToggleGroup.Item>
<ToggleGroup.Item value="list" aria-label="List view">
<List />
</ToggleGroup.Item>
</ToggleGroup>Types
Variants
Sizes
Icon Only
xssmmddefaultlg| Size | 高さ | 横パディング | アイコン | プレビュー |
|---|---|---|---|---|
xs | 28px | 10px | 14px | |
sm | 32px | 12px | 14px | |
md | 36px | 14px | 16px | |
default | 40px | 16px | 16px | |
lg | 48px | 24px | 16px |
Icon + Text
xssmmddefaultlg| Size | 高さ | 横パディング | Gap | アイコン | フォント | プレビュー |
|---|---|---|---|---|---|---|
xs | 28px | 10px | 4px | 14px | 12px | |
sm | 32px | 12px | 8px | 14px | 13px | |
md | 36px | 14px | 8px | 16px | 14px | |
default | 40px | 16px | 8px | 16px | 14px | |
lg | 48px | 24px | 8px | 16px | 16px |
Features
Use Cases
Finder, Dropbox, ECサイトの商品一覧
Figma, Framer, Flexbox方向切替
Gmail, Notion, タスク管理アプリ
// Grid/List toggle - Finder, Dropbox style
<ToggleGroup type="single" variant="outline" defaultValue="grid">
<ToggleGroup.Item value="grid" aria-label="Grid view">
<LayoutGrid />
</ToggleGroup.Item>
<ToggleGroup.Item value="list" aria-label="List view">
<List />
</ToggleGroup.Item>
</ToggleGroup>
// Row/Column layout - Figma, Framer style
<ToggleGroup type="single" variant="outline" defaultValue="rows">
<ToggleGroup.Item value="rows" aria-label="Rows">
<Rows />
</ToggleGroup.Item>
<ToggleGroup.Item value="columns" aria-label="Columns">
<Columns />
</ToggleGroup.Item>
</ToggleGroup>
// Card/Compact/Detail - Gmail, Notion style
<ToggleGroup type="single" variant="outline" defaultValue="card">
<ToggleGroup.Item value="card" aria-label="Card view"><Grid /></ToggleGroup.Item>
<ToggleGroup.Item value="compact" aria-label="Compact view"><List /></ToggleGroup.Item>
<ToggleGroup.Item value="detail" aria-label="Detail view"><Rows /></ToggleGroup.Item>
</ToggleGroup>States
Default
通常状態。選択されたアイテムはハイライト表示。
Disabled
全アイテムが無効化された状態。
個別 Disabled
特定のアイテムのみ無効化。
Multiple 選択
複数のアイテムを同時に選択可能。
Orientation
Horizontal (デフォルト)
Vertical
API
Component Structure
ToggleGroup— Radix ToggleGroup.ItemPropsトグルアイテムProps
ToggleGroup
type—"single" | "multiple"単一選択 or 複数選択モード
valueundefinedstring | string[]制御モードでの選択値
defaultValueundefinedstring | string[]非制御モードでの初期選択値
onValueChangeundefined(value) => void選択変更時のコールバック
variant"default""default" | "outline"アイテムの視覚スタイル
size"default""xs" | "sm" | "md" | "default" | "lg"アイテムのサイズ (28/32/36/40/48px)
radius"default""none" | "sm" | "base" | "default" | "lg" | "xl" | "2xl" | "3xl" | "full"角丸のサイズ (6px)
fontWeight"normal""normal" | "semibold"フォント太さ。全アイテムに適用。個別ItemのfontWeightで上書き可能
orientation"horizontal""horizontal" | "vertical"レイアウト方向
disabledfalseboolean全アイテム無効状態
| Name | Type | Default | Description |
|---|---|---|---|
type | "single" | "multiple" | — | 単一選択 or 複数選択モード |
value | string | string[] | undefined | 制御モードでの選択値 |
defaultValue | string | string[] | undefined | 非制御モードでの初期選択値 |
onValueChange | (value) => void | undefined | 選択変更時のコールバック |
variant | "default" | "outline" | "default" | アイテムの視覚スタイル |
size | "xs" | "sm" | "md" | "default" | "lg" | "default" | アイテムのサイズ (28/32/36/40/48px) |
radius | "none" | "sm" | "base" | "default" | "lg" | "xl" | "2xl" | "3xl" | "full" | "default" | 角丸のサイズ (6px) |
fontWeight | "normal" | "semibold" | "normal" | フォント太さ。全アイテムに適用。個別ItemのfontWeightで上書き可能 |
orientation | "horizontal" | "vertical" | "horizontal" | レイアウト方向 |
disabled | boolean | false | 全アイテム無効状態 |
ToggleGroup.Item
value—stringアイテムの一意な値
disabledfalseboolean個別の無効状態
variantinherit"default" | "outline"個別のスタイル上書き
sizeinherit"xs" | "sm" | "md" | "default" | "lg"個別のサイズ上書き
radiusinherit"none" | "sm" | ... | "full"個別の角丸上書き
fontWeightinherit"normal" | "semibold"個別のフォント太さ上書き
| Name | Type | Default | Description |
|---|---|---|---|
value | string | — | アイテムの一意な値 |
disabled | boolean | false | 個別の無効状態 |
variant | "default" | "outline" | inherit | 個別のスタイル上書き |
size | "xs" | "sm" | "md" | "default" | "lg" | inherit | 個別のサイズ上書き |
radius | "none" | "sm" | ... | "full" | inherit | 個別の角丸上書き |
fontWeight | "normal" | "semibold" | inherit | 個別のフォント太さ上書き |
Customization
すべてのアイテムはデザインシステムのスペーシングルールに基づいたデフォルト値を使用します。グループのclassNameで全アイテムを一括カスタマイズできます。
横パディングの変更
className="[&>button]:px-10"Icon Onlyの幅変更
className="[&>button]:aspect-auto [&>button]:px-5"Tip:デフォルト値はコンポーネントの一貫性を保つよう設計されています。UI実装上カスタマイズが必要な場合にご活用ください。
Anatomy
Best Practices
推奨
- ✓単一選択には type="single" を使用
- ✓複数選択には type="multiple" を使用
- ✓各アイテムに aria-label を設定
- ✓関連するオプションをグループ化
避けるべき
- ✗5つ以上のアイテムを含めない
- ✗無関係なオプションを混在させない
- ✗ナビゲーションには使用しない(→ Tabs)
- ✗単一選択でSegmentedの代わりに使わない
Accessibility
キーボード操作
ARIA属性
role="group"自動付与aria-pressed自動付与data-orientation自動付与aria-label推奨
ToggleGroup vs ButtonGroup
似たような見た目ですが、用途と動作が異なります。適切なコンポーネントを選択してください。
用途
ToggleGroup: オン/オフ状態の管理
ButtonGroup: アクションボタンのグループ化
状態管理
ToggleGroup: 自動 (Radix管理)
ButtonGroup: 手動 (selected prop)
選択モード
ToggleGroup: single / multiple
ButtonGroup: 手動制御のみ
value管理
ToggleGroup: value / onValueChange
ButtonGroup: なし
ユースケース
ToggleGroup: テキスト配置、フォーマット
ButtonGroup: ページネーション、ツールバー
| 特徴 | ToggleGroup | ButtonGroup |
|---|---|---|
| 用途 | オン/オフ状態の管理 | アクションボタンのグループ化 |
| 状態管理 | 自動 (Radix管理) | 手動 (selected prop) |
| 選択モード | single / multiple | 手動制御のみ |
| value管理 | value / onValueChange | なし |
| ユースケース | テキスト配置、フォーマット | ページネーション、ツールバー |
状態を保持したい(選択/非選択)場合は ToggleGroup、クリック時にアクションを実行したい場合は ButtonGroup を使用します。