@spellix/magic-color-transformer
Version:
Magic color transform library
48 lines (45 loc) • 1.56 kB
JavaScript
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 };