Badge
Des libellés de statut avec pastilles colorées, des tags amovibles qui se referment en glissant et des compteurs qui défilent vers leur nouvelle valeur.
pnpm dlx shadcn@latest add https://hextaui.com/r/badge.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/badge.tsx components/ui/number-flow.tsx lib/motion.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
Variantes et apparences
L’apparence outline par défaut garde une surface neutre et place la couleur de statut sur le point ou l’icône. Utilisez appearance="solid" lorsque le badge doit ressortir, ou appearance="muted" pour une pastille pleine et discrète. shape="pill" l’arrondit complètement.
Tailles
sm, default et lg. Les icônes, points, bouton de fermeture et compteurs suivent la taille du badge.
Amovible
Ajoutez un <BadgeClose /> pour rendre un badge amovible. Il se referme en rétrécissant et ses voisins glissent pour combler l’espace, puis le focus passe au bouton de fermeture suivant. Retirez l’élément de vos données dans onOpenChangeComplete pour que l’animation de sortie puisse d’abord se terminer.
Contrôlé
Passez open et onOpenChange pour gérer la visibilité. Remettre open à true ramène le badge avec une animation d’entrée.
Compteurs
<BadgeCount /> ne fait défiler que les chiffres qui changent, et plafonne à max (99 par défaut) avec un signe plus. Les lecteurs d’écran entendent toujours le nombre réel.
Interactif
Utilisez render pour faire d’un badge un lien ou un bouton. Il gagne une teinte au survol, une réduction à la pression et un anneau de focus. aria-invalid affiche l’état d’erreur.
Contenu long
Un badge n’est jamais plus large que son conteneur. Les libellés longs sont tronqués avec des points de suspension, tandis que les icônes et le bouton de fermeture restent visibles.
De droite à gauche
Les icônes, le bouton de fermeture et l’animation de repli suivent le sens de lecture. Les compteurs se lisent toujours de gauche à droite.
Ces touches s’appliquent à <BadgeClose />.
| Touche | Action |
|---|---|
| EnterSpace | Supprime le badge. |
| BackspaceDelete | Supprime le badge. |
| Tab | Passe au bouton de fermeture suivant. Après une suppression, le focus arrive sur le bouton de fermeture suivant, ou sur le précédent s’il s’agissait du dernier. |
- Le bouton de fermeture porte le nom du badge : un lecteur d’écran annonce donc « Remove design » plutôt qu’un simple « Remove ». Passez
aria-labelpour le remplacer. <BadgeDot />est décoratif et masqué aux technologies d’assistance. Conservez le statut dans l’étiquette textuelle.<BadgeCount />expose la valeur exacte même lorsque le texte visible est plafonné, comme 99+.- Les animations de suppression et de compteur sont ignorées avec la réduction des animations.
<Badge /> rend un <span> et accepte tous ses attributs.
| Prop | Type | Par défaut |
|---|---|---|
variantColore le point et les icônes en outline, ou la surface en solid. | "default" | "success" | "info" | "warning" | "destructive" | "default" |
appearance | "outline" | "solid" | "muted" | "outline" |
shape | "default" | "pill" | "default" |
size | "sm" | "default" | "lg" | "default" |
openVisibilité contrôlée. | boolean | – |
defaultOpen | boolean | true |
onOpenChangeAppelé lorsque BadgeClose est activé. | (open: boolean) => void | – |
onOpenChangeCompleteAppelé à la fin de l’animation de sortie. Retirez l’élément de vos données ici. | (open: boolean) => void | – |
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Description |
|---|---|
data-slot="badge" | Ciblez les badges en CSS. |
data-variant | La variante actuelle. |
data-appearance | L’apparence actuelle. |
data-shape | La forme actuelle. |
data-size | La taille actuelle. |
data-ending-style | Présent pendant l’animation de sortie du badge. |
--badge-accent | La couleur de statut utilisée par les points et les icônes. Remplacez-la pour un accent personnalisé. |
--badge-height | La hauteur du badge. |
--badge-radius | Le rayon des coins. Le bouton de fermeture en dérive son propre rayon. |
| Prop | Type | Par défaut |
|---|---|---|
pulseAjoute une animation de ping pour les états en direct. Désactivée avec la réduction des animations. | boolean | false |
| Attribut | Description |
|---|---|
data-slot="badge-dot" | Ciblez les points en CSS. |
data-pulse | Présent lorsque pulse est activé. |
| Prop | Type | Par défaut |
|---|---|---|
children | ReactNode | <IconX /> |
aria-labelRemplace le nom automatique « Remove {label} ». | string | – |
onClickAppelez event.preventDefault() pour garder le badge ouvert. | (event) => void | – |
| Attribut | Description |
|---|---|
data-slot="badge-close" | Ciblez le bouton de fermeture en CSS. |
| Prop | Type | Par défaut |
|---|---|---|
valueLes valeurs négatives et non finies affichent 0. | number | – |
maxLes valeurs supérieures s’affichent sous la forme max+. Passez Infinity pour ne pas plafonner. | number | 99 |
duration | number | 600 |
animated | boolean | true |
trendLe sens dans lequel les chiffres tournent. | "auto" | "up" | "down" | "shortest" | "auto" |
locales | Intl.LocalesArgument | – |
format | Intl.NumberFormatOptions | – |
| Attribut | Description |
|---|---|
data-slot="badge-count" | Ciblez les compteurs en CSS. |
- 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.
- Number flowDes nombres animés où seuls les chiffres modifiés tournent, avec n’importe quel format Intl et n’importe quelle locale.
- AvatarDes photos d’utilisateurs avec initiales en repli, badges de statut et groupes empilés qui se réduisent en compteur.
- CardUne surface pour regrouper du contenu, avec trois variantes, médias bord à bord, rayons concentriques et liens sur toute la carte.
- ChartDes graphiques Recharts aux couleurs du thème, avec une infobulle et une légende qui lisent leurs libellés depuis une seule config, et une navigation au clavier avec anneau de focus visible.
- Data tableUn tableau pour de vraies données, avec tri, recherche, sélection de lignes, colonnes épinglées, en-tête fixe et pagination.
Utilisé dans les blocks
Des blocks qui s’appuient sur Badge.
- API keysLa page des clés d’API d’un produit d’IA, comme les consoles d’OpenAI et d’Anthropic. Créez des clés avec des permissions limitées et une expiration, voyez le secret une seule fois avec une copie qui confirme, révoquez avec annulation, renommez sur place, effectuez une rotation avec période de grâce et consultez l’utilisation par clé.
- 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.
- Code BlockDes blocs de code conçus pour les réponses d’IA. Coloration syntaxique qui suit le streaming, copie, téléchargement et retour à la ligne, numéros de ligne et lignes surlignées, diffs avec accepter et rejeter, et un terminal pour les commandes.
- ModelsLa page Modèles des paramètres d’un produit d’IA. Un modèle par défaut avec son contexte, sa vitesse et son coût en un coup d’œil, un effort par défaut qui sait ce que prend en charge chaque modèle, une liste de modèles consultable groupée par fournisseur avec filtres, épingles et bascules groupées, des serveurs compatibles OpenAI avec un vrai test de connexion, et une actualisation qui indique les nouveautés.