UNPKG

@spellix/magic-color-transformer

Version:

Magic color transform library

48 lines (45 loc) 1.56 kB
import { rgbToHex, rgbToHsl, rgbToHsb } from './rgb.mjs'; const labRegex = /^lab\(\s*(100|[1-9]?\d(?:\.\d+)?)\s+(-?(?:1[01]\d|12[0-8]|\d?\d)(?:\.\d+)?)\s+(-?(?:1[01]\d|12[0-8]|\d?\d)(?:\.\d+)?)(?:\s*\/\s*(0|0?\.\d+|1(?:\.0)?))?\s*\)$/; function isLab(color) { return labRegex.test(color); } function parseLab(color) { const match = labRegex.exec(color); if (!match) throw new Error("Invalid Lab color format."); const lab = [Number.parseFloat(match[1]), Number.parseFloat(match[2]), Number.parseFloat(match[3])]; const alpha = match[4] ? Number.parseFloat(match[4]) : 1; return { values: lab, alpha }; } function xyz_rgb(r) { r = 255 * (r <= 304e-5 ? 12.92 * r : 1.055 * r ** (1 / 2.4) - 0.055); return Math.min(Math.max(0, r), 255); } function lab_xyz(t) { return t > 0.206896552 ? t * t * t : 0.12841855 * (t - 0.137931034); } function labToRgb(color) { const [l, a, b] = color; let x; let y; let z; y = (l + 16) / 116; x = y + a / 500; z = y - b / 200; y = Number(lab_xyz(y)); x = 0.95047 * lab_xyz(x); z = 1.08883 * lab_xyz(z); const r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z); const g = xyz_rgb(-0.969266 * x + 1.8760108 * y + 0.041556 * z); const b_ = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z); return [r, g, b_]; } function labToHex(color) { return rgbToHex(labToRgb(color)); } function labToHsl(color) { return rgbToHsl(labToRgb(color)); } function labToHsb(color) { return rgbToHsb(labToRgb(color)); } export { isLab, labToHex, labToHsb, labToHsl, labToRgb, parseLab };