ngx-kit 1.0.0

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.
@@ -0,0 +1,1348 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Pipe, EventEmitter, Output, Input, Component, inject, forwardRef, ChangeDetectionStrategy, ElementRef, HostListener, Directive } from '@angular/core';
3
+ import * as i1 from '@angular/forms';
4
+ import { FormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
5
+ import * as i1$1 from '@angular/common';
6
+ import { CommonModule } from '@angular/common';
7
+ import * as i1$2 from 'ngx-input/shared';
8
+ import { SliderComponent, SaturationComponent, BrowserService } from 'ngx-input/shared';
9
+
10
+ var ColorFormats;
11
+ (function (ColorFormats) {
12
+ ColorFormats[ColorFormats["HEX"] = 0] = "HEX";
13
+ ColorFormats[ColorFormats["RGBA"] = 1] = "RGBA";
14
+ ColorFormats[ColorFormats["HSLA"] = 2] = "HSLA";
15
+ ColorFormats[ColorFormats["HSVA"] = 3] = "HSVA";
16
+ ColorFormats[ColorFormats["CMYK"] = 4] = "CMYK";
17
+ })(ColorFormats || (ColorFormats = {}));
18
+
19
+ function hexToRgb(hex) {
20
+ let h = hex.replace(/^#/, '');
21
+ if (h.length === 3)
22
+ h = h
23
+ .split('')
24
+ .map((x) => x + x)
25
+ .join('');
26
+ if (h.length === 6)
27
+ h += 'ff';
28
+ if (h.length === 8) {
29
+ const r = parseInt(h.slice(0, 2), 16);
30
+ const g = parseInt(h.slice(2, 4), 16);
31
+ const b = parseInt(h.slice(4, 6), 16);
32
+ const a = parseInt(h.slice(6, 8), 16) / 255;
33
+ return { r, g, b, a: a };
34
+ }
35
+ throw new Error('Invalid hex color');
36
+ }
37
+ function parseRgbString(str) {
38
+ const m = str.match(/rgba?\(([^)]+)\)/);
39
+ if (!m)
40
+ throw new Error('Invalid rgb string');
41
+ const parts = m[1].split(',').map((x) => +x.trim());
42
+ return {
43
+ r: parts[0],
44
+ g: parts[1],
45
+ b: parts[2],
46
+ a: parts[3] !== undefined ? parts[3] : 1,
47
+ };
48
+ }
49
+ function clamp(value, min, max) {
50
+ return Math.max(min, Math.min(max, value));
51
+ }
52
+ function parseHslString(str) {
53
+ const m = str.match(/hsla?\(([^)]+)\)/i);
54
+ if (!m)
55
+ throw new Error('Invalid hsl/hsla string');
56
+ const parts = m[1].split(',').map((x) => x.trim());
57
+ const h = clamp(parseFloat(parts[0]), 0, 360);
58
+ const s = clamp(parseFloat(parts[1]), 0, 100);
59
+ const l = clamp(parseFloat(parts[2]), 0, 100);
60
+ const a = parts[3] !== undefined ? clamp(parseFloat(parts[3]), 0, 1) : 1;
61
+ return { h, s, l, a };
62
+ }
63
+ function parseHsvString(str) {
64
+ const m = str.match(/hsva?\(([^)]+)\)/i);
65
+ if (!m)
66
+ throw new Error('Invalid hsv(a) string');
67
+ const parts = m[1].split(',').map((x) => x.trim());
68
+ const h = clamp(parseFloat(parts[0]), 0, 360);
69
+ const s = clamp(parseFloat(parts[1]), 0, 100);
70
+ const v = clamp(parseFloat(parts[2]), 0, 100);
71
+ const a = parts[3] !== undefined ? clamp(parseFloat(parts[3]), 0, 1) : 1;
72
+ return { h, s, v, a };
73
+ }
74
+ function parseCmykString(str) {
75
+ const m = str.match(/cmyk\(([^)]+)\)/i);
76
+ if (!m)
77
+ throw new Error('Invalid cmyk string');
78
+ const parts = m[1].split(',').map((x) => x.trim());
79
+ return {
80
+ c: clamp(parseFloat(parts[0]), 0, 100),
81
+ m: clamp(parseFloat(parts[1]), 0, 100),
82
+ y: clamp(parseFloat(parts[2]), 0, 100),
83
+ k: clamp(parseFloat(parts[3]), 0, 100),
84
+ };
85
+ }
86
+ /**
87
+ * Take input from [0, n] and return it as [0, 1]
88
+ * @hidden
89
+ */
90
+ function bound01(n, max) {
91
+ if (isOnePointZero(n)) {
92
+ n = '100%';
93
+ }
94
+ const isPercent = isPercentage(n);
95
+ n = max === 360 ? n : Math.min(max, Math.max(0, parseFloat(n)));
96
+ // Automatically convert percentage into number
97
+ if (isPercent) {
98
+ n = parseInt(String(n * max), 10) / 100;
99
+ }
100
+ // Handle floating point rounding errors
101
+ if (Math.abs(n - max) < 0.000001) {
102
+ return 1;
103
+ }
104
+ // Convert into [0, 1] range if it isn't already
105
+ if (max === 360) {
106
+ // If n is a hue given in degrees,
107
+ // wrap around out-of-range values into [0, 360] range
108
+ // then convert into [0, 1].
109
+ n = (n < 0 ? (n % max) + max : n % max) / parseFloat(String(max));
110
+ }
111
+ else {
112
+ // If n not a hue given in degrees
113
+ // Convert into [0, 1] range if it isn't already.
114
+ n = (n % max) / parseFloat(String(max));
115
+ }
116
+ return n;
117
+ }
118
+ /**
119
+ * Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
120
+ * <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
121
+ * @hidden
122
+ */
123
+ function isOnePointZero(n) {
124
+ return typeof n === 'string' && n.indexOf('.') !== -1 && parseFloat(n) === 1;
125
+ }
126
+ /**
127
+ * Check to see if string passed in is a percentage
128
+ * @hidden
129
+ */
130
+ function isPercentage(n) {
131
+ return typeof n === 'string' && n.indexOf('%') !== -1;
132
+ }
133
+ /**
134
+ * Replace a decimal with it's percentage value
135
+ * @hidden
136
+ */
137
+ function convertToPercentage(n) {
138
+ if (Number(n) <= 1) {
139
+ return `${Number(n) * 100}%`;
140
+ }
141
+ return n;
142
+ }
143
+ /**
144
+ * Force a hex value to have 2 characters
145
+ * @hidden
146
+ */
147
+ function pad2(c) {
148
+ return c.length === 1 ? '0' + c : String(c);
149
+ }
150
+ // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
151
+ // <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
152
+ /**
153
+ * Handle bounds / percentage checking to conform to CSS color spec
154
+ * <http://www.w3.org/TR/css3-color/>
155
+ * *Assumes:* r, g, b in [0, 255] or [0, 1]
156
+ * *Returns:* { r, g, b } in [0, 255]
157
+ */
158
+ function rgbToRgb(r, g, b) {
159
+ return {
160
+ r: bound01(r, 255) * 255,
161
+ g: bound01(g, 255) * 255,
162
+ b: bound01(b, 255) * 255,
163
+ };
164
+ }
165
+ /**
166
+ * Converts an RGB color value to HSL.
167
+ * *Assumes:* r, g, and b are contained in [0, 255]
168
+ * *Returns:* { h: 0-360, s: 0-100, l: 0-100 }
169
+ */
170
+ function rgbToHsl(r, g, b) {
171
+ r = r / 255;
172
+ g = g / 255;
173
+ b = b / 255;
174
+ const max = Math.max(r, g, b);
175
+ const min = Math.min(r, g, b);
176
+ let h = 0;
177
+ let s = 0;
178
+ const l = (max + min) / 2;
179
+ if (max === min) {
180
+ s = 0;
181
+ h = 0;
182
+ }
183
+ else {
184
+ const d = max - min;
185
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
186
+ switch (max) {
187
+ case r:
188
+ h = (g - b) / d + (g < b ? 6 : 0);
189
+ break;
190
+ case g:
191
+ h = (b - r) / d + 2;
192
+ break;
193
+ case b:
194
+ h = (r - g) / d + 4;
195
+ break;
196
+ }
197
+ h /= 6;
198
+ }
199
+ h = (h * 360) % 360;
200
+ if (h < 0)
201
+ h += 360;
202
+ return {
203
+ h: max === min ? 0 : h,
204
+ s: l === 0 || l === 1 ? 0 : s * 100,
205
+ l: l * 100,
206
+ };
207
+ }
208
+ /**
209
+ * Converts an HSL color value to RGB.
210
+ * *Assumes:* h in [0, 360], s and l in [0, 100]
211
+ * *Returns:* { r, g, b } in [0, 255]
212
+ */
213
+ function hslToRgba(h, s, l, a = 1) {
214
+ h = +h;
215
+ s = +s;
216
+ l = +l;
217
+ h = ((h % 360) + 360) % 360;
218
+ s = Math.max(0, Math.min(100, s));
219
+ l = Math.max(0, Math.min(100, l));
220
+ h = h / 360;
221
+ s = s / 100;
222
+ l = l / 100;
223
+ let r, g, b;
224
+ if (s === 0) {
225
+ r = g = b = l; // achromatic
226
+ }
227
+ else {
228
+ const hue2rgb = (p, q, t) => {
229
+ if (t < 0)
230
+ t += 1;
231
+ if (t > 1)
232
+ t -= 1;
233
+ if (t < 1 / 6)
234
+ return p + (q - p) * 6 * t;
235
+ if (t < 1 / 2)
236
+ return q;
237
+ if (t < 2 / 3)
238
+ return p + (q - p) * (2 / 3 - t) * 6;
239
+ return p;
240
+ };
241
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
242
+ const p = 2 * l - q;
243
+ r = hue2rgb(p, q, h + 1 / 3);
244
+ g = hue2rgb(p, q, h);
245
+ b = hue2rgb(p, q, h - 1 / 3);
246
+ }
247
+ return {
248
+ r: Math.round(r * 255),
249
+ g: Math.round(g * 255),
250
+ b: Math.round(b * 255),
251
+ a: Math.max(0, Math.min(1, a)),
252
+ };
253
+ }
254
+ /**
255
+ * Converts an RGB color value to HSV
256
+ * *Assumes:* r, g, and b are contained in [0, 255]
257
+ * *Returns:* { h: 0-360, s: 0-100, v: 0-100 }
258
+ */
259
+ function rgbToHsv(r, g, b) {
260
+ r = r / 255;
261
+ g = g / 255;
262
+ b = b / 255;
263
+ const max = Math.max(r, g, b);
264
+ const min = Math.min(r, g, b);
265
+ let h = 0;
266
+ let s = 0;
267
+ const v = max;
268
+ const d = max - min;
269
+ s = max === 0 ? 0 : d / max;
270
+ if (max === min) {
271
+ h = 0;
272
+ }
273
+ else {
274
+ switch (max) {
275
+ case r:
276
+ h = (g - b) / d + (g < b ? 6 : 0);
277
+ break;
278
+ case g:
279
+ h = (b - r) / d + 2;
280
+ break;
281
+ case b:
282
+ h = (r - g) / d + 4;
283
+ break;
284
+ }
285
+ h /= 6;
286
+ }
287
+ h = (h * 360) % 360;
288
+ if (h < 0)
289
+ h += 360;
290
+ return {
291
+ h: max === min ? 0 : h,
292
+ s: max === 0 ? 0 : s * 100,
293
+ v: v * 100,
294
+ };
295
+ }
296
+ /**
297
+ * Converts an HSV color value to RGB.
298
+ * *Assumes:* h in [0, 360], s and v in [0, 100]
299
+ * *Returns:* { r, g, b } in [0, 255]
300
+ */
301
+ function hsvToRgb(h, s, v) {
302
+ h = +h;
303
+ s = +s;
304
+ v = +v;
305
+ h = ((h % 360) + 360) % 360;
306
+ s = Math.max(0, Math.min(100, s));
307
+ v = Math.max(0, Math.min(100, v));
308
+ s = s / 100;
309
+ v = v / 100;
310
+ let r = 0, g = 0, b = 0;
311
+ const hi = Math.floor(h / 60) % 6;
312
+ const f = h / 60 - Math.floor(h / 60);
313
+ const p = v * (1 - s);
314
+ const q = v * (1 - f * s);
315
+ const t = v * (1 - (1 - f) * s);
316
+ switch (hi) {
317
+ case 0:
318
+ r = v;
319
+ g = t;
320
+ b = p;
321
+ break;
322
+ case 1:
323
+ r = q;
324
+ g = v;
325
+ b = p;
326
+ break;
327
+ case 2:
328
+ r = p;
329
+ g = v;
330
+ b = t;
331
+ break;
332
+ case 3:
333
+ r = p;
334
+ g = q;
335
+ b = v;
336
+ break;
337
+ case 4:
338
+ r = t;
339
+ g = p;
340
+ b = v;
341
+ break;
342
+ case 5:
343
+ r = v;
344
+ g = p;
345
+ b = q;
346
+ break;
347
+ }
348
+ return {
349
+ r: Math.max(0, Math.min(255, Math.round(r * 255))),
350
+ g: Math.max(0, Math.min(255, Math.round(g * 255))),
351
+ b: Math.max(0, Math.min(255, Math.round(b * 255))),
352
+ };
353
+ }
354
+ /**
355
+ * Converts an RGB/RGBA color to hex
356
+ */
357
+ function rgbaToHex(r, g, b, a = 1, allowAlpha = true, allow3Char = false) {
358
+ const toHex = (n) => n.toString(16).padStart(2, '0');
359
+ const rHex = toHex(Math.round(r));
360
+ const gHex = toHex(Math.round(g));
361
+ const bHex = toHex(Math.round(b));
362
+ const aHex = toHex(Math.round(a * 255));
363
+ // Try compressing to #rgb or #rgba if allowed and all characters are duplicated
364
+ if (allow3Char && (!allowAlpha || aHex === 'ff')) {
365
+ const canShorten = rHex[0] === rHex[1] && gHex[0] === gHex[1] && bHex[0] === bHex[1] && (!allowAlpha || aHex[0] === aHex[1]);
366
+ if (canShorten) {
367
+ return '#' + rHex[0] + gHex[0] + bHex[0] + (allowAlpha && aHex !== 'ff' ? aHex[0] : '');
368
+ }
369
+ }
370
+ return '#' + rHex + gHex + bHex + (allowAlpha && aHex !== 'ff' ? aHex : '');
371
+ }
372
+ /**
373
+ * Converts an RGBA color to an ARGB Hex8 string
374
+ * Rarely used, but required for "toFilter()"
375
+ *
376
+ * *Assumes:* r, g, b are contained in the set [0, 255] and a in [0, 1]
377
+ * *Returns:* a 8 character argb hex
378
+ */
379
+ function rgbaToArgbHex(r, g, b, a) {
380
+ const hex = [
381
+ pad2(convertDecimalToHex(a)),
382
+ pad2(Math.round(r).toString(16)),
383
+ pad2(Math.round(g).toString(16)),
384
+ pad2(Math.round(b).toString(16)),
385
+ ];
386
+ return hex.join('');
387
+ }
388
+ /**
389
+ * Converts CMYK to RBG
390
+ * Assumes c, m, y, k are in the set [0, 100]
391
+ */
392
+ function cmykToRgb(c, m, y, k) {
393
+ const cConv = c / 100;
394
+ const mConv = m / 100;
395
+ const yConv = y / 100;
396
+ const kConv = k / 100;
397
+ const r = 255 * (1 - cConv) * (1 - kConv);
398
+ const g = 255 * (1 - mConv) * (1 - kConv);
399
+ const b = 255 * (1 - yConv) * (1 - kConv);
400
+ return { r, g, b };
401
+ }
402
+ function rgbToCmyk(r, g, b) {
403
+ let c = 1 - r / 255;
404
+ let m = 1 - g / 255;
405
+ let y = 1 - b / 255;
406
+ let k = Math.min(c, m, y);
407
+ if (k === 1) {
408
+ c = 0;
409
+ m = 0;
410
+ y = 0;
411
+ }
412
+ else {
413
+ c = ((c - k) / (1 - k)) * 100;
414
+ m = ((m - k) / (1 - k)) * 100;
415
+ y = ((y - k) / (1 - k)) * 100;
416
+ }
417
+ k *= 100;
418
+ return {
419
+ c: Math.round(c),
420
+ m: Math.round(m),
421
+ y: Math.round(y),
422
+ k: Math.round(k),
423
+ };
424
+ }
425
+ /** Converts a decimal to a hex value */
426
+ function convertDecimalToHex(d) {
427
+ return Math.round(parseFloat(d) * 255).toString(16);
428
+ }
429
+ /** Converts a hex value to a decimal */
430
+ function convertHexToDecimal(h) {
431
+ return parseIntFromHex(h) / 255;
432
+ }
433
+ /** Parse a base-16 hex value into a base-10 integer */
434
+ function parseIntFromHex(val) {
435
+ return parseInt(val, 16);
436
+ }
437
+ function numberInputToObject(color) {
438
+ return {
439
+ r: color >> 16,
440
+ g: (color & 0xff00) >> 8,
441
+ b: color & 0xff,
442
+ };
443
+ }
444
+ function rgbToHslaString(r, g, b, a = 1) {
445
+ const { h, s, l } = rgbToHsl(r, g, b);
446
+ return `hsla(${Math.round(h)}, ${Math.round(s)}%, ${Math.round(l)}%, ${+a.toFixed(2)})`;
447
+ }
448
+ function rgbToHsvString(r, g, b, a = 1) {
449
+ const { h, s, v } = rgbToHsv(r, g, b);
450
+ return `hsva(${Math.round(h)}, ${Math.round(s)}%, ${Math.round(v)}%, ${+a.toFixed(2)})`;
451
+ }
452
+ function rgbToCmykString(r, g, b) {
453
+ const { c, m, y, k } = rgbToCmyk(r, g, b);
454
+ return `cmyk(${Math.round(c)}%, ${Math.round(m)}%, ${Math.round(y)}%, ${Math.round(k)}%)`;
455
+ }
456
+
457
+ // List of all CSS color names and their hex values (W3C + extended)
458
+ const colorNames = {
459
+ aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#00ffff', aquamarine: '#7fffd4', azure: '#f0ffff',
460
+ beige: '#f5f5dc', bisque: '#ffe4c4', black: '#000000', blanchedalmond: '#ffebcd', blue: '#0000ff',
461
+ blueviolet: '#8a2be2', brown: '#a52a2a', burlywood: '#deb887', cadetblue: '#5f9ea0', chartreuse: '#7fff00',
462
+ chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed', cornsilk: '#fff8dc', crimson: '#dc143c',
463
+ cyan: '#00ffff', darkblue: '#00008b', darkcyan: '#008b8b', darkgoldenrod: '#b8860b', darkgray: '#a9a9a9',
464
+ darkgreen: '#006400', darkgrey: '#a9a9a9', darkkhaki: '#bdb76b', darkmagenta: '#8b008b', darkolivegreen: '#556b2f',
465
+ darkorange: '#ff8c00', darkorchid: '#9932cc', darkred: '#8b0000', darksalmon: '#e9967a', darkseagreen: '#8fbc8f',
466
+ darkslateblue: '#483d8b', darkslategray: '#2f4f4f', darkslategrey: '#2f4f4f', darkturquoise: '#00ced1',
467
+ darkviolet: '#9400d3', deeppink: '#ff1493', deepskyblue: '#00bfff', dimgray: '#696969', dimgrey: '#696969',
468
+ dodgerblue: '#1e90ff', firebrick: '#b22222', floralwhite: '#fffaf0', forestgreen: '#228b22', fuchsia: '#ff00ff',
469
+ gainsboro: '#dcdcdc', ghostwhite: '#f8f8ff', gold: '#ffd700', goldenrod: '#daa520', gray: '#808080',
470
+ green: '#008000', greenyellow: '#adff2f', grey: '#808080', honeydew: '#f0fff0', hotpink: '#ff69b4',
471
+ indianred: '#cd5c5c', indigo: '#4b0082', ivory: '#fffff0', khaki: '#f0e68c', lavender: '#e6e6fa',
472
+ lavenderblush: '#fff0f5', lawngreen: '#7cfc00', lemonchiffon: '#fffacd', lightblue: '#add8e6', lightcoral: '#f08080',
473
+ lightcyan: '#e0ffff', lightgoldenrodyellow: '#fafad2', lightgray: '#d3d3d3', lightgreen: '#90ee90', lightgrey: '#d3d3d3',
474
+ lightpink: '#ffb6c1', lightsalmon: '#ffa07a', lightseagreen: '#20b2aa', lightskyblue: '#87cefa', lightslategray: '#778899',
475
+ lightslategrey: '#778899', lightsteelblue: '#b0c4de', lightyellow: '#ffffe0', lime: '#00ff00', limegreen: '#32cd32',
476
+ linen: '#faf0e6', magenta: '#ff00ff', maroon: '#800000', mediumaquamarine: '#66cdaa', mediumblue: '#0000cd',
477
+ mediumorchid: '#ba55d3', mediumpurple: '#9370db', mediumseagreen: '#3cb371', mediumslateblue: '#7b68ee',
478
+ mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc', mediumvioletred: '#c71585', midnightblue: '#191970',
479
+ mintcream: '#f5fffa', mistyrose: '#ffe4e1', moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080',
480
+ oldlace: '#fdf5e6', olive: '#808000', olivedrab: '#6b8e23', orange: '#ffa500', orangered: '#ff4500',
481
+ orchid: '#da70d6', palegoldenrod: '#eee8aa', palegreen: '#98fb98', paleturquoise: '#afeeee', palevioletred: '#db7093',
482
+ papayawhip: '#ffefd5', peachpuff: '#ffdab9', peru: '#cd853f', pink: '#ffc0cb', plum: '#dda0dd', powderblue: '#b0e0e6',
483
+ purple: '#800080', rebeccapurple: '#663399', red: '#ff0000', rosybrown: '#bc8f8f', royalblue: '#4169e1',
484
+ saddlebrown: '#8b4513', salmon: '#fa8072', sandybrown: '#f4a460', seagreen: '#2e8b57', seashell: '#fff5ee',
485
+ sienna: '#a0522d', silver: '#c0c0c0', skyblue: '#87ceeb', slateblue: '#6a5acd', slategray: '#708090',
486
+ slategrey: '#708090', snow: '#fffafa', springgreen: '#00ff7f', steelblue: '#4682b4', tan: '#d2b48c',
487
+ teal: '#008080', thistle: '#d8bfd8', tomato: '#ff6347', turquoise: '#40e0d0', violet: '#ee82ee', wheat: '#f5deb3',
488
+ white: '#ffffff', whitesmoke: '#f5f5f5', yellow: '#ffff00', yellowgreen: '#9acd32'
489
+ };
490
+
491
+ class NgxColor {
492
+ _rgb = { r: 0, g: 0, b: 0, a: 1 };
493
+ _name = '';
494
+ constructor(input) {
495
+ if (!input)
496
+ return;
497
+ if (input instanceof NgxColor) {
498
+ this._rgb = { ...input._rgb };
499
+ this._name = input._name;
500
+ return;
501
+ }
502
+ if (typeof input === 'object') {
503
+ if ('r' in input && 'g' in input && 'b' in input) {
504
+ this._rgb = { r: +input.r, g: +input.g, b: +input.b, a: input.a !== undefined ? +input.a : 1 };
505
+ return;
506
+ }
507
+ if ('h' in input && 's' in input && 'l' in input) {
508
+ this._rgb = NgxColor.hslaToRgba(input);
509
+ return;
510
+ }
511
+ if ('h' in input && 's' in input && 'v' in input) {
512
+ this._rgb = NgxColor.hsvaToRgba(input);
513
+ return;
514
+ }
515
+ if ('c' in input && 'm' in input && 'y' in input && 'k' in input) {
516
+ this._rgb = NgxColor.cmykToRgba(input);
517
+ return;
518
+ }
519
+ }
520
+ if (typeof input === 'string') {
521
+ const name = input.trim().toLowerCase();
522
+ if (colorNames[name]) {
523
+ this._rgb = hexToRgb(colorNames[name]);
524
+ this._name = name;
525
+ return;
526
+ }
527
+ else if (/^#?[0-9a-f]{3,8}$/i.test(name)) {
528
+ this._rgb = hexToRgb(name);
529
+ return;
530
+ }
531
+ if (name.includes('rgb')) {
532
+ this._rgb = parseRgbString(name);
533
+ return;
534
+ }
535
+ if (name.includes('hsl')) {
536
+ this._rgb = NgxColor.hslaToRgba(parseHslString(name));
537
+ return;
538
+ }
539
+ if (name.includes('hsv')) {
540
+ this._rgb = NgxColor.hsvaToRgba(parseHsvString(name));
541
+ return;
542
+ }
543
+ if (name.includes('cmyk')) {
544
+ this._rgb = NgxColor.cmykToRgba(parseCmykString(name));
545
+ return;
546
+ }
547
+ throw new Error('Unknown color string: ' + input);
548
+ }
549
+ }
550
+ get isValid() {
551
+ return (typeof this._rgb.r === 'number' &&
552
+ typeof this._rgb.g === 'number' &&
553
+ typeof this._rgb.b === 'number' &&
554
+ !isNaN(this._rgb.r) &&
555
+ !isNaN(this._rgb.g) &&
556
+ !isNaN(this._rgb.b));
557
+ }
558
+ async name() {
559
+ if (this._name)
560
+ return this._name;
561
+ const hex = this.toHexString();
562
+ for (const [n, h] of Object.entries(colorNames)) {
563
+ if (h.toLowerCase() === hex.toLowerCase())
564
+ return n;
565
+ }
566
+ return '';
567
+ }
568
+ toRgb() {
569
+ return this._rgb;
570
+ }
571
+ toRgbString() {
572
+ const { r, g, b, a } = this.toRgb();
573
+ return a === 1
574
+ ? `rgb(${Math.round(r)},${Math.round(g)},${Math.round(b)})`
575
+ : `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${+a.toFixed(3)})`;
576
+ }
577
+ toHexString(allowAlpha = true) {
578
+ const { r, g, b, a } = this.toRgb();
579
+ return rgbaToHex(r, g, b, a, allowAlpha && a < 1);
580
+ }
581
+ toHsl() {
582
+ return NgxColor.rgbToHsla(this.toRgb());
583
+ }
584
+ toHsv() {
585
+ return NgxColor.rgbToHsva(this.toRgb());
586
+ }
587
+ toCmyk() {
588
+ return NgxColor.rgbToCmyk(this.toRgb());
589
+ }
590
+ static cmykToRgba(cmyk) {
591
+ const { c, m, y, k } = cmyk;
592
+ return { ...cmykToRgb(c, m, y, k), a: cmyk.a !== undefined ? +cmyk.a : 1 };
593
+ }
594
+ static rgbToCmyk(rgba) {
595
+ const { r, g, b } = rgba;
596
+ return rgbToCmyk(r, g, b);
597
+ }
598
+ static rgbToHsla(rgba) {
599
+ const { r, g, b, a } = rgba;
600
+ return { ...rgbToHsl(r, g, b), a };
601
+ }
602
+ static rgbToHsva(rgba) {
603
+ const { r, g, b, a } = rgba;
604
+ return { ...rgbToHsv(r, g, b), a };
605
+ }
606
+ static hsvaToRgba(hsva) {
607
+ const { h, s, v, a } = hsva;
608
+ return { ...hsvToRgb(h, s, v), a: a !== undefined ? a : 1 };
609
+ }
610
+ static hslaToRgba(hsla) {
611
+ const { h, s, l, a } = hsla;
612
+ return { ...hslToRgba(h, s, l), a: a !== undefined ? a : 1 };
613
+ }
614
+ equals(other) {
615
+ if (!other)
616
+ return false;
617
+ return this.toHexString().toLowerCase() === other.toHexString().toLowerCase();
618
+ }
619
+ isDark() {
620
+ const { r, g, b, a } = this.toRgb();
621
+ return a < 0.5 ? false : 0.299 * r + 0.587 * g + 0.114 * b < 128;
622
+ }
623
+ isLight() {
624
+ return !this.isDark();
625
+ }
626
+ async getOutputResult(outputType) {
627
+ const { r, g, b, a } = this._rgb;
628
+ switch (outputType) {
629
+ case 'CMYK':
630
+ return rgbToCmykString(r, g, b);
631
+ case 'HSL':
632
+ return rgbToHslaString(r, g, b, a);
633
+ case 'HSV':
634
+ return rgbToHsvString(r, g, b, a);
635
+ case 'RGB':
636
+ return a < 1 ? `rgba(${r}, ${g}, ${b}, ${+a.toFixed(2)})` : `rgb(${r}, ${g}, ${b})`;
637
+ case 'HEX':
638
+ return this.toHexString(true);
639
+ default:
640
+ let name = await this.name();
641
+ return name ?? this.toHexString(true);
642
+ }
643
+ }
644
+ removeAlphaChannel() {
645
+ this._rgb.a = 1;
646
+ }
647
+ }
648
+
649
+ var ColorInspector;
650
+ (function (ColorInspector) {
651
+ ColorInspector[ColorInspector["Picker"] = 0] = "Picker";
652
+ ColorInspector[ColorInspector["RGB"] = 1] = "RGB";
653
+ ColorInspector[ColorInspector["HSL"] = 2] = "HSL";
654
+ ColorInspector[ColorInspector["CMYK"] = 3] = "CMYK";
655
+ })(ColorInspector || (ColorInspector = {}));
656
+
657
+ class EnumToArrayPipe {
658
+ /**
659
+ * when data enum like:
660
+ * A=1,
661
+ * B=2,
662
+ * C=3
663
+ */
664
+ transform(data) {
665
+ // The list should be sorted due to the existence of negative ENUMs
666
+ const keys = Object.keys(data).sort();
667
+ // return key of enum => men,women,...
668
+ // return keys.slice(keys.length / 2);
669
+ // return value of enum => 0,1,2,3
670
+ return keys.slice(0, keys.length / 2);
671
+ }
672
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EnumToArrayPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
673
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.4", ngImport: i0, type: EnumToArrayPipe, isStandalone: true, name: "enumToArray" });
674
+ }
675
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EnumToArrayPipe, decorators: [{
676
+ type: Pipe,
677
+ args: [{ standalone: true, name: 'enumToArray' }]
678
+ }] });
679
+ class EnumToArrayStringValuePipe {
680
+ /**
681
+ * when data enum like:
682
+ * A='A',
683
+ * B='B',
684
+ * C='C'
685
+ */
686
+ transform(data, sort = true) {
687
+ let keys = Object.keys(data);
688
+ if (sort)
689
+ keys = keys.sort();
690
+ return keys;
691
+ }
692
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EnumToArrayStringValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
693
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.4", ngImport: i0, type: EnumToArrayStringValuePipe, isStandalone: true, name: "enumToArrayStringValue" });
694
+ }
695
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EnumToArrayStringValuePipe, decorators: [{
696
+ type: Pipe,
697
+ args: [{ standalone: true, name: 'enumToArrayStringValue' }]
698
+ }] });
699
+
700
+ class PickerComponent {
701
+ hue = 300;
702
+ baseColor = 'rgb(0,0,0)';
703
+ alphaBgColor = '#000';
704
+ board = { x: 1, y: 0 };
705
+ alpha = 1;
706
+ inputColor;
707
+ simpleMode = false;
708
+ set color(c) {
709
+ if (c.equals(this.inputColor))
710
+ return;
711
+ this.inputColor = c;
712
+ const shva = c.toHsv();
713
+ this.hue = shva.h;
714
+ this.board = { x: shva.s, y: 100 - shva.v };
715
+ this.alpha = shva.a ?? 1;
716
+ const pureColor = new NgxColor({ h: this.hue, s: 100, v: 100, a: 1 });
717
+ this.baseColor = pureColor.toHexString(false);
718
+ this.alphaBgColor = this.inputColor.toHexString(false);
719
+ }
720
+ useAlphaChannel = true;
721
+ colorChange = new EventEmitter();
722
+ constructor() { }
723
+ ngOnInit() { }
724
+ generateColor() {
725
+ try {
726
+ const hsva = { h: this.hue, s: this.board.x, v: 100 - this.board.y, a: this.alpha };
727
+ const color = new NgxColor(hsva);
728
+ const pureColor = new NgxColor({ h: this.hue, s: 100, v: 100, a: 1 });
729
+ this.baseColor = pureColor.toHexString(false);
730
+ this.alphaBgColor = color.toHexString(false);
731
+ if (color.equals(this.inputColor) == false) {
732
+ this.inputColor = color;
733
+ this.colorChange.emit(color);
734
+ }
735
+ }
736
+ catch (error) {
737
+ this.colorChange.emit(undefined);
738
+ }
739
+ }
740
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: PickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
741
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: PickerComponent, isStandalone: true, selector: "app-picker", inputs: { simpleMode: "simpleMode", color: "color", useAlphaChannel: "useAlphaChannel" }, outputs: { colorChange: "colorChange" }, ngImport: i0, template: "<saturation\r\n [height]=\"simpleMode ? 150 : 160\"\r\n [(ngModel)]=\"board\"\r\n name=\"board\"\r\n [min]=\"{ x: 0, y: 0 }\"\r\n [max]=\"{ x: 100, y: 100 }\"\r\n [step]=\"1\"\r\n [color]=\"baseColor\"\r\n (change)=\"generateColor()\"></saturation>\r\n<slider\r\n [(ngModel)]=\"hue\"\r\n name=\"hue\"\r\n [min]=\"0\"\r\n [max]=\"360\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n background=\"linear-gradient(to right,red 0%,#ff0 17%,lime 33%,cyan 50%,blue 66%,#f0f 83%,red 100%)\"></slider>\r\n@if (useAlphaChannel) {\r\n <slider\r\n [(ngModel)]=\"alpha\"\r\n name=\"alpha\"\r\n [min]=\"0\"\r\n [max]=\"1\"\r\n [step]=\"0.1\"\r\n (change)=\"generateColor()\"\r\n [isBgTransparent]=\"true\"\r\n [background]=\"'linear-gradient(to right,transparent,' + alphaBgColor + ')'\"></slider>\r\n}\r\n", styles: [".color-sliders{display:flex;gap:5px}.color-sliders .sliders{flex:1}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SliderComponent, selector: "slider", inputs: ["step", "min", "max", "background", "isBgTransparent"], outputs: ["change"] }, { kind: "component", type: SaturationComponent, selector: "saturation", inputs: ["width", "height", "color", "step", "min", "max"], outputs: ["change"] }] });
742
+ }
743
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: PickerComponent, decorators: [{
744
+ type: Component,
745
+ args: [{ selector: 'app-picker', imports: [FormsModule, SliderComponent, SaturationComponent], template: "<saturation\r\n [height]=\"simpleMode ? 150 : 160\"\r\n [(ngModel)]=\"board\"\r\n name=\"board\"\r\n [min]=\"{ x: 0, y: 0 }\"\r\n [max]=\"{ x: 100, y: 100 }\"\r\n [step]=\"1\"\r\n [color]=\"baseColor\"\r\n (change)=\"generateColor()\"></saturation>\r\n<slider\r\n [(ngModel)]=\"hue\"\r\n name=\"hue\"\r\n [min]=\"0\"\r\n [max]=\"360\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n background=\"linear-gradient(to right,red 0%,#ff0 17%,lime 33%,cyan 50%,blue 66%,#f0f 83%,red 100%)\"></slider>\r\n@if (useAlphaChannel) {\r\n <slider\r\n [(ngModel)]=\"alpha\"\r\n name=\"alpha\"\r\n [min]=\"0\"\r\n [max]=\"1\"\r\n [step]=\"0.1\"\r\n (change)=\"generateColor()\"\r\n [isBgTransparent]=\"true\"\r\n [background]=\"'linear-gradient(to right,transparent,' + alphaBgColor + ')'\"></slider>\r\n}\r\n", styles: [".color-sliders{display:flex;gap:5px}.color-sliders .sliders{flex:1}\n"] }]
746
+ }], ctorParameters: () => [], propDecorators: { simpleMode: [{
747
+ type: Input
748
+ }], color: [{
749
+ type: Input
750
+ }], useAlphaChannel: [{
751
+ type: Input
752
+ }], colorChange: [{
753
+ type: Output
754
+ }] } });
755
+
756
+ class CmykComponent {
757
+ cyanSliderBackground = '';
758
+ magentaSliderBackground = '';
759
+ yellowSliderBackground = '';
760
+ keySliderBackground = '';
761
+ cyan = 0;
762
+ magenta = 0;
763
+ yellow = 0;
764
+ key = 0;
765
+ inputColor;
766
+ set color(c) {
767
+ if (c.equals(this.inputColor))
768
+ return;
769
+ this.inputColor = c;
770
+ const cmyk = c.toCmyk();
771
+ this.cyan = cmyk.c;
772
+ this.magenta = cmyk.m;
773
+ this.yellow = cmyk.y;
774
+ this.key = cmyk.k;
775
+ this.updateSliderBackgrounds(cmyk);
776
+ }
777
+ colorChange = new EventEmitter();
778
+ constructor() { }
779
+ ngOnInit() { }
780
+ generateColor() {
781
+ try {
782
+ const cmyk = { c: this.cyan, m: this.magenta, y: this.yellow, k: this.key };
783
+ const color = new NgxColor(cmyk);
784
+ this.updateSliderBackgrounds(cmyk);
785
+ if (color.equals(this.inputColor) == false) {
786
+ this.inputColor = color;
787
+ this.colorChange.emit(color);
788
+ }
789
+ }
790
+ catch (error) {
791
+ this.colorChange.emit(undefined);
792
+ }
793
+ }
794
+ updateSliderBackgrounds(cmyk) {
795
+ this.cyanSliderBackground = this.getChannelGradient('c', cmyk);
796
+ this.magentaSliderBackground = this.getChannelGradient('m', cmyk);
797
+ this.yellowSliderBackground = this.getChannelGradient('y', cmyk);
798
+ this.keySliderBackground = this.getChannelGradient('k', cmyk);
799
+ }
800
+ getChannelGradient(channel, cmyk) {
801
+ let baseColor = this.cloneColor(cmyk);
802
+ baseColor[channel] = channel == 'k' ? 1 : 0;
803
+ let startColor = NgxColor.cmykToRgba(baseColor);
804
+ let s = `rgb(${startColor.r}, ${startColor.g}, ${startColor.b})`;
805
+ baseColor[channel] = 100;
806
+ let endColor = NgxColor.cmykToRgba(baseColor);
807
+ let e = `rgb(${endColor.r}, ${endColor.g}, ${endColor.b})`;
808
+ return `linear-gradient(to right, ${s},${e})`;
809
+ }
810
+ isCmykEqual(a, b) {
811
+ if (!a || !b)
812
+ return false;
813
+ return a.c === b.c && a.m === b.m && a.y === b.y && a.k === b.k;
814
+ }
815
+ cloneColor(cmyk) {
816
+ return JSON.parse(JSON.stringify(cmyk));
817
+ // return Object.assign({}, cmyk);
818
+ }
819
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: CmykComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
820
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: CmykComponent, isStandalone: true, selector: "app-cmyk", inputs: { color: "color" }, outputs: { colorChange: "colorChange" }, ngImport: i0, template: "<slider\r\n [(ngModel)]=\"cyan\"\r\n name=\"cyan\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"cyanSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Cyan</span>\r\n <input type=\"number\" [(ngModel)]=\"cyan\" name=\"inputCyan\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"magenta\"\r\n name=\"magenta\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"magentaSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Magenta</span>\r\n <input type=\"number\" [(ngModel)]=\"magenta\" name=\"inputMagenta\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"yellow\"\r\n name=\"yellow\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"yellowSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Yellow</span>\r\n <input type=\"number\" [(ngModel)]=\"yellow\" name=\"inputYellow\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"key\"\r\n name=\"key\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"keySliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Key</span>\r\n <input type=\"number\" [(ngModel)]=\"key\" name=\"inputKey\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n", styles: [".slider-title{display:flex;align-items:center;justify-content:space-between}.slider-title input{transition:box-shadow .1s;box-shadow:inset #d8d8da 0 0 0 1px,inset #fff 0 0 0 100px;border:none;width:40px;color:#000;font-family:Inter,sans-serif;padding:5px 6px;border-radius:5px;font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SliderComponent, selector: "slider", inputs: ["step", "min", "max", "background", "isBgTransparent"], outputs: ["change"] }] });
821
+ }
822
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: CmykComponent, decorators: [{
823
+ type: Component,
824
+ args: [{ selector: 'app-cmyk', imports: [CommonModule, FormsModule, SliderComponent], template: "<slider\r\n [(ngModel)]=\"cyan\"\r\n name=\"cyan\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"cyanSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Cyan</span>\r\n <input type=\"number\" [(ngModel)]=\"cyan\" name=\"inputCyan\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"magenta\"\r\n name=\"magenta\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"magentaSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Magenta</span>\r\n <input type=\"number\" [(ngModel)]=\"magenta\" name=\"inputMagenta\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"yellow\"\r\n name=\"yellow\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"yellowSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Yellow</span>\r\n <input type=\"number\" [(ngModel)]=\"yellow\" name=\"inputYellow\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"key\"\r\n name=\"key\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"keySliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Key</span>\r\n <input type=\"number\" [(ngModel)]=\"key\" name=\"inputKey\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n", styles: [".slider-title{display:flex;align-items:center;justify-content:space-between}.slider-title input{transition:box-shadow .1s;box-shadow:inset #d8d8da 0 0 0 1px,inset #fff 0 0 0 100px;border:none;width:40px;color:#000;font-family:Inter,sans-serif;padding:5px 6px;border-radius:5px;font-size:12px}\n"] }]
825
+ }], ctorParameters: () => [], propDecorators: { color: [{
826
+ type: Input
827
+ }], colorChange: [{
828
+ type: Output
829
+ }] } });
830
+
831
+ class HslComponent {
832
+ hue = 0;
833
+ saturation = 0;
834
+ luminance = 0;
835
+ alpha = 1;
836
+ baseColor = 'rgb(0,0,0)';
837
+ inputColor;
838
+ set color(c) {
839
+ if (c.equals(this.inputColor))
840
+ return;
841
+ this.inputColor = c;
842
+ const hsla = c.toHsl();
843
+ this.hue = hsla.h;
844
+ this.saturation = hsla.s;
845
+ this.luminance = hsla.l;
846
+ this.alpha = hsla.a ?? 1;
847
+ this.baseColor = c.toHexString(false);
848
+ }
849
+ useAlphaChannel = true;
850
+ colorChange = new EventEmitter();
851
+ constructor() { }
852
+ ngOnInit() { }
853
+ generateColor() {
854
+ try {
855
+ const hsla = { h: this.hue, s: this.saturation, l: this.luminance, a: this.alpha };
856
+ const color = new NgxColor(hsla);
857
+ this.baseColor = color.toHexString(false);
858
+ if (color.equals(this.inputColor) == false) {
859
+ this.inputColor = color;
860
+ this.colorChange.emit(color);
861
+ }
862
+ }
863
+ catch (error) {
864
+ this.colorChange.emit(undefined);
865
+ }
866
+ }
867
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: HslComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
868
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: HslComponent, isStandalone: true, selector: "app-hsl", inputs: { color: "color", useAlphaChannel: "useAlphaChannel" }, outputs: { colorChange: "colorChange" }, ngImport: i0, template: "<slider\r\n [(ngModel)]=\"hue\"\r\n name=\"hue\"\r\n [min]=\"0\"\r\n [max]=\"360\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n background=\"linear-gradient(to right,red 0%,#ff0 17%,lime 33%,cyan 50%,blue 66%,#f0f 83%,red 100%)\">\r\n <div class=\"slider-title\">\r\n <span>Hue</span>\r\n <input type=\"number\" [(ngModel)]=\"hue\" name=\"inputHue\" min=\"0\" max=\"360\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"saturation\"\r\n name=\"saturation\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"'linear-gradient(to right,#808080,' + baseColor + ')'\">\r\n <div class=\"slider-title\">\r\n <span>Saturation</span>\r\n <input type=\"number\" [(ngModel)]=\"saturation\" name=\"inputSaturation\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"luminance\"\r\n name=\"luminance\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"'linear-gradient(to right,black,' + baseColor + ',white)'\">\r\n <div class=\"slider-title\">\r\n <span>Luminance</span>\r\n <input type=\"number\" [(ngModel)]=\"luminance\" name=\"inputLuminance\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n@if (useAlphaChannel) {\r\n <slider\r\n [(ngModel)]=\"alpha\"\r\n name=\"alpha\"\r\n [min]=\"0\"\r\n [max]=\"1\"\r\n [step]=\"0.1\"\r\n (change)=\"generateColor()\"\r\n [isBgTransparent]=\"true\"\r\n [background]=\"'linear-gradient(to right,transparent,' + baseColor + ')'\">\r\n <div class=\"slider-title\">\r\n <span>Alpha</span>\r\n <input type=\"number\" [(ngModel)]=\"alpha\" name=\"inputAlpha\" min=\"0\" max=\"1\" step=\"0.1\" />\r\n </div>\r\n </slider>\r\n}\r\n", styles: [".slider-title{display:flex;align-items:center;justify-content:space-between}.slider-title input{transition:box-shadow .1s;box-shadow:inset #d8d8da 0 0 0 1px,inset #fff 0 0 0 100px;border:none;width:48px;color:#000;font-family:Inter,sans-serif;padding:5px 6px;border-radius:5px;font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SliderComponent, selector: "slider", inputs: ["step", "min", "max", "background", "isBgTransparent"], outputs: ["change"] }] });
869
+ }
870
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: HslComponent, decorators: [{
871
+ type: Component,
872
+ args: [{ selector: 'app-hsl', imports: [FormsModule, SliderComponent], template: "<slider\r\n [(ngModel)]=\"hue\"\r\n name=\"hue\"\r\n [min]=\"0\"\r\n [max]=\"360\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n background=\"linear-gradient(to right,red 0%,#ff0 17%,lime 33%,cyan 50%,blue 66%,#f0f 83%,red 100%)\">\r\n <div class=\"slider-title\">\r\n <span>Hue</span>\r\n <input type=\"number\" [(ngModel)]=\"hue\" name=\"inputHue\" min=\"0\" max=\"360\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"saturation\"\r\n name=\"saturation\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"'linear-gradient(to right,#808080,' + baseColor + ')'\">\r\n <div class=\"slider-title\">\r\n <span>Saturation</span>\r\n <input type=\"number\" [(ngModel)]=\"saturation\" name=\"inputSaturation\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"luminance\"\r\n name=\"luminance\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"'linear-gradient(to right,black,' + baseColor + ',white)'\">\r\n <div class=\"slider-title\">\r\n <span>Luminance</span>\r\n <input type=\"number\" [(ngModel)]=\"luminance\" name=\"inputLuminance\" min=\"0\" max=\"100\" step=\"1\" />\r\n </div>\r\n</slider>\r\n@if (useAlphaChannel) {\r\n <slider\r\n [(ngModel)]=\"alpha\"\r\n name=\"alpha\"\r\n [min]=\"0\"\r\n [max]=\"1\"\r\n [step]=\"0.1\"\r\n (change)=\"generateColor()\"\r\n [isBgTransparent]=\"true\"\r\n [background]=\"'linear-gradient(to right,transparent,' + baseColor + ')'\">\r\n <div class=\"slider-title\">\r\n <span>Alpha</span>\r\n <input type=\"number\" [(ngModel)]=\"alpha\" name=\"inputAlpha\" min=\"0\" max=\"1\" step=\"0.1\" />\r\n </div>\r\n </slider>\r\n}\r\n", styles: [".slider-title{display:flex;align-items:center;justify-content:space-between}.slider-title input{transition:box-shadow .1s;box-shadow:inset #d8d8da 0 0 0 1px,inset #fff 0 0 0 100px;border:none;width:48px;color:#000;font-family:Inter,sans-serif;padding:5px 6px;border-radius:5px;font-size:12px}\n"] }]
873
+ }], ctorParameters: () => [], propDecorators: { color: [{
874
+ type: Input
875
+ }], useAlphaChannel: [{
876
+ type: Input
877
+ }], colorChange: [{
878
+ type: Output
879
+ }] } });
880
+
881
+ class RgbComponent {
882
+ redSliderBackground = '';
883
+ greenSliderBackground = '';
884
+ blueSliderBackground = '';
885
+ baseColor = 'rgb(0,0,0)';
886
+ red = 0;
887
+ green = 0;
888
+ blue = 0;
889
+ alpha = 1;
890
+ inputColor;
891
+ set color(c) {
892
+ if (c.equals(this.inputColor))
893
+ return;
894
+ this.inputColor = c;
895
+ const rgba = c.toRgb();
896
+ this.red = rgba.r;
897
+ this.green = rgba.g;
898
+ this.blue = rgba.b;
899
+ this.alpha = rgba.a ?? 1;
900
+ this.updateRgbSliderColor(rgba);
901
+ }
902
+ useAlphaChannel = true;
903
+ colorChange = new EventEmitter();
904
+ constructor() { }
905
+ ngOnInit() { }
906
+ generateColor() {
907
+ try {
908
+ const rgba = { r: this.red, g: this.green, b: this.blue, a: this.alpha };
909
+ const color = new NgxColor(rgba);
910
+ this.updateRgbSliderColor(rgba);
911
+ if (color.equals(this.inputColor) == false) {
912
+ this.inputColor = color;
913
+ this.colorChange.emit(color);
914
+ }
915
+ }
916
+ catch (error) {
917
+ this.colorChange.emit(undefined);
918
+ }
919
+ }
920
+ updateRgbSliderColor(rgba) {
921
+ const { r, g, b } = rgba;
922
+ this.redSliderBackground = `linear-gradient(to right, rgb(0, ${g}, ${b}), rgb(255, ${g}, ${b}))`;
923
+ this.greenSliderBackground = `linear-gradient(to right, rgb(${r}, 0, ${b}), rgb(${r}, 255, ${b}))`;
924
+ this.blueSliderBackground = `linear-gradient(to right, rgb(${r}, ${g}, 0), rgb(${r}, ${g}, 255))`;
925
+ this.baseColor = `rgb(${r}, ${g}, ${b})`;
926
+ }
927
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: RgbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
928
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: RgbComponent, isStandalone: true, selector: "app-rgb", inputs: { color: "color", useAlphaChannel: "useAlphaChannel" }, outputs: { colorChange: "colorChange" }, ngImport: i0, template: "<slider\r\n [(ngModel)]=\"red\"\r\n name=\"red\"\r\n [min]=\"0\"\r\n [max]=\"255\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"redSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Red</span>\r\n <input type=\"number\" [(ngModel)]=\"red\" name=\"inputRed\" min=\"0\" max=\"255\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"green\"\r\n name=\"green\"\r\n [min]=\"0\"\r\n [max]=\"255\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"greenSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Green</span>\r\n <input type=\"number\" [(ngModel)]=\"green\" name=\"inputGreen\" min=\"0\" max=\"255\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"blue\"\r\n name=\"blue\"\r\n [min]=\"0\"\r\n [max]=\"255\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"blueSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Blue</span>\r\n <input type=\"number\" [(ngModel)]=\"blue\" name=\"inputBlue\" min=\"0\" max=\"255\" step=\"1\" />\r\n </div>\r\n</slider>\r\n@if (useAlphaChannel) {\r\n <slider\r\n [(ngModel)]=\"alpha\"\r\n name=\"alpha\"\r\n [min]=\"0\"\r\n [max]=\"1\"\r\n [step]=\"0.1\"\r\n (change)=\"generateColor()\"\r\n [isBgTransparent]=\"true\"\r\n [background]=\"'linear-gradient(to right,transparent,' + baseColor + ')'\">\r\n <div class=\"slider-title\">\r\n <span>Alpha</span>\r\n <input type=\"number\" [(ngModel)]=\"alpha\" name=\"inputAlpha\" min=\"0\" max=\"1\" step=\"0.1\" />\r\n </div>\r\n </slider>\r\n}\r\n", styles: [".slider-title{display:flex;align-items:center;justify-content:space-between}.slider-title input{transition:box-shadow .1s;box-shadow:inset #d8d8da 0 0 0 1px,inset #fff 0 0 0 100px;border:none;width:40px;color:#000;font-family:Inter,sans-serif;padding:5px 6px;border-radius:5px;font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SliderComponent, selector: "slider", inputs: ["step", "min", "max", "background", "isBgTransparent"], outputs: ["change"] }] });
929
+ }
930
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: RgbComponent, decorators: [{
931
+ type: Component,
932
+ args: [{ selector: 'app-rgb', imports: [FormsModule, SliderComponent], template: "<slider\r\n [(ngModel)]=\"red\"\r\n name=\"red\"\r\n [min]=\"0\"\r\n [max]=\"255\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"redSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Red</span>\r\n <input type=\"number\" [(ngModel)]=\"red\" name=\"inputRed\" min=\"0\" max=\"255\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"green\"\r\n name=\"green\"\r\n [min]=\"0\"\r\n [max]=\"255\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"greenSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Green</span>\r\n <input type=\"number\" [(ngModel)]=\"green\" name=\"inputGreen\" min=\"0\" max=\"255\" step=\"1\" />\r\n </div>\r\n</slider>\r\n<slider\r\n [(ngModel)]=\"blue\"\r\n name=\"blue\"\r\n [min]=\"0\"\r\n [max]=\"255\"\r\n [step]=\"1\"\r\n (change)=\"generateColor()\"\r\n [background]=\"blueSliderBackground\">\r\n <div class=\"slider-title\">\r\n <span>Blue</span>\r\n <input type=\"number\" [(ngModel)]=\"blue\" name=\"inputBlue\" min=\"0\" max=\"255\" step=\"1\" />\r\n </div>\r\n</slider>\r\n@if (useAlphaChannel) {\r\n <slider\r\n [(ngModel)]=\"alpha\"\r\n name=\"alpha\"\r\n [min]=\"0\"\r\n [max]=\"1\"\r\n [step]=\"0.1\"\r\n (change)=\"generateColor()\"\r\n [isBgTransparent]=\"true\"\r\n [background]=\"'linear-gradient(to right,transparent,' + baseColor + ')'\">\r\n <div class=\"slider-title\">\r\n <span>Alpha</span>\r\n <input type=\"number\" [(ngModel)]=\"alpha\" name=\"inputAlpha\" min=\"0\" max=\"1\" step=\"0.1\" />\r\n </div>\r\n </slider>\r\n}\r\n", styles: [".slider-title{display:flex;align-items:center;justify-content:space-between}.slider-title input{transition:box-shadow .1s;box-shadow:inset #d8d8da 0 0 0 1px,inset #fff 0 0 0 100px;border:none;width:40px;color:#000;font-family:Inter,sans-serif;padding:5px 6px;border-radius:5px;font-size:12px}\n"] }]
933
+ }], ctorParameters: () => [], propDecorators: { color: [{
934
+ type: Input
935
+ }], useAlphaChannel: [{
936
+ type: Input
937
+ }], colorChange: [{
938
+ type: Output
939
+ }] } });
940
+
941
+ class NgxInputColorComponent {
942
+ cd;
943
+ browserService = inject(BrowserService);
944
+ theme = this.browserService.prefersDarkMode ? 'dark' : 'light';
945
+ set setTheme(val) {
946
+ if (!val || val == 'auto') {
947
+ this.theme = this.browserService.prefersDarkMode ? 'dark' : 'light';
948
+ }
949
+ else {
950
+ this.theme = val;
951
+ }
952
+ }
953
+ /** Minifi UI */
954
+ simpleMode = false;
955
+ outputType = 'HEX';
956
+ /**
957
+ * default inspectors
958
+ * - ColorInspector.Picker
959
+ * - ColorInspector.RGB
960
+ * - ColorInspector.HSL
961
+ *
962
+ * @alias defaultInspector
963
+ */
964
+ defaultInspector = ColorInspector.Picker;
965
+ useAlphaChannel = true;
966
+ set setUseAlphaChannel(val) {
967
+ this.useAlphaChannel = val == true;
968
+ if (!this.useAlphaChannel) {
969
+ this.color.removeAlphaChannel();
970
+ this.emitChange();
971
+ }
972
+ }
973
+ /** Emitted when the color value changes */
974
+ change = new EventEmitter();
975
+ /** @ignore */
976
+ format = ColorFormats.HSVA;
977
+ /** @ignore */
978
+ isDarkColor = true;
979
+ /** @ignore */
980
+ rgbaColor = 'rgba(0, 0, 0, 1)';
981
+ /** @ignore */
982
+ hexColor = '#000000';
983
+ outputColor = '';
984
+ /** @ignore */
985
+ name = 'black';
986
+ /** @ignore */
987
+ isSupportedEyeDrop;
988
+ /** @ignore */
989
+ color = new NgxColor();
990
+ /** @ignore */
991
+ isDisabled = false;
992
+ /**@ignore */
993
+ _onChange = (value) => { };
994
+ /**@ignore */
995
+ _onTouched = () => { };
996
+ /**@ignore */
997
+ _onValidateChange = () => { };
998
+ constructor(cd) {
999
+ this.cd = cd;
1000
+ this.isSupportedEyeDrop = 'EyeDropper' in window;
1001
+ }
1002
+ /** @ignore */
1003
+ ngOnInit() { }
1004
+ /** @ignore */
1005
+ ngOnDestroy() { }
1006
+ get ColorFormats() {
1007
+ return ColorFormats;
1008
+ }
1009
+ get ColorInspector() {
1010
+ return ColorInspector;
1011
+ }
1012
+ /** @ignore */
1013
+ registerOnChange(fn) {
1014
+ this._onChange = fn;
1015
+ }
1016
+ /** @ignore */
1017
+ registerOnTouched(fn) {
1018
+ this._onTouched = fn;
1019
+ }
1020
+ /** @ignore */
1021
+ setDisabledState(disabled) {
1022
+ this.isDisabled = disabled;
1023
+ }
1024
+ /** @ignore */
1025
+ registerOnValidatorChange(fn) {
1026
+ this._onValidateChange = fn;
1027
+ }
1028
+ /** @ignore */
1029
+ validate(control) {
1030
+ if (this.color && this.color.isValid === false) {
1031
+ return { invalid: true };
1032
+ }
1033
+ return null;
1034
+ }
1035
+ /** @ignore */
1036
+ writeValue(value) {
1037
+ try {
1038
+ const c = value ? new NgxColor(value) : new NgxColor('#000');
1039
+ this.initColor(c);
1040
+ this._onValidateChange();
1041
+ }
1042
+ catch (e) {
1043
+ const c = new NgxColor('#000'); // مقدار پیش‌فرض
1044
+ this.initColor(c);
1045
+ }
1046
+ }
1047
+ /** @ignore */
1048
+ openEyeDrop() {
1049
+ if (this.isSupportedEyeDrop) {
1050
+ let t = new EyeDropper().open();
1051
+ t.then(async (result) => {
1052
+ this.hexColor = result.sRGBHex;
1053
+ this.initColor(new NgxColor(this.hexColor));
1054
+ this.cd.detectChanges();
1055
+ });
1056
+ }
1057
+ }
1058
+ /**
1059
+ * call from directive
1060
+ /* @ignore
1061
+ */
1062
+ async initColor(c) {
1063
+ if (!c)
1064
+ return;
1065
+ this.color = c;
1066
+ this.rgbaColor = this.color.toRgbString();
1067
+ this.hexColor = this.color.toHexString();
1068
+ this.outputColor = await this.color.getOutputResult(this.outputType);
1069
+ this.isDarkColor = this.color.isDark();
1070
+ this.name = await this.color.name();
1071
+ this.emitChange();
1072
+ }
1073
+ /** @ignore */
1074
+ stopPropagation(ev) {
1075
+ ev.stopPropagation();
1076
+ }
1077
+ /** @ignore */
1078
+ async emitChange() {
1079
+ this.outputColor = await this.color.getOutputResult(this.outputType);
1080
+ this._onChange(this.outputColor);
1081
+ this.change.emit(this.outputColor);
1082
+ }
1083
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputColorComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1084
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxInputColorComponent, isStandalone: true, selector: "ngx-input-color", inputs: { setTheme: ["theme", "setTheme"], simpleMode: "simpleMode", outputType: "outputType", defaultInspector: "defaultInspector", setUseAlphaChannel: ["useAlphaChannel", "setUseAlphaChannel"] }, outputs: { change: "change" }, host: { properties: { "class.dark": "theme==\"dark\"" } }, providers: [
1085
+ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputColorComponent), multi: true },
1086
+ {
1087
+ provide: NG_VALIDATORS,
1088
+ multi: true,
1089
+ useExisting: NgxInputColorComponent,
1090
+ },
1091
+ ], ngImport: i0, template: "<div class=\"ngx-input-color-picker\" (click)=\"stopPropagation($event)\" [class.simple-mode]=\"simpleMode\">\r\n @if (!simpleMode) {\r\n <div\r\n class=\"ngx-color-preview\"\r\n [ngStyle]=\"{ '--ngx-selected-color': rgbaColor }\"\r\n [class.is-dark-color]=\"isDarkColor\">\r\n <div class=\"rgbacode\">{{ outputColor | uppercase }}</div>\r\n @if (outputType !== 'HEX') {\r\n <div class=\"hexacode\">{{ hexColor | uppercase }}</div>\r\n }\r\n <div class=\"colorname\">{{ name }}</div>\r\n <div class=\"color\"></div>\r\n </div>\r\n }\r\n <div class=\"ngx-c-inner\">\r\n <div class=\"top-actions\">\r\n <select [(ngModel)]=\"defaultInspector\" name=\"inspector\">\r\n @for (inspector of ColorInspector | enumToArray; track inspector) {\r\n <option [value]=\"inspector\">\r\n {{ ColorInspector[+inspector] }}\r\n </option>\r\n }\r\n </select>\r\n @if (isSupportedEyeDrop) {\r\n <button type=\"button\" (click)=\"openEyeDrop()\" class=\"ngx-btn-eyedroper\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\r\n <defs>\r\n <style>\r\n .fa-secondary {\r\n opacity: 0.4;\r\n }\r\n </style>\r\n </defs>\r\n <path\r\n class=\"fa-primary\"\r\n d=\"M482.8 29.23C521.7 68.21 521.7 131.4 482.8 170.4L381.2 271.9L390.6 281.4C403.1 293.9 403.1 314.1 390.6 326.6C378.1 339.1 357.9 339.1 345.4 326.6L185.4 166.6C172.9 154.1 172.9 133.9 185.4 121.4C197.9 108.9 218.1 108.9 230.6 121.4L240.1 130.8L341.6 29.23C380.6-9.744 443.8-9.744 482.8 29.23L482.8 29.23zM132.1 416H96V379.9C96 375.6 97.69 371.6 100.7 368.6L149.3 320H234.7L143.4 411.3C140.4 414.3 136.4 416 132.1 416H132.1z\" />\r\n <path\r\n class=\"fa-secondary\"\r\n d=\"M244 225.3L100.7 368.6C97.69 371.6 96 375.6 96 379.9V416H132.1C136.4 416 140.4 414.3 143.4 411.3L286.7 268L332 313.3L188.7 456.6C173.7 471.6 153.3 480 132.1 480H89.69L49.75 506.6C37.06 515.1 20.16 513.4 9.372 502.6C-1.414 491.8-3.087 474.9 5.374 462.2L32 422.3V379.9C32 358.7 40.43 338.3 55.43 323.3L198.7 180L244 225.3z\" />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n @switch (+defaultInspector) {\r\n @case (ColorInspector.Picker) {\r\n <app-picker\r\n [color]=\"color\"\r\n (colorChange)=\"initColor($event)\"\r\n [simpleMode]=\"simpleMode\"\r\n [useAlphaChannel]=\"useAlphaChannel\"></app-picker>\r\n }\r\n @case (ColorInspector.HSL) {\r\n <app-hsl [color]=\"color\" (colorChange)=\"initColor($event)\" [useAlphaChannel]=\"useAlphaChannel\"></app-hsl>\r\n }\r\n @case (ColorInspector.RGB) {\r\n <app-rgb [color]=\"color\" (colorChange)=\"initColor($event)\" [useAlphaChannel]=\"useAlphaChannel\"></app-rgb>\r\n }\r\n @case (ColorInspector.CMYK) {\r\n <app-cmyk [color]=\"color\" (colorChange)=\"initColor($event)\"></app-cmyk>\r\n }\r\n }\r\n </div>\r\n</div>\r\n", styles: [":host{--ngx-color-bg: #fff;--ngx-color-text: #000}:host-context(.dark){--ngx-color-bg: #222;--ngx-color-text: #fff}.ngx-input-color-picker{width:270px;max-width:100%;border:1px #bfbfbf solid;border-radius:15px;overflow:hidden;box-shadow:0 0 20px #0000004f;direction:ltr;font-family:arial,tahoma}.ngx-input-color-picker .ngx-c-inner{padding:12px;background:var(--ngx-color-bg);color:var(--ngx-color-text);border-radius:15px;margin-top:-15px;position:relative}.ngx-input-color-picker *{box-sizing:border-box}.ngx-input-color-picker.simple-mode{width:220px;--ngx-thumb-size: 24px}.ngx-input-color-picker.simple-mode .ngx-c-inner{padding:12px;margin:0}.ngx-color-preview{min-height:100px;padding:10px 36px;line-height:1.6;font-size:14px;font-family:arial,tahoma;font-weight:700;position:relative;color:#353535;background-color:#fff}.ngx-color-preview.is-dark-color{color:#fff}.ngx-color-preview:after,.ngx-color-preview:before{content:\" \";position:absolute;inset:0}.ngx-color-preview:before{background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-color-preview:after{background:var(--ngx-selected-color)}.ngx-color-preview .rgbacode,.ngx-color-preview .colorname,.ngx-color-preview .color{text-shadow:0 0 1px #000000;position:relative;z-index:1}.button-groups{display:flex;border-radius:4px;overflow:hidden;border:1px #d3d3d3 solid}.button-groups button{cursor:pointer;background:#f9f9f9;outline:none;border:none;transition:all .3s;border-left:1px #d3d3d3 solid;padding:10px 12px;flex:auto}.button-groups button:hover{background:#8db6e4}.button-groups button:first-child{border-left-width:0}.ngx-btn-eyedroper{padding:2px;min-width:0;width:45px;cursor:pointer;background-color:transparent;outline:none;transition:all .3s;border:none;border-radius:6px}.ngx-btn-eyedroper svg{width:18px;fill:var(--ngx-color-text)}.top-actions{display:flex;justify-content:space-between;align-items:center;padding:0 0 12px}.top-actions select{outline:none;border:none;border-radius:4px;padding:5px 10px;background:none;color:var(--ngx-color-text)}.top-actions select:focus{cursor:pointer;background:#e5f0ff;color:#06f}.top-actions select option{padding:10px 20px;background:var(--ngx-color-bg);color:var(--ngx-color-text);transition:all .3s}.top-actions select option:hover{background:#f0f0f048}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: PickerComponent, selector: "app-picker", inputs: ["simpleMode", "color", "useAlphaChannel"], outputs: ["colorChange"] }, { kind: "component", type: CmykComponent, selector: "app-cmyk", inputs: ["color"], outputs: ["colorChange"] }, { kind: "component", type: HslComponent, selector: "app-hsl", inputs: ["color", "useAlphaChannel"], outputs: ["colorChange"] }, { kind: "component", type: RgbComponent, selector: "app-rgb", inputs: ["color", "useAlphaChannel"], outputs: ["colorChange"] }, { kind: "pipe", type: i1$1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: EnumToArrayPipe, name: "enumToArray" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1092
+ }
1093
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputColorComponent, decorators: [{
1094
+ type: Component,
1095
+ args: [{ standalone: true, selector: 'ngx-input-color', providers: [
1096
+ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputColorComponent), multi: true },
1097
+ {
1098
+ provide: NG_VALIDATORS,
1099
+ multi: true,
1100
+ useExisting: NgxInputColorComponent,
1101
+ },
1102
+ ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
1103
+ '[class.dark]': 'theme=="dark"',
1104
+ }, imports: [CommonModule, FormsModule, EnumToArrayPipe, PickerComponent, CmykComponent, HslComponent, RgbComponent], template: "<div class=\"ngx-input-color-picker\" (click)=\"stopPropagation($event)\" [class.simple-mode]=\"simpleMode\">\r\n @if (!simpleMode) {\r\n <div\r\n class=\"ngx-color-preview\"\r\n [ngStyle]=\"{ '--ngx-selected-color': rgbaColor }\"\r\n [class.is-dark-color]=\"isDarkColor\">\r\n <div class=\"rgbacode\">{{ outputColor | uppercase }}</div>\r\n @if (outputType !== 'HEX') {\r\n <div class=\"hexacode\">{{ hexColor | uppercase }}</div>\r\n }\r\n <div class=\"colorname\">{{ name }}</div>\r\n <div class=\"color\"></div>\r\n </div>\r\n }\r\n <div class=\"ngx-c-inner\">\r\n <div class=\"top-actions\">\r\n <select [(ngModel)]=\"defaultInspector\" name=\"inspector\">\r\n @for (inspector of ColorInspector | enumToArray; track inspector) {\r\n <option [value]=\"inspector\">\r\n {{ ColorInspector[+inspector] }}\r\n </option>\r\n }\r\n </select>\r\n @if (isSupportedEyeDrop) {\r\n <button type=\"button\" (click)=\"openEyeDrop()\" class=\"ngx-btn-eyedroper\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\r\n <defs>\r\n <style>\r\n .fa-secondary {\r\n opacity: 0.4;\r\n }\r\n </style>\r\n </defs>\r\n <path\r\n class=\"fa-primary\"\r\n d=\"M482.8 29.23C521.7 68.21 521.7 131.4 482.8 170.4L381.2 271.9L390.6 281.4C403.1 293.9 403.1 314.1 390.6 326.6C378.1 339.1 357.9 339.1 345.4 326.6L185.4 166.6C172.9 154.1 172.9 133.9 185.4 121.4C197.9 108.9 218.1 108.9 230.6 121.4L240.1 130.8L341.6 29.23C380.6-9.744 443.8-9.744 482.8 29.23L482.8 29.23zM132.1 416H96V379.9C96 375.6 97.69 371.6 100.7 368.6L149.3 320H234.7L143.4 411.3C140.4 414.3 136.4 416 132.1 416H132.1z\" />\r\n <path\r\n class=\"fa-secondary\"\r\n d=\"M244 225.3L100.7 368.6C97.69 371.6 96 375.6 96 379.9V416H132.1C136.4 416 140.4 414.3 143.4 411.3L286.7 268L332 313.3L188.7 456.6C173.7 471.6 153.3 480 132.1 480H89.69L49.75 506.6C37.06 515.1 20.16 513.4 9.372 502.6C-1.414 491.8-3.087 474.9 5.374 462.2L32 422.3V379.9C32 358.7 40.43 338.3 55.43 323.3L198.7 180L244 225.3z\" />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n @switch (+defaultInspector) {\r\n @case (ColorInspector.Picker) {\r\n <app-picker\r\n [color]=\"color\"\r\n (colorChange)=\"initColor($event)\"\r\n [simpleMode]=\"simpleMode\"\r\n [useAlphaChannel]=\"useAlphaChannel\"></app-picker>\r\n }\r\n @case (ColorInspector.HSL) {\r\n <app-hsl [color]=\"color\" (colorChange)=\"initColor($event)\" [useAlphaChannel]=\"useAlphaChannel\"></app-hsl>\r\n }\r\n @case (ColorInspector.RGB) {\r\n <app-rgb [color]=\"color\" (colorChange)=\"initColor($event)\" [useAlphaChannel]=\"useAlphaChannel\"></app-rgb>\r\n }\r\n @case (ColorInspector.CMYK) {\r\n <app-cmyk [color]=\"color\" (colorChange)=\"initColor($event)\"></app-cmyk>\r\n }\r\n }\r\n </div>\r\n</div>\r\n", styles: [":host{--ngx-color-bg: #fff;--ngx-color-text: #000}:host-context(.dark){--ngx-color-bg: #222;--ngx-color-text: #fff}.ngx-input-color-picker{width:270px;max-width:100%;border:1px #bfbfbf solid;border-radius:15px;overflow:hidden;box-shadow:0 0 20px #0000004f;direction:ltr;font-family:arial,tahoma}.ngx-input-color-picker .ngx-c-inner{padding:12px;background:var(--ngx-color-bg);color:var(--ngx-color-text);border-radius:15px;margin-top:-15px;position:relative}.ngx-input-color-picker *{box-sizing:border-box}.ngx-input-color-picker.simple-mode{width:220px;--ngx-thumb-size: 24px}.ngx-input-color-picker.simple-mode .ngx-c-inner{padding:12px;margin:0}.ngx-color-preview{min-height:100px;padding:10px 36px;line-height:1.6;font-size:14px;font-family:arial,tahoma;font-weight:700;position:relative;color:#353535;background-color:#fff}.ngx-color-preview.is-dark-color{color:#fff}.ngx-color-preview:after,.ngx-color-preview:before{content:\" \";position:absolute;inset:0}.ngx-color-preview:before{background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-color-preview:after{background:var(--ngx-selected-color)}.ngx-color-preview .rgbacode,.ngx-color-preview .colorname,.ngx-color-preview .color{text-shadow:0 0 1px #000000;position:relative;z-index:1}.button-groups{display:flex;border-radius:4px;overflow:hidden;border:1px #d3d3d3 solid}.button-groups button{cursor:pointer;background:#f9f9f9;outline:none;border:none;transition:all .3s;border-left:1px #d3d3d3 solid;padding:10px 12px;flex:auto}.button-groups button:hover{background:#8db6e4}.button-groups button:first-child{border-left-width:0}.ngx-btn-eyedroper{padding:2px;min-width:0;width:45px;cursor:pointer;background-color:transparent;outline:none;transition:all .3s;border:none;border-radius:6px}.ngx-btn-eyedroper svg{width:18px;fill:var(--ngx-color-text)}.top-actions{display:flex;justify-content:space-between;align-items:center;padding:0 0 12px}.top-actions select{outline:none;border:none;border-radius:4px;padding:5px 10px;background:none;color:var(--ngx-color-text)}.top-actions select:focus{cursor:pointer;background:#e5f0ff;color:#06f}.top-actions select option{padding:10px 20px;background:var(--ngx-color-bg);color:var(--ngx-color-text);transition:all .3s}.top-actions select option:hover{background:#f0f0f048}\n"] }]
1105
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { setTheme: [{
1106
+ type: Input,
1107
+ args: ['theme']
1108
+ }], simpleMode: [{
1109
+ type: Input
1110
+ }], outputType: [{
1111
+ type: Input
1112
+ }], defaultInspector: [{
1113
+ type: Input
1114
+ }], setUseAlphaChannel: [{
1115
+ type: Input,
1116
+ args: ['useAlphaChannel']
1117
+ }], change: [{
1118
+ type: Output
1119
+ }] } });
1120
+
1121
+ class NgxInputColor {
1122
+ el;
1123
+ renderer;
1124
+ viewContainerRef;
1125
+ dialogService;
1126
+ setInputBackgroundColor = true;
1127
+ defaultInspector = ColorInspector.Picker;
1128
+ simpleMode = false;
1129
+ outputType = 'HEX';
1130
+ theme = 'auto';
1131
+ useAlphaChannel = true;
1132
+ set setUseAlphaChannel(val) {
1133
+ this.useAlphaChannel = val == true;
1134
+ if (!this.useAlphaChannel && this.color) {
1135
+ this.color.removeAlphaChannel();
1136
+ this.color.getOutputResult(this.outputType).then((c) => {
1137
+ this.emitChange(c);
1138
+ });
1139
+ }
1140
+ }
1141
+ boundInputHandler = (e) => {
1142
+ this.writeValue(e.target.value);
1143
+ };
1144
+ _targetInput;
1145
+ set ngxInputColor(el) {
1146
+ this.isHostInput = false;
1147
+ if (el instanceof ElementRef) {
1148
+ this._targetInput = el.nativeElement;
1149
+ }
1150
+ else if (el instanceof HTMLInputElement) {
1151
+ this.isHostInput = true;
1152
+ this._targetInput = el;
1153
+ }
1154
+ else {
1155
+ this._targetInput = undefined;
1156
+ }
1157
+ if (this._targetInput) {
1158
+ this._targetInput.removeEventListener('input', this.boundInputHandler);
1159
+ this._targetInput.addEventListener('input', this.boundInputHandler);
1160
+ }
1161
+ }
1162
+ change = new EventEmitter();
1163
+ color;
1164
+ pickerRef;
1165
+ isHostInput = false;
1166
+ inValid = false;
1167
+ _onChange = (value) => { };
1168
+ _onTouched = () => { };
1169
+ _onValidateChange = () => { };
1170
+ constructor(el, renderer, viewContainerRef, dialogService) {
1171
+ this.el = el;
1172
+ this.renderer = renderer;
1173
+ this.viewContainerRef = viewContainerRef;
1174
+ this.dialogService = dialogService;
1175
+ }
1176
+ ngAfterViewInit() {
1177
+ if (this._targetInput && this._targetInput.tagName.toLowerCase() === 'input') {
1178
+ this.writeValue(this._targetInput.value);
1179
+ }
1180
+ }
1181
+ ngOnDestroy() {
1182
+ this.destroyColorPicker();
1183
+ }
1184
+ onClick(ev) {
1185
+ ev.stopPropagation();
1186
+ ev.preventDefault();
1187
+ this.toggleColorPicker();
1188
+ }
1189
+ writeValue(value) {
1190
+ try {
1191
+ this.color = value ? new NgxColor(value) : undefined;
1192
+ const colorStr = this.color?.toHexString() ?? '';
1193
+ // اگر دایرکتیو روی input باشه (ControlValueAccessor)
1194
+ if (this.isHostInput) {
1195
+ const input = this.el.nativeElement;
1196
+ input.value = colorStr;
1197
+ }
1198
+ // اگر input خارجی مشخص شده
1199
+ if (this._targetInput instanceof HTMLInputElement) {
1200
+ this._targetInput.value = colorStr;
1201
+ }
1202
+ if (this.setInputBackgroundColor) {
1203
+ this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', colorStr);
1204
+ }
1205
+ this.inValid = false;
1206
+ this._onValidateChange();
1207
+ }
1208
+ catch (e) {
1209
+ this.color = new NgxColor('#000'); // مقدار پیش‌فرض
1210
+ this.inValid = true;
1211
+ }
1212
+ }
1213
+ registerOnChange(fn) {
1214
+ this._onChange = fn;
1215
+ }
1216
+ registerOnTouched(fn) {
1217
+ this._onTouched = fn;
1218
+ }
1219
+ setDisabledState(disabled) {
1220
+ if (disabled) {
1221
+ this.renderer.setProperty(this.el.nativeElement, 'disabled', disabled);
1222
+ }
1223
+ else {
1224
+ this.renderer.removeAttribute(this.el.nativeElement, 'disabled');
1225
+ }
1226
+ }
1227
+ registerOnValidatorChange(fn) {
1228
+ this._onValidateChange = fn;
1229
+ }
1230
+ validate(control) {
1231
+ if ((this.color && this.color.isValid === false) || this.inValid === true) {
1232
+ return { invalid: true };
1233
+ }
1234
+ return null;
1235
+ }
1236
+ toggleColorPicker() {
1237
+ if (this.pickerRef) {
1238
+ this.destroyColorPicker();
1239
+ return;
1240
+ }
1241
+ this.pickerRef = this.dialogService.open({
1242
+ anchor: this.el.nativeElement,
1243
+ component: NgxInputColorComponent,
1244
+ viewContainerRef: this.viewContainerRef,
1245
+ alignment: 'start',
1246
+ placement: 'auto',
1247
+ configure: (instance, ref) => {
1248
+ instance.defaultInspector = this.defaultInspector;
1249
+ instance.simpleMode = this.simpleMode;
1250
+ instance.outputType = this.outputType;
1251
+ instance.setTheme = this.theme;
1252
+ instance.setUseAlphaChannel = this.useAlphaChannel;
1253
+ if (this.color?.isValid)
1254
+ instance.writeValue(this.color);
1255
+ instance.change.subscribe((c) => {
1256
+ this.color = new NgxColor(c);
1257
+ this.emitChange(c);
1258
+ });
1259
+ // instance.closed.subscribe(() => ref.close());
1260
+ },
1261
+ onClosed: () => {
1262
+ this.pickerRef = undefined;
1263
+ },
1264
+ });
1265
+ }
1266
+ destroyColorPicker() {
1267
+ this.pickerRef?.close();
1268
+ this.pickerRef = undefined;
1269
+ }
1270
+ async emitChange(c) {
1271
+ if (this.setInputBackgroundColor) {
1272
+ this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', c);
1273
+ }
1274
+ // اگر روی input باشیم، مقدار رو در input قرار بده
1275
+ if (this.isHostInput) {
1276
+ const input = this.el.nativeElement;
1277
+ input.value = c;
1278
+ }
1279
+ // اگر targetInput وجود داره، در اونم مقدار ست کن
1280
+ if (this._targetInput instanceof HTMLInputElement) {
1281
+ this._targetInput.value = c;
1282
+ const event = new Event('input', { bubbles: true });
1283
+ this._targetInput.dispatchEvent(event);
1284
+ }
1285
+ this._onChange(c);
1286
+ this.change.emit(c);
1287
+ this._onTouched();
1288
+ }
1289
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputColor, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: i1$2.DialogService }], target: i0.ɵɵFactoryTarget.Directive });
1290
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.4", type: NgxInputColor, isStandalone: true, selector: "[ngxInputColor]", inputs: { setInputBackgroundColor: "setInputBackgroundColor", defaultInspector: "defaultInspector", simpleMode: "simpleMode", outputType: "outputType", theme: "theme", setUseAlphaChannel: ["useAlphaChannel", "setUseAlphaChannel"], ngxInputColor: "ngxInputColor" }, outputs: { change: "change" }, host: { listeners: { "click": "onClick($event)" } }, providers: [
1291
+ {
1292
+ provide: NG_VALUE_ACCESSOR,
1293
+ useExisting: forwardRef(() => NgxInputColor),
1294
+ multi: true,
1295
+ },
1296
+ {
1297
+ provide: NG_VALIDATORS,
1298
+ useExisting: forwardRef(() => NgxInputColor),
1299
+ multi: true,
1300
+ },
1301
+ ], ngImport: i0 });
1302
+ }
1303
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputColor, decorators: [{
1304
+ type: Directive,
1305
+ args: [{
1306
+ selector: '[ngxInputColor]',
1307
+ providers: [
1308
+ {
1309
+ provide: NG_VALUE_ACCESSOR,
1310
+ useExisting: forwardRef(() => NgxInputColor),
1311
+ multi: true,
1312
+ },
1313
+ {
1314
+ provide: NG_VALIDATORS,
1315
+ useExisting: forwardRef(() => NgxInputColor),
1316
+ multi: true,
1317
+ },
1318
+ ],
1319
+ }]
1320
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: i1$2.DialogService }], propDecorators: { setInputBackgroundColor: [{
1321
+ type: Input
1322
+ }], defaultInspector: [{
1323
+ type: Input
1324
+ }], simpleMode: [{
1325
+ type: Input
1326
+ }], outputType: [{
1327
+ type: Input
1328
+ }], theme: [{
1329
+ type: Input
1330
+ }], setUseAlphaChannel: [{
1331
+ type: Input,
1332
+ args: ['useAlphaChannel']
1333
+ }], ngxInputColor: [{
1334
+ type: Input,
1335
+ args: ['ngxInputColor']
1336
+ }], change: [{
1337
+ type: Output
1338
+ }], onClick: [{
1339
+ type: HostListener,
1340
+ args: ['click', ['$event']]
1341
+ }] } });
1342
+
1343
+ /**
1344
+ * Generated bundle index. Do not edit.
1345
+ */
1346
+
1347
+ export { ColorInspector, EnumToArrayPipe, EnumToArrayStringValuePipe, NgxInputColor, NgxInputColorComponent };
1348
+ //# sourceMappingURL=ngx-input-color-picker.mjs.map