Estado Vazio
Em andamentoO lugar do conteúdo que não há: a busca sem resultado, a lista de inscritos ainda vazia, o dia sem programação. Diz o que falta, em positivo, e o próximo passo, com uma ação só.
- Função
- Estado e aviso
- Também chamado de
- empty state, estado vazio, sem resultados, nenhum resultado, lista vazia
- Mora em
- app/components/molecules/EstadoVazio.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
Quando uma lista, uma busca ou um painel não tem nada para mostrar — e a pessoa precisa saber que não é erro nem carregamento.
Faça
- Escreva o
tituloem positivo, dizendo o que falta: "Nenhum curso encontrado", e não "Sua busca falhou". - Dê o próximo passo na
descricaoe, se houver, umaacaoque o faça ("Limpar filtros", "Ver todos os cursos"). - Ligue
anunciarquando o vazio é resposta a um filtro ou busca na mesma tela. - Acerte o
nivelDoTituloconforme a página (padrãoh3).
Evite
- Culpar quem usa ou usar tom de erro: vazio não é falha.
- Duas ações: a segunda disputa com a primeira; o resto vai no texto.
- Ícone que carrega o sentido sozinho: ele é decorativo, e o título diz tudo.
Quando não usar. Quando algo falhou (a busca não respondeu, o envio deu erro): o Alert. Enquanto carrega: o Esqueleto. Para a página inteira que não existe: a página de erro.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Ícone — Da Lucide, 24px, num círculo de 56px com fundo `--card` e borda; decorativo.
- Título — 18px, negrito, `--ink`; nível por prop.
- Descrição — 14px, `--muted-foreground`, até 320px de largura.
- Ação — O Button `outline` pequeno (44px de alvo); link com `href`, botão sem ele.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Padrão | Fundo --muted, para marcar o lugar do conteúdo numa página clara. |
| Contorno | Borda tracejada e fundo --card, dentro de cartão ou painel. |
| Anunciado | Com anunciar, é role="status": o leitor lê quando aparece. |
Comportamento
| Situação | O que acontece |
|---|---|
| O filtro esvazia a lista | Com anunciar, o leitor ouve o título e a descrição, sem sair do filtro — testado na ficha. |
| A ação é acionada | Faz o onClick ou navega pelo href; quem chama decide o que volta (a lista, outra página) — 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 { EstadoVazio } from '@/app/components/molecules/EstadoVazio';
<EstadoVazio titulo={…}>…</EstadoVazio>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
superficie | 'padrao' | 'contorno' | 'padrao' | não | Variante do cva. |
titulo | string | — | sim | O que falta, em positivo: "Nenhum curso encontrado", e não "Você errou a busca". |
descricao | React.ReactNode | — | não | O que fazer a seguir, numa frase. |
icone | LucideIcon | Inbox | não | Ícone da Lucide (padrão: a caixa vazia). Decorativo: o título diz o mesmo. |
acao | AcaoDoEstadoVazio | — | não | Uma ação só, que leva ao próximo passo ("Limpar filtros", "Ver todos os cursos"). |
nivelDoTitulo | 'h2' | 'h3' | 'h4' | 'h3' | não | Nível do título (padrão h3). Acerte conforme a página. |
anunciar | boolean | false | não | Anuncia o estado quando ele aparece. Ligue quando o vazio é resposta a uma ação na mesma tela — um filtro, uma busca —, para quem usa leitor de tela saber que a lista esvaziou sem ir procurar. Como (E144). Era o bloco inteiro com role="status" — e ele nasce junto com a mensagem, quando a lista esvazia: região viva criada já com o texto não é anunciada com segurança (guia de toasts do A11Y.md). Agora o bloco visível fica sem papel, legível desde o servidor, e uma região sr-only nasce vazia e recebe o título (e a descrição) um instante depois. |
Aceita também: Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>.
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 |
|---|---|---|
--border | #E5E5E5 | border-border |
--border-interactive | #8C8C8C | border-border-interactive |
--card | #FFFFFF | bg-card |
--foreground | #1A1A1A | text-ink |
--muted | #F4F6F9 | bg-muted |
--muted-foreground | #595959 | text-muted-foreground |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Chega à ação, se houver; o resto não recebe foco. |
| Enter | Aciona a ação (o botão também responde ao Espaço). |
Leitor de tela
O que é anunciado, e por quê.
- Com
anunciar, uma regiãosr-onlynasce vazia e recebe o título (e a descrição) um instante depois (E144): criada já com a mensagem, como era, ela não é anunciada com segurança. O bloco visível não tem papel, e sai legível do servidor — testado na ficha. - O ícone é decorativo (
aria-hidden): o título diz o que falta. - Com
anunciar, a regiãostatusé lida quando aparece, com o título e a descrição.
O que sustenta o estado
Esta peça usa regiaoViva. 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: regiaoViva — ver docs/a11y-screen-reader-checklist.md.
Status e recursos
| Tipo | Recurso | Status |
|---|---|---|
| Código | app/components/molecules/EstadoVazio.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).