Avatar
Fotos de usuario con iniciales como alternativa, insignias de estado y grupos apilados que se colapsan en un contador.
pnpm dlx shadcn@latest add https://hextaui.com/r/avatar.jsonAñade el componente, los tokens del tema de HextaUI y los componentes de HextaUI de los que depende.
Añade los tokens del tema a tu CSS global, si aún no lo has hecho.
Instala las dependencias.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/avatar.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Tamaños y formas
Cinco tamaños, como círculos o cuadrados. Las iniciales y el icono de usuario escalan con la caja, y las esquinas cuadradas se reducen con el tamaño. Un <AvatarFallback /> vacío muestra el icono de usuario.
Cargando
Las iniciales se muestran mientras carga la foto, y luego la foto aparece con un fundido sobre ellas. Una foto rota conserva el fallback. Pasa delay para esperar antes de mostrar las iniciales, de modo que las fotos rápidas nunca las muestren por un instante.
Iniciales
getInitials() elige la primera y la última inicial. Maneja direcciones de correo, emoji, nombres CJK y RTL, marcas combinadas y nombres sin ninguna letra.
Estado
<AvatarBadge /> se sitúa en el borde en cualquier tamaño y forma. Define status para un punto de color con una etiqueta accesible, o pasa un icono. Cambiar el estado reproduce un solo pulso.
Group
<AvatarGroup /> superpone sus avatares y define su tamaño y forma. max colapsa el resto en un contador.
Grupo con enlaces
Renderiza los avatares como enlaces con render y dale a cada uno un aria-label. Un avatar con foco se eleva por encima de sus vecinos para que el anillo nunca se corte. Añade <AvatarGroupCount /> tú mismo cuando el total provenga de tus datos.
Diseño
Los avatares nunca se encogen en filas apretadas. Una clase de tamaño como size-20 escala con ella las iniciales y la insignia, y las iniciales largas nunca se desbordan.
De derecha a izquierda
La insignia permanece en la esquina final, que es la izquierda en RTL, y los grupos se superponen desde la derecha.
Los avatares no son enfocables por sí solos. Renderizados como enlace o botón, reciben las teclas habituales.
| Key | Acción |
|---|---|
| Tab | Mueve el foco al siguiente avatar con enlace. |
| Enter | Sigue al enlace con foco. |
- Usa
alt=""cuando el nombre de la persona ya está junto al avatar, y su nombre como texto alternativo cuando no lo está. - Las insignias con
statusse anuncian como “Online”, “Away”, “Busy” u “Offline”. Offline se dibuja como un anillo, así que el estado nunca depende solo del color. - Los grupos tienen
role="group". El contador se lee como “3 more”, no “+3”. - Con movimiento reducido, las fotos aparecen sin fundido y los cambios de estado no pulsan.
Construido sobre el avatar de Base UI. Cada parte acepta los atributos del elemento que renderiza. Los estilos se exportan como avatarVariants y avatarBadgeVariants.
| Prop | Tipo | Predeterminado |
|---|---|---|
sizeSe hereda del grupo si se omite. | "xs" | "sm" | "default" | "lg" | "xl" | "default" |
shapeSe hereda del grupo si se omite. | "circle" | "square" | "circle" |
render | ReactElement | (props, state) => ReactElement | <span> |
| Atributo | Descripción |
|---|---|
data-slot="avatar" | Selecciona los avatares en CSS. |
data-size | El tamaño resuelto. |
data-shape | La forma resuelta. |
--avatar-radius | El radio de las esquinas, compartido por todas las capas. |
| Prop | Tipo | Predeterminado |
|---|---|---|
src | string | – |
alt | string | – |
onLoadingStatusChange | (status: "idle" | "loading" | "loaded" | "error") => void | – |
keepMountedCarga la imagen en su sitio en lugar de precargarla, para loading="lazy" o next/image. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <img> |
| Atributo | Descripción |
|---|---|
data-slot="avatar-image" | Selecciona las imágenes en CSS. |
data-loading | Presente mientras la imagen carga. |
data-error | Presente cuando la imagen no se pudo cargar. |
data-starting-style | Presente mientras la imagen aparece con un fundido. |
data-ending-style | Presente mientras la imagen desaparece con un fundido. |
| Prop | Tipo | Predeterminado |
|---|---|---|
childrenVacío o con solo espacios muestra el icono de usuario. | ReactNode | <IconUser /> |
delayMilisegundos de espera antes de mostrarlo. | number | 0 |
render | ReactElement | (props, state) => ReactElement | <span> |
| Atributo | Descripción |
|---|---|
data-slot="avatar-fallback" | Selecciona los fallbacks en CSS. |
data-ready | false hasta que pasa el retraso. |
| Prop | Tipo | Predeterminado |
|---|---|---|
statusColorea el punto y lo etiqueta para las tecnologías de asistencia. Sin él, la insignia usa el color primario. | "online" | "away" | "busy" | "offline" | – |
childrenUn icono dentro de la insignia. Oculto en los tamaños xs y sm. | ReactNode | – |
| Atributo | Descripción |
|---|---|
data-slot="avatar-badge" | Selecciona las insignias en CSS. |
data-status | El estado actual. |
data-slot="avatar-badge-pulse" | El pulso que se reproduce tras un cambio de estado. |
| Prop | Tipo | Predeterminado |
|---|---|---|
size | "xs" | "sm" | "default" | "lg" | "xl" | "default" |
shape | "circle" | "square" | "circle" |
maxCuántos elementos mostrar, incluido el contador. Los valores menores que 2 se suben a 2. | number | – |
| Atributo | Descripción |
|---|---|
data-slot="avatar-group" | Apunta a los grupos en CSS. |
data-size | El tamaño del grupo. |
| Prop | Tipo | Predeterminado |
|---|---|---|
countSe muestra como +3, o 99+ por encima de 99. | number | – |
childrenReemplaza el contador, por ejemplo con un icono. | ReactNode | – |
sizeSe hereda del grupo si se omite. | "xs" | "sm" | "default" | "lg" | "xl" | – |
shapeSe hereda del grupo si se omite. | "circle" | "square" | – |
| Atributo | Descripción |
|---|---|
data-slot="avatar-group-count" | Apunta al contador en CSS. |
data-size | El tamaño resuelto. |
data-shape | La forma resuelta. |
getInitials(name, max = 2) devuelve hasta max iniciales en mayúsculas: la de la primera palabra y la de la última. Para una dirección de correo usa la parte anterior a @. Devuelve una cadena vacía cuando el nombre no tiene letras, números ni emoji, de modo que el fallback muestra el icono de usuario.
- BadgeEtiquetas de estado con puntos de color, tags eliminables que se deslizan al cerrarse y contadores que ruedan hasta su nuevo valor.
- CardUna superficie para agrupar contenido, con tres variantes, contenido multimedia de borde a borde, radios concéntricos y enlaces en toda la tarjeta.
- ChartGráficos de Recharts con colores del tema, un tooltip y una leyenda que leen las etiquetas de una sola configuración, y navegación con teclado con un anillo de foco visible.
- Data tableUna tabla para datos reales, con ordenación, búsqueda, selección de filas, columnas fijadas, un encabezado fijo y paginación.
- ItemUna fila de contenido multimedia, texto y acciones para listas, ajustes y selectores, con una superficie agrupada y un resaltado al pasar el cursor que se desliza entre filas.
- KbdTeclas para atajos que muestran los símbolos correctos en cada plataforma, se leen en voz alta correctamente y se hunden como las teclas reales.
Usado en bloques
Bloques que se construyen sobre Avatar.
- Chat SidebarLa barra lateral de una app de chat. Logo, búsqueda y Nuevo chat arriba, tus propios enlaces debajo, chats fijados, proyectos que se expanden para mostrar sus chats, recientes agrupados por día y filas con menús al pasar el cursor y con clic derecho, renombrado en línea, eliminación con deshacer y estados de respuesta en vivo.
- Diff ReviewRevisa las ediciones de un agente en todos los archivos antes de que se apliquen. Un árbol de archivos con contadores, aceptar o rechazar cada cambio, cada archivo o todo, comentarios en cualquier línea o rango que vuelven al agente, vistas unificada y dividida, resaltado a nivel de palabra, deshacer, ediciones en streaming y un resumen «Editados 4 archivos» para el chat.
- ProfileLa sección Perfil de los ajustes de un producto de IA. Recorta una foto en un círculo, elige un nombre de usuario que se comprueba mientras escribes, confirma un nuevo correo con un código de 6 dígitos, añade enlaces que reconocen el sitio y mira una tarjeta en vivo de cómo te ven los demás.
- SettingsAjustes para un producto de IA, con un diseño como el de Cursor y Claude. Una barra lateral rellena con búsqueda, grupos y enlaces externos, tarjetas de filas con selectores discretos y opciones anidadas, una isla de guardado oscura que sube solo cuando algo cambió, ⌘S para guardar, errores de campo desde tus comprobaciones o tu servidor y estados de carga con la forma del contenido.