color-util-helpers 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -4
- package/color-util-helpers-1.0.4.tgz +0 -0
- package/esm2022/lib/color-lighten-darken.service.mjs +79 -0
- package/esm2022/lib/color-pallette.service.mjs +24 -9
- package/esm2022/lib/color-scheme.service.mjs +113 -0
- package/esm2022/lib/color-utilities-demo/color-utilities-demo.component.mjs +41 -0
- package/esm2022/lib/color-utils.module.mjs +32 -0
- package/esm2022/lib/text-color.service.mjs +32 -11
- package/esm2022/public-api.mjs +5 -1
- package/fesm2022/color-util-helpers.mjs +341 -55
- package/fesm2022/color-util-helpers.mjs.map +1 -1
- package/lib/color-lighten-darken.service.d.ts +10 -0
- package/lib/color-pallette.service.d.ts +18 -0
- package/lib/color-scheme.service.d.ts +45 -0
- package/lib/color-utilities-demo/color-utilities-demo.component.d.ts +34 -0
- package/lib/color-utils.module.d.ts +10 -0
- package/lib/text-color.service.d.ts +3 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -0
- package/color-util-helpers-1.0.2.tgz +0 -0
package/README.md
CHANGED
|
@@ -1,9 +1,28 @@
|
|
|
1
1
|
# Color Utilities
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This lib contains a variety of very useful color utils
|
|
4
|
+
|
|
5
|
+
- Color conversion (HEX<->RGB)
|
|
6
|
+
- Generate a Color Pallette (from image - eg: Pintrest before image loads)
|
|
7
|
+
- Color Extractor Directive (from inline image - eg: Pintrest before image loads)
|
|
8
|
+
- Text Color - provides the color to use (you provide light and dark) based on color provided
|
|
9
|
+
- Color Lighten Darken - Takes a color and you can darken or lighten
|
|
10
|
+
- Generate Random Color - This function generates a random hue value between 0 and 360 degrees, and random saturation and lightness values between 50% and 100%.
|
|
11
|
+
|
|
12
|
+
## Demo
|
|
13
|
+
|
|
14
|
+
Import the `ColorUtilsModule`
|
|
15
|
+
|
|
16
|
+
add the selector `<app-color-utilities-demo></app-color-utilities-demo>`
|
|
17
|
+
|
|
18
|
+
## Color Conversion Service
|
|
4
19
|
|
|
5
20
|
Converts RGB to HEX or HEX to RGB
|
|
6
21
|
|
|
22
|
+
### Installation
|
|
23
|
+
|
|
24
|
+
npm install color-util-helpers
|
|
25
|
+
|
|
7
26
|
### Usage
|
|
8
27
|
|
|
9
28
|
rgbToHex(rgb: number[]): string
|
|
@@ -11,7 +30,7 @@ Converts RGB to HEX or HEX to RGB
|
|
|
11
30
|
hexToRgb(hex: string): string
|
|
12
31
|
|
|
13
32
|
|
|
14
|
-
## Color Pallette
|
|
33
|
+
## Color Pallette Service and Directive
|
|
15
34
|
|
|
16
35
|
define image path
|
|
17
36
|
|
|
@@ -56,11 +75,51 @@ CSS Style
|
|
|
56
75
|
justify-content: center;
|
|
57
76
|
}
|
|
58
77
|
|
|
59
|
-
## Text Color
|
|
78
|
+
## Text Color Service
|
|
60
79
|
|
|
61
80
|
Provide a color that is used for a background and then provide the lightColor and darkColor
|
|
62
81
|
The function will return the appropriate color based on the background color provided
|
|
63
82
|
|
|
64
83
|
### Usage
|
|
65
84
|
|
|
66
|
-
|
|
85
|
+
This function takes `bgColor` and by providing the `lightColor` and `darkColor` compares them to the background and returns the color that will best work for the visibility of the background color.
|
|
86
|
+
|
|
87
|
+
These colors may be represented as RGB or HEX
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
textColorForBgColor(bgColor: string, lightColor: string, darkColor: string)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
This function takes two colors and compares them and returns the darker color.
|
|
94
|
+
The color may be represented as RGB or HEX
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
isColorDarker(color1: string, color2: string)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Color Lighten Darken Service
|
|
101
|
+
|
|
102
|
+
This function takes a color and percentage of lightness/darkness and returns the new color. The amount is a value between 0-1. This function changes the HSL of the color keeping the saturation values.
|
|
103
|
+
|
|
104
|
+
Example: .5 is 50%.
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
lighten(color: string, amount: number)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
darken(color: string, amount: number)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Generate Random Color Service
|
|
115
|
+
|
|
116
|
+
This function takes a color '#3498db' and lightens the color by 20% and also darkens the color by 20%.
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
const color = '#3498db'; // Your color
|
|
120
|
+
const lighterColor = lighten(color, 0.2); // 20% lighter
|
|
121
|
+
const darkerColor = darken(color, 0.2); // 20% darker
|
|
122
|
+
|
|
123
|
+
console.log(lighterColor, darkerColor);
|
|
124
|
+
```
|
|
125
|
+
|
|
Binary file
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { TextColorService } from './text-color.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class ColorLightenDarkenService {
|
|
5
|
+
// const color = '#3498db'; // Your color
|
|
6
|
+
// const lighterColor = lighten(color, 0.2); // 20% lighter
|
|
7
|
+
// const darkerColor = darken(color, 0.2); // 20% darker
|
|
8
|
+
// console.log(lighterColor, darkerColor);
|
|
9
|
+
constructor() {
|
|
10
|
+
this.colors = inject(TextColorService);
|
|
11
|
+
}
|
|
12
|
+
lighten(color, amount) {
|
|
13
|
+
const rgb = this.colors.fixColor(color);
|
|
14
|
+
// const rgb = color.match(/\w\w/g)?.map((x) => parseInt(x, 16)) || [];
|
|
15
|
+
// Convert RGB to HSL
|
|
16
|
+
let [r, g, b] = rgb.map((c) => c / 255);
|
|
17
|
+
const max = Math.max(r, g, b), min = Math.min(r, g, b);
|
|
18
|
+
let h = 0, s = 0, l = (max + min) / 2;
|
|
19
|
+
if (max !== min) {
|
|
20
|
+
const d = max - min;
|
|
21
|
+
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
22
|
+
switch (max) {
|
|
23
|
+
case r:
|
|
24
|
+
h = (g - b) / d + (g < b ? 6 : 0);
|
|
25
|
+
break;
|
|
26
|
+
case g:
|
|
27
|
+
h = (b - r) / d + 2;
|
|
28
|
+
break;
|
|
29
|
+
case b:
|
|
30
|
+
h = (r - g) / d + 4;
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
h /= 6;
|
|
34
|
+
}
|
|
35
|
+
// Modify the lightness and clamp it to [0, 1]
|
|
36
|
+
l = Math.min(1, l + amount);
|
|
37
|
+
// Convert HSL back to RGB
|
|
38
|
+
if (s === 0) {
|
|
39
|
+
r = g = b = l; // achromatic
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const hue2rgb = (p, q, t) => {
|
|
43
|
+
if (t < 0)
|
|
44
|
+
t += 1;
|
|
45
|
+
if (t > 1)
|
|
46
|
+
t -= 1;
|
|
47
|
+
if (t < 1 / 6)
|
|
48
|
+
return p + (q - p) * 6 * t;
|
|
49
|
+
if (t < 1 / 2)
|
|
50
|
+
return q;
|
|
51
|
+
if (t < 2 / 3)
|
|
52
|
+
return p + (q - p) * (2 / 3 - t) * 6;
|
|
53
|
+
return p;
|
|
54
|
+
};
|
|
55
|
+
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
56
|
+
const p = 2 * l - q;
|
|
57
|
+
r = hue2rgb(p, q, h + 1 / 3);
|
|
58
|
+
g = hue2rgb(p, q, h);
|
|
59
|
+
b = hue2rgb(p, q, h - 1 / 3);
|
|
60
|
+
}
|
|
61
|
+
// Convert RGB back to hexadecimal color
|
|
62
|
+
const toHex = (x) => Math.round(x * 255)
|
|
63
|
+
.toString(16)
|
|
64
|
+
.padStart(2, '0');
|
|
65
|
+
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
66
|
+
}
|
|
67
|
+
darken(color, amount) {
|
|
68
|
+
return this.lighten(color, -amount);
|
|
69
|
+
}
|
|
70
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorLightenDarkenService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
71
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorLightenDarkenService, providedIn: 'root' }); }
|
|
72
|
+
}
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorLightenDarkenService, decorators: [{
|
|
74
|
+
type: Injectable,
|
|
75
|
+
args: [{
|
|
76
|
+
providedIn: 'root'
|
|
77
|
+
}]
|
|
78
|
+
}], ctorParameters: function () { return []; } });
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItbGlnaHRlbi1kYXJrZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbG9yLXV0aWxzL3NyYy9saWIvY29sb3ItbGlnaHRlbi1kYXJrZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFLeEQsTUFBTSxPQUFPLHlCQUF5QjtJQUlwQyx5Q0FBeUM7SUFDekMsMkRBQTJEO0lBQzNELDBEQUEwRDtJQUUxRCwwQ0FBMEM7SUFFNUM7UUFSRSxXQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFRbkIsQ0FBQztJQUVmLE9BQU8sQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUVuQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2Qyx1RUFBdUU7UUFFdkUscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUNQLENBQUMsR0FBRyxDQUFDLEVBQ0wsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0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S0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDaEIsUUFBUSxDQUFDLEVBQUUsQ0FBQzthQUNaLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNsQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQzsrR0ExRVUseUJBQXlCO21IQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7NEZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGV4dENvbG9yU2VydmljZSB9IGZyb20gJy4vdGV4dC1jb2xvci5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JMaWdodGVuRGFya2VuU2VydmljZSB7XG5cbiAgY29sb3JzID0gaW5qZWN0KFRleHRDb2xvclNlcnZpY2UpXG5cbiAgLy8gY29uc3QgY29sb3IgPSAnIzM0OThkYic7IC8vIFlvdXIgY29sb3JcbiAgLy8gY29uc3QgbGlnaHRlckNvbG9yID0gbGlnaHRlbihjb2xvciwgMC4yKTsgLy8gMjAlIGxpZ2h0ZXJcbiAgLy8gY29uc3QgZGFya2VyQ29sb3IgPSBkYXJrZW4oY29sb3IsIDAuMik7ICAgLy8gMjAlIGRhcmtlclxuXG4gIC8vIGNvbnNvbGUubG9nKGxpZ2h0ZXJDb2xvciwgZGFya2VyQ29sb3IpO1xuXG5jb25zdHJ1Y3RvcigpIHsgfVxuXG4gIGxpZ2h0ZW4oY29sb3I6IHN0cmluZywgYW1vdW50OiBudW1iZXIpIHtcblxuICAgIGNvbnN0IHJnYiA9IHRoaXMuY29sb3JzLmZpeENvbG9yKGNvbG9yKVxuICAgIC8vIGNvbnN0IHJnYiA9IGNvbG9yLm1hdGNoKC9cXHdcXHcvZyk/Lm1hcCgoeCkgPT4gcGFyc2VJbnQoeCwgMTYpKSB8fCBbXTtcblxuICAgIC8vIENvbnZlcnQgUkdCIHRvIEhTTFxuICAgIGxldCBbciwgZywgYl0gPSByZ2IubWFwKChjKSA9PiBjIC8gMjU1KTtcbiAgICBjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuICAgIGxldCBoID0gMCxcbiAgICAgIHMgPSAwLFxuICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjtcblxuICAgIGlmIChtYXggIT09IG1pbikge1xuICAgICAgY29uc3QgZCA9IG1heCAtIG1pbjtcbiAgICAgIHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKTtcbiAgICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICAgIGNhc2UgcjpcbiAgICAgICAgICBoID0gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgZzpcbiAgICAgICAgICBoID0gKGIgLSByKSAvIGQgKyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGI6XG4gICAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGggLz0gNjtcbiAgICB9XG5cbiAgICAvLyBNb2RpZnkgdGhlIGxpZ2h0bmVzcyBhbmQgY2xhbXAgaXQgdG8gWzAsIDFdXG4gICAgbCA9IE1hdGgubWluKDEsIGwgKyBhbW91bnQpO1xuXG4gICAgLy8gQ29udmVydCBIU0wgYmFjayB0byBSR0JcbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgciA9IGcgPSBiID0gbDsgLy8gYWNocm9tYXRpY1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBodWUycmdiID0gKHA6IG51bWJlciwgcTogbnVtYmVyLCB0OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHQgPCAwKSB0ICs9IDE7XG4gICAgICAgIGlmICh0ID4gMSkgdCAtPSAxO1xuICAgICAgICBpZiAodCA8IDEgLyA2KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICAgICAgaWYgKHQgPCAxIC8gMikgcmV0dXJuIHE7XG4gICAgICAgIGlmICh0IDwgMiAvIDMpIHJldHVybiBwICsgKHEgLSBwKSAqICgyIC8gMyAtIHQpICogNjtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9O1xuICAgICAgY29uc3QgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICBjb25zdCBwID0gMiAqIGwgLSBxO1xuICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKTtcbiAgICAgIGcgPSBodWUycmdiKHAsIHEsIGgpO1xuICAgICAgYiA9IGh1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IFJHQiBiYWNrIHRvIGhleGFkZWNpbWFsIGNvbG9yXG4gICAgY29uc3QgdG9IZXggPSAoeDogbnVtYmVyKSA9PlxuICAgICAgTWF0aC5yb3VuZCh4ICogMjU1KVxuICAgICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAgIC5wYWRTdGFydCgyLCAnMCcpO1xuICAgIHJldHVybiBgIyR7dG9IZXgocil9JHt0b0hleChnKX0ke3RvSGV4KGIpfWA7XG4gIH1cblxuICBkYXJrZW4oY29sb3I6IHN0cmluZywgYW1vdW50OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5saWdodGVuKGNvbG9yLCAtYW1vdW50KTtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -40,7 +40,15 @@ export class ColorPalletteService {
|
|
|
40
40
|
// justify-content: center;
|
|
41
41
|
// }
|
|
42
42
|
this.palette = new BehaviorSubject([]);
|
|
43
|
+
this.palette$ = this.palette.asObservable();
|
|
43
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Retrieves a color palette from an image at the specified path.
|
|
47
|
+
*
|
|
48
|
+
* @param imagePath - The path to the image to extract the color palette from.
|
|
49
|
+
* @param colors - The number of colors to include in the palette (default is 3).
|
|
50
|
+
* @returns An observable that emits the generated color palette.
|
|
51
|
+
*/
|
|
44
52
|
getColorsFromImage(imagePath, colors = 3) {
|
|
45
53
|
const image = new Image();
|
|
46
54
|
image.src = imagePath;
|
|
@@ -49,10 +57,17 @@ export class ColorPalletteService {
|
|
|
49
57
|
this.palette.next(data);
|
|
50
58
|
};
|
|
51
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Generates a color palette from an image.
|
|
62
|
+
*
|
|
63
|
+
* @param image - The HTML image element to extract the color palette from.
|
|
64
|
+
* @param colorCount - The number of colors to include in the palette (default is 6).
|
|
65
|
+
* @returns An array of color objects, each with a hex color and a complementary hex color.
|
|
66
|
+
*/
|
|
52
67
|
generateColorPalette(image, colorCount = 6) {
|
|
53
|
-
const canvas = document.createElement(
|
|
54
|
-
const context = canvas.getContext(
|
|
55
|
-
if (!context
|
|
68
|
+
const canvas = document.createElement("canvas");
|
|
69
|
+
const context = canvas.getContext("2d");
|
|
70
|
+
if (!context)
|
|
56
71
|
return;
|
|
57
72
|
canvas.width = image.width;
|
|
58
73
|
canvas.height = image.height;
|
|
@@ -78,8 +93,8 @@ export class ColorPalletteService {
|
|
|
78
93
|
const luminance2 = this.getLuminance(color2);
|
|
79
94
|
return luminance2 - luminance1;
|
|
80
95
|
});
|
|
81
|
-
const palette = quantizedColors.map(color => {
|
|
82
|
-
const complementaryColor = color.map(component => 255 - component);
|
|
96
|
+
const palette = quantizedColors.map((color) => {
|
|
97
|
+
const complementaryColor = color.map((component) => 255 - component);
|
|
83
98
|
const hexColor = this.colorConversionService.rgbToHex(color);
|
|
84
99
|
const hexComplementaryColor = this.colorConversionService.rgbToHex(complementaryColor);
|
|
85
100
|
return { color: hexColor, complementaryColor: hexComplementaryColor };
|
|
@@ -114,12 +129,12 @@ export class ColorPalletteService {
|
|
|
114
129
|
return [meanR, meanG, meanB];
|
|
115
130
|
}
|
|
116
131
|
kMeansColorQuantization(colors, k) {
|
|
117
|
-
|
|
132
|
+
let clusterCenters = [];
|
|
118
133
|
for (let i = 0; i < k; i++) {
|
|
119
134
|
const randomColor = colors[Math.floor(Math.random() * colors.length)];
|
|
120
135
|
clusterCenters.push(randomColor);
|
|
121
136
|
}
|
|
122
|
-
|
|
137
|
+
let clusters = [];
|
|
123
138
|
for (let i = 0; i < colors.length; i++) {
|
|
124
139
|
const color = colors[i];
|
|
125
140
|
let minDistance = Infinity;
|
|
@@ -134,7 +149,7 @@ export class ColorPalletteService {
|
|
|
134
149
|
}
|
|
135
150
|
clusters.push({ color, center: nearestCenter });
|
|
136
151
|
}
|
|
137
|
-
|
|
152
|
+
let updatedCenters = [];
|
|
138
153
|
for (let i = 0; i < clusterCenters.length; i++) {
|
|
139
154
|
const center = clusterCenters[i];
|
|
140
155
|
const clusterColors = clusters.filter(c => c.center === center).map(c => c.color);
|
|
@@ -154,4 +169,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
154
169
|
providedIn: 'root'
|
|
155
170
|
}]
|
|
156
171
|
}], ctorParameters: function () { return [{ type: i1.ColorConversionService }]; } });
|
|
157
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGFsbGV0dGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbG9yLXV0aWxzL3NyYy9saWIvY29sb3ItcGFsbGV0dGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUE7OztBQU10QyxNQUFNLE9BQU8sb0JBQW9CO0lBMEMvQixZQUNVLHNCQUE4QztRQUE5QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBekN4RCxvQkFBb0I7UUFDcEIseUVBQXlFO1FBRXpFLGFBQWE7UUFDYiw0RUFBNEU7UUFFNUUsY0FBYztRQUNkLHdDQUF3QztRQUN4QyxtQ0FBbUM7UUFDbkMsZUFBZTtRQUNmLDBCQUEwQjtRQUMxQixxREFBcUQ7UUFDckQsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLDBCQUEwQjtRQUMxQixrRUFBa0U7UUFDbEUsWUFBWTtRQUNaLHdCQUF3QjtRQUN4QixpQkFBaUI7UUFDakIsYUFBYTtRQUNiLFNBQVM7UUFFVCxNQUFNO1FBQ04sV0FBVztRQUNYLG9CQUFvQjtRQUNwQixxQkFBcUI7UUFDckIsZ0NBQWdDO1FBQ2hDLG9CQUFvQjtRQUNwQixtQkFBbUI7UUFDbkIscUJBQXFCO1FBQ3JCLHFCQUFxQjtRQUNyQix1QkFBdUI7UUFDdkIsNkJBQTZCO1FBQzdCLCtCQUErQjtRQUMvQixJQUFJO1FBRUksWUFBTyxHQUFHLElBQUksZUFBZSxDQUFrRCxFQUFFLENBQUMsQ0FBQTtJQUl0RixDQUFDO0lBRUwsa0JBQWtCLENBQUMsU0FBaUIsRUFBRSxNQUFNLEdBQUcsQ0FBQztRQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFBO1FBQ3pCLEtBQUssQ0FBQyxHQUFHLEdB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QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgeyBDb2xvckNvbnZlcnNpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb2xvci1jb252ZXJzaW9uLnNlcnZpY2UnXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb2xvclBhbGxldHRlU2VydmljZSB7XHJcblxyXG4gIC8vIGRlZmluZSBpbWFnZSBwYXRoXHJcbiAgLy8gdGhpcy5jb2xvclNlbGVjdGlvblNlcnZpY2UuZ2V0Q29sb3JzRnJvbUltYWdlKCcuLi9hc3NldHMvc2FtcGxlMi5qcGcnKVxyXG5cclxuICAvLyBnZXQgY29sb3JzXHJcbiAgLy8gdGhpcy5jb2xvclNlbGVjdGlvblNlcnZpY2UucGFsZXR0ZS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnBhbGV0dGUgPSBkYXRhKVxyXG5cclxuICAvLyBzYW1wbGUgaHRtbFxyXG4gIC8vICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sb3Igb2YgcGFsZXR0ZVwiPlxyXG4gIC8vICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cclxuICAvLyAgICAgICAgIDxkaXZcclxuICAvLyAgICAgICAgICAgICBjbGFzcz1cImJveFwiXHJcbiAgLy8gICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY29sb3IuY29sb3JcIlxyXG4gIC8vICAgICAgICAgPlxyXG4gIC8vICAgICAgICAgQ29sb3JcclxuICAvLyAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICAgICAgPGRpdlxyXG4gIC8vICAgICAgICAgICAgIGNsYXNzPVwiYm94XCJcclxuICAvLyAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJjb2xvci5jb21wbGVtZW50YXJ5Q29sb3JcIlxyXG4gIC8vICAgICAgICAgPlxyXG4gIC8vICAgICAgICAgQ29tcGxlbWVudGFyeVxyXG4gIC8vICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgIDwvZGl2PlxyXG4gIC8vIDwvZGl2PlxyXG5cclxuICAvLyBDU1NcclxuICAvLyAgIC5ib3gge1xyXG4gIC8vICAgICB3aWR0aDogMTAwcHg7XHJcbiAgLy8gICAgIGhlaWdodDogMTAwcHg7XHJcbiAgLy8gICAgIGJvcmRlcjogc29saWQgdGhpbiBibGFjaztcclxuICAvLyAgICAgY29sb3I6IGJsYWNrO1xyXG4gIC8vICAgICBtYXJnaW46IDRweDtcclxuICAvLyAgICAgcGFkZGluZzogMTZweDtcclxuICAvLyAgICAgZGlzcGxheTogZmxleDtcclxuICAvLyAgICAgZmxleC13cmFwOiB3cmFwO1xyXG4gIC8vICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XHJcbiAgLy8gICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBwYWxldHRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IGNvbG9yOiBzdHJpbmcsIGNvbXBsZW1lbnRhcnlDb2xvcjogc3RyaW5nIH1bXT4oW10pXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjb2xvckNvbnZlcnNpb25TZXJ2aWNlOiBDb2xvckNvbnZlcnNpb25TZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgZ2V0Q29sb3JzRnJvbUltYWdlKGltYWdlUGF0aDogc3RyaW5nLCBjb2xvcnMgPSAzKSB7XHJcblxyXG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKVxyXG4gICAgaW1hZ2Uuc3JjID0gaW1hZ2VQYXRoXHJcblxyXG4gICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5nZW5lcmF0ZUNvbG9yUGFsZXR0ZShpbWFnZSwgY29sb3JzKSB8fCBbXVxyXG4gICAgICB0aGlzLnBhbGV0dGUubmV4dChkYXRhKVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGdlbmVyYXRlQ29sb3JQYWxldHRlKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50LCBjb2xvckNvdW50ID0gNikge1xyXG5cclxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcclxuXHJcbiAgICBpZighY29udGV4dCB8fCAhaW1hZ2UpIHJldHVyblxyXG5cclxuICAgIGNhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoXHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0XHJcbiAgICBjb250ZXh0LmRyYXdJbWFnZShpbWFnZSwgMCwgMClcclxuXHJcbiAgICAvLyBHZXQgdGhlIGltYWdlIGRhdGFcclxuICAgIGNvbnN0IGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodClcclxuICAgIGNvbnN0IHBpeGVscyA9IGltYWdlRGF0YS5kYXRhXHJcbiAgICBjb25zdCBwaXhlbENvdW50ID0gaW1hZ2VEYXRhLndpZHRoICogaW1hZ2VEYXRhLmhlaWdodFxyXG5cclxuICAgIC8vIEJ1aWxkIGFuIGFycmF5IG9mIFJHQiBjb2xvcnNcclxuICAgIGNvbnN0IGNvbG9ycyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBpeGVsQ291bnQ7IGkrKykge1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSBpICogNFxyXG4gICAgICBjb25zdCByID0gcGl4ZWxzW29mZnNldF1cclxuICAgICAgY29uc3QgZyA9IHBpeGVsc1tvZmZzZXQgKyAxXVxyXG4gICAgICBjb25zdCBiID0gcGl4ZWxzW29mZnNldCArIDJdXHJcbiAgICAgIGNvbG9ycy5wdXNoKFtyLCBnLCBiXSlcclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBjb2xvciBxdWFudGl6YXRpb24gdXNpbmcgay1tZWFucyBjbHVzdGVyaW5nXHJcbiAgICBjb25zdCBxdWFudGl6ZWRDb2xvcnMgPSB0aGlzLmtNZWFuc0NvbG9yUXVhbnRpemF0aW9uKGNvbG9ycywgY29sb3JDb3VudClcclxuXHJcbiAgICAvLyBPcmRlciBjb2xvcnMgYnkgbHVtaW5hbmNlXHJcbiAgICBxdWFudGl6ZWRDb2xvcnMuc29ydCgoY29sb3IxLCBjb2xvcjIpID0+IHtcclxuICAgICAgY29uc3QgbHVtaW5hbmNlMSA9IHRoaXMuZ2V0THVtaW5hbmNlKGNvbG9yMSlcclxuICAgICAgY29uc3QgbHVtaW5hbmNlMiA9IHRoaXMuZ2V0THVtaW5hbmNlKGNvbG9yMilcclxuICAgICAgcmV0dXJuIGx1bWluYW5jZTIgLSBsdW1pbmFuY2UxXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IHBhbGV0dGUgPSBxdWFudGl6ZWRDb2xvcnMubWFwKGNvbG9yID0+IHtcclxuICAgICAgY29uc3QgY29tcGxlbWVudGFyeUNvbG9yID0gY29sb3IubWFwKGNvbXBvbmVudCA9PiAyNTUgLSBjb21wb25lbnQpXHJcbiAgICAgIGNvbnN0IGhleENvbG9yID0gdGhpcy5jb2xvckNvbnZlcnNpb25TZXJ2aWNlLnJnYlRvSGV4KGNvbG9yKVxyXG4gICAgICBjb25zdCBoZXhDb21wbGVtZW50YXJ5Q29sb3IgPSB0aGlzLmNvbG9yQ29udmVyc2lvblNlcnZpY2UucmdiVG9IZXgoY29tcGxlbWVudGFyeUNvbG9yKVxyXG4gICAgICByZXR1cm4geyBjb2xvcjogaGV4Q29sb3IsIGNvbXBsZW1lbnRhcnlDb2xvcjogaGV4Q29tcGxlbWVudGFyeUNvbG9yIH1cclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIHBhbGV0dGVcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0THVtaW5hbmNlKGNvbG9yOiBudW1iZXJbXSkge1xyXG4gICAgY29uc3QgW3IsIGcsIGJdID0gY29sb3JcclxuICAgIHJldHVybiAwLjI5OSAqIHIgKyAwLjU4NyAqIGcgKyAwLjExNCAqIGJcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlQ29sb3JEaXN0YW5jZShjb2xvcjE6IG51bWJlcltdLCBjb2xvcjI6IG51bWJlcltdKSB7XHJcbiAgICBjb25zdCBbcjEsIGcxLCBiMV0gPSBjb2xvcjFcclxuICAgIGNvbnN0IFtyMiwgZzIsIGIyXSA9IGNvbG9yMlxyXG4gICAgY29uc3QgZHIgPSByMiAtIHIxXHJcbiAgICBjb25zdCBkZyA9IGcyIC0gZzFcclxuICAgIGNvbnN0IGRiID0gYjIgLSBiMVxyXG4gICAgcmV0dXJuIE1hdGguc3FydChkciAqIGRyICsgZGcgKiBkZyArIGRiICogZGIpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZU1lYW5Db2xvcihjb2xvcnM6IG51bWJlcltdW10pIHtcclxuICAgIGxldCBzdW1SID0gMFxyXG4gICAgbGV0IHN1bUcgPSAwXHJcbiAgICBsZXQgc3VtQiA9IDBcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IFtyLCBnLCBiXSA9IGNvbG9yc1tpXVxyXG4gICAgICBzdW1SICs9IHJcclxuICAgICAgc3VtRyArPSBnXHJcbiAgICAgIHN1bUIgKz0gYlxyXG4gICAgfVxyXG4gICAgY29uc3QgbWVhblIgPSBNYXRoLnJvdW5kKHN1bVIgLyBjb2xvcnMubGVuZ3RoKVxyXG4gICAgY29uc3QgbWVhbkcgPSBNYXRoLnJvdW5kKHN1bUcgLyBjb2xvcnMubGVuZ3RoKVxyXG4gICAgY29uc3QgbWVhbkIgPSBNYXRoLnJvdW5kKHN1bUIgLyBjb2xvcnMubGVuZ3RoKVxyXG4gICAgcmV0dXJuIFttZWFuUiwgbWVhbkcsIG1lYW5CXVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBrTWVhbnNDb2xvclF1YW50aXphdGlvbihjb2xvcnM6IG51bWJlcltdW10sIGs6IG51bWJlcikge1xyXG4gICAgY29uc3QgY2x1c3RlckNlbnRlcnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrOyBpKyspIHtcclxuICAgICAgY29uc3QgcmFuZG9tQ29sb3IgPSBjb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29sb3JzLmxlbmd0aCldXHJcbiAgICAgIGNsdXN0ZXJDZW50ZXJzLnB1c2gocmFuZG9tQ29sb3IpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2x1c3RlcnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY29sb3IgPSBjb2xvcnNbaV1cclxuICAgICAgbGV0IG1pbkRpc3RhbmNlID0gSW5maW5pdHlcclxuICAgICAgbGV0IG5lYXJlc3RDZW50ZXIgPSBudWxsXHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2x1c3RlckNlbnRlcnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCBjZW50ZXIgPSBjbHVzdGVyQ2VudGVyc1tqXVxyXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gdGhpcy5jYWxjdWxhdGVDb2xvckRpc3RhbmNlKGNvbG9yLCBjZW50ZXIpXHJcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcclxuICAgICAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2VcclxuICAgICAgICAgIG5lYXJlc3RDZW50ZXIgPSBjZW50ZXJcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2x1c3RlcnMucHVzaCh7IGNvbG9yLCBjZW50ZXI6IG5lYXJlc3RDZW50ZXIgfSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkQ2VudGVycyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJDZW50ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNlbnRlciA9IGNsdXN0ZXJDZW50ZXJzW2ldXHJcbiAgICAgIGNvbnN0IGNsdXN0ZXJDb2xvcnMgPSBjbHVzdGVycy5maWx0ZXIoYyA9PiBjLmNlbnRlciA9PT0gY2VudGVyKS5tYXAoYyA9PiBjLmNvbG9yKVxyXG4gICAgICBpZiAoY2x1c3RlckNvbG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgdXBkYXRlZENlbnRlciA9IHRoaXMuY2FsY3VsYXRlTWVhbkNvbG9yKGNsdXN0ZXJDb2xvcnMpXHJcbiAgICAgICAgdXBkYXRlZENlbnRlcnMucHVzaCh1cGRhdGVkQ2VudGVyKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZWRDZW50ZXJzXHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGFsbGV0dGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbG9yLXV0aWxzL3NyYy9saWIvY29sb3ItcGFsbGV0dGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUE7OztBQU10QyxNQUFNLE9BQU8sb0JBQW9CO0lBMkMvQixZQUNVLHNCQUE4QztRQUE5QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBMUN4RCxvQkFBb0I7UUFDcEIseUVBQXlFO1FBRXpFLGFBQWE7UUFDYiw0RUFBNEU7UUFFNUUsY0FBYztRQUNkLHdDQUF3QztRQUN4QyxtQ0FBbUM7UUFDbkMsZUFBZTtRQUNmLDBCQUEwQjtRQUMxQixxREFBcUQ7UUFDckQsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLDBCQUEwQjtRQUMxQixrRUFBa0U7UUFDbEUsWUFBWTtRQUNaLHdCQUF3QjtRQUN4QixpQkFBaUI7UUFDakIsYUFBYTtRQUNiLFNBQVM7UUFFVCxNQUFNO1FBQ04sV0FBVztRQUNYLG9CQUFvQjtRQUNwQixxQkFBcUI7UUFDckIsZ0NBQWdDO1FBQ2hDLG9CQUFvQjtRQUNwQixtQkFBbUI7UUFDbkIscUJBQXFCO1FBQ3JCLHFCQUFxQjtRQUNyQix1QkFBdUI7UUFDdkIsNkJBQTZCO1FBQzdCLCtCQUErQjtRQUMvQixJQUFJO1FBRUksWUFBTyxHQUFHLElBQUksZUFBZSxDQUFrRCxFQUFFLENBQUMsQ0FBQTtRQUMxRixhQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQTtJQUlsQyxDQUFDO0lBRUw7Ozs7OztPQU1HO0lBQ0gsa0JBQWtCLENBQUMsU0FBaUIsRUFBRSxNQUFNLEdBQUcsQ0FB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QUU7WUFDdEMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzNCLElBQUksSUFBSSxDQUFDLENBQUE7WUFDVCxJQUFJLElBQUksQ0FBQyxDQUFBO1lBQ1QsSUFBSSxJQUFJLENBQUMsQ0FBQTtTQUNWO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDOUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUVPLHVCQUF1QixDQUFDLE1BQWtCLEVBQUUsQ0FBUztRQUMzRCxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUE7UUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7WUFDckUsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtTQUNqQztRQUVELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQTtRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdkIsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFBO1lBQzFCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQTtZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDOUMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO2dCQUMzRCxJQUFJLFFBQVEsR0FBRyxXQUFXLEVBQUU7b0JBQzFCLFdBQVcsR0FBRyxRQUFRLENBQUE7b0JBQ3RCLGFBQWEsR0FBRyxNQUFNLENBQUE7aUJBQ3ZCO2FBQ0Y7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFBO1NBQ2hEO1FBRUQsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFBO1FBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNoQyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDakYsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFBO2dCQUM1RCxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO2FBQ25DO1NBQ0Y7UUFFRCxPQUFPLGNBQWMsQ0FBQTtJQUN2QixDQUFDOytHQXJMVSxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IENvbG9yQ29udmVyc2lvblNlcnZpY2UgfSBmcm9tICcuL2NvbG9yLWNvbnZlcnNpb24uc2VydmljZSdcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvbG9yUGFsbGV0dGVTZXJ2aWNlIHtcclxuXHJcbiAgLy8gZGVmaW5lIGltYWdlIHBhdGhcclxuICAvLyB0aGlzLmNvbG9yU2VsZWN0aW9uU2VydmljZS5nZXRDb2xvcnNGcm9tSW1hZ2UoJy4uL2Fzc2V0cy9zYW1wbGUyLmpwZycpXHJcblxyXG4gIC8vIGdldCBjb2xvcnNcclxuICAvLyB0aGlzLmNvbG9yU2VsZWN0aW9uU2VydmljZS5wYWxldHRlLnN1YnNjcmliZShkYXRhID0+IHRoaXMucGFsZXR0ZSA9IGRhdGEpXHJcblxyXG4gIC8vIHNhbXBsZSBodG1sXHJcbiAgLy8gICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2xvciBvZiBwYWxldHRlXCI+XHJcbiAgLy8gICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxyXG4gIC8vICAgICAgICAgPGRpdlxyXG4gIC8vICAgICAgICAgICAgIGNsYXNzPVwiYm94XCJcclxuICAvLyAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJjb2xvci5jb2xvclwiXHJcbiAgLy8gICAgICAgICA+XHJcbiAgLy8gICAgICAgICBDb2xvclxyXG4gIC8vICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICA8ZGl2XHJcbiAgLy8gICAgICAgICAgICAgY2xhc3M9XCJib3hcIlxyXG4gIC8vICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImNvbG9yLmNvbXBsZW1lbnRhcnlDb2xvclwiXHJcbiAgLy8gICAgICAgICA+XHJcbiAgLy8gICAgICAgICBDb21wbGVtZW50YXJ5XHJcbiAgLy8gICAgICAgICA8L2Rpdj5cclxuICAvLyAgICAgPC9kaXY+XHJcbiAgLy8gPC9kaXY+XHJcblxyXG4gIC8vIENTU1xyXG4gIC8vICAgLmJveCB7XHJcbiAgLy8gICAgIHdpZHRoOiAxMDBweDtcclxuICAvLyAgICAgaGVpZ2h0OiAxMDBweDtcclxuICAvLyAgICAgYm9yZGVyOiBzb2xpZCB0aGluIGJsYWNrO1xyXG4gIC8vICAgICBjb2xvcjogYmxhY2s7XHJcbiAgLy8gICAgIG1hcmdpbjogNHB4O1xyXG4gIC8vICAgICBwYWRkaW5nOiAxNnB4O1xyXG4gIC8vICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gIC8vICAgICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgLy8gICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAvLyAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIHBhbGV0dGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgY29sb3I6IHN0cmluZywgY29tcGxlbWVudGFyeUNvbG9yOiBzdHJpbmcgfVtdPihbXSlcclxuICBwYWxldHRlJCA9IHRoaXMucGFsZXR0ZS5hc09ic2VydmFibGUoKVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29sb3JDb252ZXJzaW9uU2VydmljZTogQ29sb3JDb252ZXJzaW9uU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhIGNvbG9yIHBhbGV0dGUgZnJvbSBhbiBpbWFnZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaW1hZ2VQYXRoIC0gVGhlIHBhdGggdG8gdGhlIGltYWdlIHRvIGV4dHJhY3QgdGhlIGNvbG9yIHBhbGV0dGUgZnJvbS5cclxuICAgKiBAcGFyYW0gY29sb3JzIC0gVGhlIG51bWJlciBvZiBjb2xvcnMgdG8gaW5jbHVkZSBpbiB0aGUgcGFsZXR0ZSAoZGVmYXVsdCBpcyAzKS5cclxuICAgKiBAcmV0dXJucyBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGdlbmVyYXRlZCBjb2xvciBwYWxldHRlLlxyXG4gICAqL1xyXG4gIGdldENvbG9yc0Zyb21JbWFnZShpbWFnZVBhdGg6IHN0cmluZywgY29sb3JzID0gMykge1xyXG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgIGltYWdlLnNyYyA9IGltYWdlUGF0aDtcclxuXHJcbiAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdlbmVyYXRlQ29sb3JQYWxldHRlKGltYWdlLCBjb2xvcnMpIHx8IFtdO1xyXG4gICAgICB0aGlzLnBhbGV0dGUubmV4dChkYXRhKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgYSBjb2xvciBwYWxldHRlIGZyb20gYW4gaW1hZ2UuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaW1hZ2UgLSBUaGUgSFRNTCBpbWFnZSBlbGVtZW50IHRvIGV4dHJhY3QgdGhlIGNvbG9yIHBhbGV0dGUgZnJvbS5cclxuICAgKiBAcGFyYW0gY29sb3JDb3VudCAtIFRoZSBudW1iZXIgb2YgY29sb3JzIHRvIGluY2x1ZGUgaW4gdGhlIHBhbGV0dGUgKGRlZmF1bHQgaXMgNikuXHJcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgY29sb3Igb2JqZWN0cywgZWFjaCB3aXRoIGEgaGV4IGNvbG9yIGFuZCBhIGNvbXBsZW1lbnRhcnkgaGV4IGNvbG9yLlxyXG4gICAqL1xyXG4gIGdlbmVyYXRlQ29sb3JQYWxldHRlKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50LCBjb2xvckNvdW50ID0gNikge1xyXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG5cclxuICAgIGlmICghY29udGV4dCkgcmV0dXJuO1xyXG5cclxuICAgIGNhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoO1xyXG4gICAgY2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcclxuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIGltYWdlIGRhdGFcclxuICAgIGNvbnN0IGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XHJcbiAgICBjb25zdCBwaXhlbHMgPSBpbWFnZURhdGEuZGF0YTtcclxuICAgIGNvbnN0IHBpeGVsQ291bnQgPSBpbWFnZURhdGEud2lkdGggKiBpbWFnZURhdGEuaGVpZ2h0O1xyXG5cclxuICAgIC8vIEJ1aWxkIGFuIGFycmF5IG9mIFJHQiBjb2xvcnNcclxuICAgIGNvbnN0IGNvbG9ycyA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwaXhlbENvdW50OyBpKyspIHtcclxuICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIDQ7XHJcbiAgICAgIGNvbnN0IHIgPSBwaXhlbHNbb2Zmc2V0XTtcclxuICAgICAgY29uc3QgZyA9IHBpeGVsc1tvZmZzZXQgKyAxXTtcclxuICAgICAgY29uc3QgYiA9IHBpeGVsc1tvZmZzZXQgKyAyXTtcclxuICAgICAgY29sb3JzLnB1c2goW3IsIGcsIGJdKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBjb2xvciBxdWFudGl6YXRpb24gdXNpbmcgay1tZWFucyBjbHVzdGVyaW5nXHJcbiAgICBjb25zdCBxdWFudGl6ZWRDb2xvcnMgPSB0aGlzLmtNZWFuc0NvbG9yUXVhbnRpemF0aW9uKGNvbG9ycywgY29sb3JDb3VudCk7XHJcblxyXG4gICAgLy8gT3JkZXIgY29sb3JzIGJ5IGx1bWluYW5jZVxyXG4gICAgcXVhbnRpemVkQ29sb3JzLnNvcnQoKGNvbG9yMSwgY29sb3IyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGx1bWluYW5jZTEgPSB0aGlzLmdldEx1bWluYW5jZShjb2xvcjEpO1xyXG4gICAgICBjb25zdCBsdW1pbmFuY2UyID0gdGhpcy5nZXRMdW1pbmFuY2UoY29sb3IyKTtcclxuICAgICAgcmV0dXJuIGx1bWluYW5jZTIgLSBsdW1pbmFuY2UxO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgcGFsZXR0ZSA9IHF1YW50aXplZENvbG9ycy5tYXAoKGNvbG9yKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbXBsZW1lbnRhcnlDb2xvciA9IGNvbG9yLm1hcCgoY29tcG9uZW50KSA9PiAyNTUgLSBjb21wb25lbnQpO1xyXG4gICAgICBjb25zdCBoZXhDb2xvciA9IHRoaXMuY29sb3JDb252ZXJzaW9uU2VydmljZS5yZ2JUb0hleChjb2xvcik7XHJcbiAgICAgIGNvbnN0IGhleENvbXBsZW1lbnRhcnlDb2xvciA9XHJcbiAgICAgICAgdGhpcy5jb2xvckNvbnZlcnNpb25TZXJ2aWNlLnJnYlRvSGV4KGNvbXBsZW1lbnRhcnlDb2xvcik7XHJcbiAgICAgIHJldHVybiB7IGNvbG9yOiBoZXhDb2xvciwgY29tcGxlbWVudGFyeUNvbG9yOiBoZXhDb21wbGVtZW50YXJ5Q29sb3IgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBwYWxldHRlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMdW1pbmFuY2UoY29sb3I6IG51bWJlcltdKSB7XHJcbiAgICBjb25zdCBbciwgZywgYl0gPSBjb2xvclxyXG4gICAgcmV0dXJuIDAuMjk5ICogciArIDAuNTg3ICogZyArIDAuMTE0ICogYlxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVDb2xvckRpc3RhbmNlKGNvbG9yMTogbnVtYmVyW10sIGNvbG9yMjogbnVtYmVyW10pIHtcclxuICAgIGNvbnN0IFtyMSwgZzEsIGIxXSA9IGNvbG9yMVxyXG4gICAgY29uc3QgW3IyLCBnMiwgYjJdID0gY29sb3IyXHJcbiAgICBjb25zdCBkciA9IHIyIC0gcjFcclxuICAgIGNvbnN0IGRnID0gZzIgLSBnMVxyXG4gICAgY29uc3QgZGIgPSBiMiAtIGIxXHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KGRyICogZHIgKyBkZyAqIGRnICsgZGIgKiBkYilcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlTWVhbkNvbG9yKGNvbG9yczogbnVtYmVyW11bXSkge1xyXG4gICAgbGV0IHN1bVIgPSAwXHJcbiAgICBsZXQgc3VtRyA9IDBcclxuICAgIGxldCBzdW1CID0gMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgW3IsIGcsIGJdID0gY29sb3JzW2ldXHJcbiAgICAgIHN1bVIgKz0gclxyXG4gICAgICBzdW1HICs9IGdcclxuICAgICAgc3VtQiArPSBiXHJcbiAgICB9XHJcbiAgICBjb25zdCBtZWFuUiA9IE1hdGgucm91bmQoc3VtUiAvIGNvbG9ycy5sZW5ndGgpXHJcbiAgICBjb25zdCBtZWFuRyA9IE1hdGgucm91bmQoc3VtRyAvIGNvbG9ycy5sZW5ndGgpXHJcbiAgICBjb25zdCBtZWFuQiA9IE1hdGgucm91bmQoc3VtQiAvIGNvbG9ycy5sZW5ndGgpXHJcbiAgICByZXR1cm4gW21lYW5SLCBtZWFuRywgbWVhbkJdXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGtNZWFuc0NvbG9yUXVhbnRpemF0aW9uKGNvbG9yczogbnVtYmVyW11bXSwgazogbnVtYmVyKSB7XHJcbiAgICBsZXQgY2x1c3RlckNlbnRlcnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrOyBpKyspIHtcclxuICAgICAgY29uc3QgcmFuZG9tQ29sb3IgPSBjb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29sb3JzLmxlbmd0aCldXHJcbiAgICAgIGNsdXN0ZXJDZW50ZXJzLnB1c2gocmFuZG9tQ29sb3IpXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNsdXN0ZXJzID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNvbG9yID0gY29sb3JzW2ldXHJcbiAgICAgIGxldCBtaW5EaXN0YW5jZSA9IEluZmluaXR5XHJcbiAgICAgIGxldCBuZWFyZXN0Q2VudGVyID0gbnVsbFxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNsdXN0ZXJDZW50ZXJzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgY29uc3QgY2VudGVyID0gY2x1c3RlckNlbnRlcnNbal1cclxuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMuY2FsY3VsYXRlQ29sb3JEaXN0YW5jZShjb2xvciwgY2VudGVyKVxyXG4gICAgICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7XHJcbiAgICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlXHJcbiAgICAgICAgICBuZWFyZXN0Q2VudGVyID0gY2VudGVyXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNsdXN0ZXJzLnB1c2goeyBjb2xvciwgY2VudGVyOiBuZWFyZXN0Q2VudGVyIH0pXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHVwZGF0ZWRDZW50ZXJzID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlckNlbnRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2VudGVyID0gY2x1c3RlckNlbnRlcnNbaV1cclxuICAgICAgY29uc3QgY2x1c3RlckNvbG9ycyA9IGNsdXN0ZXJzLmZpbHRlcihjID0+IGMuY2VudGVyID09PSBjZW50ZXIpLm1hcChjID0+IGMuY29sb3IpXHJcbiAgICAgIGlmIChjbHVzdGVyQ29sb3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCB1cGRhdGVkQ2VudGVyID0gdGhpcy5jYWxjdWxhdGVNZWFuQ29sb3IoY2x1c3RlckNvbG9ycylcclxuICAgICAgICB1cGRhdGVkQ2VudGVycy5wdXNoKHVwZGF0ZWRDZW50ZXIpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdXBkYXRlZENlbnRlcnNcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class ColorSchemeService {
|
|
4
|
+
constructor() { }
|
|
5
|
+
/**
|
|
6
|
+
* Generates a random hexadecimal color code.
|
|
7
|
+
*
|
|
8
|
+
* This function generates a random hue value between 0 and 360 degrees, and random saturation and lightness values between 50% and 100%. It then converts the HSL values to RGB values using the `hslToRgb` function, and finally converts the RGB values to a hexadecimal color code using the `rgbToHex` function.
|
|
9
|
+
*
|
|
10
|
+
* @returns A hexadecimal color code in the format "#RRGGBB".
|
|
11
|
+
*/
|
|
12
|
+
generateRandomColor() {
|
|
13
|
+
// Generate a random hue between 0 and 360 (representing degrees on the color wheel)
|
|
14
|
+
const hue = Math.floor(Math.random() * 360);
|
|
15
|
+
// Generate random saturation and lightness values between 50% and 100%
|
|
16
|
+
const saturation = Math.floor(Math.random() * 51) + 50;
|
|
17
|
+
const lightness = Math.floor(Math.random() * 51) + 50;
|
|
18
|
+
// Convert HSL values to RGB values
|
|
19
|
+
const rgbColor = this.hslToRgb(hue, saturation, lightness);
|
|
20
|
+
// Convert RGB values to hexadecimal color code
|
|
21
|
+
const hexColor = this.rgbToHex(rgbColor.r, rgbColor.g, rgbColor.b);
|
|
22
|
+
return hexColor;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Converts HSL (Hue, Saturation, Lightness) color values to RGB (Red, Green, Blue) color values.
|
|
26
|
+
*
|
|
27
|
+
* @param h - The hue value, ranging from 0 to 360 degrees.
|
|
28
|
+
* @param s - The saturation value, ranging from 0 to 100 percent.
|
|
29
|
+
* @param l - The lightness value, ranging from 0 to 100 percent.
|
|
30
|
+
* @returns An object with the RGB color values, where each value is between 0 and 255.
|
|
31
|
+
*/
|
|
32
|
+
hslToRgb(h, s, l) {
|
|
33
|
+
h /= 360;
|
|
34
|
+
s /= 100;
|
|
35
|
+
l /= 100;
|
|
36
|
+
let r, g, b;
|
|
37
|
+
if (s === 0) {
|
|
38
|
+
r = g = b = l; // Achromatic color (gray)
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const hueToRgb = (p, q, t) => {
|
|
42
|
+
if (t < 0)
|
|
43
|
+
t += 1;
|
|
44
|
+
if (t > 1)
|
|
45
|
+
t -= 1;
|
|
46
|
+
if (t < 1 / 6)
|
|
47
|
+
return p + (q - p) * 6 * t;
|
|
48
|
+
if (t < 1 / 2)
|
|
49
|
+
return q;
|
|
50
|
+
if (t < 2 / 3)
|
|
51
|
+
return p + (q - p) * (2 / 3 - t) * 6;
|
|
52
|
+
return p;
|
|
53
|
+
};
|
|
54
|
+
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
55
|
+
const p = 2 * l - q;
|
|
56
|
+
r = Math.round(hueToRgb(p, q, h + 1 / 3) * 255);
|
|
57
|
+
g = Math.round(hueToRgb(p, q, h) * 255);
|
|
58
|
+
b = Math.round(hueToRgb(p, q, h - 1 / 3) * 255);
|
|
59
|
+
}
|
|
60
|
+
return { r, g, b };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Converts RGB color values to a hexadecimal color string.
|
|
64
|
+
*
|
|
65
|
+
* @param r - The red color value, between 0 and 255.
|
|
66
|
+
* @param g - The green color value, between 0 and 255.
|
|
67
|
+
* @param b - The blue color value, between 0 and 255.
|
|
68
|
+
* @returns A hexadecimal color string in the format "#RRGGBB".
|
|
69
|
+
*/
|
|
70
|
+
rgbToHex(r, g, b) {
|
|
71
|
+
const componentToHex = (c) => {
|
|
72
|
+
const hex = c.toString(16);
|
|
73
|
+
return hex.length === 1 ? "0" + hex : hex;
|
|
74
|
+
};
|
|
75
|
+
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Adjusts a hexadecimal color value by a given percentage.
|
|
79
|
+
*
|
|
80
|
+
* @param hexColor - The hexadecimal color value to adjust.
|
|
81
|
+
* @param percentage - The percentage to adjust the color by, ranging from -100 to 100.
|
|
82
|
+
* @returns The adjusted hexadecimal color value.
|
|
83
|
+
*/
|
|
84
|
+
adjustHexColor(hexColor, percentage) {
|
|
85
|
+
// Remove the "#" symbol if present
|
|
86
|
+
hexColor = hexColor.replace("#", "");
|
|
87
|
+
// Convert the hex color to RGB values
|
|
88
|
+
const red = parseInt(hexColor.substring(0, 2), 16);
|
|
89
|
+
const green = parseInt(hexColor.substring(2, 4), 16);
|
|
90
|
+
const blue = parseInt(hexColor.substring(4, 6), 16);
|
|
91
|
+
// Calculate the adjustment amount based on the percentage
|
|
92
|
+
const adjustAmount = Math.round(255 * (percentage / 100));
|
|
93
|
+
// Adjust the RGB values
|
|
94
|
+
const adjustedRed = this.clamp(red + adjustAmount);
|
|
95
|
+
const adjustedGreen = this.clamp(green + adjustAmount);
|
|
96
|
+
const adjustedBlue = this.clamp(blue + adjustAmount);
|
|
97
|
+
// Convert the adjusted RGB values back to hex
|
|
98
|
+
const adjustedHexColor = `#${(adjustedRed).toString(16).padStart(2, '0')}${(adjustedGreen).toString(16).padStart(2, '0')}${(adjustedBlue).toString(16).padStart(2, '0')}`;
|
|
99
|
+
return adjustedHexColor;
|
|
100
|
+
}
|
|
101
|
+
clamp(value) {
|
|
102
|
+
return Math.max(0, Math.min(value, 255));
|
|
103
|
+
}
|
|
104
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorSchemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
105
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorSchemeService, providedIn: 'root' }); }
|
|
106
|
+
}
|
|
107
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorSchemeService, decorators: [{
|
|
108
|
+
type: Injectable,
|
|
109
|
+
args: [{
|
|
110
|
+
providedIn: 'root'
|
|
111
|
+
}]
|
|
112
|
+
}], ctorParameters: function () { return []; } });
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3Itc2NoZW1lLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xvci11dGlscy9zcmMvbGliL2NvbG9yLXNjaGVtZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxrQkFBa0I7SUFFN0IsZ0JBQWdCLENBQUM7SUFFakI7Ozs7OztPQU1HO0lBQ0gsbUJBQW1CO1FBQ2pCLG9GQUFvRjtRQUNwRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUU1Qyx1RUFBdUU7UUFDdkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUV0RCxtQ0FBbUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTNELCtDQUErQztRQUMvQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkUsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxRQUFRLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTO1FBQ3RDLENBQUMsSUFBSSxHQUFHLENBQUM7UUFDVCxDQUFDLElBQUks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SUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDOytHQW5IVSxrQkFBa0I7bUhBQWxCLGtCQUFrQixjQUZqQixNQUFNOzs0RkFFUCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb2xvclNjaGVtZVNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJhbmRvbSBoZXhhZGVjaW1hbCBjb2xvciBjb2RlLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIHJhbmRvbSBodWUgdmFsdWUgYmV0d2VlbiAwIGFuZCAzNjAgZGVncmVlcywgYW5kIHJhbmRvbSBzYXR1cmF0aW9uIGFuZCBsaWdodG5lc3MgdmFsdWVzIGJldHdlZW4gNTAlIGFuZCAxMDAlLiBJdCB0aGVuIGNvbnZlcnRzIHRoZSBIU0wgdmFsdWVzIHRvIFJHQiB2YWx1ZXMgdXNpbmcgdGhlIGBoc2xUb1JnYmAgZnVuY3Rpb24sIGFuZCBmaW5hbGx5IGNvbnZlcnRzIHRoZSBSR0IgdmFsdWVzIHRvIGEgaGV4YWRlY2ltYWwgY29sb3IgY29kZSB1c2luZyB0aGUgYHJnYlRvSGV4YCBmdW5jdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgQSBoZXhhZGVjaW1hbCBjb2xvciBjb2RlIGluIHRoZSBmb3JtYXQgXCIjUlJHR0JCXCIuXG4gICAqL1xuICBnZW5lcmF0ZVJhbmRvbUNvbG9yKCkge1xuICAgIC8vIEdlbmVyYXRlIGEgcmFuZG9tIGh1ZSBiZXR3ZWVuIDAgYW5kIDM2MCAocmVwcmVzZW50aW5nIGRlZ3JlZXMgb24gdGhlIGNvbG9yIHdoZWVsKVxuICAgIGNvbnN0IGh1ZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDM2MCk7XG5cbiAgICAvLyBHZW5lcmF0ZSByYW5kb20gc2F0dXJhdGlvbiBhbmQgbGlnaHRuZXNzIHZhbHVlcyBiZXR3ZWVuIDUwJSBhbmQgMTAwJVxuICAgIGNvbnN0IHNhdHVyYXRpb24gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1MSkgKyA1MDtcbiAgICBjb25zdCBsaWdodG5lc3MgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1MSkgKyA1MDtcblxuICAgIC8vIENvbnZlcnQgSFNMIHZhbHVlcyB0byBSR0IgdmFsdWVzXG4gICAgY29uc3QgcmdiQ29sb3IgPSB0aGlzLmhzbFRvUmdiKGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzKTtcblxuICAgIC8vIENvbnZlcnQgUkdCIHZhbHVlcyB0byBoZXhhZGVjaW1hbCBjb2xvciBjb2RlXG4gICAgY29uc3QgaGV4Q29sb3IgPSB0aGlzLnJnYlRvSGV4KHJnYkNvbG9yLnIsIHJnYkNvbG9yLmcsIHJnYkNvbG9yLmIpO1xuXG4gICAgcmV0dXJuIGhleENvbG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIEhTTCAoSHVlLCBTYXR1cmF0aW9uLCBMaWdodG5lc3MpIGNvbG9yIHZhbHVlcyB0byBSR0IgKFJlZCwgR3JlZW4sIEJsdWUpIGNvbG9yIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIGggLSBUaGUgaHVlIHZhbHVlLCByYW5naW5nIGZyb20gMCB0byAzNjAgZGVncmVlcy5cbiAgICogQHBhcmFtIHMgLSBUaGUgc2F0dXJhdGlvbiB2YWx1ZSwgcmFuZ2luZyBmcm9tIDAgdG8gMTAwIHBlcmNlbnQuXG4gICAqIEBwYXJhbSBsIC0gVGhlIGxpZ2h0bmVzcyB2YWx1ZSwgcmFuZ2luZyBmcm9tIDAgdG8gMTAwIHBlcmNlbnQuXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBSR0IgY29sb3IgdmFsdWVzLCB3aGVyZSBlYWNoIHZhbHVlIGlzIGJldHdlZW4gMCBhbmQgMjU1LlxuICAgKi9cbiAgaHNsVG9SZ2IoaDogbnVtYmVyLCBzOiBudW1iZXIsIGw6IG51bWJlcikge1xuICAgIGggLz0gMzYwO1xuICAgIHMgLz0gMTAwO1xuICAgIGwgLz0gMTAwO1xuXG4gICAgbGV0IHIsIGcsIGI7XG5cbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgciA9IGcgPSBiID0gbDsgLy8gQWNocm9tYXRpYyBjb2xvciAoZ3JheSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaHVlVG9SZ2IgPSAocDogbnVtYmVyLCBxOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAodCA8IDApIHQgKz0gMTtcbiAgICAgICAgaWYgKHQgPiAxKSB0IC09IDE7XG4gICAgICAgIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xuICAgICAgICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcTtcbiAgICAgICAgaWYgKHQgPCAyIC8gMykgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2O1xuICAgICAgICByZXR1cm4gcDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgY29uc3QgcCA9IDIgKiBsIC0gcTtcblxuICAgICAgciA9IE1hdGgucm91bmQoaHVlVG9SZ2IocCwgcSwgaCArIDEgLyAzKSAqIDI1NSk7XG4gICAgICBnID0gTWF0aC5yb3VuZChodWVUb1JnYihwLCBxLCBoKSAqIDI1NSk7XG4gICAgICBiID0gTWF0aC5yb3VuZChodWVUb1JnYihwLCBxLCBoIC0gMSAvIDMpICogMjU1KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyByLCBnLCBiIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgUkdCIGNvbG9yIHZhbHVlcyB0byBhIGhleGFkZWNpbWFsIGNvbG9yIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHIgLSBUaGUgcmVkIGNvbG9yIHZhbHVlLCBiZXR3ZWVuIDAgYW5kIDI1NS5cbiAgICogQHBhcmFtIGcgLSBUaGUgZ3JlZW4gY29sb3IgdmFsdWUsIGJldHdlZW4gMCBhbmQgMjU1LlxuICAgKiBAcGFyYW0gYiAtIFRoZSBibHVlIGNvbG9yIHZhbHVlLCBiZXR3ZWVuIDAgYW5kIDI1NS5cbiAgICogQHJldHVybnMgQSBoZXhhZGVjaW1hbCBjb2xvciBzdHJpbmcgaW4gdGhlIGZvcm1hdCBcIiNSUkdHQkJcIi5cbiAgICovXG4gIHJnYlRvSGV4KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgICBjb25zdCBjb21wb25lbnRUb0hleCA9IChjOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGhleCA9IGMudG9TdHJpbmcoMTYpO1xuICAgICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFwiI1wiICsgY29tcG9uZW50VG9IZXgocikgKyBjb21wb25lbnRUb0hleChnKSArIGNvbXBvbmVudFRvSGV4KGIpO1xuICB9XG5cbiAgICAvKipcbiAgICogQWRqdXN0cyBhIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlIGJ5IGEgZ2l2ZW4gcGVyY2VudGFnZS5cbiAgICpcbiAgICogQHBhcmFtIGhleENvbG9yIC0gVGhlIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlIHRvIGFkanVzdC5cbiAgICogQHBhcmFtIHBlcmNlbnRhZ2UgLSBUaGUgcGVyY2VudGFnZSB0byBhZGp1c3QgdGhlIGNvbG9yIGJ5LCByYW5naW5nIGZyb20gLTEwMCB0byAxMDAuXG4gICAqIEByZXR1cm5zIFRoZSBhZGp1c3RlZCBoZXhhZGVjaW1hbCBjb2xvciB2YWx1ZS5cbiAgICovXG4gIGFkanVzdEhleENvbG9yKGhleENvbG9yOiBzdHJpbmcsIHBlcmNlbnRhZ2U6IG51bWJlcikge1xuICAgIC8vIFJlbW92ZSB0aGUgXCIjXCIgc3ltYm9sIGlmIHByZXNlbnRcbiAgICBoZXhDb2xvciA9IGhleENvbG9yLnJlcGxhY2UoXCIjXCIsIFwiXCIpO1xuXG4gICAgLy8gQ29udmVydCB0aGUgaGV4IGNvbG9yIHRvIFJHQiB2YWx1ZXNcbiAgICBjb25zdCByZWQgPSBwYXJzZUludChoZXhDb2xvci5zdWJzdHJpbmcoMCwgMiksIDE2KTtcbiAgICBjb25zdCBncmVlbiA9IHBhcnNlSW50KGhleENvbG9yLnN1YnN0cmluZygyLCA0KSwgMTYpO1xuICAgIGNvbnN0IGJsdWUgPSBwYXJzZUludChoZXhDb2xvci5zdWJzdHJpbmcoNCwgNiksIDE2KTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYWRqdXN0bWVudCBhbW91bnQgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2VcbiAgICBjb25zdCBhZGp1c3RBbW91bnQgPSBNYXRoLnJvdW5kKDI1NSAqIChwZXJjZW50YWdlIC8gMTAwKSk7XG5cbiAgICAvLyBBZGp1c3QgdGhlIFJHQiB2YWx1ZXNcbiAgICBjb25zdCBhZGp1c3RlZFJlZCA9IHRoaXMuY2xhbXAocmVkICsgYWRqdXN0QW1vdW50KTtcbiAgICBjb25zdCBhZGp1c3RlZEdyZWVuID0gdGhpcy5jbGFtcChncmVlbiArIGFkanVzdEFtb3VudCk7XG4gICAgY29uc3QgYWRqdXN0ZWRCbHVlID0gdGhpcy5jbGFtcChibHVlICsgYWRqdXN0QW1vdW50KTtcblxuICAgIC8vIENvbnZlcnQgdGhlIGFkanVzdGVkIFJHQiB2YWx1ZXMgYmFjayB0byBoZXhcbiAgICBjb25zdCBhZGp1c3RlZEhleENvbG9yID0gYCMkeyhhZGp1c3RlZFJlZCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHsoYWRqdXN0ZWRHcmVlbikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHsoYWRqdXN0ZWRCbHVlKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX1gO1xuXG4gICAgcmV0dXJuIGFkanVzdGVkSGV4Q29sb3I7XG4gIH1cblxuICBjbGFtcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHZhbHVlLCAyNTUpKTtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { ColorConversionService } from '../color-conversion.service';
|
|
3
|
+
import { ColorPalletteService } from '../color-pallette.service';
|
|
4
|
+
import { TextColorService } from '../text-color.service';
|
|
5
|
+
import { ColorLightenDarkenService } from '../color-lighten-darken.service';
|
|
6
|
+
import { ColorSchemeService } from '../color-scheme.service';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
import * as i2 from "@angular/material/divider";
|
|
10
|
+
export class ColorUtilitiesDemoComponent {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.colorConversionService = inject(ColorConversionService);
|
|
13
|
+
this.colorLightenDarkenService = inject(ColorLightenDarkenService);
|
|
14
|
+
this.colorPalletteService = inject(ColorPalletteService);
|
|
15
|
+
this.textColorService = inject(TextColorService);
|
|
16
|
+
this.colorSchemeService = inject(ColorSchemeService);
|
|
17
|
+
this.HEX = this.colorConversionService.rgbToHex([12, 56, 128]);
|
|
18
|
+
this.RGB = `rgb(${this.colorConversionService.hexToRgb('#AA11BB')})`;
|
|
19
|
+
this.lighten = this.colorLightenDarkenService.lighten('#AA11BB', .25);
|
|
20
|
+
this.darken = this.colorLightenDarkenService.darken('#AA11BB', .25);
|
|
21
|
+
this.colorIsDarker = this.textColorService.isColorDarker(this.lighten, this.darken);
|
|
22
|
+
this.darkBk = this.textColorService.textColorForBgColor(this.HEX, this.lighten, this.darken);
|
|
23
|
+
this.lightBk = this.textColorService.textColorForBgColor('whitesmoke', this.lighten, this.darken);
|
|
24
|
+
this.colors$ = this.colorPalletteService.palette$;
|
|
25
|
+
this.colorPick = this.colorSchemeService.generateRandomColor();
|
|
26
|
+
this.colorPickDarker = this.colorSchemeService.adjustHexColor(this.colorPick, -25);
|
|
27
|
+
this.colorPickLighter = this.colorSchemeService.adjustHexColor(this.colorPick, 25);
|
|
28
|
+
}
|
|
29
|
+
ngOnInit() {
|
|
30
|
+
// define image path
|
|
31
|
+
this.img = '/assets/images/HD.png';
|
|
32
|
+
this.colorPalletteService.getColorsFromImage(this.img, 8);
|
|
33
|
+
}
|
|
34
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
35
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ColorUtilitiesDemoComponent, selector: "app-color-utilities-demo", ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h1>Color Conversion Service</h1>\n <div style=\"display: flex; flex-direction: column; gap: 1rem;\">\n <div style=\"display: flex\">\n <div style=\"padding-top: .5rem; margin-right: .5rem;\">rgbToHex: {{ HEX }}</div>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"HEX\"></div>\n </div>\n\n <div style=\"display: flex\">\n <div style=\"padding-top: .5rem; margin-right: .5rem;\"> hexToRgb: {{ RGB }} </div>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"RGB\"></div>\n </div>\n </div>\n\n <div style=\"margin-top: 1rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n\n <h1>Color Light/Darken Service</h1>\n\n <div style=\"display: flex; flex-direction: column; gap: 1rem;\">\n\n <div style=\"display: flex; gap: 1rem\">\n Original Color: #AA11BB<br>\n <div style=\"width: 32px; height: 32px; background-color: #AA11BB;\"></div>\n Lighten (25%): {{ lighten }}<br>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"lighten\"></div>\n Darken (25%): {{ darken }}<br>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"darken\"></div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 1rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n\n <h1>Text Color Utility Services</h1>\n\n <div style=\"display: flex; gap: 1rem; flex-direction: column;\">\n <div style=\"display: flex; gap: 1rem\">\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"darken\"></div>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"lighten\"></div>\n is Darker : {{ colorIsDarker }}\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"colorIsDarker\"></div>\n </div>\n \n <div style=\"display: flex; gap: 1rem; flex-direction: column;\">\n \n <div>\n Use: {{ lightBk }} for '{{ HEX }}' background-color<br>\n <div style=\"padding: 1rem;\" [style.backgroundColor]=\"HEX\" [style.color]=\"darkBk\">\n Sample Text Color\n </div>\n </div>\n\n <div>\n Use: {{ lightBk }} for 'whitesmoke' background-color<br>\n <div style=\"padding: 1rem; background-color: whitesmoke;\" [style.color]=\"lightBk\">\n Sample Text Color\n </div>\n </div>\n </div>\n </div>\n\n <div style=\"margin-top: 1rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n \n <h1>Color Schema Services</h1>\n\n <div style=\"display: flex; gap: 1rem\">\n Pick Color: {{ colorPick }}<br>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"colorPick\"></div>\n Lighter Version: {{ colorPickLighter }}<br>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"colorPickLighter\"></div>\n DarkerVersion: {{ colorPickDarker }}<br>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"colorPickDarker\"></div>\n </div>\n\n <div style=\"margin-top: 1rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n\n <h1>Color Pallette Service</h1>\n Creates Pallette from Image\n <div style=\"display: flex; gap: 2rem;\">\n <div>\n <img [src]=\"img\" height=\"180\">\n </div>\n\n <div style=\"display: flex; gap: .5rem; width: 120px; border: 1px solid black; flex-wrap: wrap; padding: .5rem;\">\n <div>Color Pick</div>\n <ng-container *ngFor=\"let color of (colors$ | async)\">\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"color.color\"></div>\n </ng-container>\n </div>\n \n <div style=\"display: flex; gap: .5rem; width: 120px; border: 1px solid black; flex-wrap: wrap; padding: .5rem;\">\n <div>Complementary</div>\n <ng-container *ngFor=\"let color of (colors$ | async)\">\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"color.complementaryColor\"></div>\n </ng-container>\n </div>\n </div>\n\n</div>\n\n", styles: [".box{width:100px;height:100px;border:solid thin black;color:#000;margin:4px;padding:16px;display:flex;flex-wrap:wrap;align-content:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] }); }
|
|
36
|
+
}
|
|
37
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesDemoComponent, decorators: [{
|
|
38
|
+
type: Component,
|
|
39
|
+
args: [{ selector: 'app-color-utilities-demo', template: "<div style=\"margin: 2rem;\">\n\n <h1>Color Conversion Service</h1>\n <div style=\"display: flex; flex-direction: column; gap: 1rem;\">\n <div style=\"display: flex\">\n <div style=\"padding-top: .5rem; margin-right: .5rem;\">rgbToHex: {{ HEX }}</div>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"HEX\"></div>\n </div>\n\n <div style=\"display: flex\">\n <div style=\"padding-top: .5rem; margin-right: .5rem;\"> hexToRgb: {{ RGB }} </div>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"RGB\"></div>\n </div>\n </div>\n\n <div style=\"margin-top: 1rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n\n <h1>Color Light/Darken Service</h1>\n\n <div style=\"display: flex; flex-direction: column; gap: 1rem;\">\n\n <div style=\"display: flex; gap: 1rem\">\n Original Color: #AA11BB<br>\n <div style=\"width: 32px; height: 32px; background-color: #AA11BB;\"></div>\n Lighten (25%): {{ lighten }}<br>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"lighten\"></div>\n Darken (25%): {{ darken }}<br>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"darken\"></div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 1rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n\n <h1>Text Color Utility Services</h1>\n\n <div style=\"display: flex; gap: 1rem; flex-direction: column;\">\n <div style=\"display: flex; gap: 1rem\">\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"darken\"></div>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"lighten\"></div>\n is Darker : {{ colorIsDarker }}\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"colorIsDarker\"></div>\n </div>\n \n <div style=\"display: flex; gap: 1rem; flex-direction: column;\">\n \n <div>\n Use: {{ lightBk }} for '{{ HEX }}' background-color<br>\n <div style=\"padding: 1rem;\" [style.backgroundColor]=\"HEX\" [style.color]=\"darkBk\">\n Sample Text Color\n </div>\n </div>\n\n <div>\n Use: {{ lightBk }} for 'whitesmoke' background-color<br>\n <div style=\"padding: 1rem; background-color: whitesmoke;\" [style.color]=\"lightBk\">\n Sample Text Color\n </div>\n </div>\n </div>\n </div>\n\n <div style=\"margin-top: 1rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n \n <h1>Color Schema Services</h1>\n\n <div style=\"display: flex; gap: 1rem\">\n Pick Color: {{ colorPick }}<br>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"colorPick\"></div>\n Lighter Version: {{ colorPickLighter }}<br>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"colorPickLighter\"></div>\n DarkerVersion: {{ colorPickDarker }}<br>\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"colorPickDarker\"></div>\n </div>\n\n <div style=\"margin-top: 1rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n\n <h1>Color Pallette Service</h1>\n Creates Pallette from Image\n <div style=\"display: flex; gap: 2rem;\">\n <div>\n <img [src]=\"img\" height=\"180\">\n </div>\n\n <div style=\"display: flex; gap: .5rem; width: 120px; border: 1px solid black; flex-wrap: wrap; padding: .5rem;\">\n <div>Color Pick</div>\n <ng-container *ngFor=\"let color of (colors$ | async)\">\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"color.color\"></div>\n </ng-container>\n </div>\n \n <div style=\"display: flex; gap: .5rem; width: 120px; border: 1px solid black; flex-wrap: wrap; padding: .5rem;\">\n <div>Complementary</div>\n <ng-container *ngFor=\"let color of (colors$ | async)\">\n <div style=\"width: 32px; height: 32px;\" [style.backgroundColor]=\"color.complementaryColor\"></div>\n </ng-container>\n </div>\n </div>\n\n</div>\n\n", styles: [".box{width:100px;height:100px;border:solid thin black;color:#000;margin:4px;padding:16px;display:flex;flex-wrap:wrap;align-content:center;justify-content:center}\n"] }]
|
|
40
|
+
}], ctorParameters: function () { return []; } });
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItdXRpbGl0aWVzLWRlbW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sb3ItdXRpbHMvc3JjL2xpYi9jb2xvci11dGlsaXRpZXMtZGVtby9jb2xvci11dGlsaXRpZXMtZGVtby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xvci11dGlscy9zcmMvbGliL2NvbG9yLXV0aWxpdGllcy1kZW1vL2NvbG9yLXV0aWxpdGllcy1kZW1vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBTzdELE1BQU0sT0FBTywyQkFBMkI7SUE4QnRDO1FBNUJBLDJCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO1FBQ3ZELDhCQUF5QixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO1FBQzdELHlCQUFvQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ25ELHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzNDLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBRy9DLFFBQUcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3pELFFBQUcsR0FBRyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQTtRQUcvRCxZQUFPLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDaEUsV0FBTSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBRTlELGtCQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUU5RSxXQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdkYsWUFBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFHNUYsWUFBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUE7UUFFNUMsY0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1FBQ3pELG9CQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDN0UscUJBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBSTdELENBQUM7SUFFakIsUUFBUTtRQUVOLG9CQUFvQjtRQUNwQixJQUFJLENBQUMsR0FBRyxHQUFHLHVCQUF1QixDQUFBO1FBQ2xDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBRzNELENBQUM7K0dBdkNVLDJCQUEyQjttR0FBM0IsMkJBQTJCLGdFQ2J4QywwK0hBNkdBOzs0RkRoR2EsMkJBQTJCO2tCQUx2QyxTQUFTOytCQUNFLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29sb3JDb252ZXJzaW9uU2VydmljZSB9IGZyb20gJy4uL2NvbG9yLWNvbnZlcnNpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb2xvclBhbGxldHRlU2VydmljZSB9IGZyb20gJy4uL2NvbG9yLXBhbGxldHRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dENvbG9yU2VydmljZSB9IGZyb20gJy4uL3RleHQtY29sb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBDb2xvckxpZ2h0ZW5EYXJrZW5TZXJ2aWNlIH0gZnJvbSAnLi4vY29sb3ItbGlnaHRlbi1kYXJrZW4uc2VydmljZSc7XG5pbXBvcnQgeyBDb2xvclNjaGVtZVNlcnZpY2UgfSBmcm9tICcuLi9jb2xvci1zY2hlbWUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jb2xvci11dGlsaXRpZXMtZGVtbycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb2xvci11dGlsaXRpZXMtZGVtby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbG9yLXV0aWxpdGllcy1kZW1vLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JVdGlsaXRpZXNEZW1vQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBjb2xvckNvbnZlcnNpb25TZXJ2aWNlID0gaW5qZWN0KENvbG9yQ29udmVyc2lvblNlcnZpY2UpXG4gIGNvbG9yTGlnaHRlbkRhcmtlblNlcnZpY2UgPSBpbmplY3QoQ29sb3JMaWdodGVuRGFya2VuU2VydmljZSlcbiAgY29sb3JQYWxsZXR0ZVNlcnZpY2UgPSBpbmplY3QoQ29sb3JQYWxsZXR0ZVNlcnZpY2UpXG4gIHRleHRDb2xvclNlcnZpY2UgPSBpbmplY3QoVGV4dENvbG9yU2VydmljZSlcbiAgY29sb3JTY2hlbWVTZXJ2aWNlID0gaW5qZWN0KENvbG9yU2NoZW1lU2VydmljZSlcblxuXG4gIEhFWCA9IHRoaXMuY29sb3JDb252ZXJzaW9uU2VydmljZS5yZ2JUb0hleChbMTIsIDU2LCAxMjhdKVxuICBSR0IgPSBgcmdiKCR7dGhpcy5jb2xvckNvbnZlcnNpb25TZXJ2aWNlLmhleFRvUmdiKCcjQUExMUJCJyl9KWBcblxuXG4gIGxpZ2h0ZW4gPSB0aGlzLmNvbG9yTGlnaHRlbkRhcmtlblNlcnZpY2UubGlnaHRlbignI0FBMTFCQicsIC4yNSlcbiAgZGFya2VuID0gdGhpcy5jb2xvckxpZ2h0ZW5EYXJrZW5TZXJ2aWNlLmRhcmtlbignI0FBMTFCQicsIC4yNSlcblxuICBjb2xvcklzRGFya2VyID0gdGhpcy50ZXh0Q29sb3JTZXJ2aWNlLmlzQ29sb3JEYXJrZXIodGhpcy5saWdodGVuLCB0aGlzLmRhcmtlbilcblxuICBkYXJrQmsgPSB0aGlzLnRleHRDb2xvclNlcnZpY2UudGV4dENvbG9yRm9yQmdDb2xvcih0aGlzLkhFWCwgdGhpcy5saWdodGVuLCB0aGlzLmRhcmtlbilcbiAgbGlnaHRCayA9IHRoaXMudGV4dENvbG9yU2VydmljZS50ZXh0Q29sb3JGb3JCZ0NvbG9yKCd3aGl0ZXNtb2tlJywgdGhpcy5saWdodGVuLCB0aGlzLmRhcmtlbilcblxuICBwYWxldHRlOiBhbnlcbiAgY29sb3JzJCA9IHRoaXMuY29sb3JQYWxsZXR0ZVNlcnZpY2UucGFsZXR0ZSRcblxuICBjb2xvclBpY2sgPSB0aGlzLmNvbG9yU2NoZW1lU2VydmljZS5nZW5lcmF0ZVJhbmRvbUNvbG9yKClcbiAgY29sb3JQaWNrRGFya2VyID0gdGhpcy5jb2xvclNjaGVtZVNlcnZpY2UuYWRqdXN0SGV4Q29sb3IodGhpcy5jb2xvclBpY2ssIC0yNSlcbiAgY29sb3JQaWNrTGlnaHRlciA9IHRoaXMuY29sb3JTY2hlbWVTZXJ2aWNlLmFkanVzdEhleENvbG9yKHRoaXMuY29sb3JQaWNrLCAyNSlcblxuICBpbWc6IHN0cmluZ3xhbnlcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgLy8gZGVmaW5lIGltYWdlIHBhdGhcbiAgICB0aGlzLmltZyA9ICcvYXNzZXRzL2ltYWdlcy9IRC5wbmcnXG4gICAgdGhpcy5jb2xvclBhbGxldHRlU2VydmljZS5nZXRDb2xvcnNGcm9tSW1hZ2UodGhpcy5pbWcsIDgpXG5cblxuICB9XG5cblxufVxuXG4iLCI8ZGl2IHN0eWxlPVwibWFyZ2luOiAycmVtO1wiPlxuXG4gIDxoMT5Db2xvciBDb252ZXJzaW9uIFNlcnZpY2U8L2gxPlxuICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxcmVtO1wiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZy10b3A6IC41cmVtOyBtYXJnaW4tcmlnaHQ6IC41cmVtO1wiPnJnYlRvSGV4OiB7eyBIRVggfX08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzJweDsgaGVpZ2h0OiAzMnB4O1wiIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiSEVYXCI+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleFwiPlxuICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmctdG9wOiAuNXJlbTsgbWFyZ2luLXJpZ2h0OiAuNXJlbTtcIj4gaGV4VG9SZ2I6IHt7IFJHQiB9fSA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzJweDsgaGVpZ2h0OiAzMnB4O1wiIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiUkdCXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtOyBtYXJnaW4tYm90dG9tOiAxcmVtO1wiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8aDE+Q29sb3IgTGlnaHQvRGFya2VuIFNlcnZpY2U8L2gxPlxuXG4gIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDFyZW07XCI+XG5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtXCI+XG4gICAgICBPcmlnaW5hbCBDb2xvcjogI0FBMTFCQjxicj5cbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzJweDsgaGVpZ2h0OiAzMnB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjQUExMUJCO1wiPjwvZGl2PlxuICAgICAgTGlnaHRlbiAoMjUlKToge3sgbGlnaHRlbiB9fTxicj5cbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzJweDsgaGVpZ2h0OiAzMnB4O1wiIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwibGlnaHRlblwiPjwvZGl2PlxuICAgICAgRGFya2VuICgyNSUpOiB7eyBkYXJrZW4gfX08YnI+XG4gICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDMycHg7IGhlaWdodDogMzJweDtcIiBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImRhcmtlblwiPjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtOyBtYXJnaW4tYm90dG9tOiAxcmVtO1wiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8aDE+VGV4dCBDb2xvciBVdGlsaXR5IFNlcnZpY2VzPC9oMT5cblxuICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDFyZW1cIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzJweDsgaGVpZ2h0OiAzMnB4O1wiIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiZGFya2VuXCI+PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDMycHg7IGhlaWdodDogMzJweDtcIiBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImxpZ2h0ZW5cIj48L2Rpdj5cbiAgICAgIGlzIERhcmtlciA6IHt7IGNvbG9ySXNEYXJrZXIgfX1cbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzJweDsgaGVpZ2h0OiAzMnB4O1wiIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3JJc0RhcmtlclwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuICAgICAgXG4gICAgICA8ZGl2PlxuICAgICAgICBVc2U6IHt7IGxpZ2h0QmsgfX0gZm9yICd7eyBIRVggfX0nIGJhY2tncm91bmQtY29sb3I8YnI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxcmVtO1wiIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiSEVYXCIgW3N0eWxlLmNvbG9yXT1cImRhcmtCa1wiPlxuICAgICAgICBTYW1wbGUgVGV4dCBDb2xvclxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2PlxuICAgICAgICBVc2U6IHt7IGxpZ2h0QmsgfX0gZm9yICd3aGl0ZXNtb2tlJyBiYWNrZ3JvdW5kLWNvbG9yPGJyPlxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMXJlbTsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTtcIiBbc3R5bGUuY29sb3JdPVwibGlnaHRCa1wiPlxuICAgICAgICAgIFNhbXBsZSBUZXh0IENvbG9yXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtOyBtYXJnaW4tYm90dG9tOiAxcmVtO1wiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cbiAgXG4gPGgxPkNvbG9yIFNjaGVtYSBTZXJ2aWNlczwvaDE+XG5cbiAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMXJlbVwiPlxuICAgIFBpY2sgQ29sb3I6IHt7IGNvbG9yUGljayB9fTxicj5cbiAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDMycHg7IGhlaWdodDogMzJweDtcIiBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImNvbG9yUGlja1wiPjwvZGl2PlxuICAgIExpZ2h0ZXIgVmVyc2lvbjoge3sgY29sb3JQaWNrTGlnaHRlciB9fTxicj5cbiAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDMycHg7IGhlaWdodDogMzJweDtcIiBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImNvbG9yUGlja0xpZ2h0ZXJcIj48L2Rpdj5cbiAgICBEYXJrZXJWZXJzaW9uOiB7eyBjb2xvclBpY2tEYXJrZXIgfX08YnI+XG4gICAgPGRpdiBzdHlsZT1cIndpZHRoOiAzMnB4OyBoZWlnaHQ6IDMycHg7XCIgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJjb2xvclBpY2tEYXJrZXJcIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07IG1hcmdpbi1ib3R0b206IDFyZW07XCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxoMT5Db2xvciBQYWxsZXR0ZSBTZXJ2aWNlPC9oMT5cbiAgQ3JlYXRlcyBQYWxsZXR0ZSBmcm9tIEltYWdlXG4gIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDJyZW07XCI+XG4gICAgPGRpdj5cbiAgICAgIDxpbWcgW3NyY109XCJpbWdcIiBoZWlnaHQ9XCIxODBcIj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IC41cmVtOyB3aWR0aDogMTIwcHg7IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBmbGV4LXdyYXA6IHdyYXA7IHBhZGRpbmc6IC41cmVtO1wiPlxuICAgICAgPGRpdj5Db2xvciBQaWNrPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2xvciBvZiAoY29sb3JzJCB8IGFzeW5jKVwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzJweDsgaGVpZ2h0OiAzMnB4O1wiIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3IuY29sb3JcIj48L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAuNXJlbTsgd2lkdGg6IDEyMHB4OyBib3JkZXI6IDFweCBzb2xpZCBibGFjazsgZmxleC13cmFwOiB3cmFwOyBwYWRkaW5nOiAuNXJlbTtcIj5cbiAgICAgIDxkaXY+Q29tcGxlbWVudGFyeTwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sb3Igb2YgKGNvbG9ycyQgfCBhc3luYylcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDMycHg7IGhlaWdodDogMzJweDtcIiBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImNvbG9yLmNvbXBsZW1lbnRhcnlDb2xvclwiPjwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48L2Rpdj5cblxuIl19
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
+
import { ColorUtilitiesDemoComponent } from '../public-api';
|
|
5
|
+
import { MatDividerModule } from '@angular/material/divider';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class ColorUtilitiesModule {
|
|
8
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
9
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, declarations: [ColorUtilitiesDemoComponent], imports: [CommonModule,
|
|
10
|
+
MatButtonModule,
|
|
11
|
+
MatDividerModule], exports: [ColorUtilitiesDemoComponent] }); }
|
|
12
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, imports: [CommonModule,
|
|
13
|
+
MatButtonModule,
|
|
14
|
+
MatDividerModule] }); }
|
|
15
|
+
}
|
|
16
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, decorators: [{
|
|
17
|
+
type: NgModule,
|
|
18
|
+
args: [{
|
|
19
|
+
imports: [
|
|
20
|
+
CommonModule,
|
|
21
|
+
MatButtonModule,
|
|
22
|
+
MatDividerModule
|
|
23
|
+
],
|
|
24
|
+
declarations: [
|
|
25
|
+
ColorUtilitiesDemoComponent,
|
|
26
|
+
],
|
|
27
|
+
exports: [
|
|
28
|
+
ColorUtilitiesDemoComponent
|
|
29
|
+
]
|
|
30
|
+
}]
|
|
31
|
+
}] });
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItdXRpbHMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sb3ItdXRpbHMvc3JjL2xpYi9jb2xvci11dGlscy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFlN0QsTUFBTSxPQUFPLG9CQUFvQjsrR0FBcEIsb0JBQW9CO2dIQUFwQixvQkFBb0IsaUJBTjdCLDJCQUEyQixhQUwzQixZQUFZO1lBQ1osZUFBZTtZQUNmLGdCQUFnQixhQU1oQiwyQkFBMkI7Z0hBR2xCLG9CQUFvQixZQVg3QixZQUFZO1lBQ1osZUFBZTtZQUNmLGdCQUFnQjs7NEZBU1Asb0JBQW9CO2tCQWJoQyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsZ0JBQWdCO3FCQUNqQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osMkJBQTJCO3FCQUM1QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsMkJBQTJCO3FCQUM1QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgQ29sb3JVdGlsaXRpZXNEZW1vQ29tcG9uZW50IH0gZnJvbSAnLi4vcHVibGljLWFwaSc7XG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdERpdmlkZXJNb2R1bGVcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgQ29sb3JVdGlsaXRpZXNEZW1vQ29tcG9uZW50LFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgQ29sb3JVdGlsaXRpZXNEZW1vQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JVdGlsaXRpZXNNb2R1bGUgeyB9XG4iXX0=
|