@tolokoban/ui
Version:
React components with theme
220 lines • 17 kB
JavaScript
const canvas = document.createElement("canvas");
canvas.width = 1;
canvas.height = 1;
const INV_6 = 1 / 6;
class Color {
static get ctx() {
if (!Color._ctx) {
const canvas = document.createElement("canvas");
canvas.width = 1;
canvas.height = 1;
const ctx = canvas.getContext("2d");
if (!ctx)
throw Error("[Color] Unable to create CanvasRenderingContext2D!");
Color._ctx = ctx;
}
return Color._ctx;
}
static makeGradient(size, ...from) {
const colors = [];
const factor = 1 / (size - 1);
for (let i = 0; i < size; i++) {
colors.push(Color.mix(i * factor, ...from));
}
return colors;
}
/**
* Get a value from a colorramp made of `from` colors.
*
* @param from Colors
* @param value From 0.0 to 1.0
*/
static mix(value, ...from) {
const inputs = from.map((source) => new Color(source));
const steps = inputs.length - 1;
if (steps < 0)
return new Color("#000");
if (steps === 0)
return inputs[0];
const start = Math.min(Math.floor(value * steps), steps - 1);
const colorA = inputs[start + 1];
const colorB = inputs[start];
const a = steps * (value - start / steps);
const b = 1 - a;
return new Color(`color-mix(in lch, ${colorA.toString()}, ${colorB.toString()} ${100 * b}%)`);
}
static isLight(colorSource) {
const color = new Color(colorSource);
return color.isLight();
}
static isDark(colorSource) {
const color = new Color(colorSource);
return color.isDark();
}
/**
* @param backgroundColor Reference color.
* @param foregroundColors Candidates colors.
* @returns Find among `foregroundColors` the one that has the most contrast with `backgroundColor`.
*/
static bestContrast(backgroundColor, ...foregroundColors) {
const bgColor = new Color(backgroundColor);
const bgLightness = bgColor.perceivedLightness;
const fgColors = foregroundColors.map((color) => new Color(color));
const fgLightnesses = fgColors.map((color) => color.perceivedLightness);
let bestIndex = 0;
let bestContrast = Math.abs(bgLightness - fgLightnesses[0]);
for (let index = 1; index < fgColors.length; index++) {
const contrast = Math.abs(bgLightness - fgLightnesses[index]);
if (contrast > bestContrast) {
bestIndex = index;
bestContrast = contrast;
}
}
return fgColors[bestIndex];
}
constructor(colorSource) {
this.R = 0;
this.G = 0;
this.B = 0;
this.H = 0;
this.S = 0;
this.L = 0;
this.A = 0;
this.from(colorSource);
}
from(colorSource) {
if (typeof colorSource === "string") {
const ctx = Color.ctx;
ctx.clearRect(0, 0, 1, 1);
ctx.fillStyle = colorSource;
ctx.fillRect(0, 0, 1, 1);
const img = ctx.getImageData(0, 0, 1, 1);
const [r, g, b, a] = img.data;
const factor = 1 / 255;
this.R = r * factor;
this.G = g * factor;
this.B = b * factor;
this.A = a * factor;
}
else {
this.R = colorSource.R;
this.G = colorSource.G;
this.B = colorSource.B;
this.A = colorSource.A;
}
return this;
}
toString() {
const c = (value) => Math.floor(255 * value)
.toString(16)
.padStart(2, "0");
return `#${c(this.R)}${c(this.G)}${c(this.B)}${c(this.A)}`;
}
get luminance() {
return (0.2126 * this.sRgbToLinear(this.R) +
0.7152 * this.sRgbToLinear(this.G) +
0.0722 * this.sRgbToLinear(this.B));
}
get perceivedLightness() {
const Y = this.luminance;
return ((Y <= 216 / 24389
? Y * (24389 / 27)
: Math.pow(Y, 1 / 3) * 116 - 16) * 1e-2);
}
/**
* Remove gamma from sRGB component.
*/
sRgbToLinear(value) {
return value < 0.04045
? value / 12.92
: Math.pow((value + 0.055) / 1.055, 2.4);
}
isLight() {
return !this.isDark();
}
isDark() {
return this.perceivedLightness < 0.5;
}
rgb2hsl() {
const R = this.R;
const G = this.G;
const B = this.B;
const min = Math.min(R, G, B);
const max = Math.max(R, G, B);
const delta = max - min;
this.L = 0.5 * (max + min);
if (delta < 1e-6) {
this.H = 0;
this.S = 0;
}
else {
this.S = delta / (1 - Math.abs(this.L + this.L - 1));
if (max === R) {
this.H =
G >= B
? INV_6 * ((G - B) / delta)
: INV_6 * ((B - G) / delta);
}
else if (max === G) {
this.H = INV_6 * (2 + (B - R) / delta);
}
else {
this.H = INV_6 * (4 + (R - G) / delta);
}
}
}
/**
* @see https://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB
*/
hsl2rgb() {
const H = 6 * this.H;
const S = this.S;
const L = this.L;
const chroma = (1 - Math.abs(L + L - 1)) * S;
const x = chroma * (1 - Math.abs((H % 2) - 1));
let R = 0;
let G = 0;
let B = 0;
if (H < 3) {
if (H < 1) {
R = chroma;
G = x;
B = 0;
}
else if (H < 2) {
R = x;
G = chroma;
B = 0;
}
else {
// H == 2.
R = 0;
G = chroma;
B = x;
}
}
else if (H < 4) {
R = 0;
G = x;
B = chroma;
}
else if (H < 5) {
R = x;
G = 0;
B = chroma;
}
else {
R = chroma;
G = 0;
B = x;
}
const shift = L - chroma * 0.5;
this.R = R + shift;
this.G = G + shift;
this.B = B + shift;
return this;
}
}
Color._ctx = null;
export default Color;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUMvQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQTtBQUNoQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtBQUVqQixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ25CLE1BQXFCLEtBQUs7SUFHZCxNQUFNLEtBQUssR0FBRztRQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMvQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQTtZQUNoQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtZQUNqQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ25DLElBQUksQ0FBQyxHQUFHO2dCQUNKLE1BQU0sS0FBSyxDQUNQLG9EQUFvRCxDQUN2RCxDQUFBO1lBRUwsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUE7UUFDcEIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQTtJQUNyQixDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFZLEVBQUUsR0FBRyxJQUEyQjtRQUM1RCxNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUE7UUFDMUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QixNQUFN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