color-util-helpers 1.0.4 → 1.0.6

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 CHANGED
@@ -8,6 +8,7 @@ This lib contains a variety of very useful color utils
8
8
  - Text Color - provides the color to use (you provide light and dark) based on color provided
9
9
  - Color Lighten Darken - Takes a color and you can darken or lighten
10
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
+ - Color Grabber - Directive when applied to a div will get the average color of the provided url of an image and then change the background color.
11
12
 
12
13
  ## Demo
13
14
 
@@ -32,6 +33,10 @@ npm install color-util-helpers
32
33
 
33
34
  ## Color Pallette Service and Directive
34
35
 
36
+ ### Usage
37
+
38
+ Because this is a Directive - import the `ColorExtractorDirective`
39
+
35
40
  define image path
36
41
 
37
42
  this.colorSelectionService.getColorsFromImage('../assets/sample2.jpg')
@@ -123,3 +128,45 @@ This function takes a color '#3498db' and lightens the color by 20% and also dar
123
128
  console.log(lighterColor, darkerColor);
124
129
  ```
125
130
 
131
+ # Color Grabber
132
+
133
+ This Angular Directive when applied to a div will get the average color of the provided url of an image and then change the background color to that color. Any test inside the div will be colored white or black based on the average color of the image that best suites it.
134
+
135
+ ## Usage
136
+
137
+ Because this is a Directive - import the `ColorUtilitiesModule`
138
+ In the following example, the mat-card container has the `colorGrab` directive applied.
139
+
140
+ The `[imageUrl]="image"` is the image to grab the color from.
141
+
142
+ The `[light]="'#FFFFFF'"` is the light color to use if the average color is dark.
143
+ The `[dark]="'#000000'"` is the dark color to use if the average color is light.
144
+
145
+ The mat-card contaner background color will change to this color
146
+
147
+ The Text inside this container will also change ether to black or white depending what suites best based on that colors image.
148
+
149
+ To use in the directive, use the following
150
+
151
+ ```
152
+ image = "https://picsum.photos/id/1/5616/3744"
153
+ ```
154
+
155
+ ```
156
+ <mat-card style="margin: 8px;"
157
+ colorGrab [imageUrl]="image" [light]="'rgb(220, 220, 220)'" [dark]="'rgb(47, 79, 79)'"
158
+ class="box"
159
+ >
160
+ <h3>{{ item.author }}</h3>
161
+ <img [src]="image" width="160" height="120" style="object-fit: cover;">
162
+ </mat-card>
163
+ ```
164
+
165
+ ## Paramiter
166
+
167
+ > imageUrl - provide the full URL of the image (png, jpg)
168
+
169
+ ```
170
+ colorGrab [imageUrl]="item.download_url"
171
+ ```
172
+
Binary file
@@ -0,0 +1,185 @@
1
+ import { Directive, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class ColorGrabberDirective {
4
+ constructor(el) {
5
+ this.el = el;
6
+ }
7
+ ngOnInit() {
8
+ const canvas = document.createElement('canvas');
9
+ canvas.width = 1;
10
+ canvas.height = 1;
11
+ this.ctx = canvas.getContext('2d');
12
+ const img = new Image();
13
+ img.src = this.imageUrl || '';
14
+ img.setAttribute('crossOrigin', '');
15
+ img.onload = () => {
16
+ this.ctx?.drawImage(img, 0, 0, 1, 1);
17
+ const imageData = this.ctx?.getImageData(0, 0, 1, 1);
18
+ if (imageData && imageData.data) {
19
+ const i = imageData.data;
20
+ const rgbColor = `rgba(${i[0]},${i[1]},${i[2]},${i[3]})`;
21
+ const hexColor = "#" + ((1 << 24) + (i[0] << 16) + (i[1] << 8) + i[2]).toString(16).slice(1);
22
+ const textColor = this.textColorBasedOnBgColor(hexColor, this.light, this.dark);
23
+ const hsv = this.RGB2HSV({ r: i[0], g: i[1], b: i[2] });
24
+ hsv.hue = this.HueShift(hsv.hue, 135.0);
25
+ const secondaryColor = this.HSV2RGB(hsv);
26
+ const highlightColor = this.lightenDarkenColor(secondaryColor.hex, 50);
27
+ this.el.nativeElement.style.backgroundColor = rgbColor;
28
+ this.el.nativeElement.style.color = textColor;
29
+ }
30
+ else {
31
+ console.error("Failed to get image data.");
32
+ }
33
+ };
34
+ }
35
+ textColorBasedOnBgColor(bgColor, lightColor = '#FFFFFF', darkColor = '#000000') {
36
+ const color = (bgColor.charAt(0) === '#') ? bgColor.substring(1, 7) : bgColor;
37
+ const r = parseInt(color.substring(0, 2), 16); // hexToR
38
+ const g = parseInt(color.substring(2, 4), 16); // hexToG
39
+ const b = parseInt(color.substring(4, 6), 16); // hexToB
40
+ const uicolors = [r / 255, g / 255, b / 255];
41
+ const c = uicolors.map((col) => {
42
+ if (col <= 0.03928)
43
+ return col / 12.92;
44
+ return Math.pow((col + 0.055) / 1.055, 2.4);
45
+ });
46
+ const L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2]);
47
+ return (L > 0.179) ? darkColor : lightColor;
48
+ }
49
+ RGB2HSV(rgb) {
50
+ const hsv = { saturation: 0, hue: 0, value: 0 };
51
+ const max = this.max3(rgb.r, rgb.g, rgb.b);
52
+ const dif = max - this.min3(rgb.r, rgb.g, rgb.b);
53
+ hsv.saturation = (max == 0.0) ? 0 : (100 * dif / max);
54
+ if (hsv.saturation == 0) {
55
+ hsv.hue = 0;
56
+ }
57
+ else if (rgb.r == max) {
58
+ hsv.hue = 60.0 * (rgb.g - rgb.b) / dif;
59
+ }
60
+ else if (rgb.g == max) {
61
+ hsv.hue = 120.0 + 60.0 * (rgb.b - rgb.r) / dif;
62
+ }
63
+ else if (rgb.b == max) {
64
+ hsv.hue = 240.0 + 60.0 * (rgb.r - rgb.g) / dif;
65
+ }
66
+ if (hsv.hue < 0.0)
67
+ hsv.hue += 360.0;
68
+ hsv.value = Math.round(max * 100 / 255);
69
+ hsv.hue = Math.round(hsv.hue);
70
+ hsv.saturation = Math.round(hsv.saturation);
71
+ return hsv;
72
+ }
73
+ HSV2RGB(hsv) {
74
+ const rgb = { r: 0, g: 0, b: 0 };
75
+ if (hsv.saturation == 0) {
76
+ rgb.r = rgb.g = rgb.b = Math.round(hsv.value * 2.55);
77
+ }
78
+ else {
79
+ hsv.hue /= 60;
80
+ hsv.saturation /= 100;
81
+ hsv.value /= 100;
82
+ const i = Math.floor(hsv.hue);
83
+ const f = hsv.hue - i;
84
+ const p = hsv.value * (1 - hsv.saturation);
85
+ const q = hsv.value * (1 - hsv.saturation * f);
86
+ const t = hsv.value * (1 - hsv.saturation * (1 - f));
87
+ switch (i) {
88
+ case 0:
89
+ rgb.r = hsv.value;
90
+ rgb.g = t;
91
+ rgb.b = p;
92
+ break;
93
+ case 1:
94
+ rgb.r = q;
95
+ rgb.g = hsv.value;
96
+ rgb.b = p;
97
+ break;
98
+ case 2:
99
+ rgb.r = p;
100
+ rgb.g = hsv.value;
101
+ rgb.b = t;
102
+ break;
103
+ case 3:
104
+ rgb.r = p;
105
+ rgb.g = q;
106
+ rgb.b = hsv.value;
107
+ break;
108
+ case 4:
109
+ rgb.r = t;
110
+ rgb.g = p;
111
+ rgb.b = hsv.value;
112
+ break;
113
+ default:
114
+ rgb.r = hsv.value;
115
+ rgb.g = p;
116
+ rgb.b = q;
117
+ }
118
+ rgb.r = Math.round(rgb.r * 255);
119
+ rgb.g = Math.round(rgb.g * 255);
120
+ rgb.b = Math.round(rgb.b * 255);
121
+ }
122
+ const rgbColor = `rgba(${rgb.r},${rgb.g},${rgb.b},${1})`;
123
+ const hexColor = "#" + ((1 << 24) + (rgb.r << 16) + (rgb.g << 8) + rgb.b).toString(16).slice(1);
124
+ return { rgb: rgbColor, hex: hexColor };
125
+ }
126
+ HueShift(h, s) {
127
+ h += s;
128
+ while (h >= 360.0)
129
+ h -= 360.0;
130
+ while (h < 0.0)
131
+ h += 360.0;
132
+ return h;
133
+ }
134
+ min3(a, b, c) {
135
+ return (a < b) ? ((a < c) ? a : c) : ((b < c) ? b : c);
136
+ }
137
+ max3(a, b, c) {
138
+ return (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
139
+ }
140
+ lightenDarkenColor(colorCode, amount) {
141
+ var usePound = false;
142
+ if (colorCode[0] == "#") {
143
+ colorCode = colorCode.slice(1);
144
+ usePound = true;
145
+ }
146
+ var num = parseInt(colorCode, 16);
147
+ var r = (num >> 16) + amount;
148
+ if (r > 255) {
149
+ r = 255;
150
+ }
151
+ else if (r < 0) {
152
+ r = 0;
153
+ }
154
+ var b = ((num >> 8) & 0x00FF) + amount;
155
+ if (b > 255) {
156
+ b = 255;
157
+ }
158
+ else if (b < 0) {
159
+ b = 0;
160
+ }
161
+ var g = (num & 0x0000FF) + amount;
162
+ if (g > 255) {
163
+ g = 255;
164
+ }
165
+ else if (g < 0) {
166
+ g = 0;
167
+ }
168
+ return (usePound ? "#" : "") + (g | (b << 8) | (r << 16)).toString(16);
169
+ }
170
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorGrabberDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
171
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ColorGrabberDirective, selector: "[colorGrabber]", inputs: { imageUrl: "imageUrl", light: "light", dark: "dark" }, ngImport: i0 }); }
172
+ }
173
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorGrabberDirective, decorators: [{
174
+ type: Directive,
175
+ args: [{
176
+ selector: '[colorGrabber]'
177
+ }]
178
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { imageUrl: [{
179
+ type: Input
180
+ }], light: [{
181
+ type: Input
182
+ }], dark: [{
183
+ type: Input
184
+ }] } });
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItZ3JhYi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xvci11dGlscy9zcmMvbGliL2NvbG9yLWdyYWIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQUtyRSxNQUFNLE9BQU8scUJBQXFCO0lBUWhDLFlBQW9CLEVBQWM7UUFBZCxPQUFFLEdBQUYsRUFBRSxDQUFZO0lBQUksQ0FBQztJQUV2QyxRQUFRO1FBRU4sTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNqQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVsQixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUE2QixDQUFDO1FBRS9ELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEIsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUM5QixHQUFHLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVwQyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFckQsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksRUFB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Z0JBQUUsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFBO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFFN0MsQ0FBQyxDQUFDLENBQUE7UUFFRixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUU3RCxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtJQUU3QyxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQThCO1FBRXBDLE1BQU0sR0FBRyxHQUFHLEVBQUUsVUFBVSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQTtRQUU3QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM5QyxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFFLEdBQUcsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsR0FBRyxHQUFDLEdBQUcsR0FBQyxHQUFHLENBQUMsQ0FBQTtRQUUzQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLEdBQUcsQ0FB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QUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUVsQyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUU7WUFDVCxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQ1g7YUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1Q7UUFFRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRXhFLENBQUM7K0dBcE1VLHFCQUFxQjttR0FBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQUhqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCO2lHQUtVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY29sb3JHcmFiYmVyXSdcbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JHcmFiYmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcblxuICBjdHg/OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcblxuICBASW5wdXQoKSBpbWFnZVVybD86IHN0cmluZ1xuICBASW5wdXQoKSBsaWdodD86IHN0cmluZ1xuICBASW5wdXQoKSBkYXJrPzogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSAxO1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuXG4gICAgdGhpcy5jdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhcyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcuc3JjID0gdGhpcy5pbWFnZVVybCB8fCAnJztcbiAgICBpbWcuc2V0QXR0cmlidXRlKCdjcm9zc09yaWdpbicsICcnKTtcblxuICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmN0eD8uZHJhd0ltYWdlKGltZywgMCwgMCwgMSwgMSk7XG4gICAgICBjb25zdCBpbWFnZURhdGEgPSB0aGlzLmN0eD8uZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpO1xuXG4gICAgICBpZiAoaW1hZ2VEYXRhICYmIGltYWdlRGF0YS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IGkgPSBpbWFnZURhdGEuZGF0YTtcblxuICAgICAgICBjb25zdCByZ2JDb2xvciA9IGByZ2JhKCR7aVswXX0sJHtpWzFdfSwke2lbMl19LCR7aVszXX0pYDtcbiAgICAgICAgY29uc3QgaGV4Q29sb3IgPSBcIiNcIiArICgoMSA8PCAyNCkgKyAoaVswXSA8PCAxNikgKyAoaVsxXSA8PCA4KSArIGlbMl0pLnRvU3RyaW5nKDE2KS5zbGljZSgxKTtcblxuICAgICAgICBjb25zdCB0ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvckJhc2VkT25CZ0NvbG9yKGhleENvbG9yLCB0aGlzLmxpZ2h0LCB0aGlzLmRhcmspO1xuXG4gICAgICAgIGNvbnN0IGhzdiA9IHRoaXMuUkdCMkhTVih7IHI6IGlbMF0sIGc6IGlbMV0sIGI6IGlbMl0gfSk7XG4gICAgICAgIGhzdi5odWUgPSB0aGlzLkh1ZVNoaWZ0KGhzdi5odWUsIDEzNS4wKTtcblxuICAgICAgICBjb25zdCBzZWNvbmRhcnlDb2xvciA9IHRoaXMuSFNWMlJHQihoc3YpO1xuICAgICAgICBjb25zdCBoaWdobGlnaHRDb2xvciA9IHRoaXMubGlnaHRlbkRhcmtlbkNvbG9yKHNlY29uZGFyeUNvbG9yLmhleCwgNTApO1xuXG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSByZ2JDb2xvcjtcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmNvbG9yID0gdGV4dENvbG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBnZXQgaW1hZ2UgZGF0YS5cIik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHRleHRDb2xvckJhc2VkT25CZ0NvbG9yKFxuICAgIGJnQ29sb3I6IHN0cmluZyxcbiAgICBsaWdodENvbG9yOiBzdHJpbmcgPSAnI0ZGRkZGRicsXG4gICAgZGFya0NvbG9yOiBzdHJpbmcgPSAnIzAwMDAwMCdcbiAgICApIHtcblxuICAgIGNvbnN0IGNvbG9yID0gKGJnQ29sb3IuY2hhckF0KDApID09PSAnIycpID8gYmdDb2xvci5zdWJzdHJpbmcoMSwgNykgOiBiZ0NvbG9yXG5cbiAgICBjb25zdCByID0gcGFyc2VJbnQoY29sb3Iuc3Vic3RyaW5nKDAsIDIpLCAxNikgLy8gaGV4VG9SXG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGNvbG9yLnN1YnN0cmluZygyLCA0KSwgMTYpIC8vIGhleFRvR1xuICAgIGNvbnN0IGIgPSBwYXJzZUludChjb2xvci5zdWJzdHJpbmcoNCwgNiksIDE2KSAvLyBoZXhUb0JcblxuICAgIGNvbnN0IHVpY29sb3JzID0gW3IgLyAyNTUsIGcgLyAyNTUsIGIgLyAyNTVdXG5cbiAgICBjb25zdCBjID0gdWljb2xvcnMubWFwKChjb2wpID0+IHtcblxuICAgICAgaWYgKGNvbCA8PSAwLjAzOTI4KSByZXR1cm4gY29sIC8gMTIuOTJcbiAgICAgIHJldHVybiBNYXRoLnBvdygoY29sICsgMC4wNTUpIC8gMS4wNTUsIDIuNClcblxuICAgIH0pXG5cbiAgICBjb25zdCBMID0gKDAuMjEyNiAqIGNbMF0pICsgKDAuNzE1MiAqIGNbMV0pICsgKDAuMDcyMiAqIGNbMl0pXG5cbiAgICByZXR1cm4gKEwgPiAwLjE3OSkgPyBkYXJrQ29sb3IgOiBsaWdodENvbG9yXG5cbiAgfVxuXG4gIFJHQjJIU1YocmdiOiB7IHI6IGFueSwgZzogYW55LCBiOiBhbnl9KSB7XG5cbiAgICBjb25zdCBoc3YgPSB7IHNhdHVyYXRpb246MCwgaHVlOjAsIHZhbHVlOiAwIH1cblxuICAgIGNvbnN0IG1heCA9IHRoaXMubWF4MyhyZ2IucixyZ2IuZyxyZ2IuYilcbiAgICBjb25zdCBkaWYgPSBtYXggLSB0aGlzLm1pbjMocmdiLnIscmdiLmcscmdiLmIpXG4gICAgaHN2LnNhdHVyYXRpb24gPSAobWF4PT0wLjApPzA6KDEwMCpkaWYvbWF4KVxuXG4gICAgaWYgKGhzdi5zYXR1cmF0aW9uID09IDApIHtcbiAgICAgIGhzdi5odWU9MFxuICAgIH0gZWxzZSBpZiAocmdiLnIgPT0gbWF4KSB7XG4gICAgICBoc3YuaHVlPTYwLjAqKHJnYi5nLXJnYi5iKS9kaWZcbiAgICB9IGVsc2UgaWYgKHJnYi5nID09IG1heCkge1xuICAgICAgaHN2Lmh1ZT0xMjAuMCs2MC4wKihyZ2IuYi1yZ2IucikvZGlmXG4gICAgfSBlbHNlIGlmIChyZ2IuYiA9PSBtYXgpIHtcbiAgICAgIGhzdi5odWU9MjQwLjArNjAuMCoocmdiLnItcmdiLmcpL2RpZlxuICAgIH1cblxuICAgIGlmIChoc3YuaHVlPDAuMCkgaHN2Lmh1ZSs9MzYwLjBcblxuICAgIGhzdi52YWx1ZSA9IE1hdGgucm91bmQobWF4KjEwMC8yNTUpXG4gICAgaHN2Lmh1ZSA9IE1hdGgucm91bmQoaHN2Lmh1ZSlcbiAgICBoc3Yuc2F0dXJhdGlvbiA9IE1hdGgucm91bmQoaHN2LnNhdHVyYXRpb24pXG5cbiAgICByZXR1cm4gaHN2XG4gIH1cblxuICBIU1YyUkdCKGhzdjogYW55KSB7XG5cbiAgICBjb25zdCByZ2IgPSB7IHI6IDAsIGc6IDAsIGI6IDB9XG5cbiAgICBpZiAoaHN2LnNhdHVyYXRpb249PTApIHtcbiAgICAgIHJnYi5yID0gcmdiLmcgPSByZ2IuYiA9IE1hdGgucm91bmQoaHN2LnZhbHVlKjIuNTUpXG4gICAgfSBlbHNlIHtcblxuICAgICAgaHN2Lmh1ZS89NjBcbiAgICAgIGhzdi5zYXR1cmF0aW9uLz0xMDBcbiAgICAgIGhzdi52YWx1ZS89MTAwXG4gICAgICBjb25zdCBpID0gTWF0aC5mbG9vcihoc3YuaHVlKVxuICAgICAgY29uc3QgZiA9IGhzdi5odWUtaVxuXG4gICAgICBjb25zdCBwID0gaHN2LnZhbHVlKigxLWhzdi5zYXR1cmF0aW9uKVxuICAgICAgY29uc3QgcSA9IGhzdi52YWx1ZSooMS1oc3Yuc2F0dXJhdGlvbipmKVxuICAgICAgY29uc3QgdCA9IGhzdi52YWx1ZSooMS1oc3Yuc2F0dXJhdGlvbiooMS1mKSlcblxuICAgICAgc3dpdGNoKGkpIHtcblxuICAgICAgY2FzZSAwOiByZ2Iucj1oc3YudmFsdWU7IHJnYi5nPXQ7IHJnYi5iPXA7IGJyZWFrXG4gICAgICBjYXNlIDE6IHJnYi5yPXE7IHJnYi5nPWhzdi52YWx1ZTsgcmdiLmI9cDsgYnJlYWtcbiAgICAgIGNhc2UgMjogcmdiLnI9cDsgcmdiLmc9aHN2LnZhbHVlOyByZ2IuYj10OyBicmVha1xuICAgICAgY2FzZSAzOiByZ2Iucj1wOyByZ2IuZz1xOyByZ2IuYj1oc3YudmFsdWU7IGJyZWFrXG4gICAgICBjYXNlIDQ6IHJnYi5yPXQ7IHJnYi5nPXA7IHJnYi5iPWhzdi52YWx1ZTsgYnJlYWtcblxuICAgICAgZGVmYXVsdDogcmdiLnI9aHN2LnZhbHVlOyByZ2IuZz1wOyByZ2IuYj1xXG5cbiAgICAgIH1cblxuICAgICAgcmdiLnIgPSBNYXRoLnJvdW5kKHJnYi5yKjI1NSlcbiAgICAgIHJnYi5nID0gTWF0aC5yb3VuZChyZ2IuZyoyNTUpXG4gICAgICByZ2IuYiA9IE1hdGgucm91bmQocmdiLmIqMjU1KVxuXG4gICAgfVxuXG4gICAgY29uc3QgcmdiQ29sb3IgPSBgcmdiYSgke3JnYi5yfSwke3JnYi5nfSwke3JnYi5ifSwkezF9KWBcbiAgICBjb25zdCBoZXhDb2xvciA9IFwiI1wiICsgKCgxIDw8IDI0KSArIChyZ2IuciA8PCAxNikgKyAocmdiLmcgPDwgOCkgKyByZ2IuYikudG9TdHJpbmcoMTYpLnNsaWNlKDEpXG5cbiAgICByZXR1cm4geyByZ2I6IHJnYkNvbG9yLCBoZXg6IGhleENvbG9yIH1cbiAgfVxuXG4gIEh1ZVNoaWZ0KGg6IGFueSwgczogYW55KSB7XG4gICAgaCArPSBzXG4gICAgd2hpbGUgKGg+PTM2MC4wKSBoLT0zNjAuMFxuICAgIHdoaWxlIChoPDAuMCkgaCs9MzYwLjBcbiAgICByZXR1cm4gaFxuICB9XG5cbiAgbWluMyhhOiBhbnksIGI6IGFueSwgYzogYW55KSB7XG4gICAgcmV0dXJuIChhPGIpPygoYTxjKT9hOmMpOigoYjxjKT9iOmMpXG4gIH1cblxuICBtYXgzKGE6IGFueSwgYjogYW55LCBjOiBhbnkpIHtcbiAgICByZXR1cm4gKGE+Yik/KChhPmMpP2E6Yyk6KChiPmMpP2I6YylcbiAgfVxuXG4gIGxpZ2h0ZW5EYXJrZW5Db2xvcihjb2xvckNvZGU6IGFueSwgYW1vdW50OiBudW1iZXIpIHtcblxuICAgIHZhciB1c2VQb3VuZCA9IGZhbHNlO1xuXG4gICAgaWYgKGNvbG9yQ29kZVswXSA9PSBcIiNcIikge1xuICAgICAgICBjb2xvckNvZGUgPSBjb2xvckNvZGUuc2xpY2UoMSk7XG4gICAgICAgIHVzZVBvdW5kID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbnVtID0gcGFyc2VJbnQoY29sb3JDb2RlLCAxNik7XG5cbiAgICB2YXIgciA9IChudW0gPj4gMTYpICsgYW1vdW50O1xuXG4gICAgaWYgKHIgPiAyNTUpIHtcbiAgICAgICAgciA9IDI1NTtcbiAgICB9IGVsc2UgaWYgKHIgPCAwKSB7XG4gICAgICAgIHIgPSAwO1xuICAgIH1cblxuICAgIHZhciBiID0gKChudW0gPj4gOCkgJiAweDAwRkYpICsgYW1vdW50O1xuXG4gICAgaWYgKGIgPiAyNTUpIHtcbiAgICAgICAgYiA9IDI1NTtcbiAgICB9IGVsc2UgaWYgKGIgPCAwKSB7XG4gICAgICAgIGIgPSAwO1xuICAgIH1cblxuICAgIHZhciBnID0gKG51bSAmIDB4MDAwMEZGKSArIGFtb3VudDtcblxuICAgIGlmIChnID4gMjU1KSB7XG4gICAgICAgIGcgPSAyNTU7XG4gICAgfSBlbHNlIGlmIChnIDwgMCkge1xuICAgICAgICBnID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKHVzZVBvdW5kID8gXCIjXCIgOiBcIlwiKSArIChnIHwgKGIgPDwgOCkgfCAociA8PCAxNikpLnRvU3RyaW5nKDE2KVxuXG4gIH1cblxufVxuIl19
@@ -1,12 +1,16 @@
1
1
  import { NgModule } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { MatButtonModule } from '@angular/material/button';
4
- import { ColorUtilitiesDemoComponent } from '../public-api';
5
4
  import { MatDividerModule } from '@angular/material/divider';
5
+ import { ColorGrabberDirective } from './color-grab.directive';
6
+ import { ColorUtilitiesDemoComponent } from './color-utilities-demo/color-utilities-demo.component';
7
+ import { ColorExtractorDirective } from './color-extractor.directive';
6
8
  import * as i0 from "@angular/core";
7
9
  export class ColorUtilitiesModule {
8
10
  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,
11
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, declarations: [ColorUtilitiesDemoComponent,
12
+ ColorGrabberDirective,
13
+ ColorExtractorDirective], imports: [CommonModule,
10
14
  MatButtonModule,
11
15
  MatDividerModule], exports: [ColorUtilitiesDemoComponent] }); }
12
16
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, imports: [CommonModule,
@@ -23,10 +27,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
23
27
  ],
24
28
  declarations: [
25
29
  ColorUtilitiesDemoComponent,
30
+ ColorGrabberDirective,
31
+ ColorExtractorDirective
26
32
  ],
27
33
  exports: [
28
34
  ColorUtilitiesDemoComponent
29
35
  ]
30
36
  }]
31
37
  }] });
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItdXRpbHMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sb3ItdXRpbHMvc3JjL2xpYi9jb2xvci11dGlscy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFlN0QsTUFBTSxPQUFPLG9CQUFvQjsrR0FBcEIsb0JBQW9CO2dIQUFwQixvQkFBb0IsaUJBTjdCLDJCQUEyQixhQUwzQixZQUFZO1lBQ1osZUFBZTtZQUNmLGdCQUFnQixhQU1oQiwyQkFBMkI7Z0hBR2xCLG9CQUFvQixZQVg3QixZQUFZO1lBQ1osZUFBZTtZQUNmLGdCQUFnQjs7NEZBU1Asb0JBQW9CO2tCQWJoQyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsZ0JBQWdCO3FCQUNqQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osMkJBQTJCO3FCQUM1QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsMkJBQTJCO3FCQUM1QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgQ29sb3JVdGlsaXRpZXNEZW1vQ29tcG9uZW50IH0gZnJvbSAnLi4vcHVibGljLWFwaSc7XG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdERpdmlkZXJNb2R1bGVcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgQ29sb3JVdGlsaXRpZXNEZW1vQ29tcG9uZW50LFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgQ29sb3JVdGlsaXRpZXNEZW1vQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JVdGlsaXRpZXNNb2R1bGUgeyB9XG4iXX0=
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItdXRpbHMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sb3ItdXRpbHMvc3JjL2xpYi9jb2xvci11dGlscy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9ELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOztBQWtCdEUsTUFBTSxPQUFPLG9CQUFvQjsrR0FBcEIsb0JBQW9CO2dIQUFwQixvQkFBb0IsaUJBUjdCLDJCQUEyQjtZQUMzQixxQkFBcUI7WUFDckIsdUJBQXVCLGFBUHZCLFlBQVk7WUFDWixlQUFlO1lBQ2YsZ0JBQWdCLGFBUWhCLDJCQUEyQjtnSEFHbEIsb0JBQW9CLFlBYjdCLFlBQVk7WUFDWixlQUFlO1lBQ2YsZ0JBQWdCOzs0RkFXUCxvQkFBb0I7a0JBZmhDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixnQkFBZ0I7cUJBQ2pCO29CQUNELFlBQVksRUFBRTt3QkFDWiwyQkFBMkI7d0JBQzNCLHFCQUFxQjt3QkFDckIsdUJBQXVCO3FCQUN4QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsMkJBQTJCO3FCQUM1QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuaW1wb3J0IHsgQ29sb3JHcmFiYmVyRGlyZWN0aXZlIH0gZnJvbSAnLi9jb2xvci1ncmFiLmRpcmVjdGl2ZSc7XG5cbmltcG9ydCB7IENvbG9yVXRpbGl0aWVzRGVtb0NvbXBvbmVudCB9IGZyb20gJy4vY29sb3ItdXRpbGl0aWVzLWRlbW8vY29sb3ItdXRpbGl0aWVzLWRlbW8uY29tcG9uZW50JztcbmltcG9ydCB7IENvbG9yRXh0cmFjdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi9jb2xvci1leHRyYWN0b3IuZGlyZWN0aXZlJztcblxuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXREaXZpZGVyTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIENvbG9yVXRpbGl0aWVzRGVtb0NvbXBvbmVudCxcbiAgICBDb2xvckdyYWJiZXJEaXJlY3RpdmUsXG4gICAgQ29sb3JFeHRyYWN0b3JEaXJlY3RpdmVcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIENvbG9yVXRpbGl0aWVzRGVtb0NvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIENvbG9yVXRpbGl0aWVzTW9kdWxlIHsgfVxuIl19
@@ -5,8 +5,9 @@ export * from './lib/color-utils.module';
5
5
  export * from './lib/color-utilities-demo/color-utilities-demo.component';
6
6
  export * from './lib/color-conversion.service';
7
7
  export * from './lib/color-extractor.directive';
8
+ export * from './lib/color-grab.directive';
8
9
  export * from './lib/color-pallette.service';
9
10
  export * from './lib/text-color.service';
10
11
  export * from './lib/color-scheme.service';
11
12
  export * from './lib/color-lighten-darken.service';
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvbG9yLXV0aWxzL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDJEQUEyRCxDQUFDO0FBRTFFLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsMEJBQTBCLENBQUM7QUFFekMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLG9DQUFvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBjb2xvci11dGlsc1xuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbG9yLXV0aWxzLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb2xvci11dGlsaXRpZXMtZGVtby9jb2xvci11dGlsaXRpZXMtZGVtby5jb21wb25lbnQnO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb2xvci1jb252ZXJzaW9uLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29sb3ItZXh0cmFjdG9yLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb2xvci1wYWxsZXR0ZS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RleHQtY29sb3Iuc2VydmljZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbG9yLXNjaGVtZS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbG9yLWxpZ2h0ZW4tZGFya2VuLnNlcnZpY2UnO1xuIl19
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvbG9yLXV0aWxzL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDJEQUEyRCxDQUFDO0FBRTFFLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYywwQkFBMEIsQ0FBQztBQUV6QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsb0NBQW9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGNvbG9yLXV0aWxzXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29sb3ItdXRpbHMubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbG9yLXV0aWxpdGllcy1kZW1vL2NvbG9yLXV0aWxpdGllcy1kZW1vLmNvbXBvbmVudCc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbG9yLWNvbnZlcnNpb24uc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb2xvci1leHRyYWN0b3IuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbG9yLWdyYWIuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbG9yLXBhbGxldHRlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGV4dC1jb2xvci5zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29sb3Itc2NoZW1lLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29sb3ItbGlnaHRlbi1kYXJrZW4uc2VydmljZSc7XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { NgModule, Injectable, inject, Component, EventEmitter, Directive, Output, HostListener } from '@angular/core';
2
+ import { Directive, Input, Injectable, inject, Component, EventEmitter, Output, HostListener, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import { MatButtonModule } from '@angular/material/button';
@@ -7,31 +7,188 @@ import * as i2 from '@angular/material/divider';
7
7
  import { MatDividerModule } from '@angular/material/divider';
8
8
  import { BehaviorSubject } from 'rxjs';
9
9
 
10
- class ColorUtilitiesModule {
11
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
12
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, declarations: [ColorUtilitiesDemoComponent], imports: [CommonModule,
13
- MatButtonModule,
14
- MatDividerModule], exports: [ColorUtilitiesDemoComponent] }); }
15
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, imports: [CommonModule,
16
- MatButtonModule,
17
- MatDividerModule] }); }
10
+ class ColorGrabberDirective {
11
+ constructor(el) {
12
+ this.el = el;
13
+ }
14
+ ngOnInit() {
15
+ const canvas = document.createElement('canvas');
16
+ canvas.width = 1;
17
+ canvas.height = 1;
18
+ this.ctx = canvas.getContext('2d');
19
+ const img = new Image();
20
+ img.src = this.imageUrl || '';
21
+ img.setAttribute('crossOrigin', '');
22
+ img.onload = () => {
23
+ this.ctx?.drawImage(img, 0, 0, 1, 1);
24
+ const imageData = this.ctx?.getImageData(0, 0, 1, 1);
25
+ if (imageData && imageData.data) {
26
+ const i = imageData.data;
27
+ const rgbColor = `rgba(${i[0]},${i[1]},${i[2]},${i[3]})`;
28
+ const hexColor = "#" + ((1 << 24) + (i[0] << 16) + (i[1] << 8) + i[2]).toString(16).slice(1);
29
+ const textColor = this.textColorBasedOnBgColor(hexColor, this.light, this.dark);
30
+ const hsv = this.RGB2HSV({ r: i[0], g: i[1], b: i[2] });
31
+ hsv.hue = this.HueShift(hsv.hue, 135.0);
32
+ const secondaryColor = this.HSV2RGB(hsv);
33
+ const highlightColor = this.lightenDarkenColor(secondaryColor.hex, 50);
34
+ this.el.nativeElement.style.backgroundColor = rgbColor;
35
+ this.el.nativeElement.style.color = textColor;
36
+ }
37
+ else {
38
+ console.error("Failed to get image data.");
39
+ }
40
+ };
41
+ }
42
+ textColorBasedOnBgColor(bgColor, lightColor = '#FFFFFF', darkColor = '#000000') {
43
+ const color = (bgColor.charAt(0) === '#') ? bgColor.substring(1, 7) : bgColor;
44
+ const r = parseInt(color.substring(0, 2), 16); // hexToR
45
+ const g = parseInt(color.substring(2, 4), 16); // hexToG
46
+ const b = parseInt(color.substring(4, 6), 16); // hexToB
47
+ const uicolors = [r / 255, g / 255, b / 255];
48
+ const c = uicolors.map((col) => {
49
+ if (col <= 0.03928)
50
+ return col / 12.92;
51
+ return Math.pow((col + 0.055) / 1.055, 2.4);
52
+ });
53
+ const L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2]);
54
+ return (L > 0.179) ? darkColor : lightColor;
55
+ }
56
+ RGB2HSV(rgb) {
57
+ const hsv = { saturation: 0, hue: 0, value: 0 };
58
+ const max = this.max3(rgb.r, rgb.g, rgb.b);
59
+ const dif = max - this.min3(rgb.r, rgb.g, rgb.b);
60
+ hsv.saturation = (max == 0.0) ? 0 : (100 * dif / max);
61
+ if (hsv.saturation == 0) {
62
+ hsv.hue = 0;
63
+ }
64
+ else if (rgb.r == max) {
65
+ hsv.hue = 60.0 * (rgb.g - rgb.b) / dif;
66
+ }
67
+ else if (rgb.g == max) {
68
+ hsv.hue = 120.0 + 60.0 * (rgb.b - rgb.r) / dif;
69
+ }
70
+ else if (rgb.b == max) {
71
+ hsv.hue = 240.0 + 60.0 * (rgb.r - rgb.g) / dif;
72
+ }
73
+ if (hsv.hue < 0.0)
74
+ hsv.hue += 360.0;
75
+ hsv.value = Math.round(max * 100 / 255);
76
+ hsv.hue = Math.round(hsv.hue);
77
+ hsv.saturation = Math.round(hsv.saturation);
78
+ return hsv;
79
+ }
80
+ HSV2RGB(hsv) {
81
+ const rgb = { r: 0, g: 0, b: 0 };
82
+ if (hsv.saturation == 0) {
83
+ rgb.r = rgb.g = rgb.b = Math.round(hsv.value * 2.55);
84
+ }
85
+ else {
86
+ hsv.hue /= 60;
87
+ hsv.saturation /= 100;
88
+ hsv.value /= 100;
89
+ const i = Math.floor(hsv.hue);
90
+ const f = hsv.hue - i;
91
+ const p = hsv.value * (1 - hsv.saturation);
92
+ const q = hsv.value * (1 - hsv.saturation * f);
93
+ const t = hsv.value * (1 - hsv.saturation * (1 - f));
94
+ switch (i) {
95
+ case 0:
96
+ rgb.r = hsv.value;
97
+ rgb.g = t;
98
+ rgb.b = p;
99
+ break;
100
+ case 1:
101
+ rgb.r = q;
102
+ rgb.g = hsv.value;
103
+ rgb.b = p;
104
+ break;
105
+ case 2:
106
+ rgb.r = p;
107
+ rgb.g = hsv.value;
108
+ rgb.b = t;
109
+ break;
110
+ case 3:
111
+ rgb.r = p;
112
+ rgb.g = q;
113
+ rgb.b = hsv.value;
114
+ break;
115
+ case 4:
116
+ rgb.r = t;
117
+ rgb.g = p;
118
+ rgb.b = hsv.value;
119
+ break;
120
+ default:
121
+ rgb.r = hsv.value;
122
+ rgb.g = p;
123
+ rgb.b = q;
124
+ }
125
+ rgb.r = Math.round(rgb.r * 255);
126
+ rgb.g = Math.round(rgb.g * 255);
127
+ rgb.b = Math.round(rgb.b * 255);
128
+ }
129
+ const rgbColor = `rgba(${rgb.r},${rgb.g},${rgb.b},${1})`;
130
+ const hexColor = "#" + ((1 << 24) + (rgb.r << 16) + (rgb.g << 8) + rgb.b).toString(16).slice(1);
131
+ return { rgb: rgbColor, hex: hexColor };
132
+ }
133
+ HueShift(h, s) {
134
+ h += s;
135
+ while (h >= 360.0)
136
+ h -= 360.0;
137
+ while (h < 0.0)
138
+ h += 360.0;
139
+ return h;
140
+ }
141
+ min3(a, b, c) {
142
+ return (a < b) ? ((a < c) ? a : c) : ((b < c) ? b : c);
143
+ }
144
+ max3(a, b, c) {
145
+ return (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
146
+ }
147
+ lightenDarkenColor(colorCode, amount) {
148
+ var usePound = false;
149
+ if (colorCode[0] == "#") {
150
+ colorCode = colorCode.slice(1);
151
+ usePound = true;
152
+ }
153
+ var num = parseInt(colorCode, 16);
154
+ var r = (num >> 16) + amount;
155
+ if (r > 255) {
156
+ r = 255;
157
+ }
158
+ else if (r < 0) {
159
+ r = 0;
160
+ }
161
+ var b = ((num >> 8) & 0x00FF) + amount;
162
+ if (b > 255) {
163
+ b = 255;
164
+ }
165
+ else if (b < 0) {
166
+ b = 0;
167
+ }
168
+ var g = (num & 0x0000FF) + amount;
169
+ if (g > 255) {
170
+ g = 255;
171
+ }
172
+ else if (g < 0) {
173
+ g = 0;
174
+ }
175
+ return (usePound ? "#" : "") + (g | (b << 8) | (r << 16)).toString(16);
176
+ }
177
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorGrabberDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
178
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ColorGrabberDirective, selector: "[colorGrabber]", inputs: { imageUrl: "imageUrl", light: "light", dark: "dark" }, ngImport: i0 }); }
18
179
  }
19
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, decorators: [{
20
- type: NgModule,
180
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorGrabberDirective, decorators: [{
181
+ type: Directive,
21
182
  args: [{
22
- imports: [
23
- CommonModule,
24
- MatButtonModule,
25
- MatDividerModule
26
- ],
27
- declarations: [
28
- ColorUtilitiesDemoComponent,
29
- ],
30
- exports: [
31
- ColorUtilitiesDemoComponent
32
- ]
183
+ selector: '[colorGrabber]'
33
184
  }]
34
- }] });
185
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { imageUrl: [{
186
+ type: Input
187
+ }], light: [{
188
+ type: Input
189
+ }], dark: [{
190
+ type: Input
191
+ }] } });
35
192
 
36
193
  class ColorConversionService {
37
194
  constructor() {
@@ -568,6 +725,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
568
725
  args: ['mouseleave']
569
726
  }] } });
570
727
 
728
+ class ColorUtilitiesModule {
729
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
730
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, declarations: [ColorUtilitiesDemoComponent,
731
+ ColorGrabberDirective,
732
+ ColorExtractorDirective], imports: [CommonModule,
733
+ MatButtonModule,
734
+ MatDividerModule], exports: [ColorUtilitiesDemoComponent] }); }
735
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, imports: [CommonModule,
736
+ MatButtonModule,
737
+ MatDividerModule] }); }
738
+ }
739
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorUtilitiesModule, decorators: [{
740
+ type: NgModule,
741
+ args: [{
742
+ imports: [
743
+ CommonModule,
744
+ MatButtonModule,
745
+ MatDividerModule
746
+ ],
747
+ declarations: [
748
+ ColorUtilitiesDemoComponent,
749
+ ColorGrabberDirective,
750
+ ColorExtractorDirective
751
+ ],
752
+ exports: [
753
+ ColorUtilitiesDemoComponent
754
+ ]
755
+ }]
756
+ }] });
757
+
571
758
  /*
572
759
  * Public API Surface of color-utils
573
760
  */
@@ -576,5 +763,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
576
763
  * Generated bundle index. Do not edit.
577
764
  */
578
765
 
579
- export { ColorConversionService, ColorExtractorDirective, ColorLightenDarkenService, ColorPalletteService, ColorSchemeService, ColorUtilitiesDemoComponent, ColorUtilitiesModule, TextColorService };
766
+ export { ColorConversionService, ColorExtractorDirective, ColorGrabberDirective, ColorLightenDarkenService, ColorPalletteService, ColorSchemeService, ColorUtilitiesDemoComponent, ColorUtilitiesModule, TextColorService };
580
767
  //# sourceMappingURL=color-util-helpers.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"color-util-helpers.mjs","sources":["../../../projects/color-utils/src/lib/color-utils.module.ts","../../../projects/color-utils/src/lib/color-conversion.service.ts","../../../projects/color-utils/src/lib/color-pallette.service.ts","../../../projects/color-utils/src/lib/text-color.service.ts","../../../projects/color-utils/src/lib/color-lighten-darken.service.ts","../../../projects/color-utils/src/lib/color-scheme.service.ts","../../../projects/color-utils/src/lib/color-utilities-demo/color-utilities-demo.component.ts","../../../projects/color-utils/src/lib/color-utilities-demo/color-utilities-demo.component.html","../../../projects/color-utils/src/lib/color-extractor.directive.ts","../../../projects/color-utils/src/public-api.ts","../../../projects/color-utils/src/color-util-helpers.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { ColorUtilitiesDemoComponent } from '../public-api';\nimport { MatDividerModule } from '@angular/material/divider';\n\n@NgModule({\n imports: [\n CommonModule,\n MatButtonModule,\n MatDividerModule\n ],\n declarations: [\n ColorUtilitiesDemoComponent,\n ],\n exports: [\n ColorUtilitiesDemoComponent\n ]\n})\nexport class ColorUtilitiesModule { }\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ColorConversionService {\r\n\r\n rgbToHex(rgb: number[] | null): string {\r\n if (rgb === null || rgb.length !== 3 || rgb.some(value => value < 0 || value > 255)) return '';\r\n\r\n const [r, g, b] = rgb;\r\n const hexR = this.componentToHex(r);\r\n const hexG = this.componentToHex(g);\r\n const hexB = this.componentToHex(b);\r\n return \"#\" + hexR + hexG + hexB;\r\n }\r\n\r\n private componentToHex = (c: number) => {\r\n const hex = c.toString(16);\r\n return hex.length === 1 ? \"0\" + hex : hex;\r\n }\r\n\r\n hexToRgb(hex: string | null | undefined): number[] {\r\n if (hex === null || hex === undefined) return [];\r\n\r\n hex = (hex.length === 3) ? hex + hex : hex;\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n\r\n return result ? [\r\n parseInt(result[1], 16),\r\n parseInt(result[2], 16),\r\n parseInt(result[3], 16)\r\n ] : [];\r\n }\r\n}\r\n","import { Injectable } from '@angular/core'\r\nimport { BehaviorSubject } from 'rxjs'\r\nimport { ColorConversionService } from './color-conversion.service'\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ColorPalletteService {\r\n\r\n // define image path\r\n // this.colorSelectionService.getColorsFromImage('../assets/sample2.jpg')\r\n\r\n // get colors\r\n // this.colorSelectionService.palette.subscribe(data => this.palette = data)\r\n\r\n // sample html\r\n // <div *ngFor=\"let color of palette\">\r\n // <div style=\"display: flex;\">\r\n // <div\r\n // class=\"box\"\r\n // [style.background-color]=\"color.color\"\r\n // >\r\n // Color\r\n // </div>\r\n // <div\r\n // class=\"box\"\r\n // [style.background-color]=\"color.complementaryColor\"\r\n // >\r\n // Complementary\r\n // </div>\r\n // </div>\r\n // </div>\r\n\r\n // CSS\r\n // .box {\r\n // width: 100px;\r\n // height: 100px;\r\n // border: solid thin black;\r\n // color: black;\r\n // margin: 4px;\r\n // padding: 16px;\r\n // display: flex;\r\n // flex-wrap: wrap;\r\n // align-content: center;\r\n // justify-content: center;\r\n // }\r\n\r\n private palette = new BehaviorSubject<{ color: string, complementaryColor: string }[]>([])\r\n palette$ = this.palette.asObservable()\r\n\r\n constructor(\r\n private colorConversionService: ColorConversionService\r\n ) { }\r\n\r\n /**\r\n * Retrieves a color palette from an image at the specified path.\r\n *\r\n * @param imagePath - The path to the image to extract the color palette from.\r\n * @param colors - The number of colors to include in the palette (default is 3).\r\n * @returns An observable that emits the generated color palette.\r\n */\r\n getColorsFromImage(imagePath: string, colors = 3) {\r\n const image = new Image();\r\n image.src = imagePath;\r\n\r\n image.onload = () => {\r\n const data = this.generateColorPalette(image, colors) || [];\r\n this.palette.next(data);\r\n };\r\n }\r\n\r\n /**\r\n * Generates a color palette from an image.\r\n *\r\n * @param image - The HTML image element to extract the color palette from.\r\n * @param colorCount - The number of colors to include in the palette (default is 6).\r\n * @returns An array of color objects, each with a hex color and a complementary hex color.\r\n */\r\n generateColorPalette(image: HTMLImageElement, colorCount = 6) {\r\n const canvas = document.createElement(\"canvas\");\r\n const context = canvas.getContext(\"2d\");\r\n\r\n if (!context) return;\r\n\r\n canvas.width = image.width;\r\n canvas.height = image.height;\r\n context.drawImage(image, 0, 0);\r\n\r\n // Get the image data\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n const pixels = imageData.data;\r\n const pixelCount = imageData.width * imageData.height;\r\n\r\n // Build an array of RGB colors\r\n const colors = [];\r\n for (let i = 0; i < pixelCount; i++) {\r\n const offset = i * 4;\r\n const r = pixels[offset];\r\n const g = pixels[offset + 1];\r\n const b = pixels[offset + 2];\r\n colors.push([r, g, b]);\r\n }\r\n\r\n // Apply color quantization using k-means clustering\r\n const quantizedColors = this.kMeansColorQuantization(colors, colorCount);\r\n\r\n // Order colors by luminance\r\n quantizedColors.sort((color1, color2) => {\r\n const luminance1 = this.getLuminance(color1);\r\n const luminance2 = this.getLuminance(color2);\r\n return luminance2 - luminance1;\r\n });\r\n\r\n const palette = quantizedColors.map((color) => {\r\n const complementaryColor = color.map((component) => 255 - component);\r\n const hexColor = this.colorConversionService.rgbToHex(color);\r\n const hexComplementaryColor =\r\n this.colorConversionService.rgbToHex(complementaryColor);\r\n return { color: hexColor, complementaryColor: hexComplementaryColor };\r\n });\r\n\r\n return palette;\r\n }\r\n\r\n private getLuminance(color: number[]) {\r\n const [r, g, b] = color\r\n return 0.299 * r + 0.587 * g + 0.114 * b\r\n }\r\n\r\n private calculateColorDistance(color1: number[], color2: number[]) {\r\n const [r1, g1, b1] = color1\r\n const [r2, g2, b2] = color2\r\n const dr = r2 - r1\r\n const dg = g2 - g1\r\n const db = b2 - b1\r\n return Math.sqrt(dr * dr + dg * dg + db * db)\r\n }\r\n\r\n private calculateMeanColor(colors: number[][]) {\r\n let sumR = 0\r\n let sumG = 0\r\n let sumB = 0\r\n for (let i = 0; i < colors.length; i++) {\r\n const [r, g, b] = colors[i]\r\n sumR += r\r\n sumG += g\r\n sumB += b\r\n }\r\n const meanR = Math.round(sumR / colors.length)\r\n const meanG = Math.round(sumG / colors.length)\r\n const meanB = Math.round(sumB / colors.length)\r\n return [meanR, meanG, meanB]\r\n }\r\n\r\n private kMeansColorQuantization(colors: number[][], k: number) {\r\n let clusterCenters = []\r\n for (let i = 0; i < k; i++) {\r\n const randomColor = colors[Math.floor(Math.random() * colors.length)]\r\n clusterCenters.push(randomColor)\r\n }\r\n\r\n let clusters = []\r\n for (let i = 0; i < colors.length; i++) {\r\n const color = colors[i]\r\n let minDistance = Infinity\r\n let nearestCenter = null\r\n for (let j = 0; j < clusterCenters.length; j++) {\r\n const center = clusterCenters[j]\r\n const distance = this.calculateColorDistance(color, center)\r\n if (distance < minDistance) {\r\n minDistance = distance\r\n nearestCenter = center\r\n }\r\n }\r\n clusters.push({ color, center: nearestCenter })\r\n }\r\n\r\n let updatedCenters = []\r\n for (let i = 0; i < clusterCenters.length; i++) {\r\n const center = clusterCenters[i]\r\n const clusterColors = clusters.filter(c => c.center === center).map(c => c.color)\r\n if (clusterColors.length > 0) {\r\n const updatedCenter = this.calculateMeanColor(clusterColors)\r\n updatedCenters.push(updatedCenter)\r\n }\r\n }\r\n\r\n return updatedCenters\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core'\r\nimport { ColorConversionService } from './color-conversion.service'\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TextColorService {\r\n\r\n constructor(\r\n private colorConversionService: ColorConversionService\r\n ) {}\r\n\r\n textColorForBgColor(bgColor: string, lightColor: string, darkColor: string) {\r\n\r\n const UIColors = this.fixColor(bgColor)\r\n\r\n const r = UIColors[0]\r\n const g = UIColors[1]\r\n const b = UIColors[2]\r\n\r\n return ((r*0.299 + g*0.587 + b*0.114) > 149) ? darkColor : lightColor;\r\n\r\n }\r\n\r\n darkerColor(color1: string, color2: string) {\r\n return this.isColorDarker(color1, color2) ? color1 : color2;\r\n }\r\n\r\n isColorDarker(color1: string, color2: string) {\r\n\r\n const newColor1 = this.fixColor(color1);\r\n const newColor2 = this.fixColor(color2);\r\n\r\n const luminance1 = this.calculateLuminance(newColor1[0], newColor1[1], newColor1[2]);\r\n const luminance2 = this.calculateLuminance(newColor2[0], newColor2[1], newColor2[2]);\r\n\r\n return luminance1 < luminance2;\r\n }\r\n\r\n\r\n lighterColor(color1: string, color2: string): string {\r\n return (this.isColorLighter(color1,color2)) ? color1 : color2;\r\n }\r\n\r\n isColorLighter(color1: string, color2: string) {\r\n\r\n const newColor1 = this.fixColor(color1);\r\n const newColor2 = this.fixColor(color2);\r\n\r\n const luminance1 = this.calculateLuminance(newColor1[0], newColor1[1], newColor1[2]);\r\n const luminance2 = this.calculateLuminance(newColor2[0], newColor2[1], newColor2[2]);\r\n\r\n return (luminance1 > luminance2)\r\n\r\n }\r\n\r\n calculateLuminance(r: number, g: number, b: number): number {\r\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\r\n }\r\n\r\n fixColor(color: string) {\r\n // Remove leading hash if present\r\n const sanitizedColor = color.startsWith('#') ? color.slice(1) : color;\r\n\r\n // Validate if the color is a valid hex (3 or 6 characters)\r\n if (!this.isValidHex(sanitizedColor)) {\r\n return this.parseRgb(sanitizedColor); // If not hex, attempt to parse as RGB\r\n }\r\n\r\n // Convert hex to RGB\r\n const rgb = this.hexToRgb(sanitizedColor);\r\n return rgb;\r\n }\r\n\r\n // Helper function to validate if a string is a valid 3 or 6 digit hex code\r\n isValidHex(color: string): boolean {\r\n const hexRegex = /^[A-Fa-f0-9]{3}$|^[A-Fa-f0-9]{6}$/i;\r\n return hexRegex.test(color);\r\n }\r\n\r\n // Helper function to convert a 3 or 6 digit hex color to RGB\r\n hexToRgb(hex: string): number[] {\r\n if (hex.length === 3) {\r\n hex = hex.split('').map(c => c + c).join(''); // Expand shorthand hex to full\r\n }\r\n\r\n return [\r\n parseInt(hex.slice(0, 2), 16),\r\n parseInt(hex.slice(2, 4), 16),\r\n parseInt(hex.slice(4, 6), 16),\r\n ];\r\n }\r\n\r\n // Helper function to parse an RGB string (e.g., rgb(255, 0, 0)) into an array\r\n parseRgb(rgb: string): number[] {\r\n const match = rgb.match(/\\d+/g);\r\n return match ? match.map(num => parseInt(num)) : [];\r\n }\r\n\r\n\r\n}\r\n","import { Injectable, inject } from '@angular/core';\nimport { TextColorService } from './text-color.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ColorLightenDarkenService {\n\n colors = inject(TextColorService)\n\n // const color = '#3498db'; // Your color\n // const lighterColor = lighten(color, 0.2); // 20% lighter\n // const darkerColor = darken(color, 0.2); // 20% darker\n\n // console.log(lighterColor, darkerColor);\n\nconstructor() { }\n\n lighten(color: string, amount: number) {\n\n const rgb = this.colors.fixColor(color)\n // const rgb = color.match(/\\w\\w/g)?.map((x) => parseInt(x, 16)) || [];\n\n // Convert RGB to HSL\n let [r, g, b] = rgb.map((c) => c / 255);\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h = 0,\n s = 0,\n l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n // Modify the lightness and clamp it to [0, 1]\n l = Math.min(1, l + amount);\n\n // Convert HSL back to RGB\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n // Convert RGB back to hexadecimal color\n const toHex = (x: number) =>\n Math.round(x * 255)\n .toString(16)\n .padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n }\n\n darken(color: string, amount: number) {\n return this.lighten(color, -amount);\n }\n\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ColorSchemeService {\n\n constructor() { }\n\n /**\n * Generates a random hexadecimal color code.\n *\n * 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.\n *\n * @returns A hexadecimal color code in the format \"#RRGGBB\".\n */\n generateRandomColor() {\n // Generate a random hue between 0 and 360 (representing degrees on the color wheel)\n const hue = Math.floor(Math.random() * 360);\n\n // Generate random saturation and lightness values between 50% and 100%\n const saturation = Math.floor(Math.random() * 51) + 50;\n const lightness = Math.floor(Math.random() * 51) + 50;\n\n // Convert HSL values to RGB values\n const rgbColor = this.hslToRgb(hue, saturation, lightness);\n\n // Convert RGB values to hexadecimal color code\n const hexColor = this.rgbToHex(rgbColor.r, rgbColor.g, rgbColor.b);\n\n return hexColor;\n }\n\n /**\n * Converts HSL (Hue, Saturation, Lightness) color values to RGB (Red, Green, Blue) color values.\n *\n * @param h - The hue value, ranging from 0 to 360 degrees.\n * @param s - The saturation value, ranging from 0 to 100 percent.\n * @param l - The lightness value, ranging from 0 to 100 percent.\n * @returns An object with the RGB color values, where each value is between 0 and 255.\n */\n hslToRgb(h: number, s: number, l: number) {\n h /= 360;\n s /= 100;\n l /= 100;\n\n let r, g, b;\n\n if (s === 0) {\n r = g = b = l; // Achromatic color (gray)\n } else {\n const hueToRgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n r = Math.round(hueToRgb(p, q, h + 1 / 3) * 255);\n g = Math.round(hueToRgb(p, q, h) * 255);\n b = Math.round(hueToRgb(p, q, h - 1 / 3) * 255);\n }\n\n return { r, g, b };\n }\n\n /**\n * Converts RGB color values to a hexadecimal color string.\n *\n * @param r - The red color value, between 0 and 255.\n * @param g - The green color value, between 0 and 255.\n * @param b - The blue color value, between 0 and 255.\n * @returns A hexadecimal color string in the format \"#RRGGBB\".\n */\n rgbToHex(r: number, g: number, b: number) {\n const componentToHex = (c: number) => {\n const hex = c.toString(16);\n return hex.length === 1 ? \"0\" + hex : hex;\n };\n\n return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b);\n }\n\n /**\n * Adjusts a hexadecimal color value by a given percentage.\n *\n * @param hexColor - The hexadecimal color value to adjust.\n * @param percentage - The percentage to adjust the color by, ranging from -100 to 100.\n * @returns The adjusted hexadecimal color value.\n */\n adjustHexColor(hexColor: string, percentage: number) {\n // Remove the \"#\" symbol if present\n hexColor = hexColor.replace(\"#\", \"\");\n\n // Convert the hex color to RGB values\n const red = parseInt(hexColor.substring(0, 2), 16);\n const green = parseInt(hexColor.substring(2, 4), 16);\n const blue = parseInt(hexColor.substring(4, 6), 16);\n\n // Calculate the adjustment amount based on the percentage\n const adjustAmount = Math.round(255 * (percentage / 100));\n\n // Adjust the RGB values\n const adjustedRed = this.clamp(red + adjustAmount);\n const adjustedGreen = this.clamp(green + adjustAmount);\n const adjustedBlue = this.clamp(blue + adjustAmount);\n\n // Convert the adjusted RGB values back to hex\n const adjustedHexColor = `#${(adjustedRed).toString(16).padStart(2, '0')}${(adjustedGreen).toString(16).padStart(2, '0')}${(adjustedBlue).toString(16).padStart(2, '0')}`;\n\n return adjustedHexColor;\n }\n\n clamp(value: number) {\n return Math.max(0, Math.min(value, 255));\n }\n\n}\n","import { Component, OnInit, inject } from '@angular/core';\n\nimport { ColorConversionService } from '../color-conversion.service';\nimport { ColorPalletteService } from '../color-pallette.service';\nimport { TextColorService } from '../text-color.service';\nimport { ColorLightenDarkenService } from '../color-lighten-darken.service';\nimport { ColorSchemeService } from '../color-scheme.service';\n\n@Component({\n selector: 'app-color-utilities-demo',\n templateUrl: './color-utilities-demo.component.html',\n styleUrls: ['./color-utilities-demo.component.css'],\n})\nexport class ColorUtilitiesDemoComponent implements OnInit {\n\n colorConversionService = inject(ColorConversionService)\n colorLightenDarkenService = inject(ColorLightenDarkenService)\n colorPalletteService = inject(ColorPalletteService)\n textColorService = inject(TextColorService)\n colorSchemeService = inject(ColorSchemeService)\n\n\n HEX = this.colorConversionService.rgbToHex([12, 56, 128])\n RGB = `rgb(${this.colorConversionService.hexToRgb('#AA11BB')})`\n\n\n lighten = this.colorLightenDarkenService.lighten('#AA11BB', .25)\n darken = this.colorLightenDarkenService.darken('#AA11BB', .25)\n\n colorIsDarker = this.textColorService.isColorDarker(this.lighten, this.darken)\n\n darkBk = this.textColorService.textColorForBgColor(this.HEX, this.lighten, this.darken)\n lightBk = this.textColorService.textColorForBgColor('whitesmoke', this.lighten, this.darken)\n\n palette: any\n colors$ = this.colorPalletteService.palette$\n\n colorPick = this.colorSchemeService.generateRandomColor()\n colorPickDarker = this.colorSchemeService.adjustHexColor(this.colorPick, -25)\n colorPickLighter = this.colorSchemeService.adjustHexColor(this.colorPick, 25)\n\n img: string|any\n\n constructor() { }\n\n ngOnInit() {\n\n // define image path\n this.img = '/assets/images/HD.png'\n this.colorPalletteService.getColorsFromImage(this.img, 8)\n\n\n }\n\n\n}\n\n","<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","import { Directive, ElementRef, Renderer2, HostListener, EventEmitter, Output } from '@angular/core';\n\n@Directive({\n selector: '[getColor]'\n})\nexport class ColorExtractorDirective {\n\n @Output() colorValue: EventEmitter<string> = new EventEmitter<string>();\n\n constructor(private elementRef: ElementRef, private renderer: Renderer2) {}\n\n get currentElement() {\n return window.getComputedStyle(this.elementRef.nativeElement);\n }\n\n @HostListener('mouseenter')\n onMouseEnter() {\n // console.log('ENTER', this.currentElement)\n this.colorValue.emit(this.currentElement.getPropertyValue('background-color'))\n }\n\n @HostListener('mouseleave')\n onMouseLeave() {\n // console.log('LEAVE', this.currentElement.getPropertyValue('background-color'))\n this.colorValue.emit('white')\n }\n\n}\n","/*\n * Public API Surface of color-utils\n */\n\nexport * from './lib/color-utils.module';\nexport * from './lib/color-utilities-demo/color-utilities-demo.component';\n\nexport * from './lib/color-conversion.service';\nexport * from './lib/color-extractor.directive';\nexport * from './lib/color-pallette.service';\nexport * from './lib/text-color.service';\n\nexport * from './lib/color-scheme.service';\nexport * from './lib/color-lighten-darken.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ColorConversionService"],"mappings":"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"}
1
+ {"version":3,"file":"color-util-helpers.mjs","sources":["../../../projects/color-utils/src/lib/color-grab.directive.ts","../../../projects/color-utils/src/lib/color-conversion.service.ts","../../../projects/color-utils/src/lib/color-pallette.service.ts","../../../projects/color-utils/src/lib/text-color.service.ts","../../../projects/color-utils/src/lib/color-lighten-darken.service.ts","../../../projects/color-utils/src/lib/color-scheme.service.ts","../../../projects/color-utils/src/lib/color-utilities-demo/color-utilities-demo.component.ts","../../../projects/color-utils/src/lib/color-utilities-demo/color-utilities-demo.component.html","../../../projects/color-utils/src/lib/color-extractor.directive.ts","../../../projects/color-utils/src/lib/color-utils.module.ts","../../../projects/color-utils/src/public-api.ts","../../../projects/color-utils/src/color-util-helpers.ts"],"sourcesContent":["import { Directive, ElementRef, Input, OnInit } from '@angular/core';\n\n@Directive({\n selector: '[colorGrabber]'\n})\nexport class ColorGrabberDirective implements OnInit {\n\n ctx?: CanvasRenderingContext2D\n\n @Input() imageUrl?: string\n @Input() light?: string\n @Input() dark?: string\n\n constructor(private el: ElementRef) { }\n\n ngOnInit() {\n\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n\n this.ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n\n const img = new Image();\n img.src = this.imageUrl || '';\n img.setAttribute('crossOrigin', '');\n\n img.onload = () => {\n this.ctx?.drawImage(img, 0, 0, 1, 1);\n const imageData = this.ctx?.getImageData(0, 0, 1, 1);\n\n if (imageData && imageData.data) {\n const i = imageData.data;\n\n const rgbColor = `rgba(${i[0]},${i[1]},${i[2]},${i[3]})`;\n const hexColor = \"#\" + ((1 << 24) + (i[0] << 16) + (i[1] << 8) + i[2]).toString(16).slice(1);\n\n const textColor = this.textColorBasedOnBgColor(hexColor, this.light, this.dark);\n\n const hsv = this.RGB2HSV({ r: i[0], g: i[1], b: i[2] });\n hsv.hue = this.HueShift(hsv.hue, 135.0);\n\n const secondaryColor = this.HSV2RGB(hsv);\n const highlightColor = this.lightenDarkenColor(secondaryColor.hex, 50);\n\n this.el.nativeElement.style.backgroundColor = rgbColor;\n this.el.nativeElement.style.color = textColor;\n } else {\n console.error(\"Failed to get image data.\");\n }\n };\n }\n\n textColorBasedOnBgColor(\n bgColor: string,\n lightColor: string = '#FFFFFF',\n darkColor: string = '#000000'\n ) {\n\n const color = (bgColor.charAt(0) === '#') ? bgColor.substring(1, 7) : bgColor\n\n const r = parseInt(color.substring(0, 2), 16) // hexToR\n const g = parseInt(color.substring(2, 4), 16) // hexToG\n const b = parseInt(color.substring(4, 6), 16) // hexToB\n\n const uicolors = [r / 255, g / 255, b / 255]\n\n const c = uicolors.map((col) => {\n\n if (col <= 0.03928) return col / 12.92\n return Math.pow((col + 0.055) / 1.055, 2.4)\n\n })\n\n const L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2])\n\n return (L > 0.179) ? darkColor : lightColor\n\n }\n\n RGB2HSV(rgb: { r: any, g: any, b: any}) {\n\n const hsv = { saturation:0, hue:0, value: 0 }\n\n const max = this.max3(rgb.r,rgb.g,rgb.b)\n const dif = max - this.min3(rgb.r,rgb.g,rgb.b)\n hsv.saturation = (max==0.0)?0:(100*dif/max)\n\n if (hsv.saturation == 0) {\n hsv.hue=0\n } else if (rgb.r == max) {\n hsv.hue=60.0*(rgb.g-rgb.b)/dif\n } else if (rgb.g == max) {\n hsv.hue=120.0+60.0*(rgb.b-rgb.r)/dif\n } else if (rgb.b == max) {\n hsv.hue=240.0+60.0*(rgb.r-rgb.g)/dif\n }\n\n if (hsv.hue<0.0) hsv.hue+=360.0\n\n hsv.value = Math.round(max*100/255)\n hsv.hue = Math.round(hsv.hue)\n hsv.saturation = Math.round(hsv.saturation)\n\n return hsv\n }\n\n HSV2RGB(hsv: any) {\n\n const rgb = { r: 0, g: 0, b: 0}\n\n if (hsv.saturation==0) {\n rgb.r = rgb.g = rgb.b = Math.round(hsv.value*2.55)\n } else {\n\n hsv.hue/=60\n hsv.saturation/=100\n hsv.value/=100\n const i = Math.floor(hsv.hue)\n const f = hsv.hue-i\n\n const p = hsv.value*(1-hsv.saturation)\n const q = hsv.value*(1-hsv.saturation*f)\n const t = hsv.value*(1-hsv.saturation*(1-f))\n\n switch(i) {\n\n case 0: rgb.r=hsv.value; rgb.g=t; rgb.b=p; break\n case 1: rgb.r=q; rgb.g=hsv.value; rgb.b=p; break\n case 2: rgb.r=p; rgb.g=hsv.value; rgb.b=t; break\n case 3: rgb.r=p; rgb.g=q; rgb.b=hsv.value; break\n case 4: rgb.r=t; rgb.g=p; rgb.b=hsv.value; break\n\n default: rgb.r=hsv.value; rgb.g=p; rgb.b=q\n\n }\n\n rgb.r = Math.round(rgb.r*255)\n rgb.g = Math.round(rgb.g*255)\n rgb.b = Math.round(rgb.b*255)\n\n }\n\n const rgbColor = `rgba(${rgb.r},${rgb.g},${rgb.b},${1})`\n const hexColor = \"#\" + ((1 << 24) + (rgb.r << 16) + (rgb.g << 8) + rgb.b).toString(16).slice(1)\n\n return { rgb: rgbColor, hex: hexColor }\n }\n\n HueShift(h: any, s: any) {\n h += s\n while (h>=360.0) h-=360.0\n while (h<0.0) h+=360.0\n return h\n }\n\n min3(a: any, b: any, c: any) {\n return (a<b)?((a<c)?a:c):((b<c)?b:c)\n }\n\n max3(a: any, b: any, c: any) {\n return (a>b)?((a>c)?a:c):((b>c)?b:c)\n }\n\n lightenDarkenColor(colorCode: any, amount: number) {\n\n var usePound = false;\n\n if (colorCode[0] == \"#\") {\n colorCode = colorCode.slice(1);\n usePound = true;\n }\n\n var num = parseInt(colorCode, 16);\n\n var r = (num >> 16) + amount;\n\n if (r > 255) {\n r = 255;\n } else if (r < 0) {\n r = 0;\n }\n\n var b = ((num >> 8) & 0x00FF) + amount;\n\n if (b > 255) {\n b = 255;\n } else if (b < 0) {\n b = 0;\n }\n\n var g = (num & 0x0000FF) + amount;\n\n if (g > 255) {\n g = 255;\n } else if (g < 0) {\n g = 0;\n }\n\n return (usePound ? \"#\" : \"\") + (g | (b << 8) | (r << 16)).toString(16)\n\n }\n\n}\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ColorConversionService {\r\n\r\n rgbToHex(rgb: number[] | null): string {\r\n if (rgb === null || rgb.length !== 3 || rgb.some(value => value < 0 || value > 255)) return '';\r\n\r\n const [r, g, b] = rgb;\r\n const hexR = this.componentToHex(r);\r\n const hexG = this.componentToHex(g);\r\n const hexB = this.componentToHex(b);\r\n return \"#\" + hexR + hexG + hexB;\r\n }\r\n\r\n private componentToHex = (c: number) => {\r\n const hex = c.toString(16);\r\n return hex.length === 1 ? \"0\" + hex : hex;\r\n }\r\n\r\n hexToRgb(hex: string | null | undefined): number[] {\r\n if (hex === null || hex === undefined) return [];\r\n\r\n hex = (hex.length === 3) ? hex + hex : hex;\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n\r\n return result ? [\r\n parseInt(result[1], 16),\r\n parseInt(result[2], 16),\r\n parseInt(result[3], 16)\r\n ] : [];\r\n }\r\n}\r\n","import { Injectable } from '@angular/core'\r\nimport { BehaviorSubject } from 'rxjs'\r\nimport { ColorConversionService } from './color-conversion.service'\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ColorPalletteService {\r\n\r\n // define image path\r\n // this.colorSelectionService.getColorsFromImage('../assets/sample2.jpg')\r\n\r\n // get colors\r\n // this.colorSelectionService.palette.subscribe(data => this.palette = data)\r\n\r\n // sample html\r\n // <div *ngFor=\"let color of palette\">\r\n // <div style=\"display: flex;\">\r\n // <div\r\n // class=\"box\"\r\n // [style.background-color]=\"color.color\"\r\n // >\r\n // Color\r\n // </div>\r\n // <div\r\n // class=\"box\"\r\n // [style.background-color]=\"color.complementaryColor\"\r\n // >\r\n // Complementary\r\n // </div>\r\n // </div>\r\n // </div>\r\n\r\n // CSS\r\n // .box {\r\n // width: 100px;\r\n // height: 100px;\r\n // border: solid thin black;\r\n // color: black;\r\n // margin: 4px;\r\n // padding: 16px;\r\n // display: flex;\r\n // flex-wrap: wrap;\r\n // align-content: center;\r\n // justify-content: center;\r\n // }\r\n\r\n private palette = new BehaviorSubject<{ color: string, complementaryColor: string }[]>([])\r\n palette$ = this.palette.asObservable()\r\n\r\n constructor(\r\n private colorConversionService: ColorConversionService\r\n ) { }\r\n\r\n /**\r\n * Retrieves a color palette from an image at the specified path.\r\n *\r\n * @param imagePath - The path to the image to extract the color palette from.\r\n * @param colors - The number of colors to include in the palette (default is 3).\r\n * @returns An observable that emits the generated color palette.\r\n */\r\n getColorsFromImage(imagePath: string, colors = 3) {\r\n const image = new Image();\r\n image.src = imagePath;\r\n\r\n image.onload = () => {\r\n const data = this.generateColorPalette(image, colors) || [];\r\n this.palette.next(data);\r\n };\r\n }\r\n\r\n /**\r\n * Generates a color palette from an image.\r\n *\r\n * @param image - The HTML image element to extract the color palette from.\r\n * @param colorCount - The number of colors to include in the palette (default is 6).\r\n * @returns An array of color objects, each with a hex color and a complementary hex color.\r\n */\r\n generateColorPalette(image: HTMLImageElement, colorCount = 6) {\r\n const canvas = document.createElement(\"canvas\");\r\n const context = canvas.getContext(\"2d\");\r\n\r\n if (!context) return;\r\n\r\n canvas.width = image.width;\r\n canvas.height = image.height;\r\n context.drawImage(image, 0, 0);\r\n\r\n // Get the image data\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n const pixels = imageData.data;\r\n const pixelCount = imageData.width * imageData.height;\r\n\r\n // Build an array of RGB colors\r\n const colors = [];\r\n for (let i = 0; i < pixelCount; i++) {\r\n const offset = i * 4;\r\n const r = pixels[offset];\r\n const g = pixels[offset + 1];\r\n const b = pixels[offset + 2];\r\n colors.push([r, g, b]);\r\n }\r\n\r\n // Apply color quantization using k-means clustering\r\n const quantizedColors = this.kMeansColorQuantization(colors, colorCount);\r\n\r\n // Order colors by luminance\r\n quantizedColors.sort((color1, color2) => {\r\n const luminance1 = this.getLuminance(color1);\r\n const luminance2 = this.getLuminance(color2);\r\n return luminance2 - luminance1;\r\n });\r\n\r\n const palette = quantizedColors.map((color) => {\r\n const complementaryColor = color.map((component) => 255 - component);\r\n const hexColor = this.colorConversionService.rgbToHex(color);\r\n const hexComplementaryColor =\r\n this.colorConversionService.rgbToHex(complementaryColor);\r\n return { color: hexColor, complementaryColor: hexComplementaryColor };\r\n });\r\n\r\n return palette;\r\n }\r\n\r\n private getLuminance(color: number[]) {\r\n const [r, g, b] = color\r\n return 0.299 * r + 0.587 * g + 0.114 * b\r\n }\r\n\r\n private calculateColorDistance(color1: number[], color2: number[]) {\r\n const [r1, g1, b1] = color1\r\n const [r2, g2, b2] = color2\r\n const dr = r2 - r1\r\n const dg = g2 - g1\r\n const db = b2 - b1\r\n return Math.sqrt(dr * dr + dg * dg + db * db)\r\n }\r\n\r\n private calculateMeanColor(colors: number[][]) {\r\n let sumR = 0\r\n let sumG = 0\r\n let sumB = 0\r\n for (let i = 0; i < colors.length; i++) {\r\n const [r, g, b] = colors[i]\r\n sumR += r\r\n sumG += g\r\n sumB += b\r\n }\r\n const meanR = Math.round(sumR / colors.length)\r\n const meanG = Math.round(sumG / colors.length)\r\n const meanB = Math.round(sumB / colors.length)\r\n return [meanR, meanG, meanB]\r\n }\r\n\r\n private kMeansColorQuantization(colors: number[][], k: number) {\r\n let clusterCenters = []\r\n for (let i = 0; i < k; i++) {\r\n const randomColor = colors[Math.floor(Math.random() * colors.length)]\r\n clusterCenters.push(randomColor)\r\n }\r\n\r\n let clusters = []\r\n for (let i = 0; i < colors.length; i++) {\r\n const color = colors[i]\r\n let minDistance = Infinity\r\n let nearestCenter = null\r\n for (let j = 0; j < clusterCenters.length; j++) {\r\n const center = clusterCenters[j]\r\n const distance = this.calculateColorDistance(color, center)\r\n if (distance < minDistance) {\r\n minDistance = distance\r\n nearestCenter = center\r\n }\r\n }\r\n clusters.push({ color, center: nearestCenter })\r\n }\r\n\r\n let updatedCenters = []\r\n for (let i = 0; i < clusterCenters.length; i++) {\r\n const center = clusterCenters[i]\r\n const clusterColors = clusters.filter(c => c.center === center).map(c => c.color)\r\n if (clusterColors.length > 0) {\r\n const updatedCenter = this.calculateMeanColor(clusterColors)\r\n updatedCenters.push(updatedCenter)\r\n }\r\n }\r\n\r\n return updatedCenters\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core'\r\nimport { ColorConversionService } from './color-conversion.service'\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TextColorService {\r\n\r\n constructor(\r\n private colorConversionService: ColorConversionService\r\n ) {}\r\n\r\n textColorForBgColor(bgColor: string, lightColor: string, darkColor: string) {\r\n\r\n const UIColors = this.fixColor(bgColor)\r\n\r\n const r = UIColors[0]\r\n const g = UIColors[1]\r\n const b = UIColors[2]\r\n\r\n return ((r*0.299 + g*0.587 + b*0.114) > 149) ? darkColor : lightColor;\r\n\r\n }\r\n\r\n darkerColor(color1: string, color2: string) {\r\n return this.isColorDarker(color1, color2) ? color1 : color2;\r\n }\r\n\r\n isColorDarker(color1: string, color2: string) {\r\n\r\n const newColor1 = this.fixColor(color1);\r\n const newColor2 = this.fixColor(color2);\r\n\r\n const luminance1 = this.calculateLuminance(newColor1[0], newColor1[1], newColor1[2]);\r\n const luminance2 = this.calculateLuminance(newColor2[0], newColor2[1], newColor2[2]);\r\n\r\n return luminance1 < luminance2;\r\n }\r\n\r\n\r\n lighterColor(color1: string, color2: string): string {\r\n return (this.isColorLighter(color1,color2)) ? color1 : color2;\r\n }\r\n\r\n isColorLighter(color1: string, color2: string) {\r\n\r\n const newColor1 = this.fixColor(color1);\r\n const newColor2 = this.fixColor(color2);\r\n\r\n const luminance1 = this.calculateLuminance(newColor1[0], newColor1[1], newColor1[2]);\r\n const luminance2 = this.calculateLuminance(newColor2[0], newColor2[1], newColor2[2]);\r\n\r\n return (luminance1 > luminance2)\r\n\r\n }\r\n\r\n calculateLuminance(r: number, g: number, b: number): number {\r\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\r\n }\r\n\r\n fixColor(color: string) {\r\n // Remove leading hash if present\r\n const sanitizedColor = color.startsWith('#') ? color.slice(1) : color;\r\n\r\n // Validate if the color is a valid hex (3 or 6 characters)\r\n if (!this.isValidHex(sanitizedColor)) {\r\n return this.parseRgb(sanitizedColor); // If not hex, attempt to parse as RGB\r\n }\r\n\r\n // Convert hex to RGB\r\n const rgb = this.hexToRgb(sanitizedColor);\r\n return rgb;\r\n }\r\n\r\n // Helper function to validate if a string is a valid 3 or 6 digit hex code\r\n isValidHex(color: string): boolean {\r\n const hexRegex = /^[A-Fa-f0-9]{3}$|^[A-Fa-f0-9]{6}$/i;\r\n return hexRegex.test(color);\r\n }\r\n\r\n // Helper function to convert a 3 or 6 digit hex color to RGB\r\n hexToRgb(hex: string): number[] {\r\n if (hex.length === 3) {\r\n hex = hex.split('').map(c => c + c).join(''); // Expand shorthand hex to full\r\n }\r\n\r\n return [\r\n parseInt(hex.slice(0, 2), 16),\r\n parseInt(hex.slice(2, 4), 16),\r\n parseInt(hex.slice(4, 6), 16),\r\n ];\r\n }\r\n\r\n // Helper function to parse an RGB string (e.g., rgb(255, 0, 0)) into an array\r\n parseRgb(rgb: string): number[] {\r\n const match = rgb.match(/\\d+/g);\r\n return match ? match.map(num => parseInt(num)) : [];\r\n }\r\n\r\n\r\n}\r\n","import { Injectable, inject } from '@angular/core';\nimport { TextColorService } from './text-color.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ColorLightenDarkenService {\n\n colors = inject(TextColorService)\n\n // const color = '#3498db'; // Your color\n // const lighterColor = lighten(color, 0.2); // 20% lighter\n // const darkerColor = darken(color, 0.2); // 20% darker\n\n // console.log(lighterColor, darkerColor);\n\nconstructor() { }\n\n lighten(color: string, amount: number) {\n\n const rgb = this.colors.fixColor(color)\n // const rgb = color.match(/\\w\\w/g)?.map((x) => parseInt(x, 16)) || [];\n\n // Convert RGB to HSL\n let [r, g, b] = rgb.map((c) => c / 255);\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h = 0,\n s = 0,\n l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n // Modify the lightness and clamp it to [0, 1]\n l = Math.min(1, l + amount);\n\n // Convert HSL back to RGB\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n // Convert RGB back to hexadecimal color\n const toHex = (x: number) =>\n Math.round(x * 255)\n .toString(16)\n .padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n }\n\n darken(color: string, amount: number) {\n return this.lighten(color, -amount);\n }\n\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ColorSchemeService {\n\n constructor() { }\n\n /**\n * Generates a random hexadecimal color code.\n *\n * 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.\n *\n * @returns A hexadecimal color code in the format \"#RRGGBB\".\n */\n generateRandomColor() {\n // Generate a random hue between 0 and 360 (representing degrees on the color wheel)\n const hue = Math.floor(Math.random() * 360);\n\n // Generate random saturation and lightness values between 50% and 100%\n const saturation = Math.floor(Math.random() * 51) + 50;\n const lightness = Math.floor(Math.random() * 51) + 50;\n\n // Convert HSL values to RGB values\n const rgbColor = this.hslToRgb(hue, saturation, lightness);\n\n // Convert RGB values to hexadecimal color code\n const hexColor = this.rgbToHex(rgbColor.r, rgbColor.g, rgbColor.b);\n\n return hexColor;\n }\n\n /**\n * Converts HSL (Hue, Saturation, Lightness) color values to RGB (Red, Green, Blue) color values.\n *\n * @param h - The hue value, ranging from 0 to 360 degrees.\n * @param s - The saturation value, ranging from 0 to 100 percent.\n * @param l - The lightness value, ranging from 0 to 100 percent.\n * @returns An object with the RGB color values, where each value is between 0 and 255.\n */\n hslToRgb(h: number, s: number, l: number) {\n h /= 360;\n s /= 100;\n l /= 100;\n\n let r, g, b;\n\n if (s === 0) {\n r = g = b = l; // Achromatic color (gray)\n } else {\n const hueToRgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n r = Math.round(hueToRgb(p, q, h + 1 / 3) * 255);\n g = Math.round(hueToRgb(p, q, h) * 255);\n b = Math.round(hueToRgb(p, q, h - 1 / 3) * 255);\n }\n\n return { r, g, b };\n }\n\n /**\n * Converts RGB color values to a hexadecimal color string.\n *\n * @param r - The red color value, between 0 and 255.\n * @param g - The green color value, between 0 and 255.\n * @param b - The blue color value, between 0 and 255.\n * @returns A hexadecimal color string in the format \"#RRGGBB\".\n */\n rgbToHex(r: number, g: number, b: number) {\n const componentToHex = (c: number) => {\n const hex = c.toString(16);\n return hex.length === 1 ? \"0\" + hex : hex;\n };\n\n return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b);\n }\n\n /**\n * Adjusts a hexadecimal color value by a given percentage.\n *\n * @param hexColor - The hexadecimal color value to adjust.\n * @param percentage - The percentage to adjust the color by, ranging from -100 to 100.\n * @returns The adjusted hexadecimal color value.\n */\n adjustHexColor(hexColor: string, percentage: number) {\n // Remove the \"#\" symbol if present\n hexColor = hexColor.replace(\"#\", \"\");\n\n // Convert the hex color to RGB values\n const red = parseInt(hexColor.substring(0, 2), 16);\n const green = parseInt(hexColor.substring(2, 4), 16);\n const blue = parseInt(hexColor.substring(4, 6), 16);\n\n // Calculate the adjustment amount based on the percentage\n const adjustAmount = Math.round(255 * (percentage / 100));\n\n // Adjust the RGB values\n const adjustedRed = this.clamp(red + adjustAmount);\n const adjustedGreen = this.clamp(green + adjustAmount);\n const adjustedBlue = this.clamp(blue + adjustAmount);\n\n // Convert the adjusted RGB values back to hex\n const adjustedHexColor = `#${(adjustedRed).toString(16).padStart(2, '0')}${(adjustedGreen).toString(16).padStart(2, '0')}${(adjustedBlue).toString(16).padStart(2, '0')}`;\n\n return adjustedHexColor;\n }\n\n clamp(value: number) {\n return Math.max(0, Math.min(value, 255));\n }\n\n}\n","import { Component, OnInit, inject } from '@angular/core';\n\nimport { ColorConversionService } from '../color-conversion.service';\nimport { ColorPalletteService } from '../color-pallette.service';\nimport { TextColorService } from '../text-color.service';\nimport { ColorLightenDarkenService } from '../color-lighten-darken.service';\nimport { ColorSchemeService } from '../color-scheme.service';\n\n@Component({\n selector: 'app-color-utilities-demo',\n templateUrl: './color-utilities-demo.component.html',\n styleUrls: ['./color-utilities-demo.component.css'],\n})\nexport class ColorUtilitiesDemoComponent implements OnInit {\n\n colorConversionService = inject(ColorConversionService)\n colorLightenDarkenService = inject(ColorLightenDarkenService)\n colorPalletteService = inject(ColorPalletteService)\n textColorService = inject(TextColorService)\n colorSchemeService = inject(ColorSchemeService)\n\n\n HEX = this.colorConversionService.rgbToHex([12, 56, 128])\n RGB = `rgb(${this.colorConversionService.hexToRgb('#AA11BB')})`\n\n\n lighten = this.colorLightenDarkenService.lighten('#AA11BB', .25)\n darken = this.colorLightenDarkenService.darken('#AA11BB', .25)\n\n colorIsDarker = this.textColorService.isColorDarker(this.lighten, this.darken)\n\n darkBk = this.textColorService.textColorForBgColor(this.HEX, this.lighten, this.darken)\n lightBk = this.textColorService.textColorForBgColor('whitesmoke', this.lighten, this.darken)\n\n palette: any\n colors$ = this.colorPalletteService.palette$\n\n colorPick = this.colorSchemeService.generateRandomColor()\n colorPickDarker = this.colorSchemeService.adjustHexColor(this.colorPick, -25)\n colorPickLighter = this.colorSchemeService.adjustHexColor(this.colorPick, 25)\n\n img: string|any\n\n constructor() { }\n\n ngOnInit() {\n\n // define image path\n this.img = '/assets/images/HD.png'\n this.colorPalletteService.getColorsFromImage(this.img, 8)\n\n\n }\n\n\n}\n\n","<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","import { Directive, ElementRef, Renderer2, HostListener, EventEmitter, Output } from '@angular/core';\n\n@Directive({\n selector: '[getColor]'\n})\nexport class ColorExtractorDirective {\n\n @Output() colorValue: EventEmitter<string> = new EventEmitter<string>();\n\n constructor(private elementRef: ElementRef, private renderer: Renderer2) {}\n\n get currentElement() {\n return window.getComputedStyle(this.elementRef.nativeElement);\n }\n\n @HostListener('mouseenter')\n onMouseEnter() {\n // console.log('ENTER', this.currentElement)\n this.colorValue.emit(this.currentElement.getPropertyValue('background-color'))\n }\n\n @HostListener('mouseleave')\n onMouseLeave() {\n // console.log('LEAVE', this.currentElement.getPropertyValue('background-color'))\n this.colorValue.emit('white')\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { ColorGrabberDirective } from './color-grab.directive';\n\nimport { ColorUtilitiesDemoComponent } from './color-utilities-demo/color-utilities-demo.component';\nimport { ColorExtractorDirective } from './color-extractor.directive';\n\n\n@NgModule({\n imports: [\n CommonModule,\n MatButtonModule,\n MatDividerModule\n ],\n declarations: [\n ColorUtilitiesDemoComponent,\n ColorGrabberDirective,\n ColorExtractorDirective\n ],\n exports: [\n ColorUtilitiesDemoComponent\n ]\n})\nexport class ColorUtilitiesModule { }\n","/*\n * Public API Surface of color-utils\n */\n\nexport * from './lib/color-utils.module';\nexport * from './lib/color-utilities-demo/color-utilities-demo.component';\n\nexport * from './lib/color-conversion.service';\nexport * from './lib/color-extractor.directive';\nexport * from './lib/color-grab.directive';\nexport * from './lib/color-pallette.service';\nexport * from './lib/text-color.service';\n\nexport * from './lib/color-scheme.service';\nexport * from './lib/color-lighten-darken.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ColorConversionService"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { ElementRef, OnInit } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class ColorGrabberDirective implements OnInit {
4
+ private el;
5
+ ctx?: CanvasRenderingContext2D;
6
+ imageUrl?: string;
7
+ light?: string;
8
+ dark?: string;
9
+ constructor(el: ElementRef);
10
+ ngOnInit(): void;
11
+ textColorBasedOnBgColor(bgColor: string, lightColor?: string, darkColor?: string): string;
12
+ RGB2HSV(rgb: {
13
+ r: any;
14
+ g: any;
15
+ b: any;
16
+ }): {
17
+ saturation: number;
18
+ hue: number;
19
+ value: number;
20
+ };
21
+ HSV2RGB(hsv: any): {
22
+ rgb: string;
23
+ hex: string;
24
+ };
25
+ HueShift(h: any, s: any): any;
26
+ min3(a: any, b: any, c: any): any;
27
+ max3(a: any, b: any, c: any): any;
28
+ lightenDarkenColor(colorCode: any, amount: number): string;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<ColorGrabberDirective, never>;
30
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ColorGrabberDirective, "[colorGrabber]", never, { "imageUrl": { "alias": "imageUrl"; "required": false; }; "light": { "alias": "light"; "required": false; }; "dark": { "alias": "dark"; "required": false; }; }, {}, never, never, false, never>;
31
+ }
@@ -1,10 +1,12 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import * as i1 from "./color-utilities-demo/color-utilities-demo.component";
3
- import * as i2 from "@angular/common";
4
- import * as i3 from "@angular/material/button";
5
- import * as i4 from "@angular/material/divider";
3
+ import * as i2 from "./color-grab.directive";
4
+ import * as i3 from "./color-extractor.directive";
5
+ import * as i4 from "@angular/common";
6
+ import * as i5 from "@angular/material/button";
7
+ import * as i6 from "@angular/material/divider";
6
8
  export declare class ColorUtilitiesModule {
7
9
  static ɵfac: i0.ɵɵFactoryDeclaration<ColorUtilitiesModule, never>;
8
- static ɵmod: i0.ɵɵNgModuleDeclaration<ColorUtilitiesModule, [typeof i1.ColorUtilitiesDemoComponent], [typeof i2.CommonModule, typeof i3.MatButtonModule, typeof i4.MatDividerModule], [typeof i1.ColorUtilitiesDemoComponent]>;
10
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ColorUtilitiesModule, [typeof i1.ColorUtilitiesDemoComponent, typeof i2.ColorGrabberDirective, typeof i3.ColorExtractorDirective], [typeof i4.CommonModule, typeof i5.MatButtonModule, typeof i6.MatDividerModule], [typeof i1.ColorUtilitiesDemoComponent]>;
9
11
  static ɵinj: i0.ɵɵInjectorDeclaration<ColorUtilitiesModule>;
10
12
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "color-util-helpers",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^15.2.0",
6
6
  "@angular/core": "^15.2.0"
package/public-api.d.ts CHANGED
@@ -2,6 +2,7 @@ export * from './lib/color-utils.module';
2
2
  export * from './lib/color-utilities-demo/color-utilities-demo.component';
3
3
  export * from './lib/color-conversion.service';
4
4
  export * from './lib/color-extractor.directive';
5
+ export * from './lib/color-grab.directive';
5
6
  export * from './lib/color-pallette.service';
6
7
  export * from './lib/text-color.service';
7
8
  export * from './lib/color-scheme.service';
Binary file