export function hexToRgb(hex: string) { const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; const hexTmp = hex.replace(shorthandRegex, (m, r, g, b) => ( r + r + g + g + b + b )); const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexTmp); return result ? { r: parseInt(result[1], 16), g: parseInt(result[2], 16), b: parseInt(result[3], 16), } : null; } export const getOpaqueHexColor = (hex: string, opacity: number) => { const rgb = hexToRgb(hex); if (!rgb) return hex; return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${opacity})`; }; export function luminance(r: number, g: number, b: number) { const a = [r, g, b].map((v) => { const tmp = v / 255; return tmp <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4; }); return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; } export function contrast(luminance1: number, luminance2: number) { return luminance1 > luminance2 ? ((luminance2 + 0.05) / (luminance1 + 0.05)) : ((luminance1 + 0.05) / (luminance2 + 0.05)); }