スイッチSwitchBeta
オン/オフを切り替えるコントロールです。
プレビュー
状態とバリエーション
オフ
機能が無効な状態です。単一設定のオン/オフに使います。
オン
初期値として有効にする場合は defaultChecked を使います。
無効化
切り替えできない理由はツールチップとラベルで示します。
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| checked | boolean | - | 外部から制御するオン/オフ状態です。 |
| defaultChecked | boolean | - | 初期状態です。 |
| onCheckedChange | (checked: boolean) => void | - | 状態が変わった時に呼ばれます。 |
| disabled | boolean | false | 切り替えできない状態にします。理由はツールチップで補足します。 |
使い方
import * as React from "react";
import { Label, Switch } from "@gunjo/ui";
export function NotificationSettingSwitch() {
const [enabled, setEnabled] = React.useState(true);
return (
<div className="flex items-center gap-2">
<Switch
id="notifications"
checked={enabled}
onCheckedChange={setEnabled}
/>
<Label htmlFor="notifications">メール通知</Label>
</div>
);
}設計の判断
- 役割を素の
buttonに自分で付けた。資料は「見た目がスイッチでも役割が無ければ、読み上げは単なるボタンとしか言わない」を崩れた形に挙げています。GUNJO はbuttonにroleとaria-checkedを付けています。チェックボックスの入力欄を使わなかったのは、つまみの動きをjustify-startとjustify-endの入れ替えで作っているためで、チェックと入り切りの意味の違いもここではっきりします。 - ラベルを部品の中に入れて、名前を必ず持たせた。資料は「ラベルの無いスイッチ単体」を禁止に挙げています。
labelを渡すとaria-labelledbyで結んだ文字が横に出て、その文字を押しても切り替わります。descriptionはaria-describedbyで結びます。何も渡さなければ素のスイッチだけを返すので、その場合は呼ぶ側で名前を付けることになります。 - 待っている間の状態は持っていません。資料は「通信が終わるまでは待機の見た目にして、連打を防ぐ」を挙げています。GUNJO の
Switchに待機はなく、disabledで止めるところまでです。入りと切りの2つは設計の元データから生成されたSwitchVariantKeyなので、3つ目の状態を足すには元データの側から変えることになります。
いつ・なぜ使うか(UIXHERO)
「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。