random-colors-palette
Version:
It allows you to generate random colors from a set of palettes defined by material io.
113 lines (104 loc) • 2.89 kB
JavaScript
const groupBy = (xs, number, arr = []) =>
xs.reduce((rv, x, key) => {
if (arr.length < number) arr.push(x);
if (arr.length === number || key === xs.length - 1) {
rv.push(arr);
arr = [];
}
return rv;
}, []);
const hexToRgb = (hex, type = "string") => {
let result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
if (!result) return null;
result.shift();
const [r, g, b] = result.map((el) => parseInt(el, 16));
switch (type) {
case "obj":
return { r, g, b };
case "array":
return [r, g, b];
default:
return `rgb(${r}, ${g}, ${b})`;
}
};
const getContrastYIQ = (hex) => {
const { r, g, b } = hexToRgb(hex, "obj");
return (r * 299 + g * 587 + b * 114) / 1000 >= 128 ? "#000000" : "#FFFFFF";
};
const hexToHSL = (hex, type = "string") => {
let r = 0;
let g = 0;
let b = 0;
if (hex.length === 4) {
r = `0x${hex[1]}${hex[1]}`;
g = `0x${hex[2]}${hex[2]}`;
b = `0x${hex[3]}${hex[3]}`;
} else if (hex.length === 7) {
r = `0x${hex[1]}${hex[2]}`;
g = `0x${hex[3]}${hex[4]}`;
b = `0x${hex[5]}${hex[6]}`;
}
r /= 255;
g /= 255;
b /= 255;
const cmin = Math.min(r, g, b);
const cmax = Math.max(r, g, b);
const delta = cmax - cmin;
let h = 0;
let s = 0;
let l = 0;
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);
switch (type) {
case "obj":
return { h, s, l };
case "array":
return [h, s, l];
default:
return `hsl(${h}, ${s}%, ${l}%)`;
}
};
const setFormat = (hex, type) => {
switch (type) {
case "rgb":
return hexToRgb(hex);
case "rgb-obj":
return hexToRgb(hex, "obj");
case "rgb-array":
return hexToRgb(hex, "array");
case "hsl":
return hexToHSL(hex);
case "hsl-obj":
return hexToHSL(hex, "obj");
case "hsl-array":
return hexToHSL(hex, "array");
default:
return hex;
}
};
const hashCode = (str) =>
str.split("").reduce((acc, el) => {
acc = (acc << 5) - acc + el.charCodeAt(0);
return acc & acc;
}, 0);
const boundHashCode = (num, range) =>
typeof range === "number"
? range
: (num % Math.abs(range[1] - range[0])) + range[0];
export {
groupBy,
hexToRgb,
hexToHSL,
setFormat,
hashCode,
boundHashCode,
getContrastYIQ
};