interface Color { red: number, green: number, blue: number, } export function parse(str: string): Color { return { red: parseInt(str.slice(1,3), 16), green: parseInt(str.slice(3,5), 16), blue: parseInt(str.slice(5,7), 16), } } // https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrastratio export function contrastRatio(c1: Color, c2: Color): number { const r1 = relativeLuminance(c1) const r2 = relativeLuminance(c2) return r1 > r2 ? (r1 + 0.05) / (r2 + 0.05) : (r2 + 0.05) / (r1 + 0.05) } function relativeLuminance(c: Color): number { return ( 0.2126 * fromSRGB(c.red / 255) + 0.7152 * fromSRGB(c.green / 255) + 0.0722 * fromSRGB(c.blue / 255)) } function fromSRGB(sRGB: number): number { return sRGB <= 0.03928 ? sRGB / 12.92 : Math.pow(((sRGB + 0.055) / 1.055), 2.4) }