Newsletter
Em andamentoSeção de assinatura da newsletter: chamada, o e-mail num FormField, o consentimento no Checkbox com o link da Política de Privacidade e o botão verde "Assinar gratuitamente", com uma ilustração ao lado. Ligada por onSubmit (E73, decisão de 2026-09-28).
- Função
- Institucional
- Também chamado de
- newsletter, assinar, captação de e-mail, inscrição por e-mail
- Mora em
- app/components/organisms/Newsletter.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.
1280px, em tamanho real
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
Perto do fim da página inicial ou de um artigo, para captar a assinatura.
Faça
- Passe
onSubmit: ele recebe o e-mail e faz a assinatura. Sem ele, o formulário não aparece — só a chamada. - Faça o
onSubmitlançar erro quando o serviço falhar: o componente mostra "Não conseguimos assinar agora".
Evite
- Um formulário "de mentira" para a vitrine: a prop existe para que não haja botão que não envia.
Quando não usar. Numa página de campanha, em faixa escura, use a NewsletterStrip. Para um contato com mensagem, o ContactForm.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Chamada — Chapéu verde, título e a frase de apoio.
- E-mail — FormField "E-mail" (obrigatório) com o Input, `autocomplete="email"`.
- Consentimento — O Checkbox do sistema, opcional, com o link para a Política de Privacidade no rótulo.
- Assinar — Button `secondary` (o verde de interface), na largura toda.
- Retorno — Parágrafo `role="status"`, que recebe o foco depois do envio.
- Ilustração — Decorativa (`alt=""`), à direita a partir de 768px.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Sem `onSubmit` | Só a chamada e a ilustração: nada de formulário. |
| Erro | E-mail vazio ou sem @: o erro em pt-BR embaixo do campo, que fica aria-invalid — conferido no teste da ficha. |
| Enviando | O botão em isLoading ("Assinando…"), focável. |
| Enviado | "Pronto! A newsletter vai chegar em <e-mail>." no retorno, com o foco nele. |
| Falhou | "Não conseguimos assinar agora. Tente de novo em alguns minutos." |
Comportamento
| Situação | O que acontece |
|---|---|
| Assinar com e-mail válido | Chama onSubmit com o e-mail e leva o foco ao retorno — conferido no teste da ficha. A página não recarrega. |
| Clique no link da política | Abre a política e não marca a caixa: o label não ativa o controle quando o clique é num link (é o HTML) — conferido 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 Newsletter from '@/app/components/organisms/Newsletter';
<Newsletter />Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
onSubmit | (email: string) => void | Promise<void> | — | não | Recebe o e-mail e faz a assinatura (E73, decisão de 2026-09-28: ligar por prop). Sem ela, o formulário não aparece: era um "Assinar" que recarregava a página e não assinava nada. |
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-card |
--foreground | #1A1A1A | text-ink |
--muted | #F4F6F9 | bg-muted |
--muted-foreground | #595959 | text-muted-foreground |
--secondary | #0B8434 | bg-secondary/20 |
--secondary-dark | #0D6B2E | text-secondary-dark |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Passa pelo campo, pela caixa, pelo link da política e por "Assinar gratuitamente". |
| Espaço | Na caixa, marca ou desmarca. |
| Enter | No campo ou no botão, envia. |
Leitor de tela
O que é anunciado, e por quê.
- O erro fica ligado ao campo (
aria-describedby) pelo FormField, e o resultado sai numa região viva que recebe o foco. - A validação é do componente, em pt-BR (
noValidate): a do navegador falava a língua do sistema.
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/organisms/Newsletter.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).