Button group
1つのコントロールとして連結されたボタンです。共有される継ぎ目、区切り線、テキストアドオン、入れ子、縦積みに対応します。
pnpm dlx shadcn@latest add https://hextaui.com/r/button-group.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/button-group.tsx components/ui/separator.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
Button group は、すでに使っているボタンを連結します。<Button /> もあわせてインストールしてください。
サイズ
各ボタンに size を設定します。連結した角はどのサイズでも直角のままで、外側の角はボタンの角丸を保ちます。
スプリットボタン
塗りのボタンは隙間なく並ぶため、間に <ButtonGroupSeparator /> を追加します。ドロップダウンのトリガーは、どのセグメントにもできます。
セパレーター
アイコンボタンの間のセパレーターと、押下状態を伝えるトグル。
グループ内のフィードバック
読み込み中、成功、エラーでボタンのラベル幅が変わると、後ろのセグメントは跳ねずにスライドして追従します。
垂直
orientation="vertical" はセグメントを縦に積みます。セパレーターは自動的に水平になります。
ネストしたグループ
グループの中のグループは、間に余白のある別々のまとまりになり、それぞれが独自に連結されます。
テキストと入力欄を含める
<ButtonGroupText /> はラベルやプレフィックスを追加します。入力欄に名前を付けるには、<label> としてレンダリングします。入力欄は行を埋めるように広がります。
無効と不正
単一のセグメントを aria-invalid で無効にしたり、マークしたりできます。無効なセグメントは隣より前面に出るため、赤いリングが隠れることはありません。
全幅
グループに幅を指定し、各ボタンに flex-1 を付けると、スペースを均等に分けられます。
fieldset として使う
フォーム内で <fieldset> を出力するには render を使います。
右から左
連結した角、セパレーター、ネストしたまとまりは、右から左のレイアウトで反転します。
| キー | アクション |
|---|---|
| Tab | セグメントを順に移動します。フォーカス中のセグメントは前面に出るため、リングと枠線が隠れることはありません。 |
| EnterSpace | フォーカス中のボタンを実行します。 |
- グループには
role="group"が付きます。「Message actions」のように、セットを説明するaria-labelを付けてください。 - アイコンのみのセグメントには、それぞれ
aria-labelが必要です。 - セパレーターは、正しい向きを持つ separator として公開されます。線が見た目だけの場合は
decorativeを追加します。
各パーツは <div> をレンダリングし、その属性を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="button-group" | CSSでグループを指定します。 |
data-orientation | 現在の向き。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
orientationデフォルトは、グループの向きと反対になります。 | "horizontal" | "vertical" | – |
decorative線をスクリーンリーダーから隠します。 | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="button-group-separator" | CSS でセパレーターを指定します。 |
data-orientation | 解決された向き。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
render<label> をレンダリングすると、グループ内の入力欄に名前を付けられます。 | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="button-group-text" | CSS でテキストのセグメントを指定します。 |