Switch
タップ、押下、ドラッグで切り替えられるオン/オフのトグル。つまみは指の下で伸び、保存向けの保留状態も任意で使えます。
pnpm dlx shadcn@latest add https://hextaui.com/r/switch.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/switch.tsx components/ui/spinner.tsx lib/motion.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
押すと、つまみは反対側へ向かって伸びてから跳ねて移動するため、押した感触が伝わります。つまみをつかんでドラッグすることもでき、中央を過ぎると切り替わり、手前なら元に戻ります。
iOS
variant="ios" は、背の高いトラック、カプセル型のつまみ、オン時の緑を使います。押下、ドラッグ、保存は同じように動作します。
保存中
onCheckedChange から promise を返すと、制御されている場合でもスイッチはすぐに切り替わります。保存に400msを超えて時間がかかるときだけ、つまみにスピナーが表示されます。reject された場合、スイッチは元に戻って揺れます。
オンとオフの印
icons はトラックにチェックとリングを追加するため、状態が色だけに頼りません。
サイズ
sm、default、lg。
フィールド内
Field を使うと、ラベルと説明がスイッチに関連付けられます。
無効と読み取り専用
readOnly は値を表示したままフォーカス可能にしますが、変更はできません。
制御
checked と onCheckedChange を渡します。
右から左
つまみは右から始まって左へスライドし、ドラッグもそれに従います。
| キー | アクション |
|---|---|
| SpaceEnter | フォーカスされているスイッチをオンまたはオフにします。 |
- スイッチは、ラベルで名前が付く
switchrole です。<label>で囲むか、Fieldを使ってください。 - 保存中は
aria-busyになり、新しい押下を無視します。 - ヒット領域はスイッチより大きく、タッチではさらに大きくなります。
- 視差効果の軽減が有効な場合、つまみは即座に動き、揺れもありません。
| プロパティ | 型 | デフォルト |
|---|---|---|
checked | boolean | – |
defaultChecked | boolean | false |
onCheckedChangepromise を返すと保存中の状態が表示されます。reject された場合、非制御のスイッチは元に戻ります。 | (checked, details) => void | Promise | – |
variant | "default" | "ios" | "default" |
size | "sm" | "default" | "lg" | "default" |
iconsトラックにオンとオフの印を表示します。 | boolean | false |
name | string | – |
value | string | – |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
render | ReactElement | (props, state) => ReactElement | <span> |
| 属性 | 説明 |
|---|---|
data-slot="switch" | トラック。data-size と data-variant を持ちます。 |
data-slot="switch-thumb" | つまみ。 |
data-checked / data-unchecked | スイッチがオンかどうか。 |
data-dragging | つまみをドラッグしている間付きます。 |
data-pending | 返された promise が保留中の間付きます。 |
--switch-w / --switch-h / --switch-thumb / --switch-thumb-w | トラックとつまみのサイズ。size によって設定されます。 |
- Motionすべてのコンポーネントがアニメーションに使うイージングカーブ、継続時間、モーション軽減のチェックと、サイズのモーフィングやスライドするハイライト用のフックです。
- SpinnerApple風の目盛りまたは呼吸するリングで表示する読み込みインジケーターです。表示までの待機と、ちらつかない最短表示時間を設定できます。
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
- Date picker押すとポップオーバーでカレンダーを開くボタンです。スマートフォンではボトムシートになり、単一の日付も範囲も選べます。
使用しているブロック
Switch の上に構築されるブロック。
- Prompt Input最初は静かな1行で、入力に合わせてカードへ広がり、会話が始まると下へ移動するチャット入力欄です。Enterで送信でき、日本語や中国語の入力でも安全です。ファイルは貼り付け、ドロップ、選択でき、プレビュー、進捗、再試行に対応します。@でファイルを追加し、/でコマンドをカーソル位置のメニューから実行できます。数字キーで選べるモデルピッカー、Maxで動き出す推論量スライダー、コンテキストリング、リアルタイム波形つきの音声入力、ツールチップ、返信のストリーミング中に入力したメッセージのキュー、再読み込みしても残る下書きを備えています。
- Agent Todosエージェントの作業中のプランを表示します。すべてのステップはバックログからToDo、進行中、完了へと移り、リアルタイムの所要時間、失敗、その裏にあるツール呼び出しも確認できます。コンポーザーの上に置くステータスピル、目に見えるプランの変更、実行前にプランを編集できるレビューステップを備えています。
- AppearanceAIプロダクトの設定にある外観セクションです。テーマ、アクセント、背景の色合い、密度、チャットのフォント、文字サイズ、アクセシビリティのオプションを、保存するまで下書きとして保持します。
- BillingCursor、Claude、Vercelのスタイルによる、AIプロダクト向けのプランと使用量です。モデルごとに分かれ、サイクル終了時を予測してクレジット切れの前に警告する使用量メーター、ドラッグで確認できる日別チャート、メーター上でプレビューできるアラートつきの支出上限、正確な日割り計算によるプラン変更、実際のバリデーションを備えたカードフォーム、PDFでダウンロードできる請求書を備えています。