ts-useful
Version:
Functions for animation, color transitions, ecliptic, bezier, decasteljau, curves, three dimensional curves, smooth scrolling, random range, randomItem, mobius index, vectors, physics vectors, and easing.
67 lines • 2.94 kB
JavaScript
import { ColorVect } from './abstract/colorVect';
import { calculateStep } from './calculateStep';
import { Clamp } from './clamp';
import { tau } from './constants';
import { Lerp } from './lerp';
export class ColorPercent extends Array {
}
ColorPercent.regexArray = [
// #a0b1c2
{ regex: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/i,
converter: (e) => [parseInt(e[1].toString(), 16), parseInt(e[2].toString(), 16), parseInt(e[3].toString(), 16)] },
// #fff
{ regex: /#([a-f0-9])([a-f0-9])([a-f0-9])/i,
converter: (e) => [parseInt(e[1] + e[1], 16), parseInt(e[2] + e[2], 16), parseInt(e[3] + e[3], 16)] },
// rgb(num,num,num)
{ regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,
converter: (e) => [parseInt(e[1], 10), parseInt(e[2], 10), parseInt(e[3], 10)] },
// rgb(num%,num%,num%)
{ regex: /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/,
converter: (e) => [parseFloat(e[1]) * 2.55, parseFloat(e[2]) * 2.55, parseFloat(e[3]) * 2.55] }
];
ColorPercent.getRgb = (color) => {
const rxc = ColorPercent.regexArray.find((rx) => rx.regex.test(color));
if (rxc)
return rxc.converter(rxc.regex.exec(color));
throw new Error(`getRgb Invalid color: ${color}`);
};
ColorPercent.colorDecToHex = (r, g, b) => `#${(1 << 24 | (r << 16) | (g << 8) | (b << 0)).toString(16).slice(1)}`;
/**
*
* @param colorList string[]: ['#ff0000', '#0000FF']
* @param percent number: .03
* @returns hex color.
*/
ColorPercent.getColor = (colorList, percent) => {
const stepInfo = calculateStep(colorList, percent);
const color = (position) => {
const [startColor, endColor] = [ColorPercent.getRgb(stepInfo.current), ColorPercent.getRgb(stepInfo.next)];
return Math.floor(Lerp(startColor[position], endColor[position], stepInfo.percent));
};
return ColorPercent.colorDecToHex(color(0), color(1), color(2));
};
/**
*
* @param t number (float)
* @param a vector3
* @param b vector3
* @param c vector3
* @param d vector3
* @returns Hex string
*/
ColorPercent.makePalette = (t, a, b, c, d) => {
const calced = ColorVect.multiplyBy(ColorVect.multiply(c, ColorVect.addBy(d, t)), tau).map((v) => {
return Math.cos(v);
});
const rgb = ColorVect.multiply(ColorVect.add(a, b), calced).map((v) => Math.floor(Clamp(Math.abs(v), 0, 1) * 100));
const colorString = `rgb(${rgb[0]}%, ${rgb[1]}%, ${rgb[2]}%)`;
const result = ColorPercent.getRgb(colorString);
return ColorPercent.colorDecToHex(result[0], result[1], result[2]);
};
ColorPercent.lighen = (color, percent) => {
return ColorPercent.getColor([color, '#FFFFFF'], percent);
};
ColorPercent.darken = (color, percent) => {
return ColorPercent.getColor([color, '#000000'], percent);
};
//# sourceMappingURL=colorPercent.js.map