Exemplo prático
Teste o texto normal, o texto placeholder e o estado hover separadamente, porque cada um costuma usar uma cor de primeiro plano diferente.
Texto grande de título (24px)
Texto normal de 14-16px. A maior parte do texto de interface, rótulos e parágrafos entra nesta categoria, por isso ela tem os requisitos de contraste mais rígidos.
A razão de contraste mede o quão distinguível o texto é do seu fundo, numa escala de 1:1 (idênticos) a 21:1 (preto sobre branco). O WCAG exige pelo menos 4.5:1 para texto normal e 3:1 para texto grande no nível AA, e 7:1 / 4.5:1 no nível AAA.
Este verificador calcula a razão a partir da luminância relativa exatamente como definido pelo WCAG 2.x, mostra resultados de aprovado/reprovado para cada nível e pré-visualiza suas cores em texto real. As notações HEX, RGB e HSL são aceitas.
Uma razão aprovada é o ponto de partida, não a linha de chegada. Revise como o par se comporta em estados reais da interface.
Um par que passa em fundo claro pode falhar após a inversão do modo escuro. Verifique cada tema que você publica.
Hover, focus, disabled e visited costumam usar tons mais claros que caem abaixo de 4.5:1 sem ninguém perceber.
Combine cor com ícones, sublinhados ou rótulos de texto para que a informação sobreviva às deficiências de visão de cores.
O limite relaxado de 3:1 só vale a partir de 24px, ou 18.66px em negrito. Confirme o tamanho renderizado, não o token de design.
Teste o texto normal, o texto placeholder e o estado hover separadamente, porque cada um costuma usar uma cor de primeiro plano diferente.
Um primeiro plano translúcido tem contraste efetivo diferente sobre cada fundo abaixo dele, então o valor hex sozinho é insuficiente.
Uso a razão numérica como filtro e depois verifico os estados focus, disabled, modo escuro e alto contraste no componente real.
Você também pode achar essas ferramentas úteis.