color-contrast-js 2.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,2125 @@
1
+ /*! colorContrast.js v2.0.0 | MIT | includes Culori (MIT) */
2
+
3
+ // node_modules/culori/src/rgb/parseNumber.js
4
+ var parseNumber = (color, len) => {
5
+ if (typeof color !== "number") return;
6
+ if (len === 3) {
7
+ return {
8
+ mode: "rgb",
9
+ r: (color >> 8 & 15 | color >> 4 & 240) / 255,
10
+ g: (color >> 4 & 15 | color & 240) / 255,
11
+ b: (color & 15 | color << 4 & 240) / 255
12
+ };
13
+ }
14
+ if (len === 4) {
15
+ return {
16
+ mode: "rgb",
17
+ r: (color >> 12 & 15 | color >> 8 & 240) / 255,
18
+ g: (color >> 8 & 15 | color >> 4 & 240) / 255,
19
+ b: (color >> 4 & 15 | color & 240) / 255,
20
+ alpha: (color & 15 | color << 4 & 240) / 255
21
+ };
22
+ }
23
+ if (len === 6) {
24
+ return {
25
+ mode: "rgb",
26
+ r: (color >> 16 & 255) / 255,
27
+ g: (color >> 8 & 255) / 255,
28
+ b: (color & 255) / 255
29
+ };
30
+ }
31
+ if (len === 8) {
32
+ return {
33
+ mode: "rgb",
34
+ r: (color >> 24 & 255) / 255,
35
+ g: (color >> 16 & 255) / 255,
36
+ b: (color >> 8 & 255) / 255,
37
+ alpha: (color & 255) / 255
38
+ };
39
+ }
40
+ };
41
+ var parseNumber_default = parseNumber;
42
+
43
+ // node_modules/culori/src/colors/named.js
44
+ var named = {
45
+ aliceblue: 15792383,
46
+ antiquewhite: 16444375,
47
+ aqua: 65535,
48
+ aquamarine: 8388564,
49
+ azure: 15794175,
50
+ beige: 16119260,
51
+ bisque: 16770244,
52
+ black: 0,
53
+ blanchedalmond: 16772045,
54
+ blue: 255,
55
+ blueviolet: 9055202,
56
+ brown: 10824234,
57
+ burlywood: 14596231,
58
+ cadetblue: 6266528,
59
+ chartreuse: 8388352,
60
+ chocolate: 13789470,
61
+ coral: 16744272,
62
+ cornflowerblue: 6591981,
63
+ cornsilk: 16775388,
64
+ crimson: 14423100,
65
+ cyan: 65535,
66
+ darkblue: 139,
67
+ darkcyan: 35723,
68
+ darkgoldenrod: 12092939,
69
+ darkgray: 11119017,
70
+ darkgreen: 25600,
71
+ darkgrey: 11119017,
72
+ darkkhaki: 12433259,
73
+ darkmagenta: 9109643,
74
+ darkolivegreen: 5597999,
75
+ darkorange: 16747520,
76
+ darkorchid: 10040012,
77
+ darkred: 9109504,
78
+ darksalmon: 15308410,
79
+ darkseagreen: 9419919,
80
+ darkslateblue: 4734347,
81
+ darkslategray: 3100495,
82
+ darkslategrey: 3100495,
83
+ darkturquoise: 52945,
84
+ darkviolet: 9699539,
85
+ deeppink: 16716947,
86
+ deepskyblue: 49151,
87
+ dimgray: 6908265,
88
+ dimgrey: 6908265,
89
+ dodgerblue: 2003199,
90
+ firebrick: 11674146,
91
+ floralwhite: 16775920,
92
+ forestgreen: 2263842,
93
+ fuchsia: 16711935,
94
+ gainsboro: 14474460,
95
+ ghostwhite: 16316671,
96
+ gold: 16766720,
97
+ goldenrod: 14329120,
98
+ gray: 8421504,
99
+ green: 32768,
100
+ greenyellow: 11403055,
101
+ grey: 8421504,
102
+ honeydew: 15794160,
103
+ hotpink: 16738740,
104
+ indianred: 13458524,
105
+ indigo: 4915330,
106
+ ivory: 16777200,
107
+ khaki: 15787660,
108
+ lavender: 15132410,
109
+ lavenderblush: 16773365,
110
+ lawngreen: 8190976,
111
+ lemonchiffon: 16775885,
112
+ lightblue: 11393254,
113
+ lightcoral: 15761536,
114
+ lightcyan: 14745599,
115
+ lightgoldenrodyellow: 16448210,
116
+ lightgray: 13882323,
117
+ lightgreen: 9498256,
118
+ lightgrey: 13882323,
119
+ lightpink: 16758465,
120
+ lightsalmon: 16752762,
121
+ lightseagreen: 2142890,
122
+ lightskyblue: 8900346,
123
+ lightslategray: 7833753,
124
+ lightslategrey: 7833753,
125
+ lightsteelblue: 11584734,
126
+ lightyellow: 16777184,
127
+ lime: 65280,
128
+ limegreen: 3329330,
129
+ linen: 16445670,
130
+ magenta: 16711935,
131
+ maroon: 8388608,
132
+ mediumaquamarine: 6737322,
133
+ mediumblue: 205,
134
+ mediumorchid: 12211667,
135
+ mediumpurple: 9662683,
136
+ mediumseagreen: 3978097,
137
+ mediumslateblue: 8087790,
138
+ mediumspringgreen: 64154,
139
+ mediumturquoise: 4772300,
140
+ mediumvioletred: 13047173,
141
+ midnightblue: 1644912,
142
+ mintcream: 16121850,
143
+ mistyrose: 16770273,
144
+ moccasin: 16770229,
145
+ navajowhite: 16768685,
146
+ navy: 128,
147
+ oldlace: 16643558,
148
+ olive: 8421376,
149
+ olivedrab: 7048739,
150
+ orange: 16753920,
151
+ orangered: 16729344,
152
+ orchid: 14315734,
153
+ palegoldenrod: 15657130,
154
+ palegreen: 10025880,
155
+ paleturquoise: 11529966,
156
+ palevioletred: 14381203,
157
+ papayawhip: 16773077,
158
+ peachpuff: 16767673,
159
+ peru: 13468991,
160
+ pink: 16761035,
161
+ plum: 14524637,
162
+ powderblue: 11591910,
163
+ purple: 8388736,
164
+ // Added in CSS Colors Level 4:
165
+ // https://drafts.csswg.org/css-color/#changes-from-3
166
+ rebeccapurple: 6697881,
167
+ red: 16711680,
168
+ rosybrown: 12357519,
169
+ royalblue: 4286945,
170
+ saddlebrown: 9127187,
171
+ salmon: 16416882,
172
+ sandybrown: 16032864,
173
+ seagreen: 3050327,
174
+ seashell: 16774638,
175
+ sienna: 10506797,
176
+ silver: 12632256,
177
+ skyblue: 8900331,
178
+ slateblue: 6970061,
179
+ slategray: 7372944,
180
+ slategrey: 7372944,
181
+ snow: 16775930,
182
+ springgreen: 65407,
183
+ steelblue: 4620980,
184
+ tan: 13808780,
185
+ teal: 32896,
186
+ thistle: 14204888,
187
+ tomato: 16737095,
188
+ turquoise: 4251856,
189
+ violet: 15631086,
190
+ wheat: 16113331,
191
+ white: 16777215,
192
+ whitesmoke: 16119285,
193
+ yellow: 16776960,
194
+ yellowgreen: 10145074
195
+ };
196
+ var named_default = named;
197
+
198
+ // node_modules/culori/src/rgb/parseNamed.js
199
+ var parseNamed = (color) => {
200
+ return parseNumber_default(named_default[color.toLowerCase()], 6);
201
+ };
202
+ var parseNamed_default = parseNamed;
203
+
204
+ // node_modules/culori/src/rgb/parseHex.js
205
+ var hex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;
206
+ var parseHex = (color) => {
207
+ let match;
208
+ return (match = color.match(hex)) ? parseNumber_default(parseInt(match[1], 16), match[1].length) : void 0;
209
+ };
210
+ var parseHex_default = parseHex;
211
+
212
+ // node_modules/culori/src/util/regex.js
213
+ var num = "([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)";
214
+ var num_none = `(?:${num}|none)`;
215
+ var per = `${num}%`;
216
+ var per_none = `(?:${num}%|none)`;
217
+ var num_per = `(?:${num}%|${num})`;
218
+ var num_per_none = `(?:${num}%|${num}|none)`;
219
+ var hue = `(?:${num}(deg|grad|rad|turn)|${num})`;
220
+ var hue_none = `(?:${num}(deg|grad|rad|turn)|${num}|none)`;
221
+ var c = `\\s*,\\s*`;
222
+ var rx_num_per_none = new RegExp("^" + num_per_none + "$");
223
+
224
+ // node_modules/culori/src/rgb/parseRgbLegacy.js
225
+ var rgb_num_old = new RegExp(
226
+ `^rgba?\\(\\s*${num}${c}${num}${c}${num}\\s*(?:,\\s*${num_per}\\s*)?\\)$`
227
+ );
228
+ var rgb_per_old = new RegExp(
229
+ `^rgba?\\(\\s*${per}${c}${per}${c}${per}\\s*(?:,\\s*${num_per}\\s*)?\\)$`
230
+ );
231
+ var parseRgbLegacy = (color) => {
232
+ let res = { mode: "rgb" };
233
+ let match;
234
+ if (match = color.match(rgb_num_old)) {
235
+ if (match[1] !== void 0) {
236
+ res.r = match[1] / 255;
237
+ }
238
+ if (match[2] !== void 0) {
239
+ res.g = match[2] / 255;
240
+ }
241
+ if (match[3] !== void 0) {
242
+ res.b = match[3] / 255;
243
+ }
244
+ } else if (match = color.match(rgb_per_old)) {
245
+ if (match[1] !== void 0) {
246
+ res.r = match[1] / 100;
247
+ }
248
+ if (match[2] !== void 0) {
249
+ res.g = match[2] / 100;
250
+ }
251
+ if (match[3] !== void 0) {
252
+ res.b = match[3] / 100;
253
+ }
254
+ } else {
255
+ return void 0;
256
+ }
257
+ if (match[4] !== void 0) {
258
+ res.alpha = Math.max(0, Math.min(1, match[4] / 100));
259
+ } else if (match[5] !== void 0) {
260
+ res.alpha = Math.max(0, Math.min(1, +match[5]));
261
+ }
262
+ return res;
263
+ };
264
+ var parseRgbLegacy_default = parseRgbLegacy;
265
+
266
+ // node_modules/culori/src/_prepare.js
267
+ var prepare = (color, mode) => color === void 0 ? void 0 : typeof color !== "object" ? parse_default(color) : color.mode !== void 0 ? color : mode ? { ...color, mode } : void 0;
268
+ var prepare_default = prepare;
269
+
270
+ // node_modules/culori/src/converter.js
271
+ var converter = (target_mode = "rgb") => (color) => (color = prepare_default(color, target_mode)) !== void 0 ? (
272
+ // if the color's mode corresponds to our target mode
273
+ color.mode === target_mode ? (
274
+ // then just return the color
275
+ color
276
+ ) : (
277
+ // otherwise check to see if we have a dedicated
278
+ // converter for the target mode
279
+ converters[color.mode][target_mode] ? (
280
+ // and return its result...
281
+ converters[color.mode][target_mode](color)
282
+ ) : (
283
+ // ...otherwise pass through RGB as an intermediary step.
284
+ // if the target mode is RGB...
285
+ target_mode === "rgb" ? (
286
+ // just return the RGB
287
+ converters[color.mode].rgb(color)
288
+ ) : (
289
+ // otherwise convert color.mode -> RGB -> target_mode
290
+ converters.rgb[target_mode](converters[color.mode].rgb(color))
291
+ )
292
+ )
293
+ )
294
+ ) : void 0;
295
+ var converter_default = converter;
296
+
297
+ // node_modules/culori/src/modes.js
298
+ var converters = {};
299
+ var modes = {};
300
+ var parsers = [];
301
+ var colorProfiles = {};
302
+ var identity = (v) => v;
303
+ var useMode = (definition14) => {
304
+ converters[definition14.mode] = {
305
+ ...converters[definition14.mode],
306
+ ...definition14.toMode
307
+ };
308
+ Object.keys(definition14.fromMode || {}).forEach((k3) => {
309
+ if (!converters[k3]) {
310
+ converters[k3] = {};
311
+ }
312
+ converters[k3][definition14.mode] = definition14.fromMode[k3];
313
+ });
314
+ if (!definition14.ranges) {
315
+ definition14.ranges = {};
316
+ }
317
+ if (!definition14.difference) {
318
+ definition14.difference = {};
319
+ }
320
+ definition14.channels.forEach((channel) => {
321
+ if (definition14.ranges[channel] === void 0) {
322
+ definition14.ranges[channel] = [0, 1];
323
+ }
324
+ if (!definition14.interpolate[channel]) {
325
+ throw new Error(`Missing interpolator for: ${channel}`);
326
+ }
327
+ if (typeof definition14.interpolate[channel] === "function") {
328
+ definition14.interpolate[channel] = {
329
+ use: definition14.interpolate[channel]
330
+ };
331
+ }
332
+ if (!definition14.interpolate[channel].fixup) {
333
+ definition14.interpolate[channel].fixup = identity;
334
+ }
335
+ });
336
+ modes[definition14.mode] = definition14;
337
+ (definition14.parse || []).forEach((parser) => {
338
+ useParser(parser, definition14.mode);
339
+ });
340
+ return converter_default(definition14.mode);
341
+ };
342
+ var getMode = (mode) => modes[mode];
343
+ var useParser = (parser, mode) => {
344
+ if (typeof parser === "string") {
345
+ if (!mode) {
346
+ throw new Error(`'mode' required when 'parser' is a string`);
347
+ }
348
+ colorProfiles[parser] = mode;
349
+ } else if (typeof parser === "function") {
350
+ if (parsers.indexOf(parser) < 0) {
351
+ parsers.push(parser);
352
+ }
353
+ }
354
+ };
355
+
356
+ // node_modules/culori/src/parse.js
357
+ var IdentStartCodePoint = /[^\x00-\x7F]|[a-zA-Z_]/;
358
+ var IdentCodePoint = /[^\x00-\x7F]|[-\w]/;
359
+ var Tok = {
360
+ Function: "function",
361
+ Ident: "ident",
362
+ Number: "number",
363
+ Percentage: "percentage",
364
+ ParenClose: ")",
365
+ None: "none",
366
+ Hue: "hue",
367
+ Alpha: "alpha"
368
+ };
369
+ var _i = 0;
370
+ function is_num(chars) {
371
+ let ch = chars[_i];
372
+ let ch1 = chars[_i + 1];
373
+ if (ch === "-" || ch === "+") {
374
+ return /\d/.test(ch1) || ch1 === "." && /\d/.test(chars[_i + 2]);
375
+ }
376
+ if (ch === ".") {
377
+ return /\d/.test(ch1);
378
+ }
379
+ return /\d/.test(ch);
380
+ }
381
+ function is_ident(chars) {
382
+ if (_i >= chars.length) {
383
+ return false;
384
+ }
385
+ let ch = chars[_i];
386
+ if (IdentStartCodePoint.test(ch)) {
387
+ return true;
388
+ }
389
+ if (ch === "-") {
390
+ if (chars.length - _i < 2) {
391
+ return false;
392
+ }
393
+ let ch1 = chars[_i + 1];
394
+ if (ch1 === "-" || IdentStartCodePoint.test(ch1)) {
395
+ return true;
396
+ }
397
+ return false;
398
+ }
399
+ return false;
400
+ }
401
+ var huenits = {
402
+ deg: 1,
403
+ rad: 180 / Math.PI,
404
+ grad: 9 / 10,
405
+ turn: 360
406
+ };
407
+ function num2(chars) {
408
+ let value = "";
409
+ if (chars[_i] === "-" || chars[_i] === "+") {
410
+ value += chars[_i++];
411
+ }
412
+ value += digits(chars);
413
+ if (chars[_i] === "." && /\d/.test(chars[_i + 1])) {
414
+ value += chars[_i++] + digits(chars);
415
+ }
416
+ if (chars[_i] === "e" || chars[_i] === "E") {
417
+ if ((chars[_i + 1] === "-" || chars[_i + 1] === "+") && /\d/.test(chars[_i + 2])) {
418
+ value += chars[_i++] + chars[_i++] + digits(chars);
419
+ } else if (/\d/.test(chars[_i + 1])) {
420
+ value += chars[_i++] + digits(chars);
421
+ }
422
+ }
423
+ if (is_ident(chars)) {
424
+ let id = ident(chars);
425
+ if (id === "deg" || id === "rad" || id === "turn" || id === "grad") {
426
+ return { type: Tok.Hue, value: value * huenits[id] };
427
+ }
428
+ return void 0;
429
+ }
430
+ if (chars[_i] === "%") {
431
+ _i++;
432
+ return { type: Tok.Percentage, value: +value };
433
+ }
434
+ return { type: Tok.Number, value: +value };
435
+ }
436
+ function digits(chars) {
437
+ let v = "";
438
+ while (/\d/.test(chars[_i])) {
439
+ v += chars[_i++];
440
+ }
441
+ return v;
442
+ }
443
+ function ident(chars) {
444
+ let v = "";
445
+ while (_i < chars.length && IdentCodePoint.test(chars[_i])) {
446
+ v += chars[_i++];
447
+ }
448
+ return v;
449
+ }
450
+ function identlike(chars) {
451
+ let v = ident(chars);
452
+ if (chars[_i] === "(") {
453
+ _i++;
454
+ return { type: Tok.Function, value: v };
455
+ }
456
+ if (v === "none") {
457
+ return { type: Tok.None, value: void 0 };
458
+ }
459
+ return { type: Tok.Ident, value: v };
460
+ }
461
+ function tokenize(str = "") {
462
+ let chars = str.trim();
463
+ let tokens = [];
464
+ let ch;
465
+ _i = 0;
466
+ while (_i < chars.length) {
467
+ ch = chars[_i++];
468
+ if (ch === "\n" || ch === " " || ch === " ") {
469
+ while (_i < chars.length && (chars[_i] === "\n" || chars[_i] === " " || chars[_i] === " ")) {
470
+ _i++;
471
+ }
472
+ continue;
473
+ }
474
+ if (ch === ",") {
475
+ return void 0;
476
+ }
477
+ if (ch === ")") {
478
+ tokens.push({ type: Tok.ParenClose });
479
+ continue;
480
+ }
481
+ if (ch === "+") {
482
+ _i--;
483
+ if (is_num(chars)) {
484
+ tokens.push(num2(chars));
485
+ continue;
486
+ }
487
+ return void 0;
488
+ }
489
+ if (ch === "-") {
490
+ _i--;
491
+ if (is_num(chars)) {
492
+ tokens.push(num2(chars));
493
+ continue;
494
+ }
495
+ if (is_ident(chars)) {
496
+ tokens.push({ type: Tok.Ident, value: ident(chars) });
497
+ continue;
498
+ }
499
+ return void 0;
500
+ }
501
+ if (ch === ".") {
502
+ _i--;
503
+ if (is_num(chars)) {
504
+ tokens.push(num2(chars));
505
+ continue;
506
+ }
507
+ return void 0;
508
+ }
509
+ if (ch === "/") {
510
+ while (_i < chars.length && (chars[_i] === "\n" || chars[_i] === " " || chars[_i] === " ")) {
511
+ _i++;
512
+ }
513
+ let alpha;
514
+ if (is_num(chars)) {
515
+ alpha = num2(chars);
516
+ if (alpha.type !== Tok.Hue) {
517
+ tokens.push({ type: Tok.Alpha, value: alpha });
518
+ continue;
519
+ }
520
+ }
521
+ if (is_ident(chars)) {
522
+ if (ident(chars) === "none") {
523
+ tokens.push({
524
+ type: Tok.Alpha,
525
+ value: { type: Tok.None, value: void 0 }
526
+ });
527
+ continue;
528
+ }
529
+ }
530
+ return void 0;
531
+ }
532
+ if (/\d/.test(ch)) {
533
+ _i--;
534
+ tokens.push(num2(chars));
535
+ continue;
536
+ }
537
+ if (IdentStartCodePoint.test(ch)) {
538
+ _i--;
539
+ tokens.push(identlike(chars));
540
+ continue;
541
+ }
542
+ return void 0;
543
+ }
544
+ return tokens;
545
+ }
546
+ function parseColorSyntax(tokens) {
547
+ tokens._i = 0;
548
+ let token = tokens[tokens._i++];
549
+ if (!token || token.type !== Tok.Function || token.value !== "color") {
550
+ return void 0;
551
+ }
552
+ token = tokens[tokens._i++];
553
+ if (token.type !== Tok.Ident) {
554
+ return void 0;
555
+ }
556
+ const mode = colorProfiles[token.value];
557
+ if (!mode) {
558
+ return void 0;
559
+ }
560
+ const res = { mode };
561
+ const coords = consumeCoords(tokens, false);
562
+ if (!coords) {
563
+ return void 0;
564
+ }
565
+ const channels = getMode(mode).channels;
566
+ for (let ii = 0, c2, ch; ii < channels.length; ii++) {
567
+ c2 = coords[ii];
568
+ ch = channels[ii];
569
+ if (c2.type !== Tok.None) {
570
+ res[ch] = c2.type === Tok.Number ? c2.value : c2.value / 100;
571
+ if (ch === "alpha") {
572
+ res[ch] = Math.max(0, Math.min(1, res[ch]));
573
+ }
574
+ }
575
+ }
576
+ return res;
577
+ }
578
+ function consumeCoords(tokens, includeHue) {
579
+ const coords = [];
580
+ let token;
581
+ while (tokens._i < tokens.length) {
582
+ token = tokens[tokens._i++];
583
+ if (token.type === Tok.None || token.type === Tok.Number || token.type === Tok.Alpha || token.type === Tok.Percentage || includeHue && token.type === Tok.Hue) {
584
+ coords.push(token);
585
+ continue;
586
+ }
587
+ if (token.type === Tok.ParenClose) {
588
+ if (tokens._i < tokens.length) {
589
+ return void 0;
590
+ }
591
+ continue;
592
+ }
593
+ return void 0;
594
+ }
595
+ if (coords.length < 3 || coords.length > 4) {
596
+ return void 0;
597
+ }
598
+ if (coords.length === 4) {
599
+ if (coords[3].type !== Tok.Alpha) {
600
+ return void 0;
601
+ }
602
+ coords[3] = coords[3].value;
603
+ }
604
+ if (coords.length === 3) {
605
+ coords.push({ type: Tok.None, value: void 0 });
606
+ }
607
+ return coords.every((c2) => c2.type !== Tok.Alpha) ? coords : void 0;
608
+ }
609
+ function parseModernSyntax(tokens, includeHue) {
610
+ tokens._i = 0;
611
+ let token = tokens[tokens._i++];
612
+ if (!token || token.type !== Tok.Function) {
613
+ return void 0;
614
+ }
615
+ let coords = consumeCoords(tokens, includeHue);
616
+ if (!coords) {
617
+ return void 0;
618
+ }
619
+ coords.unshift(token.value);
620
+ return coords;
621
+ }
622
+ var parse = (color) => {
623
+ if (typeof color !== "string") {
624
+ return void 0;
625
+ }
626
+ const tokens = tokenize(color);
627
+ const parsed = tokens ? parseModernSyntax(tokens, true) : void 0;
628
+ let result = void 0;
629
+ let i = 0;
630
+ let len = parsers.length;
631
+ while (i < len) {
632
+ if ((result = parsers[i++](color, parsed)) !== void 0) {
633
+ return result;
634
+ }
635
+ }
636
+ return tokens ? parseColorSyntax(tokens) : void 0;
637
+ };
638
+ var parse_default = parse;
639
+
640
+ // node_modules/culori/src/rgb/parseRgb.js
641
+ function parseRgb(color, parsed) {
642
+ if (!parsed || parsed[0] !== "rgb" && parsed[0] !== "rgba") {
643
+ return void 0;
644
+ }
645
+ const res = { mode: "rgb" };
646
+ const [, r, g, b, alpha] = parsed;
647
+ if (r.type === Tok.Hue || g.type === Tok.Hue || b.type === Tok.Hue) {
648
+ return void 0;
649
+ }
650
+ if (r.type !== Tok.None) {
651
+ res.r = r.type === Tok.Number ? r.value / 255 : r.value / 100;
652
+ }
653
+ if (g.type !== Tok.None) {
654
+ res.g = g.type === Tok.Number ? g.value / 255 : g.value / 100;
655
+ }
656
+ if (b.type !== Tok.None) {
657
+ res.b = b.type === Tok.Number ? b.value / 255 : b.value / 100;
658
+ }
659
+ if (alpha.type !== Tok.None) {
660
+ res.alpha = Math.min(
661
+ 1,
662
+ Math.max(
663
+ 0,
664
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
665
+ )
666
+ );
667
+ }
668
+ return res;
669
+ }
670
+ var parseRgb_default = parseRgb;
671
+
672
+ // node_modules/culori/src/rgb/parseTransparent.js
673
+ var parseTransparent = (c2) => c2 === "transparent" ? { mode: "rgb", r: 0, g: 0, b: 0, alpha: 0 } : void 0;
674
+ var parseTransparent_default = parseTransparent;
675
+
676
+ // node_modules/culori/src/interpolate/lerp.js
677
+ var lerp = (a, b, t) => a + t * (b - a);
678
+
679
+ // node_modules/culori/src/interpolate/piecewise.js
680
+ var get_classes = (arr) => {
681
+ let classes = [];
682
+ for (let i = 0; i < arr.length - 1; i++) {
683
+ let a = arr[i];
684
+ let b = arr[i + 1];
685
+ if (a === void 0 && b === void 0) {
686
+ classes.push(void 0);
687
+ } else if (a !== void 0 && b !== void 0) {
688
+ classes.push([a, b]);
689
+ } else {
690
+ classes.push(a !== void 0 ? [a, a] : [b, b]);
691
+ }
692
+ }
693
+ return classes;
694
+ };
695
+ var interpolatorPiecewise = (interpolator) => (arr) => {
696
+ let classes = get_classes(arr);
697
+ return (t) => {
698
+ let cls = t * classes.length;
699
+ let idx = t >= 1 ? classes.length - 1 : Math.max(Math.floor(cls), 0);
700
+ let pair = classes[idx];
701
+ return pair === void 0 ? void 0 : interpolator(pair[0], pair[1], cls - idx);
702
+ };
703
+ };
704
+
705
+ // node_modules/culori/src/interpolate/linear.js
706
+ var interpolatorLinear = interpolatorPiecewise(lerp);
707
+
708
+ // node_modules/culori/src/fixup/alpha.js
709
+ var fixupAlpha = (arr) => {
710
+ let some_defined = false;
711
+ let res = arr.map((v) => {
712
+ if (v !== void 0) {
713
+ some_defined = true;
714
+ return v;
715
+ }
716
+ return 1;
717
+ });
718
+ return some_defined ? res : arr;
719
+ };
720
+
721
+ // node_modules/culori/src/rgb/definition.js
722
+ var definition = {
723
+ mode: "rgb",
724
+ channels: ["r", "g", "b", "alpha"],
725
+ parse: [
726
+ parseRgb_default,
727
+ parseHex_default,
728
+ parseRgbLegacy_default,
729
+ parseNamed_default,
730
+ parseTransparent_default,
731
+ "srgb"
732
+ ],
733
+ serialize: "srgb",
734
+ interpolate: {
735
+ r: interpolatorLinear,
736
+ g: interpolatorLinear,
737
+ b: interpolatorLinear,
738
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
739
+ },
740
+ gamut: true,
741
+ white: { r: 1, g: 1, b: 1 },
742
+ black: { r: 0, g: 0, b: 0 }
743
+ };
744
+ var definition_default = definition;
745
+
746
+ // node_modules/culori/src/a98/convertA98ToXyz65.js
747
+ var linearize = (v = 0) => Math.pow(Math.abs(v), 563 / 256) * Math.sign(v);
748
+ var convertA98ToXyz65 = (a98) => {
749
+ let r = linearize(a98.r);
750
+ let g = linearize(a98.g);
751
+ let b = linearize(a98.b);
752
+ let res = {
753
+ mode: "xyz65",
754
+ x: 0.5766690429101305 * r + 0.1855582379065463 * g + 0.1882286462349947 * b,
755
+ y: 0.297344975250536 * r + 0.6273635662554661 * g + 0.0752914584939979 * b,
756
+ z: 0.0270313613864123 * r + 0.0706888525358272 * g + 0.9913375368376386 * b
757
+ };
758
+ if (a98.alpha !== void 0) {
759
+ res.alpha = a98.alpha;
760
+ }
761
+ return res;
762
+ };
763
+ var convertA98ToXyz65_default = convertA98ToXyz65;
764
+
765
+ // node_modules/culori/src/a98/convertXyz65ToA98.js
766
+ var gamma = (v) => Math.pow(Math.abs(v), 256 / 563) * Math.sign(v);
767
+ var convertXyz65ToA98 = ({ x, y, z, alpha }) => {
768
+ if (x === void 0) x = 0;
769
+ if (y === void 0) y = 0;
770
+ if (z === void 0) z = 0;
771
+ let res = {
772
+ mode: "a98",
773
+ r: gamma(
774
+ x * 2.0415879038107465 - y * 0.5650069742788597 - 0.3447313507783297 * z
775
+ ),
776
+ g: gamma(
777
+ x * -0.9692436362808798 + y * 1.8759675015077206 + 0.0415550574071756 * z
778
+ ),
779
+ b: gamma(
780
+ x * 0.0134442806320312 - y * 0.1183623922310184 + 1.0151749943912058 * z
781
+ )
782
+ };
783
+ if (alpha !== void 0) {
784
+ res.alpha = alpha;
785
+ }
786
+ return res;
787
+ };
788
+ var convertXyz65ToA98_default = convertXyz65ToA98;
789
+
790
+ // node_modules/culori/src/lrgb/convertRgbToLrgb.js
791
+ var fn = (c2 = 0) => {
792
+ const abs = Math.abs(c2);
793
+ if (abs <= 0.04045) {
794
+ return c2 / 12.92;
795
+ }
796
+ return (Math.sign(c2) || 1) * Math.pow((abs + 0.055) / 1.055, 2.4);
797
+ };
798
+ var convertRgbToLrgb = ({ r, g, b, alpha }) => {
799
+ let res = {
800
+ mode: "lrgb",
801
+ r: fn(r),
802
+ g: fn(g),
803
+ b: fn(b)
804
+ };
805
+ if (alpha !== void 0) res.alpha = alpha;
806
+ return res;
807
+ };
808
+ var convertRgbToLrgb_default = convertRgbToLrgb;
809
+
810
+ // node_modules/culori/src/xyz65/convertRgbToXyz65.js
811
+ var convertRgbToXyz65 = (rgb) => {
812
+ let { r, g, b, alpha } = convertRgbToLrgb_default(rgb);
813
+ let res = {
814
+ mode: "xyz65",
815
+ x: 0.4123907992659593 * r + 0.357584339383878 * g + 0.1804807884018343 * b,
816
+ y: 0.2126390058715102 * r + 0.715168678767756 * g + 0.0721923153607337 * b,
817
+ z: 0.0193308187155918 * r + 0.119194779794626 * g + 0.9505321522496607 * b
818
+ };
819
+ if (alpha !== void 0) {
820
+ res.alpha = alpha;
821
+ }
822
+ return res;
823
+ };
824
+ var convertRgbToXyz65_default = convertRgbToXyz65;
825
+
826
+ // node_modules/culori/src/lrgb/convertLrgbToRgb.js
827
+ var fn2 = (c2 = 0) => {
828
+ const abs = Math.abs(c2);
829
+ if (abs > 31308e-7) {
830
+ return (Math.sign(c2) || 1) * (1.055 * Math.pow(abs, 1 / 2.4) - 0.055);
831
+ }
832
+ return c2 * 12.92;
833
+ };
834
+ var convertLrgbToRgb = ({ r, g, b, alpha }, mode = "rgb") => {
835
+ let res = {
836
+ mode,
837
+ r: fn2(r),
838
+ g: fn2(g),
839
+ b: fn2(b)
840
+ };
841
+ if (alpha !== void 0) res.alpha = alpha;
842
+ return res;
843
+ };
844
+ var convertLrgbToRgb_default = convertLrgbToRgb;
845
+
846
+ // node_modules/culori/src/xyz65/convertXyz65ToRgb.js
847
+ var convertXyz65ToRgb = ({ x, y, z, alpha }) => {
848
+ if (x === void 0) x = 0;
849
+ if (y === void 0) y = 0;
850
+ if (z === void 0) z = 0;
851
+ let res = convertLrgbToRgb_default({
852
+ r: x * 3.2409699419045226 - y * 1.537383177570094 - 0.4986107602930034 * z,
853
+ g: x * -0.9692436362808796 + y * 1.8759675015077204 + 0.0415550574071756 * z,
854
+ b: x * 0.0556300796969936 - y * 0.2039769588889765 + 1.0569715142428784 * z
855
+ });
856
+ if (alpha !== void 0) {
857
+ res.alpha = alpha;
858
+ }
859
+ return res;
860
+ };
861
+ var convertXyz65ToRgb_default = convertXyz65ToRgb;
862
+
863
+ // node_modules/culori/src/a98/definition.js
864
+ var definition2 = {
865
+ ...definition_default,
866
+ mode: "a98",
867
+ parse: ["a98-rgb"],
868
+ serialize: "a98-rgb",
869
+ fromMode: {
870
+ rgb: (color) => convertXyz65ToA98_default(convertRgbToXyz65_default(color)),
871
+ xyz65: convertXyz65ToA98_default
872
+ },
873
+ toMode: {
874
+ rgb: (color) => convertXyz65ToRgb_default(convertA98ToXyz65_default(color)),
875
+ xyz65: convertA98ToXyz65_default
876
+ }
877
+ };
878
+ var definition_default2 = definition2;
879
+
880
+ // node_modules/culori/src/util/normalizeHue.js
881
+ var normalizeHue = (hue3) => (hue3 = hue3 % 360) < 0 ? hue3 + 360 : hue3;
882
+ var normalizeHue_default = normalizeHue;
883
+
884
+ // node_modules/culori/src/fixup/hue.js
885
+ var hue2 = (hues, fn4) => {
886
+ return hues.map((hue3, idx, arr) => {
887
+ if (hue3 === void 0) {
888
+ return hue3;
889
+ }
890
+ let normalized = normalizeHue_default(hue3);
891
+ if (idx === 0 || hues[idx - 1] === void 0) {
892
+ return normalized;
893
+ }
894
+ return fn4(normalized - normalizeHue_default(arr[idx - 1]));
895
+ }).reduce((acc, curr) => {
896
+ if (!acc.length || curr === void 0 || acc[acc.length - 1] === void 0) {
897
+ acc.push(curr);
898
+ return acc;
899
+ }
900
+ acc.push(curr + acc[acc.length - 1]);
901
+ return acc;
902
+ }, []);
903
+ };
904
+ var fixupHueShorter = (arr) => hue2(arr, (d) => Math.abs(d) <= 180 ? d : d - 360 * Math.sign(d));
905
+
906
+ // node_modules/culori/src/difference.js
907
+ var differenceHueSaturation = (std, smp) => {
908
+ if (std.h === void 0 || smp.h === void 0 || !std.s || !smp.s) {
909
+ return 0;
910
+ }
911
+ let std_h = normalizeHue_default(std.h);
912
+ let smp_h = normalizeHue_default(smp.h);
913
+ let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);
914
+ return 2 * Math.sqrt(std.s * smp.s) * dH;
915
+ };
916
+ var differenceHueChroma = (std, smp) => {
917
+ if (std.h === void 0 || smp.h === void 0 || !std.c || !smp.c) {
918
+ return 0;
919
+ }
920
+ let std_h = normalizeHue_default(std.h);
921
+ let smp_h = normalizeHue_default(smp.h);
922
+ let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);
923
+ return 2 * Math.sqrt(std.c * smp.c) * dH;
924
+ };
925
+
926
+ // node_modules/culori/src/average.js
927
+ var averageAngle = (val) => {
928
+ let sum = val.reduce(
929
+ (sum2, val2) => {
930
+ if (val2 !== void 0) {
931
+ let rad = val2 * Math.PI / 180;
932
+ sum2.sin += Math.sin(rad);
933
+ sum2.cos += Math.cos(rad);
934
+ }
935
+ return sum2;
936
+ },
937
+ { sin: 0, cos: 0 }
938
+ );
939
+ let angle = Math.atan2(sum.sin, sum.cos) * 180 / Math.PI;
940
+ return angle < 0 ? 360 + angle : angle;
941
+ };
942
+
943
+ // node_modules/culori/src/lch/convertLabToLch.js
944
+ var convertLabToLch = ({ l, a, b, alpha }, mode = "lch") => {
945
+ if (a === void 0) a = 0;
946
+ if (b === void 0) b = 0;
947
+ let c2 = Math.sqrt(a * a + b * b);
948
+ let res = { mode, l, c: c2 };
949
+ if (c2) res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);
950
+ if (alpha !== void 0) res.alpha = alpha;
951
+ return res;
952
+ };
953
+ var convertLabToLch_default = convertLabToLch;
954
+
955
+ // node_modules/culori/src/lch/convertLchToLab.js
956
+ var convertLchToLab = ({ l, c: c2, h, alpha }, mode = "lab") => {
957
+ if (h === void 0) h = 0;
958
+ let res = {
959
+ mode,
960
+ l,
961
+ a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,
962
+ b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0
963
+ };
964
+ if (alpha !== void 0) res.alpha = alpha;
965
+ return res;
966
+ };
967
+ var convertLchToLab_default = convertLchToLab;
968
+
969
+ // node_modules/culori/src/constants.js
970
+ var D50 = {
971
+ X: 0.3457 / 0.3585,
972
+ Y: 1,
973
+ Z: (1 - 0.3457 - 0.3585) / 0.3585
974
+ };
975
+ var D65 = {
976
+ X: 0.3127 / 0.329,
977
+ Y: 1,
978
+ Z: (1 - 0.3127 - 0.329) / 0.329
979
+ };
980
+ var k = Math.pow(29, 3) / Math.pow(3, 3);
981
+ var e = Math.pow(6, 3) / Math.pow(29, 3);
982
+
983
+ // node_modules/culori/src/hsl/convertHslToRgb.js
984
+ function convertHslToRgb({ h, s, l, alpha }) {
985
+ h = normalizeHue_default(h !== void 0 ? h : 0);
986
+ if (s === void 0) s = 0;
987
+ if (l === void 0) l = 0;
988
+ let m1 = l + s * (l < 0.5 ? l : 1 - l);
989
+ let m2 = m1 - (m1 - l) * 2 * Math.abs(h / 60 % 2 - 1);
990
+ let res;
991
+ switch (Math.floor(h / 60)) {
992
+ case 0:
993
+ res = { r: m1, g: m2, b: 2 * l - m1 };
994
+ break;
995
+ case 1:
996
+ res = { r: m2, g: m1, b: 2 * l - m1 };
997
+ break;
998
+ case 2:
999
+ res = { r: 2 * l - m1, g: m1, b: m2 };
1000
+ break;
1001
+ case 3:
1002
+ res = { r: 2 * l - m1, g: m2, b: m1 };
1003
+ break;
1004
+ case 4:
1005
+ res = { r: m2, g: 2 * l - m1, b: m1 };
1006
+ break;
1007
+ case 5:
1008
+ res = { r: m1, g: 2 * l - m1, b: m2 };
1009
+ break;
1010
+ default:
1011
+ res = { r: 2 * l - m1, g: 2 * l - m1, b: 2 * l - m1 };
1012
+ }
1013
+ res.mode = "rgb";
1014
+ if (alpha !== void 0) res.alpha = alpha;
1015
+ return res;
1016
+ }
1017
+
1018
+ // node_modules/culori/src/hsl/convertRgbToHsl.js
1019
+ function convertRgbToHsl({ r, g, b, alpha }) {
1020
+ if (r === void 0) r = 0;
1021
+ if (g === void 0) g = 0;
1022
+ if (b === void 0) b = 0;
1023
+ let M = Math.max(r, g, b), m = Math.min(r, g, b);
1024
+ let res = {
1025
+ mode: "hsl",
1026
+ s: M === m ? 0 : (M - m) / (1 - Math.abs(M + m - 1)),
1027
+ l: 0.5 * (M + m)
1028
+ };
1029
+ if (M - m !== 0)
1030
+ res.h = (M === r ? (g - b) / (M - m) + (g < b) * 6 : M === g ? (b - r) / (M - m) + 2 : (r - g) / (M - m) + 4) * 60;
1031
+ if (alpha !== void 0) res.alpha = alpha;
1032
+ return res;
1033
+ }
1034
+
1035
+ // node_modules/culori/src/util/hue.js
1036
+ var hueToDeg = (val, unit) => {
1037
+ switch (unit) {
1038
+ case "deg":
1039
+ return +val;
1040
+ case "rad":
1041
+ return val / Math.PI * 180;
1042
+ case "grad":
1043
+ return val / 10 * 9;
1044
+ case "turn":
1045
+ return val * 360;
1046
+ }
1047
+ };
1048
+ var hue_default = hueToDeg;
1049
+
1050
+ // node_modules/culori/src/hsl/parseHslLegacy.js
1051
+ var hsl_old = new RegExp(
1052
+ `^hsla?\\(\\s*${hue}${c}${per}${c}${per}\\s*(?:,\\s*${num_per}\\s*)?\\)$`
1053
+ );
1054
+ var parseHslLegacy = (color) => {
1055
+ let match = color.match(hsl_old);
1056
+ if (!match) return;
1057
+ let res = { mode: "hsl" };
1058
+ if (match[3] !== void 0) {
1059
+ res.h = +match[3];
1060
+ } else if (match[1] !== void 0 && match[2] !== void 0) {
1061
+ res.h = hue_default(match[1], match[2]);
1062
+ }
1063
+ if (match[4] !== void 0) {
1064
+ res.s = Math.min(Math.max(0, match[4] / 100), 1);
1065
+ }
1066
+ if (match[5] !== void 0) {
1067
+ res.l = Math.min(Math.max(0, match[5] / 100), 1);
1068
+ }
1069
+ if (match[6] !== void 0) {
1070
+ res.alpha = Math.max(0, Math.min(1, match[6] / 100));
1071
+ } else if (match[7] !== void 0) {
1072
+ res.alpha = Math.max(0, Math.min(1, +match[7]));
1073
+ }
1074
+ return res;
1075
+ };
1076
+ var parseHslLegacy_default = parseHslLegacy;
1077
+
1078
+ // node_modules/culori/src/hsl/parseHsl.js
1079
+ function parseHsl(color, parsed) {
1080
+ if (!parsed || parsed[0] !== "hsl" && parsed[0] !== "hsla") {
1081
+ return void 0;
1082
+ }
1083
+ const res = { mode: "hsl" };
1084
+ const [, h, s, l, alpha] = parsed;
1085
+ if (h.type !== Tok.None) {
1086
+ if (h.type === Tok.Percentage) {
1087
+ return void 0;
1088
+ }
1089
+ res.h = h.value;
1090
+ }
1091
+ if (s.type !== Tok.None) {
1092
+ if (s.type === Tok.Hue) {
1093
+ return void 0;
1094
+ }
1095
+ res.s = s.value / 100;
1096
+ }
1097
+ if (l.type !== Tok.None) {
1098
+ if (l.type === Tok.Hue) {
1099
+ return void 0;
1100
+ }
1101
+ res.l = l.value / 100;
1102
+ }
1103
+ if (alpha.type !== Tok.None) {
1104
+ res.alpha = Math.min(
1105
+ 1,
1106
+ Math.max(
1107
+ 0,
1108
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
1109
+ )
1110
+ );
1111
+ }
1112
+ return res;
1113
+ }
1114
+ var parseHsl_default = parseHsl;
1115
+
1116
+ // node_modules/culori/src/hsl/definition.js
1117
+ var definition3 = {
1118
+ mode: "hsl",
1119
+ toMode: {
1120
+ rgb: convertHslToRgb
1121
+ },
1122
+ fromMode: {
1123
+ rgb: convertRgbToHsl
1124
+ },
1125
+ channels: ["h", "s", "l", "alpha"],
1126
+ ranges: {
1127
+ h: [0, 360]
1128
+ },
1129
+ gamut: "rgb",
1130
+ parse: [parseHsl_default, parseHslLegacy_default],
1131
+ serialize: (c2) => `hsl(${c2.h !== void 0 ? c2.h : "none"} ${c2.s !== void 0 ? c2.s * 100 + "%" : "none"} ${c2.l !== void 0 ? c2.l * 100 + "%" : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`,
1132
+ interpolate: {
1133
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1134
+ s: interpolatorLinear,
1135
+ l: interpolatorLinear,
1136
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1137
+ },
1138
+ difference: {
1139
+ h: differenceHueSaturation
1140
+ },
1141
+ average: {
1142
+ h: averageAngle
1143
+ }
1144
+ };
1145
+ var definition_default3 = definition3;
1146
+
1147
+ // node_modules/culori/src/xyz50/constants.js
1148
+ var k2 = Math.pow(29, 3) / Math.pow(3, 3);
1149
+ var e2 = Math.pow(6, 3) / Math.pow(29, 3);
1150
+
1151
+ // node_modules/culori/src/lab/convertLabToXyz50.js
1152
+ var fn3 = (v) => Math.pow(v, 3) > e2 ? Math.pow(v, 3) : (116 * v - 16) / k2;
1153
+ var convertLabToXyz50 = ({ l, a, b, alpha }) => {
1154
+ if (l === void 0) l = 0;
1155
+ if (a === void 0) a = 0;
1156
+ if (b === void 0) b = 0;
1157
+ let fy = (l + 16) / 116;
1158
+ let fx = a / 500 + fy;
1159
+ let fz = fy - b / 200;
1160
+ let res = {
1161
+ mode: "xyz50",
1162
+ x: fn3(fx) * D50.X,
1163
+ y: fn3(fy) * D50.Y,
1164
+ z: fn3(fz) * D50.Z
1165
+ };
1166
+ if (alpha !== void 0) {
1167
+ res.alpha = alpha;
1168
+ }
1169
+ return res;
1170
+ };
1171
+ var convertLabToXyz50_default = convertLabToXyz50;
1172
+
1173
+ // node_modules/culori/src/xyz50/convertXyz50ToRgb.js
1174
+ var convertXyz50ToRgb = ({ x, y, z, alpha }) => {
1175
+ if (x === void 0) x = 0;
1176
+ if (y === void 0) y = 0;
1177
+ if (z === void 0) z = 0;
1178
+ let res = convertLrgbToRgb_default({
1179
+ r: x * 3.1341359569958707 - y * 1.6173863321612538 - 0.4906619460083532 * z,
1180
+ g: x * -0.978795502912089 + y * 1.916254567259524 + 0.03344273116131949 * z,
1181
+ b: x * 0.07195537988411677 - y * 0.2289768264158322 + 1.405386058324125 * z
1182
+ });
1183
+ if (alpha !== void 0) {
1184
+ res.alpha = alpha;
1185
+ }
1186
+ return res;
1187
+ };
1188
+ var convertXyz50ToRgb_default = convertXyz50ToRgb;
1189
+
1190
+ // node_modules/culori/src/lab/convertLabToRgb.js
1191
+ var convertLabToRgb = (lab) => convertXyz50ToRgb_default(convertLabToXyz50_default(lab));
1192
+ var convertLabToRgb_default = convertLabToRgb;
1193
+
1194
+ // node_modules/culori/src/xyz50/convertRgbToXyz50.js
1195
+ var convertRgbToXyz50 = (rgb) => {
1196
+ let { r, g, b, alpha } = convertRgbToLrgb_default(rgb);
1197
+ let res = {
1198
+ mode: "xyz50",
1199
+ x: 0.436065742824811 * r + 0.3851514688337912 * g + 0.14307845442264197 * b,
1200
+ y: 0.22249319175623702 * r + 0.7168870538238823 * g + 0.06061979053616537 * b,
1201
+ z: 0.013923904500943465 * r + 0.09708128566574634 * g + 0.7140993584005155 * b
1202
+ };
1203
+ if (alpha !== void 0) {
1204
+ res.alpha = alpha;
1205
+ }
1206
+ return res;
1207
+ };
1208
+ var convertRgbToXyz50_default = convertRgbToXyz50;
1209
+
1210
+ // node_modules/culori/src/lab/convertXyz50ToLab.js
1211
+ var f = (value) => value > e2 ? Math.cbrt(value) : (k2 * value + 16) / 116;
1212
+ var convertXyz50ToLab = ({ x, y, z, alpha }) => {
1213
+ if (x === void 0) x = 0;
1214
+ if (y === void 0) y = 0;
1215
+ if (z === void 0) z = 0;
1216
+ let f0 = f(x / D50.X);
1217
+ let f1 = f(y / D50.Y);
1218
+ let f2 = f(z / D50.Z);
1219
+ let res = {
1220
+ mode: "lab",
1221
+ l: 116 * f1 - 16,
1222
+ a: 500 * (f0 - f1),
1223
+ b: 200 * (f1 - f2)
1224
+ };
1225
+ if (alpha !== void 0) {
1226
+ res.alpha = alpha;
1227
+ }
1228
+ return res;
1229
+ };
1230
+ var convertXyz50ToLab_default = convertXyz50ToLab;
1231
+
1232
+ // node_modules/culori/src/lab/convertRgbToLab.js
1233
+ var convertRgbToLab = (rgb) => {
1234
+ let res = convertXyz50ToLab_default(convertRgbToXyz50_default(rgb));
1235
+ if (rgb.r === rgb.b && rgb.b === rgb.g) {
1236
+ res.a = res.b = 0;
1237
+ }
1238
+ return res;
1239
+ };
1240
+ var convertRgbToLab_default = convertRgbToLab;
1241
+
1242
+ // node_modules/culori/src/lab/parseLab.js
1243
+ function parseLab(color, parsed) {
1244
+ if (!parsed || parsed[0] !== "lab") {
1245
+ return void 0;
1246
+ }
1247
+ const res = { mode: "lab" };
1248
+ const [, l, a, b, alpha] = parsed;
1249
+ if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {
1250
+ return void 0;
1251
+ }
1252
+ if (l.type !== Tok.None) {
1253
+ res.l = Math.min(Math.max(0, l.value), 100);
1254
+ }
1255
+ if (a.type !== Tok.None) {
1256
+ res.a = a.type === Tok.Number ? a.value : a.value * 125 / 100;
1257
+ }
1258
+ if (b.type !== Tok.None) {
1259
+ res.b = b.type === Tok.Number ? b.value : b.value * 125 / 100;
1260
+ }
1261
+ if (alpha.type !== Tok.None) {
1262
+ res.alpha = Math.min(
1263
+ 1,
1264
+ Math.max(
1265
+ 0,
1266
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
1267
+ )
1268
+ );
1269
+ }
1270
+ return res;
1271
+ }
1272
+ var parseLab_default = parseLab;
1273
+
1274
+ // node_modules/culori/src/lab/definition.js
1275
+ var definition4 = {
1276
+ mode: "lab",
1277
+ toMode: {
1278
+ xyz50: convertLabToXyz50_default,
1279
+ rgb: convertLabToRgb_default
1280
+ },
1281
+ fromMode: {
1282
+ xyz50: convertXyz50ToLab_default,
1283
+ rgb: convertRgbToLab_default
1284
+ },
1285
+ channels: ["l", "a", "b", "alpha"],
1286
+ ranges: {
1287
+ l: [0, 100],
1288
+ a: [-125, 125],
1289
+ b: [-125, 125]
1290
+ },
1291
+ parse: [parseLab_default],
1292
+ serialize: (c2) => `lab(${c2.l !== void 0 ? c2.l : "none"} ${c2.a !== void 0 ? c2.a : "none"} ${c2.b !== void 0 ? c2.b : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`,
1293
+ interpolate: {
1294
+ l: interpolatorLinear,
1295
+ a: interpolatorLinear,
1296
+ b: interpolatorLinear,
1297
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1298
+ }
1299
+ };
1300
+ var definition_default4 = definition4;
1301
+
1302
+ // node_modules/culori/src/lch/parseLch.js
1303
+ function parseLch(color, parsed) {
1304
+ if (!parsed || parsed[0] !== "lch") {
1305
+ return void 0;
1306
+ }
1307
+ const res = { mode: "lch" };
1308
+ const [, l, c2, h, alpha] = parsed;
1309
+ if (l.type !== Tok.None) {
1310
+ if (l.type === Tok.Hue) {
1311
+ return void 0;
1312
+ }
1313
+ res.l = Math.min(Math.max(0, l.value), 100);
1314
+ }
1315
+ if (c2.type !== Tok.None) {
1316
+ res.c = Math.max(
1317
+ 0,
1318
+ c2.type === Tok.Number ? c2.value : c2.value * 150 / 100
1319
+ );
1320
+ }
1321
+ if (h.type !== Tok.None) {
1322
+ if (h.type === Tok.Percentage) {
1323
+ return void 0;
1324
+ }
1325
+ res.h = h.value;
1326
+ }
1327
+ if (alpha.type !== Tok.None) {
1328
+ res.alpha = Math.min(
1329
+ 1,
1330
+ Math.max(
1331
+ 0,
1332
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
1333
+ )
1334
+ );
1335
+ }
1336
+ return res;
1337
+ }
1338
+ var parseLch_default = parseLch;
1339
+
1340
+ // node_modules/culori/src/lch/definition.js
1341
+ var definition5 = {
1342
+ mode: "lch",
1343
+ toMode: {
1344
+ lab: convertLchToLab_default,
1345
+ rgb: (c2) => convertLabToRgb_default(convertLchToLab_default(c2))
1346
+ },
1347
+ fromMode: {
1348
+ rgb: (c2) => convertLabToLch_default(convertRgbToLab_default(c2)),
1349
+ lab: convertLabToLch_default
1350
+ },
1351
+ channels: ["l", "c", "h", "alpha"],
1352
+ ranges: {
1353
+ l: [0, 100],
1354
+ c: [0, 150],
1355
+ h: [0, 360]
1356
+ },
1357
+ parse: [parseLch_default],
1358
+ serialize: (c2) => `lch(${c2.l !== void 0 ? c2.l : "none"} ${c2.c !== void 0 ? c2.c : "none"} ${c2.h !== void 0 ? c2.h : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`,
1359
+ interpolate: {
1360
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1361
+ c: interpolatorLinear,
1362
+ l: interpolatorLinear,
1363
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1364
+ },
1365
+ difference: {
1366
+ h: differenceHueChroma
1367
+ },
1368
+ average: {
1369
+ h: averageAngle
1370
+ }
1371
+ };
1372
+ var definition_default5 = definition5;
1373
+
1374
+ // node_modules/culori/src/lrgb/definition.js
1375
+ var definition6 = {
1376
+ ...definition_default,
1377
+ mode: "lrgb",
1378
+ toMode: {
1379
+ rgb: convertLrgbToRgb_default
1380
+ },
1381
+ fromMode: {
1382
+ rgb: convertRgbToLrgb_default
1383
+ },
1384
+ parse: ["srgb-linear"],
1385
+ serialize: "srgb-linear"
1386
+ };
1387
+ var definition_default6 = definition6;
1388
+
1389
+ // node_modules/culori/src/oklab/convertLrgbToOklab.js
1390
+ var convertLrgbToOklab = ({ r, g, b, alpha }) => {
1391
+ if (r === void 0) r = 0;
1392
+ if (g === void 0) g = 0;
1393
+ if (b === void 0) b = 0;
1394
+ let L = Math.cbrt(
1395
+ 0.412221469470763 * r + 0.5363325372617348 * g + 0.0514459932675022 * b
1396
+ );
1397
+ let M = Math.cbrt(
1398
+ 0.2119034958178252 * r + 0.6806995506452344 * g + 0.1073969535369406 * b
1399
+ );
1400
+ let S = Math.cbrt(
1401
+ 0.0883024591900564 * r + 0.2817188391361215 * g + 0.6299787016738222 * b
1402
+ );
1403
+ let res = {
1404
+ mode: "oklab",
1405
+ l: 0.210454268309314 * L + 0.7936177747023054 * M - 0.0040720430116193 * S,
1406
+ a: 1.9779985324311684 * L - 2.42859224204858 * M + 0.450593709617411 * S,
1407
+ b: 0.0259040424655478 * L + 0.7827717124575296 * M - 0.8086757549230774 * S
1408
+ };
1409
+ if (alpha !== void 0) {
1410
+ res.alpha = alpha;
1411
+ }
1412
+ return res;
1413
+ };
1414
+ var convertLrgbToOklab_default = convertLrgbToOklab;
1415
+
1416
+ // node_modules/culori/src/oklab/convertRgbToOklab.js
1417
+ var convertRgbToOklab = (rgb) => {
1418
+ let res = convertLrgbToOklab_default(convertRgbToLrgb_default(rgb));
1419
+ if (rgb.r === rgb.b && rgb.b === rgb.g) {
1420
+ res.a = res.b = 0;
1421
+ }
1422
+ return res;
1423
+ };
1424
+ var convertRgbToOklab_default = convertRgbToOklab;
1425
+
1426
+ // node_modules/culori/src/oklab/convertOklabToLrgb.js
1427
+ var convertOklabToLrgb = ({ l, a, b, alpha }) => {
1428
+ if (l === void 0) l = 0;
1429
+ if (a === void 0) a = 0;
1430
+ if (b === void 0) b = 0;
1431
+ let L = Math.pow(l + 0.3963377773761749 * a + 0.2158037573099136 * b, 3);
1432
+ let M = Math.pow(l - 0.1055613458156586 * a - 0.0638541728258133 * b, 3);
1433
+ let S = Math.pow(l - 0.0894841775298119 * a - 1.2914855480194092 * b, 3);
1434
+ let res = {
1435
+ mode: "lrgb",
1436
+ r: 4.076741636075957 * L - 3.3077115392580616 * M + 0.2309699031821044 * S,
1437
+ g: -1.2684379732850317 * L + 2.6097573492876887 * M - 0.3413193760026573 * S,
1438
+ b: -0.0041960761386756 * L - 0.7034186179359362 * M + 1.7076146940746117 * S
1439
+ };
1440
+ if (alpha !== void 0) {
1441
+ res.alpha = alpha;
1442
+ }
1443
+ return res;
1444
+ };
1445
+ var convertOklabToLrgb_default = convertOklabToLrgb;
1446
+
1447
+ // node_modules/culori/src/oklab/convertOklabToRgb.js
1448
+ var convertOklabToRgb = (c2) => convertLrgbToRgb_default(convertOklabToLrgb_default(c2));
1449
+ var convertOklabToRgb_default = convertOklabToRgb;
1450
+
1451
+ // node_modules/culori/src/oklab/parseOklab.js
1452
+ function parseOklab(color, parsed) {
1453
+ if (!parsed || parsed[0] !== "oklab") {
1454
+ return void 0;
1455
+ }
1456
+ const res = { mode: "oklab" };
1457
+ const [, l, a, b, alpha] = parsed;
1458
+ if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {
1459
+ return void 0;
1460
+ }
1461
+ if (l.type !== Tok.None) {
1462
+ res.l = Math.min(
1463
+ Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),
1464
+ 1
1465
+ );
1466
+ }
1467
+ if (a.type !== Tok.None) {
1468
+ res.a = a.type === Tok.Number ? a.value : a.value * 0.4 / 100;
1469
+ }
1470
+ if (b.type !== Tok.None) {
1471
+ res.b = b.type === Tok.Number ? b.value : b.value * 0.4 / 100;
1472
+ }
1473
+ if (alpha.type !== Tok.None) {
1474
+ res.alpha = Math.min(
1475
+ 1,
1476
+ Math.max(
1477
+ 0,
1478
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
1479
+ )
1480
+ );
1481
+ }
1482
+ return res;
1483
+ }
1484
+ var parseOklab_default = parseOklab;
1485
+
1486
+ // node_modules/culori/src/oklab/definition.js
1487
+ var definition7 = {
1488
+ ...definition_default4,
1489
+ mode: "oklab",
1490
+ toMode: {
1491
+ lrgb: convertOklabToLrgb_default,
1492
+ rgb: convertOklabToRgb_default
1493
+ },
1494
+ fromMode: {
1495
+ lrgb: convertLrgbToOklab_default,
1496
+ rgb: convertRgbToOklab_default
1497
+ },
1498
+ ranges: {
1499
+ l: [0, 1],
1500
+ a: [-0.4, 0.4],
1501
+ b: [-0.4, 0.4]
1502
+ },
1503
+ parse: [parseOklab_default],
1504
+ serialize: (c2) => `oklab(${c2.l !== void 0 ? c2.l : "none"} ${c2.a !== void 0 ? c2.a : "none"} ${c2.b !== void 0 ? c2.b : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`
1505
+ };
1506
+ var definition_default7 = definition7;
1507
+
1508
+ // node_modules/culori/src/oklch/parseOklch.js
1509
+ function parseOklch(color, parsed) {
1510
+ if (!parsed || parsed[0] !== "oklch") {
1511
+ return void 0;
1512
+ }
1513
+ const res = { mode: "oklch" };
1514
+ const [, l, c2, h, alpha] = parsed;
1515
+ if (l.type !== Tok.None) {
1516
+ if (l.type === Tok.Hue) {
1517
+ return void 0;
1518
+ }
1519
+ res.l = Math.min(
1520
+ Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),
1521
+ 1
1522
+ );
1523
+ }
1524
+ if (c2.type !== Tok.None) {
1525
+ res.c = Math.max(
1526
+ 0,
1527
+ c2.type === Tok.Number ? c2.value : c2.value * 0.4 / 100
1528
+ );
1529
+ }
1530
+ if (h.type !== Tok.None) {
1531
+ if (h.type === Tok.Percentage) {
1532
+ return void 0;
1533
+ }
1534
+ res.h = h.value;
1535
+ }
1536
+ if (alpha.type !== Tok.None) {
1537
+ res.alpha = Math.min(
1538
+ 1,
1539
+ Math.max(
1540
+ 0,
1541
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
1542
+ )
1543
+ );
1544
+ }
1545
+ return res;
1546
+ }
1547
+ var parseOklch_default = parseOklch;
1548
+
1549
+ // node_modules/culori/src/oklch/definition.js
1550
+ var definition8 = {
1551
+ ...definition_default5,
1552
+ mode: "oklch",
1553
+ toMode: {
1554
+ oklab: (c2) => convertLchToLab_default(c2, "oklab"),
1555
+ rgb: (c2) => convertOklabToRgb_default(convertLchToLab_default(c2, "oklab"))
1556
+ },
1557
+ fromMode: {
1558
+ rgb: (c2) => convertLabToLch_default(convertRgbToOklab_default(c2), "oklch"),
1559
+ oklab: (c2) => convertLabToLch_default(c2, "oklch")
1560
+ },
1561
+ parse: [parseOklch_default],
1562
+ serialize: (c2) => `oklch(${c2.l !== void 0 ? c2.l : "none"} ${c2.c !== void 0 ? c2.c : "none"} ${c2.h !== void 0 ? c2.h : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`,
1563
+ ranges: {
1564
+ l: [0, 1],
1565
+ c: [0, 0.4],
1566
+ h: [0, 360]
1567
+ }
1568
+ };
1569
+ var definition_default8 = definition8;
1570
+
1571
+ // node_modules/culori/src/p3/convertP3ToXyz65.js
1572
+ var convertP3ToXyz65 = (rgb) => {
1573
+ let { r, g, b, alpha } = convertRgbToLrgb_default(rgb);
1574
+ let res = {
1575
+ mode: "xyz65",
1576
+ x: 0.486570948648216 * r + 0.265667693169093 * g + 0.1982172852343625 * b,
1577
+ y: 0.2289745640697487 * r + 0.6917385218365062 * g + 0.079286914093745 * b,
1578
+ z: 0 * r + 0.0451133818589026 * g + 1.043944368900976 * b
1579
+ };
1580
+ if (alpha !== void 0) {
1581
+ res.alpha = alpha;
1582
+ }
1583
+ return res;
1584
+ };
1585
+ var convertP3ToXyz65_default = convertP3ToXyz65;
1586
+
1587
+ // node_modules/culori/src/p3/convertXyz65ToP3.js
1588
+ var convertXyz65ToP3 = ({ x, y, z, alpha }) => {
1589
+ if (x === void 0) x = 0;
1590
+ if (y === void 0) y = 0;
1591
+ if (z === void 0) z = 0;
1592
+ let res = convertLrgbToRgb_default(
1593
+ {
1594
+ r: x * 2.4934969119414263 - y * 0.9313836179191242 - 0.402710784450717 * z,
1595
+ g: x * -0.8294889695615749 + y * 1.7626640603183465 + 0.0236246858419436 * z,
1596
+ b: x * 0.0358458302437845 - y * 0.0761723892680418 + 0.9568845240076871 * z
1597
+ },
1598
+ "p3"
1599
+ );
1600
+ if (alpha !== void 0) {
1601
+ res.alpha = alpha;
1602
+ }
1603
+ return res;
1604
+ };
1605
+ var convertXyz65ToP3_default = convertXyz65ToP3;
1606
+
1607
+ // node_modules/culori/src/p3/definition.js
1608
+ var definition9 = {
1609
+ ...definition_default,
1610
+ mode: "p3",
1611
+ parse: ["display-p3"],
1612
+ serialize: "display-p3",
1613
+ fromMode: {
1614
+ rgb: (color) => convertXyz65ToP3_default(convertRgbToXyz65_default(color)),
1615
+ xyz65: convertXyz65ToP3_default
1616
+ },
1617
+ toMode: {
1618
+ rgb: (color) => convertXyz65ToRgb_default(convertP3ToXyz65_default(color)),
1619
+ xyz65: convertP3ToXyz65_default
1620
+ }
1621
+ };
1622
+ var definition_default9 = definition9;
1623
+
1624
+ // node_modules/culori/src/prophoto/convertXyz50ToProphoto.js
1625
+ var gamma2 = (v) => {
1626
+ let abs = Math.abs(v);
1627
+ if (abs >= 1 / 512) {
1628
+ return Math.sign(v) * Math.pow(abs, 1 / 1.8);
1629
+ }
1630
+ return 16 * v;
1631
+ };
1632
+ var convertXyz50ToProphoto = ({ x, y, z, alpha }) => {
1633
+ if (x === void 0) x = 0;
1634
+ if (y === void 0) y = 0;
1635
+ if (z === void 0) z = 0;
1636
+ let res = {
1637
+ mode: "prophoto",
1638
+ r: gamma2(
1639
+ x * 1.3457868816471585 - y * 0.2555720873797946 - 0.0511018649755453 * z
1640
+ ),
1641
+ g: gamma2(
1642
+ x * -0.5446307051249019 + y * 1.5082477428451466 + 0.0205274474364214 * z
1643
+ ),
1644
+ b: gamma2(x * 0 + y * 0 + 1.2119675456389452 * z)
1645
+ };
1646
+ if (alpha !== void 0) {
1647
+ res.alpha = alpha;
1648
+ }
1649
+ return res;
1650
+ };
1651
+ var convertXyz50ToProphoto_default = convertXyz50ToProphoto;
1652
+
1653
+ // node_modules/culori/src/prophoto/convertProphotoToXyz50.js
1654
+ var linearize2 = (v = 0) => {
1655
+ let abs = Math.abs(v);
1656
+ if (abs >= 16 / 512) {
1657
+ return Math.sign(v) * Math.pow(abs, 1.8);
1658
+ }
1659
+ return v / 16;
1660
+ };
1661
+ var convertProphotoToXyz50 = (prophoto) => {
1662
+ let r = linearize2(prophoto.r);
1663
+ let g = linearize2(prophoto.g);
1664
+ let b = linearize2(prophoto.b);
1665
+ let res = {
1666
+ mode: "xyz50",
1667
+ x: 0.7977666449006423 * r + 0.1351812974005331 * g + 0.0313477341283922 * b,
1668
+ y: 0.2880748288194013 * r + 0.7118352342418731 * g + 899369387256e-16 * b,
1669
+ z: 0 * r + 0 * g + 0.8251046025104602 * b
1670
+ };
1671
+ if (prophoto.alpha !== void 0) {
1672
+ res.alpha = prophoto.alpha;
1673
+ }
1674
+ return res;
1675
+ };
1676
+ var convertProphotoToXyz50_default = convertProphotoToXyz50;
1677
+
1678
+ // node_modules/culori/src/prophoto/definition.js
1679
+ var definition10 = {
1680
+ ...definition_default,
1681
+ mode: "prophoto",
1682
+ parse: ["prophoto-rgb"],
1683
+ serialize: "prophoto-rgb",
1684
+ fromMode: {
1685
+ xyz50: convertXyz50ToProphoto_default,
1686
+ rgb: (color) => convertXyz50ToProphoto_default(convertRgbToXyz50_default(color))
1687
+ },
1688
+ toMode: {
1689
+ xyz50: convertProphotoToXyz50_default,
1690
+ rgb: (color) => convertXyz50ToRgb_default(convertProphotoToXyz50_default(color))
1691
+ }
1692
+ };
1693
+ var definition_default10 = definition10;
1694
+
1695
+ // node_modules/culori/src/rec2020/convertXyz65ToRec2020.js
1696
+ var \u03B1 = 1.09929682680944;
1697
+ var \u03B2 = 0.018053968510807;
1698
+ var gamma3 = (v) => {
1699
+ const abs = Math.abs(v);
1700
+ if (abs > \u03B2) {
1701
+ return (Math.sign(v) || 1) * (\u03B1 * Math.pow(abs, 0.45) - (\u03B1 - 1));
1702
+ }
1703
+ return 4.5 * v;
1704
+ };
1705
+ var convertXyz65ToRec2020 = ({ x, y, z, alpha }) => {
1706
+ if (x === void 0) x = 0;
1707
+ if (y === void 0) y = 0;
1708
+ if (z === void 0) z = 0;
1709
+ let res = {
1710
+ mode: "rec2020",
1711
+ r: gamma3(
1712
+ x * 1.7166511879712683 - y * 0.3556707837763925 - 0.2533662813736599 * z
1713
+ ),
1714
+ g: gamma3(
1715
+ x * -0.6666843518324893 + y * 1.6164812366349395 + 0.0157685458139111 * z
1716
+ ),
1717
+ b: gamma3(
1718
+ x * 0.0176398574453108 - y * 0.0427706132578085 + 0.9421031212354739 * z
1719
+ )
1720
+ };
1721
+ if (alpha !== void 0) {
1722
+ res.alpha = alpha;
1723
+ }
1724
+ return res;
1725
+ };
1726
+ var convertXyz65ToRec2020_default = convertXyz65ToRec2020;
1727
+
1728
+ // node_modules/culori/src/rec2020/convertRec2020ToXyz65.js
1729
+ var \u03B12 = 1.09929682680944;
1730
+ var \u03B22 = 0.018053968510807;
1731
+ var linearize3 = (v = 0) => {
1732
+ let abs = Math.abs(v);
1733
+ if (abs < \u03B22 * 4.5) {
1734
+ return v / 4.5;
1735
+ }
1736
+ return (Math.sign(v) || 1) * Math.pow((abs + \u03B12 - 1) / \u03B12, 1 / 0.45);
1737
+ };
1738
+ var convertRec2020ToXyz65 = (rec2020) => {
1739
+ let r = linearize3(rec2020.r);
1740
+ let g = linearize3(rec2020.g);
1741
+ let b = linearize3(rec2020.b);
1742
+ let res = {
1743
+ mode: "xyz65",
1744
+ x: 0.6369580483012911 * r + 0.1446169035862083 * g + 0.1688809751641721 * b,
1745
+ y: 0.262700212011267 * r + 0.6779980715188708 * g + 0.059301716469862 * b,
1746
+ z: 0 * r + 0.0280726930490874 * g + 1.0609850577107909 * b
1747
+ };
1748
+ if (rec2020.alpha !== void 0) {
1749
+ res.alpha = rec2020.alpha;
1750
+ }
1751
+ return res;
1752
+ };
1753
+ var convertRec2020ToXyz65_default = convertRec2020ToXyz65;
1754
+
1755
+ // node_modules/culori/src/rec2020/definition.js
1756
+ var definition11 = {
1757
+ ...definition_default,
1758
+ mode: "rec2020",
1759
+ fromMode: {
1760
+ xyz65: convertXyz65ToRec2020_default,
1761
+ rgb: (color) => convertXyz65ToRec2020_default(convertRgbToXyz65_default(color))
1762
+ },
1763
+ toMode: {
1764
+ xyz65: convertRec2020ToXyz65_default,
1765
+ rgb: (color) => convertXyz65ToRgb_default(convertRec2020ToXyz65_default(color))
1766
+ },
1767
+ parse: ["rec2020"],
1768
+ serialize: "rec2020"
1769
+ };
1770
+ var definition_default11 = definition11;
1771
+
1772
+ // node_modules/culori/src/xyz50/definition.js
1773
+ var definition12 = {
1774
+ mode: "xyz50",
1775
+ parse: ["xyz-d50"],
1776
+ serialize: "xyz-d50",
1777
+ toMode: {
1778
+ rgb: convertXyz50ToRgb_default,
1779
+ lab: convertXyz50ToLab_default
1780
+ },
1781
+ fromMode: {
1782
+ rgb: convertRgbToXyz50_default,
1783
+ lab: convertLabToXyz50_default
1784
+ },
1785
+ channels: ["x", "y", "z", "alpha"],
1786
+ ranges: {
1787
+ x: [0, 0.964],
1788
+ y: [0, 0.999],
1789
+ z: [0, 0.825]
1790
+ },
1791
+ interpolate: {
1792
+ x: interpolatorLinear,
1793
+ y: interpolatorLinear,
1794
+ z: interpolatorLinear,
1795
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1796
+ }
1797
+ };
1798
+ var definition_default12 = definition12;
1799
+
1800
+ // node_modules/culori/src/xyz65/convertXyz65ToXyz50.js
1801
+ var convertXyz65ToXyz50 = (xyz65) => {
1802
+ let { x, y, z, alpha } = xyz65;
1803
+ if (x === void 0) x = 0;
1804
+ if (y === void 0) y = 0;
1805
+ if (z === void 0) z = 0;
1806
+ let res = {
1807
+ mode: "xyz50",
1808
+ x: 1.0479298208405488 * x + 0.0229467933410191 * y - 0.0501922295431356 * z,
1809
+ y: 0.0296278156881593 * x + 0.990434484573249 * y - 0.0170738250293851 * z,
1810
+ z: -0.0092430581525912 * x + 0.0150551448965779 * y + 0.7518742899580008 * z
1811
+ };
1812
+ if (alpha !== void 0) {
1813
+ res.alpha = alpha;
1814
+ }
1815
+ return res;
1816
+ };
1817
+ var convertXyz65ToXyz50_default = convertXyz65ToXyz50;
1818
+
1819
+ // node_modules/culori/src/xyz65/convertXyz50ToXyz65.js
1820
+ var convertXyz50ToXyz65 = (xyz50) => {
1821
+ let { x, y, z, alpha } = xyz50;
1822
+ if (x === void 0) x = 0;
1823
+ if (y === void 0) y = 0;
1824
+ if (z === void 0) z = 0;
1825
+ let res = {
1826
+ mode: "xyz65",
1827
+ x: 0.9554734527042182 * x - 0.0230985368742614 * y + 0.0632593086610217 * z,
1828
+ y: -0.0283697069632081 * x + 1.0099954580058226 * y + 0.021041398966943 * z,
1829
+ z: 0.0123140016883199 * x - 0.0205076964334779 * y + 1.3303659366080753 * z
1830
+ };
1831
+ if (alpha !== void 0) {
1832
+ res.alpha = alpha;
1833
+ }
1834
+ return res;
1835
+ };
1836
+ var convertXyz50ToXyz65_default = convertXyz50ToXyz65;
1837
+
1838
+ // node_modules/culori/src/xyz65/definition.js
1839
+ var definition13 = {
1840
+ mode: "xyz65",
1841
+ toMode: {
1842
+ rgb: convertXyz65ToRgb_default,
1843
+ xyz50: convertXyz65ToXyz50_default
1844
+ },
1845
+ fromMode: {
1846
+ rgb: convertRgbToXyz65_default,
1847
+ xyz50: convertXyz50ToXyz65_default
1848
+ },
1849
+ ranges: {
1850
+ x: [0, 0.95],
1851
+ y: [0, 1],
1852
+ z: [0, 1.088]
1853
+ },
1854
+ channels: ["x", "y", "z", "alpha"],
1855
+ parse: ["xyz", "xyz-d65"],
1856
+ serialize: "xyz-d65",
1857
+ interpolate: {
1858
+ x: interpolatorLinear,
1859
+ y: interpolatorLinear,
1860
+ z: interpolatorLinear,
1861
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1862
+ }
1863
+ };
1864
+ var definition_default13 = definition13;
1865
+
1866
+ // src/color-contrast.js
1867
+ [
1868
+ definition_default,
1869
+ definition_default3,
1870
+ definition_default4,
1871
+ definition_default5,
1872
+ definition_default7,
1873
+ definition_default8,
1874
+ definition_default9,
1875
+ definition_default2,
1876
+ definition_default10,
1877
+ definition_default11,
1878
+ definition_default6,
1879
+ definition_default12,
1880
+ definition_default13
1881
+ ].forEach(useMode);
1882
+ var toRgb = converter_default("rgb");
1883
+ var BLACK = { r: 0, g: 0, b: 0, a: 1 };
1884
+ var WHITE = { r: 255, g: 255, b: 255, a: 1 };
1885
+ var LARGE_TEXT_MIN_PX = 18 * (96 / 72);
1886
+ var LARGE_BOLD_TEXT_MIN_PX = 14 * (96 / 72);
1887
+ var WCAG_THRESHOLDS = {
1888
+ AA: { normal: 4.5, large: 3 },
1889
+ AAA: { normal: 7, large: 4.5 }
1890
+ };
1891
+ var clamp = (value, minimum = 0, maximum = 1) => Math.min(maximum, Math.max(minimum, value));
1892
+ function parseColor(value) {
1893
+ if (typeof value !== "string") return null;
1894
+ const parsed = parse_default(value.trim());
1895
+ if (!parsed) return null;
1896
+ const rgb = toRgb(parsed);
1897
+ if (!rgb || ![rgb.r, rgb.g, rgb.b].every(Number.isFinite)) return null;
1898
+ return {
1899
+ r: clamp(rgb.r) * 255,
1900
+ g: clamp(rgb.g) * 255,
1901
+ b: clamp(rgb.b) * 255,
1902
+ a: clamp(rgb.alpha ?? 1)
1903
+ };
1904
+ }
1905
+ function requireColor(value, label = "color") {
1906
+ const parsed = typeof value === "string" ? parseColor(value) : value;
1907
+ const validChannels = parsed !== null && typeof parsed === "object" && [parsed.r, parsed.g, parsed.b, parsed.a].every(Number.isFinite) && parsed.r >= 0 && parsed.r <= 255 && parsed.g >= 0 && parsed.g <= 255 && parsed.b >= 0 && parsed.b <= 255 && parsed.a >= 0 && parsed.a <= 1;
1908
+ if (!validChannels) throw new TypeError(`Unsupported ${label}: ${value}`);
1909
+ return parsed;
1910
+ }
1911
+ function composite(foreground, background) {
1912
+ const alpha = foreground.a + background.a * (1 - foreground.a);
1913
+ if (alpha === 0) return { r: 0, g: 0, b: 0, a: 0 };
1914
+ const channel = (name) => (foreground[name] * foreground.a + background[name] * background.a * (1 - foreground.a)) / alpha;
1915
+ return { r: channel("r"), g: channel("g"), b: channel("b"), a: alpha };
1916
+ }
1917
+ function opaqueFallback(value) {
1918
+ const fallback = requireColor(value, "fallback color");
1919
+ if (fallback.a !== 1) {
1920
+ throw new TypeError(`Fallback color must be opaque: ${value}`);
1921
+ }
1922
+ return fallback;
1923
+ }
1924
+ function resolveColor(value, fallback = "#fff") {
1925
+ const color = requireColor(value);
1926
+ return color.a < 1 ? composite(color, opaqueFallback(fallback)) : color;
1927
+ }
1928
+ function linearize4(channel) {
1929
+ const value = channel / 255;
1930
+ return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;
1931
+ }
1932
+ function luminance({ r, g, b }) {
1933
+ return 0.2126 * linearize4(r) + 0.7152 * linearize4(g) + 0.0722 * linearize4(b);
1934
+ }
1935
+ function ratioFromColors(first, second) {
1936
+ const firstLuminance = luminance(first);
1937
+ const secondLuminance = luminance(second);
1938
+ const lighter = Math.max(firstLuminance, secondLuminance);
1939
+ const darker = Math.min(firstLuminance, secondLuminance);
1940
+ return (lighter + 0.05) / (darker + 0.05);
1941
+ }
1942
+ function compliance(ratio) {
1943
+ return {
1944
+ aa: ratio >= WCAG_THRESHOLDS.AA.normal,
1945
+ aaLarge: ratio >= WCAG_THRESHOLDS.AA.large,
1946
+ aaa: ratio >= WCAG_THRESHOLDS.AAA.normal,
1947
+ aaaLarge: ratio >= WCAG_THRESHOLDS.AAA.large
1948
+ };
1949
+ }
1950
+ function contrastThreshold(level, textSize) {
1951
+ if (typeof level !== "string" || typeof textSize !== "string") {
1952
+ throw new TypeError("Expected AA or AAA and normal or large text");
1953
+ }
1954
+ const normalizedLevel = level.toUpperCase();
1955
+ const normalizedTextSize = textSize.toLowerCase();
1956
+ const threshold = WCAG_THRESHOLDS[normalizedLevel]?.[normalizedTextSize];
1957
+ if (threshold === void 0) {
1958
+ throw new TypeError("Expected AA or AAA and normal or large text");
1959
+ }
1960
+ return threshold;
1961
+ }
1962
+ function cssColor({ r, g, b, a }) {
1963
+ const channels = `${Math.round(r)}, ${Math.round(g)}, ${Math.round(b)}`;
1964
+ return a < 1 ? `rgba(${channels}, ${Number(a.toFixed(4))})` : `rgb(${channels})`;
1965
+ }
1966
+ function compositeColors(foreground, background) {
1967
+ return cssColor(
1968
+ composite(requireColor(foreground), requireColor(background))
1969
+ );
1970
+ }
1971
+ function contrastRatio(foreground, background, { fallback = "#fff" } = {}) {
1972
+ const resolvedBackground = resolveColor(background, fallback);
1973
+ const parsedForeground = requireColor(foreground, "foreground color");
1974
+ const resolvedForeground = parsedForeground.a < 1 ? composite(parsedForeground, resolvedBackground) : parsedForeground;
1975
+ return ratioFromColors(resolvedForeground, resolvedBackground);
1976
+ }
1977
+ function analyzeColor(color, { fallback = "#fff" } = {}) {
1978
+ const resolved = resolveColor(color, fallback);
1979
+ const contrastWithBlack = ratioFromColors(resolved, BLACK);
1980
+ const contrastWithWhite = ratioFromColors(resolved, WHITE);
1981
+ const useBlack = contrastWithBlack >= contrastWithWhite;
1982
+ return {
1983
+ color,
1984
+ resolvedColor: cssColor(resolved),
1985
+ luminance: luminance(resolved),
1986
+ recommendedTextColor: useBlack ? "#000000" : "#FFFFFF",
1987
+ backgroundTone: useBlack ? "light" : "dark",
1988
+ contrastWithBlack,
1989
+ contrastWithWhite,
1990
+ blackText: compliance(contrastWithBlack),
1991
+ whiteText: compliance(contrastWithWhite)
1992
+ };
1993
+ }
1994
+ function backgroundTone(color, options) {
1995
+ return analyzeColor(color, options).backgroundTone;
1996
+ }
1997
+ function bestTextColor(background, candidates = ["#000000", "#FFFFFF"], options) {
1998
+ if (!Array.isArray(candidates) || candidates.length === 0) {
1999
+ throw new TypeError("Candidates must be a non-empty array of colors");
2000
+ }
2001
+ return candidates.reduce((best, candidate) => {
2002
+ const ratio = contrastRatio(candidate, background, options);
2003
+ return !best || ratio > best.ratio ? { color: candidate, ratio } : best;
2004
+ }, null).color;
2005
+ }
2006
+ function meetsContrast(foreground, background, { level = "AA", textSize = "normal", fallback = "#fff" } = {}) {
2007
+ const threshold = contrastThreshold(level, textSize);
2008
+ return contrastRatio(foreground, background, { fallback }) >= threshold;
2009
+ }
2010
+ function analyzePalette(colors, options) {
2011
+ if (!Array.isArray(colors)) throw new TypeError("Palette must be an array");
2012
+ return colors.map((color) => analyzeColor(color, options));
2013
+ }
2014
+ function contrastMatrix(colors, options) {
2015
+ if (!Array.isArray(colors)) throw new TypeError("Palette must be an array");
2016
+ return colors.map(
2017
+ (foreground) => colors.map((background) => contrastRatio(foreground, background, options))
2018
+ );
2019
+ }
2020
+ function styleReaderFor(element) {
2021
+ const view = element.ownerDocument?.defaultView;
2022
+ const getStyle = view?.getComputedStyle ?? globalThis.getComputedStyle;
2023
+ if (typeof getStyle !== "function") {
2024
+ throw new TypeError("getComputedStyle is not available for this element");
2025
+ }
2026
+ return getStyle.bind(view ?? globalThis);
2027
+ }
2028
+ function getBackgroundColor(element, { fallback = "#fff" } = {}) {
2029
+ const getStyle = styleReaderFor(element);
2030
+ const layers = [];
2031
+ let current = element;
2032
+ while (current) {
2033
+ const color = parseColor(getStyle(current).backgroundColor);
2034
+ if (color && color.a > 0) {
2035
+ layers.push(color);
2036
+ if (color.a === 1) break;
2037
+ }
2038
+ current = current.parentElement;
2039
+ }
2040
+ if (!layers.some(({ a }) => a === 1)) layers.push(opaqueFallback(fallback));
2041
+ return cssColor(layers.reverse().reduce(
2042
+ (background, layer) => composite(layer, background)
2043
+ ));
2044
+ }
2045
+ function analyzeElement(element, { fallback = "#fff" } = {}) {
2046
+ const style = styleReaderFor(element)(element);
2047
+ const foregroundColor = style.color;
2048
+ const backgroundColor = getBackgroundColor(element, { fallback });
2049
+ const fontSize = Number.parseFloat(style.fontSize);
2050
+ const numericWeight = Number.parseInt(style.fontWeight, 10);
2051
+ const fontWeight = Number.isFinite(numericWeight) ? numericWeight : style.fontWeight === "bold" || style.fontWeight === "bolder" ? 700 : 400;
2052
+ const isLargeText = fontSize >= LARGE_TEXT_MIN_PX || fontSize >= LARGE_BOLD_TEXT_MIN_PX && fontWeight >= 700;
2053
+ const textSize = isLargeText ? "large" : "normal";
2054
+ const ratio = contrastRatio(foregroundColor, backgroundColor, { fallback });
2055
+ return {
2056
+ foregroundColor,
2057
+ backgroundColor,
2058
+ fontSize,
2059
+ fontWeight,
2060
+ textSize,
2061
+ isLargeText,
2062
+ contrastRatio: ratio,
2063
+ aa: ratio >= contrastThreshold("AA", textSize),
2064
+ aaa: ratio >= contrastThreshold("AAA", textSize)
2065
+ };
2066
+ }
2067
+ function elementsFrom(target, root) {
2068
+ if (typeof target === "string") return [...root.querySelectorAll(target)];
2069
+ if (target?.classList) return [target];
2070
+ if (target?.[Symbol.iterator]) return [...target];
2071
+ throw new TypeError("Expected an element, selector, or iterable of elements");
2072
+ }
2073
+ function applyBackgroundTone(target, {
2074
+ fallback = "#fff",
2075
+ root = globalThis.document,
2076
+ lightClass = "light",
2077
+ darkClass = "dark"
2078
+ } = {}) {
2079
+ if (!root && typeof target === "string") {
2080
+ throw new TypeError("A document or root is required when using a selector");
2081
+ }
2082
+ const elements = elementsFrom(target, root);
2083
+ for (const element of elements) {
2084
+ const result = backgroundTone(getBackgroundColor(element, { fallback }));
2085
+ element.classList.remove(lightClass, darkClass);
2086
+ element.classList.add(result === "light" ? lightClass : darkClass);
2087
+ }
2088
+ return elements;
2089
+ }
2090
+ var colorBrightness = backgroundTone;
2091
+ var colourBrightness = backgroundTone;
2092
+ var analyseColour = analyzeColor;
2093
+ var parseColour = parseColor;
2094
+ var bestTextColour = bestTextColor;
2095
+ var compositeColours = compositeColors;
2096
+ var applyColorBrightness = applyBackgroundTone;
2097
+ var applyColourBrightness = applyBackgroundTone;
2098
+ var getBackgroundColour = getBackgroundColor;
2099
+ var analyseElement = analyzeElement;
2100
+ var analysePalette = analyzePalette;
2101
+ export {
2102
+ analyseColour,
2103
+ analyseElement,
2104
+ analysePalette,
2105
+ analyzeColor,
2106
+ analyzeElement,
2107
+ analyzePalette,
2108
+ applyBackgroundTone,
2109
+ applyColorBrightness,
2110
+ applyColourBrightness,
2111
+ backgroundTone,
2112
+ bestTextColor,
2113
+ bestTextColour,
2114
+ colorBrightness,
2115
+ colourBrightness,
2116
+ compositeColors,
2117
+ compositeColours,
2118
+ contrastMatrix,
2119
+ contrastRatio,
2120
+ getBackgroundColor,
2121
+ getBackgroundColour,
2122
+ meetsContrast,
2123
+ parseColor,
2124
+ parseColour
2125
+ };