Construit sur l’UI SDK 0.1.0-beta.2 de Vercel. Son API peut changer.
Segmented control
Un contrôle segmenté sur l’UI SDK de Vercel avec un indicateur qui glisse, trois tailles, des éléments à icône seule, la pleine largeur, une mise en page verticale et le clavier d’un groupe radio.
- Composants de formulaire
- 2 parties
- 10 exemples
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-segmented-control.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 @ui-sdk/react@0.1.0-beta.2 @ui-sdk/core@0.1.0-beta.2 cnCopiez et collez le code suivant dans votre projet.
components/ui/ui-sdk-segmented-control.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
UI SDK ajoute un peu de CSS dans une couche de cascade nommée ui-sdk. Déclarez cette couche en haut de votre feuille de style globale, au-dessus de l’import Tailwind, pour que vos classes l’emportent.
Un contrôle segmenté bascule entre quelques vues ou réglages. Il fonctionne comme un groupe radio, avec une valeur et un seul arrêt de tabulation, et l’indicateur derrière l’élément coché glisse vers le nouveau choix. Nommez-le avec aria-label ou aria-labelledby. UI SDK le marque comme expérimental en 0.1.0-beta.2.
Le contrôle dessine son propre indicateur, vous n’ajoutez que les éléments.
size vaut sm, default ou lg. Les éléments grandissent sur écran tactile.
Un élément qui ne contient qu’une icône devient carré. Nommez-le avec aria-label.
Donnez w-full au contrôle et les éléments se partagent sa largeur.
orientation="vertical" empile les éléments. Les flèches des deux axes passent toujours de l’un à l’autre.
disabled sur le contrôle le désactive entièrement et n’envoie rien. Sur un élément, les flèches le sautent.
Passez value et mettez-le à jour dans onValueChange. Un contrôleur issu de createSegmentedControlController() coche un élément depuis n’importe où.
Chaque élément contient un bouton radio natif caché, donc name envoie la valeur cochée, required attend un choix, et la réinitialisation revient à la valeur par défaut.
Un contrôle en lecture seule garde sa valeur et est toujours envoyé. Les flèches déplacent le focus sans rien cocher.
Les éléments partent de la droite, et l’indicateur les suit.
| Touche | Action |
|---|---|
| Tab | Entre dans le contrôle, sur l’élément coché ou le premier actif. |
| ←→↑↓ | Passent à l’élément suivant ou précédent et le cochent, en sautant les désactivés. Ils bouclent sauf si loop vaut false. |
| Space | Coche l’élément ciblé. |
| Enter | Envoie son formulaire. |
Le contrôle est un groupe radio et chaque élément un bouton radio, donc les lecteurs d’écran annoncent le choix et sa position. L’indicateur est décoratif et ignoré par les lecteurs d’écran.
L’indicateur ne glisse qu’une fois la page interactive, il ne s’anime donc jamais au chargement, et pas du tout quand les animations sont réduites. En couleurs forcées, l’élément coché garde une bordure visible.
Chaque partie enveloppe la partie UI SDK du même nom et accepte toutes ses props, y compris render et un className qui peut être une fonction de son état.
| Prop | Type | Par défaut |
|---|---|---|
value | T | null | – |
defaultValue | T | null | – |
onValueChange | (value: T | null, details) => void | – |
size | "sm" | "default" | "lg" | "default" |
orientation | "horizontal" | "vertical" | "horizontal" |
loop | boolean | true |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerIssu de createSegmentedControlController(). | SegmentedControlController | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="segmented-control" | Pour cibler le contrôle segmenté en CSS. |
data-size | La taille : sm, default ou lg. |
data-orientation | horizontal ou vertical. |
data-disabled | Présent lorsque l’élément est désactivé. |
data-readonly | Présent en lecture seule. |
data-required | Présent lorsqu’elle est requise. |
| Prop | Type | Par défaut |
|---|---|---|
value | string | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="segmented-control-item" | Pour cibler un élément en CSS. |
data-checked | Présent sur l’élément coché. |
data-unchecked | Présent sur les autres éléments. |
data-icon-only | Présent quand l’élément ne contient qu’une icône. |
data-disabled | Présent lorsque l’élément est désactivé. |
- 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.
- FieldDes libellés, descriptions et erreurs reliés à leur contrôle, avec états de validation et mises en page pour les formulaires.
- InputUn champ de saisie texte en trois tailles, avec états invalide et lecture seule, style de validation natif et police tactile de 16px pour que les téléphones ne zooment jamais.