---
fonte: 01-canonicos/seed-email.md
versao_da_fonte: v0.13
secao: 04
titulo: "EM1 — camada de tokens resolvidos"
sequencia: 7 de 17
bytes_do_corpo: 4454
md5_do_corpo: d3d00545da896d1d413bea6a2653fbcf
gerado_por: 06-validacao/geradores/gen-camada-ia.py
nota: fatia GERADA — o corpo abaixo é byte a byte o trecho do canônico; edite o canônico, nunca esta fatia. Canônico inteiro em https://ds.seed.eng.br/01-canonicos/seed-email.md
---
## 4. EM1 — camada de tokens resolvidos

**Decisão:** o e-mail consome **hex literal**, resolvido a partir do `seed-tokens.md` v1.2
por script, publicado como `seed-tokens-email.json`. Nenhum `var()` no output. Token
consumido sem definição continua sendo bug de build, reprovado na suíte.

**Racional:** ver seção 1. É o padrão da indústria — provedores de e-mail mantêm
transformadores que substituem variáveis pelos valores justamente para ampliar a
compatibilidade.

**Alternativas descartadas:**
- *`var()` com valor de fallback* — o Gmail não declara a variável, então o resultado é
  imprevisível entre clientes; um fallback que funciona em teste pode falhar em produção.
- *Paleta duplicada e mantida à mão* — produz deriva garantida entre o e-mail e o resto do
  sistema, que é exatamente o problema que o DS existe para matar.

### 4.1 Paleta resolvida (subconjunto e-mail)

Todos os hex vêm das rampas do `seed-tokens.md` v1.2 §2.1. Nenhum foi inventado aqui.

| Papel no e-mail | Hex | Origem no token |
|---|---|---|
| Canvas (fundo externo da mensagem) | `#F2F6F9` | cinza-50 |
| Superfície (fundo do card) | `#FFFFFF` | branco |
| Marca profunda (cabeçalho/rodapé) | `#005048` | turquesa-800 |
| Marca alternativa | `#006C62` | turquesa-700 |
| Ação primária (fundo do botão) | `#098475` | turquesa-600 |
| Texto primário | `#242E34` | cinza-900 |
| Texto secundário | `#4D606C` | cinza-700 |
| Texto sutil (dentro do card) | `#617683` | cinza-600 |
| Link | `#006C62` | turquesa-700 |
| Divisor / borda | `#C8D6DF` | cinza-200 |
| Sucesso — texto / fundo | `#005048` / `#E8FBF7` | turquesa-800 / turquesa-50 |
| Erro — texto / fundo | `#A5272A` / `#FFF2F1` | vermelho-700 / vermelho-50 |
| Atenção — texto / fundo | `#5B3E00` / `#FFF4E4` | dourado-800 / dourado-50 |
| Informação — texto / fundo | `#004C61` / `#ECF4FC` | azul-800 / azul-50 |

### 4.2 Contraste medido (não herdado)

Medido por `contraste-email.py` em 2026-08-07. **14 pares com piso, 0 reprovações.**

| Papel | Razão | Veredicto |
|---|---|---|
| Texto primário sobre corpo branco | 13.86 | AAA |
| Texto secundário sobre corpo | 6.55 | AA |
| Texto sutil sobre corpo | 4.74 | AA |
| Link sobre corpo | 6.32 | AA |
| Texto primário sobre canvas | 12.75 | AAA |
| Texto de rodapé sobre canvas | 6.03 | AA |
| Botão primário (branco sobre turquesa-600) | 4.60 | AA |
| Texto inverso sobre marca-800 | 9.37 | AAA |
| Texto inverso sobre marca-700 | 6.32 | AA |
| Sucesso | 8.73 | AAA |
| Erro | 6.58 | AA |
| Atenção | 9.05 | AAA |
| Informação | 8.57 | AAA |

**Por que remedir em vez de herdar os números do `seed-tokens.md`:** os fundos do e-mail
não são os mesmos da interface. O caso que provou a necessidade está registrado como errata
abaixo.

> **ERRATA v0.1 — rodapé legal.** A primeira versão desta tabela usava **cinza-600** para o
> texto de rodapé sobre o canvas cinza. Medido: **4.37**, que **reprova** o piso AA de 4.5.
> O mesmo cinza-600 passa com folga sobre branco (4.74) — o fundo cinza consome a margem.
> **Correção aplicada:** rodapé sobre canvas usa **cinza-700**, medido em **6.03**. Se os
> números tivessem sido herdados da interface em vez de medidos, o erro teria entrado em
> todos os templates da fase.

### 4.3 Isenção declarada — elementos decorativos

Divisor e borda de card foram medidos e **isentados** do piso de 3:1:

| Elemento | Razão medida |
|---|---|
| Borda de card sobre canvas | 1.37 |
| Divisor sobre corpo | 1.49 |

**Racional:** o critério WCAG 1.4.11 se aplica a componentes de interface e a objetos
gráficos **necessários para entender o conteúdo**. Um divisor que apenas reforça uma
separação já sustentada por espaçamento e por troca de fundo não carrega informação: se
sumir por completo, o e-mail continua compreensível e navegável.

**Evidência de que escurecer não era a saída:** medimos os stops disponíveis — cinza-200 =
1.49, cinza-300 = 1.91, cinza-400 = 2.53 sobre branco. **Nenhum stop utilizável alcança
3:1.** Chegar lá exigiria cinza-600, transformando um detalhe em traço pesado e contrariando
o princípio "assinatura, não cobertura" (`marca-seed.md` v5.0 §2).

**Condição da isenção (gatilho de revisão):** se algum dia um divisor passar a ser o **único**
indicador de uma fronteira — sem espaçamento, sem troca de fundo — ele deixa de ser
decorativo e volta a exigir 3:1.

---

