Color Contrast Checker — TypeScript source
Check WCAG 2.2 contrast ratio between any two colors with AA / AAA pass-fail for normal and large text, plus a live preview. For accessible, on-brand design.
This is the TypeScript implementation — the same logic the interactive tool runs, in a shareable, citable form.
// WCAG 2.2 color contrast math. Pure + deterministic - the unit-test surface
// for the Color Contrast Checker tool.
export function hexToRgb(hex: string): [number, number, number] | null {
let h = hex.trim().replace(/^#/, '');
if (h.length === 3) h = h.split('').map((c) => c + c).join('');
if (!/^[0-9a-fA-F]{6}$/.test(h)) return null;
return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];
}
function channel(c: number): number {
c /= 255;
return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
}
export function luminance(hex: string): number | null {
const rgb = hexToRgb(hex);
if (!rgb) return null;
return 0.2126 * channel(rgb[0]) + 0.7152 * channel(rgb[1]) + 0.0722 * channel(rgb[2]);
}
export function contrastRatio(fg: string, bg: string): number | null {
const l1 = luminance(fg);
const l2 = luminance(bg);
if (l1 == null || l2 == null) return null;
return (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05);
}
Also available in 13 other languages
Every CosmoDev tool ships its pure logic in TypeScript (web) and Go (CLI), with authored implementations in a dozen-plus languages — the same contract, ported. Compare all languages side by side →