Pular para o conteúdo
// visualizar em
salvo em todas as páginas

Acessibilidade

O que todo componente do Camaleo garante em todos os estilos, como isso é testado e o contraste medido das cores de cada estilo.

// você vai aprender

  • O que você ganha de todo componente sem trabalho extra
  • Como a biblioteca é testada nos 13 estilos, em claro e escuro, com cinco cores de marca difíceis
  • O contraste medido das cores de texto e de controle de cada estilo
  • Onde a aparência autêntica e a acessibilidade discordam, e qual vence

A meta é WCAG 2.2 AA em todos os estilos, em claro e escuro, com qualquer cor de marca. Um estilo pode mudar forma, profundidade, tipografia e movimento; não pode tirar um nome, uma tecla ou um anel de foco.

O que todo componente garante

Como é testado

Os testes ficam em packages/react/test e rodam num navegador de verdade (Vitest em modo navegador com Playwright).

Relatório de contraste

A tabela abaixo é medida, não digitada: o apps/docs/scripts/contrast-report.mjs carrega o tokens.css e o CSS de cada estilo num navegador, resolve os tokens com cada uma das cinco cores de marca da matriz e guarda a menor razão das cinco. Os números são arredondados para baixo, então 4,499 aparece como 4,49.

O que ele mede, sempre contra a cor da página do estilo, --cml-surface, salvo indicação:

Ele não mede texto sobre superfícies elevadas, estados de hover nem painéis de vidro sobre o fundo; a matriz cobre esses casos nos componentes renderizados.

Texto sobre a cor da página, meta 4,5:1
EstiloModofgfg-secondaryfg-mutedaccent-textdangersuccesswarning
minimalclaro19,897,724,836,936,575,016,85
escuro19,0613,467,769,947,1411,4112,99
neumorphismclaro10,045,155,155,756,255,794,91
escuro11,207,676,126,907,278,988,27
retro-pixelclaro17,098,368,366,636,476,226,10
escuro16,1610,3410,349,205,929,5912,71
editorialclaro16,318,106,416,216,765,725,66
escuro14,8110,207,999,187,579,219,34
neubrutalismclaro17,3510,726,586,376,044,616,29
escuro16,2011,637,419,286,6710,6612,13
retroclaro11,548,745,355,395,284,524,70
escuro9,858,196,325,515,446,517,70
glassclaro15,789,157,656,136,616,306,05
escuro17,4212,858,629,538,5510,9512,46
swissclaro21,0015,136,686,936,575,016,85
escuro21,0015,318,3210,497,5312,0513,71
progressiveclaro15,628,465,206,195,875,506,11
escuro15,6611,116,808,666,229,9511,32
clayclaro12,948,806,166,496,156,676,41
escuro15,1611,467,118,576,8810,8911,51
materialclaro16,148,826,066,596,126,196,12
escuro14,4510,868,089,2910,9010,6310,86
cupertinoclaro18,819,805,366,214,825,376,14
escuro21,0013,809,4910,498,6110,3814,87
y2kclaro14,659,055,955,635,345,795,56
escuro16,7111,538,159,336,7010,7212,20
Preenchimento da marca (meta 4,5:1) e bordas (meta 3:1)
EstiloModoaccent-fgsobre accentborder-controlfocus-ring
minimalclaro4,853,246,93
escuro7,454,119,94
neumorphismclaro4,853,115,75
escuro7,453,716,90
retro-pixelclaro4,8517,096,63
escuro7,4516,169,20
editorialclaro16,3116,316,21
escuro14,8114,819,18
neubrutalismclaro5,3517,356,37
escuro5,3516,209,28
retroclaro9,8010,885,39
escuro4,854,215,51
glassclaro4,854,206,13
escuro7,455,889,53
swissclaro4,8521,0021,00
escuro7,4521,0021,00
progressiveclaro4,853,346,19
escuro5,354,638,66
clayclaro4,853,666,49
escuro7,454,788,57
materialclaro4,854,256,59
escuro10,495,839,29
cupertinoclaro4,853,724,35
escuro4,856,445,35
y2kclaro4,853,585,63
escuro5,355,029,33

Todos os pares atingem a meta em todos os estilos e modos. Rode node scripts/contrast-report.mjs em apps/docs depois de mudar um estilo para atualizar os números.

Autêntico ou acessível

Alguns estilos falham no contraste por natureza: o neumorphism não tem bordas, o vidro põe texto sobre o que estiver atrás, um sistema operacional clássico desenha um retângulo de foco pontilhado de 1 px. O projeto decidiu (decisão 9 do plano) que todo estilo é acessível por padrão, e que uma variante autêntica seria opcional e marcada como "não garante AA". Nenhuma variante autêntica existe ainda.

EstiloA aparência autênticaO que o Camaleo faz por padrão
neumorphismControles moldados só por luz e sombra, sem bordasBorda de 1 px com 3:1 ou mais em campos e opções; os botões têm o nome no texto
glassPainéis translúcidos sobre qualquer fundoManchas do fundo claras (no escuro, escuras) o bastante para o texto manter 4,8:1 no pico; opaco com transparência reduzida
clayPeças pastel macias, sem contornoCampos e opções mantêm uma borda de 3:1 ou mais
cupertinoCromo fosco em menus e popupsVidro escuro a 94% de opacidade para o texto manter 4,5:1; alternativa opaca
y2kBotões "jelly" brilhantes com texto sobre o brilhoO texto fica só sobre o destaque liso; o brilho fica acima e abaixo dele
retroRetângulo de foco pontilhadoMantido dentro de botões, abas e toggles (na cor do rótulo); os campos ganham um anel sólido de 2 px fora do bisel
CUIDADO

Um token ou regra que você muda pode quebrar o que os testes garantem. Depois de qualquer mudança de cor, rode a matriz de novo (pnpm --filter @camaleo/react test) ou pelo menos este relatório.

Antes de publicar

  • Botões só com ícone que você acrescenta têm aria-label
  • Cores próprias vêm de tokens, então mantêm os pares testados
  • Animações que você acrescenta respeitam prefers-reduced-motion
  • Popups novos mantêm o estilo (use PortalScope nos seus portais)
  • O relatório de contraste e a matriz continuam passando depois de mudar um estilo
Esta página foi útil? · Editar esta página no GitHub