@enact/sandstone
Version:
Large-screen/TV support library for Enact, containing a variety of UI components.
135 lines (130 loc) • 2.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.hexToHSL = exports.HSLToHex = void 0;
/**
* Checks for valid hex color, otherwise returns the black color.
*
* @param {String} hex Hex color
* @returns {String} Valid hex color
* @private
*/
var checkHex = function checkHex(hex) {
if (/^#[0-9A-F]{3,6}$/i.test(hex)) return hex;
return '#000000';
};
/**
* Converts hex color to hue, saturation, and lightness values.
*
* @param {String} hexColor
* @returns {{s: number, h: number, l: number}} HSL values
* @private
*/
var hexToHSL = exports.hexToHSL = function hexToHSL(hexColor) {
var hex = checkHex(hexColor);
// Convert hex to RGB first
var r = 0,
g = 0,
b = 0;
if (hex.length === 4) {
r = parseInt(hex[1] + hex[1], 16);
g = parseInt(hex[2] + hex[2], 16);
b = parseInt(hex[3] + hex[3], 16);
} else if (hex.length === 7) {
r = parseInt(hex.slice(1, 3), 16);
g = parseInt(hex.slice(3, 5), 16);
b = parseInt(hex.slice(5), 16);
}
// Then convert RGB to HSL
r /= 255;
g /= 255;
b /= 255;
var cmin = Math.min(r, g, b),
cmax = Math.max(r, g, b),
delta = cmax - cmin,
h,
s,
l;
if (delta === 0) {
h = 0;
} else if (cmax === r) {
h = (g - b) / delta % 6;
} else if (cmax === g) {
h = (b - r) / delta + 2;
} else {
h = (r - g) / delta + 4;
}
h = Math.round(h * 60);
if (h < 0) {
h += 360;
}
l = (cmax + cmin) / 2;
s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
s = +(s * 100).toFixed(1);
l = +(l * 100).toFixed(1);
return {
h: Math.round(h),
s: Math.round(s),
l: Math.round(l)
};
};
/**
* Converts hue, saturation, and lightness values to hex color.
*
* @param {Number} h Hue value
* @param {Number} s Saturation value
* @param {Number} l Lightness value
* @returns {string} 6-digit hex color
* @private
*/
var HSLToHex = exports.HSLToHex = function HSLToHex(h, s, l) {
s /= 100;
l /= 100;
var c = (1 - Math.abs(2 * l - 1)) * s,
x = c * (1 - Math.abs(h / 60 % 2 - 1)),
m = l - c / 2,
r = 0,
g = 0,
b = 0;
if (0 <= h && h < 60) {
r = c;
g = x;
b = 0;
} else if (60 <= h && h < 120) {
r = x;
g = c;
b = 0;
} else if (120 <= h && h < 180) {
r = 0;
g = c;
b = x;
} else if (180 <= h && h < 240) {
r = 0;
g = x;
b = c;
} else if (240 <= h && h < 300) {
r = x;
g = 0;
b = c;
} else if (300 <= h && h < 360) {
r = c;
g = 0;
b = x;
}
// Having obtained RGB, convert channels to hex
r = Math.round((r + m) * 255).toString(16);
g = Math.round((g + m) * 255).toString(16);
b = Math.round((b + m) * 255).toString(16);
// Prepend 0s, if necessary
if (r.length === 1) {
r = "0" + r;
}
if (g.length === 1) {
g = "0" + g;
}
if (b.length === 1) {
b = "0" + b;
}
return "#" + r + g + b;
};