@compositive/foundation
Version:
Compositive framework foundation package.
61 lines (58 loc) • 2.36 kB
JavaScript
import { __decorate } from 'tslib';
import { Memoized } from '@compositive/commons-memoize';
import { hexToHsluv, hsluvToHex } from 'hsluv';
import { linear } from '../easing/index.js';
import { Color } from './Color.js';
import { ColorScale } from './ColorScale.js';
import { Shade } from './Shade.js';
// FIXME: Support serializing the easing
class UniformLightnessColorScale extends ColorScale {
constructor(base, steps = 10, options = {}) {
var _a, _b, _c;
super();
this.steps = steps;
this.baseColor = new Color(base);
this.lightnessMin = (_a = options === null || options === void 0 ? void 0 : options.lightnessMin) !== null && _a !== void 0 ? _a : 1;
this.lightnessMax = (_b = options === null || options === void 0 ? void 0 : options.lightnessMax) !== null && _b !== void 0 ? _b : 99;
this.easing = (_c = options === null || options === void 0 ? void 0 : options.easing) !== null && _c !== void 0 ? _c : linear;
}
static async fromJson(json) {
return new UniformLightnessColorScale(json.baseColor, json.steps, {
lightnessMax: json.lightnessMax,
lightnessMin: json.lightnessMin,
});
}
get length() {
return this.steps;
}
get shades() {
const [hue, saturation] = hexToHsluv(this.baseColor.hex);
const step = 1 / (this.steps - 1);
const lightnesses = [];
for (let i = 0; i < this.steps; ++i)
lightnesses[i] =
this.lightnessMax +
(this.lightnessMin - this.lightnessMax) * this.easing(i * step);
return lightnesses.map((lightness, i) => new Shade(this, i, hsluvToHex([hue, saturation, lightness])));
}
reversed() {
return new UniformLightnessColorScale(this.baseColor, this.steps, {
lightnessMax: this.lightnessMin,
lightnessMin: this.lightnessMax,
easing: this.easing,
});
}
async toJson() {
return {
baseColor: this.baseColor,
lightnessMin: this.lightnessMin,
lightnessMax: this.lightnessMax,
steps: this.steps,
};
}
}
__decorate([
Memoized()
], UniformLightnessColorScale.prototype, "shades", null);
export { UniformLightnessColorScale };
//# sourceMappingURL=UniformLightnessColorScale.js.map