Toggle
オンとオフを保持するボタンです。押すと塗りが定着し、ホバーからオンへの変化が明確で、アイコンを状態に合わせて塗りつぶせます。
pnpm dlx shadcn@latest add https://hextaui.com/r/toggle.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/toggle.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
オフの toggle にホバーすると淡い色味が表示され、オンにすると濃い塗りが定着してラベルが最大のコントラストになるため、オンがホバーに見えることはありません。
アウトライン
variant="outline" は境界線と面を追加します。単独で置く toggle 向けです。
テキスト付き
アイコンとラベルが並びます。表示されるテキストを持つ toggle には aria-label は不要です。
オン時は塗りつぶし
outline のアイコンに group-data-pressed/toggle:fill-current を追加すると、toggle がオンになるとき塗りつぶされます。
サイズ
sm、default、lg。アイコンのみの toggle は正方形のままです。
Pill
shape="pill" は両端を完全に丸めます。チャットのコンポーザーのような、角丸の面の内側にある toggle 向けです。
無効
無効な toggle はオンかどうかを表示し続けますが、押すこともフォーカスすることもできません。
制御
pressed と onPressedChange を渡します。ラベルは変わらず、アイコンが状態に従います。
右から左
アイコンがラベルの右側で先行します。
| キー | アクション |
|---|---|
| SpaceEnter | フォーカスされている toggle をオンまたはオフにします。 |
| Tab | 次の toggle にフォーカスを移します。 |
- toggle は
aria-pressedを持つbuttonなので、スクリーンリーダーがオンかどうかを読み上げます。 - アイコンのみの toggle には、操作を表す
aria-label(「Mute microphone」など)を付け、両方の状態で同じに保ってください。押下状態に加えてこれも変えると、二重否定のように読み上げられます。 - タッチスクリーンではヒット領域が最低44pxまで広がります。ただし、隣が重なってしまう toggle group の内側は除きます。
- 視差効果の軽減が有効な場合、拡大縮小は行われず、塗りがフェードするだけです。
| プロパティ | 型 | デフォルト |
|---|---|---|
variant | "default" | "outline" | "default" |
size | "default" | "sm" | "lg" | "default" |
shape | "default" | "pill" | "default" |
pressed | boolean | – |
defaultPressed | boolean | false |
onPressedChange | (pressed, details) => void | – |
disabled | boolean | false |
valuetoggle group の中でその toggle を識別します。 | string | – |
className | string | (state) => string | – |
nativeButton | boolean | true |
render | ReactElement | (props, state) => ReactElement | <button> |
| 属性 | 説明 |
|---|---|
data-slot="toggle" | ボタン。data-variant と data-size を持ちます。 |
data-pressed | toggle がオンのときに付きます。 |
data-disabled | toggle が無効なときに付きます。 |
使用しているブロック
Toggle の上に構築されるブロック。