Avatar
Fotos de usuário com fallback de iniciais, badges de status e grupos empilhados que se recolhem em uma contagem.
pnpm dlx shadcn@latest add https://hextaui.com/r/avatar.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/avatar.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Tamanhos e formas
Cinco tamanhos, como círculos ou quadrados. As iniciais e o ícone de usuário escalam com a caixa, e os cantos quadrados diminuem com o tamanho. Um <AvatarFallback /> vazio exibe o ícone de usuário.
Carregando
As iniciais aparecem enquanto a foto carrega, e então a foto surge com fade sobre elas. Uma foto quebrada mantém o fallback. Passe delay para esperar antes de exibir as iniciais, para que fotos rápidas nunca as mostrem num flash.
Iniciais
getInitials() escolhe a primeira e a última inicial. Ele lida com endereços de e-mail, emoji, nomes CJK e RTL, marcas combinantes e nomes sem nenhuma letra.
Status
<AvatarBadge /> fica na borda em todos os tamanhos e formas. Defina status para um ponto colorido com rótulo acessível, ou passe um ícone. Mudar o status executa um único pulso.
Grupo
<AvatarGroup /> sobrepõe seus avatares e define o tamanho e a forma deles. max agrupa o restante em uma contagem.
Grupo com links
Renderize os avatares como links com render e dê a cada um um aria-label. Um avatar em foco sobe acima de seus vizinhos para que o anel nunca seja cortado. Adicione <AvatarGroupCount /> você mesmo quando o total vier dos seus dados.
Layout
Os avatares nunca encolhem em linhas apertadas. Uma classe de tamanho como size-20 escala as iniciais e o badge junto, e iniciais longas nunca transbordam.
Da direita para a esquerda
O badge permanece no canto final, que é o esquerdo em RTL, e os grupos se sobrepõem a partir da direita.
Avatares não são focáveis por conta própria. Renderizados como link ou botão, ganham as teclas habituais.
| Tecla | Ação |
|---|---|
| Tab | Move o foco para o próximo avatar com link. |
| Enter | Acompanha o link em foco. |
- Use
alt=""quando o nome da pessoa já estiver ao lado do avatar, e o nome dela como texto alternativo quando não estiver. - Badges com
statussão anunciados como “Online”, “Away”, “Busy” ou “Offline”. Offline é desenhado como um anel, então o status nunca depende só da cor. - Os grupos têm
role="group". A contagem é lida como “3 more”, não “+3”. - Com movimento reduzido ativado, as fotos aparecem sem fade e as mudanças de status não pulsam.
Construído sobre o avatar do Base UI. Cada parte aceita os atributos do elemento que renderiza. Os estilos são exportados como avatarVariants e avatarBadgeVariants.
| Prop | Tipo | Padrão |
|---|---|---|
sizeHerdado do grupo quando omitido. | "xs" | "sm" | "default" | "lg" | "xl" | "default" |
shapeHerdado do grupo quando omitido. | "circle" | "square" | "circle" |
render | ReactElement | (props, state) => ReactElement | <span> |
| Atributo | Descrição |
|---|---|
data-slot="avatar" | Seleciona os avatares no CSS. |
data-size | O tamanho resolvido. |
data-shape | A forma resolvida. |
--avatar-radius | O raio dos cantos, compartilhado por todas as camadas. |
| Prop | Tipo | Padrão |
|---|---|---|
src | string | – |
alt | string | – |
onLoadingStatusChange | (status: "idle" | "loading" | "loaded" | "error") => void | – |
keepMountedCarrega a imagem no lugar em vez de pré-carregá-la, para loading="lazy" ou next/image. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <img> |
| Atributo | Descrição |
|---|---|
data-slot="avatar-image" | Seleciona as imagens no CSS. |
data-loading | Presente enquanto a imagem carrega. |
data-error | Presente quando a imagem falhou ao carregar. |
data-starting-style | Presente enquanto a imagem aparece com fade. |
data-ending-style | Presente enquanto a imagem some com fade. |
| Prop | Tipo | Padrão |
|---|---|---|
childrenVazio ou só com espaços exibe o ícone de usuário. | ReactNode | <IconUser /> |
delayMilissegundos de espera antes de exibi-lo. | number | 0 |
render | ReactElement | (props, state) => ReactElement | <span> |
| Atributo | Descrição |
|---|---|
data-slot="avatar-fallback" | Seleciona os fallbacks no CSS. |
data-ready | false até o delay passar. |
| Prop | Tipo | Padrão |
|---|---|---|
statusColore o ponto e o rotula para tecnologias assistivas. Sem isso, o badge usa a cor primary. | "online" | "away" | "busy" | "offline" | – |
childrenUm ícone dentro do badge. Oculto nos tamanhos xs e sm. | ReactNode | – |
| Atributo | Descrição |
|---|---|
data-slot="avatar-badge" | Seleciona os badges no CSS. |
data-status | O status atual. |
data-slot="avatar-badge-pulse" | O pulso executado após uma mudança de status. |
| Prop | Tipo | Padrão |
|---|---|---|
size | "xs" | "sm" | "default" | "lg" | "xl" | "default" |
shape | "circle" | "square" | "circle" |
maxQuantos itens exibir, incluindo a contagem. Valores abaixo de 2 são elevados a 2. | number | – |
| Atributo | Descrição |
|---|---|
data-slot="avatar-group" | Selecione grupos no CSS. |
data-size | O tamanho do grupo. |
| Prop | Tipo | Padrão |
|---|---|---|
countExibido como +3, ou 99+ acima de 99. | number | – |
childrenSubstitui a contagem, por exemplo por um ícone. | ReactNode | – |
sizeHerdado do grupo quando omitido. | "xs" | "sm" | "default" | "lg" | "xl" | – |
shapeHerdado do grupo quando omitido. | "circle" | "square" | – |
| Atributo | Descrição |
|---|---|
data-slot="avatar-group-count" | Selecione a contagem no CSS. |
data-size | O tamanho resolvido. |
data-shape | A forma resolvida. |
getInitials(name, max = 2) retorna até max iniciais em maiúsculas: a da primeira palavra e a da última. Para um endereço de e-mail, usa a parte antes do @. Retorna uma string vazia quando o nome não tem letras, números nem emoji, então o fallback exibe o ícone de usuário.
- BadgeRótulos de status com pontos coloridos, tags removíveis que deslizam até fechar e contagens que rolam até o novo valor.
- CardUma superfície para agrupar conteúdo, com três variantes, mídia de ponta a ponta, raios concêntricos e links no card inteiro.
- ChartGráficos do Recharts com cores do tema, um tooltip e uma legenda que leem os rótulos de uma única configuração, e navegação por teclado com um anel de foco visível.
- Data tableUma tabela para dados reais, com ordenação, busca, seleção de linhas, colunas fixadas, cabeçalho fixo e paginação.
- ItemUma linha de mídia, texto e ações para listas, configurações e seletores, com uma superfície agrupada e um destaque de hover que desliza entre as linhas.
- KbdTeclas para atalhos que mostram os símbolos certos em cada plataforma, são lidas corretamente por leitores de tela e afundam com as teclas reais.
Usado em blocos
Blocos que se baseiam em Avatar.
- Chat SidebarA barra lateral de um app de chat. Logo, busca e Novo chat no topo, seus próprios links abaixo, chats fixados, projetos que se expandem para mostrar seus chats, recentes agrupados por dia e linhas com menus de hover e de clique direito, renomeação inline, exclusão com desfazer e estados de resposta ao vivo.
- Diff ReviewRevise as edições de um agente em vários arquivos antes que sejam aplicadas. Uma árvore de arquivos com contagens, aceite ou rejeite cada mudança, cada arquivo ou tudo de uma vez, comentários em qualquer linha ou intervalo que voltam para o agente, visões unificada e dividida, destaques por palavra, desfazer, edições em streaming e um resumo "4 arquivos editados" para o chat.
- ProfileA seção Perfil das configurações de um produto de IA. Recorte uma foto em um círculo, escolha um nome de usuário que é verificado enquanto você digita, confirme um novo e-mail com um código de 6 dígitos, adicione links que reconhecem o site e veja um card ao vivo de como os outros veem você.
- SettingsConfigurações para um produto de IA, organizadas como no Cursor e no Claude. Uma barra lateral preenchida com busca, grupos e links externos, cards de linhas com seletores discretos e opções aninhadas, uma ilha de salvar escura que só sobe quando algo muda, ⌘S para salvar, erros de campo vindos das suas verificações ou do seu servidor e estados de carregamento com o formato do conteúdo.