Slider
Choisissez une valeur ou une plage en glissant, en touchant la piste ou avec les touches, avec des sauts fluides et une bulle de valeur facultative.
pnpm dlx shadcn@latest add https://hextaui.com/r/slider.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 class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/slider.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
<Slider /> trace un curseur par valeur : un nombre ou un tableau d'un élément donne un slider simple, et deux éléments une plage. Des enfants comme <SliderLabel /> et <SliderValue /> se placent sur une ligne au-dessus de la piste.
Pendant le glissement, le curseur suit exactement le pointeur. Quand la valeur saute, par un appui sur la piste, une touche ou une nouvelle valeur contrôlée, le curseur et le remplissage y glissent en 180ms au lieu de se téléporter.
Tailles
sm, default et lg mettent à l'échelle ensemble le curseur et la piste.
Plage
Passez deux valeurs pour une plage. Nommez chaque curseur avec getAriaLabel et gardez-les écartés avec minStepsBetweenValues. Avec draggableRange, glissez n'importe où entre les curseurs pour déplacer les deux à la fois ; un toucher à cet endroit déplace toujours le curseur le plus proche.
Bulle de valeur
showValue affiche la valeur formatée au-dessus du curseur pendant le glissement ou le focus clavier. Utilisez-le à la place d'une ligne de label, car la bulle monte dans l'espace au-dessus de la piste.
Pas et format
step aimante la valeur, largeStep définit le saut de Page Up et de Shift + flèche, et format formate chaque nombre que le slider affiche ou annonce.
Contrôlé
onValueChange se déclenche à chaque mouvement et onValueCommitted une fois au relâchement, ce qui est le moment d'enregistrer. Définir la valeur depuis l'extérieur est aussi fluide.
Vertical
Avec orientation="vertical", le slider remplit la hauteur de son parent, et Haut augmente la valeur.
Avec des icônes
Placez des icônes à côté du slider dans une rangée flex. Le slider prend la largeur restante.
Désactivé
Tout le slider s'atténue et ignore la souris et le clavier.
Libellés longs
Les longs labels passent à la ligne et la valeur reste à la fin.
De droite à gauche
Dans un parent de droite à gauche, le remplissage part de la droite et les flèches le suivent. Passez locale pour les chiffres du lecteur.
| Touche | Action |
|---|---|
| Tab | Place le focus sur le curseur suivant. |
| →↑ | Augmente la valeur d'un pas. → la diminue en droite à gauche. |
| ←↓ | Diminue la valeur d'un pas. ← l'augmente en droite à gauche. |
| Shift + ArrowPage UpPage Down | Avance de largeStep. |
| Home | Définit le minimum, ou la valeur du curseur précédent dans une plage. |
| End | Définit le maximum, ou la valeur du curseur suivant dans une plage. |
- Chaque curseur contient un
input type="range"natif : c'est donc unslideravec sa propre valeur, son min et son max. <SliderLabel />nomme chaque curseur. Sans lui,aria-labelsur<Slider />est transmis aux curseurs, pas au wrapper, de sorte que le slider n'est jamais sans nom. Dans une plage, utilisezgetAriaLabelpour distinguer les curseurs.<SliderValue />et la bulle de valeur ne sont pas annoncés à chaque changement ; le curseur indique déjà sa valeur.- Appuyer sur un curseur n'affiche pas d'anneau de focus ; les flèches, si. Avec la réduction des animations, le curseur saute au lieu de glisser.
- Sur écran tactile, la zone de clic passe à au moins 44px sans changer la mise en page.
Construit sur le slider de Base UI. Chaque partie accepte les props de la primitive qu'elle enveloppe.
| Prop | Type | Par défaut |
|---|---|---|
valueLa valeur contrôlée. Un curseur par élément. | number | number[] | – |
defaultValue | number | number[] | – |
onValueChangeSe déclenche à chaque changement pendant le glissement. | (value, eventDetails) => void | – |
onValueCommittedSe déclenche une fois à la fin d'un changement. | (value, eventDetails) => void | – |
min | number | 0 |
max | number | 100 |
step | number | 1 |
largeStep | number | 10 |
minStepsBetweenValues | number | 0 |
size | "sm" | "default" | "lg" | "default" |
orientation | "horizontal" | "vertical" | "horizontal" |
draggableRangeDans une plage, glisser entre les curseurs les déplace ensemble en gardant l'écart. | boolean | false |
showValueAffiche la valeur au-dessus du curseur pendant le glissement ou le focus clavier. | boolean | false |
thumbAlignmentedge garde le curseur dans la piste à min et max. | "edge" | "center" | "edge-client-only" | "edge" |
thumbCollisionBehavior | "push" | "swap" | "none" | "push" |
format | Intl.NumberFormatOptions | – |
locale | Intl.LocalesArgument | "en-US" |
aria-labelNomme les curseurs. | string | – |
getAriaLabelNomme chaque curseur d'une plage. | (index: number) => string | – |
getAriaValueText | (formattedValue: string, value: number, index: number) => string | – |
name | string | – |
disabled | boolean | false |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="slider" | La racine. |
data-size | sm, default ou lg. |
data-jump | Présent pendant 220ms tandis que le curseur glisse vers une nouvelle valeur. |
data-range-dragging | Présent tant que toute la plage est déplacée. |
data-orientation | horizontal ou vertical. |
data-dragging | Présent tant qu'un pointeur est enfoncé. |
data-disabled | Présent lorsque l’élément est désactivé. |
data-invalid | Présent quand il est invalide dans un Field. |
--slider-thumb | Le diamètre du curseur, défini par size. |
--slider-track | L'épaisseur de la piste, définie par size. |
data-slot="slider-control" | La zone cliquable autour de la piste. |
data-slot="slider-track" | La piste. |
data-slot="slider-range" | Le remplissage entre le début, ou le premier curseur, et le dernier curseur. |
data-slot="slider-thumb" | Chaque curseur. data-index donne sa position. |
data-active | Sur le curseur qui a le focus ou qui est déplacé. |
data-slot="slider-thumb-value" | La bulle de valeur de showValue. |
Nomme les curseurs et s'étend pour remplir la ligne. Rend un <div>.
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="slider-label" | Le libellé. |
Affiche les valeurs formatées, jointes par un tiret demi-cadratin dans une plage. Rend un <output>.
| Prop | Type | Par défaut |
|---|---|---|
childrenTexte personnalisé. | (formattedValues: string[], values: number[]) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <output> |
| Attribut | Description |
|---|---|
data-slot="slider-value" | La valeur. |
data-orientation | horizontal ou vertical. |
data-dragging | Présent tant qu'un pointeur est enfoncé. |
data-disabled | Présent lorsque l’élément est désactivé. |
data-invalid | Présent quand il est invalide dans un Field. |
- 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.
Utilisé dans les blocks
Des blocks qui s’appuient sur Slider.
- 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.
- ProfileLa section Profil des paramètres d’un produit d’IA. Recadrez une photo en cercle, choisissez un nom d’utilisateur vérifié pendant la saisie, confirmez une nouvelle adresse e-mail avec un code à 6 chiffres, ajoutez des liens qui reconnaissent le site et voyez une carte en direct de ce que les autres voient de vous.
- SettingsParamètres pour un produit d’IA, présentés comme dans Cursor et Claude. Une barre latérale pleine avec recherche, groupes et liens externes, des cartes de lignes avec sélecteurs discrets et options imbriquées, un îlot d’enregistrement sombre qui n’apparaît que si quelque chose a changé, ⌘S pour enregistrer, des erreurs de champ issues de vos contrôles ou de votre serveur, et des états de chargement qui épousent la forme du contenu.