Avatar Group
Em andamentoAvatares sobrepostos em fila, com um círculo "+N" para os que passam do limite — prova social ("e mais 250 mil formados"). É um grupo com o total para quem ouve: "6 participantes".
- Função
- Conteúdo
- Também chamado de
- grupo de avatares, pilha de fotos, prova social
- Mora em
- app/components/molecules/AvatarGroup.tsx
- Última mudança
- 2026-09-30
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
Para mostrar que várias pessoas participam — alunos, palestrantes, inscritos — sem listar todas.
Faça
- Escreva ao lado o que o grupo significa ("+ de 250.000 alunos") — o grupo sozinho não diz.
- Dê o
namecompleto de cada pessoa (E64): é o nome do avatar e a fonte das iniciais. - Ajuste
maxao espaço: quatro por padrão. Use menos quando a fila divide a linha com texto. - Troque o
rotuloquando "participantes" não disser quem são: "6 palestrantes". - Passe
onAdicionarpara o botão de convidar (E116), com umrotuloDoAdicionarque diga a ação ("Convidar para o grupo de estudo").
Evite
- Esperar que o "+N" diga de quê: o leitor ouve "e mais 3 pessoas", mas o que o grupo significa ("formados", "inscritos") precisa estar escrito ao lado.
- Usar para logotipos de parceiros: é só para pessoas (a nota do SLDS registra esse erro).
Quando não usar. Para uma pessoa só, use o Avatar. Para apresentar pessoas com nome e cargo, o EventSpeaker ou o TeamGrid.
Nota de uso
Só para pessoas (E64) — logotipos de parceiros vão numa faixa de logos, não aqui. Passe o name completo em cada avatar; o grupo anuncia o total ("6 participantes", ou o rotulo), e o contador diz "e mais 2 pessoas". Use max para caber no espaço, e escreva ao lado o que o grupo significa. O salto no hover saiu: o avatar não é clicável.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Avatares — Até `max`, sobrepostos (o primeiro por cima), com borda da cor do fundo.
- Contador — Círculo `--muted` com "+N", do mesmo tamanho dos avatares.
- Adicionar — Com `onAdicionar`: círculo tracejado `--border-interactive` com o sinal de mais, 12px depois da fila, do tamanho dos avatares; área de toque de 44px pela utilidade `area-de-toque` (pseudo-elemento).
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Padrão | Avatares sobrepostos, md por padrão. |
| Excedente | Com mais pessoas que max, aparece o "+N". |
| Com adicionar | O botão tracejado ao lado; no hover e no foco, borda e sinal em --primary. |
Comportamento
| Situação | O que acontece |
|---|---|
| Mais pessoas que `max` | Mostra as primeiras max e o "+N" com o resto. |
| Foto que falha | Cada Avatar troca pelas iniciais do name (ou do fallback). |
| Hover | Nada (E64): o salto de 4px saiu — movimento em avatar que não é clicável prometia uma ação que não existe. |
| "Adicionar" acionado | Chama onAdicionar; quem chama abre o convite (um Modal, uma Gaveta) — testado na ficha, pelo teclado. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { AvatarGroup } from '@/app/components/molecules/AvatarGroup';
<AvatarGroup avatars={…}>…</AvatarGroup>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. |
avatars | { src?: string; name?: string; alt?: string; fallback?: string; presenca?: 'disponivel' | 'ausente' }[] | — | sim | Uma pessoa por item. O name completo vai em cada avatar (E64). |
max | number | 4 | não | — |
rotulo | string | — | não | Nome do grupo para quem ouve (E64). Padrão: o total, "6 participantes". Diga quem são quando o contexto não disser: "6 palestrantes". |
onAdicionar | () => void | — | não | Mostra o botão "Adicionar" depois dos avatares (E116) — convidar alguém para a turma, para o grupo de estudo. Sem a prop, o botão não aparece. |
rotuloDoAdicionar | string | 'Adicionar pessoa' | não | O nome do botão (padrão "Adicionar pessoa"). |
Aceita também: React.HTMLAttributes<HTMLDivElement>.
Medidas
| Parte | Valor | Classe |
|---|---|---|
| Sobreposição, `md` | −12px | -space-x-3 |
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 |
|---|---|---|
--primary | #D42B2B | border-primarytext-primary |
--background | #FAFAFA | border-background |
--border-interactive | #8C8C8C | border-border-interactive |
--card | #FFFFFF | bg-card |
--muted | #F4F6F9 | bg-muted |
--muted-foreground | #595959 | text-muted-foreground |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Com `onAdicionar`, chega ao botão de adicionar; os avatares não recebem foco. |
| EnterEspaço | Aciona o "Adicionar". |
Leitor de tela
O que é anunciado, e por quê.
role="group"com o total ("6 participantes", ou orotulo), conferido no teste da ficha — antes quem ouvia recebia quatro nomes e "e mais 2", sem saber que eram seis.- Cada avatar é lido pelo
name; o contador é lido como "e mais 2 pessoas" (o "+2" visível éaria-hidden). - O "Adicionar" é um botão com nome ("Adicionar pessoa", ou o
rotuloDoAdicionar), dentro do grupo.
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/molecules/AvatarGroup.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.
0298af82026-09-30E147: fechamento da Entrega 11 — REPORT.md, verificação cross-agent e o gate estático estrito
O histórico completo está no GitHub (abre em outra aba).