nhb-toolbox
Version:
A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.
214 lines (213 loc) • 8.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.convertHex8ToHsla = exports.convertHslaToHex8 = exports.convertHex8ToRgba = exports.convertRgbaToHsla = exports.convertHslaToRgba = exports.convertRgbaToHex8 = exports.convertRgbToRgba = exports.convertHexToRgb = exports.convertRgbToHex = exports.convertHexToHsl = exports.convertHslToHex = exports.convertRgbToHsl = exports.convertHslToRgb = void 0;
exports.convertColorCode = convertColorCode;
const guards_1 = require("./guards");
const helpers_1 = require("./helpers");
const utils_1 = require("./utils");
const convertHslToRgb = (h, s, l) => {
s /= 100;
l /= 100;
const c = (1 - Math.abs(2 * l - 1)) * s;
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
const m = l - c / 2;
let r = 0, g = 0, b = 0;
if (h >= 0 && h < 60)
[r, g] = [c, x];
else if (h >= 60 && h < 120)
[r, g] = [x, c];
else if (h >= 120 && h < 180)
[g, b] = [c, x];
else if (h >= 180 && h < 240)
[g, b] = [x, c];
else if (h >= 240 && h < 300)
[r, b] = [x, c];
else if (h >= 300 && h < 360)
[r, b] = [c, x];
r = Math.round((r + m) * 255);
g = Math.round((g + m) * 255);
b = Math.round((b + m) * 255);
return `rgb(${r}, ${g}, ${b})`;
};
exports.convertHslToRgb = convertHslToRgb;
const convertRgbToHsl = (r, g, b) => {
r /= 255;
g /= 255;
b /= 255;
const max = Math.max(r, g, b);
const min = Math.min(r, g, b);
let h = 0, s = 0;
const l = (max + min) / 2;
if (max !== min) {
const diff = max - min;
s = l > 0.5 ? diff / (2 - max - min) : diff / (max + min);
switch (max) {
case r:
h = (g - b) / diff + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / diff + 2;
break;
case b:
h = (r - g) / diff + 4;
break;
}
h *= 60;
}
return `hsl(${Math.round(h)}, ${Number((s * 100).toFixed(2))}%, ${Number((l * 100).toFixed(2))}%)`;
};
exports.convertRgbToHsl = convertRgbToHsl;
const convertHslToHex = (h, s, l) => {
const rgb = (0, exports.convertHslToRgb)(h, s, l).match(/\d+/g)?.map(Number) ?? [0, 0, 0];
return (0, exports.convertRgbToHex)(rgb[0], rgb[1], rgb[2]);
};
exports.convertHslToHex = convertHslToHex;
const convertHexToHsl = (hex) => {
let newHex = hex?.trim()?.replace('#', '');
if (newHex?.length === 3) {
newHex = newHex
?.split('')
?.map((char) => char + char)
?.join('');
}
const r = parseInt(newHex.slice(0, 2), 16);
const g = parseInt(newHex.slice(2, 4), 16);
const b = parseInt(newHex.slice(4, 6), 16);
return (0, exports.convertRgbToHsl)(r, g, b);
};
exports.convertHexToHsl = convertHexToHsl;
const convertRgbToHex = (r, g, b) => {
const hex = [r, g, b]
?.map((v) => v.toString(16).padStart(2, '0'))
?.join('')
?.toUpperCase();
return `#${hex}`;
};
exports.convertRgbToHex = convertRgbToHex;
const convertHexToRgb = (hex) => {
let newHex = hex?.trim()?.replace('#', '');
if (newHex?.length === 3) {
newHex = newHex
?.split('')
?.map((char) => char + char)
?.join('');
}
const r = parseInt(newHex.slice(0, 2), 16);
const g = parseInt(newHex.slice(2, 4), 16);
const b = parseInt(newHex.slice(4, 6), 16);
return `rgb(${r}, ${g}, ${b})`;
};
exports.convertHexToRgb = convertHexToRgb;
const convertRgbToRgba = (r, g, b, a = 1) => {
let newAlpha = a;
if (!(0, helpers_1._isValidAlpha)(a)) {
newAlpha = 1;
console.warn(`Alpha value must be between 0-1, ${a} converted to 1!`);
}
return `rgba(${r}, ${g}, ${b}, ${parseFloat(newAlpha.toFixed(1))})`;
};
exports.convertRgbToRgba = convertRgbToRgba;
const convertRgbaToHex8 = (r, g, b, a = 1) => {
let newAlpha = a;
if (!(0, helpers_1._isValidAlpha)(a)) {
newAlpha = 1;
console.warn(`Alpha value must be between 0-1, ${a} converted to 1!`);
}
const alphaHex = (0, utils_1.percentToHex)(Math.round(newAlpha * 100));
const hex = (0, exports.convertRgbToHex)(r, g, b);
return `${hex}${alphaHex}`;
};
exports.convertRgbaToHex8 = convertRgbaToHex8;
const convertHslaToRgba = (h, s, l, a = 1) => {
let newAlpha = a;
if (!(0, helpers_1._isValidAlpha)(a)) {
newAlpha = 1;
console.warn(`Alpha value must be between 0-1, ${a} converted to 1!`);
}
const rgb = (0, exports.convertHslToRgb)(h, s, l);
const [r, g, b] = (0, utils_1.extractSolidColorValues)(rgb);
return (0, exports.convertRgbToRgba)(r, g, b, parseFloat(newAlpha.toFixed(1)));
};
exports.convertHslaToRgba = convertHslaToRgba;
const convertRgbaToHsla = (r, g, b, a = 1) => {
let newAlpha = a;
if (!(0, helpers_1._isValidAlpha)(a)) {
newAlpha = 1;
console.warn(`Alpha value must be between 0-1, ${a} converted to 1!`);
}
const hsl = (0, exports.convertRgbToHsl)(r, g, b);
const [h, s, l] = (0, utils_1.extractSolidColorValues)(hsl);
return `hsla(${h}, ${s}%, ${l}%, ${parseFloat(newAlpha.toFixed(1))})`;
};
exports.convertRgbaToHsla = convertRgbaToHsla;
const convertHex8ToRgba = (hex8) => {
const hex = hex8?.trim()?.replace('#', '');
const r = parseInt(hex.slice(0, 2), 16);
const g = parseInt(hex.slice(2, 4), 16);
const b = parseInt(hex.slice(4, 6), 16);
const a = parseInt(hex.slice(6, 8), 16) / 255;
return `rgba(${r}, ${g}, ${b}, ${parseFloat(a.toFixed(1))})`;
};
exports.convertHex8ToRgba = convertHex8ToRgba;
const convertHslaToHex8 = (h, s, l, a = 1) => {
let newAlpha = a;
if (!(0, helpers_1._isValidAlpha)(a)) {
newAlpha = 1;
console.warn(`Alpha value must be between 0-1, ${a} converted to 1!`);
}
const alphaHex = (0, utils_1.percentToHex)(Math.round(newAlpha * 100));
const hex = (0, exports.convertHslToHex)(h, s, l);
return `${hex}${alphaHex}`;
};
exports.convertHslaToHex8 = convertHslaToHex8;
const convertHex8ToHsla = (hex8) => {
const rgba = (0, exports.convertHex8ToRgba)(hex8);
return (0, exports.convertRgbaToHsla)(...(0, utils_1.extractAlphaColorValues)(rgba));
};
exports.convertHex8ToHsla = convertHex8ToHsla;
function convertColorCode(color) {
const trimmedColor = color?.trim();
if ((0, guards_1.isHex6)(trimmedColor)) {
return {
rgb: (0, exports.convertHexToRgb)(trimmedColor),
hsl: (0, exports.convertHexToHsl)(trimmedColor),
};
}
if ((0, guards_1.isRGB)(trimmedColor)) {
const rgbValues = (0, utils_1.extractSolidColorValues)(trimmedColor);
return {
hex: (0, exports.convertRgbToHex)(...rgbValues),
hsl: (0, exports.convertRgbToHsl)(...rgbValues),
};
}
if ((0, guards_1.isHSL)(trimmedColor)) {
const hslValues = (0, utils_1.extractSolidColorValues)(trimmedColor);
return {
hex: (0, exports.convertHslToHex)(...hslValues),
rgb: (0, exports.convertHslToRgb)(...hslValues),
};
}
if ((0, guards_1.isHex8)(trimmedColor)) {
return {
rgba: (0, exports.convertHex8ToRgba)(trimmedColor),
hsla: (0, exports.convertHex8ToHsla)(trimmedColor),
};
}
if ((0, guards_1.isRGBA)(trimmedColor)) {
const rgbaValues = (0, utils_1.extractAlphaColorValues)(trimmedColor);
return {
hex8: (0, exports.convertRgbaToHex8)(...rgbaValues),
hsla: (0, exports.convertRgbaToHsla)(...rgbaValues),
};
}
if ((0, guards_1.isHSLA)(trimmedColor)) {
const hslaValues = (0, utils_1.extractAlphaColorValues)(trimmedColor);
return {
hex8: (0, exports.convertHslaToHex8)(...hslaValues),
rgba: (0, exports.convertHslaToRgba)(...hslaValues),
};
}
throw new TypeError(`${color} is not a valid color!`, {
cause: 'Unrecognized Color Format',
});
}