@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
90 lines • 11.8 kB
JavaScript
import { inject, Injectable } from '@angular/core';
import { colorSets, COLOR_SET_TOKEN } from './color-sets/index';
import { ThemeColor } from './theme-color';
import * as i0 from "@angular/core";
export class ColorService {
/** Allow the color set to be provided in a forRoot function otherwise set it to the Keppel theme by default */
constructor() {
this._colorSet = inject(COLOR_SET_TOKEN, { optional: true });
// resolve the theme based on the colorset
this._theme = this.getTheme(this._colorSet);
}
/**
* Get a ThemeColor object from a color name
* @param colorName The name of the color from the color palette
*/
getColor(colorName) {
// get the matching ThemeColor from the active theme
const themeColor = this._theme[this.resolveColorName(colorName)];
// if there is not a match then throw an error
if (!themeColor) {
throw new Error('Color not found: ' + colorName);
}
return new ThemeColor(themeColor.getRed(), themeColor.getGreen(), themeColor.getBlue(), themeColor.getAlpha());
}
/**
* Get the active color set
*/
getColorSet() {
return this._colorSet;
}
/**
* Define the current color set and produce a Theme from it
*/
setColorSet(colorSet) {
this._colorSet = colorSet;
this._theme = this.getTheme(colorSet);
}
/**
* Resolve a color value. This may be the name of a color from the color set
* or it may simply be a hex or rgb(a) color value. This function will return
* a CSS color value regardless of which one of these formats it is
* @param value The color name, hex code or rgb(a) value to resolve
* @returns If the color is the name of a color in the set, the `rgba` color will be returned, otherwise the original CSS value will be returned.
*/
resolve(value) {
if (!value) {
return;
}
const colorName = this.resolveColorName(value);
for (const color in this._theme) {
if (colorName === color.toLowerCase()) {
return this.getColor(colorName).toRgba();
}
}
return value;
}
/**
* Converts a color name to an appropriate ColorSet name. For example
* a color may be written in lower-camel-case, however color sets are in
* kebab-case. This will convert to the appropriate naming format
* @param colorName The color name to resolve
*/
resolveColorName(colorName = '') {
return colorName.replace(/\s+/g, '-').toLowerCase();
}
/** Determine if the current colorset has a specific color */
colorExists(name) {
return !!Object.keys(this._theme).find(colorName => colorName === this.resolveColorName(name));
}
/** Create a theme from a colorset */
getTheme(colorSet) {
// create a new theme object
const theme = {};
// ensure we have a colorset
if (!colorSet) {
colorSet = colorSets.keppel;
}
// iterate over each hex code and convert it to a theme color
for (const color in colorSet.colorValueSet) {
theme[color] = ThemeColor.parse(colorSet.colorValueSet[color]);
}
return theme;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ColorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ColorService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ColorService, decorators: [{
type: Injectable
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb2xvci9jb2xvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBWSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHM0MsTUFBTSxPQUFPLFlBQVk7SUFNckIsK0dBQStHO0lBQy9HO1FBTlEsY0FBUyxHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQVE1RCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLFNBQTBCO1FBRS9CLG9EQUFvRDtRQUNwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRWpFLDhDQUE4QztRQUM5QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxPQUFPLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ25ILENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDUCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLFFBQWtCO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsT0FBTyxDQUFDLEtBQWE7UUFDakIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsT0FBTztRQUNYLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0MsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUIsSUFBSSxTQUFTLEtBQUssS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQixDQUFDLFlBQW9CLEVBQUU7UUFDbkMsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELFdBQVcsQ0FBQyxJQUFZO1FBQ3BCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQscUNBQXFDO0lBQzdCLFFBQVEsQ0FBQyxRQUFrQjtRQUMvQiw0QkFBNEI7UUFDNUIsTUFBTSxLQUFLLEdBQVUsRUFBRSxDQUFDO1FBRXhCLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxDQUFDO1FBRUQsNkRBQTZEO1FBQzdELEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzsrR0FuR1EsWUFBWTttSEFBWixZQUFZOzs0RkFBWixZQUFZO2tCQUR4QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2xvclNldCwgY29sb3JTZXRzLCBDT0xPUl9TRVRfVE9LRU4gfSBmcm9tICcuL2NvbG9yLXNldHMvaW5kZXgnO1xuaW1wb3J0IHsgVGhlbWVDb2xvciB9IGZyb20gJy4vdGhlbWUtY29sb3InO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29sb3JTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9jb2xvclNldCA9IGluamVjdChDT0xPUl9TRVRfVE9LRU4sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgICAvKiogU2V0IHRoZSBkZWZhdWx0IHRoZW1lIHRvIHRoZSBLZXBwZWwgY29sb3JzZXQgKi9cbiAgICBwcml2YXRlIF90aGVtZTogUmVhZG9ubHk8VGhlbWU+O1xuXG4gICAgLyoqIEFsbG93IHRoZSBjb2xvciBzZXQgdG8gYmUgcHJvdmlkZWQgaW4gYSBmb3JSb290IGZ1bmN0aW9uIG90aGVyd2lzZSBzZXQgaXQgdG8gdGhlIEtlcHBlbCB0aGVtZSBieSBkZWZhdWx0ICovXG4gICAgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgLy8gcmVzb2x2ZSB0aGUgdGhlbWUgYmFzZWQgb24gdGhlIGNvbG9yc2V0XG4gICAgICAgIHRoaXMuX3RoZW1lID0gdGhpcy5nZXRUaGVtZSh0aGlzLl9jb2xvclNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgVGhlbWVDb2xvciBvYmplY3QgZnJvbSBhIGNvbG9yIG5hbWVcbiAgICAgKiBAcGFyYW0gY29sb3JOYW1lIFRoZSBuYW1lIG9mIHRoZSBjb2xvciBmcm9tIHRoZSBjb2xvciBwYWxldHRlXG4gICAgICovXG4gICAgZ2V0Q29sb3IoY29sb3JOYW1lOiBDb2xvcklkZW50aWZpZXIpOiBUaGVtZUNvbG9yIHtcblxuICAgICAgICAvLyBnZXQgdGhlIG1hdGNoaW5nIFRoZW1lQ29sb3IgZnJvbSB0aGUgYWN0aXZlIHRoZW1lXG4gICAgICAgIGNvbnN0IHRoZW1lQ29sb3IgPSB0aGlzLl90aGVtZVt0aGlzLnJlc29sdmVDb2xvck5hbWUoY29sb3JOYW1lKV07XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm90IGEgbWF0Y2ggdGhlbiB0aHJvdyBhbiBlcnJvclxuICAgICAgICBpZiAoIXRoZW1lQ29sb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29sb3Igbm90IGZvdW5kOiAnICsgY29sb3JOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgVGhlbWVDb2xvcih0aGVtZUNvbG9yLmdldFJlZCgpLCB0aGVtZUNvbG9yLmdldEdyZWVuKCksIHRoZW1lQ29sb3IuZ2V0Qmx1ZSgpLCB0aGVtZUNvbG9yLmdldEFscGhhKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYWN0aXZlIGNvbG9yIHNldFxuICAgICAqL1xuICAgIGdldENvbG9yU2V0KCk6IENvbG9yU2V0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbG9yU2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSB0aGUgY3VycmVudCBjb2xvciBzZXQgYW5kIHByb2R1Y2UgYSBUaGVtZSBmcm9tIGl0XG4gICAgICovXG4gICAgc2V0Q29sb3JTZXQoY29sb3JTZXQ6IENvbG9yU2V0KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NvbG9yU2V0ID0gY29sb3JTZXQ7XG4gICAgICAgIHRoaXMuX3RoZW1lID0gdGhpcy5nZXRUaGVtZShjb2xvclNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBhIGNvbG9yIHZhbHVlLiBUaGlzIG1heSBiZSB0aGUgbmFtZSBvZiBhIGNvbG9yIGZyb20gdGhlIGNvbG9yIHNldFxuICAgICAqIG9yIGl0IG1heSBzaW1wbHkgYmUgYSBoZXggb3IgcmdiKGEpIGNvbG9yIHZhbHVlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuXG4gICAgICogYSBDU1MgY29sb3IgdmFsdWUgcmVnYXJkbGVzcyBvZiB3aGljaCBvbmUgb2YgdGhlc2UgZm9ybWF0cyBpdCBpc1xuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgY29sb3IgbmFtZSwgaGV4IGNvZGUgb3IgcmdiKGEpIHZhbHVlIHRvIHJlc29sdmVcbiAgICAgKiBAcmV0dXJucyBJZiB0aGUgY29sb3IgaXMgdGhlIG5hbWUgb2YgYSBjb2xvciBpbiB0aGUgc2V0LCB0aGUgYHJnYmFgIGNvbG9yIHdpbGwgYmUgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgb3JpZ2luYWwgQ1NTIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcmVzb2x2ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sb3JOYW1lID0gdGhpcy5yZXNvbHZlQ29sb3JOYW1lKHZhbHVlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNvbG9yIGluIHRoaXMuX3RoZW1lKSB7XG4gICAgICAgICAgICBpZiAoY29sb3JOYW1lID09PSBjb2xvci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29sb3IoY29sb3JOYW1lKS50b1JnYmEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIGNvbG9yIG5hbWUgdG8gYW4gYXBwcm9wcmlhdGUgQ29sb3JTZXQgbmFtZS4gRm9yIGV4YW1wbGVcbiAgICAgKiBhIGNvbG9yIG1heSBiZSB3cml0dGVuIGluIGxvd2VyLWNhbWVsLWNhc2UsIGhvd2V2ZXIgY29sb3Igc2V0cyBhcmUgaW5cbiAgICAgKiBrZWJhYi1jYXNlLiBUaGlzIHdpbGwgY29udmVydCB0byB0aGUgYXBwcm9wcmlhdGUgbmFtaW5nIGZvcm1hdFxuICAgICAqIEBwYXJhbSBjb2xvck5hbWUgVGhlIGNvbG9yIG5hbWUgdG8gcmVzb2x2ZVxuICAgICAqL1xuICAgIHJlc29sdmVDb2xvck5hbWUoY29sb3JOYW1lOiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjb2xvck5hbWUucmVwbGFjZSgvXFxzKy9nLCAnLScpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqIERldGVybWluZSBpZiB0aGUgY3VycmVudCBjb2xvcnNldCBoYXMgYSBzcGVjaWZpYyBjb2xvciAqL1xuICAgIGNvbG9yRXhpc3RzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFPYmplY3Qua2V5cyh0aGlzLl90aGVtZSkuZmluZChjb2xvck5hbWUgPT4gY29sb3JOYW1lID09PSB0aGlzLnJlc29sdmVDb2xvck5hbWUobmFtZSkpO1xuICAgIH1cblxuICAgIC8qKiBDcmVhdGUgYSB0aGVtZSBmcm9tIGEgY29sb3JzZXQgKi9cbiAgICBwcml2YXRlIGdldFRoZW1lKGNvbG9yU2V0OiBDb2xvclNldCk6IFJlYWRvbmx5PFRoZW1lPiB7XG4gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyB0aGVtZSBvYmplY3RcbiAgICAgICAgY29uc3QgdGhlbWU6IFRoZW1lID0ge307XG5cbiAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSBjb2xvcnNldFxuICAgICAgICBpZiAoIWNvbG9yU2V0KSB7XG4gICAgICAgICAgICBjb2xvclNldCA9IGNvbG9yU2V0cy5rZXBwZWw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpdGVyYXRlIG92ZXIgZWFjaCBoZXggY29kZSBhbmQgY29udmVydCBpdCB0byBhIHRoZW1lIGNvbG9yXG4gICAgICAgIGZvciAoY29uc3QgY29sb3IgaW4gY29sb3JTZXQuY29sb3JWYWx1ZVNldCkge1xuICAgICAgICAgICAgdGhlbWVbY29sb3JdID0gVGhlbWVDb2xvci5wYXJzZShjb2xvclNldC5jb2xvclZhbHVlU2V0W2NvbG9yXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhlbWU7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRoZW1lIHtcbiAgICBbbmFtZTogc3RyaW5nXTogVGhlbWVDb2xvcjtcbn1cblxuZXhwb3J0IHR5cGUgQ29sb3JJZGVudGlmaWVyID0gc3RyaW5nO1xuIl19