Progress
Une barre ou un anneau qui montre l’avancement d’une tâche, s’adoucit entre les mises à jour et glisse tant que le total est inconnu.
pnpm dlx shadcn@latest add https://hextaui.com/r/progress.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/progress.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
<Progress /> trace sa propre piste et son indicateur après ses enfants, si bien qu'un label et une valeur tiennent sur une ligne au-dessus de la barre. Chaque mise à jour adoucit le remplissage depuis sa position actuelle : des mises à jour rapides forment un seul mouvement fluide plutôt que des paliers.
Tailles
xs, sm, default et lg changent l'épaisseur de la barre. xs est le filet qu'Attachment trace le long de son bord inférieur.
Statut
variant ne colore que le remplissage ou l'anneau : la piste, le label et la valeur restent neutres.
Indéterminé
Passez value={null} tant que le total est inconnu. Un segment glisse le long de la piste, et dès qu'un nombre arrive, le remplissage grandit depuis le début.
Cercle
<ProgressCircle /> trace la même valeur sous forme d'anneau, en partant du haut. Les enfants se placent au centre, ce qui convient à <ProgressValue /> en lg et xl.
Cercle indéterminé
Un arc tourne autour de l'anneau jusqu'à l'arrivée d'une valeur.
Plage et format personnalisés
Définissez min et max pour n'importe quelle plage, format pour le nombre, et une fonction enfant sur <ProgressValue /> pour le texte. Donnez aux lecteurs d'écran les mêmes mots avec getAriaValueText.
Valeur animée
Rendez <NumberFlow /> dans <ProgressValue /> pour que seuls les chiffres qui changent tournent, en phase avec le remplissage.
Libellés longs
Les noms longs passent sur leurs propres lignes et la valeur reste à la fin. Les anneaux servent de statut compact à côté de chaque ligne.
Sans label visible
Nommez la barre avec aria-label quand le contexte indique déjà ce qui se charge.
De droite à gauche
Le remplissage et le glissement indéterminé partent de la droite. Passez locale pour formater la valeur avec les chiffres du lecteur.
- La racine est une
progressbaravecaria-valuenow,aria-valuemin,aria-valuemaxet unaria-valuetextformaté. Tant qu'elle est indéterminée, elle n'a pas de valeur courante. <ProgressLabel />nomme la barre. Sans lui, passezaria-label.<ProgressValue />est masqué aux lecteurs d'écran, puisque la progressbar annonce déjà la valeur.- Avec la réduction des animations, le remplissage saute à chaque nouvelle valeur, et la barre et l'anneau indéterminés pulsent sur place au lieu de se déplacer.
- Les valeurs sont formatées en
en-USsauf si vous passezlocale, pour que le serveur et le navigateur affichent le même texte.
Construit sur le progress de Base UI. Chaque partie accepte les props de la primitive qu'elle enveloppe.
| Prop | Type | Par défaut |
|---|---|---|
valuenull rend la barre indéterminée. | number | null | – |
min | number | 0 |
max | number | 100 |
size | "xs" | "sm" | "default" | "lg" | "default" |
variant | "default" | "success" | "warning" | "destructive" | "default" |
formatFormate la valeur. Sans lui, la valeur s'affiche en pourcentage. | Intl.NumberFormatOptions | – |
locale | Intl.LocalesArgument | "en-US" |
getAriaValueText | (formattedValue: string, value: number | null) => string | – |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="progress" | La racine. |
data-size | La taille : xs, sm, default ou lg. |
data-variant | La variante de statut. |
data-progressing | Présent tant que la valeur est inférieure à max. |
data-complete | Présent quand la valeur atteint max. |
data-indeterminate | Présent quand la valeur est null ou n'est pas un nombre fini. |
Nomme la progressbar. Rend un <span> et prend les mêmes attributs d'état que la racine.
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Description |
|---|---|
data-slot="progress-label" | Le libellé. |
| Prop | Type | Par défaut |
|---|---|---|
childrenTexte personnalisé. Sans lui, la valeur formatée s'affiche, ou rien tant que l'état est indéterminé. | (formattedValue: string | null, value: number | null) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Description |
|---|---|
data-slot="progress-value" | La valeur. |
Rendu par <Progress /> et dimensionné par son size. Exporté pour les compositions personnalisées.
| Attribut | Description |
|---|---|
data-slot="progress-track" | La piste. |
--progress-dir | 1, ou -1 en droite à gauche, pour que le glissement indéterminé suive le sens de lecture. |
Le remplissage. Sa largeur est définie en ligne à partir de la valeur et s'adoucit entre les mises à jour.
| Attribut | Description |
|---|---|
data-slot="progress-indicator" | Le remplissage. |
| Prop | Type | Par défaut |
|---|---|---|
valuenull fait tourner un arc. | number | null | – |
min | number | 0 |
max | number | 100 |
size | "sm" | "default" | "lg" | "xl" | "default" |
variant | "default" | "success" | "warning" | "destructive" | "default" |
locale | Intl.LocalesArgument | "en-US" |
childrenAffiché au centre de l'anneau. | ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="progress-circle" | La racine. |
data-size | La taille : sm, default, lg ou xl. |
data-variant | La variante de statut. |
data-progressing | Présent tant que la valeur est inférieure à max. |
data-complete | Présent quand la valeur atteint max. |
data-indeterminate | Présent quand la valeur est null ou n'est pas un nombre fini. |
--progress-circle-size | La largeur et la hauteur de l'anneau. |
--progress-stroke | L'épaisseur du trait de l'anneau. |
- AlertDes messages en ligne pour le statut et les retours, avec une surface neutre, une icône colorée et une fermeture qui se replie en douceur.
- EmptyUn espace réservé pour les écrans sans contenu à afficher, avec une icône, un message et l’action suivante.
- SkeletonDes placeholders qui attendent 150ms avant de s’afficher, prennent la taille exacte du contenu qu’ils enveloppent et l’affichent en fondu sans rien déplacer.
- 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.
- ToastDe brefs messages qui s’empilent proprement, se déploient au survol, se balayent pour disparaître et transforment un état de chargement en succès ou en erreur sur place.
- AttachmentDes cartes de fichiers et d’images pour les uploads, avec progression, états, actions, un déclencheur sur toute la carte et des noms qui conservent leur extension.