@spellix/magic-color-transformer
Version:
Magic color transform library
57 lines (52 loc) • 1.74 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const rgb = require('./rgb.js');
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 rgb.rgbToHex(labToRgb(color));
}
function labToHsl(color) {
return rgb.rgbToHsl(labToRgb(color));
}
function labToHsb(color) {
return rgb.rgbToHsb(labToRgb(color));
}
exports.isLab = isLab;
exports.labToHex = labToHex;
exports.labToHsb = labToHsb;
exports.labToHsl = labToHsl;
exports.labToRgb = labToRgb;
exports.parseLab = parseLab;