@shiinasaku/github-card 4.1.0 → 5.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.
package/dist/lib.js CHANGED
@@ -1,3 +1,3428 @@
1
+ // node_modules/culori/src/rgb/parseNumber.js
2
+ var parseNumber = (color, len) => {
3
+ if (typeof color !== "number")
4
+ return;
5
+ if (len === 3) {
6
+ return {
7
+ mode: "rgb",
8
+ r: (color >> 8 & 15 | color >> 4 & 240) / 255,
9
+ g: (color >> 4 & 15 | color & 240) / 255,
10
+ b: (color & 15 | color << 4 & 240) / 255
11
+ };
12
+ }
13
+ if (len === 4) {
14
+ return {
15
+ mode: "rgb",
16
+ r: (color >> 12 & 15 | color >> 8 & 240) / 255,
17
+ g: (color >> 8 & 15 | color >> 4 & 240) / 255,
18
+ b: (color >> 4 & 15 | color & 240) / 255,
19
+ alpha: (color & 15 | color << 4 & 240) / 255
20
+ };
21
+ }
22
+ if (len === 6) {
23
+ return {
24
+ mode: "rgb",
25
+ r: (color >> 16 & 255) / 255,
26
+ g: (color >> 8 & 255) / 255,
27
+ b: (color & 255) / 255
28
+ };
29
+ }
30
+ if (len === 8) {
31
+ return {
32
+ mode: "rgb",
33
+ r: (color >> 24 & 255) / 255,
34
+ g: (color >> 16 & 255) / 255,
35
+ b: (color >> 8 & 255) / 255,
36
+ alpha: (color & 255) / 255
37
+ };
38
+ }
39
+ };
40
+ var parseNumber_default = parseNumber;
41
+
42
+ // node_modules/culori/src/colors/named.js
43
+ var named = {
44
+ aliceblue: 15792383,
45
+ antiquewhite: 16444375,
46
+ aqua: 65535,
47
+ aquamarine: 8388564,
48
+ azure: 15794175,
49
+ beige: 16119260,
50
+ bisque: 16770244,
51
+ black: 0,
52
+ blanchedalmond: 16772045,
53
+ blue: 255,
54
+ blueviolet: 9055202,
55
+ brown: 10824234,
56
+ burlywood: 14596231,
57
+ cadetblue: 6266528,
58
+ chartreuse: 8388352,
59
+ chocolate: 13789470,
60
+ coral: 16744272,
61
+ cornflowerblue: 6591981,
62
+ cornsilk: 16775388,
63
+ crimson: 14423100,
64
+ cyan: 65535,
65
+ darkblue: 139,
66
+ darkcyan: 35723,
67
+ darkgoldenrod: 12092939,
68
+ darkgray: 11119017,
69
+ darkgreen: 25600,
70
+ darkgrey: 11119017,
71
+ darkkhaki: 12433259,
72
+ darkmagenta: 9109643,
73
+ darkolivegreen: 5597999,
74
+ darkorange: 16747520,
75
+ darkorchid: 10040012,
76
+ darkred: 9109504,
77
+ darksalmon: 15308410,
78
+ darkseagreen: 9419919,
79
+ darkslateblue: 4734347,
80
+ darkslategray: 3100495,
81
+ darkslategrey: 3100495,
82
+ darkturquoise: 52945,
83
+ darkviolet: 9699539,
84
+ deeppink: 16716947,
85
+ deepskyblue: 49151,
86
+ dimgray: 6908265,
87
+ dimgrey: 6908265,
88
+ dodgerblue: 2003199,
89
+ firebrick: 11674146,
90
+ floralwhite: 16775920,
91
+ forestgreen: 2263842,
92
+ fuchsia: 16711935,
93
+ gainsboro: 14474460,
94
+ ghostwhite: 16316671,
95
+ gold: 16766720,
96
+ goldenrod: 14329120,
97
+ gray: 8421504,
98
+ green: 32768,
99
+ greenyellow: 11403055,
100
+ grey: 8421504,
101
+ honeydew: 15794160,
102
+ hotpink: 16738740,
103
+ indianred: 13458524,
104
+ indigo: 4915330,
105
+ ivory: 16777200,
106
+ khaki: 15787660,
107
+ lavender: 15132410,
108
+ lavenderblush: 16773365,
109
+ lawngreen: 8190976,
110
+ lemonchiffon: 16775885,
111
+ lightblue: 11393254,
112
+ lightcoral: 15761536,
113
+ lightcyan: 14745599,
114
+ lightgoldenrodyellow: 16448210,
115
+ lightgray: 13882323,
116
+ lightgreen: 9498256,
117
+ lightgrey: 13882323,
118
+ lightpink: 16758465,
119
+ lightsalmon: 16752762,
120
+ lightseagreen: 2142890,
121
+ lightskyblue: 8900346,
122
+ lightslategray: 7833753,
123
+ lightslategrey: 7833753,
124
+ lightsteelblue: 11584734,
125
+ lightyellow: 16777184,
126
+ lime: 65280,
127
+ limegreen: 3329330,
128
+ linen: 16445670,
129
+ magenta: 16711935,
130
+ maroon: 8388608,
131
+ mediumaquamarine: 6737322,
132
+ mediumblue: 205,
133
+ mediumorchid: 12211667,
134
+ mediumpurple: 9662683,
135
+ mediumseagreen: 3978097,
136
+ mediumslateblue: 8087790,
137
+ mediumspringgreen: 64154,
138
+ mediumturquoise: 4772300,
139
+ mediumvioletred: 13047173,
140
+ midnightblue: 1644912,
141
+ mintcream: 16121850,
142
+ mistyrose: 16770273,
143
+ moccasin: 16770229,
144
+ navajowhite: 16768685,
145
+ navy: 128,
146
+ oldlace: 16643558,
147
+ olive: 8421376,
148
+ olivedrab: 7048739,
149
+ orange: 16753920,
150
+ orangered: 16729344,
151
+ orchid: 14315734,
152
+ palegoldenrod: 15657130,
153
+ palegreen: 10025880,
154
+ paleturquoise: 11529966,
155
+ palevioletred: 14381203,
156
+ papayawhip: 16773077,
157
+ peachpuff: 16767673,
158
+ peru: 13468991,
159
+ pink: 16761035,
160
+ plum: 14524637,
161
+ powderblue: 11591910,
162
+ purple: 8388736,
163
+ rebeccapurple: 6697881,
164
+ red: 16711680,
165
+ rosybrown: 12357519,
166
+ royalblue: 4286945,
167
+ saddlebrown: 9127187,
168
+ salmon: 16416882,
169
+ sandybrown: 16032864,
170
+ seagreen: 3050327,
171
+ seashell: 16774638,
172
+ sienna: 10506797,
173
+ silver: 12632256,
174
+ skyblue: 8900331,
175
+ slateblue: 6970061,
176
+ slategray: 7372944,
177
+ slategrey: 7372944,
178
+ snow: 16775930,
179
+ springgreen: 65407,
180
+ steelblue: 4620980,
181
+ tan: 13808780,
182
+ teal: 32896,
183
+ thistle: 14204888,
184
+ tomato: 16737095,
185
+ turquoise: 4251856,
186
+ violet: 15631086,
187
+ wheat: 16113331,
188
+ white: 16777215,
189
+ whitesmoke: 16119285,
190
+ yellow: 16776960,
191
+ yellowgreen: 10145074
192
+ };
193
+ var named_default = named;
194
+
195
+ // node_modules/culori/src/rgb/parseNamed.js
196
+ var parseNamed = (color) => {
197
+ return parseNumber_default(named_default[color.toLowerCase()], 6);
198
+ };
199
+ var parseNamed_default = parseNamed;
200
+
201
+ // node_modules/culori/src/rgb/parseHex.js
202
+ var hex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;
203
+ var parseHex = (color) => {
204
+ let match;
205
+ return (match = color.match(hex)) ? parseNumber_default(parseInt(match[1], 16), match[1].length) : undefined;
206
+ };
207
+ var parseHex_default = parseHex;
208
+
209
+ // node_modules/culori/src/util/regex.js
210
+ var num = "([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)";
211
+ var num_none = `(?:${num}|none)`;
212
+ var per = `${num}%`;
213
+ var per_none = `(?:${num}%|none)`;
214
+ var num_per = `(?:${num}%|${num})`;
215
+ var num_per_none = `(?:${num}%|${num}|none)`;
216
+ var hue = `(?:${num}(deg|grad|rad|turn)|${num})`;
217
+ var hue_none = `(?:${num}(deg|grad|rad|turn)|${num}|none)`;
218
+ var c = `\\s*,\\s*`;
219
+ var rx_num_per_none = new RegExp("^" + num_per_none + "$");
220
+
221
+ // node_modules/culori/src/rgb/parseRgbLegacy.js
222
+ var rgb_num_old = new RegExp(`^rgba?\\(\\s*${num}${c}${num}${c}${num}\\s*(?:,\\s*${num_per}\\s*)?\\)$`);
223
+ var rgb_per_old = new RegExp(`^rgba?\\(\\s*${per}${c}${per}${c}${per}\\s*(?:,\\s*${num_per}\\s*)?\\)$`);
224
+ var parseRgbLegacy = (color) => {
225
+ let res = { mode: "rgb" };
226
+ let match;
227
+ if (match = color.match(rgb_num_old)) {
228
+ if (match[1] !== undefined) {
229
+ res.r = match[1] / 255;
230
+ }
231
+ if (match[2] !== undefined) {
232
+ res.g = match[2] / 255;
233
+ }
234
+ if (match[3] !== undefined) {
235
+ res.b = match[3] / 255;
236
+ }
237
+ } else if (match = color.match(rgb_per_old)) {
238
+ if (match[1] !== undefined) {
239
+ res.r = match[1] / 100;
240
+ }
241
+ if (match[2] !== undefined) {
242
+ res.g = match[2] / 100;
243
+ }
244
+ if (match[3] !== undefined) {
245
+ res.b = match[3] / 100;
246
+ }
247
+ } else {
248
+ return;
249
+ }
250
+ if (match[4] !== undefined) {
251
+ res.alpha = Math.max(0, Math.min(1, match[4] / 100));
252
+ } else if (match[5] !== undefined) {
253
+ res.alpha = Math.max(0, Math.min(1, +match[5]));
254
+ }
255
+ return res;
256
+ };
257
+ var parseRgbLegacy_default = parseRgbLegacy;
258
+
259
+ // node_modules/culori/src/_prepare.js
260
+ var prepare = (color, mode) => color === undefined ? undefined : typeof color !== "object" ? parse_default(color) : color.mode !== undefined ? color : mode ? { ...color, mode } : undefined;
261
+ var _prepare_default = prepare;
262
+
263
+ // node_modules/culori/src/converter.js
264
+ var converter = (target_mode = "rgb") => (color) => (color = _prepare_default(color, target_mode)) !== undefined ? color.mode === target_mode ? color : converters[color.mode][target_mode] ? converters[color.mode][target_mode](color) : target_mode === "rgb" ? converters[color.mode].rgb(color) : converters.rgb[target_mode](converters[color.mode].rgb(color)) : undefined;
265
+ var converter_default = converter;
266
+
267
+ // node_modules/culori/src/modes.js
268
+ var converters = {};
269
+ var modes = {};
270
+ var parsers = [];
271
+ var colorProfiles = {};
272
+ var identity = (v) => v;
273
+ var useMode = (definition) => {
274
+ converters[definition.mode] = {
275
+ ...converters[definition.mode],
276
+ ...definition.toMode
277
+ };
278
+ Object.keys(definition.fromMode || {}).forEach((k) => {
279
+ if (!converters[k]) {
280
+ converters[k] = {};
281
+ }
282
+ converters[k][definition.mode] = definition.fromMode[k];
283
+ });
284
+ if (!definition.ranges) {
285
+ definition.ranges = {};
286
+ }
287
+ if (!definition.difference) {
288
+ definition.difference = {};
289
+ }
290
+ definition.channels.forEach((channel) => {
291
+ if (definition.ranges[channel] === undefined) {
292
+ definition.ranges[channel] = [0, 1];
293
+ }
294
+ if (!definition.interpolate[channel]) {
295
+ throw new Error(`Missing interpolator for: ${channel}`);
296
+ }
297
+ if (typeof definition.interpolate[channel] === "function") {
298
+ definition.interpolate[channel] = {
299
+ use: definition.interpolate[channel]
300
+ };
301
+ }
302
+ if (!definition.interpolate[channel].fixup) {
303
+ definition.interpolate[channel].fixup = identity;
304
+ }
305
+ });
306
+ modes[definition.mode] = definition;
307
+ (definition.parse || []).forEach((parser) => {
308
+ useParser(parser, definition.mode);
309
+ });
310
+ return converter_default(definition.mode);
311
+ };
312
+ var getMode = (mode) => modes[mode];
313
+ var useParser = (parser, mode) => {
314
+ if (typeof parser === "string") {
315
+ if (!mode) {
316
+ throw new Error(`'mode' required when 'parser' is a string`);
317
+ }
318
+ colorProfiles[parser] = mode;
319
+ } else if (typeof parser === "function") {
320
+ if (parsers.indexOf(parser) < 0) {
321
+ parsers.push(parser);
322
+ }
323
+ }
324
+ };
325
+
326
+ // node_modules/culori/src/parse.js
327
+ var IdentStartCodePoint = /[^\x00-\x7F]|[a-zA-Z_]/;
328
+ var IdentCodePoint = /[^\x00-\x7F]|[-\w]/;
329
+ var Tok = {
330
+ Function: "function",
331
+ Ident: "ident",
332
+ Number: "number",
333
+ Percentage: "percentage",
334
+ ParenClose: ")",
335
+ None: "none",
336
+ Hue: "hue",
337
+ Alpha: "alpha"
338
+ };
339
+ var _i = 0;
340
+ function is_num(chars) {
341
+ let ch = chars[_i];
342
+ let ch1 = chars[_i + 1];
343
+ if (ch === "-" || ch === "+") {
344
+ return /\d/.test(ch1) || ch1 === "." && /\d/.test(chars[_i + 2]);
345
+ }
346
+ if (ch === ".") {
347
+ return /\d/.test(ch1);
348
+ }
349
+ return /\d/.test(ch);
350
+ }
351
+ function is_ident(chars) {
352
+ if (_i >= chars.length) {
353
+ return false;
354
+ }
355
+ let ch = chars[_i];
356
+ if (IdentStartCodePoint.test(ch)) {
357
+ return true;
358
+ }
359
+ if (ch === "-") {
360
+ if (chars.length - _i < 2) {
361
+ return false;
362
+ }
363
+ let ch1 = chars[_i + 1];
364
+ if (ch1 === "-" || IdentStartCodePoint.test(ch1)) {
365
+ return true;
366
+ }
367
+ return false;
368
+ }
369
+ return false;
370
+ }
371
+ var huenits = {
372
+ deg: 1,
373
+ rad: 180 / Math.PI,
374
+ grad: 9 / 10,
375
+ turn: 360
376
+ };
377
+ function num2(chars) {
378
+ let value = "";
379
+ if (chars[_i] === "-" || chars[_i] === "+") {
380
+ value += chars[_i++];
381
+ }
382
+ value += digits(chars);
383
+ if (chars[_i] === "." && /\d/.test(chars[_i + 1])) {
384
+ value += chars[_i++] + digits(chars);
385
+ }
386
+ if (chars[_i] === "e" || chars[_i] === "E") {
387
+ if ((chars[_i + 1] === "-" || chars[_i + 1] === "+") && /\d/.test(chars[_i + 2])) {
388
+ value += chars[_i++] + chars[_i++] + digits(chars);
389
+ } else if (/\d/.test(chars[_i + 1])) {
390
+ value += chars[_i++] + digits(chars);
391
+ }
392
+ }
393
+ if (is_ident(chars)) {
394
+ let id = ident(chars);
395
+ if (id === "deg" || id === "rad" || id === "turn" || id === "grad") {
396
+ return { type: Tok.Hue, value: value * huenits[id] };
397
+ }
398
+ return;
399
+ }
400
+ if (chars[_i] === "%") {
401
+ _i++;
402
+ return { type: Tok.Percentage, value: +value };
403
+ }
404
+ return { type: Tok.Number, value: +value };
405
+ }
406
+ function digits(chars) {
407
+ let v = "";
408
+ while (/\d/.test(chars[_i])) {
409
+ v += chars[_i++];
410
+ }
411
+ return v;
412
+ }
413
+ function ident(chars) {
414
+ let v = "";
415
+ while (_i < chars.length && IdentCodePoint.test(chars[_i])) {
416
+ v += chars[_i++];
417
+ }
418
+ return v;
419
+ }
420
+ function identlike(chars) {
421
+ let v = ident(chars);
422
+ if (chars[_i] === "(") {
423
+ _i++;
424
+ return { type: Tok.Function, value: v };
425
+ }
426
+ if (v === "none") {
427
+ return { type: Tok.None, value: undefined };
428
+ }
429
+ return { type: Tok.Ident, value: v };
430
+ }
431
+ function tokenize(str = "") {
432
+ let chars = str.trim();
433
+ let tokens = [];
434
+ let ch;
435
+ _i = 0;
436
+ while (_i < chars.length) {
437
+ ch = chars[_i++];
438
+ if (ch === `
439
+ ` || ch === "\t" || ch === " ") {
440
+ while (_i < chars.length && (chars[_i] === `
441
+ ` || chars[_i] === "\t" || chars[_i] === " ")) {
442
+ _i++;
443
+ }
444
+ continue;
445
+ }
446
+ if (ch === ",") {
447
+ return;
448
+ }
449
+ if (ch === ")") {
450
+ tokens.push({ type: Tok.ParenClose });
451
+ continue;
452
+ }
453
+ if (ch === "+") {
454
+ _i--;
455
+ if (is_num(chars)) {
456
+ tokens.push(num2(chars));
457
+ continue;
458
+ }
459
+ return;
460
+ }
461
+ if (ch === "-") {
462
+ _i--;
463
+ if (is_num(chars)) {
464
+ tokens.push(num2(chars));
465
+ continue;
466
+ }
467
+ if (is_ident(chars)) {
468
+ tokens.push({ type: Tok.Ident, value: ident(chars) });
469
+ continue;
470
+ }
471
+ return;
472
+ }
473
+ if (ch === ".") {
474
+ _i--;
475
+ if (is_num(chars)) {
476
+ tokens.push(num2(chars));
477
+ continue;
478
+ }
479
+ return;
480
+ }
481
+ if (ch === "/") {
482
+ while (_i < chars.length && (chars[_i] === `
483
+ ` || chars[_i] === "\t" || chars[_i] === " ")) {
484
+ _i++;
485
+ }
486
+ let alpha;
487
+ if (is_num(chars)) {
488
+ alpha = num2(chars);
489
+ if (alpha.type !== Tok.Hue) {
490
+ tokens.push({ type: Tok.Alpha, value: alpha });
491
+ continue;
492
+ }
493
+ }
494
+ if (is_ident(chars)) {
495
+ if (ident(chars) === "none") {
496
+ tokens.push({
497
+ type: Tok.Alpha,
498
+ value: { type: Tok.None, value: undefined }
499
+ });
500
+ continue;
501
+ }
502
+ }
503
+ return;
504
+ }
505
+ if (/\d/.test(ch)) {
506
+ _i--;
507
+ tokens.push(num2(chars));
508
+ continue;
509
+ }
510
+ if (IdentStartCodePoint.test(ch)) {
511
+ _i--;
512
+ tokens.push(identlike(chars));
513
+ continue;
514
+ }
515
+ return;
516
+ }
517
+ return tokens;
518
+ }
519
+ function parseColorSyntax(tokens) {
520
+ tokens._i = 0;
521
+ let token = tokens[tokens._i++];
522
+ if (!token || token.type !== Tok.Function || token.value !== "color") {
523
+ return;
524
+ }
525
+ token = tokens[tokens._i++];
526
+ if (token.type !== Tok.Ident) {
527
+ return;
528
+ }
529
+ const mode = colorProfiles[token.value];
530
+ if (!mode) {
531
+ return;
532
+ }
533
+ const res = { mode };
534
+ const coords = consumeCoords(tokens, false);
535
+ if (!coords) {
536
+ return;
537
+ }
538
+ const channels = getMode(mode).channels;
539
+ for (let ii = 0, c, ch;ii < channels.length; ii++) {
540
+ c = coords[ii];
541
+ ch = channels[ii];
542
+ if (c.type !== Tok.None) {
543
+ res[ch] = c.type === Tok.Number ? c.value : c.value / 100;
544
+ if (ch === "alpha") {
545
+ res[ch] = Math.max(0, Math.min(1, res[ch]));
546
+ }
547
+ }
548
+ }
549
+ return res;
550
+ }
551
+ function consumeCoords(tokens, includeHue) {
552
+ const coords = [];
553
+ let token;
554
+ while (tokens._i < tokens.length) {
555
+ token = tokens[tokens._i++];
556
+ if (token.type === Tok.None || token.type === Tok.Number || token.type === Tok.Alpha || token.type === Tok.Percentage || includeHue && token.type === Tok.Hue) {
557
+ coords.push(token);
558
+ continue;
559
+ }
560
+ if (token.type === Tok.ParenClose) {
561
+ if (tokens._i < tokens.length) {
562
+ return;
563
+ }
564
+ continue;
565
+ }
566
+ return;
567
+ }
568
+ if (coords.length < 3 || coords.length > 4) {
569
+ return;
570
+ }
571
+ if (coords.length === 4) {
572
+ if (coords[3].type !== Tok.Alpha) {
573
+ return;
574
+ }
575
+ coords[3] = coords[3].value;
576
+ }
577
+ if (coords.length === 3) {
578
+ coords.push({ type: Tok.None, value: undefined });
579
+ }
580
+ return coords.every((c) => c.type !== Tok.Alpha) ? coords : undefined;
581
+ }
582
+ function parseModernSyntax(tokens, includeHue) {
583
+ tokens._i = 0;
584
+ let token = tokens[tokens._i++];
585
+ if (!token || token.type !== Tok.Function) {
586
+ return;
587
+ }
588
+ let coords = consumeCoords(tokens, includeHue);
589
+ if (!coords) {
590
+ return;
591
+ }
592
+ coords.unshift(token.value);
593
+ return coords;
594
+ }
595
+ var parse = (color) => {
596
+ if (typeof color !== "string") {
597
+ return;
598
+ }
599
+ const tokens = tokenize(color);
600
+ const parsed = tokens ? parseModernSyntax(tokens, true) : undefined;
601
+ let result = undefined;
602
+ let i = 0;
603
+ let len = parsers.length;
604
+ while (i < len) {
605
+ if ((result = parsers[i++](color, parsed)) !== undefined) {
606
+ return result;
607
+ }
608
+ }
609
+ return tokens ? parseColorSyntax(tokens) : undefined;
610
+ };
611
+ var parse_default = parse;
612
+
613
+ // node_modules/culori/src/rgb/parseRgb.js
614
+ function parseRgb(color, parsed) {
615
+ if (!parsed || parsed[0] !== "rgb" && parsed[0] !== "rgba") {
616
+ return;
617
+ }
618
+ const res = { mode: "rgb" };
619
+ const [, r, g, b, alpha] = parsed;
620
+ if (r.type === Tok.Hue || g.type === Tok.Hue || b.type === Tok.Hue) {
621
+ return;
622
+ }
623
+ if (r.type !== Tok.None) {
624
+ res.r = r.type === Tok.Number ? r.value / 255 : r.value / 100;
625
+ }
626
+ if (g.type !== Tok.None) {
627
+ res.g = g.type === Tok.Number ? g.value / 255 : g.value / 100;
628
+ }
629
+ if (b.type !== Tok.None) {
630
+ res.b = b.type === Tok.Number ? b.value / 255 : b.value / 100;
631
+ }
632
+ if (alpha.type !== Tok.None) {
633
+ res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
634
+ }
635
+ return res;
636
+ }
637
+ var parseRgb_default = parseRgb;
638
+
639
+ // node_modules/culori/src/rgb/parseTransparent.js
640
+ var parseTransparent = (c) => c === "transparent" ? { mode: "rgb", r: 0, g: 0, b: 0, alpha: 0 } : undefined;
641
+ var parseTransparent_default = parseTransparent;
642
+
643
+ // node_modules/culori/src/interpolate/lerp.js
644
+ var lerp = (a, b, t) => a + t * (b - a);
645
+
646
+ // node_modules/culori/src/interpolate/piecewise.js
647
+ var get_classes = (arr) => {
648
+ let classes = [];
649
+ for (let i = 0;i < arr.length - 1; i++) {
650
+ let a = arr[i];
651
+ let b = arr[i + 1];
652
+ if (a === undefined && b === undefined) {
653
+ classes.push(undefined);
654
+ } else if (a !== undefined && b !== undefined) {
655
+ classes.push([a, b]);
656
+ } else {
657
+ classes.push(a !== undefined ? [a, a] : [b, b]);
658
+ }
659
+ }
660
+ return classes;
661
+ };
662
+ var interpolatorPiecewise = (interpolator) => (arr) => {
663
+ let classes = get_classes(arr);
664
+ return (t) => {
665
+ let cls = t * classes.length;
666
+ let idx = t >= 1 ? classes.length - 1 : Math.max(Math.floor(cls), 0);
667
+ let pair = classes[idx];
668
+ return pair === undefined ? undefined : interpolator(pair[0], pair[1], cls - idx);
669
+ };
670
+ };
671
+
672
+ // node_modules/culori/src/interpolate/linear.js
673
+ var interpolatorLinear = interpolatorPiecewise(lerp);
674
+
675
+ // node_modules/culori/src/fixup/alpha.js
676
+ var fixupAlpha = (arr) => {
677
+ let some_defined = false;
678
+ let res = arr.map((v) => {
679
+ if (v !== undefined) {
680
+ some_defined = true;
681
+ return v;
682
+ }
683
+ return 1;
684
+ });
685
+ return some_defined ? res : arr;
686
+ };
687
+
688
+ // node_modules/culori/src/rgb/definition.js
689
+ var definition = {
690
+ mode: "rgb",
691
+ channels: ["r", "g", "b", "alpha"],
692
+ parse: [
693
+ parseRgb_default,
694
+ parseHex_default,
695
+ parseRgbLegacy_default,
696
+ parseNamed_default,
697
+ parseTransparent_default,
698
+ "srgb"
699
+ ],
700
+ serialize: "srgb",
701
+ interpolate: {
702
+ r: interpolatorLinear,
703
+ g: interpolatorLinear,
704
+ b: interpolatorLinear,
705
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
706
+ },
707
+ gamut: true,
708
+ white: { r: 1, g: 1, b: 1 },
709
+ black: { r: 0, g: 0, b: 0 }
710
+ };
711
+ var definition_default = definition;
712
+
713
+ // node_modules/culori/src/a98/convertA98ToXyz65.js
714
+ var linearize = (v = 0) => Math.pow(Math.abs(v), 563 / 256) * Math.sign(v);
715
+ var convertA98ToXyz65 = (a98) => {
716
+ let r = linearize(a98.r);
717
+ let g = linearize(a98.g);
718
+ let b = linearize(a98.b);
719
+ let res = {
720
+ mode: "xyz65",
721
+ x: 0.5766690429101305 * r + 0.1855582379065463 * g + 0.1882286462349947 * b,
722
+ y: 0.297344975250536 * r + 0.6273635662554661 * g + 0.0752914584939979 * b,
723
+ z: 0.0270313613864123 * r + 0.0706888525358272 * g + 0.9913375368376386 * b
724
+ };
725
+ if (a98.alpha !== undefined) {
726
+ res.alpha = a98.alpha;
727
+ }
728
+ return res;
729
+ };
730
+ var convertA98ToXyz65_default = convertA98ToXyz65;
731
+
732
+ // node_modules/culori/src/a98/convertXyz65ToA98.js
733
+ var gamma = (v) => Math.pow(Math.abs(v), 256 / 563) * Math.sign(v);
734
+ var convertXyz65ToA98 = ({ x, y, z, alpha }) => {
735
+ if (x === undefined)
736
+ x = 0;
737
+ if (y === undefined)
738
+ y = 0;
739
+ if (z === undefined)
740
+ z = 0;
741
+ let res = {
742
+ mode: "a98",
743
+ r: gamma(x * 2.0415879038107465 - y * 0.5650069742788597 - 0.3447313507783297 * z),
744
+ g: gamma(x * -0.9692436362808798 + y * 1.8759675015077206 + 0.0415550574071756 * z),
745
+ b: gamma(x * 0.0134442806320312 - y * 0.1183623922310184 + 1.0151749943912058 * z)
746
+ };
747
+ if (alpha !== undefined) {
748
+ res.alpha = alpha;
749
+ }
750
+ return res;
751
+ };
752
+ var convertXyz65ToA98_default = convertXyz65ToA98;
753
+
754
+ // node_modules/culori/src/lrgb/convertRgbToLrgb.js
755
+ var fn = (c = 0) => {
756
+ const abs = Math.abs(c);
757
+ if (abs <= 0.04045) {
758
+ return c / 12.92;
759
+ }
760
+ return (Math.sign(c) || 1) * Math.pow((abs + 0.055) / 1.055, 2.4);
761
+ };
762
+ var convertRgbToLrgb = ({ r, g, b, alpha }) => {
763
+ let res = {
764
+ mode: "lrgb",
765
+ r: fn(r),
766
+ g: fn(g),
767
+ b: fn(b)
768
+ };
769
+ if (alpha !== undefined)
770
+ res.alpha = alpha;
771
+ return res;
772
+ };
773
+ var convertRgbToLrgb_default = convertRgbToLrgb;
774
+
775
+ // node_modules/culori/src/xyz65/convertRgbToXyz65.js
776
+ var convertRgbToXyz65 = (rgb) => {
777
+ let { r, g, b, alpha } = convertRgbToLrgb_default(rgb);
778
+ let res = {
779
+ mode: "xyz65",
780
+ x: 0.4123907992659593 * r + 0.357584339383878 * g + 0.1804807884018343 * b,
781
+ y: 0.2126390058715102 * r + 0.715168678767756 * g + 0.0721923153607337 * b,
782
+ z: 0.0193308187155918 * r + 0.119194779794626 * g + 0.9505321522496607 * b
783
+ };
784
+ if (alpha !== undefined) {
785
+ res.alpha = alpha;
786
+ }
787
+ return res;
788
+ };
789
+ var convertRgbToXyz65_default = convertRgbToXyz65;
790
+
791
+ // node_modules/culori/src/lrgb/convertLrgbToRgb.js
792
+ var fn2 = (c = 0) => {
793
+ const abs = Math.abs(c);
794
+ if (abs > 0.0031308) {
795
+ return (Math.sign(c) || 1) * (1.055 * Math.pow(abs, 1 / 2.4) - 0.055);
796
+ }
797
+ return c * 12.92;
798
+ };
799
+ var convertLrgbToRgb = ({ r, g, b, alpha }, mode = "rgb") => {
800
+ let res = {
801
+ mode,
802
+ r: fn2(r),
803
+ g: fn2(g),
804
+ b: fn2(b)
805
+ };
806
+ if (alpha !== undefined)
807
+ res.alpha = alpha;
808
+ return res;
809
+ };
810
+ var convertLrgbToRgb_default = convertLrgbToRgb;
811
+
812
+ // node_modules/culori/src/xyz65/convertXyz65ToRgb.js
813
+ var convertXyz65ToRgb = ({ x, y, z, alpha }) => {
814
+ if (x === undefined)
815
+ x = 0;
816
+ if (y === undefined)
817
+ y = 0;
818
+ if (z === undefined)
819
+ z = 0;
820
+ let res = convertLrgbToRgb_default({
821
+ r: x * 3.2409699419045226 - y * 1.537383177570094 - 0.4986107602930034 * z,
822
+ g: x * -0.9692436362808796 + y * 1.8759675015077204 + 0.0415550574071756 * z,
823
+ b: x * 0.0556300796969936 - y * 0.2039769588889765 + 1.0569715142428784 * z
824
+ });
825
+ if (alpha !== undefined) {
826
+ res.alpha = alpha;
827
+ }
828
+ return res;
829
+ };
830
+ var convertXyz65ToRgb_default = convertXyz65ToRgb;
831
+
832
+ // node_modules/culori/src/a98/definition.js
833
+ var definition2 = {
834
+ ...definition_default,
835
+ mode: "a98",
836
+ parse: ["a98-rgb"],
837
+ serialize: "a98-rgb",
838
+ fromMode: {
839
+ rgb: (color) => convertXyz65ToA98_default(convertRgbToXyz65_default(color)),
840
+ xyz65: convertXyz65ToA98_default
841
+ },
842
+ toMode: {
843
+ rgb: (color) => convertXyz65ToRgb_default(convertA98ToXyz65_default(color)),
844
+ xyz65: convertA98ToXyz65_default
845
+ }
846
+ };
847
+ var definition_default2 = definition2;
848
+
849
+ // node_modules/culori/src/util/normalizeHue.js
850
+ var normalizeHue = (hue) => (hue = hue % 360) < 0 ? hue + 360 : hue;
851
+ var normalizeHue_default = normalizeHue;
852
+
853
+ // node_modules/culori/src/fixup/hue.js
854
+ var hue2 = (hues, fn) => {
855
+ return hues.map((hue, idx, arr) => {
856
+ if (hue === undefined) {
857
+ return hue;
858
+ }
859
+ let normalized = normalizeHue_default(hue);
860
+ if (idx === 0 || hues[idx - 1] === undefined) {
861
+ return normalized;
862
+ }
863
+ return fn(normalized - normalizeHue_default(arr[idx - 1]));
864
+ }).reduce((acc, curr) => {
865
+ if (!acc.length || curr === undefined || acc[acc.length - 1] === undefined) {
866
+ acc.push(curr);
867
+ return acc;
868
+ }
869
+ acc.push(curr + acc[acc.length - 1]);
870
+ return acc;
871
+ }, []);
872
+ };
873
+ var fixupHueShorter = (arr) => hue2(arr, (d) => Math.abs(d) <= 180 ? d : d - 360 * Math.sign(d));
874
+
875
+ // node_modules/culori/src/cubehelix/constants.js
876
+ var M = [-0.14861, 1.78277, -0.29227, -0.90649, 1.97294, 0];
877
+ var degToRad = Math.PI / 180;
878
+ var radToDeg = 180 / Math.PI;
879
+
880
+ // node_modules/culori/src/cubehelix/convertRgbToCubehelix.js
881
+ var DE = M[3] * M[4];
882
+ var BE = M[1] * M[4];
883
+ var BCAD = M[1] * M[2] - M[0] * M[3];
884
+ var convertRgbToCubehelix = ({ r, g, b, alpha }) => {
885
+ if (r === undefined)
886
+ r = 0;
887
+ if (g === undefined)
888
+ g = 0;
889
+ if (b === undefined)
890
+ b = 0;
891
+ let l = (BCAD * b + r * DE - g * BE) / (BCAD + DE - BE);
892
+ let x = b - l;
893
+ let y = (M[4] * (g - l) - M[2] * x) / M[3];
894
+ let res = {
895
+ mode: "cubehelix",
896
+ l,
897
+ s: l === 0 || l === 1 ? undefined : Math.sqrt(x * x + y * y) / (M[4] * l * (1 - l))
898
+ };
899
+ if (res.s)
900
+ res.h = Math.atan2(y, x) * radToDeg - 120;
901
+ if (alpha !== undefined)
902
+ res.alpha = alpha;
903
+ return res;
904
+ };
905
+ var convertRgbToCubehelix_default = convertRgbToCubehelix;
906
+
907
+ // node_modules/culori/src/cubehelix/convertCubehelixToRgb.js
908
+ var convertCubehelixToRgb = ({ h, s, l, alpha }) => {
909
+ let res = { mode: "rgb" };
910
+ h = (h === undefined ? 0 : h + 120) * degToRad;
911
+ if (l === undefined)
912
+ l = 0;
913
+ let amp = s === undefined ? 0 : s * l * (1 - l);
914
+ let cosh = Math.cos(h);
915
+ let sinh = Math.sin(h);
916
+ res.r = l + amp * (M[0] * cosh + M[1] * sinh);
917
+ res.g = l + amp * (M[2] * cosh + M[3] * sinh);
918
+ res.b = l + amp * (M[4] * cosh + M[5] * sinh);
919
+ if (alpha !== undefined)
920
+ res.alpha = alpha;
921
+ return res;
922
+ };
923
+ var convertCubehelixToRgb_default = convertCubehelixToRgb;
924
+
925
+ // node_modules/culori/src/difference.js
926
+ var differenceHueSaturation = (std, smp) => {
927
+ if (std.h === undefined || smp.h === undefined || !std.s || !smp.s) {
928
+ return 0;
929
+ }
930
+ let std_h = normalizeHue_default(std.h);
931
+ let smp_h = normalizeHue_default(smp.h);
932
+ let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);
933
+ return 2 * Math.sqrt(std.s * smp.s) * dH;
934
+ };
935
+ var differenceHueNaive = (std, smp) => {
936
+ if (std.h === undefined || smp.h === undefined) {
937
+ return 0;
938
+ }
939
+ let std_h = normalizeHue_default(std.h);
940
+ let smp_h = normalizeHue_default(smp.h);
941
+ if (Math.abs(smp_h - std_h) > 180) {
942
+ return std_h - (smp_h - 360 * Math.sign(smp_h - std_h));
943
+ }
944
+ return smp_h - std_h;
945
+ };
946
+ var differenceHueChroma = (std, smp) => {
947
+ if (std.h === undefined || smp.h === undefined || !std.c || !smp.c) {
948
+ return 0;
949
+ }
950
+ let std_h = normalizeHue_default(std.h);
951
+ let smp_h = normalizeHue_default(smp.h);
952
+ let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);
953
+ return 2 * Math.sqrt(std.c * smp.c) * dH;
954
+ };
955
+
956
+ // node_modules/culori/src/average.js
957
+ var averageAngle = (val) => {
958
+ let sum = val.reduce((sum, val) => {
959
+ if (val !== undefined) {
960
+ let rad = val * Math.PI / 180;
961
+ sum.sin += Math.sin(rad);
962
+ sum.cos += Math.cos(rad);
963
+ }
964
+ return sum;
965
+ }, { sin: 0, cos: 0 });
966
+ let angle = Math.atan2(sum.sin, sum.cos) * 180 / Math.PI;
967
+ return angle < 0 ? 360 + angle : angle;
968
+ };
969
+
970
+ // node_modules/culori/src/cubehelix/definition.js
971
+ var definition3 = {
972
+ mode: "cubehelix",
973
+ channels: ["h", "s", "l", "alpha"],
974
+ parse: ["--cubehelix"],
975
+ serialize: "--cubehelix",
976
+ ranges: {
977
+ h: [0, 360],
978
+ s: [0, 4.614],
979
+ l: [0, 1]
980
+ },
981
+ fromMode: {
982
+ rgb: convertRgbToCubehelix_default
983
+ },
984
+ toMode: {
985
+ rgb: convertCubehelixToRgb_default
986
+ },
987
+ interpolate: {
988
+ h: {
989
+ use: interpolatorLinear,
990
+ fixup: fixupHueShorter
991
+ },
992
+ s: interpolatorLinear,
993
+ l: interpolatorLinear,
994
+ alpha: {
995
+ use: interpolatorLinear,
996
+ fixup: fixupAlpha
997
+ }
998
+ },
999
+ difference: {
1000
+ h: differenceHueSaturation
1001
+ },
1002
+ average: {
1003
+ h: averageAngle
1004
+ }
1005
+ };
1006
+ var definition_default3 = definition3;
1007
+
1008
+ // node_modules/culori/src/lch/convertLabToLch.js
1009
+ var convertLabToLch = ({ l, a, b, alpha }, mode = "lch") => {
1010
+ if (a === undefined)
1011
+ a = 0;
1012
+ if (b === undefined)
1013
+ b = 0;
1014
+ let c = Math.sqrt(a * a + b * b);
1015
+ let res = { mode, l, c };
1016
+ if (c)
1017
+ res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);
1018
+ if (alpha !== undefined)
1019
+ res.alpha = alpha;
1020
+ return res;
1021
+ };
1022
+ var convertLabToLch_default = convertLabToLch;
1023
+
1024
+ // node_modules/culori/src/lch/convertLchToLab.js
1025
+ var convertLchToLab = ({ l, c, h, alpha }, mode = "lab") => {
1026
+ if (h === undefined)
1027
+ h = 0;
1028
+ let res = {
1029
+ mode,
1030
+ l,
1031
+ a: c ? c * Math.cos(h / 180 * Math.PI) : 0,
1032
+ b: c ? c * Math.sin(h / 180 * Math.PI) : 0
1033
+ };
1034
+ if (alpha !== undefined)
1035
+ res.alpha = alpha;
1036
+ return res;
1037
+ };
1038
+ var convertLchToLab_default = convertLchToLab;
1039
+
1040
+ // node_modules/culori/src/xyz65/constants.js
1041
+ var k = Math.pow(29, 3) / Math.pow(3, 3);
1042
+ var e = Math.pow(6, 3) / Math.pow(29, 3);
1043
+
1044
+ // node_modules/culori/src/constants.js
1045
+ var D50 = {
1046
+ X: 0.3457 / 0.3585,
1047
+ Y: 1,
1048
+ Z: (1 - 0.3457 - 0.3585) / 0.3585
1049
+ };
1050
+ var D65 = {
1051
+ X: 0.3127 / 0.329,
1052
+ Y: 1,
1053
+ Z: (1 - 0.3127 - 0.329) / 0.329
1054
+ };
1055
+ var k2 = Math.pow(29, 3) / Math.pow(3, 3);
1056
+ var e2 = Math.pow(6, 3) / Math.pow(29, 3);
1057
+
1058
+ // node_modules/culori/src/lab65/convertLab65ToXyz65.js
1059
+ var fn3 = (v) => Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k;
1060
+ var convertLab65ToXyz65 = ({ l, a, b, alpha }) => {
1061
+ if (l === undefined)
1062
+ l = 0;
1063
+ if (a === undefined)
1064
+ a = 0;
1065
+ if (b === undefined)
1066
+ b = 0;
1067
+ let fy = (l + 16) / 116;
1068
+ let fx = a / 500 + fy;
1069
+ let fz = fy - b / 200;
1070
+ let res = {
1071
+ mode: "xyz65",
1072
+ x: fn3(fx) * D65.X,
1073
+ y: fn3(fy) * D65.Y,
1074
+ z: fn3(fz) * D65.Z
1075
+ };
1076
+ if (alpha !== undefined) {
1077
+ res.alpha = alpha;
1078
+ }
1079
+ return res;
1080
+ };
1081
+ var convertLab65ToXyz65_default = convertLab65ToXyz65;
1082
+
1083
+ // node_modules/culori/src/lab65/convertLab65ToRgb.js
1084
+ var convertLab65ToRgb = (lab) => convertXyz65ToRgb_default(convertLab65ToXyz65_default(lab));
1085
+ var convertLab65ToRgb_default = convertLab65ToRgb;
1086
+
1087
+ // node_modules/culori/src/lab65/convertXyz65ToLab65.js
1088
+ var f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;
1089
+ var convertXyz65ToLab65 = ({ x, y, z, alpha }) => {
1090
+ if (x === undefined)
1091
+ x = 0;
1092
+ if (y === undefined)
1093
+ y = 0;
1094
+ if (z === undefined)
1095
+ z = 0;
1096
+ let f0 = f(x / D65.X);
1097
+ let f1 = f(y / D65.Y);
1098
+ let f2 = f(z / D65.Z);
1099
+ let res = {
1100
+ mode: "lab65",
1101
+ l: 116 * f1 - 16,
1102
+ a: 500 * (f0 - f1),
1103
+ b: 200 * (f1 - f2)
1104
+ };
1105
+ if (alpha !== undefined) {
1106
+ res.alpha = alpha;
1107
+ }
1108
+ return res;
1109
+ };
1110
+ var convertXyz65ToLab65_default = convertXyz65ToLab65;
1111
+
1112
+ // node_modules/culori/src/lab65/convertRgbToLab65.js
1113
+ var convertRgbToLab65 = (rgb) => {
1114
+ let res = convertXyz65ToLab65_default(convertRgbToXyz65_default(rgb));
1115
+ if (rgb.r === rgb.b && rgb.b === rgb.g) {
1116
+ res.a = res.b = 0;
1117
+ }
1118
+ return res;
1119
+ };
1120
+ var convertRgbToLab65_default = convertRgbToLab65;
1121
+
1122
+ // node_modules/culori/src/dlch/constants.js
1123
+ var kE = 1;
1124
+ var kCH = 1;
1125
+ var θ = 26 / 180 * Math.PI;
1126
+ var cosθ = Math.cos(θ);
1127
+ var sinθ = Math.sin(θ);
1128
+ var factor = 100 / Math.log(139 / 100);
1129
+
1130
+ // node_modules/culori/src/dlch/convertDlchToLab65.js
1131
+ var convertDlchToLab65 = ({ l, c, h, alpha }) => {
1132
+ if (l === undefined)
1133
+ l = 0;
1134
+ if (c === undefined)
1135
+ c = 0;
1136
+ if (h === undefined)
1137
+ h = 0;
1138
+ let res = {
1139
+ mode: "lab65",
1140
+ l: (Math.exp(l * kE / factor) - 1) / 0.0039
1141
+ };
1142
+ let G = (Math.exp(0.0435 * c * kCH * kE) - 1) / 0.075;
1143
+ let e = G * Math.cos(h / 180 * Math.PI - θ);
1144
+ let f = G * Math.sin(h / 180 * Math.PI - θ);
1145
+ res.a = e * cosθ - f / 0.83 * sinθ;
1146
+ res.b = e * sinθ + f / 0.83 * cosθ;
1147
+ if (alpha !== undefined)
1148
+ res.alpha = alpha;
1149
+ return res;
1150
+ };
1151
+ var convertDlchToLab65_default = convertDlchToLab65;
1152
+
1153
+ // node_modules/culori/src/dlch/convertLab65ToDlch.js
1154
+ var convertLab65ToDlch = ({ l, a, b, alpha }) => {
1155
+ if (l === undefined)
1156
+ l = 0;
1157
+ if (a === undefined)
1158
+ a = 0;
1159
+ if (b === undefined)
1160
+ b = 0;
1161
+ let e = a * cosθ + b * sinθ;
1162
+ let f = 0.83 * (b * cosθ - a * sinθ);
1163
+ let G = Math.sqrt(e * e + f * f);
1164
+ let res = {
1165
+ mode: "dlch",
1166
+ l: factor / kE * Math.log(1 + 0.0039 * l),
1167
+ c: Math.log(1 + 0.075 * G) / (0.0435 * kCH * kE)
1168
+ };
1169
+ if (res.c) {
1170
+ res.h = normalizeHue_default((Math.atan2(f, e) + θ) / Math.PI * 180);
1171
+ }
1172
+ if (alpha !== undefined)
1173
+ res.alpha = alpha;
1174
+ return res;
1175
+ };
1176
+ var convertLab65ToDlch_default = convertLab65ToDlch;
1177
+
1178
+ // node_modules/culori/src/dlab/definition.js
1179
+ var convertDlabToLab65 = (c) => convertDlchToLab65_default(convertLabToLch_default(c, "dlch"));
1180
+ var convertLab65ToDlab = (c) => convertLchToLab_default(convertLab65ToDlch_default(c), "dlab");
1181
+ var definition4 = {
1182
+ mode: "dlab",
1183
+ parse: ["--din99o-lab"],
1184
+ serialize: "--din99o-lab",
1185
+ toMode: {
1186
+ lab65: convertDlabToLab65,
1187
+ rgb: (c) => convertLab65ToRgb_default(convertDlabToLab65(c))
1188
+ },
1189
+ fromMode: {
1190
+ lab65: convertLab65ToDlab,
1191
+ rgb: (c) => convertLab65ToDlab(convertRgbToLab65_default(c))
1192
+ },
1193
+ channels: ["l", "a", "b", "alpha"],
1194
+ ranges: {
1195
+ l: [0, 100],
1196
+ a: [-40.09, 45.501],
1197
+ b: [-40.469, 44.344]
1198
+ },
1199
+ interpolate: {
1200
+ l: interpolatorLinear,
1201
+ a: interpolatorLinear,
1202
+ b: interpolatorLinear,
1203
+ alpha: {
1204
+ use: interpolatorLinear,
1205
+ fixup: fixupAlpha
1206
+ }
1207
+ }
1208
+ };
1209
+ var definition_default4 = definition4;
1210
+
1211
+ // node_modules/culori/src/dlch/definition.js
1212
+ var definition5 = {
1213
+ mode: "dlch",
1214
+ parse: ["--din99o-lch"],
1215
+ serialize: "--din99o-lch",
1216
+ toMode: {
1217
+ lab65: convertDlchToLab65_default,
1218
+ dlab: (c) => convertLchToLab_default(c, "dlab"),
1219
+ rgb: (c) => convertLab65ToRgb_default(convertDlchToLab65_default(c))
1220
+ },
1221
+ fromMode: {
1222
+ lab65: convertLab65ToDlch_default,
1223
+ dlab: (c) => convertLabToLch_default(c, "dlch"),
1224
+ rgb: (c) => convertLab65ToDlch_default(convertRgbToLab65_default(c))
1225
+ },
1226
+ channels: ["l", "c", "h", "alpha"],
1227
+ ranges: {
1228
+ l: [0, 100],
1229
+ c: [0, 51.484],
1230
+ h: [0, 360]
1231
+ },
1232
+ interpolate: {
1233
+ l: interpolatorLinear,
1234
+ c: interpolatorLinear,
1235
+ h: {
1236
+ use: interpolatorLinear,
1237
+ fixup: fixupHueShorter
1238
+ },
1239
+ alpha: {
1240
+ use: interpolatorLinear,
1241
+ fixup: fixupAlpha
1242
+ }
1243
+ },
1244
+ difference: {
1245
+ h: differenceHueChroma
1246
+ },
1247
+ average: {
1248
+ h: averageAngle
1249
+ }
1250
+ };
1251
+ var definition_default5 = definition5;
1252
+
1253
+ // node_modules/culori/src/hsi/convertHsiToRgb.js
1254
+ function convertHsiToRgb({ h, s, i, alpha }) {
1255
+ h = normalizeHue_default(h !== undefined ? h : 0);
1256
+ if (s === undefined)
1257
+ s = 0;
1258
+ if (i === undefined)
1259
+ i = 0;
1260
+ let f = Math.abs(h / 60 % 2 - 1);
1261
+ let res;
1262
+ switch (Math.floor(h / 60)) {
1263
+ case 0:
1264
+ res = {
1265
+ r: i * (1 + s * (3 / (2 - f) - 1)),
1266
+ g: i * (1 + s * (3 * (1 - f) / (2 - f) - 1)),
1267
+ b: i * (1 - s)
1268
+ };
1269
+ break;
1270
+ case 1:
1271
+ res = {
1272
+ r: i * (1 + s * (3 * (1 - f) / (2 - f) - 1)),
1273
+ g: i * (1 + s * (3 / (2 - f) - 1)),
1274
+ b: i * (1 - s)
1275
+ };
1276
+ break;
1277
+ case 2:
1278
+ res = {
1279
+ r: i * (1 - s),
1280
+ g: i * (1 + s * (3 / (2 - f) - 1)),
1281
+ b: i * (1 + s * (3 * (1 - f) / (2 - f) - 1))
1282
+ };
1283
+ break;
1284
+ case 3:
1285
+ res = {
1286
+ r: i * (1 - s),
1287
+ g: i * (1 + s * (3 * (1 - f) / (2 - f) - 1)),
1288
+ b: i * (1 + s * (3 / (2 - f) - 1))
1289
+ };
1290
+ break;
1291
+ case 4:
1292
+ res = {
1293
+ r: i * (1 + s * (3 * (1 - f) / (2 - f) - 1)),
1294
+ g: i * (1 - s),
1295
+ b: i * (1 + s * (3 / (2 - f) - 1))
1296
+ };
1297
+ break;
1298
+ case 5:
1299
+ res = {
1300
+ r: i * (1 + s * (3 / (2 - f) - 1)),
1301
+ g: i * (1 - s),
1302
+ b: i * (1 + s * (3 * (1 - f) / (2 - f) - 1))
1303
+ };
1304
+ break;
1305
+ default:
1306
+ res = { r: i * (1 - s), g: i * (1 - s), b: i * (1 - s) };
1307
+ }
1308
+ res.mode = "rgb";
1309
+ if (alpha !== undefined)
1310
+ res.alpha = alpha;
1311
+ return res;
1312
+ }
1313
+
1314
+ // node_modules/culori/src/hsi/convertRgbToHsi.js
1315
+ function convertRgbToHsi({ r, g, b, alpha }) {
1316
+ if (r === undefined)
1317
+ r = 0;
1318
+ if (g === undefined)
1319
+ g = 0;
1320
+ if (b === undefined)
1321
+ b = 0;
1322
+ let M = Math.max(r, g, b), m = Math.min(r, g, b);
1323
+ let res = {
1324
+ mode: "hsi",
1325
+ s: r + g + b === 0 ? 0 : 1 - 3 * m / (r + g + b),
1326
+ i: (r + g + b) / 3
1327
+ };
1328
+ if (M - m !== 0)
1329
+ res.h = (M === r ? (g - b) / (M - m) + (g < b) * 6 : M === g ? (b - r) / (M - m) + 2 : (r - g) / (M - m) + 4) * 60;
1330
+ if (alpha !== undefined)
1331
+ res.alpha = alpha;
1332
+ return res;
1333
+ }
1334
+
1335
+ // node_modules/culori/src/hsi/definition.js
1336
+ var definition6 = {
1337
+ mode: "hsi",
1338
+ toMode: {
1339
+ rgb: convertHsiToRgb
1340
+ },
1341
+ parse: ["--hsi"],
1342
+ serialize: "--hsi",
1343
+ fromMode: {
1344
+ rgb: convertRgbToHsi
1345
+ },
1346
+ channels: ["h", "s", "i", "alpha"],
1347
+ ranges: {
1348
+ h: [0, 360]
1349
+ },
1350
+ gamut: "rgb",
1351
+ interpolate: {
1352
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1353
+ s: interpolatorLinear,
1354
+ i: interpolatorLinear,
1355
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1356
+ },
1357
+ difference: {
1358
+ h: differenceHueSaturation
1359
+ },
1360
+ average: {
1361
+ h: averageAngle
1362
+ }
1363
+ };
1364
+ var definition_default6 = definition6;
1365
+
1366
+ // node_modules/culori/src/hsl/convertHslToRgb.js
1367
+ function convertHslToRgb({ h, s, l, alpha }) {
1368
+ h = normalizeHue_default(h !== undefined ? h : 0);
1369
+ if (s === undefined)
1370
+ s = 0;
1371
+ if (l === undefined)
1372
+ l = 0;
1373
+ let m1 = l + s * (l < 0.5 ? l : 1 - l);
1374
+ let m2 = m1 - (m1 - l) * 2 * Math.abs(h / 60 % 2 - 1);
1375
+ let res;
1376
+ switch (Math.floor(h / 60)) {
1377
+ case 0:
1378
+ res = { r: m1, g: m2, b: 2 * l - m1 };
1379
+ break;
1380
+ case 1:
1381
+ res = { r: m2, g: m1, b: 2 * l - m1 };
1382
+ break;
1383
+ case 2:
1384
+ res = { r: 2 * l - m1, g: m1, b: m2 };
1385
+ break;
1386
+ case 3:
1387
+ res = { r: 2 * l - m1, g: m2, b: m1 };
1388
+ break;
1389
+ case 4:
1390
+ res = { r: m2, g: 2 * l - m1, b: m1 };
1391
+ break;
1392
+ case 5:
1393
+ res = { r: m1, g: 2 * l - m1, b: m2 };
1394
+ break;
1395
+ default:
1396
+ res = { r: 2 * l - m1, g: 2 * l - m1, b: 2 * l - m1 };
1397
+ }
1398
+ res.mode = "rgb";
1399
+ if (alpha !== undefined)
1400
+ res.alpha = alpha;
1401
+ return res;
1402
+ }
1403
+
1404
+ // node_modules/culori/src/hsl/convertRgbToHsl.js
1405
+ function convertRgbToHsl({ r, g, b, alpha }) {
1406
+ if (r === undefined)
1407
+ r = 0;
1408
+ if (g === undefined)
1409
+ g = 0;
1410
+ if (b === undefined)
1411
+ b = 0;
1412
+ let M = Math.max(r, g, b), m = Math.min(r, g, b);
1413
+ let res = {
1414
+ mode: "hsl",
1415
+ s: M === m ? 0 : (M - m) / (1 - Math.abs(M + m - 1)),
1416
+ l: 0.5 * (M + m)
1417
+ };
1418
+ if (M - m !== 0)
1419
+ res.h = (M === r ? (g - b) / (M - m) + (g < b) * 6 : M === g ? (b - r) / (M - m) + 2 : (r - g) / (M - m) + 4) * 60;
1420
+ if (alpha !== undefined)
1421
+ res.alpha = alpha;
1422
+ return res;
1423
+ }
1424
+
1425
+ // node_modules/culori/src/util/hue.js
1426
+ var hueToDeg = (val, unit) => {
1427
+ switch (unit) {
1428
+ case "deg":
1429
+ return +val;
1430
+ case "rad":
1431
+ return val / Math.PI * 180;
1432
+ case "grad":
1433
+ return val / 10 * 9;
1434
+ case "turn":
1435
+ return val * 360;
1436
+ }
1437
+ };
1438
+ var hue_default = hueToDeg;
1439
+
1440
+ // node_modules/culori/src/hsl/parseHslLegacy.js
1441
+ var hsl_old = new RegExp(`^hsla?\\(\\s*${hue}${c}${per}${c}${per}\\s*(?:,\\s*${num_per}\\s*)?\\)$`);
1442
+ var parseHslLegacy = (color) => {
1443
+ let match = color.match(hsl_old);
1444
+ if (!match)
1445
+ return;
1446
+ let res = { mode: "hsl" };
1447
+ if (match[3] !== undefined) {
1448
+ res.h = +match[3];
1449
+ } else if (match[1] !== undefined && match[2] !== undefined) {
1450
+ res.h = hue_default(match[1], match[2]);
1451
+ }
1452
+ if (match[4] !== undefined) {
1453
+ res.s = Math.min(Math.max(0, match[4] / 100), 1);
1454
+ }
1455
+ if (match[5] !== undefined) {
1456
+ res.l = Math.min(Math.max(0, match[5] / 100), 1);
1457
+ }
1458
+ if (match[6] !== undefined) {
1459
+ res.alpha = Math.max(0, Math.min(1, match[6] / 100));
1460
+ } else if (match[7] !== undefined) {
1461
+ res.alpha = Math.max(0, Math.min(1, +match[7]));
1462
+ }
1463
+ return res;
1464
+ };
1465
+ var parseHslLegacy_default = parseHslLegacy;
1466
+
1467
+ // node_modules/culori/src/hsl/parseHsl.js
1468
+ function parseHsl(color, parsed) {
1469
+ if (!parsed || parsed[0] !== "hsl" && parsed[0] !== "hsla") {
1470
+ return;
1471
+ }
1472
+ const res = { mode: "hsl" };
1473
+ const [, h, s, l, alpha] = parsed;
1474
+ if (h.type !== Tok.None) {
1475
+ if (h.type === Tok.Percentage) {
1476
+ return;
1477
+ }
1478
+ res.h = h.value;
1479
+ }
1480
+ if (s.type !== Tok.None) {
1481
+ if (s.type === Tok.Hue) {
1482
+ return;
1483
+ }
1484
+ res.s = s.value / 100;
1485
+ }
1486
+ if (l.type !== Tok.None) {
1487
+ if (l.type === Tok.Hue) {
1488
+ return;
1489
+ }
1490
+ res.l = l.value / 100;
1491
+ }
1492
+ if (alpha.type !== Tok.None) {
1493
+ res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
1494
+ }
1495
+ return res;
1496
+ }
1497
+ var parseHsl_default = parseHsl;
1498
+
1499
+ // node_modules/culori/src/hsl/definition.js
1500
+ var definition7 = {
1501
+ mode: "hsl",
1502
+ toMode: {
1503
+ rgb: convertHslToRgb
1504
+ },
1505
+ fromMode: {
1506
+ rgb: convertRgbToHsl
1507
+ },
1508
+ channels: ["h", "s", "l", "alpha"],
1509
+ ranges: {
1510
+ h: [0, 360]
1511
+ },
1512
+ gamut: "rgb",
1513
+ parse: [parseHsl_default, parseHslLegacy_default],
1514
+ serialize: (c) => `hsl(${c.h !== undefined ? c.h : "none"} ${c.s !== undefined ? c.s * 100 + "%" : "none"} ${c.l !== undefined ? c.l * 100 + "%" : "none"}${c.alpha < 1 ? ` / ${c.alpha}` : ""})`,
1515
+ interpolate: {
1516
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1517
+ s: interpolatorLinear,
1518
+ l: interpolatorLinear,
1519
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1520
+ },
1521
+ difference: {
1522
+ h: differenceHueSaturation
1523
+ },
1524
+ average: {
1525
+ h: averageAngle
1526
+ }
1527
+ };
1528
+ var definition_default7 = definition7;
1529
+
1530
+ // node_modules/culori/src/hsv/convertHsvToRgb.js
1531
+ function convertHsvToRgb({ h, s, v, alpha }) {
1532
+ h = normalizeHue_default(h !== undefined ? h : 0);
1533
+ if (s === undefined)
1534
+ s = 0;
1535
+ if (v === undefined)
1536
+ v = 0;
1537
+ let f = Math.abs(h / 60 % 2 - 1);
1538
+ let res;
1539
+ switch (Math.floor(h / 60)) {
1540
+ case 0:
1541
+ res = { r: v, g: v * (1 - s * f), b: v * (1 - s) };
1542
+ break;
1543
+ case 1:
1544
+ res = { r: v * (1 - s * f), g: v, b: v * (1 - s) };
1545
+ break;
1546
+ case 2:
1547
+ res = { r: v * (1 - s), g: v, b: v * (1 - s * f) };
1548
+ break;
1549
+ case 3:
1550
+ res = { r: v * (1 - s), g: v * (1 - s * f), b: v };
1551
+ break;
1552
+ case 4:
1553
+ res = { r: v * (1 - s * f), g: v * (1 - s), b: v };
1554
+ break;
1555
+ case 5:
1556
+ res = { r: v, g: v * (1 - s), b: v * (1 - s * f) };
1557
+ break;
1558
+ default:
1559
+ res = { r: v * (1 - s), g: v * (1 - s), b: v * (1 - s) };
1560
+ }
1561
+ res.mode = "rgb";
1562
+ if (alpha !== undefined)
1563
+ res.alpha = alpha;
1564
+ return res;
1565
+ }
1566
+
1567
+ // node_modules/culori/src/hsv/convertRgbToHsv.js
1568
+ function convertRgbToHsv({ r, g, b, alpha }) {
1569
+ if (r === undefined)
1570
+ r = 0;
1571
+ if (g === undefined)
1572
+ g = 0;
1573
+ if (b === undefined)
1574
+ b = 0;
1575
+ let M = Math.max(r, g, b), m = Math.min(r, g, b);
1576
+ let res = {
1577
+ mode: "hsv",
1578
+ s: M === 0 ? 0 : 1 - m / M,
1579
+ v: M
1580
+ };
1581
+ if (M - m !== 0)
1582
+ res.h = (M === r ? (g - b) / (M - m) + (g < b) * 6 : M === g ? (b - r) / (M - m) + 2 : (r - g) / (M - m) + 4) * 60;
1583
+ if (alpha !== undefined)
1584
+ res.alpha = alpha;
1585
+ return res;
1586
+ }
1587
+
1588
+ // node_modules/culori/src/hsv/definition.js
1589
+ var definition8 = {
1590
+ mode: "hsv",
1591
+ toMode: {
1592
+ rgb: convertHsvToRgb
1593
+ },
1594
+ parse: ["--hsv"],
1595
+ serialize: "--hsv",
1596
+ fromMode: {
1597
+ rgb: convertRgbToHsv
1598
+ },
1599
+ channels: ["h", "s", "v", "alpha"],
1600
+ ranges: {
1601
+ h: [0, 360]
1602
+ },
1603
+ gamut: "rgb",
1604
+ interpolate: {
1605
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1606
+ s: interpolatorLinear,
1607
+ v: interpolatorLinear,
1608
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1609
+ },
1610
+ difference: {
1611
+ h: differenceHueSaturation
1612
+ },
1613
+ average: {
1614
+ h: averageAngle
1615
+ }
1616
+ };
1617
+ var definition_default8 = definition8;
1618
+
1619
+ // node_modules/culori/src/hwb/convertHwbToRgb.js
1620
+ function convertHwbToRgb({ h, w, b, alpha }) {
1621
+ if (w === undefined)
1622
+ w = 0;
1623
+ if (b === undefined)
1624
+ b = 0;
1625
+ if (w + b > 1) {
1626
+ let s = w + b;
1627
+ w /= s;
1628
+ b /= s;
1629
+ }
1630
+ return convertHsvToRgb({
1631
+ h,
1632
+ s: b === 1 ? 1 : 1 - w / (1 - b),
1633
+ v: 1 - b,
1634
+ alpha
1635
+ });
1636
+ }
1637
+
1638
+ // node_modules/culori/src/hwb/convertRgbToHwb.js
1639
+ function convertRgbToHwb(rgba) {
1640
+ let hsv = convertRgbToHsv(rgba);
1641
+ if (hsv === undefined)
1642
+ return;
1643
+ let s = hsv.s !== undefined ? hsv.s : 0;
1644
+ let v = hsv.v !== undefined ? hsv.v : 0;
1645
+ let res = {
1646
+ mode: "hwb",
1647
+ w: (1 - s) * v,
1648
+ b: 1 - v
1649
+ };
1650
+ if (hsv.h !== undefined)
1651
+ res.h = hsv.h;
1652
+ if (hsv.alpha !== undefined)
1653
+ res.alpha = hsv.alpha;
1654
+ return res;
1655
+ }
1656
+
1657
+ // node_modules/culori/src/hwb/parseHwb.js
1658
+ function ParseHwb(color, parsed) {
1659
+ if (!parsed || parsed[0] !== "hwb") {
1660
+ return;
1661
+ }
1662
+ const res = { mode: "hwb" };
1663
+ const [, h, w, b, alpha] = parsed;
1664
+ if (h.type !== Tok.None) {
1665
+ if (h.type === Tok.Percentage) {
1666
+ return;
1667
+ }
1668
+ res.h = h.value;
1669
+ }
1670
+ if (w.type !== Tok.None) {
1671
+ if (w.type === Tok.Hue) {
1672
+ return;
1673
+ }
1674
+ res.w = w.value / 100;
1675
+ }
1676
+ if (b.type !== Tok.None) {
1677
+ if (b.type === Tok.Hue) {
1678
+ return;
1679
+ }
1680
+ res.b = b.value / 100;
1681
+ }
1682
+ if (alpha.type !== Tok.None) {
1683
+ res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
1684
+ }
1685
+ return res;
1686
+ }
1687
+ var parseHwb_default = ParseHwb;
1688
+
1689
+ // node_modules/culori/src/hwb/definition.js
1690
+ var definition9 = {
1691
+ mode: "hwb",
1692
+ toMode: {
1693
+ rgb: convertHwbToRgb
1694
+ },
1695
+ fromMode: {
1696
+ rgb: convertRgbToHwb
1697
+ },
1698
+ channels: ["h", "w", "b", "alpha"],
1699
+ ranges: {
1700
+ h: [0, 360]
1701
+ },
1702
+ gamut: "rgb",
1703
+ parse: [parseHwb_default],
1704
+ serialize: (c) => `hwb(${c.h !== undefined ? c.h : "none"} ${c.w !== undefined ? c.w * 100 + "%" : "none"} ${c.b !== undefined ? c.b * 100 + "%" : "none"}${c.alpha < 1 ? ` / ${c.alpha}` : ""})`,
1705
+ interpolate: {
1706
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1707
+ w: interpolatorLinear,
1708
+ b: interpolatorLinear,
1709
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1710
+ },
1711
+ difference: {
1712
+ h: differenceHueNaive
1713
+ },
1714
+ average: {
1715
+ h: averageAngle
1716
+ }
1717
+ };
1718
+ var definition_default9 = definition9;
1719
+
1720
+ // node_modules/culori/src/hdr/constants.js
1721
+ var YW = 203;
1722
+
1723
+ // node_modules/culori/src/hdr/transfer.js
1724
+ var M1 = 0.1593017578125;
1725
+ var M2 = 78.84375;
1726
+ var C1 = 0.8359375;
1727
+ var C2 = 18.8515625;
1728
+ var C3 = 18.6875;
1729
+ function transferPqDecode(v) {
1730
+ if (v < 0)
1731
+ return 0;
1732
+ const c = Math.pow(v, 1 / M2);
1733
+ return 1e4 * Math.pow(Math.max(0, c - C1) / (C2 - C3 * c), 1 / M1);
1734
+ }
1735
+ function transferPqEncode(v) {
1736
+ if (v < 0)
1737
+ return 0;
1738
+ const c = Math.pow(v / 1e4, M1);
1739
+ return Math.pow((C1 + C2 * c) / (1 + C3 * c), M2);
1740
+ }
1741
+
1742
+ // node_modules/culori/src/itp/convertItpToXyz65.js
1743
+ var toRel = (c) => Math.max(c / YW, 0);
1744
+ var convertItpToXyz65 = ({ i, t, p, alpha }) => {
1745
+ if (i === undefined)
1746
+ i = 0;
1747
+ if (t === undefined)
1748
+ t = 0;
1749
+ if (p === undefined)
1750
+ p = 0;
1751
+ const l = transferPqDecode(i + 0.008609037037932761 * t + 0.11102962500302593 * p);
1752
+ const m = transferPqDecode(i - 0.00860903703793275 * t - 0.11102962500302599 * p);
1753
+ const s = transferPqDecode(i + 0.5600313357106791 * t - 0.32062717498731885 * p);
1754
+ const res = {
1755
+ mode: "xyz65",
1756
+ x: toRel(2.070152218389422 * l - 1.3263473389671556 * m + 0.2066510476294051 * s),
1757
+ y: toRel(0.3647385209748074 * l + 0.680566024947227 * m - 0.0453045459220346 * s),
1758
+ z: toRel(-0.049747207535812 * l - 0.0492609666966138 * m + 1.1880659249923042 * s)
1759
+ };
1760
+ if (alpha !== undefined) {
1761
+ res.alpha = alpha;
1762
+ }
1763
+ return res;
1764
+ };
1765
+ var convertItpToXyz65_default = convertItpToXyz65;
1766
+
1767
+ // node_modules/culori/src/itp/convertXyz65ToItp.js
1768
+ var toAbs = (c = 0) => Math.max(c * YW, 0);
1769
+ var convertXyz65ToItp = ({ x, y, z, alpha }) => {
1770
+ const absX = toAbs(x);
1771
+ const absY = toAbs(y);
1772
+ const absZ = toAbs(z);
1773
+ const l = transferPqEncode(0.3592832590121217 * absX + 0.6976051147779502 * absY - 0.0358915932320289 * absZ);
1774
+ const m = transferPqEncode(-0.1920808463704995 * absX + 1.1004767970374323 * absY + 0.0753748658519118 * absZ);
1775
+ const s = transferPqEncode(0.0070797844607477 * absX + 0.0748396662186366 * absY + 0.8433265453898765 * absZ);
1776
+ const i = 0.5 * l + 0.5 * m;
1777
+ const t = 1.61376953125 * l - 3.323486328125 * m + 1.709716796875 * s;
1778
+ const p = 4.378173828125 * l - 4.24560546875 * m - 0.132568359375 * s;
1779
+ const res = { mode: "itp", i, t, p };
1780
+ if (alpha !== undefined) {
1781
+ res.alpha = alpha;
1782
+ }
1783
+ return res;
1784
+ };
1785
+ var convertXyz65ToItp_default = convertXyz65ToItp;
1786
+
1787
+ // node_modules/culori/src/itp/definition.js
1788
+ var definition10 = {
1789
+ mode: "itp",
1790
+ channels: ["i", "t", "p", "alpha"],
1791
+ parse: ["--ictcp"],
1792
+ serialize: "--ictcp",
1793
+ toMode: {
1794
+ xyz65: convertItpToXyz65_default,
1795
+ rgb: (color) => convertXyz65ToRgb_default(convertItpToXyz65_default(color))
1796
+ },
1797
+ fromMode: {
1798
+ xyz65: convertXyz65ToItp_default,
1799
+ rgb: (color) => convertXyz65ToItp_default(convertRgbToXyz65_default(color))
1800
+ },
1801
+ ranges: {
1802
+ i: [0, 0.581],
1803
+ t: [-0.369, 0.272],
1804
+ p: [-0.164, 0.331]
1805
+ },
1806
+ interpolate: {
1807
+ i: interpolatorLinear,
1808
+ t: interpolatorLinear,
1809
+ p: interpolatorLinear,
1810
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1811
+ }
1812
+ };
1813
+ var definition_default10 = definition10;
1814
+
1815
+ // node_modules/culori/src/jab/convertXyz65ToJab.js
1816
+ var p = 134.03437499999998;
1817
+ var d0 = 0.000000000016295499532821565;
1818
+ var jabPqEncode = (v) => {
1819
+ if (v < 0)
1820
+ return 0;
1821
+ let vn = Math.pow(v / 1e4, M1);
1822
+ return Math.pow((C1 + C2 * vn) / (1 + C3 * vn), p);
1823
+ };
1824
+ var abs = (v = 0) => Math.max(v * 203, 0);
1825
+ var convertXyz65ToJab = ({ x, y, z, alpha }) => {
1826
+ x = abs(x);
1827
+ y = abs(y);
1828
+ z = abs(z);
1829
+ let xp = 1.15 * x - 0.15 * z;
1830
+ let yp = 0.66 * y + 0.34 * x;
1831
+ let l = jabPqEncode(0.41478972 * xp + 0.579999 * yp + 0.014648 * z);
1832
+ let m = jabPqEncode(-0.20151 * xp + 1.120649 * yp + 0.0531008 * z);
1833
+ let s = jabPqEncode(-0.0166008 * xp + 0.2648 * yp + 0.6684799 * z);
1834
+ let i = (l + m) / 2;
1835
+ let res = {
1836
+ mode: "jab",
1837
+ j: 0.44 * i / (1 - 0.56 * i) - d0,
1838
+ a: 3.524 * l - 4.066708 * m + 0.542708 * s,
1839
+ b: 0.199076 * l + 1.096799 * m - 1.295875 * s
1840
+ };
1841
+ if (alpha !== undefined) {
1842
+ res.alpha = alpha;
1843
+ }
1844
+ return res;
1845
+ };
1846
+ var convertXyz65ToJab_default = convertXyz65ToJab;
1847
+
1848
+ // node_modules/culori/src/jab/convertJabToXyz65.js
1849
+ var p2 = 134.03437499999998;
1850
+ var d02 = 0.000000000016295499532821565;
1851
+ var jabPqDecode = (v) => {
1852
+ if (v < 0)
1853
+ return 0;
1854
+ let vp = Math.pow(v, 1 / p2);
1855
+ return 1e4 * Math.pow((C1 - vp) / (C3 * vp - C2), 1 / M1);
1856
+ };
1857
+ var rel = (v) => v / 203;
1858
+ var convertJabToXyz65 = ({ j, a, b, alpha }) => {
1859
+ if (j === undefined)
1860
+ j = 0;
1861
+ if (a === undefined)
1862
+ a = 0;
1863
+ if (b === undefined)
1864
+ b = 0;
1865
+ let i = (j + d02) / (0.44 + 0.56 * (j + d02));
1866
+ let l = jabPqDecode(i + 0.13860504 * a + 0.058047316 * b);
1867
+ let m = jabPqDecode(i - 0.13860504 * a - 0.058047316 * b);
1868
+ let s = jabPqDecode(i - 0.096019242 * a - 0.8118919 * b);
1869
+ let res = {
1870
+ mode: "xyz65",
1871
+ x: rel(1.661373024652174 * l - 0.914523081304348 * m + 0.23136208173913045 * s),
1872
+ y: rel(-0.3250758611844533 * l + 1.571847026732543 * m - 0.21825383453227928 * s),
1873
+ z: rel(-0.090982811 * l - 0.31272829 * m + 1.5227666 * s)
1874
+ };
1875
+ if (alpha !== undefined) {
1876
+ res.alpha = alpha;
1877
+ }
1878
+ return res;
1879
+ };
1880
+ var convertJabToXyz65_default = convertJabToXyz65;
1881
+
1882
+ // node_modules/culori/src/jab/convertRgbToJab.js
1883
+ var convertRgbToJab = (rgb) => {
1884
+ let res = convertXyz65ToJab_default(convertRgbToXyz65_default(rgb));
1885
+ if (rgb.r === rgb.b && rgb.b === rgb.g) {
1886
+ res.a = res.b = 0;
1887
+ }
1888
+ return res;
1889
+ };
1890
+ var convertRgbToJab_default = convertRgbToJab;
1891
+
1892
+ // node_modules/culori/src/jab/convertJabToRgb.js
1893
+ var convertJabToRgb = (color) => convertXyz65ToRgb_default(convertJabToXyz65_default(color));
1894
+ var convertJabToRgb_default = convertJabToRgb;
1895
+
1896
+ // node_modules/culori/src/jab/definition.js
1897
+ var definition11 = {
1898
+ mode: "jab",
1899
+ channels: ["j", "a", "b", "alpha"],
1900
+ parse: ["--jzazbz"],
1901
+ serialize: "--jzazbz",
1902
+ fromMode: {
1903
+ rgb: convertRgbToJab_default,
1904
+ xyz65: convertXyz65ToJab_default
1905
+ },
1906
+ toMode: {
1907
+ rgb: convertJabToRgb_default,
1908
+ xyz65: convertJabToXyz65_default
1909
+ },
1910
+ ranges: {
1911
+ j: [0, 0.222],
1912
+ a: [-0.109, 0.129],
1913
+ b: [-0.185, 0.134]
1914
+ },
1915
+ interpolate: {
1916
+ j: interpolatorLinear,
1917
+ a: interpolatorLinear,
1918
+ b: interpolatorLinear,
1919
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1920
+ }
1921
+ };
1922
+ var definition_default11 = definition11;
1923
+
1924
+ // node_modules/culori/src/jch/convertJabToJch.js
1925
+ var convertJabToJch = ({ j, a, b, alpha }) => {
1926
+ if (a === undefined)
1927
+ a = 0;
1928
+ if (b === undefined)
1929
+ b = 0;
1930
+ let c = Math.sqrt(a * a + b * b);
1931
+ let res = {
1932
+ mode: "jch",
1933
+ j,
1934
+ c
1935
+ };
1936
+ if (c) {
1937
+ res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);
1938
+ }
1939
+ if (alpha !== undefined) {
1940
+ res.alpha = alpha;
1941
+ }
1942
+ return res;
1943
+ };
1944
+ var convertJabToJch_default = convertJabToJch;
1945
+
1946
+ // node_modules/culori/src/jch/convertJchToJab.js
1947
+ var convertJchToJab = ({ j, c, h, alpha }) => {
1948
+ if (h === undefined)
1949
+ h = 0;
1950
+ let res = {
1951
+ mode: "jab",
1952
+ j,
1953
+ a: c ? c * Math.cos(h / 180 * Math.PI) : 0,
1954
+ b: c ? c * Math.sin(h / 180 * Math.PI) : 0
1955
+ };
1956
+ if (alpha !== undefined)
1957
+ res.alpha = alpha;
1958
+ return res;
1959
+ };
1960
+ var convertJchToJab_default = convertJchToJab;
1961
+
1962
+ // node_modules/culori/src/jch/definition.js
1963
+ var definition12 = {
1964
+ mode: "jch",
1965
+ parse: ["--jzczhz"],
1966
+ serialize: "--jzczhz",
1967
+ toMode: {
1968
+ jab: convertJchToJab_default,
1969
+ rgb: (c) => convertJabToRgb_default(convertJchToJab_default(c))
1970
+ },
1971
+ fromMode: {
1972
+ rgb: (c) => convertJabToJch_default(convertRgbToJab_default(c)),
1973
+ jab: convertJabToJch_default
1974
+ },
1975
+ channels: ["j", "c", "h", "alpha"],
1976
+ ranges: {
1977
+ j: [0, 0.221],
1978
+ c: [0, 0.19],
1979
+ h: [0, 360]
1980
+ },
1981
+ interpolate: {
1982
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1983
+ c: interpolatorLinear,
1984
+ j: interpolatorLinear,
1985
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1986
+ },
1987
+ difference: {
1988
+ h: differenceHueChroma
1989
+ },
1990
+ average: {
1991
+ h: averageAngle
1992
+ }
1993
+ };
1994
+ var definition_default12 = definition12;
1995
+
1996
+ // node_modules/culori/src/xyz50/constants.js
1997
+ var k3 = Math.pow(29, 3) / Math.pow(3, 3);
1998
+ var e3 = Math.pow(6, 3) / Math.pow(29, 3);
1999
+
2000
+ // node_modules/culori/src/lab/convertLabToXyz50.js
2001
+ var fn4 = (v) => Math.pow(v, 3) > e3 ? Math.pow(v, 3) : (116 * v - 16) / k3;
2002
+ var convertLabToXyz50 = ({ l, a, b, alpha }) => {
2003
+ if (l === undefined)
2004
+ l = 0;
2005
+ if (a === undefined)
2006
+ a = 0;
2007
+ if (b === undefined)
2008
+ b = 0;
2009
+ let fy = (l + 16) / 116;
2010
+ let fx = a / 500 + fy;
2011
+ let fz = fy - b / 200;
2012
+ let res = {
2013
+ mode: "xyz50",
2014
+ x: fn4(fx) * D50.X,
2015
+ y: fn4(fy) * D50.Y,
2016
+ z: fn4(fz) * D50.Z
2017
+ };
2018
+ if (alpha !== undefined) {
2019
+ res.alpha = alpha;
2020
+ }
2021
+ return res;
2022
+ };
2023
+ var convertLabToXyz50_default = convertLabToXyz50;
2024
+
2025
+ // node_modules/culori/src/xyz50/convertXyz50ToRgb.js
2026
+ var convertXyz50ToRgb = ({ x, y, z, alpha }) => {
2027
+ if (x === undefined)
2028
+ x = 0;
2029
+ if (y === undefined)
2030
+ y = 0;
2031
+ if (z === undefined)
2032
+ z = 0;
2033
+ let res = convertLrgbToRgb_default({
2034
+ r: x * 3.1341359569958707 - y * 1.6173863321612538 - 0.4906619460083532 * z,
2035
+ g: x * -0.978795502912089 + y * 1.916254567259524 + 0.03344273116131949 * z,
2036
+ b: x * 0.07195537988411677 - y * 0.2289768264158322 + 1.405386058324125 * z
2037
+ });
2038
+ if (alpha !== undefined) {
2039
+ res.alpha = alpha;
2040
+ }
2041
+ return res;
2042
+ };
2043
+ var convertXyz50ToRgb_default = convertXyz50ToRgb;
2044
+
2045
+ // node_modules/culori/src/lab/convertLabToRgb.js
2046
+ var convertLabToRgb = (lab) => convertXyz50ToRgb_default(convertLabToXyz50_default(lab));
2047
+ var convertLabToRgb_default = convertLabToRgb;
2048
+
2049
+ // node_modules/culori/src/xyz50/convertRgbToXyz50.js
2050
+ var convertRgbToXyz50 = (rgb) => {
2051
+ let { r, g, b, alpha } = convertRgbToLrgb_default(rgb);
2052
+ let res = {
2053
+ mode: "xyz50",
2054
+ x: 0.436065742824811 * r + 0.3851514688337912 * g + 0.14307845442264197 * b,
2055
+ y: 0.22249319175623702 * r + 0.7168870538238823 * g + 0.06061979053616537 * b,
2056
+ z: 0.013923904500943465 * r + 0.09708128566574634 * g + 0.7140993584005155 * b
2057
+ };
2058
+ if (alpha !== undefined) {
2059
+ res.alpha = alpha;
2060
+ }
2061
+ return res;
2062
+ };
2063
+ var convertRgbToXyz50_default = convertRgbToXyz50;
2064
+
2065
+ // node_modules/culori/src/lab/convertXyz50ToLab.js
2066
+ var f2 = (value) => value > e3 ? Math.cbrt(value) : (k3 * value + 16) / 116;
2067
+ var convertXyz50ToLab = ({ x, y, z, alpha }) => {
2068
+ if (x === undefined)
2069
+ x = 0;
2070
+ if (y === undefined)
2071
+ y = 0;
2072
+ if (z === undefined)
2073
+ z = 0;
2074
+ let f0 = f2(x / D50.X);
2075
+ let f1 = f2(y / D50.Y);
2076
+ let f22 = f2(z / D50.Z);
2077
+ let res = {
2078
+ mode: "lab",
2079
+ l: 116 * f1 - 16,
2080
+ a: 500 * (f0 - f1),
2081
+ b: 200 * (f1 - f22)
2082
+ };
2083
+ if (alpha !== undefined) {
2084
+ res.alpha = alpha;
2085
+ }
2086
+ return res;
2087
+ };
2088
+ var convertXyz50ToLab_default = convertXyz50ToLab;
2089
+
2090
+ // node_modules/culori/src/lab/convertRgbToLab.js
2091
+ var convertRgbToLab = (rgb) => {
2092
+ let res = convertXyz50ToLab_default(convertRgbToXyz50_default(rgb));
2093
+ if (rgb.r === rgb.b && rgb.b === rgb.g) {
2094
+ res.a = res.b = 0;
2095
+ }
2096
+ return res;
2097
+ };
2098
+ var convertRgbToLab_default = convertRgbToLab;
2099
+
2100
+ // node_modules/culori/src/lab/parseLab.js
2101
+ function parseLab(color, parsed) {
2102
+ if (!parsed || parsed[0] !== "lab") {
2103
+ return;
2104
+ }
2105
+ const res = { mode: "lab" };
2106
+ const [, l, a, b, alpha] = parsed;
2107
+ if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {
2108
+ return;
2109
+ }
2110
+ if (l.type !== Tok.None) {
2111
+ res.l = Math.min(Math.max(0, l.value), 100);
2112
+ }
2113
+ if (a.type !== Tok.None) {
2114
+ res.a = a.type === Tok.Number ? a.value : a.value * 125 / 100;
2115
+ }
2116
+ if (b.type !== Tok.None) {
2117
+ res.b = b.type === Tok.Number ? b.value : b.value * 125 / 100;
2118
+ }
2119
+ if (alpha.type !== Tok.None) {
2120
+ res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
2121
+ }
2122
+ return res;
2123
+ }
2124
+ var parseLab_default = parseLab;
2125
+
2126
+ // node_modules/culori/src/lab/definition.js
2127
+ var definition13 = {
2128
+ mode: "lab",
2129
+ toMode: {
2130
+ xyz50: convertLabToXyz50_default,
2131
+ rgb: convertLabToRgb_default
2132
+ },
2133
+ fromMode: {
2134
+ xyz50: convertXyz50ToLab_default,
2135
+ rgb: convertRgbToLab_default
2136
+ },
2137
+ channels: ["l", "a", "b", "alpha"],
2138
+ ranges: {
2139
+ l: [0, 100],
2140
+ a: [-125, 125],
2141
+ b: [-125, 125]
2142
+ },
2143
+ parse: [parseLab_default],
2144
+ serialize: (c) => `lab(${c.l !== undefined ? c.l : "none"} ${c.a !== undefined ? c.a : "none"} ${c.b !== undefined ? c.b : "none"}${c.alpha < 1 ? ` / ${c.alpha}` : ""})`,
2145
+ interpolate: {
2146
+ l: interpolatorLinear,
2147
+ a: interpolatorLinear,
2148
+ b: interpolatorLinear,
2149
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
2150
+ }
2151
+ };
2152
+ var definition_default13 = definition13;
2153
+
2154
+ // node_modules/culori/src/lab65/definition.js
2155
+ var definition14 = {
2156
+ ...definition_default13,
2157
+ mode: "lab65",
2158
+ parse: ["--lab-d65"],
2159
+ serialize: "--lab-d65",
2160
+ toMode: {
2161
+ xyz65: convertLab65ToXyz65_default,
2162
+ rgb: convertLab65ToRgb_default
2163
+ },
2164
+ fromMode: {
2165
+ xyz65: convertXyz65ToLab65_default,
2166
+ rgb: convertRgbToLab65_default
2167
+ },
2168
+ ranges: {
2169
+ l: [0, 100],
2170
+ a: [-125, 125],
2171
+ b: [-125, 125]
2172
+ }
2173
+ };
2174
+ var definition_default14 = definition14;
2175
+
2176
+ // node_modules/culori/src/lch/parseLch.js
2177
+ function parseLch(color, parsed) {
2178
+ if (!parsed || parsed[0] !== "lch") {
2179
+ return;
2180
+ }
2181
+ const res = { mode: "lch" };
2182
+ const [, l, c, h, alpha] = parsed;
2183
+ if (l.type !== Tok.None) {
2184
+ if (l.type === Tok.Hue) {
2185
+ return;
2186
+ }
2187
+ res.l = Math.min(Math.max(0, l.value), 100);
2188
+ }
2189
+ if (c.type !== Tok.None) {
2190
+ res.c = Math.max(0, c.type === Tok.Number ? c.value : c.value * 150 / 100);
2191
+ }
2192
+ if (h.type !== Tok.None) {
2193
+ if (h.type === Tok.Percentage) {
2194
+ return;
2195
+ }
2196
+ res.h = h.value;
2197
+ }
2198
+ if (alpha.type !== Tok.None) {
2199
+ res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
2200
+ }
2201
+ return res;
2202
+ }
2203
+ var parseLch_default = parseLch;
2204
+
2205
+ // node_modules/culori/src/lch/definition.js
2206
+ var definition15 = {
2207
+ mode: "lch",
2208
+ toMode: {
2209
+ lab: convertLchToLab_default,
2210
+ rgb: (c) => convertLabToRgb_default(convertLchToLab_default(c))
2211
+ },
2212
+ fromMode: {
2213
+ rgb: (c) => convertLabToLch_default(convertRgbToLab_default(c)),
2214
+ lab: convertLabToLch_default
2215
+ },
2216
+ channels: ["l", "c", "h", "alpha"],
2217
+ ranges: {
2218
+ l: [0, 100],
2219
+ c: [0, 150],
2220
+ h: [0, 360]
2221
+ },
2222
+ parse: [parseLch_default],
2223
+ serialize: (c) => `lch(${c.l !== undefined ? c.l : "none"} ${c.c !== undefined ? c.c : "none"} ${c.h !== undefined ? c.h : "none"}${c.alpha < 1 ? ` / ${c.alpha}` : ""})`,
2224
+ interpolate: {
2225
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
2226
+ c: interpolatorLinear,
2227
+ l: interpolatorLinear,
2228
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
2229
+ },
2230
+ difference: {
2231
+ h: differenceHueChroma
2232
+ },
2233
+ average: {
2234
+ h: averageAngle
2235
+ }
2236
+ };
2237
+ var definition_default15 = definition15;
2238
+
2239
+ // node_modules/culori/src/lch65/definition.js
2240
+ var definition16 = {
2241
+ ...definition_default15,
2242
+ mode: "lch65",
2243
+ parse: ["--lch-d65"],
2244
+ serialize: "--lch-d65",
2245
+ toMode: {
2246
+ lab65: (c) => convertLchToLab_default(c, "lab65"),
2247
+ rgb: (c) => convertLab65ToRgb_default(convertLchToLab_default(c, "lab65"))
2248
+ },
2249
+ fromMode: {
2250
+ rgb: (c) => convertLabToLch_default(convertRgbToLab65_default(c), "lch65"),
2251
+ lab65: (c) => convertLabToLch_default(c, "lch65")
2252
+ },
2253
+ ranges: {
2254
+ l: [0, 100],
2255
+ c: [0, 150],
2256
+ h: [0, 360]
2257
+ }
2258
+ };
2259
+ var definition_default16 = definition16;
2260
+
2261
+ // node_modules/culori/src/lchuv/convertLuvToLchuv.js
2262
+ var convertLuvToLchuv = ({ l, u, v, alpha }) => {
2263
+ if (u === undefined)
2264
+ u = 0;
2265
+ if (v === undefined)
2266
+ v = 0;
2267
+ let c = Math.sqrt(u * u + v * v);
2268
+ let res = {
2269
+ mode: "lchuv",
2270
+ l,
2271
+ c
2272
+ };
2273
+ if (c) {
2274
+ res.h = normalizeHue_default(Math.atan2(v, u) * 180 / Math.PI);
2275
+ }
2276
+ if (alpha !== undefined) {
2277
+ res.alpha = alpha;
2278
+ }
2279
+ return res;
2280
+ };
2281
+ var convertLuvToLchuv_default = convertLuvToLchuv;
2282
+
2283
+ // node_modules/culori/src/lchuv/convertLchuvToLuv.js
2284
+ var convertLchuvToLuv = ({ l, c, h, alpha }) => {
2285
+ if (h === undefined)
2286
+ h = 0;
2287
+ let res = {
2288
+ mode: "luv",
2289
+ l,
2290
+ u: c ? c * Math.cos(h / 180 * Math.PI) : 0,
2291
+ v: c ? c * Math.sin(h / 180 * Math.PI) : 0
2292
+ };
2293
+ if (alpha !== undefined) {
2294
+ res.alpha = alpha;
2295
+ }
2296
+ return res;
2297
+ };
2298
+ var convertLchuvToLuv_default = convertLchuvToLuv;
2299
+
2300
+ // node_modules/culori/src/luv/convertXyz50ToLuv.js
2301
+ var u_fn = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);
2302
+ var v_fn = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);
2303
+ var un = u_fn(D50.X, D50.Y, D50.Z);
2304
+ var vn = v_fn(D50.X, D50.Y, D50.Z);
2305
+ var l_fn = (value) => value <= e3 ? k3 * value : 116 * Math.cbrt(value) - 16;
2306
+ var convertXyz50ToLuv = ({ x, y, z, alpha }) => {
2307
+ if (x === undefined)
2308
+ x = 0;
2309
+ if (y === undefined)
2310
+ y = 0;
2311
+ if (z === undefined)
2312
+ z = 0;
2313
+ let l = l_fn(y / D50.Y);
2314
+ let u = u_fn(x, y, z);
2315
+ let v = v_fn(x, y, z);
2316
+ if (!isFinite(u) || !isFinite(v)) {
2317
+ l = u = v = 0;
2318
+ } else {
2319
+ u = 13 * l * (u - un);
2320
+ v = 13 * l * (v - vn);
2321
+ }
2322
+ let res = {
2323
+ mode: "luv",
2324
+ l,
2325
+ u,
2326
+ v
2327
+ };
2328
+ if (alpha !== undefined) {
2329
+ res.alpha = alpha;
2330
+ }
2331
+ return res;
2332
+ };
2333
+ var convertXyz50ToLuv_default = convertXyz50ToLuv;
2334
+
2335
+ // node_modules/culori/src/luv/convertLuvToXyz50.js
2336
+ var u_fn2 = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);
2337
+ var v_fn2 = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);
2338
+ var un2 = u_fn2(D50.X, D50.Y, D50.Z);
2339
+ var vn2 = v_fn2(D50.X, D50.Y, D50.Z);
2340
+ var convertLuvToXyz50 = ({ l, u, v, alpha }) => {
2341
+ if (l === undefined)
2342
+ l = 0;
2343
+ if (l === 0) {
2344
+ return { mode: "xyz50", x: 0, y: 0, z: 0 };
2345
+ }
2346
+ if (u === undefined)
2347
+ u = 0;
2348
+ if (v === undefined)
2349
+ v = 0;
2350
+ let up = u / (13 * l) + un2;
2351
+ let vp = v / (13 * l) + vn2;
2352
+ let y = D50.Y * (l <= 8 ? l / k3 : Math.pow((l + 16) / 116, 3));
2353
+ let x = y * (9 * up) / (4 * vp);
2354
+ let z = y * (12 - 3 * up - 20 * vp) / (4 * vp);
2355
+ let res = { mode: "xyz50", x, y, z };
2356
+ if (alpha !== undefined) {
2357
+ res.alpha = alpha;
2358
+ }
2359
+ return res;
2360
+ };
2361
+ var convertLuvToXyz50_default = convertLuvToXyz50;
2362
+
2363
+ // node_modules/culori/src/lchuv/definition.js
2364
+ var convertRgbToLchuv = (rgb) => convertLuvToLchuv_default(convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb)));
2365
+ var convertLchuvToRgb = (lchuv) => convertXyz50ToRgb_default(convertLuvToXyz50_default(convertLchuvToLuv_default(lchuv)));
2366
+ var definition17 = {
2367
+ mode: "lchuv",
2368
+ toMode: {
2369
+ luv: convertLchuvToLuv_default,
2370
+ rgb: convertLchuvToRgb
2371
+ },
2372
+ fromMode: {
2373
+ rgb: convertRgbToLchuv,
2374
+ luv: convertLuvToLchuv_default
2375
+ },
2376
+ channels: ["l", "c", "h", "alpha"],
2377
+ parse: ["--lchuv"],
2378
+ serialize: "--lchuv",
2379
+ ranges: {
2380
+ l: [0, 100],
2381
+ c: [0, 176.956],
2382
+ h: [0, 360]
2383
+ },
2384
+ interpolate: {
2385
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
2386
+ c: interpolatorLinear,
2387
+ l: interpolatorLinear,
2388
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
2389
+ },
2390
+ difference: {
2391
+ h: differenceHueChroma
2392
+ },
2393
+ average: {
2394
+ h: averageAngle
2395
+ }
2396
+ };
2397
+ var definition_default17 = definition17;
2398
+
2399
+ // node_modules/culori/src/lrgb/definition.js
2400
+ var definition18 = {
2401
+ ...definition_default,
2402
+ mode: "lrgb",
2403
+ toMode: {
2404
+ rgb: convertLrgbToRgb_default
2405
+ },
2406
+ fromMode: {
2407
+ rgb: convertRgbToLrgb_default
2408
+ },
2409
+ parse: ["srgb-linear"],
2410
+ serialize: "srgb-linear"
2411
+ };
2412
+ var definition_default18 = definition18;
2413
+
2414
+ // node_modules/culori/src/luv/definition.js
2415
+ var definition19 = {
2416
+ mode: "luv",
2417
+ toMode: {
2418
+ xyz50: convertLuvToXyz50_default,
2419
+ rgb: (luv) => convertXyz50ToRgb_default(convertLuvToXyz50_default(luv))
2420
+ },
2421
+ fromMode: {
2422
+ xyz50: convertXyz50ToLuv_default,
2423
+ rgb: (rgb) => convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb))
2424
+ },
2425
+ channels: ["l", "u", "v", "alpha"],
2426
+ parse: ["--luv"],
2427
+ serialize: "--luv",
2428
+ ranges: {
2429
+ l: [0, 100],
2430
+ u: [-84.936, 175.042],
2431
+ v: [-125.882, 87.243]
2432
+ },
2433
+ interpolate: {
2434
+ l: interpolatorLinear,
2435
+ u: interpolatorLinear,
2436
+ v: interpolatorLinear,
2437
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
2438
+ }
2439
+ };
2440
+ var definition_default19 = definition19;
2441
+
2442
+ // node_modules/culori/src/oklab/convertLrgbToOklab.js
2443
+ var convertLrgbToOklab = ({ r, g, b, alpha }) => {
2444
+ if (r === undefined)
2445
+ r = 0;
2446
+ if (g === undefined)
2447
+ g = 0;
2448
+ if (b === undefined)
2449
+ b = 0;
2450
+ let L = Math.cbrt(0.412221469470763 * r + 0.5363325372617348 * g + 0.0514459932675022 * b);
2451
+ let M = Math.cbrt(0.2119034958178252 * r + 0.6806995506452344 * g + 0.1073969535369406 * b);
2452
+ let S = Math.cbrt(0.0883024591900564 * r + 0.2817188391361215 * g + 0.6299787016738222 * b);
2453
+ let res = {
2454
+ mode: "oklab",
2455
+ l: 0.210454268309314 * L + 0.7936177747023054 * M - 0.0040720430116193 * S,
2456
+ a: 1.9779985324311684 * L - 2.42859224204858 * M + 0.450593709617411 * S,
2457
+ b: 0.0259040424655478 * L + 0.7827717124575296 * M - 0.8086757549230774 * S
2458
+ };
2459
+ if (alpha !== undefined) {
2460
+ res.alpha = alpha;
2461
+ }
2462
+ return res;
2463
+ };
2464
+ var convertLrgbToOklab_default = convertLrgbToOklab;
2465
+
2466
+ // node_modules/culori/src/oklab/convertRgbToOklab.js
2467
+ var convertRgbToOklab = (rgb) => {
2468
+ let res = convertLrgbToOklab_default(convertRgbToLrgb_default(rgb));
2469
+ if (rgb.r === rgb.b && rgb.b === rgb.g) {
2470
+ res.a = res.b = 0;
2471
+ }
2472
+ return res;
2473
+ };
2474
+ var convertRgbToOklab_default = convertRgbToOklab;
2475
+
2476
+ // node_modules/culori/src/oklab/convertOklabToLrgb.js
2477
+ var convertOklabToLrgb = ({ l, a, b, alpha }) => {
2478
+ if (l === undefined)
2479
+ l = 0;
2480
+ if (a === undefined)
2481
+ a = 0;
2482
+ if (b === undefined)
2483
+ b = 0;
2484
+ let L = Math.pow(l + 0.3963377773761749 * a + 0.2158037573099136 * b, 3);
2485
+ let M = Math.pow(l - 0.1055613458156586 * a - 0.0638541728258133 * b, 3);
2486
+ let S = Math.pow(l - 0.0894841775298119 * a - 1.2914855480194092 * b, 3);
2487
+ let res = {
2488
+ mode: "lrgb",
2489
+ r: 4.076741636075957 * L - 3.3077115392580616 * M + 0.2309699031821044 * S,
2490
+ g: -1.2684379732850317 * L + 2.6097573492876887 * M - 0.3413193760026573 * S,
2491
+ b: -0.0041960761386756 * L - 0.7034186179359362 * M + 1.7076146940746117 * S
2492
+ };
2493
+ if (alpha !== undefined) {
2494
+ res.alpha = alpha;
2495
+ }
2496
+ return res;
2497
+ };
2498
+ var convertOklabToLrgb_default = convertOklabToLrgb;
2499
+
2500
+ // node_modules/culori/src/oklab/convertOklabToRgb.js
2501
+ var convertOklabToRgb = (c) => convertLrgbToRgb_default(convertOklabToLrgb_default(c));
2502
+ var convertOklabToRgb_default = convertOklabToRgb;
2503
+
2504
+ // node_modules/culori/src/okhsl/helpers.js
2505
+ function toe(x) {
2506
+ const k_1 = 0.206;
2507
+ const k_2 = 0.03;
2508
+ const k_3 = (1 + k_1) / (1 + k_2);
2509
+ return 0.5 * (k_3 * x - k_1 + Math.sqrt((k_3 * x - k_1) * (k_3 * x - k_1) + 4 * k_2 * k_3 * x));
2510
+ }
2511
+ function toe_inv(x) {
2512
+ const k_1 = 0.206;
2513
+ const k_2 = 0.03;
2514
+ const k_3 = (1 + k_1) / (1 + k_2);
2515
+ return (x * x + k_1 * x) / (k_3 * (x + k_2));
2516
+ }
2517
+ function compute_max_saturation(a, b) {
2518
+ let k0, k1, k2, k3, k4, wl, wm, ws;
2519
+ if (-1.88170328 * a - 0.80936493 * b > 1) {
2520
+ k0 = 1.19086277;
2521
+ k1 = 1.76576728;
2522
+ k2 = 0.59662641;
2523
+ k3 = 0.75515197;
2524
+ k4 = 0.56771245;
2525
+ wl = 4.0767416621;
2526
+ wm = -3.3077115913;
2527
+ ws = 0.2309699292;
2528
+ } else if (1.81444104 * a - 1.19445276 * b > 1) {
2529
+ k0 = 0.73956515;
2530
+ k1 = -0.45954404;
2531
+ k2 = 0.08285427;
2532
+ k3 = 0.1254107;
2533
+ k4 = 0.14503204;
2534
+ wl = -1.2684380046;
2535
+ wm = 2.6097574011;
2536
+ ws = -0.3413193965;
2537
+ } else {
2538
+ k0 = 1.35733652;
2539
+ k1 = -0.00915799;
2540
+ k2 = -1.1513021;
2541
+ k3 = -0.50559606;
2542
+ k4 = 0.00692167;
2543
+ wl = -0.0041960863;
2544
+ wm = -0.7034186147;
2545
+ ws = 1.707614701;
2546
+ }
2547
+ let S = k0 + k1 * a + k2 * b + k3 * a * a + k4 * a * b;
2548
+ let k_l = 0.3963377774 * a + 0.2158037573 * b;
2549
+ let k_m = -0.1055613458 * a - 0.0638541728 * b;
2550
+ let k_s = -0.0894841775 * a - 1.291485548 * b;
2551
+ {
2552
+ let l_ = 1 + S * k_l;
2553
+ let m_ = 1 + S * k_m;
2554
+ let s_ = 1 + S * k_s;
2555
+ let l = l_ * l_ * l_;
2556
+ let m = m_ * m_ * m_;
2557
+ let s = s_ * s_ * s_;
2558
+ let l_dS = 3 * k_l * l_ * l_;
2559
+ let m_dS = 3 * k_m * m_ * m_;
2560
+ let s_dS = 3 * k_s * s_ * s_;
2561
+ let l_dS2 = 6 * k_l * k_l * l_;
2562
+ let m_dS2 = 6 * k_m * k_m * m_;
2563
+ let s_dS2 = 6 * k_s * k_s * s_;
2564
+ let f = wl * l + wm * m + ws * s;
2565
+ let f1 = wl * l_dS + wm * m_dS + ws * s_dS;
2566
+ let f2 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2;
2567
+ S = S - f * f1 / (f1 * f1 - 0.5 * f * f2);
2568
+ }
2569
+ return S;
2570
+ }
2571
+ function find_cusp(a, b) {
2572
+ let S_cusp = compute_max_saturation(a, b);
2573
+ let rgb = convertOklabToLrgb_default({ l: 1, a: S_cusp * a, b: S_cusp * b });
2574
+ let L_cusp = Math.cbrt(1 / Math.max(rgb.r, rgb.g, rgb.b));
2575
+ let C_cusp = L_cusp * S_cusp;
2576
+ return [L_cusp, C_cusp];
2577
+ }
2578
+ function find_gamut_intersection(a, b, L1, C1, L0, cusp = null) {
2579
+ if (!cusp) {
2580
+ cusp = find_cusp(a, b);
2581
+ }
2582
+ let t;
2583
+ if ((L1 - L0) * cusp[1] - (cusp[0] - L0) * C1 <= 0) {
2584
+ t = cusp[1] * L0 / (C1 * cusp[0] + cusp[1] * (L0 - L1));
2585
+ } else {
2586
+ t = cusp[1] * (L0 - 1) / (C1 * (cusp[0] - 1) + cusp[1] * (L0 - L1));
2587
+ {
2588
+ let dL = L1 - L0;
2589
+ let dC = C1;
2590
+ let k_l = 0.3963377774 * a + 0.2158037573 * b;
2591
+ let k_m = -0.1055613458 * a - 0.0638541728 * b;
2592
+ let k_s = -0.0894841775 * a - 1.291485548 * b;
2593
+ let l_dt = dL + dC * k_l;
2594
+ let m_dt = dL + dC * k_m;
2595
+ let s_dt = dL + dC * k_s;
2596
+ {
2597
+ let L = L0 * (1 - t) + t * L1;
2598
+ let C = t * C1;
2599
+ let l_ = L + C * k_l;
2600
+ let m_ = L + C * k_m;
2601
+ let s_ = L + C * k_s;
2602
+ let l = l_ * l_ * l_;
2603
+ let m = m_ * m_ * m_;
2604
+ let s = s_ * s_ * s_;
2605
+ let ldt = 3 * l_dt * l_ * l_;
2606
+ let mdt = 3 * m_dt * m_ * m_;
2607
+ let sdt = 3 * s_dt * s_ * s_;
2608
+ let ldt2 = 6 * l_dt * l_dt * l_;
2609
+ let mdt2 = 6 * m_dt * m_dt * m_;
2610
+ let sdt2 = 6 * s_dt * s_dt * s_;
2611
+ let r = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s - 1;
2612
+ let r1 = 4.0767416621 * ldt - 3.3077115913 * mdt + 0.2309699292 * sdt;
2613
+ let r2 = 4.0767416621 * ldt2 - 3.3077115913 * mdt2 + 0.2309699292 * sdt2;
2614
+ let u_r = r1 / (r1 * r1 - 0.5 * r * r2);
2615
+ let t_r = -r * u_r;
2616
+ let g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s - 1;
2617
+ let g1 = -1.2684380046 * ldt + 2.6097574011 * mdt - 0.3413193965 * sdt;
2618
+ let g2 = -1.2684380046 * ldt2 + 2.6097574011 * mdt2 - 0.3413193965 * sdt2;
2619
+ let u_g = g1 / (g1 * g1 - 0.5 * g * g2);
2620
+ let t_g = -g * u_g;
2621
+ let b = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s - 1;
2622
+ let b1 = -0.0041960863 * ldt - 0.7034186147 * mdt + 1.707614701 * sdt;
2623
+ let b2 = -0.0041960863 * ldt2 - 0.7034186147 * mdt2 + 1.707614701 * sdt2;
2624
+ let u_b = b1 / (b1 * b1 - 0.5 * b * b2);
2625
+ let t_b = -b * u_b;
2626
+ t_r = u_r >= 0 ? t_r : 1e6;
2627
+ t_g = u_g >= 0 ? t_g : 1e6;
2628
+ t_b = u_b >= 0 ? t_b : 1e6;
2629
+ t += Math.min(t_r, Math.min(t_g, t_b));
2630
+ }
2631
+ }
2632
+ }
2633
+ return t;
2634
+ }
2635
+ function get_ST_max(a_, b_, cusp = null) {
2636
+ if (!cusp) {
2637
+ cusp = find_cusp(a_, b_);
2638
+ }
2639
+ let L = cusp[0];
2640
+ let C = cusp[1];
2641
+ return [C / L, C / (1 - L)];
2642
+ }
2643
+ function get_Cs(L, a_, b_) {
2644
+ let cusp = find_cusp(a_, b_);
2645
+ let C_max = find_gamut_intersection(a_, b_, L, 1, L, cusp);
2646
+ let ST_max = get_ST_max(a_, b_, cusp);
2647
+ let S_mid = 0.11516993 + 1 / (7.4477897 + 4.1590124 * b_ + a_ * (-2.19557347 + 1.75198401 * b_ + a_ * (-2.13704948 - 10.02301043 * b_ + a_ * (-4.24894561 + 5.38770819 * b_ + 4.69891013 * a_))));
2648
+ let T_mid = 0.11239642 + 1 / (1.6132032 - 0.68124379 * b_ + a_ * (0.40370612 + 0.90148123 * b_ + a_ * (-0.27087943 + 0.6122399 * b_ + a_ * (0.00299215 - 0.45399568 * b_ - 0.14661872 * a_))));
2649
+ let k = C_max / Math.min(L * ST_max[0], (1 - L) * ST_max[1]);
2650
+ let C_a = L * S_mid;
2651
+ let C_b = (1 - L) * T_mid;
2652
+ let C_mid = 0.9 * k * Math.sqrt(Math.sqrt(1 / (1 / (C_a * C_a * C_a * C_a) + 1 / (C_b * C_b * C_b * C_b))));
2653
+ C_a = L * 0.4;
2654
+ C_b = (1 - L) * 0.8;
2655
+ let C_0 = Math.sqrt(1 / (1 / (C_a * C_a) + 1 / (C_b * C_b)));
2656
+ return [C_0, C_mid, C_max];
2657
+ }
2658
+
2659
+ // node_modules/culori/src/okhsl/convertOklabToOkhsl.js
2660
+ function convertOklabToOkhsl(lab) {
2661
+ const l = lab.l !== undefined ? lab.l : 0;
2662
+ const a = lab.a !== undefined ? lab.a : 0;
2663
+ const b = lab.b !== undefined ? lab.b : 0;
2664
+ const ret = { mode: "okhsl", l: toe(l) };
2665
+ if (lab.alpha !== undefined) {
2666
+ ret.alpha = lab.alpha;
2667
+ }
2668
+ let c = Math.sqrt(a * a + b * b);
2669
+ if (!c) {
2670
+ ret.s = 0;
2671
+ return ret;
2672
+ }
2673
+ let [C_0, C_mid, C_max] = get_Cs(l, a / c, b / c);
2674
+ let s;
2675
+ if (c < C_mid) {
2676
+ let k_0 = 0;
2677
+ let k_1 = 0.8 * C_0;
2678
+ let k_2 = 1 - k_1 / C_mid;
2679
+ let t = (c - k_0) / (k_1 + k_2 * (c - k_0));
2680
+ s = t * 0.8;
2681
+ } else {
2682
+ let k_0 = C_mid;
2683
+ let k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;
2684
+ let k_2 = 1 - k_1 / (C_max - C_mid);
2685
+ let t = (c - k_0) / (k_1 + k_2 * (c - k_0));
2686
+ s = 0.8 + 0.2 * t;
2687
+ }
2688
+ if (s) {
2689
+ ret.s = s;
2690
+ ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);
2691
+ }
2692
+ return ret;
2693
+ }
2694
+
2695
+ // node_modules/culori/src/okhsl/convertOkhslToOklab.js
2696
+ function convertOkhslToOklab(hsl) {
2697
+ let h = hsl.h !== undefined ? hsl.h : 0;
2698
+ let s = hsl.s !== undefined ? hsl.s : 0;
2699
+ let l = hsl.l !== undefined ? hsl.l : 0;
2700
+ const ret = { mode: "oklab", l: toe_inv(l) };
2701
+ if (hsl.alpha !== undefined) {
2702
+ ret.alpha = hsl.alpha;
2703
+ }
2704
+ if (!s || l === 1) {
2705
+ ret.a = ret.b = 0;
2706
+ return ret;
2707
+ }
2708
+ let a_ = Math.cos(h / 180 * Math.PI);
2709
+ let b_ = Math.sin(h / 180 * Math.PI);
2710
+ let [C_0, C_mid, C_max] = get_Cs(ret.l, a_, b_);
2711
+ let t, k_0, k_1, k_2;
2712
+ if (s < 0.8) {
2713
+ t = 1.25 * s;
2714
+ k_0 = 0;
2715
+ k_1 = 0.8 * C_0;
2716
+ k_2 = 1 - k_1 / C_mid;
2717
+ } else {
2718
+ t = 5 * (s - 0.8);
2719
+ k_0 = C_mid;
2720
+ k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;
2721
+ k_2 = 1 - k_1 / (C_max - C_mid);
2722
+ }
2723
+ let C = k_0 + t * k_1 / (1 - k_2 * t);
2724
+ ret.a = C * a_;
2725
+ ret.b = C * b_;
2726
+ return ret;
2727
+ }
2728
+
2729
+ // node_modules/culori/src/okhsl/modeOkhsl.js
2730
+ var modeOkhsl = {
2731
+ ...definition_default7,
2732
+ mode: "okhsl",
2733
+ channels: ["h", "s", "l", "alpha"],
2734
+ parse: ["--okhsl"],
2735
+ serialize: "--okhsl",
2736
+ fromMode: {
2737
+ oklab: convertOklabToOkhsl,
2738
+ rgb: (c) => convertOklabToOkhsl(convertRgbToOklab_default(c))
2739
+ },
2740
+ toMode: {
2741
+ oklab: convertOkhslToOklab,
2742
+ rgb: (c) => convertOklabToRgb_default(convertOkhslToOklab(c))
2743
+ }
2744
+ };
2745
+ var modeOkhsl_default = modeOkhsl;
2746
+
2747
+ // node_modules/culori/src/okhsv/convertOklabToOkhsv.js
2748
+ function convertOklabToOkhsv(lab) {
2749
+ let l = lab.l !== undefined ? lab.l : 0;
2750
+ let a = lab.a !== undefined ? lab.a : 0;
2751
+ let b = lab.b !== undefined ? lab.b : 0;
2752
+ let c = Math.sqrt(a * a + b * b);
2753
+ let a_ = c ? a / c : 1;
2754
+ let b_ = c ? b / c : 1;
2755
+ let [S_max, T] = get_ST_max(a_, b_);
2756
+ let S_0 = 0.5;
2757
+ let k = 1 - S_0 / S_max;
2758
+ let t = T / (c + l * T);
2759
+ let L_v = t * l;
2760
+ let C_v = t * c;
2761
+ let L_vt = toe_inv(L_v);
2762
+ let C_vt = C_v * L_vt / L_v;
2763
+ let rgb_scale = convertOklabToLrgb_default({ l: L_vt, a: a_ * C_vt, b: b_ * C_vt });
2764
+ let scale_L = Math.cbrt(1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0));
2765
+ l = l / scale_L;
2766
+ c = c / scale_L * toe(l) / l;
2767
+ l = toe(l);
2768
+ const ret = {
2769
+ mode: "okhsv",
2770
+ s: c ? (S_0 + T) * C_v / (T * S_0 + T * k * C_v) : 0,
2771
+ v: l ? l / L_v : 0
2772
+ };
2773
+ if (ret.s) {
2774
+ ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);
2775
+ }
2776
+ if (lab.alpha !== undefined) {
2777
+ ret.alpha = lab.alpha;
2778
+ }
2779
+ return ret;
2780
+ }
2781
+
2782
+ // node_modules/culori/src/okhsv/convertOkhsvToOklab.js
2783
+ function convertOkhsvToOklab(hsv) {
2784
+ const ret = { mode: "oklab" };
2785
+ if (hsv.alpha !== undefined) {
2786
+ ret.alpha = hsv.alpha;
2787
+ }
2788
+ const h = hsv.h !== undefined ? hsv.h : 0;
2789
+ const s = hsv.s !== undefined ? hsv.s : 0;
2790
+ const v = hsv.v !== undefined ? hsv.v : 0;
2791
+ const a_ = Math.cos(h / 180 * Math.PI);
2792
+ const b_ = Math.sin(h / 180 * Math.PI);
2793
+ const [S_max, T] = get_ST_max(a_, b_);
2794
+ const S_0 = 0.5;
2795
+ const k = 1 - S_0 / S_max;
2796
+ const L_v = 1 - s * S_0 / (S_0 + T - T * k * s);
2797
+ const C_v = s * T * S_0 / (S_0 + T - T * k * s);
2798
+ const L_vt = toe_inv(L_v);
2799
+ const C_vt = C_v * L_vt / L_v;
2800
+ const rgb_scale = convertOklabToLrgb_default({
2801
+ l: L_vt,
2802
+ a: a_ * C_vt,
2803
+ b: b_ * C_vt
2804
+ });
2805
+ const scale_L = Math.cbrt(1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0));
2806
+ const L_new = toe_inv(v * L_v);
2807
+ const C = C_v * L_new / L_v;
2808
+ ret.l = L_new * scale_L;
2809
+ ret.a = C * a_ * scale_L;
2810
+ ret.b = C * b_ * scale_L;
2811
+ return ret;
2812
+ }
2813
+
2814
+ // node_modules/culori/src/okhsv/modeOkhsv.js
2815
+ var modeOkhsv = {
2816
+ ...definition_default8,
2817
+ mode: "okhsv",
2818
+ channels: ["h", "s", "v", "alpha"],
2819
+ parse: ["--okhsv"],
2820
+ serialize: "--okhsv",
2821
+ fromMode: {
2822
+ oklab: convertOklabToOkhsv,
2823
+ rgb: (c) => convertOklabToOkhsv(convertRgbToOklab_default(c))
2824
+ },
2825
+ toMode: {
2826
+ oklab: convertOkhsvToOklab,
2827
+ rgb: (c) => convertOklabToRgb_default(convertOkhsvToOklab(c))
2828
+ }
2829
+ };
2830
+ var modeOkhsv_default = modeOkhsv;
2831
+
2832
+ // node_modules/culori/src/oklab/parseOklab.js
2833
+ function parseOklab(color, parsed) {
2834
+ if (!parsed || parsed[0] !== "oklab") {
2835
+ return;
2836
+ }
2837
+ const res = { mode: "oklab" };
2838
+ const [, l, a, b, alpha] = parsed;
2839
+ if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {
2840
+ return;
2841
+ }
2842
+ if (l.type !== Tok.None) {
2843
+ res.l = Math.min(Math.max(0, l.type === Tok.Number ? l.value : l.value / 100), 1);
2844
+ }
2845
+ if (a.type !== Tok.None) {
2846
+ res.a = a.type === Tok.Number ? a.value : a.value * 0.4 / 100;
2847
+ }
2848
+ if (b.type !== Tok.None) {
2849
+ res.b = b.type === Tok.Number ? b.value : b.value * 0.4 / 100;
2850
+ }
2851
+ if (alpha.type !== Tok.None) {
2852
+ res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
2853
+ }
2854
+ return res;
2855
+ }
2856
+ var parseOklab_default = parseOklab;
2857
+
2858
+ // node_modules/culori/src/oklab/definition.js
2859
+ var definition20 = {
2860
+ ...definition_default13,
2861
+ mode: "oklab",
2862
+ toMode: {
2863
+ lrgb: convertOklabToLrgb_default,
2864
+ rgb: convertOklabToRgb_default
2865
+ },
2866
+ fromMode: {
2867
+ lrgb: convertLrgbToOklab_default,
2868
+ rgb: convertRgbToOklab_default
2869
+ },
2870
+ ranges: {
2871
+ l: [0, 1],
2872
+ a: [-0.4, 0.4],
2873
+ b: [-0.4, 0.4]
2874
+ },
2875
+ parse: [parseOklab_default],
2876
+ serialize: (c) => `oklab(${c.l !== undefined ? c.l : "none"} ${c.a !== undefined ? c.a : "none"} ${c.b !== undefined ? c.b : "none"}${c.alpha < 1 ? ` / ${c.alpha}` : ""})`
2877
+ };
2878
+ var definition_default20 = definition20;
2879
+
2880
+ // node_modules/culori/src/oklch/parseOklch.js
2881
+ function parseOklch(color, parsed) {
2882
+ if (!parsed || parsed[0] !== "oklch") {
2883
+ return;
2884
+ }
2885
+ const res = { mode: "oklch" };
2886
+ const [, l, c, h, alpha] = parsed;
2887
+ if (l.type !== Tok.None) {
2888
+ if (l.type === Tok.Hue) {
2889
+ return;
2890
+ }
2891
+ res.l = Math.min(Math.max(0, l.type === Tok.Number ? l.value : l.value / 100), 1);
2892
+ }
2893
+ if (c.type !== Tok.None) {
2894
+ res.c = Math.max(0, c.type === Tok.Number ? c.value : c.value * 0.4 / 100);
2895
+ }
2896
+ if (h.type !== Tok.None) {
2897
+ if (h.type === Tok.Percentage) {
2898
+ return;
2899
+ }
2900
+ res.h = h.value;
2901
+ }
2902
+ if (alpha.type !== Tok.None) {
2903
+ res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
2904
+ }
2905
+ return res;
2906
+ }
2907
+ var parseOklch_default = parseOklch;
2908
+
2909
+ // node_modules/culori/src/oklch/definition.js
2910
+ var definition21 = {
2911
+ ...definition_default15,
2912
+ mode: "oklch",
2913
+ toMode: {
2914
+ oklab: (c) => convertLchToLab_default(c, "oklab"),
2915
+ rgb: (c) => convertOklabToRgb_default(convertLchToLab_default(c, "oklab"))
2916
+ },
2917
+ fromMode: {
2918
+ rgb: (c) => convertLabToLch_default(convertRgbToOklab_default(c), "oklch"),
2919
+ oklab: (c) => convertLabToLch_default(c, "oklch")
2920
+ },
2921
+ parse: [parseOklch_default],
2922
+ serialize: (c) => `oklch(${c.l !== undefined ? c.l : "none"} ${c.c !== undefined ? c.c : "none"} ${c.h !== undefined ? c.h : "none"}${c.alpha < 1 ? ` / ${c.alpha}` : ""})`,
2923
+ ranges: {
2924
+ l: [0, 1],
2925
+ c: [0, 0.4],
2926
+ h: [0, 360]
2927
+ }
2928
+ };
2929
+ var definition_default21 = definition21;
2930
+
2931
+ // node_modules/culori/src/p3/convertP3ToXyz65.js
2932
+ var convertP3ToXyz65 = (rgb) => {
2933
+ let { r, g, b, alpha } = convertRgbToLrgb_default(rgb);
2934
+ let res = {
2935
+ mode: "xyz65",
2936
+ x: 0.486570948648216 * r + 0.265667693169093 * g + 0.1982172852343625 * b,
2937
+ y: 0.2289745640697487 * r + 0.6917385218365062 * g + 0.079286914093745 * b,
2938
+ z: 0 * r + 0.0451133818589026 * g + 1.043944368900976 * b
2939
+ };
2940
+ if (alpha !== undefined) {
2941
+ res.alpha = alpha;
2942
+ }
2943
+ return res;
2944
+ };
2945
+ var convertP3ToXyz65_default = convertP3ToXyz65;
2946
+
2947
+ // node_modules/culori/src/p3/convertXyz65ToP3.js
2948
+ var convertXyz65ToP3 = ({ x, y, z, alpha }) => {
2949
+ if (x === undefined)
2950
+ x = 0;
2951
+ if (y === undefined)
2952
+ y = 0;
2953
+ if (z === undefined)
2954
+ z = 0;
2955
+ let res = convertLrgbToRgb_default({
2956
+ r: x * 2.4934969119414263 - y * 0.9313836179191242 - 0.402710784450717 * z,
2957
+ g: x * -0.8294889695615749 + y * 1.7626640603183465 + 0.0236246858419436 * z,
2958
+ b: x * 0.0358458302437845 - y * 0.0761723892680418 + 0.9568845240076871 * z
2959
+ }, "p3");
2960
+ if (alpha !== undefined) {
2961
+ res.alpha = alpha;
2962
+ }
2963
+ return res;
2964
+ };
2965
+ var convertXyz65ToP3_default = convertXyz65ToP3;
2966
+
2967
+ // node_modules/culori/src/p3/definition.js
2968
+ var definition22 = {
2969
+ ...definition_default,
2970
+ mode: "p3",
2971
+ parse: ["display-p3"],
2972
+ serialize: "display-p3",
2973
+ fromMode: {
2974
+ rgb: (color) => convertXyz65ToP3_default(convertRgbToXyz65_default(color)),
2975
+ xyz65: convertXyz65ToP3_default
2976
+ },
2977
+ toMode: {
2978
+ rgb: (color) => convertXyz65ToRgb_default(convertP3ToXyz65_default(color)),
2979
+ xyz65: convertP3ToXyz65_default
2980
+ }
2981
+ };
2982
+ var definition_default22 = definition22;
2983
+
2984
+ // node_modules/culori/src/prophoto/convertXyz50ToProphoto.js
2985
+ var gamma2 = (v) => {
2986
+ let abs = Math.abs(v);
2987
+ if (abs >= 1 / 512) {
2988
+ return Math.sign(v) * Math.pow(abs, 1 / 1.8);
2989
+ }
2990
+ return 16 * v;
2991
+ };
2992
+ var convertXyz50ToProphoto = ({ x, y, z, alpha }) => {
2993
+ if (x === undefined)
2994
+ x = 0;
2995
+ if (y === undefined)
2996
+ y = 0;
2997
+ if (z === undefined)
2998
+ z = 0;
2999
+ let res = {
3000
+ mode: "prophoto",
3001
+ r: gamma2(x * 1.3457868816471585 - y * 0.2555720873797946 - 0.0511018649755453 * z),
3002
+ g: gamma2(x * -0.5446307051249019 + y * 1.5082477428451466 + 0.0205274474364214 * z),
3003
+ b: gamma2(x * 0 + y * 0 + 1.2119675456389452 * z)
3004
+ };
3005
+ if (alpha !== undefined) {
3006
+ res.alpha = alpha;
3007
+ }
3008
+ return res;
3009
+ };
3010
+ var convertXyz50ToProphoto_default = convertXyz50ToProphoto;
3011
+
3012
+ // node_modules/culori/src/prophoto/convertProphotoToXyz50.js
3013
+ var linearize2 = (v = 0) => {
3014
+ let abs = Math.abs(v);
3015
+ if (abs >= 16 / 512) {
3016
+ return Math.sign(v) * Math.pow(abs, 1.8);
3017
+ }
3018
+ return v / 16;
3019
+ };
3020
+ var convertProphotoToXyz50 = (prophoto) => {
3021
+ let r = linearize2(prophoto.r);
3022
+ let g = linearize2(prophoto.g);
3023
+ let b = linearize2(prophoto.b);
3024
+ let res = {
3025
+ mode: "xyz50",
3026
+ x: 0.7977666449006423 * r + 0.1351812974005331 * g + 0.0313477341283922 * b,
3027
+ y: 0.2880748288194013 * r + 0.7118352342418731 * g + 0.0000899369387256 * b,
3028
+ z: 0 * r + 0 * g + 0.8251046025104602 * b
3029
+ };
3030
+ if (prophoto.alpha !== undefined) {
3031
+ res.alpha = prophoto.alpha;
3032
+ }
3033
+ return res;
3034
+ };
3035
+ var convertProphotoToXyz50_default = convertProphotoToXyz50;
3036
+
3037
+ // node_modules/culori/src/prophoto/definition.js
3038
+ var definition23 = {
3039
+ ...definition_default,
3040
+ mode: "prophoto",
3041
+ parse: ["prophoto-rgb"],
3042
+ serialize: "prophoto-rgb",
3043
+ fromMode: {
3044
+ xyz50: convertXyz50ToProphoto_default,
3045
+ rgb: (color) => convertXyz50ToProphoto_default(convertRgbToXyz50_default(color))
3046
+ },
3047
+ toMode: {
3048
+ xyz50: convertProphotoToXyz50_default,
3049
+ rgb: (color) => convertXyz50ToRgb_default(convertProphotoToXyz50_default(color))
3050
+ }
3051
+ };
3052
+ var definition_default23 = definition23;
3053
+
3054
+ // node_modules/culori/src/rec2020/convertXyz65ToRec2020.js
3055
+ var α = 1.09929682680944;
3056
+ var β = 0.018053968510807;
3057
+ var gamma3 = (v) => {
3058
+ const abs = Math.abs(v);
3059
+ if (abs > β) {
3060
+ return (Math.sign(v) || 1) * (α * Math.pow(abs, 0.45) - (α - 1));
3061
+ }
3062
+ return 4.5 * v;
3063
+ };
3064
+ var convertXyz65ToRec2020 = ({ x, y, z, alpha }) => {
3065
+ if (x === undefined)
3066
+ x = 0;
3067
+ if (y === undefined)
3068
+ y = 0;
3069
+ if (z === undefined)
3070
+ z = 0;
3071
+ let res = {
3072
+ mode: "rec2020",
3073
+ r: gamma3(x * 1.7166511879712683 - y * 0.3556707837763925 - 0.2533662813736599 * z),
3074
+ g: gamma3(x * -0.6666843518324893 + y * 1.6164812366349395 + 0.0157685458139111 * z),
3075
+ b: gamma3(x * 0.0176398574453108 - y * 0.0427706132578085 + 0.9421031212354739 * z)
3076
+ };
3077
+ if (alpha !== undefined) {
3078
+ res.alpha = alpha;
3079
+ }
3080
+ return res;
3081
+ };
3082
+ var convertXyz65ToRec2020_default = convertXyz65ToRec2020;
3083
+
3084
+ // node_modules/culori/src/rec2020/convertRec2020ToXyz65.js
3085
+ var α2 = 1.09929682680944;
3086
+ var β2 = 0.018053968510807;
3087
+ var linearize3 = (v = 0) => {
3088
+ let abs = Math.abs(v);
3089
+ if (abs < β2 * 4.5) {
3090
+ return v / 4.5;
3091
+ }
3092
+ return (Math.sign(v) || 1) * Math.pow((abs + α2 - 1) / α2, 1 / 0.45);
3093
+ };
3094
+ var convertRec2020ToXyz65 = (rec2020) => {
3095
+ let r = linearize3(rec2020.r);
3096
+ let g = linearize3(rec2020.g);
3097
+ let b = linearize3(rec2020.b);
3098
+ let res = {
3099
+ mode: "xyz65",
3100
+ x: 0.6369580483012911 * r + 0.1446169035862083 * g + 0.1688809751641721 * b,
3101
+ y: 0.262700212011267 * r + 0.6779980715188708 * g + 0.059301716469862 * b,
3102
+ z: 0 * r + 0.0280726930490874 * g + 1.0609850577107909 * b
3103
+ };
3104
+ if (rec2020.alpha !== undefined) {
3105
+ res.alpha = rec2020.alpha;
3106
+ }
3107
+ return res;
3108
+ };
3109
+ var convertRec2020ToXyz65_default = convertRec2020ToXyz65;
3110
+
3111
+ // node_modules/culori/src/rec2020/definition.js
3112
+ var definition24 = {
3113
+ ...definition_default,
3114
+ mode: "rec2020",
3115
+ fromMode: {
3116
+ xyz65: convertXyz65ToRec2020_default,
3117
+ rgb: (color) => convertXyz65ToRec2020_default(convertRgbToXyz65_default(color))
3118
+ },
3119
+ toMode: {
3120
+ xyz65: convertRec2020ToXyz65_default,
3121
+ rgb: (color) => convertXyz65ToRgb_default(convertRec2020ToXyz65_default(color))
3122
+ },
3123
+ parse: ["rec2020"],
3124
+ serialize: "rec2020"
3125
+ };
3126
+ var definition_default24 = definition24;
3127
+
3128
+ // node_modules/culori/src/xyb/constants.js
3129
+ var bias = 0.0037930732552754493;
3130
+ var bias_cbrt = Math.cbrt(bias);
3131
+
3132
+ // node_modules/culori/src/xyb/convertRgbToXyb.js
3133
+ var transfer = (v) => Math.cbrt(v) - bias_cbrt;
3134
+ var convertRgbToXyb = (color) => {
3135
+ const { r, g, b, alpha } = convertRgbToLrgb_default(color);
3136
+ const l = transfer(0.3 * r + 0.622 * g + 0.078 * b + bias);
3137
+ const m = transfer(0.23 * r + 0.692 * g + 0.078 * b + bias);
3138
+ const s = transfer(0.2434226892454782 * r + 0.2047674442449682 * g + 0.5518098665095535 * b + bias);
3139
+ const res = {
3140
+ mode: "xyb",
3141
+ x: (l - m) / 2,
3142
+ y: (l + m) / 2,
3143
+ b: s - (l + m) / 2
3144
+ };
3145
+ if (alpha !== undefined)
3146
+ res.alpha = alpha;
3147
+ return res;
3148
+ };
3149
+ var convertRgbToXyb_default = convertRgbToXyb;
3150
+
3151
+ // node_modules/culori/src/xyb/convertXybToRgb.js
3152
+ var transfer2 = (v) => Math.pow(v + bias_cbrt, 3);
3153
+ var convertXybToRgb = ({ x, y, b, alpha }) => {
3154
+ if (x === undefined)
3155
+ x = 0;
3156
+ if (y === undefined)
3157
+ y = 0;
3158
+ if (b === undefined)
3159
+ b = 0;
3160
+ const l = transfer2(x + y) - bias;
3161
+ const m = transfer2(y - x) - bias;
3162
+ const s = transfer2(b + y) - bias;
3163
+ const res = convertLrgbToRgb_default({
3164
+ r: 11.031566904639861 * l - 9.866943908131562 * m - 0.16462299650829934 * s,
3165
+ g: -3.2541473810744237 * l + 4.418770377582723 * m - 0.16462299650829934 * s,
3166
+ b: -3.6588512867136815 * l + 2.7129230459360922 * m + 1.9459282407775895 * s
3167
+ });
3168
+ if (alpha !== undefined)
3169
+ res.alpha = alpha;
3170
+ return res;
3171
+ };
3172
+ var convertXybToRgb_default = convertXybToRgb;
3173
+
3174
+ // node_modules/culori/src/xyb/definition.js
3175
+ var definition25 = {
3176
+ mode: "xyb",
3177
+ channels: ["x", "y", "b", "alpha"],
3178
+ parse: ["--xyb"],
3179
+ serialize: "--xyb",
3180
+ toMode: {
3181
+ rgb: convertXybToRgb_default
3182
+ },
3183
+ fromMode: {
3184
+ rgb: convertRgbToXyb_default
3185
+ },
3186
+ ranges: {
3187
+ x: [-0.0154, 0.0281],
3188
+ y: [0, 0.8453],
3189
+ b: [-0.2778, 0.388]
3190
+ },
3191
+ interpolate: {
3192
+ x: interpolatorLinear,
3193
+ y: interpolatorLinear,
3194
+ b: interpolatorLinear,
3195
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
3196
+ }
3197
+ };
3198
+ var definition_default25 = definition25;
3199
+
3200
+ // node_modules/culori/src/xyz50/definition.js
3201
+ var definition26 = {
3202
+ mode: "xyz50",
3203
+ parse: ["xyz-d50"],
3204
+ serialize: "xyz-d50",
3205
+ toMode: {
3206
+ rgb: convertXyz50ToRgb_default,
3207
+ lab: convertXyz50ToLab_default
3208
+ },
3209
+ fromMode: {
3210
+ rgb: convertRgbToXyz50_default,
3211
+ lab: convertLabToXyz50_default
3212
+ },
3213
+ channels: ["x", "y", "z", "alpha"],
3214
+ ranges: {
3215
+ x: [0, 0.964],
3216
+ y: [0, 0.999],
3217
+ z: [0, 0.825]
3218
+ },
3219
+ interpolate: {
3220
+ x: interpolatorLinear,
3221
+ y: interpolatorLinear,
3222
+ z: interpolatorLinear,
3223
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
3224
+ }
3225
+ };
3226
+ var definition_default26 = definition26;
3227
+
3228
+ // node_modules/culori/src/xyz65/convertXyz65ToXyz50.js
3229
+ var convertXyz65ToXyz50 = (xyz65) => {
3230
+ let { x, y, z, alpha } = xyz65;
3231
+ if (x === undefined)
3232
+ x = 0;
3233
+ if (y === undefined)
3234
+ y = 0;
3235
+ if (z === undefined)
3236
+ z = 0;
3237
+ let res = {
3238
+ mode: "xyz50",
3239
+ x: 1.0479298208405488 * x + 0.0229467933410191 * y - 0.0501922295431356 * z,
3240
+ y: 0.0296278156881593 * x + 0.990434484573249 * y - 0.0170738250293851 * z,
3241
+ z: -0.0092430581525912 * x + 0.0150551448965779 * y + 0.7518742899580008 * z
3242
+ };
3243
+ if (alpha !== undefined) {
3244
+ res.alpha = alpha;
3245
+ }
3246
+ return res;
3247
+ };
3248
+ var convertXyz65ToXyz50_default = convertXyz65ToXyz50;
3249
+
3250
+ // node_modules/culori/src/xyz65/convertXyz50ToXyz65.js
3251
+ var convertXyz50ToXyz65 = (xyz50) => {
3252
+ let { x, y, z, alpha } = xyz50;
3253
+ if (x === undefined)
3254
+ x = 0;
3255
+ if (y === undefined)
3256
+ y = 0;
3257
+ if (z === undefined)
3258
+ z = 0;
3259
+ let res = {
3260
+ mode: "xyz65",
3261
+ x: 0.9554734527042182 * x - 0.0230985368742614 * y + 0.0632593086610217 * z,
3262
+ y: -0.0283697069632081 * x + 1.0099954580058226 * y + 0.021041398966943 * z,
3263
+ z: 0.0123140016883199 * x - 0.0205076964334779 * y + 1.3303659366080753 * z
3264
+ };
3265
+ if (alpha !== undefined) {
3266
+ res.alpha = alpha;
3267
+ }
3268
+ return res;
3269
+ };
3270
+ var convertXyz50ToXyz65_default = convertXyz50ToXyz65;
3271
+
3272
+ // node_modules/culori/src/xyz65/definition.js
3273
+ var definition27 = {
3274
+ mode: "xyz65",
3275
+ toMode: {
3276
+ rgb: convertXyz65ToRgb_default,
3277
+ xyz50: convertXyz65ToXyz50_default
3278
+ },
3279
+ fromMode: {
3280
+ rgb: convertRgbToXyz65_default,
3281
+ xyz50: convertXyz50ToXyz65_default
3282
+ },
3283
+ ranges: {
3284
+ x: [0, 0.95],
3285
+ y: [0, 1],
3286
+ z: [0, 1.088]
3287
+ },
3288
+ channels: ["x", "y", "z", "alpha"],
3289
+ parse: ["xyz", "xyz-d65"],
3290
+ serialize: "xyz-d65",
3291
+ interpolate: {
3292
+ x: interpolatorLinear,
3293
+ y: interpolatorLinear,
3294
+ z: interpolatorLinear,
3295
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
3296
+ }
3297
+ };
3298
+ var definition_default27 = definition27;
3299
+
3300
+ // node_modules/culori/src/yiq/convertRgbToYiq.js
3301
+ var convertRgbToYiq = ({ r, g, b, alpha }) => {
3302
+ if (r === undefined)
3303
+ r = 0;
3304
+ if (g === undefined)
3305
+ g = 0;
3306
+ if (b === undefined)
3307
+ b = 0;
3308
+ const res = {
3309
+ mode: "yiq",
3310
+ y: 0.29889531 * r + 0.58662247 * g + 0.11448223 * b,
3311
+ i: 0.59597799 * r - 0.2741761 * g - 0.32180189 * b,
3312
+ q: 0.21147017 * r - 0.52261711 * g + 0.31114694 * b
3313
+ };
3314
+ if (alpha !== undefined)
3315
+ res.alpha = alpha;
3316
+ return res;
3317
+ };
3318
+ var convertRgbToYiq_default = convertRgbToYiq;
3319
+
3320
+ // node_modules/culori/src/yiq/convertYiqToRgb.js
3321
+ var convertYiqToRgb = ({ y, i, q, alpha }) => {
3322
+ if (y === undefined)
3323
+ y = 0;
3324
+ if (i === undefined)
3325
+ i = 0;
3326
+ if (q === undefined)
3327
+ q = 0;
3328
+ const res = {
3329
+ mode: "rgb",
3330
+ r: y + 0.95608445 * i + 0.6208885 * q,
3331
+ g: y - 0.27137664 * i - 0.6486059 * q,
3332
+ b: y - 1.10561724 * i + 1.70250126 * q
3333
+ };
3334
+ if (alpha !== undefined)
3335
+ res.alpha = alpha;
3336
+ return res;
3337
+ };
3338
+ var convertYiqToRgb_default = convertYiqToRgb;
3339
+
3340
+ // node_modules/culori/src/yiq/definition.js
3341
+ var definition28 = {
3342
+ mode: "yiq",
3343
+ toMode: {
3344
+ rgb: convertYiqToRgb_default
3345
+ },
3346
+ fromMode: {
3347
+ rgb: convertRgbToYiq_default
3348
+ },
3349
+ channels: ["y", "i", "q", "alpha"],
3350
+ parse: ["--yiq"],
3351
+ serialize: "--yiq",
3352
+ ranges: {
3353
+ i: [-0.595, 0.595],
3354
+ q: [-0.522, 0.522]
3355
+ },
3356
+ interpolate: {
3357
+ y: interpolatorLinear,
3358
+ i: interpolatorLinear,
3359
+ q: interpolatorLinear,
3360
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
3361
+ }
3362
+ };
3363
+ var definition_default28 = definition28;
3364
+
3365
+ // node_modules/culori/src/round.js
3366
+ var r = (value, precision) => Math.round(value * (precision = Math.pow(10, precision))) / precision;
3367
+ var round = (precision = 4) => (value) => typeof value === "number" ? r(value, precision) : value;
3368
+ var round_default = round;
3369
+
3370
+ // node_modules/culori/src/formatter.js
3371
+ var twoDecimals = round_default(2);
3372
+ var clamp = (value) => Math.max(0, Math.min(1, value || 0));
3373
+ var fixup = (value) => Math.round(clamp(value) * 255);
3374
+ var rgb = converter_default("rgb");
3375
+ var hsl = converter_default("hsl");
3376
+ var serializeHex = (color) => {
3377
+ if (color === undefined) {
3378
+ return;
3379
+ }
3380
+ let r = fixup(color.r);
3381
+ let g = fixup(color.g);
3382
+ let b = fixup(color.b);
3383
+ return "#" + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);
3384
+ };
3385
+ var serializeHex8 = (color) => {
3386
+ if (color === undefined) {
3387
+ return;
3388
+ }
3389
+ let a = fixup(color.alpha !== undefined ? color.alpha : 1);
3390
+ return serializeHex(color) + (1 << 8 | a).toString(16).slice(1);
3391
+ };
3392
+ var formatHex = (c) => serializeHex(rgb(c));
3393
+ var formatHex8 = (c) => serializeHex8(rgb(c));
3394
+ // node_modules/culori/src/index.js
3395
+ var a98 = useMode(definition_default2);
3396
+ var cubehelix = useMode(definition_default3);
3397
+ var dlab = useMode(definition_default4);
3398
+ var dlch = useMode(definition_default5);
3399
+ var hsi = useMode(definition_default6);
3400
+ var hsl2 = useMode(definition_default7);
3401
+ var hsv = useMode(definition_default8);
3402
+ var hwb = useMode(definition_default9);
3403
+ var itp = useMode(definition_default10);
3404
+ var jab = useMode(definition_default11);
3405
+ var jch = useMode(definition_default12);
3406
+ var lab = useMode(definition_default13);
3407
+ var lab65 = useMode(definition_default14);
3408
+ var lch = useMode(definition_default15);
3409
+ var lch65 = useMode(definition_default16);
3410
+ var lchuv = useMode(definition_default17);
3411
+ var lrgb = useMode(definition_default18);
3412
+ var luv = useMode(definition_default19);
3413
+ var okhsl = useMode(modeOkhsl_default);
3414
+ var okhsv = useMode(modeOkhsv_default);
3415
+ var oklab = useMode(definition_default20);
3416
+ var oklch = useMode(definition_default21);
3417
+ var p3 = useMode(definition_default22);
3418
+ var prophoto = useMode(definition_default23);
3419
+ var rec2020 = useMode(definition_default24);
3420
+ var rgb2 = useMode(definition_default);
3421
+ var xyb = useMode(definition_default25);
3422
+ var xyz50 = useMode(definition_default26);
3423
+ var xyz65 = useMode(definition_default27);
3424
+ var yiq = useMode(definition_default28);
3425
+
1
3426
  // src/utils/themes.ts
2
3427
  var themes = {
3
3428
  default: {
@@ -164,43 +3589,524 @@ function resolveColors(opts) {
164
3589
  icon: opts.icon_color || base.icon,
165
3590
  border: opts.border_color || base.border
166
3591
  };
167
- }
168
- // src/utils/format.ts
169
- function kFormat(num) {
170
- const trim = (v) => v.toFixed(1).replace(/\.0$/, "");
171
- if (num >= 999950)
172
- return trim(num / 1e6) + "M";
173
- if (num >= 999.95)
174
- return trim(num / 1000) + "k";
175
- return String(Math.round(num));
176
- }
177
- function escapeXml(str) {
178
- return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
179
- }
180
- function wrapText(input, maxLen, maxLines) {
181
- const words = input.split(/\s+/).filter(Boolean);
182
- const lines = [];
183
- let current = "";
184
- for (const word of words) {
185
- const next = current ? `${current} ${word}` : word;
186
- if (next.length <= maxLen) {
187
- current = next;
188
- continue;
3592
+ }
3593
+ // src/utils/format.ts
3594
+ function kFormat(num) {
3595
+ const sign = num < 0 ? "-" : "";
3596
+ const abs = Math.abs(num);
3597
+ const trim = (v) => v.toFixed(1).replace(/\.0$/, "");
3598
+ if (abs >= 999950000)
3599
+ return sign + trim(abs / 1e9) + "B";
3600
+ if (abs >= 999950)
3601
+ return sign + trim(abs / 1e6) + "M";
3602
+ if (abs >= 999.95)
3603
+ return sign + trim(abs / 1000) + "k";
3604
+ return sign + String(Math.round(abs));
3605
+ }
3606
+ function measureText(text, size, weight = 400) {
3607
+ if (!text)
3608
+ return 0;
3609
+ const factor = size;
3610
+ const weightFactor = weight >= 700 ? 1.08 : weight >= 600 ? 1.04 : 1;
3611
+ let width = 0;
3612
+ for (const ch of text) {
3613
+ const code = ch.codePointAt(0);
3614
+ let w;
3615
+ if (ch === " ")
3616
+ w = 0.28;
3617
+ else if (ch === "." || ch === "," || ch === ":" || ch === ";")
3618
+ w = 0.3;
3619
+ else if (ch === "i" || ch === "l" || ch === "I" || ch === "t" || ch === "j" || ch === "|")
3620
+ w = 0.3;
3621
+ else if (ch === "m" || ch === "w" || ch === "W" || ch === "M" || ch === "@")
3622
+ w = 0.95;
3623
+ else if (code >= 4352 && code <= 4607)
3624
+ w = 1;
3625
+ else if (code >= 19968 && code <= 40959)
3626
+ w = 1;
3627
+ else if (code >= 12352 && code <= 12543)
3628
+ w = 1;
3629
+ else if (code >= 44032 && code <= 55215)
3630
+ w = 1;
3631
+ else if (code > 127)
3632
+ w = 0.72;
3633
+ else
3634
+ w = 0.58;
3635
+ width += w;
3636
+ }
3637
+ return width * factor * weightFactor;
3638
+ }
3639
+ function escapeXml(str) {
3640
+ return str.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\ufffe\uffff\ud800-\udfff]/gu, "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
3641
+ }
3642
+ function wrapText(input, maxLen, maxLines) {
3643
+ if (maxLen < 1 || maxLines < 1)
3644
+ return [];
3645
+ let remaining = Array.from(input.trim().replace(/\s+/g, " "));
3646
+ const lines = [];
3647
+ while (remaining.length && lines.length < maxLines) {
3648
+ if (remaining.length <= maxLen) {
3649
+ lines.push(remaining.join(""));
3650
+ break;
3651
+ }
3652
+ if (lines.length === maxLines - 1) {
3653
+ lines.push(remaining.slice(0, maxLen - 1).join("").trimEnd() + "…");
3654
+ break;
3655
+ }
3656
+ const space = remaining.lastIndexOf(" ", maxLen);
3657
+ const end = space > 0 ? space : maxLen;
3658
+ lines.push(remaining.slice(0, end).join(""));
3659
+ remaining = remaining.slice(end);
3660
+ if (remaining[0] === " ")
3661
+ remaining.shift();
3662
+ }
3663
+ return lines;
3664
+ }
3665
+ // src/utils/icons.ts
3666
+ var icons = {
3667
+ star: `<path d="M10.92 2.868a1.25 1.25 0 0 1 2.16 0l2.795 4.798l5.428 1.176a1.25 1.25 0 0 1 .667 2.054l-3.7 4.141l.56 5.525a1.25 1.25 0 0 1-1.748 1.27L12 19.592l-5.082 2.24a1.25 1.25 0 0 1-1.748-1.27l.56-5.525l-3.7-4.14a1.25 1.25 0 0 1 .667-2.055l5.428-1.176z"/>`,
3668
+ commit: `<path fill-rule="evenodd" d="M10.5 7.75a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0zm1.43.75a4.002 4.002 0 01-7.86 0H.75a.75.75 0 110-1.5h3.32a4.001 4.001 0 017.86 0h3.32a.75.75 0 110 1.5h-3.32z"/>`,
3669
+ pr: `<path d="M4 18a2 2 0 1 0 4 0a2 2 0 1 0-4 0M4 6a2 2 0 1 0 4 0a2 2 0 1 0-4 0m12 12a2 2 0 1 0 4 0a2 2 0 1 0-4 0M6 8v8"/><path d="M11 6h5a2 2 0 0 1 2 2v8"/><path d="m14 9l-3-3l3-3"/>`,
3670
+ issue: `<path d="M15.314 2a2 2 0 0 1 1.414.586l4.686 4.686A2 2 0 0 1 22 8.686v6.628a2 2 0 0 1-.586 1.414l-4.686 4.686a2 2 0 0 1-1.414.586H8.686a2 2 0 0 1-1.414-.586l-4.686-4.686A2 2 0 0 1 2 15.314V8.686a2 2 0 0 1 .586-1.414l4.686-4.686A2 2 0 0 1 8.686 2zm0 2H8.686L4 8.686v6.628L8.686 20h6.628L20 15.314V8.686zM12 15a1 1 0 1 1 0 2a1 1 0 0 1 0-2m0-9a1 1 0 0 1 1 1v6a1 1 0 1 1-2 0V7a1 1 0 0 1 1-1"/>`,
3671
+ repo: `<path d="M6 19.623c-.69-.195-1.232-.491-1.682-.941C3 17.364 3 15.242 3 11s0-6.364 1.318-7.682S7.758 2 12 2s6.364 0 7.682 1.318S21 6.758 21 11s0 6.364-1.318 7.682c-.45.45-.993.746-1.682.941"/><path d="M12 20.193c-.414 0-.748.32-1.414.958c-.647.619-.97.929-1.242.831a.5.5 0 0 1-.096-.046C9 21.779 9 21.31 9 20.376v-3.125c0-1.532 0-2.299.44-2.775C9.878 14 10.585 14 12 14s2.121 0 2.56.476s.44 1.243.44 2.775v3.125c0 .935 0 1.403-.248 1.56a.5.5 0 0 1-.096.046c-.272.098-.595-.212-1.242-.831c-.666-.639-1-.958-1.414-.958M8 10h8M8 6h4"/>`,
3672
+ x: `<path d="M4 4l11.733 16h4.267l-11.733 -16l-4.267 0" /><path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772" />`
3673
+ };
3674
+ var iconMeta = {
3675
+ star: { viewBox: "0 0 24 24", kind: "fill" },
3676
+ commit: { viewBox: "0 0 16 16", kind: "fill" },
3677
+ pr: { viewBox: "0 0 24 24", kind: "stroke", strokeWidth: "2" },
3678
+ issue: { viewBox: "0 0 24 24", kind: "fill" },
3679
+ repo: { viewBox: "0 0 24 24", kind: "stroke", strokeWidth: "1.5" },
3680
+ x: { viewBox: "0 0 24 24", kind: "stroke", strokeWidth: "2" }
3681
+ };
3682
+ function icon(name, color, size = 16) {
3683
+ const path = icons[name];
3684
+ if (!path)
3685
+ return "";
3686
+ const meta = iconMeta[name];
3687
+ const viewBox = meta?.viewBox ?? "0 0 16 16";
3688
+ const colorStr = escapeXml(/^(?:[\da-f]{3}|[\da-f]{4}|[\da-f]{6}|[\da-f]{8})$/i.test(color) ? `#${color}` : color);
3689
+ const attrs = meta?.kind === "stroke" ? `fill="none" stroke="${colorStr}" stroke-width="${meta.strokeWidth ?? "1.8"}" stroke-linecap="round" stroke-linejoin="round"` : `fill="${colorStr}"`;
3690
+ return `<svg width="${size}" height="${size}" viewBox="${viewBox}" ${attrs} role="img">${path}</svg>`;
3691
+ }
3692
+ // src/utils/font.ts
3693
+ var FONT_FAMILY = 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"';
3694
+ var FONT_FACE = "";
3695
+ // src/utils/colors.ts
3696
+ var twColors = {
3697
+ transparent: "transparent",
3698
+ current: "currentColor",
3699
+ white: "#ffffff",
3700
+ black: "#000000",
3701
+ "slate-50": "#f8fafc",
3702
+ "slate-100": "#f1f5f9",
3703
+ "slate-200": "#e2e8f0",
3704
+ "slate-300": "#cbd5e1",
3705
+ "slate-400": "#94a3b8",
3706
+ "slate-500": "#64748b",
3707
+ "slate-600": "#475569",
3708
+ "slate-700": "#334155",
3709
+ "slate-800": "#1e293b",
3710
+ "slate-900": "#0f172a",
3711
+ "slate-950": "#020617",
3712
+ "neutral-800": "#262626",
3713
+ "neutral-950": "#0a0a0a",
3714
+ "zinc-100": "#f4f4f5",
3715
+ "zinc-400": "#a1a1aa",
3716
+ "zinc-800": "#27272a",
3717
+ "zinc-900": "#18181b",
3718
+ "stone-300": "#d6d3d1",
3719
+ "stone-700": "#44403c",
3720
+ "stone-800": "#292524",
3721
+ "rose-200": "#fecdd3",
3722
+ "rose-300": "#fda4af",
3723
+ "rose-400": "#fb7185",
3724
+ "rose-900": "#881337",
3725
+ "rose-950": "#4c0519",
3726
+ "pink-400": "#f472b6",
3727
+ "pink-500": "#ec4899",
3728
+ "fuchsia-400": "#e879f9",
3729
+ "purple-400": "#c084fc",
3730
+ "purple-900": "#581c87",
3731
+ "purple-950": "#3b0764",
3732
+ "indigo-300": "#a5b4fc",
3733
+ "indigo-400": "#818cf8",
3734
+ "indigo-500": "#6366f1",
3735
+ "indigo-900": "#312e81",
3736
+ "violet-300": "#c4b5fd",
3737
+ "violet-400": "#a78bfa",
3738
+ "blue-300": "#93c5fd",
3739
+ "blue-400": "#60a5fa",
3740
+ "blue-500": "#3b82f6",
3741
+ "blue-600": "#2563eb",
3742
+ "sky-400": "#38bdf8",
3743
+ "sky-900": "#0c4a6e",
3744
+ "sky-950": "#082f49",
3745
+ "cyan-300": "#67e8f9",
3746
+ "cyan-400": "#22d3ee",
3747
+ "teal-400": "#2dd4bf",
3748
+ "emerald-200": "#a7f3d0",
3749
+ "emerald-300": "#6ee7b7",
3750
+ "emerald-400": "#34d399",
3751
+ "emerald-500": "#10b981",
3752
+ "emerald-900": "#064e3b",
3753
+ "emerald-950": "#022c22",
3754
+ "green-400": "#4ade80",
3755
+ "lime-300": "#bef264",
3756
+ "lime-400": "#a3e635",
3757
+ "yellow-300": "#fde047",
3758
+ "yellow-400": "#facc15",
3759
+ "amber-300": "#fcd34d",
3760
+ "amber-400": "#fbbf24",
3761
+ "amber-600": "#d97706",
3762
+ "amber-700": "#b45309",
3763
+ "amber-900": "#78350f",
3764
+ "orange-50": "#fff7ed",
3765
+ "orange-200": "#fed7aa",
3766
+ "orange-400": "#fb923c",
3767
+ "orange-500": "#f97316"
3768
+ };
3769
+ function resolveTw(token, property) {
3770
+ const value = token.trim();
3771
+ const hex = value.startsWith("#") ? value.slice(1) : value;
3772
+ if (/^(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(hex)) {
3773
+ return `${property}="#${hex}"`;
3774
+ }
3775
+ const colorName = value.replace(/^fill-/, "").replace(/^stroke-/, "");
3776
+ return `${property}="${twColors[colorName] ?? value}"`;
3777
+ }
3778
+ // src/card.ts
3779
+ var STAT_DEFS = [
3780
+ { key: "stars", iconName: "star", label: "Stars" },
3781
+ { key: "commits", iconName: "commit", label: "Commits" },
3782
+ { key: "issues", iconName: "issue", label: "Issues" },
3783
+ { key: "repos", iconName: "repo", label: "Repos" },
3784
+ { key: "prs", iconName: "pr", label: "PRs" }
3785
+ ];
3786
+ function el(tag, attrs, children = "") {
3787
+ let a = "";
3788
+ for (const [k, v] of Object.entries(attrs)) {
3789
+ if (v === undefined || v === null || v === "")
3790
+ continue;
3791
+ a += ` ${k}="${escapeXml(String(v))}"`;
3792
+ }
3793
+ if (!children)
3794
+ return `<${tag}${a} />`;
3795
+ return `<${tag}${a}>${children}</${tag}>`;
3796
+ }
3797
+ function raw(token) {
3798
+ const value = resolveTw(token, "fill").match(/fill="([^"]+)"/)?.[1] ?? token;
3799
+ const color = parse_default(value);
3800
+ return color ? color.alpha === undefined || color.alpha === 1 ? formatHex(color) : formatHex8(color) : "#6b7280";
3801
+ }
3802
+ function fitText(text, width, size, weight = 400) {
3803
+ if (measureText(text, size, weight) <= width)
3804
+ return text;
3805
+ const chars = Array.from(text);
3806
+ while (chars.length && measureText(chars.join("") + "…", size, weight) > width)
3807
+ chars.pop();
3808
+ return chars.join("").trimEnd() + "…";
3809
+ }
3810
+ function cardId(value) {
3811
+ let hash = 2166136261;
3812
+ for (const char of value)
3813
+ hash = Math.imul(hash ^ char.codePointAt(0), 16777619);
3814
+ return `card-${(hash >>> 0).toString(36)}`;
3815
+ }
3816
+ function buildLanguageSegments(langs, totalSize, contentW) {
3817
+ const minSegmentW = 6;
3818
+ const visible = [];
3819
+ let tinySize = 0;
3820
+ for (const lang of langs) {
3821
+ const segmentW = lang.size / totalSize * contentW;
3822
+ if (segmentW < minSegmentW) {
3823
+ tinySize += lang.size;
3824
+ continue;
3825
+ }
3826
+ visible.push(lang);
3827
+ }
3828
+ if (tinySize > 0) {
3829
+ visible.push({ name: "Other", color: "#6b7280", size: tinySize });
3830
+ }
3831
+ return visible;
3832
+ }
3833
+ function renderCard(user, stats, langs, opts = {}) {
3834
+ const namespace = cardId(JSON.stringify([user, stats, langs, opts]));
3835
+ const selector = `#${namespace}-root`;
3836
+ const hidden = new Set((opts.hide ?? []).map((k) => k.trim().toLowerCase()));
3837
+ const c = resolveColors(opts);
3838
+ const compact = opts.compact ?? false;
3839
+ const animate = opts.animate ?? false;
3840
+ const hideBorder = opts.hide_border ?? false;
3841
+ const hideLangs = new Set((opts.hide_langs ?? []).map((k) => k.toLowerCase().trim()));
3842
+ const showLangs = new Set((opts.show_langs ?? []).map((k) => k.toLowerCase().trim()));
3843
+ const bgColor = raw(c.bg);
3844
+ const titleColor = raw(c.title);
3845
+ const textColor = raw(c.text);
3846
+ const iconColor = raw(c.icon);
3847
+ const borderColor = raw(c.border);
3848
+ const displayName = user.name?.trim() || user.login;
3849
+ const pronouns = !compact && user.pronouns ? user.pronouns : "";
3850
+ const bioRaw = !compact && user.bio ? user.bio : "";
3851
+ const twitterRaw = !compact && user.twitter ? user.twitter.replace(/^@/, "") : "";
3852
+ const avatar = user.avatarUrl || "";
3853
+ const metaRaw = `@${user.login}${pronouns ? ` · ${pronouns}` : ""}`;
3854
+ const visible = STAT_DEFS.filter((d) => !hidden.has(d.key));
3855
+ const activeLangsList = langs.filter((l) => {
3856
+ if (!Number.isFinite(l.size) || l.size <= 0)
3857
+ return false;
3858
+ const name = l.name.toLowerCase().trim();
3859
+ if (showLangs.size > 0 && !showLangs.has(name))
3860
+ return false;
3861
+ if (hideLangs.has(name))
3862
+ return false;
3863
+ return true;
3864
+ });
3865
+ const PX = 24;
3866
+ const PY = 22;
3867
+ const avatarSize = 60;
3868
+ const avatarR = avatarSize / 2;
3869
+ const textGap = 16;
3870
+ const nameW = measureText(displayName, 17, 700);
3871
+ const metaW = measureText(metaRaw, 12.5, 500);
3872
+ const profileW = PX + avatarSize + textGap + Math.max(nameW, metaW) + PX;
3873
+ const statsW = visible.length > 0 ? visible.length * 84 + PX * 2 : 0;
3874
+ const W = Math.round(Math.min(540, Math.max(340, profileW, statsW)));
3875
+ const contentW = W - PX * 2;
3876
+ const profileTextW = contentW - avatarSize - textGap;
3877
+ const nameEsc = escapeXml(fitText(displayName, profileTextW, 17, 700));
3878
+ const metaStr = escapeXml(fitText(metaRaw, profileTextW, 12.5, 500));
3879
+ const bioLines = wrapText(bioRaw, 44, 2).map((line) => fitText(line, profileTextW, 11.5));
3880
+ const twitter = escapeXml(fitText(twitterRaw ? `@${twitterRaw}` : "", profileTextW - 15, 11.5, 500));
3881
+ const infoX = PX + avatarSize + textGap;
3882
+ const nameY = PY + 20;
3883
+ const loginY = nameY + 17;
3884
+ const bioStartY = loginY + 15;
3885
+ const twitterY = bioStartY + bioLines.length * 14 + (bioLines.length ? 4 : 0);
3886
+ let profileH = loginY + 8 - PY;
3887
+ if (bioLines.length)
3888
+ profileH = bioStartY + bioLines.length * 14 - PY;
3889
+ if (twitter)
3890
+ profileH = twitterY + 10 - PY;
3891
+ profileH = Math.max(profileH, avatarSize + 6);
3892
+ const statsY = PY + profileH + 16;
3893
+ const statW = visible.length > 0 ? contentW / visible.length : 0;
3894
+ const statsH = visible.length > 0 ? 58 : 0;
3895
+ const totalSize = activeLangsList.reduce((s, l) => s + l.size, 0) || 1;
3896
+ const sorted = [...activeLangsList].sort((a, b) => b.size - a.size);
3897
+ let visualLangs = buildLanguageSegments(sorted, totalSize, contentW);
3898
+ if (!compact && visualLangs.length > 6) {
3899
+ const named = visualLangs.filter((lang) => lang.name !== "Other").slice(0, 5);
3900
+ const otherSize = totalSize - named.reduce((sum, lang) => sum + lang.size, 0);
3901
+ visualLangs = [...named, { name: "Other", color: "#6b7280", size: otherSize }];
3902
+ }
3903
+ const barY = statsY + statsH + (statsH ? 18 : 14);
3904
+ const barH = 10;
3905
+ const legendY = barY + barH + 14;
3906
+ const legendRowH = 17;
3907
+ const legendCols = Math.min(3, Math.max(1, Math.floor(contentW / 150)));
3908
+ const legendColW = contentW / legendCols;
3909
+ const legendItems = compact ? [] : visualLangs.map((lang) => {
3910
+ const pct = (lang.size / totalSize * 100).toFixed(1);
3911
+ const suffixW = measureText(` ${pct}%`, 11, 500);
3912
+ return {
3913
+ name: fitText(lang.name, legendColW - 20 - suffixW, 11, 500),
3914
+ color: raw(lang.color),
3915
+ pct
3916
+ };
3917
+ });
3918
+ const legendRows = compact ? 0 : Math.ceil(legendItems.length / legendCols);
3919
+ const hasLangs = activeLangsList.length > 0;
3920
+ const langSectionH = hasLangs ? barH + 14 + legendRows * legendRowH + 10 : 0;
3921
+ const H = barY + (hasLangs ? langSectionH : 0) + 14 + (hasLangs ? 0 : 6);
3922
+ const parts = [];
3923
+ const svgAttrs = {
3924
+ id: "root",
3925
+ width: W,
3926
+ height: H,
3927
+ viewBox: `0 0 ${W} ${H}`,
3928
+ fill: "none",
3929
+ xmlns: "http://www.w3.org/2000/svg",
3930
+ role: "img",
3931
+ "aria-labelledby": "cardTitle cardDesc"
3932
+ };
3933
+ let svgOpen = "<svg";
3934
+ for (const [k, v] of Object.entries(svgAttrs))
3935
+ svgOpen += ` ${k}="${escapeXml(String(v))}"`;
3936
+ parts.push(svgOpen + ">");
3937
+ parts.push(el("title", { id: "cardTitle" }, `${escapeXml(displayName)}'s GitHub Stats`));
3938
+ parts.push(el("desc", { id: "cardDesc" }, escapeXml(`GitHub profile card for ${displayName}. ${visible.map(({ key, label }) => {
3939
+ const value = stats[key];
3940
+ return value === null ? `${label}: unavailable` : `${label}: ${kFormat(value)}`;
3941
+ }).join(", ")}. ${activeLangsList.length} highlighted languages.`)));
3942
+ const css = [];
3943
+ css.push(`${selector} { font-family: ${FONT_FAMILY}; text-rendering: geometricPrecision; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }`);
3944
+ css.push(`${selector} .header { font-size: 17px; font-weight: 700; fill: ${titleColor}; letter-spacing: -0.015em; }`);
3945
+ css.push(`${selector} .lang-name { font-size: 11px; fill: ${textColor}; opacity: 0.82; }`);
3946
+ css.push(`${selector} .lang-progress { fill: ${textColor}; opacity: 0.07; }`);
3947
+ css.push(`${selector} .meta { font-size: 12.5px; font-weight: 500; fill: ${textColor}; opacity: 0.72; }`);
3948
+ css.push(`${selector} .bio { font-size: 11.5px; font-weight: 400; fill: ${textColor}; opacity: 0.68; }`);
3949
+ css.push(`${selector} .stat-label { font-size: 10px; font-weight: 700; fill: ${textColor}; opacity: 0.68; letter-spacing: 0.06em; }`);
3950
+ css.push(`${selector} .stat-value { font-size: 16px; font-weight: 700; fill: ${textColor}; letter-spacing: -0.015em; font-variant-numeric: tabular-nums; font-feature-settings: "tnum"; }`);
3951
+ css.push(`${selector} .twitter-text { font-size: 11.5px; font-weight: 500; fill: ${textColor}; opacity: 0.65; }`);
3952
+ if (animate) {
3953
+ css.push(`@keyframes ${namespace}-fade { from { opacity: 0; } to { opacity: 1; } }`);
3954
+ css.push(`${selector} .stagger { opacity: 0; animation: ${namespace}-fade 0.3s ease-in-out forwards; }`);
3955
+ }
3956
+ parts.push(el("style", {}, escapeXml(css.join(" "))));
3957
+ parts.push(el("defs", {}, [
3958
+ el("clipPath", { id: "av" }, el("circle", { cx: PX + avatarR, cy: PY + avatarR, r: avatarR })),
3959
+ el("radialGradient", { id: "gl", cx: "12%", cy: "15%", r: "65%" }, el("stop", { offset: "0%", "stop-color": iconColor, "stop-opacity": "0.08" }) + el("stop", { offset: "100%", "stop-color": iconColor, "stop-opacity": "0" })),
3960
+ el("radialGradient", { id: "gl2", cx: "92%", cy: "95%", r: "55%" }, el("stop", { offset: "0%", "stop-color": titleColor, "stop-opacity": "0.035" }) + el("stop", { offset: "100%", "stop-color": titleColor, "stop-opacity": "0" })),
3961
+ el("linearGradient", { id: "ring", x1: "0", y1: "0", x2: "1", y2: "1" }, el("stop", { offset: "0%", "stop-color": titleColor }) + el("stop", { offset: "100%", "stop-color": iconColor })),
3962
+ el("linearGradient", { id: "card-bg", x1: "0", y1: "0", x2: W, y2: H, gradientUnits: "userSpaceOnUse" }, el("stop", { offset: "0%", "stop-color": bgColor }) + el("stop", { offset: "82%", "stop-color": bgColor }) + el("stop", { offset: "100%", "stop-color": titleColor, "stop-opacity": "0.04" })),
3963
+ el("linearGradient", { id: "rim", x1: "0", y1: "0", x2: W, y2: "0", gradientUnits: "userSpaceOnUse" }, el("stop", { offset: "0%", "stop-color": iconColor, "stop-opacity": "0" }) + el("stop", { offset: "45%", "stop-color": iconColor, "stop-opacity": "0.28" }) + el("stop", { offset: "100%", "stop-color": iconColor, "stop-opacity": "0" }))
3964
+ ].join("")));
3965
+ parts.push(el("rect", { x: "0.5", y: "0.5", width: W - 1, height: H - 1, rx: 12, fill: "url(#card-bg)" }));
3966
+ parts.push(el("rect", { x: "0.5", y: "0.5", width: W - 1, height: H - 1, rx: 12, fill: "url(#gl)" }));
3967
+ parts.push(el("rect", { x: "0.5", y: "0.5", width: W - 1, height: H - 1, rx: 12, fill: "url(#gl2)" }));
3968
+ parts.push(el("line", {
3969
+ x1: PX,
3970
+ y1: "1.5",
3971
+ x2: W - PX,
3972
+ y2: "1.5",
3973
+ stroke: "url(#rim)",
3974
+ "stroke-width": 1
3975
+ }));
3976
+ if (!hideBorder) {
3977
+ parts.push(el("rect", {
3978
+ x: "0.5",
3979
+ y: "0.5",
3980
+ width: W - 1,
3981
+ height: H - 1,
3982
+ rx: 12,
3983
+ fill: "none",
3984
+ stroke: borderColor,
3985
+ "stroke-opacity": "0.5"
3986
+ }));
3987
+ }
3988
+ parts.push(el("g", {}, el("circle", {
3989
+ cx: PX + avatarR + 1,
3990
+ cy: PY + avatarR + 1,
3991
+ r: avatarR + 3,
3992
+ fill: titleColor,
3993
+ opacity: "0.08"
3994
+ }) + el("image", {
3995
+ href: avatar,
3996
+ x: PX,
3997
+ y: PY,
3998
+ width: avatarSize,
3999
+ height: avatarSize,
4000
+ "clip-path": "url(#av)",
4001
+ preserveAspectRatio: "xMidYMid slice"
4002
+ }) + el("circle", {
4003
+ cx: PX + avatarR,
4004
+ cy: PY + avatarR,
4005
+ r: avatarR + 1.5,
4006
+ fill: "none",
4007
+ stroke: "url(#ring)",
4008
+ "stroke-opacity": "0.55",
4009
+ "stroke-width": "1.5"
4010
+ })));
4011
+ const textParts = [];
4012
+ textParts.push(el("text", { x: infoX, y: nameY, class: "header" }, nameEsc));
4013
+ textParts.push(el("text", { x: infoX, y: loginY, class: "meta" }, metaStr));
4014
+ for (let i = 0;i < bioLines.length; i++) {
4015
+ textParts.push(el("text", { x: infoX, y: bioStartY + i * 14, class: "bio" }, escapeXml(bioLines[i].trim())));
4016
+ }
4017
+ if (twitter) {
4018
+ textParts.push(el("g", { transform: `translate(${infoX},${twitterY - 9})` }, icon("x", textColor, 11) + el("text", { x: 15, y: 9, class: "twitter-text" }, twitter)));
4019
+ }
4020
+ parts.push(el("g", {}, textParts.join("")));
4021
+ if (visible.length > 0) {
4022
+ const statParts = [];
4023
+ for (let i = 0;i < visible.length; i++) {
4024
+ const d = visible[i];
4025
+ const val = stats[d.key];
4026
+ const cx = PX + statW * i + statW / 2;
4027
+ const iy = statsY + 4;
4028
+ const iconSize = 15;
4029
+ const iconY = 2;
4030
+ const valueY = 37;
4031
+ const labelY = 52;
4032
+ const cellParts = [
4033
+ el("title", {}, val === null ? `${d.label}: unavailable` : `${d.label}: ${val.toLocaleString("en-US")}`)
4034
+ ];
4035
+ cellParts.push(el("g", { transform: `translate(${-iconSize / 2},${iconY})` }, icon(d.iconName, iconColor, iconSize)));
4036
+ cellParts.push(el("text", { x: 0, y: valueY, class: "stat-value", "text-anchor": "middle" }, val === null ? "—" : kFormat(val)));
4037
+ cellParts.push(el("text", { x: 0, y: labelY, class: "stat-label", "text-anchor": "middle" }, d.label.toUpperCase()));
4038
+ statParts.push(el("g", {
4039
+ transform: `translate(${cx},${iy})`,
4040
+ class: animate ? "stagger" : undefined,
4041
+ style: animate ? `animation-delay: ${(i + 3) * 150}ms` : undefined
4042
+ }, cellParts.join("")));
4043
+ if (i < visible.length - 1) {
4044
+ const dx = PX + statW * (i + 1);
4045
+ statParts.push(el("line", {
4046
+ x1: dx,
4047
+ y1: statsY + 4,
4048
+ x2: dx,
4049
+ y2: statsY + statsH - 6,
4050
+ stroke: textColor,
4051
+ "stroke-opacity": "0.12"
4052
+ }));
4053
+ }
189
4054
  }
190
- if (current)
191
- lines.push(current);
192
- if (lines.length === maxLines)
193
- break;
194
- current = word.length > maxLen ? word.slice(0, maxLen) : word;
4055
+ parts.push(el("g", {}, statParts.join("")));
195
4056
  }
196
- if (current && lines.length < maxLines)
197
- lines.push(current);
198
- const consumed = lines.join(" ").length;
199
- if (lines.length > 0 && consumed < input.trim().length) {
200
- const last = lines[lines.length - 1];
201
- lines[lines.length - 1] = (last.length >= maxLen ? last.slice(0, Math.max(0, maxLen - 1)) : last) + "…";
4057
+ if (hasLangs) {
4058
+ const langParts = [];
4059
+ langParts.push(el("line", {
4060
+ x1: PX,
4061
+ y1: barY - 8,
4062
+ x2: W - PX,
4063
+ y2: barY - 8,
4064
+ stroke: textColor,
4065
+ "stroke-opacity": "0.08"
4066
+ }));
4067
+ langParts.push(el("clipPath", { id: "lang-clip" }, el("rect", {
4068
+ x: PX,
4069
+ y: barY,
4070
+ width: animate ? "0" : contentW,
4071
+ height: barH,
4072
+ rx: 5
4073
+ }, animate ? el("animate", {
4074
+ attributeName: "width",
4075
+ from: "0",
4076
+ to: contentW,
4077
+ dur: "0.6s",
4078
+ fill: "freeze"
4079
+ }) : "")));
4080
+ langParts.push(el("rect", { x: PX, y: barY, width: contentW, height: barH, rx: 5, class: "lang-progress" }));
4081
+ const barParts = [];
4082
+ let off = 0;
4083
+ for (let i = 0;i < visualLangs.length; i++) {
4084
+ const lang = visualLangs[i];
4085
+ const pct = (lang.size / totalSize * 100).toFixed(1);
4086
+ let w = i === visualLangs.length - 1 ? contentW - off : lang.size / totalSize * contentW;
4087
+ if (w < 0)
4088
+ w = 0;
4089
+ const x = PX + off;
4090
+ const tooltip = compact ? "" : el("title", {}, `${escapeXml(lang.name)} ${pct}%`);
4091
+ barParts.push(el("rect", { x, y: barY, width: w, height: barH, fill: raw(lang.color) }, tooltip));
4092
+ off += w;
4093
+ }
4094
+ langParts.push(el("g", { "clip-path": "url(#lang-clip)" }, barParts.join("")));
4095
+ for (let i = 0;i < legendItems.length; i++) {
4096
+ const item = legendItems[i];
4097
+ const col = i % legendCols;
4098
+ const row = Math.floor(i / legendCols);
4099
+ const lx = PX + col * legendColW;
4100
+ const ly = legendY + row * legendRowH;
4101
+ langParts.push(el("g", {
4102
+ class: animate ? "stagger" : undefined,
4103
+ style: animate ? `animation-delay: ${(i + 3) * 150}ms` : undefined
4104
+ }, el("circle", { cx: lx + 5, cy: ly, r: 4, fill: item.color }) + el("text", { x: lx + 14, y: ly + 4, class: "lang-name", "font-weight": "500" }, `${escapeXml(item.name)} ${item.pct}%`)));
4105
+ }
4106
+ parts.push(el("g", {}, langParts.join("")));
202
4107
  }
203
- return lines;
4108
+ parts.push("</svg>");
4109
+ return parts.join("").replace(/\bid="([^"]+)"/g, (_, id) => `id="${namespace}-${id}"`).replace(/="url\(#([^)]+)\)"/g, (_, id) => `="url(#${namespace}-${id})"`).replace('aria-labelledby="cardTitle cardDesc"', `aria-labelledby="${namespace}-cardTitle ${namespace}-cardDesc"`);
204
4110
  }
205
4111
  // src/utils/languages.ts
206
4112
  var langColors = {
@@ -858,352 +4764,17 @@ var langColors = {
858
4764
  function getLangColor(lang) {
859
4765
  return langColors[lang] || langColors.default;
860
4766
  }
861
- // src/utils/icons.ts
862
- var icons = {
863
- star: `<path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"/>`,
864
- commit: `<path fill-rule="evenodd" d="M10.5 7.75a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0zm1.43.75a4.002 4.002 0 01-7.86 0H.75a.75.75 0 110-1.5h3.32a4.001 4.001 0 017.86 0h3.32a.75.75 0 110 1.5h-3.32z"/>`,
865
- pr: `<path fill-rule="evenodd" d="M7.177 3.073L9.573.677A.25.25 0 0110 .854v4.792a.25.25 0 01-.427.177L7.177 3.427a.25.25 0 010-.354zM3.75 2.5a.75.75 0 100 1.5.75.75 0 000-1.5zm-2.25.75a2.25 2.25 0 113 2.122v5.256a2.251 2.251 0 11-1.5 0V5.372A2.25 2.25 0 011.5 3.25zM11 2.5h-1V4h1a1 1 0 011 1v5.628a2.251 2.251 0 101.5 0V5A2.5 2.5 0 0011 2.5zm1 10.25a.75.75 0 111.5 0 .75.75 0 01-1.5 0zM3.75 12a.75.75 0 100 1.5.75.75 0 000-1.5z"/>`,
866
- issue: `<path fill-rule="evenodd" d="M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM0 8a8 8 0 1116 0A8 8 0 010 8zm9 3a1 1 0 11-2 0 1 1 0 012 0zm-.25-6.25a.75.75 0 00-1.5 0v3.5a.75.75 0 001.5 0v-3.5z"/>`,
867
- repo: `<path fill-rule="evenodd" d="M5 3.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm0 2.122a2.25 2.25 0 10-1.5 0v.878A2.25 2.25 0 005.75 8.5h1.5v2.128a2.251 2.251 0 101.5 0V8.5h1.5a2.25 2.25 0 002.25-2.25v-.878a2.25 2.25 0 10-1.5 0v.878a.75.75 0 01-.75.75h-4.5A.75.75 0 015 6.25v-.878zm3.75 7.378a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm3-8.75a.75.75 0 100-1.5.75.75 0 000 1.5z"></path>`,
868
- x: `<path d="M4 4l11.733 16h4.267l-11.733 -16l-4.267 0" /><path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772" />`
869
- };
870
- function icon(name, color, size = 16) {
871
- const path = icons[name];
872
- if (!path)
873
- return "";
874
- const viewBox = name === "x" ? "0 0 24 24" : "0 0 16 16";
875
- const colorStr = color.startsWith("#") ? color : `#${color}`;
876
- const fill = name === "x" ? `stroke="${colorStr}" stroke-width="2" fill="none"` : `fill="${colorStr}"`;
877
- return `<svg width="${size}" height="${size}" viewBox="${viewBox}" ${fill} role="img">${path}</svg>`;
878
- }
879
- // src/utils/font.ts
880
- var FONT_FAMILY = 'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"';
881
- var FONT_FACE = "";
882
- // src/utils/colors.ts
883
- var twColors = {
884
- transparent: "transparent",
885
- current: "currentColor",
886
- white: "#ffffff",
887
- black: "#000000",
888
- "slate-50": "#f8fafc",
889
- "slate-100": "#f1f5f9",
890
- "slate-200": "#e2e8f0",
891
- "slate-300": "#cbd5e1",
892
- "slate-400": "#94a3b8",
893
- "slate-500": "#64748b",
894
- "slate-600": "#475569",
895
- "slate-700": "#334155",
896
- "slate-800": "#1e293b",
897
- "slate-900": "#0f172a",
898
- "slate-950": "#020617",
899
- "neutral-800": "#262626",
900
- "neutral-950": "#0a0a0a",
901
- "zinc-100": "#f4f4f5",
902
- "zinc-400": "#a1a1aa",
903
- "zinc-800": "#27272a",
904
- "zinc-900": "#18181b",
905
- "stone-300": "#d6d3d1",
906
- "stone-700": "#44403c",
907
- "stone-800": "#292524",
908
- "rose-200": "#fecdd3",
909
- "rose-300": "#fda4af",
910
- "rose-400": "#fb7185",
911
- "rose-900": "#881337",
912
- "rose-950": "#4c0519",
913
- "pink-400": "#f472b6",
914
- "pink-500": "#ec4899",
915
- "fuchsia-400": "#e879f9",
916
- "purple-400": "#c084fc",
917
- "purple-900": "#581c87",
918
- "purple-950": "#3b0764",
919
- "indigo-300": "#a5b4fc",
920
- "indigo-400": "#818cf8",
921
- "indigo-500": "#6366f1",
922
- "indigo-900": "#312e81",
923
- "violet-300": "#c4b5fd",
924
- "violet-400": "#a78bfa",
925
- "blue-300": "#93c5fd",
926
- "blue-400": "#60a5fa",
927
- "blue-500": "#3b82f6",
928
- "blue-600": "#2563eb",
929
- "sky-400": "#38bdf8",
930
- "sky-900": "#0c4a6e",
931
- "sky-950": "#082f49",
932
- "cyan-300": "#67e8f9",
933
- "cyan-400": "#22d3ee",
934
- "teal-400": "#2dd4bf",
935
- "emerald-200": "#a7f3d0",
936
- "emerald-300": "#6ee7b7",
937
- "emerald-400": "#34d399",
938
- "emerald-500": "#10b981",
939
- "emerald-900": "#064e3b",
940
- "emerald-950": "#022c22",
941
- "green-400": "#4ade80",
942
- "lime-300": "#bef264",
943
- "lime-400": "#a3e635",
944
- "yellow-300": "#fde047",
945
- "yellow-400": "#facc15",
946
- "amber-300": "#fcd34d",
947
- "amber-400": "#fbbf24",
948
- "amber-600": "#d97706",
949
- "amber-700": "#b45309",
950
- "amber-900": "#78350f",
951
- "orange-50": "#fff7ed",
952
- "orange-200": "#fed7aa",
953
- "orange-400": "#fb923c",
954
- "orange-500": "#f97316"
955
- };
956
- function resolveTw(token, property) {
957
- const value = token.trim();
958
- const hex = value.startsWith("#") ? value.slice(1) : value;
959
- if (/^(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(hex)) {
960
- return `${property}="#${hex}"`;
961
- }
962
- const colorName = value.replace(/^fill-/, "").replace(/^stroke-/, "");
963
- return `${property}="${twColors[colorName] ?? value}"`;
964
- }
965
- // src/card.ts
966
- var STAT_DEFS = [
967
- { key: "stars", iconName: "star", label: "Stars" },
968
- { key: "commits", iconName: "commit", label: "Commits" },
969
- { key: "issues", iconName: "issue", label: "Issues" },
970
- { key: "repos", iconName: "repo", label: "Repos" },
971
- { key: "prs", iconName: "pr", label: "PRs" }
972
- ];
973
- function raw(token) {
974
- const m = resolveTw(token, "fill").match(/fill="([^"]+)"/);
975
- return m?.[1] ?? token;
976
- }
977
- function clamp(s, n) {
978
- return s.length <= n ? s : s.slice(0, n - 1).trimEnd() + "…";
979
- }
980
- function buildLanguageSegments(langs, totalSize, contentW) {
981
- const minSegmentW = 6;
982
- const visible = [];
983
- let tinySize = 0;
984
- for (const lang of langs) {
985
- const segmentW = lang.size / totalSize * contentW;
986
- if (segmentW < minSegmentW) {
987
- tinySize += lang.size;
988
- continue;
989
- }
990
- visible.push(lang);
991
- }
992
- if (tinySize > 0) {
993
- visible.push({ name: "Other", color: "#6b7280", size: tinySize });
994
- }
995
- return visible.length > 0 ? visible : langs;
996
- }
997
- function renderCard(user, stats, langs, opts = {}) {
998
- const hidden = new Set((opts.hide ?? []).map((k) => k.toLowerCase()));
999
- const c = resolveColors(opts);
1000
- const compact = opts.compact ?? false;
1001
- const animate = opts.animate ?? false;
1002
- const hideBorder = opts.hide_border ?? false;
1003
- const hideLangs = new Set((opts.hide_langs ?? []).map((k) => k.toLowerCase().trim()));
1004
- const showLangs = new Set((opts.show_langs ?? []).map((k) => k.toLowerCase().trim()));
1005
- const bgColor = raw(c.bg);
1006
- const titleColor = raw(c.title);
1007
- const textColor = raw(c.text);
1008
- const iconColor = raw(c.icon);
1009
- const borderColor = raw(c.border);
1010
- const fontFamily = FONT_FAMILY.replace(/"/g, "&apos;");
1011
- const displayName = user.name || user.login;
1012
- const nameEsc = escapeXml(clamp(displayName, 28));
1013
- const loginEsc = escapeXml(clamp(user.login, 24));
1014
- const pronouns = !compact && user.pronouns ? escapeXml(clamp(user.pronouns, 16)) : "";
1015
- const bioRaw = !compact && user.bio ? user.bio : "";
1016
- const bioLines = bioRaw ? wrapText(bioRaw, 44, 2) : [];
1017
- const twitter = !compact && user.twitter ? escapeXml(clamp(user.twitter, 22)) : "";
1018
- const avatar = (user.avatarUrl || "").replace(/&/g, "&amp;");
1019
- const visible = STAT_DEFS.filter((d) => !hidden.has(d.key));
1020
- const activeLangsList = langs.filter((l) => {
1021
- const name = l.name.toLowerCase().trim();
1022
- if (showLangs.size > 0 && !showLangs.has(name))
1023
- return false;
1024
- if (hideLangs.has(name))
1025
- return false;
1026
- return true;
1027
- });
1028
- const PX = 25;
1029
- const PY = 25;
1030
- const avatarSize = 64;
1031
- const avatarR = avatarSize / 2;
1032
- const metaLen = user.login.length + (pronouns ? pronouns.length + 3 : 0);
1033
- const maxBioLen = bioLines.length ? Math.max(...bioLines.map((l) => l.length)) : 0;
1034
- const profileTextW = Math.max(displayName.length * 11, metaLen * 7.5, maxBioLen * 6.5, twitter.length * 7 + 20);
1035
- const profileW = PX + avatarSize + 16 + profileTextW + PX;
1036
- const statsW = visible.length > 0 ? visible.length * 85 + PX * 2 : 0;
1037
- const langsW = activeLangsList.length > 0 ? 300 : 0;
1038
- const W = Math.round(Math.min(540, Math.max(340, profileW, statsW, langsW)));
1039
- const contentW = W - PX * 2;
1040
- const infoX = PX + avatarSize + 14;
1041
- const nameY = PY + 22;
1042
- const loginY = nameY + 18;
1043
- const bioStartY = loginY + 16;
1044
- const twitterY = bioStartY + bioLines.length * 14 + (bioLines.length ? 4 : 0);
1045
- let profileH = loginY + 10 - PY;
1046
- if (bioLines.length)
1047
- profileH = bioStartY + bioLines.length * 14 - PY;
1048
- if (twitter)
1049
- profileH = twitterY + 10 - PY;
1050
- profileH = Math.max(profileH, avatarSize + 4);
1051
- const statsY = PY + profileH + 14;
1052
- const statW = visible.length > 0 ? contentW / visible.length : 0;
1053
- const statsH = visible.length > 0 ? 50 : 0;
1054
- const totalSize = activeLangsList.reduce((s, l) => s + l.size, 0) || 1;
1055
- const sorted = [...activeLangsList].sort((a, b) => b.size - a.size);
1056
- const visualLangs = buildLanguageSegments(sorted, totalSize, contentW);
1057
- const barY = statsY + statsH + (statsH ? 16 : 12);
1058
- const barH = 10;
1059
- const maxLegend = compact ? 0 : 6;
1060
- const legendLangs = visualLangs.slice(0, maxLegend);
1061
- const otherSize = visualLangs.slice(maxLegend).reduce((s, l) => s + l.size, 0);
1062
- const legendY = barY + barH + 12;
1063
- const legendRowH = 16;
1064
- const legendCols = 3;
1065
- const legendColW = contentW / legendCols;
1066
- const legendItems = legendLangs.map((l) => ({
1067
- name: clamp(l.name, 14),
1068
- color: l.color,
1069
- pct: (l.size / totalSize * 100).toFixed(1)
1070
- }));
1071
- if (otherSize > 0 && legendItems.length > 0) {
1072
- const existingOther = legendItems.find((item) => item.name === "Other");
1073
- if (existingOther) {
1074
- existingOther.pct = ((Number(existingOther.pct) / 100 * totalSize + otherSize) / totalSize * 100).toFixed(1);
1075
- } else {
1076
- legendItems.push({
1077
- name: "Other",
1078
- color: "#6b7280",
1079
- pct: (otherSize / totalSize * 100).toFixed(1)
1080
- });
1081
- }
1082
- }
1083
- const legendRows = compact ? 0 : Math.ceil(legendItems.length / legendCols);
1084
- const hasLangs = activeLangsList.length > 0;
1085
- const langSectionH = hasLangs ? barH + 12 + legendRows * legendRowH + 8 : 0;
1086
- const H = barY + (hasLangs ? langSectionH : 0) + 12 + (hasLangs ? 0 : 4);
1087
- const parts = [];
1088
- parts.push('<svg width="' + W + '" height="' + H + '" viewBox="0 0 ' + W + " " + H + '" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="cardTitle cardDesc">');
1089
- parts.push('<title id="cardTitle">' + escapeXml(displayName + "'s GitHub Stats") + "</title>");
1090
- parts.push('<desc id="cardDesc">GitHub profile card for ' + escapeXml(displayName) + " with " + kFormat(stats.stars) + " stars, " + kFormat(stats.commits) + " commits, and " + activeLangsList.length + " highlighted languages.</desc>");
1091
- const cssLines = [];
1092
- cssLines.push("* { font-family: " + fontFamily + "; }");
1093
- cssLines.push(".header { font-size: 18px; font-weight: 700; fill: " + titleColor + "; }");
1094
- cssLines.push(".stat { font-size: 14px; font-weight: 600; fill: " + textColor + "; }");
1095
- cssLines.push(".bold { font-weight: 700; }");
1096
- cssLines.push(".icon { fill: " + iconColor + "; }");
1097
- cssLines.push(".lang-name { font-size: 11px; fill: " + textColor + "; opacity: 0.8; }");
1098
- cssLines.push(".lang-progress { fill: " + textColor + "; opacity: 0.08; }");
1099
- cssLines.push(".meta { font-size: 12px; font-weight: 500; fill: " + textColor + "; opacity: 0.7; }");
1100
- cssLines.push(".bio { font-size: 11px; font-weight: 400; fill: " + textColor + "; opacity: 0.68; }");
1101
- cssLines.push(".stat-label { font-size: 9px; font-weight: 600; fill: " + textColor + "; opacity: 0.5; letter-spacing: 0.08em; }");
1102
- cssLines.push(".stat-value { font-size: 15px; font-weight: 800; fill: " + textColor + "; }");
1103
- cssLines.push(".twitter-text { font-size: 11px; font-weight: 500; fill: " + textColor + "; opacity: 0.65; }");
1104
- if (animate) {
1105
- cssLines.push("@keyframes fadeInAnimation { from { opacity: 0; } to { opacity: 1; } }");
1106
- cssLines.push(".stagger { opacity: 0; animation: fadeInAnimation 0.3s ease-in-out forwards; }");
1107
- }
1108
- parts.push("<style>" + cssLines.join(" ") + "</style>");
1109
- parts.push("<defs>");
1110
- parts.push('<clipPath id="av"><circle cx="' + (PX + avatarR) + '" cy="' + (PY + avatarR) + '" r="' + avatarR + '"/></clipPath>');
1111
- parts.push('<radialGradient id="gl" cx="12%" cy="15%" r="65%">' + '<stop offset="0%" stop-color="' + iconColor + '" stop-opacity="0.08"/>' + '<stop offset="100%" stop-color="' + iconColor + '" stop-opacity="0"/>' + "</radialGradient>");
1112
- parts.push('<radialGradient id="gl2" cx="92%" cy="95%" r="55%">' + '<stop offset="0%" stop-color="' + titleColor + '" stop-opacity="0.035"/>' + '<stop offset="100%" stop-color="' + titleColor + '" stop-opacity="0"/>' + "</radialGradient>");
1113
- parts.push('<linearGradient id="ring" x1="0" y1="0" x2="1" y2="1">' + '<stop offset="0%" stop-color="' + titleColor + '"/>' + '<stop offset="100%" stop-color="' + iconColor + '"/>' + "</linearGradient>");
1114
- parts.push('<linearGradient id="card-bg" x1="0" y1="0" x2="' + W + '" y2="' + H + '" gradientUnits="userSpaceOnUse">' + '<stop offset="0%" stop-color="' + bgColor + '"/>' + '<stop offset="82%" stop-color="' + bgColor + '"/>' + '<stop offset="100%" stop-color="' + titleColor + '" stop-opacity="0.04"/>' + "</linearGradient>");
1115
- parts.push('<linearGradient id="rim" x1="0" y1="0" x2="' + W + '" y2="0" gradientUnits="userSpaceOnUse">' + '<stop offset="0%" stop-color="' + iconColor + '" stop-opacity="0"/>' + '<stop offset="45%" stop-color="' + iconColor + '" stop-opacity="0.28"/>' + '<stop offset="100%" stop-color="' + iconColor + '" stop-opacity="0"/>' + "</linearGradient>");
1116
- parts.push("</defs>");
1117
- parts.push('<rect x="0.5" y="0.5" width="' + (W - 1) + '" height="' + (H - 1) + '" rx="10" fill="' + "url(#card-bg)" + '" stroke-opacity="1"/>');
1118
- parts.push('<rect x="0.5" y="0.5" width="' + (W - 1) + '" height="' + (H - 1) + '" rx="10" fill="url(#gl)"/>');
1119
- parts.push('<rect x="0.5" y="0.5" width="' + (W - 1) + '" height="' + (H - 1) + '" rx="10" fill="url(#gl2)"/>');
1120
- parts.push('<line x1="' + PX + '" y1="1.5" x2="' + (W - PX) + '" y2="1.5" stroke="url(#rim)" stroke-width="1"/>');
1121
- if (!hideBorder) {
1122
- parts.push('<rect x="0.5" y="0.5" width="' + (W - 1) + '" height="' + (H - 1) + '" rx="10" fill="none" stroke="' + borderColor + '" stroke-opacity="0.5"/>');
1123
- }
1124
- parts.push('<g transform="translate(0,0)">' + '<circle cx="' + (PX + avatarR + 1) + '" cy="' + (PY + avatarR + 1) + '" r="' + (avatarR + 3) + '" fill="' + titleColor + '" opacity="0.08"/>' + '<image href="' + avatar + '" x="' + PX + '" y="' + PY + '" width="' + avatarSize + '" height="' + avatarSize + '" clip-path="url(#av)" preserveAspectRatio="xMidYMid slice"/>' + '<circle cx="' + (PX + avatarR) + '" cy="' + (PY + avatarR) + '" r="' + (avatarR + 1.5) + '" fill="none" stroke="url(#ring)" stroke-opacity="0.55" stroke-width="1.5"/>' + "</g>");
1125
- parts.push('<g transform="translate(0,0)">');
1126
- parts.push('<text x="' + infoX + '" y="' + nameY + '" class="header">' + nameEsc + "</text>");
1127
- const metaStr = pronouns ? "@" + loginEsc + " · " + pronouns : "@" + loginEsc;
1128
- parts.push('<text x="' + infoX + '" y="' + loginY + '" class="meta">' + metaStr + "</text>");
1129
- for (let i = 0;i < bioLines.length; i++) {
1130
- parts.push('<text x="' + infoX + '" y="' + (bioStartY + i * 14) + '" class="bio">' + escapeXml(bioLines[i].trim()) + "</text>");
1131
- }
1132
- if (twitter) {
1133
- parts.push('<g transform="translate(' + infoX + "," + (twitterY - 9) + ')">' + icon("x", textColor, 11) + '<text x="15" y="9" class="twitter-text">@' + twitter + "</text></g>");
1134
- }
1135
- parts.push("</g>");
1136
- if (visible.length > 0) {
1137
- parts.push('<rect x="' + PX + '" y="' + (statsY - 8) + '" width="' + contentW + '" height="' + (statsH + 8) + '" rx="8" fill="' + textColor + '" opacity="0.035"/>');
1138
- parts.push('<g transform="translate(0,0)">');
1139
- for (let i = 0;i < visible.length; i++) {
1140
- const d = visible[i];
1141
- const val = stats[d.key];
1142
- const cx = PX + statW * i + statW / 2;
1143
- const cellX = PX + statW * i + 4;
1144
- const iy = statsY + 2;
1145
- const staggerStyle = animate ? ' style="animation-delay: ' + (i + 3) * 150 + 'ms"' : "";
1146
- const staggerClass = animate ? " stagger" : "";
1147
- parts.push('<rect x="' + cellX + '" y="' + (statsY - 4) + '" width="' + Math.max(0, statW - 8) + '" height="' + (statsH - 2) + '" rx="8" fill="' + textColor + '" opacity="0.028"/>');
1148
- parts.push('<g transform="translate(' + cx + "," + iy + ')" class="stat' + staggerClass + '"' + staggerStyle + ">");
1149
- parts.push('<text x="0" y="26" class="stat-value" text-anchor="middle">' + kFormat(val) + "</text>");
1150
- const labelText = d.label.toUpperCase();
1151
- const labelW = labelText.length * 6.8;
1152
- const rowW = 10 + 4 + labelW;
1153
- parts.push('<g transform="translate(' + -rowW / 2 + ',31.5)">' + icon(d.iconName, iconColor, 10) + "</g>");
1154
- parts.push('<text x="' + (-rowW / 2 + 14) + '" y="40" class="stat-label">' + labelText + "</text>");
1155
- parts.push("</g>");
1156
- }
1157
- parts.push("</g>");
1158
- }
1159
- if (hasLangs) {
1160
- parts.push('<line x1="' + PX + '" y1="' + (barY - 8) + '" x2="' + (W - PX) + '" y2="' + (barY - 8) + '" stroke="' + textColor + '" stroke-opacity="0.08"/>');
1161
- parts.push('<g transform="translate(0,0)">');
1162
- parts.push('<clipPath id="lang-clip"><rect x="' + PX + '" y="' + barY + '" width="' + (animate ? "0" : contentW) + '" height="' + barH + '" rx="5">' + (animate ? '<animate attributeName="width" from="0" to="' + contentW + '" dur="0.6s" fill="freeze"/>' : "") + "</rect></clipPath>");
1163
- parts.push('<rect x="' + PX + '" y="' + barY + '" width="' + contentW + '" height="' + barH + '" rx="5" class="lang-progress"/>');
1164
- parts.push('<g clip-path="url(#lang-clip)">');
1165
- const activeLangs = visualLangs;
1166
- let off = 0;
1167
- for (let i = 0;i < activeLangs.length; i++) {
1168
- const lang = activeLangs[i];
1169
- const pct = (lang.size / totalSize * 100).toFixed(1);
1170
- let w = i === activeLangs.length - 1 ? contentW - off : lang.size / totalSize * contentW;
1171
- if (w < 0)
1172
- w = 0;
1173
- const x = PX + off;
1174
- const tooltip = compact ? "" : "<title>" + escapeXml(lang.name) + " " + pct + "%</title>";
1175
- parts.push('<rect x="' + x + '" y="' + barY + '" width="' + w + '" height="' + barH + '" fill="' + lang.color + '">' + tooltip + "</rect>");
1176
- off += w;
1177
- }
1178
- parts.push("</g>");
1179
- for (let i = 0;i < legendItems.length; i++) {
1180
- const item = legendItems[i];
1181
- const col = i % legendCols;
1182
- const row = Math.floor(i / legendCols);
1183
- const lx = PX + col * legendColW;
1184
- const ly = legendY + row * legendRowH;
1185
- const staggerStyle = animate ? ' style="animation-delay: ' + (i + 3) * 150 + 'ms"' : "";
1186
- const staggerClass = animate ? ' class="stagger"' : "";
1187
- parts.push("<g" + staggerClass + staggerStyle + ">");
1188
- parts.push('<circle cx="' + (lx + 5) + '" cy="' + ly + '" r="4" fill="' + item.color + '"/>');
1189
- parts.push('<text x="' + (lx + 14) + '" y="' + (ly + 4) + '" class="lang-name" font-weight="500">' + escapeXml(item.name) + " " + item.pct + "%</text>");
1190
- parts.push("</g>");
1191
- }
1192
- parts.push("</g>");
1193
- }
1194
- parts.push("</svg>");
1195
- return parts.join("");
1196
- }
1197
4767
  export {
1198
- wrapText,
1199
- themes,
1200
- resolveColors,
1201
- renderCard,
1202
- kFormat,
1203
- icons,
1204
- icon,
1205
- getLangColor,
1206
- escapeXml,
4768
+ FONT_FACE,
1207
4769
  FONT_FAMILY,
1208
- FONT_FACE
4770
+ escapeXml,
4771
+ getLangColor,
4772
+ icon,
4773
+ icons,
4774
+ kFormat,
4775
+ measureText,
4776
+ renderCard,
4777
+ resolveColors,
4778
+ themes,
4779
+ wrapText
1209
4780
  };