Newsletter Strip
Em andamentoFaixa escura de campanha para captar e-mails: a partir de 1024px, o título e a frase à esquerda e o formulário à direita — o campo de e-mail (rótulo só para o leitor), o botão e a linha de privacidade. Ligada por onSubmit (E73, decisão de 2026-09-28); estrutura refeita na revisão 3 (E131).
- Função
- Campanha (marketing)
- Também chamado de
- newsletter de campanha, captação de e-mail, inscrição por e-mail
- Mora em
- app/components/organisms/marketing/NewsletterStrip.tsx
- Última mudança
- 2026-10-01
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
No fim de uma página de campanha, para captar a inscrição.
Faça
- Passe
onSubmit: ele recebe o e-mail. Sem ele, o formulário não aparece — só a chamada. - Faça o
onSubmitlançar erro quando o serviço falhar: o componente diz que não conseguiu. - Troque os textos pela campanha:
titulo,descricao,rotuloDoBotaoeavisoDePrivacidade(E131). A linha de privacidade diz a frequência e que dá para cancelar.
Evite
- Tirar o rótulo escondido: o desenho não mostra rótulo, e o placeholder some ao digitar.
Quando não usar. Na página inicial, com consentimento e ilustração, use a Newsletter. Para um contato com mensagem, o ContactForm.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Chamada — Título (h2) claro e a frase em `--ink-inverse-muted`: centrados no celular, à esquerda a partir de 1024px. A faixa sobe 20px ao entrar (só com movimento liberado).
- E-mail — FormField com a legenda "E-mail" `sr-only` e o Input claro sobre o escuro, `autocomplete="email"`.
- Inscrever-se — Button primário grande, com o texto de `rotuloDoBotao`.
- Privacidade — A linha embaixo do campo, 14px, `--ink-inverse-muted`.
- Retorno — Parágrafo `role="status"`, claro, que recebe o foco depois do envio.
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, centrada — testado na ficha. |
| A partir de 1024px | Duas colunas: o texto à esquerda, o formulário à direita — até a revisão 3 o texto ficava à esquerda e o formulário no centro. |
| Erro | E-mail vazio ou sem @: o erro embaixo do campo, que fica aria-invalid — conferido no teste da ficha. |
| Enviando | O botão em isLoading ("Enviando inscrição…"). |
| Enviado | "Inscrição feita! As novidades vão chegar em <e-mail>." com o foco. |
Comportamento
| Situação | O que acontece |
|---|---|
| Inscrever-se com e-mail válido | Chama onSubmit com o e-mail e leva o foco ao retorno — 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 { NewsletterStrip } from '@/app/components/organisms/marketing/NewsletterStrip';
<NewsletterStrip />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 inscrição (E73, decisão de 2026-09-28: ligar por prop). Sem ela, o formulário não aparece — era um "Inscrever-se" que não enviava nada nem dava retorno. |
titulo | string | 'Pronto para acelerar sua carreira?' | não | Título da faixa (E131). |
descricao | string | 'Receba toda semana as novidades dos cursos, eventos e bolsas, direto no seu e-mail.' | não | O que a pessoa recebe, numa frase. |
rotuloDoBotao | string | 'Inscrever-se' | não | Texto do botão (padrão "Inscrever-se"). |
avisoDePrivacidade | string | 'Sem spam. Cancele quando quiser.' | não | A linha de privacidade embaixo do campo (padrão "Sem spam. Cancele quando quiser."). |
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 |
|---|---|---|
--ink-inverse | #FAFAFA | border-ink-inversetext-ink-inverse |
--foreground | #1A1A1A | bg-ink |
--ink-inverse-muted | #C7C7C7 | text-ink-inverse-muted |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Passa pelo campo e por "Inscrever-se". |
| Enter | No campo ou no botão, envia. |
Leitor de tela
O que é anunciado, e por quê.
- O campo é nomeado pela legenda "E-mail" escondida (
sr-only) e o erro fica ligado a ele pelo FormField. - O foco do campo é a borda clara de 2px: o cinza de foco sumiria sobre o escuro.
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/marketing/NewsletterStrip.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.
251416b2026-10-01E159: Testimonials — o vídeo toca dentro do cartão, YouTube e Vimeo
O histórico completo está no GitHub (abre em outra aba).