Avatar
Nutzerfotos mit Initialen als Fallback, Statusbadges und gestapelte Gruppen, die zu einer Zahl einklappen.
pnpm dlx shadcn@latest add https://hextaui.com/r/avatar.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/avatar.tsx Passe die Importpfade an dein Projekt-Setup an.
Größen und Formen
Fünf Größen, als Kreise oder Quadrate. Initialen und das Nutzer-Icon skalieren mit der Box, und quadratische Ecken werden mit der Größe kleiner. Ein leeres <AvatarFallback /> zeigt das Nutzer-Icon.
Lädt
Initialen erscheinen, während das Foto lädt, dann blendet das Foto darüber ein. Ein defektes Foto behält den Fallback. Übergib delay, um vor dem Anzeigen der Initialen zu warten, damit schnelle Fotos sie nie aufblitzen lassen.
Initialen
getInitials() wählt den ersten und den letzten Initialbuchstaben. Es verarbeitet E-Mail-Adressen, Emoji, CJK- und RTL-Namen, kombinierende Zeichen und Namen ganz ohne Buchstaben.
Status
<AvatarBadge /> sitzt bei jeder Größe und Form am Rand. Setze status für einen farbigen Punkt mit zugänglichem Label oder übergib ein Icon. Ein Statuswechsel spielt einen einzelnen Puls ab.
Gruppe
<AvatarGroup /> überlappt seine Avatare und legt deren Größe und Form fest. max fasst den Rest zu einer Zahl zusammen.
Verlinkte Gruppe
Rendere Avatare mit render als Links und gib jedem ein aria-label. Ein fokussierter Avatar hebt sich über seine Nachbarn, damit der Ring nie abgeschnitten wird. Füge <AvatarGroupCount /> selbst hinzu, wenn die Gesamtzahl aus deinen Daten stammt.
Layout
Avatare schrumpfen in engen Reihen nie. Eine Größenklasse wie size-20 skaliert Initialen und Badge mit, und lange Initialen laufen nie über.
Rechts nach links
Das Badge bleibt an der Endecke, die in RTL links liegt, und Gruppen überlappen von rechts.
Avatare sind für sich nicht fokussierbar. Als Link oder Button gerendert, erhalten sie die üblichen Tasten.
| Taste | Aktion |
|---|---|
| Tab | Setzt den Fokus auf den nächsten verlinkten Avatar. |
| Enter | Folgt dem fokussierten Link. |
- Verwende
alt="", wenn der Name der Person bereits neben dem Avatar steht, und den Namen als Alt-Text, wenn nicht. - Badges mit einem
statuswerden als „Online“, „Away“, „Busy“ oder „Offline“ angesagt. Offline wird als Ring gezeichnet, sodass der Status nie allein auf Farbe beruht. - Gruppen haben
role="group". Die Zahl wird als „3 more“ vorgelesen, nicht als „+3“. - Bei reduzierter Bewegung erscheinen Fotos ohne Einblenden, und Statuswechsel pulsieren nicht.
Basiert auf dem Base UI Avatar. Jeder Teil akzeptiert die Attribute des Elements, das er rendert. Die Stile werden als avatarVariants und avatarBadgeVariants exportiert.
| Prop | Typ | Standard |
|---|---|---|
sizeWird von der Gruppe übernommen, wenn nicht angegeben. | "xs" | "sm" | "default" | "lg" | "xl" | "default" |
shapeWird von der Gruppe übernommen, wenn nicht angegeben. | "circle" | "square" | "circle" |
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Beschreibung |
|---|---|
data-slot="avatar" | Avatare in CSS ansprechen. |
data-size | Die aufgelöste Größe. |
data-shape | Die aufgelöste Form. |
--avatar-radius | Der Eckenradius, den jede Ebene teilt. |
| Prop | Typ | Standard |
|---|---|---|
src | string | – |
alt | string | – |
onLoadingStatusChange | (status: "idle" | "loading" | "loaded" | "error") => void | – |
keepMountedDas Bild direkt laden, statt es vorzuladen, für loading="lazy" oder next/image. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <img> |
| Attribut | Beschreibung |
|---|---|
data-slot="avatar-image" | Bilder in CSS ansprechen. |
data-loading | Vorhanden, während das Bild lädt. |
data-error | Vorhanden, wenn das Bild nicht geladen werden konnte. |
data-starting-style | Vorhanden, während das Bild einblendet. |
data-ending-style | Vorhanden, während das Bild ausblendet. |
| Prop | Typ | Standard |
|---|---|---|
childrenLeer oder nur Leerraum zeigt das Nutzer-Icon. | ReactNode | <IconUser /> |
delayMillisekunden, die vor dem Anzeigen gewartet wird. | number | 0 |
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Beschreibung |
|---|---|
data-slot="avatar-fallback" | Fallbacks in CSS ansprechen. |
data-ready | false, bis die Verzögerung verstrichen ist. |
| Prop | Typ | Standard |
|---|---|---|
statusFärbt den Punkt ein und benennt ihn für assistive Technologien. Ohne diese Angabe nutzt das Badge die Primärfarbe. | "online" | "away" | "busy" | "offline" | – |
childrenEin Icon im Badge. Bei den Größen xs und sm ausgeblendet. | ReactNode | – |
| Attribut | Beschreibung |
|---|---|
data-slot="avatar-badge" | Badges in CSS ansprechen. |
data-status | Der aktuelle Status. |
data-slot="avatar-badge-pulse" | Der Puls, der nach einem Statuswechsel abgespielt wird. |
| Prop | Typ | Standard |
|---|---|---|
size | "xs" | "sm" | "default" | "lg" | "xl" | "default" |
shape | "circle" | "square" | "circle" |
maxWie viele Elemente angezeigt werden, einschließlich der Zahl. Werte unter 2 werden auf 2 angehoben. | number | – |
| Attribut | Beschreibung |
|---|---|
data-slot="avatar-group" | Gruppen in CSS ansprechen. |
data-size | Die Größe der Gruppe. |
| Prop | Typ | Standard |
|---|---|---|
countWird als +3 angezeigt, oder als 99+ über 99. | number | – |
childrenErsetzt die Zahl, zum Beispiel durch ein Icon. | ReactNode | – |
sizeWird von der Gruppe übernommen, wenn nicht angegeben. | "xs" | "sm" | "default" | "lg" | "xl" | – |
shapeWird von der Gruppe übernommen, wenn nicht angegeben. | "circle" | "square" | – |
| Attribut | Beschreibung |
|---|---|
data-slot="avatar-group-count" | Den Zähler in CSS ansprechen. |
data-size | Die aufgelöste Größe. |
data-shape | Die aufgelöste Form. |
getInitials(name, max = 2) gibt bis zu max Initialen in Großbuchstaben zurück: die des ersten und die des letzten Worts. Bei einer E-Mail-Adresse wird der Teil vor dem @ verwendet. Hat der Name keine Buchstaben, Zahlen oder Emoji, wird ein leerer String zurückgegeben, sodass der Fallback das Nutzer-Icon zeigt.
- BadgeStatuslabels mit farbigen Punkten, entfernbare Tags, die zugleiten, und Zähler, die zu ihrem neuen Wert rollen.
- CardEine Fläche zum Gruppieren von Inhalten, mit drei Varianten, randlosen Medien, konzentrischen Radien und Links über die ganze Karte.
- ChartRecharts-Diagramme mit Theme-Farben, einem Tooltip und einer Legende, die Labels aus einer Konfiguration lesen, und Tastaturnavigation mit sichtbarem Fokusring.
- Data tableEine Tabelle für echte Daten, mit Sortierung, Suche, Zeilenauswahl, fixierten Spalten, Sticky Header und Paginierung.
- ItemEine Zeile aus Medien, Text und Aktionen für Listen, Einstellungen und Auswahlen, mit gruppierter Fläche und einer Hover-Hervorhebung, die zwischen den Zeilen gleitet.
- KbdTastenkappen für Tastenkürzel, die auf jeder Plattform die richtigen Symbole zeigen, korrekt vorgelesen werden und sich wie echte Tasten eindrücken.
In Blocks verwendet
Blocks, die auf Avatar aufbauen.
- Chat SidebarDie Seitenleiste für eine Chat-App. Logo, Suche und Neuer Chat oben, deine eigenen Links darunter, angeheftete Chats, Projekte, die sich aufklappen und ihre Chats zeigen, zuletzt verwendete nach Tag gruppiert und Zeilen mit Hover- und Rechtsklick-Menüs, direktem Umbenennen, Löschen mit Rückgängig und Live-Antwortzuständen.
- Diff ReviewPrüfe die Änderungen eines Agenten über mehrere Dateien, bevor sie übernommen werden. Ein Dateibaum mit Zählern, jede Änderung, jede Datei oder alles annehmen oder ablehnen, Kommentare zu jeder Zeile oder jedem Bereich, die an den Agenten zurückgehen, Unified- und Split-Ansicht, Hervorhebung auf Wortebene, Rückgängig, streamende Änderungen und eine Zusammenfassung „4 Dateien bearbeitet“ für den Chat.
- ProfileDer Bereich „Profil“ in den Einstellungen eines KI-Produkts. Ein Foto kreisförmig zuschneiden, einen Benutzernamen wählen, der beim Tippen geprüft wird, eine neue E-Mail mit einem 6-stelligen Code bestätigen, Links hinzufügen, die die Website erkennen, und eine Live-Karte sehen, wie andere dich sehen.
- SettingsEinstellungen für ein KI-Produkt, gestaltet wie bei Cursor und Claude. Eine gefüllte Seitenleiste mit Suche, Gruppen und externen Links, Karten mit Zeilen, dezenten Pickern und verschachtelten Optionen, eine dunkle Speicher-Insel, die nur erscheint, wenn sich etwas geändert hat, ⌘S zum Speichern, Feldfehler aus deinen Prüfungen oder deinem Server und Ladezustände in der Form des Inhalts.