Alert
Em andamentoMensagem de aviso, informação, sucesso, atenção ou erro, com ícone, título opcional e o tipo dito em texto para quem ouve. Erro e atenção interrompem o leitor de tela; informação e sucesso esperam a pausa. Pode ter uma ação e um botão de fechar.
- Função
- Estado e aviso
- Também chamado de
- aviso, alerta, mensagem, notificação, banner de aviso
- Mora em
- app/components/molecules/Alert.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 uma mensagem que diz respeito à página ou a uma seção inteira — o pagamento foi confirmado, a inscrição falhou, o prazo está perto.
Faça
- Escolha a variante pela gravidade:
destructivepara erro,warningpara atenção,successpara concluído. - Escreva o que aconteceu e o que fazer: "Não conseguimos processar o pagamento. Tente outro cartão."
- Passe um
rolepróprio quando um sucesso precisar ser ouvido na hora. - Seja breve: até três linhas. O que passar disso é página, não aviso.
- Dê uma
acaoquando houver o que fazer: "Gerar boleto", "Tentar de novo" (E62). - Use
titleAs="h2"(ou o nível certo) quando o alerta abre uma seção; o padrão ép, fora da navegação por títulos.
Evite
- Alert de sucesso ou de informação inserido depois de uma ação: a região
statuscriada junto com o texto pode não ser anunciada. Para o retorno de uma ação, o Aviso — a região dele já existe (E144). destructiveewarningpara mensagem que não é urgente: interrompem quem está ouvindo.- Alerta dispensável com informação que a pessoa ainda vai precisar.
- Vários alertas empilhados — um por vez, o mais grave primeiro.
- Duas ações num aviso: aí é decisão, e decisão é Modal.
Quando não usar. Para o erro de um campo, use o FormField, que liga a mensagem ao campo. Para pedir uma decisão antes de seguir, o Modal. Para uma confirmação que some sozinha ("Salvo"), o aviso passageiro, não o Alert. Para uma mensagem do site inteiro, uma faixa no topo. Para um rótulo de uma palavra, o Badge.
Nota de uso
Quando usar (E62): para o que diz respeito à página ou ao formulário — e só um por vez, em até três linhas. Não para confirmação que some sozinha, nem para mensagem do site inteiro. O título é p por padrão (titleAs o faz cabeçalho), e a acao põe o que fazer a respeito num botão. Só erro e atenção usam role="alert", que interrompe o leitor; informação e sucesso usam role="status", que espera a pausa. Um role passado por prop vence — para um sucesso que aparece logo depois de uma ação, por exemplo. O tipo vem em texto para quem ouve ("Erro:", "Atenção:"…): a cor e o ícone não chegam lá.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Ícone — Por variante (informação, visto, alerta, X), decorativo.
- Tipo em texto — "Erro:", "Atenção:", "Sucesso:"… — só para o leitor de tela.
- Título — Opcional, em negrito. `p` por padrão; `titleAs` escolhe o cabeçalho (E62).
- Descrição — `text-sm`, obrigatória; aceita link e ênfase.
- Ação — Com `acao`: Button `outline` pequeno embaixo do texto — ou link, com `href` (E62).
- Fechar — Com `dismissible`: botão "Fechar alerta" de 44×44 no canto.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Aviso | default: fundo --muted, role="status". |
| Informação | info: fundo --info-subtle, texto --info-strong, role="status". |
| Sucesso | success: fundo --success-subtle, texto --success-strong, role="status". |
| Atenção | warning: fundo --warning-subtle, texto --warning-strong, role="alert". |
| Erro | destructive: fundo --destructive-subtle, texto --destructive-strong, role="alert". |
| Fechado | Depois do botão de fechar, o componente deixa de ser renderizado. |
Comportamento
| Situação | O que acontece |
|---|---|
| Aparece com `role="alert"` | O leitor de tela interrompe o que lia e anuncia. |
| Aparece com `role="status"` | O leitor anuncia na próxima pausa. |
| Fechar | Some, chama onDismiss e leva o foco a retornarFocoPara — ou, sem ela, ao próximo elemento focável depois do alerta (o anterior, se não houver) — medido no teste da ficha. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { Alert } from '@/app/components/molecules/Alert';
<Alert description={…}>…</Alert>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
variant | 'default' | 'info' | 'success' | 'warning' | 'destructive' | 'default' | não | Variante do cva. |
title | React.ReactNode | — | não | — |
titleAs | 'p' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | não | O elemento do título (E62). Padrão p: o alerta não sabe em que nível da página está, e um cabeçalho no nível errado quebra a navegação por títulos — era h5 fixo, que pulava três níveis sob um h2. Passe h2, h3… quando o alerta abre uma seção. |
description | React.ReactNode | — | sim | Texto do aviso. Aceita link e ênfase (E62). |
acao | { rotulo: string; onClick?: () => void; href?: string } | — | não | O que fazer a respeito, num botão (E62): "Tentar de novo", "Ver boleto". Com href, vira link. Um só — duas ações num aviso viram decisão, e decisão é Modal. |
dismissible | boolean | false | não | — |
onDismiss | () => void | — | não | — |
retornarFocoPara | React.RefObject<HTMLElement | null> | — | não | Para onde o foco vai quando a pessoa fecha o alerta. Sem ele, vai para o próximo elemento focável depois do alerta (ou o anterior, se não houver) — nunca para o <body> (E102). |
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 |
|---|---|---|
--foreground | #1A1A1A | bg-ink/5text-ink |
--border | #E5E5E5 | border-border |
--destructive | #BA0517 | border-destructive/25 |
--destructive-strong | #BA0517 | text-destructive-strong |
--destructive-subtle | #F9EBEC | bg-destructive-subtle |
--info | #1D345E | border-info/25 |
--info-strong | #142544 | text-info-strong |
--info-subtle | #EDF0F5 | bg-info-subtle |
--muted | #F4F6F9 | bg-muted |
--success | #2E844A | border-success/25 |
--success-strong | #276F3E | text-success-strong |
--success-subtle | #EEF5F1 | bg-success-subtle |
--warning | #DD7A01 | border-warning/25 |
--warning-strong | #945201 | text-warning-strong |
--warning-subtle | #FCF4EB | bg-warning-subtle |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Leva o foco à ação, se houver, e depois a "Fechar alerta", com `dismissible`; sem os dois, o alerta não tem parada. |
| EnterEspaço | Fecha o alerta — medido: ele some, `onDismiss` é chamado e o foco vai para o elemento seguinte. |
Leitor de tela
O que é anunciado, e por quê.
- O tipo vai em texto escondido antes do conteúdo ("Erro: …"): a cor e o ícone não chegam a quem ouve.
- O anel de foco do botão de fechar é a cor do próprio texto do alerta (
ring-current).
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/Alert.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).