Avatar
BetaRepresenta a una persona con su foto o sus iniciales.
registry/ds/avatar.tsx+2
import { Avatar, AvatarGroup } from "@/registry/ds/avatar";
export default function AvatarBasic() {
return (
<div className="flex flex-col items-center gap-6">
<div className="flex items-end gap-3">
<Avatar size="xs" name="Julia Arce" />
<Avatar size="sm" name="Martín Ferro" />
<Avatar size="md" name="Lucía Paz" />
<Avatar size="lg" name="Carlos Vega" />
<Avatar size="xl" name="Ana Ríos" />
</div>
<AvatarGroup size="md" max={4} label="Docentes del curso">
<Avatar size="md" name="Julia Arce" />
<Avatar size="md" name="Martín Ferro" />
<Avatar size="md" name="Lucía Paz" />
<Avatar size="md" name="Carlos Vega" />
<Avatar size="md" name="Ana Ríos" />
<Avatar size="md" name="Pedro Sosa" />
</AvatarGroup>
</div>
);
}Cuándo usarlo
Para identificar personas: autores, docentes, miembros. Para marcas o entidades usá su logo, no un avatar.
- Si no hay foto —o falla al cargar— se ven las iniciales (primera del nombre y del apellido).
- En un grupo, mostrá hasta 4 o 5 y resumí el resto en "+N".
- Un avatar solo no dice quién es: acompañalo con el nombre, salvo que el contexto ya lo diga.
Grupos y tamaños
AvatarGroup superpone y, pasado max, resume en "+N" con nombre accesible.
Los cinco tamaños van de 24 a 64 px.
+2
xs
sm
md
lg
xl
import { Avatar, AvatarGroup } from "@/registry/ds/avatar";
const docentes = ["Julia Arce", "Martín Ferro", "Lucía Paz", "Pedro Núñez", "Ana Rey", "Sofía Lema"];
/** Grupos: se superponen y, pasado `max`, resumen en "+N" con nombre accesible. Y la escala completa de tamaños */
export default function AvatarGroupExample() {
return (
<div className="flex flex-col gap-8">
<div className="flex flex-wrap items-center gap-8">
<AvatarGroup size="md" max={4} label="Docentes de la cátedra">
{docentes.map((n) => (
<Avatar key={n} size="md" name={n} />
))}
</AvatarGroup>
<AvatarGroup size="sm" label="Compañeros de grupo">
{docentes.slice(0, 3).map((n) => (
<Avatar key={n} size="sm" name={n} />
))}
</AvatarGroup>
</div>
<div className="flex flex-wrap items-end gap-4">
{(["xs", "sm", "md", "lg", "xl"] as const).map((size) => (
<div key={size} className="flex flex-col items-center gap-2">
<Avatar size={size} name="Julia Arce" />
<span className="font-mono text-xs text-fg-subtle">{size}</span>
</div>
))}
</div>
</div>
);
}Medidas
| Size | Diámetro | Iniciales |
|---|---|---|
xs | 24 | 10 px |
sm | 32 | Text xs |
md | 40 | Text sm |
lg | 48 | Text md |
xl | 64 | Text lg |
En grupo: anillo de 2 px y solape de ~¼ del diámetro.
Tokens
| Parte | Propiedad | Token |
|---|---|---|
| Fondo | Sin foto | primary/subtle |
| Iniciales | Color · Medium | primary/text |
| Anillo del grupo | Color | bg/elevated |
| +N | Fondo | bg/surface |
| +N | Texto | text/muted |
Instalación
npx shadcn@latest add https://polen.cdc.cool/r/avatar.jsonPlayground
Configurá el componente y copiá el snippet: se genera del mismo estado que renderiza el preview.
size
<Avatar name="Julia Arce" />Props
Sobre Base UI Avatar.
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
Avatar · name | string | — | Requerido. Da el texto alternativo y las iniciales. |
Avatar · src | string | — | URL de la foto. |
Avatar · size | "xs" | "sm" | "md" | "lg" | "xl" | "md" | 24 a 64 px. |
AvatarGroup · max | number | 4 | Cuántos mostrar antes del +N. |
AvatarGroup · label | string | — | Nombre del grupo para lectores de pantalla. |
- Se expone como imagen con el nombre de la persona como texto alternativo; las iniciales son decorativas.
- El "+N" se anuncia como "N más".
- Si el nombre ya está escrito al lado, el avatar es redundante: en ese caso envolvé ambos y dejá que se lea una sola vez.