SEED DS v2 · Bloco 2 seed-componentes.md §2–§14 · v0.13 — Bloco 2 completo

Bloco 2 (Formulários) · B1–B6 + C1–C5 + pacote mobile aprovados 2026-08-02 · contrastes medidos programaticamente · faixa 360px + zoom 200% como provas · v0.13: 5 correções da validação executada de 2026-08-03 (§4 canais, §6 aria-invalid, §8 alert+live, §12 parser, §14 alert)

1 · Anatomia (5 slots) + validação B4 ao vivo

O campo de e-mail abaixo implementa a decisão B4 (reward early, punish late): nada acontece enquanto você digita pela primeira vez; o erro só aparece quando o foco SAI do campo com conteúdo inválido; a partir daí, cada tecla revalida — e o erro some no instante em que é corrigido (vira sucesso, B6, porque e-mail é campo onde a confirmação carrega informação). O erro SUBSTITUI a ajuda (B2) e contém a instrução completa.

Demonstração interativa — digite e saia do campo

Enviamos a proposta para este endereço.

Campo com contador (slot E) + (opcional) — B3 produto

Limite de 80 caracteres. 0/80

Política v0.10 (supersede): sem maxlength — cole além do limite e veja o excesso virar erro em vez de truncar.

2 · Os 8 estados

Cada estado usa MECANISMO próprio (teste 2 do §1.12): foco = anel (nunca borda engrossada); erro = borda + ícone + mensagem (3 sinais, WCAG 1.4.1); readonly REMOVE a borda e muda o fundo; disabled muda fundo, texto e cursor. Passe o mouse e navegue por Tab para ver hover e foco.

default

Somente números — a máscara formata sozinha.

filled (valor 13.86:1 ≠ placeholder 4.74:1)

Está na sua fatura de energia, no canto superior.

error (borda + ícone + mensagem)

Erro: CPF incompleto — digite os 11 números.

success (B6 — só onde confirma algo real)

E-mail válido.

readonly (1ª classe — focável, copiável)

Gerado pelo sistema — não editável.

disabled (uso restrito — USWDS)

Preferir readonly ou campo habilitado com validação.

3 · Máscaras — registry extensível (B5), todas funcionais

Princípios: máscara é apresentação (o canônico viaja limpo: dígitos puros / E.164); tolerante na entrada (cole com ou sem pontuação — funciona); registry aberto (nova máscara não altera o componente). O valor canônico aparece abaixo de cada campo em tempo real, em JetBrains Mono, provando a separação exibição × dado.

cpf-cnpj (dinâmica pelo comprimento)

Usamos seu documento apenas para emitir a proposta.

canônico: —

cep + ViaCEP (loading; falha nunca bloqueia)

Preenchemos o endereço automaticamente.

canônico: —

tel-br (fixo/celular pelo comprimento)

canônico (E.164): —

tel-nao-geografico (0800 — pedido do Rafael)

Sem DDD — categoria própria, fora do E.164 de assinante.

canônico: —

tel-internacional (padrão Uber: país + número → E.164)

Trocar o país mantém o número digitado (regra Evil Martians).

canônico (E.164): —

moeda + dado técnico (JetBrains Mono no valor)

Em kWh — está na sua fatura de energia.

3b · Estado warning (C5 — emenda v0.7)

Guarda-corpo duro: warning é SÓ plausibilidade — dado válido, mas incomum. Nunca marca obrigatoriedade, nunca bloqueia o envio. Mecanismo próprio: ▲ dourado ≠ ⚠ vermelho (distinguíveis também em grayscale, abaixo).

warning — plausibilidade (ERP)

Valor 10× acima da média desta UC — confira antes de salvar.

error ao lado, para comparação (teste do par)

Erro: Somente números — use ponto para milhar (ex.: 1.250).

3c · Input de texto (§3) — slots, clear, senha normativa

Slots sempre no DOM (armadilha Ant); foco no wrapper (focus-within); afixo é aria-hidden e a unidade mora no rótulo; clear devolve o foco ao campo; senha segue WCAG 3.3.8 + NIST (colar SEMPRE livre — teste: cole algo no campo).

C1 — sufixo de unidade (mono + direita, ERP)

Está na sua fatura de energia.

C1 — prefixo monetário

C2 — clear (aparece com conteúdo; foco retorna)

C3 — senha normativa (aria-pressed; cole à vontade)

Cole do seu gerenciador — nunca bloqueamos (WCAG 3.3.8 / NIST).

C4 — larguras comunicam o dado (xs·sm·md)

loading assíncrono (texto assistivo SLDS)

Consultando…

3e · Busca (§4) — filtro em tempo real, contagem acessível, zero resultados

Variante busca-filtro funcionando sobre um dataset de exemplo: digite (ex.: "fazenda", "sítio", "granja" ou algo sem match). A contagem visível é espelhada numa live region role="status" com debounce de 300ms (só a frase, nunca a lista — caso GOV.UK/Léonie Watson). Zero resultados declara, ecoa a query e oferece recuperação de escopo. Esc limpa. O clear nativo do WebKit está suprimido — o nosso (C2) assume.

busca-filtro · escopada a "Clientes" (D5)

6 resultados

    busca-navegacional (site) — com botão

    Zero resultados no site oferece "Fale com a engenharia" — beco sem saída vira lead (D9/Baymard).

    busca global desktop — chip ⌘K (slot D6)

    No toque, a busca global expande em superfície full-screen ao focar (D7/M3); o chip some — não há Cmd no celular.

    3f · Número (§5) — parsing BR, moeda em centavos, stepper APG

    Teste o parsing tolerante (E3): no campo de kWh, digite 1.234,56 ou 1234.56 ou cole "R$ 1.234,56" — o canônico normaliza. Na moeda (E6/E7): digite cru, saia do campo (blur) e veja a formatação pt-BR + o canônico em CENTAVOS INTEIROS; digite "2k" e saia para ver o atalho expandir. No stepper (E2/E8): setas ↑↓ funcionam no campo (Shift = passo 2×), botões +/− ficam fora do Tab, e nos limites o botão desabilita sem sumir.

    número-livre — medição (vírgula E ponto)

    Use vírgula ou ponto para decimais — os dois funcionam.

    canônico: —

    moeda — cru no focus, pt-BR no blur, centavos no dado

    Atalho power-user: "2k" vira 2.000,00 ao sair do campo.

    canônico: —

    número-stepper — quantidade (min 1 · max 24 · Shift=2×)

    Entre 1 e 24 parcelas.

    3g · Textarea (§6) — auto-grow + contador GOV.UK

    O campo cresce sozinho de 3 até 8 linhas (F1 — arraste o handle se quiser: é complemento, não função exclusiva, WCAG 2.5.7). O contador só aparece aos 75% do limite de 200 (F2 — threshold); cole um texto ENORME: nada é truncado — o excesso vira erro com a contagem ("ultrapassou em N"). O canal falado (região oculta) anuncia só na pausa da digitação (F3).

    observações da visita técnica — limite 200, threshold 75%

    Limite de 200 caracteres.

    Essas notas entram no relatório técnico da proposta.

    3h · Select (§7) — nativo estilizado como padrão + régua da família

    O trigger é 100% SEED (tokens, 44px, chevron próprio); o PAINEL aberto é do sistema — e isso é proposital: no celular abre o picker do OS, a melhor experiência de toque que existe (G2/Higley). O placeholder "Selecione…" fica na cor de placeholder até você escolher (G3). A régua abaixo governa os 5 componentes da família de escolha (G1).

    Régua unificada (G1)

    binário c/ efeito imediato → switch 2–6 · uma escolha → radio 2–6 · várias → checkbox 7–15 (≈20 no ERP) → select >15 ou busca → combobox

    nativo — com placeholder (G3)

    A concessionária define as regras de compensação.

    nativo — com default inteligente (G3) e grupos

    Pré-selecionamos a modalidade mais comum dos nossos clientes.

    custom (produto desktop) — aparência do trigger idêntica

    AMOSTRA ESTÁTICA

    Custom só quando a opção exige conteúdo rico (ícone/metadado) — e no toque degrada pro nativo (G2).

    3i · Switch (§8) · Radio (§9) · Checkbox (§10)

    switch — ação imediata (K1) + pending async (K2)

    radio — grupo com "Não sei" (J1)

    Qual solução você procura?

    radio CARDS — mesmo grupo, círculo visível (J3)

    Tipo de proposta

    checkbox — exclusive "ou" (I2) + consentimento LGPD (I5)

    Quais serviços já contratou? Selecione todas que se aplicam
    ou

    Dois consentimentos, dois checkboxes, nenhum pré-marcado (LGPD art. 8).

    3j · Combobox (§11) — municípios, criável (H5)

    ARIA 1.2 funcional — digite "gov", desça com a seta e aperte TAB: confirma e já avança (H8)

    Digite para filtrar a lista. Use as setas para navegar e Enter para selecionar.

    Se o município não estiver na lista, você pode criá-lo.

    3k · Slider (§12) — sempre pareado com o número (L1)

    simulador da captação: conta de luz mensal

    Arraste para um valor aproximado ou digite o valor exato (R$).

    3l · Date picker (§13) — régua por natureza da data (M1)

    memorável → digitada (máscara B5) — teste "1/8/26" E "01082026": os dois caminhos valem

    Por exemplo: 15/03/2026 — pode digitar 1/8/26 que a gente completa.

    a escolher → nativo no toque (M5/G2)

    No produto desktop: input + botão calendário (react-day-picker). Aqui, o nativo do seu dispositivo.

    3m · Upload (§14) — dropzone + fila com progresso (envio SIMULADO)

    fatura de energia — captação

    Fatura de energia (opcional)
    Arraste a fatura aqui

    PDF, JPG ou PNG · até 10 MB · usamos sua fatura só para dimensionar o sistema.

      Etiqueta de honestidade: o PROGRESSO aqui é simulado (não há servidor neste preview) — a anatomia, os anúncios e o retry são os reais.

      3d · Faixa 360px — teste do polegar (7º teste, §1.12)

      Moldura de 360px (Android mais comum no Brasil — pior caso). Dentro dela: coluna única, campos full-width, fonte 16px, alvos com hit-area da altura do campo. Prova complementar: dê zoom de 200% no navegador — os títulos fluidos (tokens v1.2) e os campos devem crescer junto, sem quebra.

      Usamos seu documento apenas para emitir a proposta.

      ↑ botão full-width (§1.4 v0.7): CTA único em toque estica ao container

      4 · Prova em escala de cinza (teste 3 do §1.12)

      Os estados continuam distinguíveis sem matiz: erro carrega ícone ⚠ + mensagem + borda; sucesso carrega ✓; readonly é a ausência de borda com fundo rebaixado. Se dependesse só do vermelho/verde, reprovava.

      default

      error

      CPF incompleto — digite os 11 números.

      warning (▲ ≠ ⚠ sem matiz)

      Valor 10× acima da média — confira.

      success

      E-mail válido.

      readonly

      5 · Contrastes medidos (programaticamente, 2026-08-02)

      Alterne o tema para conferir os dois lados da tabela nos próprios campos acima. Piso: 4.5:1 texto · 3:1 não-texto (borda, WCAG 1.4.11).

      ParLightDarkPiso
      Rótulo / valor13.86:114.16 / 12.61:14.5
      Texto auxiliar6.55:18.92:14.5
      Placeholder4.74:16.01:14.5
      Texto de erro7.18:18.49:14.5
      Texto de sucesso6.32:19.32:14.5
      Borda default4.74:14.50:13.0
      Borda erro5.19:15.52:13.0
      Texto warning (v0.7)6.68:19.22:14.5
      Borda warning (v0.7)4.82:18.21:13.0
      Borda sucesso4.60:18.31:13.0
      Readonly (texto)12.75:114.16:14.5