Avatar
Des photos d’utilisateurs avec initiales en repli, badges de statut et groupes empilés qui se réduisent en compteur.
pnpm dlx shadcn@latest add https://hextaui.com/r/avatar.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/avatar.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Tailles et formes
Cinq tailles, en cercles ou en carrés. Les initiales et l’icône d’utilisateur suivent la taille de la boîte, et les coins carrés s’adoucissent avec la taille. Un <AvatarFallback /> vide affiche l’icône d’utilisateur.
Chargement
Les initiales s’affichent pendant le chargement de la photo, puis la photo apparaît en fondu par-dessus. Une photo cassée conserve le contenu de repli. Passez delay pour attendre avant d’afficher les initiales, afin que les photos rapides ne les fassent jamais clignoter.
Initiales
getInitials() retient la première et la dernière initiale. Elle gère les adresses e-mail, les emoji, les noms CJK et RTL, les signes combinants, ainsi que les noms sans aucune lettre.
Statut
<AvatarBadge /> se place sur le bord pour toutes les tailles et formes. Définissez status pour un point coloré avec une étiquette accessible, ou passez une icône. Un changement de statut joue une seule pulsation.
Groupe
<AvatarGroup /> superpose ses avatars et définit leur taille et leur forme. max regroupe le reste en un compteur.
Groupe avec liens
Rendez les avatars en liens avec render et donnez à chacun un aria-label. Un avatar ayant le focus passe au-dessus de ses voisins pour que l’anneau ne soit jamais coupé. Ajoutez <AvatarGroupCount /> vous-même lorsque le total provient de vos données.
Mise en page
Les avatars ne rétrécissent jamais dans les lignes serrées. Une classe de taille comme size-20 met à l’échelle les initiales et le badge, et de longues initiales ne débordent jamais.
De droite à gauche
Le badge reste sur le coin de fin, c’est-à-dire à gauche en RTL, et les groupes se chevauchent depuis la droite.
Les avatars ne sont pas focusables d’eux-mêmes. Rendus en lien ou en bouton, ils reçoivent les touches habituelles.
| Touche | Action |
|---|---|
| Tab | Déplace le focus vers l’avatar lié suivant. |
| Enter | Suit le lien ayant le focus. |
- Utilisez
alt=""lorsque le nom de la personne est déjà à côté de l’avatar, et son nom comme texte alternatif dans le cas contraire. - Les badges avec un
statussont annoncés « Online », « Away », « Busy » ou « Offline ». Offline est dessiné comme un anneau : le statut ne repose donc jamais sur la couleur seule. - Les groupes ont
role="group". Le compteur se lit « 3 more », et non « +3 ». - Avec la réduction des animations, les photos apparaissent sans fondu et les changements de statut ne pulsent pas.
Construit sur l’avatar de Base UI. Chaque partie accepte les attributs de l’élément qu’elle rend. Les styles sont exportés sous avatarVariants et avatarBadgeVariants.
| Prop | Type | Par défaut |
|---|---|---|
sizeHérité du groupe si omis. | "xs" | "sm" | "default" | "lg" | "xl" | "default" |
shapeHérité du groupe si omis. | "circle" | "square" | "circle" |
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Description |
|---|---|
data-slot="avatar" | Ciblez les avatars en CSS. |
data-size | La taille résolue. |
data-shape | La forme résolue. |
--avatar-radius | Le rayon des coins, partagé par toutes les couches. |
| Prop | Type | Par défaut |
|---|---|---|
src | string | – |
alt | string | – |
onLoadingStatusChange | (status: "idle" | "loading" | "loaded" | "error") => void | – |
keepMountedCharge l’image sur place au lieu de la précharger, pour loading="lazy" ou next/image. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <img> |
| Attribut | Description |
|---|---|
data-slot="avatar-image" | Ciblez les images en CSS. |
data-loading | Présent pendant le chargement de l’image. |
data-error | Présent lorsque l’image n’a pas pu se charger. |
data-starting-style | Présent pendant l’apparition en fondu de l’image. |
data-ending-style | Présent pendant la disparition en fondu de l’image. |
| Prop | Type | Par défaut |
|---|---|---|
childrenVide ou composé d’espaces, il affiche l’icône d’utilisateur. | ReactNode | <IconUser /> |
delayMillisecondes à attendre avant de l’afficher. | number | 0 |
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Description |
|---|---|
data-slot="avatar-fallback" | Ciblez les contenus de repli en CSS. |
data-ready | false jusqu’à l’écoulement du délai. |
| Prop | Type | Par défaut |
|---|---|---|
statusColore le point et l’étiquette pour les technologies d’assistance. Sans lui, le badge utilise la couleur primaire. | "online" | "away" | "busy" | "offline" | – |
childrenUne icône dans le badge. Masquée aux tailles xs et sm. | ReactNode | – |
| Attribut | Description |
|---|---|
data-slot="avatar-badge" | Ciblez les badges en CSS. |
data-status | Le statut actuel. |
data-slot="avatar-badge-pulse" | La pulsation jouée après un changement de statut. |
| Prop | Type | Par défaut |
|---|---|---|
size | "xs" | "sm" | "default" | "lg" | "xl" | "default" |
shape | "circle" | "square" | "circle" |
maxNombre d’éléments à afficher, compteur compris. Les valeurs inférieures à 2 sont portées à 2. | number | – |
| Attribut | Description |
|---|---|
data-slot="avatar-group" | Ciblez les groupes en CSS. |
data-size | La taille du groupe. |
| Prop | Type | Par défaut |
|---|---|---|
countAffiché comme +3, ou 99+ au-delà de 99. | number | – |
childrenRemplace le compteur, par exemple par une icône. | ReactNode | – |
sizeHérité du groupe si omis. | "xs" | "sm" | "default" | "lg" | "xl" | – |
shapeHérité du groupe si omis. | "circle" | "square" | – |
| Attribut | Description |
|---|---|
data-slot="avatar-group-count" | Ciblez le compteur en CSS. |
data-size | La taille résolue. |
data-shape | La forme résolue. |
getInitials(name, max = 2) retourne jusqu’à max initiales en majuscules : celle du premier mot et celle du dernier. Pour une adresse e-mail, elle utilise la partie avant le @. Elle retourne une chaîne vide lorsque le nom ne contient ni lettre, ni chiffre, ni emoji : le contenu de repli affiche alors l’icône d’utilisateur.
- BadgeDes 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.
- 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.
- ItemUne ligne de média, de texte et d’actions pour les listes, réglages et sélecteurs, avec une surface groupée et une surbrillance de survol qui glisse d’une ligne à l’autre.
- KbdDes keycaps pour les raccourcis qui affichent les bons symboles sur chaque plateforme, se lisent correctement à voix haute et s’enfoncent comme de vraies touches.
Utilisé dans les blocks
Des blocks qui s’appuient sur Avatar.
- Chat SidebarLa barre latérale d’une application de chat. Logo, recherche et Nouveau chat en haut, vos propres liens en dessous, chats épinglés, projets qui se déploient pour montrer leurs chats, récents regroupés par jour, et des lignes avec menus au survol et au clic droit, renommage en ligne, suppression avec annulation et états de réponse en direct.
- Diff ReviewRelisez les modifications d’un agent dans plusieurs fichiers avant qu’elles ne soient appliquées. Une arborescence de fichiers avec compteurs, acceptation ou rejet de chaque changement, de chaque fichier ou de tout, des commentaires sur n’importe quelle ligne ou plage renvoyés à l’agent, des vues unifiée et côte à côte, des surlignages au niveau du mot, l’annulation, des modifications en streaming et un résumé « 4 fichiers modifiés » pour le chat.
- 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.