Switch
Un interrupteur on/off qu'on peut toucher, presser ou faire glisser, avec un curseur qui s'étire sous le doigt et un état d'attente facultatif pour les enregistrements.
pnpm dlx shadcn@latest add https://hextaui.com/r/switch.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/switch.tsx components/ui/spinner.tsx lib/motion.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
À l'appui, le curseur s'étire vers l'autre côté avant de rebondir de l'autre côté, pour que vous sentiez l'appui. Vous pouvez aussi saisir le curseur et le faire glisser : au-delà du milieu il bascule, en deçà il revient.
iOS
variant="ios" utilise une piste plus haute, un curseur en capsule et du vert quand il est activé. L'appui, le glissement et l'enregistrement fonctionnent de la même façon.
Enregistrement
Renvoyez une promesse depuis onCheckedChange et le switch bascule aussitôt, même contrôlé. Un spinner n'apparaît dans le curseur que si l'enregistrement dépasse 400ms. En cas de rejet, le switch rebascule et tremble.
Marques on et off
icons ajoute une coche et un anneau à la piste, pour que l'état ne repose pas sur la couleur.
Tailles
sm, default et lg.
Dans un champ
Avec Field, le label et la description sont liés au switch.
Désactivé et en lecture seule
readOnly garde la valeur visible et focalisable mais ne la modifie pas.
Contrôlé
Passez checked et onCheckedChange.
De droite à gauche
Le curseur part de la droite et glisse vers la gauche, et le glissement suit.
| Touche | Action |
|---|---|
| SpaceEnter | Active ou désactive le switch qui a le focus. |
- Le switch a le rôle
switch, nommé par son label. Entourez-le d'un<label>ou utilisezField. - Pendant l'enregistrement, il est
aria-busyet ignore les nouveaux appuis. - La zone de clic est plus grande que le switch, et plus grande encore au toucher.
- Avec la réduction des animations, le curseur se déplace instantanément et rien ne tremble.
| Prop | Type | Par défaut |
|---|---|---|
checked | boolean | – |
defaultChecked | boolean | false |
onCheckedChangeRenvoyez une promesse pour afficher l'état d'enregistrement. En cas de rejet, un switch non contrôlé rebascule. | (checked, details) => void | Promise | – |
variant | "default" | "ios" | "default" |
size | "sm" | "default" | "lg" | "default" |
iconsAffiche des marques on et off dans la piste. | boolean | false |
name | string | – |
value | string | – |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Description |
|---|---|
data-slot="switch" | La piste, avec data-size et data-variant. |
data-slot="switch-thumb" | Le curseur. |
data-checked / data-unchecked | Indique si le switch est activé. |
data-dragging | Présent pendant que le curseur est déplacé. |
data-pending | Présent tant qu'une promesse renvoyée est en attente. |
--switch-w / --switch-h / --switch-thumb / --switch-thumb-w | Tailles de la piste et du curseur, définies par size. |
- MotionLes courbes d’easing, les durées et la vérification de réduction des animations utilisées par chaque composant, ainsi que des hooks pour les morphs de taille et les surlignages glissants.
- SpinnerUn indicateur de chargement avec des graduations façon Apple ou un anneau qui respire, pouvant attendre avant de s’afficher et rester assez longtemps pour ne pas clignoter.
- CalendarUne grille de dates pour la sélection simple, de plage et multiple, avec des mois qui défilent, des aperçus de plage et des jours à taille tactile.
- CheckboxUne case à cocher dont la coche se dessine, avec des parents indéterminés, des groupes et des libellés qui partagent son survol.
- ComboboxUn select filtrable avec chips, groupes et résultats asynchrones, dans un popup qui se redimensionne pendant la saisie.
- Date pickerUn bouton qui ouvre un calendrier dans un popover, ou une bottom sheet sur mobile, pour des dates simples et des plages.
Utilisé dans les blocks
Des blocks qui s’appuient sur Switch.
- Prompt InputUn champ de discussion qui démarre sur une seule ligne sobre, grandit en carte à mesure que vous écrivez et descend une fois la conversation lancée. Entrée envoie, sans risque avec la saisie japonaise et chinoise. Collez, déposez ou choisissez des fichiers avec aperçus, progression et nouvel essai. @ ajoute des fichiers et / lance des commandes depuis un menu au niveau du curseur. Un sélecteur de modèle avec touches numériques, un curseur d’effort qui s’anime à Max, un anneau de contexte, la dictée avec forme d’onde en direct, des chips d’outils, une file pour les messages saisis pendant qu’une réponse arrive en streaming, et des brouillons qui survivent à un rechargement.
- Agent TodosAffichez le plan d’un agent pendant son travail. Chaque étape passe de backlog à à faire, en cours puis terminé, avec des durées en direct, les échecs et les appels d’outils qui les sous-tendent. Une pastille de statut à placer au-dessus du champ de saisie, des changements de plan visibles et une étape de relecture pour modifier le plan avant son exécution.
- AppearanceLa section Apparence des paramètres d’un produit d’IA : thème, couleur d’accent, teinte de fond, densité, police du chat, tailles de texte et options d’accessibilité, le tout conservé en brouillon jusqu’à l’enregistrement.
- BillingForfait et utilisation pour un produit d’IA, dans le style de Cursor, Claude et Vercel. Un compteur d’utilisation réparti par modèle qui projette la fin du cycle et prévient avant la fin des crédits, un graphique quotidien explorable, une limite de dépenses avec des alertes prévisualisables sur le compteur, des changements de forfait avec proratisation exacte, un formulaire de carte avec une vraie validation, et des factures téléchargeables en PDF.