Avatar
Em andamentoFoto redonda de uma pessoa, em quatro tamanhos. Quando a foto falta ou não carrega — inclusive se falhou antes de o React chegar —, mostra as iniciais do nome (primeira e última palavra) e passa a ser uma imagem nomeada.
- Função
- Conteúdo
- Também chamado de
- foto de perfil, avatar, retrato, iniciais
- Mora em
- app/components/atoms/Avatar.tsx
- Última mudança
- 2026-09-29
Prévia
A peça ao vivo, vinda da ficha, na largura escolhida. Em larguras fixas, ela roda num quadro do tamanho de uma tela de verdade.
Na largura da página: 0px
Variantes na ficha
Lidas da ficha no build, na ordem do palco. Cada uma abre sozinha, sem o styleguide em volta — é o endereço que o palco carrega.
Quando usar
Ao lado do nome de uma pessoa — palestrante, professor, autor de depoimento.
Faça
- Passe o
name: ele dá as iniciais e, sem foto, o nome acessível. - Use
decorativoquando o nome já está escrito ao lado — a foto fica comalt="". - Escolha o tamanho pela densidade:
smem listas,xlem destaque. - Passe
presenca(disponivelouausente) só onde ela muda o que a pessoa faz: o tutor no chat, quem está na turma ao vivo (E116).
Evite
- Um
<img>solto no lugar do Avatar: perde o tratamento de imagem quebrada. - Nome acessível duplicado: foto nomeada ao lado do nome escrito faz o leitor dizer o nome duas vezes.
Quando não usar. Para várias pessoas sobrepostas, com "+N", use o AvatarGroup. Para um ícone num fundo redondo, o IconBox.
Nota de uso
Quando não usar (E64): numa lista sem espaço, ou quando o nome escrito basta — a foto sozinha não identifica ninguém. As iniciais são duas letras (primeira e última palavra do nome). O alt é o nome da pessoa, sem "foto de": o leitor já diz que é imagem. Tem tratamento de imagem quebrada. É o átomo que o EventSpeaker passou a usar em vez de um <img> solto — se você estiver desenhando uma peça com foto de pessoa, comece por aqui. Passe o name: ele dá as iniciais (primeira e última palavra) e, sem foto, o nome acessível do avatar. Quando o nome já está escrito ao lado, use decorativo — a foto fica com alt="" e o leitor não repete o nome. fallback só sobrescreve as iniciais.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Círculo — Borda de 2px `--surface`, fundo `--muted`, recorte redondo.
- Foto — Cobre o círculo (`object-cover`).
- Iniciais — Sem foto: duas letras em seminegrito, `--muted-foreground`, decorativas.
- Presença — Com `presenca`: o ponto no canto de baixo, fora do recorte redondo, com anel de 2px `--card` — cheio `--success` (disponível) ou vazado com borda `--muted-foreground` (ausente); 10, 12, 14 ou 16px conforme o tamanho.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Com foto | A imagem, com alt do alt ou do name (vazio se decorativo). |
| Sem foto ou foto quebrada | As iniciais; o círculo vira role="img" com o nome acessível. |
| Decorativo | Sem nome acessível em nenhum dos dois casos. |
| Tamanho | sm 32px, md 40px (padrão), lg 48px, xl 64px. |
| Disponível | Ponto cheio verde, e o nome ganha "(disponível)". |
| Ausente | Anel vazado cinza — a forma muda, não só a cor —, e o nome ganha "(ausente)". |
Comportamento
| Situação | O que acontece |
|---|---|
| A imagem falha ao carregar | Troca pelas iniciais — e troca de novo se o src mudar para um endereço que funcione. |
| A imagem falhou antes da hidratação | Na montagem, confere se ela já veio quebrada (complete com largura 0) e troca. |
| `fallback` com espaço | É tratado como nome: vira as iniciais dele; sem espaço, usa as duas primeiras letras. |
| Com `presenca` | O avatar ganha um invólucro com o ponto (o style vai para ele, o className fica no círculo); sem a prop, nada muda — testado na ficha. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { Avatar } from '@/app/components/atoms/Avatar';
<Avatar>…</Avatar>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
size | 'sm' | 'md' | 'lg' | 'xl' | 'md' | não | Variante do cva. |
src | string | — | não | — |
name | string | — | não | Nome da pessoa. Dá as iniciais e, sem foto, o nome acessível do avatar. |
alt | string | — | não | Texto alternativo da foto. Sem ele, vale o name. |
fallback | string | — | não | Sobrescreve as iniciais tiradas do name. |
decorativo | boolean | false | não | O nome já está escrito ao lado (lista de palestrantes, autor do post): a foto vira decoração, com alt="". Sem isto, o leitor dizia "Ana Souza, Ana Souza" em cada item. |
presenca | 'disponivel' | 'ausente' | — | não | Presença (E116): disponivel ou ausente — o tutor no chat, a pessoa na turma ao vivo. Mostra o ponto no canto e diz o estado a quem ouve. Sem a prop, nada muda. |
Aceita também: React.HTMLAttributes<HTMLDivElement>.
Medidas
| Parte | Valor | Classe |
|---|---|---|
| `sm` | 32px | w-8 h-8 |
| `md` | 40px | w-10 h-10 |
| `lg` | 48px | w-12 h-12 |
| `xl` | 64px | w-16 h-16 |
Tokens de cor
Os tokens semânticos que o código da peça usa, com o valor de hoje em app/globals.css.
| Token | Valor | Usado como |
|---|---|---|
--card | #FFFFFF | bg-cardborder-cardring-card |
--muted-foreground | #595959 | border-muted-foregroundtext-muted-foreground |
--muted | #F4F6F9 | bg-muted |
--success | #2E844A | bg-success |
Leitor de tela
O que é anunciado, e por quê.
- Com foto, o nome vai no
alt; sem foto, noaria-labeldo círculo comrole="img". As iniciais sãoaria-hidden: o leitor diz o nome, não "M S". - A presença entra no nome ("Helena Martins (disponível)"); o ponto é
aria-hidden. No avatardecorativo, que não tem nome, ela vai em texto oculto.
O que sustenta o estado
Esta peça usa estatico. O estado dela é o de quem já foi ouvido com leitor de tela nesses padrões — e não uma passada sobre esta peça em específico.
Falta ouvir: estatico — ver docs/a11y-screen-reader-checklist.md.
Status e recursos
| Tipo | Recurso | Status |
|---|---|---|
| Código | app/components/atoms/Avatar.tsx | Disponível |
| Ficha | Storybook (abre em outra aba) | Disponível |
| Teste de acessibilidade | axe em npm run test | No gate de todo commit |
| Leitor de tela | Passada da E33 | Falta ouvir |
| Design | Figma | Desativado até a Fase 2 |
Histórico
Os últimos commits que tocaram o arquivo, lidos do git no build.
60d61902026-09-29E116: presença no Avatar e "Adicionar" no AvatarGroupb2261802026-09-29E115: LinkDeNavegacao — o link da barra sai de dentro da Navbar
O histórico completo está no GitHub (abre em outra aba).