Componentes
73. HV-P5 FECHADA — a tinta de marca não sobrevive a NENHUMA superfície de interação, e isso é um número
seed-componentes.md v1.43 · §73seção 79 de 9873-hv-p5-fechada-a-tinta-de-marca-nao-sobrevive-a.md · MD5 f7fe671dTítulo completo no canon: HV-P5 FECHADA — a tinta de marca não sobrevive a NENHUMA superfície de interação, e isso é um número (2026-08-20, nona parte) · nasce --seed-text-brand-strong
Escrito em 2026-08-20, nona parte. Autossuficiente: presume um leitor que nunca viu a conversa. Esta seção fecha a HV-P5, que era o item 1 da fila aprovada e a única pendência do projeto classificada como norma violada hoje. Registro completo em
validacao/MANIFESTO.md§100.
73.1 O que a pendência dizia, e onde ela errava#
O §71.8 e a abertura diziam: "90 controles violam o piso de contraste no sobrevoo ou no pressionado,
concentrados em 7 classes de botão". Reproduzido, o 90 bateu e a distribuição estava errada. Não eram
7 consertos espalhados: eram 5 arquivos, com 64 dos 90 num só — o seed-design-system.html, o
showcase v1.0 (legado vivo), que tem paleta local e não consome os gêmeos.
PENDÊNCIA ESCRITA É HIPÓTESE — e isso vale também para o CENSO POR CLASSE. A lista de 7 classes era verdadeira como censo e enganosa como plano: ela agrupava pelo que a régua imprime (o seletor), não pelo que causa o defeito (a paleta do arquivo). Censo por nome de classe é censo do rótulo.
73.2 O número que tira a decisão do campo da preferência#
--seed-text-brand e --seed-text-link valem #098475 no claro. Eles medem 4,60 sobre a página
branca — 0,10 acima do piso 4,5 — e caem abaixo do piso assim que a superfície deixa de ser branco
puro:
| superfície | valor | mede com #098475 |
|---|---|---|
surface-page · surface-raised |
#FFFFFF |
4,60 ✅ |
surface-subtle · action-neutral-hover |
#F2F6F9 |
4,23 ❌ |
action-neutral-active · surface-sunken |
#E3EBF0 |
3,81 ❌ |
row-selected-bg |
#E8FBF7 |
4,28 ❌ |
O NÚMERO QUE FECHA: para
#098475alcançar 4,5, o fundo precisa de luminância ≥ 0,978 — o cinza neutro mais escuro que serve é#FDFDFD, dois passos do branco puro. Não existe superfície de interação possível para aquela tinta. Logo escurecer a tinta no estado não é escolha estética: é a única saída que não desliga o estado.⚠ E há uma consequência que reordena a HV-P4: os dois tokens que nasceram na v1.18 (
action-neutral-hovereaction-neutral-active) são exatamente as superfícies que derrubam a tinta de marca. Aplicar a gramática HV1-d ao acervo sem o token novo teria CRIADO casos de HV1-c em massa. A HV-P5 não era só anterior à HV-P4 por ser norma: era pré-requisito técnico dela — e isso não estava escrito em lugar nenhum.
73.3 O RITO de três rodadas#
| rodada | fonte | o que ela estabelece |
|---|---|---|
| R1 canon | Carbon (IBM) | tem exatamente este par: $link-primary (Blue 60 #0f62fe) e $link-primary-hover (Blue 70 #0043ce), "Hover color for $link-primary"; e $link-secondary (Blue 70), "Secondary link color for lower contrast backgrounds" |
| R1 canon | Carbon, issue #7647 | nomeia o mesmo caso fundador, verbatim: "The current link color for selected rows and rows with hover doesn't have enough visual contrast" → resposta: token mais escuro, #0043CE claro / #A6C8FF escuro |
| R2 mercado | GOV.UK Elements #546 | defeito idêntico — hover #2b8cc4 sobre branco = 3,72 — resolvido escurecendo a paleta em 2019 |
| R2 mercado | eBay Playbook | define o véu de estado (4% por estado) e não diz nada sobre a legibilidade do conteúdo sobre o véu — o outro lado da conclusão do §71.2 |
| R3 normas | WebAIM, verbatim | "the 3:1 contrast rule does not (or should not) apply to the hover, focus, or active states... the 4.5:1 (or 7:1) contrast requirement to the background does apply to all link states" |
73.4 O contrato HV1-e e o token que nasceu#
| # | Cláusula | Régua | Natureza |
|---|---|---|---|
| HV1-e | A tinta cujo piso foi verificado num ÚNICO fundo não serve a estado. Toda tinta consumida por controle tem de medir ≥4,5 (texto) contra todas as superfícies de interação que o design system declara — surface-subtle, action-neutral-hover, action-neutral-active, surface-sunken, row-selected-bg —, não só contra a página |
tabela tinta × superfície, medida no gêmeo | norma, derivada da SC 1.4.3 |
| token (gêmeos v1.19) | claro | escuro | mede no claro |
|---|---|---|---|
--seed-text-brand-strong |
#006C62 |
#66D1C2 |
6,32 página · 5,82 surface-subtle · 5,24 action-neutral-active · 5,89 row-selected-bg |
NENHUM HEX NOVO: no claro é o valor de surface-brand-deep e de action-primary-hover; no escuro é o
mesmo de text-brand (#66D1C2, que já media 8,31 a 10,16 sobre todas as superfícies escuras).
No tema escuro nada muda de aparência em nenhum pixel.
ALTERNATIVA DESCARTADA, com número: reusar
action-primary-hovercomo tinta PASSA (5,24 a 12,85 nos dois temas) e foi recusada por acoplamento de propósito — é token de fundo de botão, e uma mudança futura no sobrevoo do botão moveria a tinta do link em silêncio. Mesmo critério com que a v1.18 recusouaction-ghost-hoverpara o sobrevoo neutro.
73.5 A gramática de consumo — onde este token entra, e onde NÃO entra#
| situação | tinta | por quê |
|---|---|---|
| link/rótulo de marca em repouso, sobre a página | text-link / text-brand |
4,60, passa — nada muda |
o mesmo link quando a linha muda de fundo (tr:hover, tr.selecionada) |
text-brand-strong |
4,23 e 4,28 → 5,82 e 5,89 |
| botão fantasma de marca no seu próprio sobrevoo | text-brand-strong |
4,23 → 5,82 |
| tinta de marca sobre superfície elevada branca | text-brand |
surface-raised é #FFFFFF no claro: 4,60, passa |
| tema escuro, qualquer superfície | text-brand ou text-brand-strong — mesmo valor |
8,31 a 10,16, já passava |
O QUE ESTE TOKEN NÃO RESOLVE, e é fronteira declarada: ele é tinta. Onde o defeito é a
superfície carregar texto — a marca chapada #11B0A0 com texto branco em cima, 2,71 — a saída é a que
o §5-d já fixou no gate de 2026-08-18: descer a superfície para surface-brand-strong #098475
(4,60), não escurecer a tinta. Ali a opção de tinta escura (#00352F, 4,99) foi a opção D e ficou
VETADA pelo Rafael.
73.6 O achado que a HV1 NÃO pode ver — o estado de SELEÇÃO#
Ao consertar .linha-abrir, medi o par que a guarda não produz: text-link sobre row-selected-bg
(#E8FBF7) = 4,28, abaixo do piso. A HV1 produz :hover e :active; ela nunca produz SELEÇÃO.
É a outra metade do caso fundador do Carbon ("selected rows and rows with hover"), e entrou no mesmo
conserto.
Fica como pendência de dimensão inteira (SE-P1): nenhum instrumento desta casa produz o estado de SELEÇÃO para medir contraste. A CT1 cobre repouso/hover/ativo/foco; a HV1 cobre hover/ativo. Seleção é estado de DADO, não de ponteiro — e por isso escapou dos dois eixos.
73.7 Os consertos, com número, e o que ficou intocado#
| arquivo | conserto | antes → depois |
|---|---|---|
tela-detalhe.html (gerado) |
tbody tr:hover .linha-abrir e tr.selecionada .linha-abrir → text-brand-strong, no molde e no gerador |
4,23 → 5,82 · selecionada 4,28 → 5,89 · 20 casos → 0 |
tela-gantt.html · tela-quadro.html (gerados) |
mesmo bloco, preventivo | medido: as duas declaram a regra .linha-abrir e têm ZERO instâncias dela — veredito sem instância da rodada zero |
banco-navegacao.html |
sobrevoo próprio de [aria-current="page"], com fundo e tinta declarados JUNTOS |
1,02 → 9,35 (escuro) |
banco-tokens.html |
.btn-ghost:hover ganha tinta |
4,23 → 5,82 |
seed-design-system.html |
migração de três papéis de turquesa + --cinza-forte + quatro pares |
862 → 46 folhas · HV1-c 64 → 0 |
tela-site.html |
NENHUM — o artefato estava correto | falso positivo do 41º defeito de instrumento |
Todos os consertos tocam SÓ o estado de interação. Prova: as capturas de repouso antes e depois
saem byte-idênticas (dois grupos de md5 repetido na folha render-audit/gate-v140/fechamento.html, e a
repetição é a prova, não erro).
73.8 Pendências#
| # | Pendência | Por que fica |
|---|---|---|
| HV-P6 | a HV1-c não aplica o degrau de texto grande da SC 1.4.3 (≥24px, ou ≥18,66px com peso ≥700 → piso 3,00) | medido: 0 vereditos mudariam hoje — o maior alvo que reprova mede 14px. Ficou de fora de propósito, para a prova de inércia do 41º defeito ser legível |
| SE-P1 | nenhum instrumento produz o estado de SELEÇÃO para medir contraste | é um eixo novo, não uma correção: seleção é estado de dado |
| CC-P9 | as 46 folhas restantes do seed-design-system.html |
24 da família amarelo/dourado (única pergunta de gate), 8 dos mostruários de cor do próprio documento, 6 dos números decorativos, 6 do defeito de régua da CC-P10, 2 defeitos reais dentro de mockup em SVG |
| CC-P10 | o contraste-composicao.mjs resolve o fundo de elemento com gradiente subindo até o ancestral branco, em vez de recusar a medição como a HV1 faz |
medido no pixel: 6 folhas, 4 falsos positivos e 2 defeitos reais |
| ES-P1 | nenhuma guarda mede COLISÃO DE ESPECIFICIDADE — todas medem o resultado | ela já produziu três defeitos em três partes: o avatar da barra (§71.7), a página corrente da paginação e o título da coluna de marca |
| TK-P1 | o bloco de tokens injetado declara de qual versão do gêmeo nasceu, e ninguém mede a defasagem | medido: o acervo declara seis versões — v1.5 (1) · v1.7 (2) · v1.8 (1) · v1.9 (15) · v1.12 (1) · v1.17 (23) · v1.19 (3) |