@styleframe/cli 2.3.2 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3689 @@
1
+ const parseNumber = (color, len) => {
2
+ if (typeof color !== "number") return;
3
+ if (len === 3) {
4
+ return {
5
+ mode: "rgb",
6
+ r: (color >> 8 & 15 | color >> 4 & 240) / 255,
7
+ g: (color >> 4 & 15 | color & 240) / 255,
8
+ b: (color & 15 | color << 4 & 240) / 255
9
+ };
10
+ }
11
+ if (len === 4) {
12
+ return {
13
+ mode: "rgb",
14
+ r: (color >> 12 & 15 | color >> 8 & 240) / 255,
15
+ g: (color >> 8 & 15 | color >> 4 & 240) / 255,
16
+ b: (color >> 4 & 15 | color & 240) / 255,
17
+ alpha: (color & 15 | color << 4 & 240) / 255
18
+ };
19
+ }
20
+ if (len === 6) {
21
+ return {
22
+ mode: "rgb",
23
+ r: (color >> 16 & 255) / 255,
24
+ g: (color >> 8 & 255) / 255,
25
+ b: (color & 255) / 255
26
+ };
27
+ }
28
+ if (len === 8) {
29
+ return {
30
+ mode: "rgb",
31
+ r: (color >> 24 & 255) / 255,
32
+ g: (color >> 16 & 255) / 255,
33
+ b: (color >> 8 & 255) / 255,
34
+ alpha: (color & 255) / 255
35
+ };
36
+ }
37
+ };
38
+ const named = {
39
+ aliceblue: 15792383,
40
+ antiquewhite: 16444375,
41
+ aqua: 65535,
42
+ aquamarine: 8388564,
43
+ azure: 15794175,
44
+ beige: 16119260,
45
+ bisque: 16770244,
46
+ black: 0,
47
+ blanchedalmond: 16772045,
48
+ blue: 255,
49
+ blueviolet: 9055202,
50
+ brown: 10824234,
51
+ burlywood: 14596231,
52
+ cadetblue: 6266528,
53
+ chartreuse: 8388352,
54
+ chocolate: 13789470,
55
+ coral: 16744272,
56
+ cornflowerblue: 6591981,
57
+ cornsilk: 16775388,
58
+ crimson: 14423100,
59
+ cyan: 65535,
60
+ darkblue: 139,
61
+ darkcyan: 35723,
62
+ darkgoldenrod: 12092939,
63
+ darkgray: 11119017,
64
+ darkgreen: 25600,
65
+ darkgrey: 11119017,
66
+ darkkhaki: 12433259,
67
+ darkmagenta: 9109643,
68
+ darkolivegreen: 5597999,
69
+ darkorange: 16747520,
70
+ darkorchid: 10040012,
71
+ darkred: 9109504,
72
+ darksalmon: 15308410,
73
+ darkseagreen: 9419919,
74
+ darkslateblue: 4734347,
75
+ darkslategray: 3100495,
76
+ darkslategrey: 3100495,
77
+ darkturquoise: 52945,
78
+ darkviolet: 9699539,
79
+ deeppink: 16716947,
80
+ deepskyblue: 49151,
81
+ dimgray: 6908265,
82
+ dimgrey: 6908265,
83
+ dodgerblue: 2003199,
84
+ firebrick: 11674146,
85
+ floralwhite: 16775920,
86
+ forestgreen: 2263842,
87
+ fuchsia: 16711935,
88
+ gainsboro: 14474460,
89
+ ghostwhite: 16316671,
90
+ gold: 16766720,
91
+ goldenrod: 14329120,
92
+ gray: 8421504,
93
+ green: 32768,
94
+ greenyellow: 11403055,
95
+ grey: 8421504,
96
+ honeydew: 15794160,
97
+ hotpink: 16738740,
98
+ indianred: 13458524,
99
+ indigo: 4915330,
100
+ ivory: 16777200,
101
+ khaki: 15787660,
102
+ lavender: 15132410,
103
+ lavenderblush: 16773365,
104
+ lawngreen: 8190976,
105
+ lemonchiffon: 16775885,
106
+ lightblue: 11393254,
107
+ lightcoral: 15761536,
108
+ lightcyan: 14745599,
109
+ lightgoldenrodyellow: 16448210,
110
+ lightgray: 13882323,
111
+ lightgreen: 9498256,
112
+ lightgrey: 13882323,
113
+ lightpink: 16758465,
114
+ lightsalmon: 16752762,
115
+ lightseagreen: 2142890,
116
+ lightskyblue: 8900346,
117
+ lightslategray: 7833753,
118
+ lightslategrey: 7833753,
119
+ lightsteelblue: 11584734,
120
+ lightyellow: 16777184,
121
+ lime: 65280,
122
+ limegreen: 3329330,
123
+ linen: 16445670,
124
+ magenta: 16711935,
125
+ maroon: 8388608,
126
+ mediumaquamarine: 6737322,
127
+ mediumblue: 205,
128
+ mediumorchid: 12211667,
129
+ mediumpurple: 9662683,
130
+ mediumseagreen: 3978097,
131
+ mediumslateblue: 8087790,
132
+ mediumspringgreen: 64154,
133
+ mediumturquoise: 4772300,
134
+ mediumvioletred: 13047173,
135
+ midnightblue: 1644912,
136
+ mintcream: 16121850,
137
+ mistyrose: 16770273,
138
+ moccasin: 16770229,
139
+ navajowhite: 16768685,
140
+ navy: 128,
141
+ oldlace: 16643558,
142
+ olive: 8421376,
143
+ olivedrab: 7048739,
144
+ orange: 16753920,
145
+ orangered: 16729344,
146
+ orchid: 14315734,
147
+ palegoldenrod: 15657130,
148
+ palegreen: 10025880,
149
+ paleturquoise: 11529966,
150
+ palevioletred: 14381203,
151
+ papayawhip: 16773077,
152
+ peachpuff: 16767673,
153
+ peru: 13468991,
154
+ pink: 16761035,
155
+ plum: 14524637,
156
+ powderblue: 11591910,
157
+ purple: 8388736,
158
+ // Added in CSS Colors Level 4:
159
+ // https://drafts.csswg.org/css-color/#changes-from-3
160
+ rebeccapurple: 6697881,
161
+ red: 16711680,
162
+ rosybrown: 12357519,
163
+ royalblue: 4286945,
164
+ saddlebrown: 9127187,
165
+ salmon: 16416882,
166
+ sandybrown: 16032864,
167
+ seagreen: 3050327,
168
+ seashell: 16774638,
169
+ sienna: 10506797,
170
+ silver: 12632256,
171
+ skyblue: 8900331,
172
+ slateblue: 6970061,
173
+ slategray: 7372944,
174
+ slategrey: 7372944,
175
+ snow: 16775930,
176
+ springgreen: 65407,
177
+ steelblue: 4620980,
178
+ tan: 13808780,
179
+ teal: 32896,
180
+ thistle: 14204888,
181
+ tomato: 16737095,
182
+ turquoise: 4251856,
183
+ violet: 15631086,
184
+ wheat: 16113331,
185
+ white: 16777215,
186
+ whitesmoke: 16119285,
187
+ yellow: 16776960,
188
+ yellowgreen: 10145074
189
+ };
190
+ const parseNamed = (color) => {
191
+ return parseNumber(named[color.toLowerCase()], 6);
192
+ };
193
+ const hex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;
194
+ const parseHex = (color) => {
195
+ let match;
196
+ return (match = color.match(hex)) ? parseNumber(parseInt(match[1], 16), match[1].length) : void 0;
197
+ };
198
+ const num$1 = "([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)";
199
+ const per = `${num$1}%`;
200
+ const num_per = `(?:${num$1}%|${num$1})`;
201
+ const hue$1 = `(?:${num$1}(deg|grad|rad|turn)|${num$1})`;
202
+ const c = `\\s*,\\s*`;
203
+ const rgb_num_old = new RegExp(
204
+ `^rgba?\\(\\s*${num$1}${c}${num$1}${c}${num$1}\\s*(?:,\\s*${num_per}\\s*)?\\)$`
205
+ );
206
+ const rgb_per_old = new RegExp(
207
+ `^rgba?\\(\\s*${per}${c}${per}${c}${per}\\s*(?:,\\s*${num_per}\\s*)?\\)$`
208
+ );
209
+ const parseRgbLegacy = (color) => {
210
+ let res = { mode: "rgb" };
211
+ let match;
212
+ if (match = color.match(rgb_num_old)) {
213
+ if (match[1] !== void 0) {
214
+ res.r = match[1] / 255;
215
+ }
216
+ if (match[2] !== void 0) {
217
+ res.g = match[2] / 255;
218
+ }
219
+ if (match[3] !== void 0) {
220
+ res.b = match[3] / 255;
221
+ }
222
+ } else if (match = color.match(rgb_per_old)) {
223
+ if (match[1] !== void 0) {
224
+ res.r = match[1] / 100;
225
+ }
226
+ if (match[2] !== void 0) {
227
+ res.g = match[2] / 100;
228
+ }
229
+ if (match[3] !== void 0) {
230
+ res.b = match[3] / 100;
231
+ }
232
+ } else {
233
+ return void 0;
234
+ }
235
+ if (match[4] !== void 0) {
236
+ res.alpha = Math.max(0, Math.min(1, match[4] / 100));
237
+ } else if (match[5] !== void 0) {
238
+ res.alpha = Math.max(0, Math.min(1, +match[5]));
239
+ }
240
+ return res;
241
+ };
242
+ const prepare = (color, mode) => color === void 0 ? void 0 : typeof color !== "object" ? parse(color) : color.mode !== void 0 ? color : mode ? { ...color, mode } : void 0;
243
+ const converter = (target_mode = "rgb") => (color) => (color = prepare(color, target_mode)) !== void 0 ? (
244
+ // if the color's mode corresponds to our target mode
245
+ color.mode === target_mode ? (
246
+ // then just return the color
247
+ color
248
+ ) : (
249
+ // otherwise check to see if we have a dedicated
250
+ // converter for the target mode
251
+ converters[color.mode][target_mode] ? (
252
+ // and return its result...
253
+ converters[color.mode][target_mode](color)
254
+ ) : (
255
+ // ...otherwise pass through RGB as an intermediary step.
256
+ // if the target mode is RGB...
257
+ target_mode === "rgb" ? (
258
+ // just return the RGB
259
+ converters[color.mode].rgb(color)
260
+ ) : (
261
+ // otherwise convert color.mode -> RGB -> target_mode
262
+ converters.rgb[target_mode](converters[color.mode].rgb(color))
263
+ )
264
+ )
265
+ )
266
+ ) : void 0;
267
+ const converters = {};
268
+ const modes = {};
269
+ const parsers = [];
270
+ const colorProfiles = {};
271
+ const identity = (v) => v;
272
+ const useMode = (definition2) => {
273
+ converters[definition2.mode] = {
274
+ ...converters[definition2.mode],
275
+ ...definition2.toMode
276
+ };
277
+ Object.keys(definition2.fromMode || {}).forEach((k2) => {
278
+ if (!converters[k2]) {
279
+ converters[k2] = {};
280
+ }
281
+ converters[k2][definition2.mode] = definition2.fromMode[k2];
282
+ });
283
+ if (!definition2.ranges) {
284
+ definition2.ranges = {};
285
+ }
286
+ if (!definition2.difference) {
287
+ definition2.difference = {};
288
+ }
289
+ definition2.channels.forEach((channel) => {
290
+ if (definition2.ranges[channel] === void 0) {
291
+ definition2.ranges[channel] = [0, 1];
292
+ }
293
+ if (!definition2.interpolate[channel]) {
294
+ throw new Error(`Missing interpolator for: ${channel}`);
295
+ }
296
+ if (typeof definition2.interpolate[channel] === "function") {
297
+ definition2.interpolate[channel] = {
298
+ use: definition2.interpolate[channel]
299
+ };
300
+ }
301
+ if (!definition2.interpolate[channel].fixup) {
302
+ definition2.interpolate[channel].fixup = identity;
303
+ }
304
+ });
305
+ modes[definition2.mode] = definition2;
306
+ (definition2.parse || []).forEach((parser) => {
307
+ useParser(parser, definition2.mode);
308
+ });
309
+ return converter(definition2.mode);
310
+ };
311
+ const getMode = (mode) => modes[mode];
312
+ const useParser = (parser, mode) => {
313
+ if (typeof parser === "string") {
314
+ if (!mode) {
315
+ throw new Error(`'mode' required when 'parser' is a string`);
316
+ }
317
+ colorProfiles[parser] = mode;
318
+ } else if (typeof parser === "function") {
319
+ if (parsers.indexOf(parser) < 0) {
320
+ parsers.push(parser);
321
+ }
322
+ }
323
+ };
324
+ const IdentStartCodePoint = /[^\x00-\x7F]|[a-zA-Z_]/;
325
+ const IdentCodePoint = /[^\x00-\x7F]|[-\w]/;
326
+ const Tok = {
327
+ Function: "function",
328
+ Ident: "ident",
329
+ Number: "number",
330
+ Percentage: "percentage",
331
+ ParenClose: ")",
332
+ None: "none",
333
+ Hue: "hue",
334
+ Alpha: "alpha"
335
+ };
336
+ let _i = 0;
337
+ function is_num(chars) {
338
+ let ch = chars[_i];
339
+ let ch1 = chars[_i + 1];
340
+ if (ch === "-" || ch === "+") {
341
+ return /\d/.test(ch1) || ch1 === "." && /\d/.test(chars[_i + 2]);
342
+ }
343
+ if (ch === ".") {
344
+ return /\d/.test(ch1);
345
+ }
346
+ return /\d/.test(ch);
347
+ }
348
+ function is_ident(chars) {
349
+ if (_i >= chars.length) {
350
+ return false;
351
+ }
352
+ let ch = chars[_i];
353
+ if (IdentStartCodePoint.test(ch)) {
354
+ return true;
355
+ }
356
+ if (ch === "-") {
357
+ if (chars.length - _i < 2) {
358
+ return false;
359
+ }
360
+ let ch1 = chars[_i + 1];
361
+ if (ch1 === "-" || IdentStartCodePoint.test(ch1)) {
362
+ return true;
363
+ }
364
+ return false;
365
+ }
366
+ return false;
367
+ }
368
+ const huenits = {
369
+ deg: 1,
370
+ rad: 180 / Math.PI,
371
+ grad: 9 / 10,
372
+ turn: 360
373
+ };
374
+ function num(chars) {
375
+ let value = "";
376
+ if (chars[_i] === "-" || chars[_i] === "+") {
377
+ value += chars[_i++];
378
+ }
379
+ value += digits(chars);
380
+ if (chars[_i] === "." && /\d/.test(chars[_i + 1])) {
381
+ value += chars[_i++] + digits(chars);
382
+ }
383
+ if (chars[_i] === "e" || chars[_i] === "E") {
384
+ if ((chars[_i + 1] === "-" || chars[_i + 1] === "+") && /\d/.test(chars[_i + 2])) {
385
+ value += chars[_i++] + chars[_i++] + digits(chars);
386
+ } else if (/\d/.test(chars[_i + 1])) {
387
+ value += chars[_i++] + digits(chars);
388
+ }
389
+ }
390
+ if (is_ident(chars)) {
391
+ let id = ident(chars);
392
+ if (id === "deg" || id === "rad" || id === "turn" || id === "grad") {
393
+ return { type: Tok.Hue, value: value * huenits[id] };
394
+ }
395
+ return void 0;
396
+ }
397
+ if (chars[_i] === "%") {
398
+ _i++;
399
+ return { type: Tok.Percentage, value: +value };
400
+ }
401
+ return { type: Tok.Number, value: +value };
402
+ }
403
+ function digits(chars) {
404
+ let v = "";
405
+ while (/\d/.test(chars[_i])) {
406
+ v += chars[_i++];
407
+ }
408
+ return v;
409
+ }
410
+ function ident(chars) {
411
+ let v = "";
412
+ while (_i < chars.length && IdentCodePoint.test(chars[_i])) {
413
+ v += chars[_i++];
414
+ }
415
+ return v;
416
+ }
417
+ function identlike(chars) {
418
+ let v = ident(chars);
419
+ if (chars[_i] === "(") {
420
+ _i++;
421
+ return { type: Tok.Function, value: v };
422
+ }
423
+ if (v === "none") {
424
+ return { type: Tok.None, value: void 0 };
425
+ }
426
+ return { type: Tok.Ident, value: v };
427
+ }
428
+ function tokenize(str = "") {
429
+ let chars = str.trim();
430
+ let tokens = [];
431
+ let ch;
432
+ _i = 0;
433
+ while (_i < chars.length) {
434
+ ch = chars[_i++];
435
+ if (ch === "\n" || ch === " " || ch === " ") {
436
+ while (_i < chars.length && (chars[_i] === "\n" || chars[_i] === " " || chars[_i] === " ")) {
437
+ _i++;
438
+ }
439
+ continue;
440
+ }
441
+ if (ch === ",") {
442
+ return void 0;
443
+ }
444
+ if (ch === ")") {
445
+ tokens.push({ type: Tok.ParenClose });
446
+ continue;
447
+ }
448
+ if (ch === "+") {
449
+ _i--;
450
+ if (is_num(chars)) {
451
+ tokens.push(num(chars));
452
+ continue;
453
+ }
454
+ return void 0;
455
+ }
456
+ if (ch === "-") {
457
+ _i--;
458
+ if (is_num(chars)) {
459
+ tokens.push(num(chars));
460
+ continue;
461
+ }
462
+ if (is_ident(chars)) {
463
+ tokens.push({ type: Tok.Ident, value: ident(chars) });
464
+ continue;
465
+ }
466
+ return void 0;
467
+ }
468
+ if (ch === ".") {
469
+ _i--;
470
+ if (is_num(chars)) {
471
+ tokens.push(num(chars));
472
+ continue;
473
+ }
474
+ return void 0;
475
+ }
476
+ if (ch === "/") {
477
+ while (_i < chars.length && (chars[_i] === "\n" || chars[_i] === " " || chars[_i] === " ")) {
478
+ _i++;
479
+ }
480
+ let alpha;
481
+ if (is_num(chars)) {
482
+ alpha = num(chars);
483
+ if (alpha.type !== Tok.Hue) {
484
+ tokens.push({ type: Tok.Alpha, value: alpha });
485
+ continue;
486
+ }
487
+ }
488
+ if (is_ident(chars)) {
489
+ if (ident(chars) === "none") {
490
+ tokens.push({
491
+ type: Tok.Alpha,
492
+ value: { type: Tok.None, value: void 0 }
493
+ });
494
+ continue;
495
+ }
496
+ }
497
+ return void 0;
498
+ }
499
+ if (/\d/.test(ch)) {
500
+ _i--;
501
+ tokens.push(num(chars));
502
+ continue;
503
+ }
504
+ if (IdentStartCodePoint.test(ch)) {
505
+ _i--;
506
+ tokens.push(identlike(chars));
507
+ continue;
508
+ }
509
+ return void 0;
510
+ }
511
+ return tokens;
512
+ }
513
+ function parseColorSyntax(tokens) {
514
+ tokens._i = 0;
515
+ let token = tokens[tokens._i++];
516
+ if (!token || token.type !== Tok.Function || token.value !== "color") {
517
+ return void 0;
518
+ }
519
+ token = tokens[tokens._i++];
520
+ if (token.type !== Tok.Ident) {
521
+ return void 0;
522
+ }
523
+ const mode = colorProfiles[token.value];
524
+ if (!mode) {
525
+ return void 0;
526
+ }
527
+ const res = { mode };
528
+ const coords = consumeCoords(tokens, false);
529
+ if (!coords) {
530
+ return void 0;
531
+ }
532
+ const channels = getMode(mode).channels;
533
+ for (let ii = 0, c2, ch; ii < channels.length; ii++) {
534
+ c2 = coords[ii];
535
+ ch = channels[ii];
536
+ if (c2.type !== Tok.None) {
537
+ res[ch] = c2.type === Tok.Number ? c2.value : c2.value / 100;
538
+ if (ch === "alpha") {
539
+ res[ch] = Math.max(0, Math.min(1, res[ch]));
540
+ }
541
+ }
542
+ }
543
+ return res;
544
+ }
545
+ function consumeCoords(tokens, includeHue) {
546
+ const coords = [];
547
+ let token;
548
+ while (tokens._i < tokens.length) {
549
+ token = tokens[tokens._i++];
550
+ if (token.type === Tok.None || token.type === Tok.Number || token.type === Tok.Alpha || token.type === Tok.Percentage || includeHue && token.type === Tok.Hue) {
551
+ coords.push(token);
552
+ continue;
553
+ }
554
+ if (token.type === Tok.ParenClose) {
555
+ if (tokens._i < tokens.length) {
556
+ return void 0;
557
+ }
558
+ continue;
559
+ }
560
+ return void 0;
561
+ }
562
+ if (coords.length < 3 || coords.length > 4) {
563
+ return void 0;
564
+ }
565
+ if (coords.length === 4) {
566
+ if (coords[3].type !== Tok.Alpha) {
567
+ return void 0;
568
+ }
569
+ coords[3] = coords[3].value;
570
+ }
571
+ if (coords.length === 3) {
572
+ coords.push({ type: Tok.None, value: void 0 });
573
+ }
574
+ return coords.every((c2) => c2.type !== Tok.Alpha) ? coords : void 0;
575
+ }
576
+ function parseModernSyntax(tokens, includeHue) {
577
+ tokens._i = 0;
578
+ let token = tokens[tokens._i++];
579
+ if (!token || token.type !== Tok.Function) {
580
+ return void 0;
581
+ }
582
+ let coords = consumeCoords(tokens, includeHue);
583
+ if (!coords) {
584
+ return void 0;
585
+ }
586
+ coords.unshift(token.value);
587
+ return coords;
588
+ }
589
+ const parse = (color) => {
590
+ if (typeof color !== "string") {
591
+ return void 0;
592
+ }
593
+ const tokens = tokenize(color);
594
+ const parsed = tokens ? parseModernSyntax(tokens, true) : void 0;
595
+ let result = void 0;
596
+ let i = 0;
597
+ let len = parsers.length;
598
+ while (i < len) {
599
+ if ((result = parsers[i++](color, parsed)) !== void 0) {
600
+ return result;
601
+ }
602
+ }
603
+ return tokens ? parseColorSyntax(tokens) : void 0;
604
+ };
605
+ function parseRgb(color, parsed) {
606
+ if (!parsed || parsed[0] !== "rgb" && parsed[0] !== "rgba") {
607
+ return void 0;
608
+ }
609
+ const res = { mode: "rgb" };
610
+ const [, r, g, b, alpha] = parsed;
611
+ if (r.type === Tok.Hue || g.type === Tok.Hue || b.type === Tok.Hue) {
612
+ return void 0;
613
+ }
614
+ if (r.type !== Tok.None) {
615
+ res.r = r.type === Tok.Number ? r.value / 255 : r.value / 100;
616
+ }
617
+ if (g.type !== Tok.None) {
618
+ res.g = g.type === Tok.Number ? g.value / 255 : g.value / 100;
619
+ }
620
+ if (b.type !== Tok.None) {
621
+ res.b = b.type === Tok.Number ? b.value / 255 : b.value / 100;
622
+ }
623
+ if (alpha.type !== Tok.None) {
624
+ res.alpha = Math.min(
625
+ 1,
626
+ Math.max(
627
+ 0,
628
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
629
+ )
630
+ );
631
+ }
632
+ return res;
633
+ }
634
+ const parseTransparent = (c2) => c2 === "transparent" ? { mode: "rgb", r: 0, g: 0, b: 0, alpha: 0 } : void 0;
635
+ const lerp = (a, b, t) => a + t * (b - a);
636
+ const get_classes = (arr) => {
637
+ let classes = [];
638
+ for (let i = 0; i < arr.length - 1; i++) {
639
+ let a = arr[i];
640
+ let b = arr[i + 1];
641
+ if (a === void 0 && b === void 0) {
642
+ classes.push(void 0);
643
+ } else if (a !== void 0 && b !== void 0) {
644
+ classes.push([a, b]);
645
+ } else {
646
+ classes.push(a !== void 0 ? [a, a] : [b, b]);
647
+ }
648
+ }
649
+ return classes;
650
+ };
651
+ const interpolatorPiecewise = (interpolator) => (arr) => {
652
+ let classes = get_classes(arr);
653
+ return (t) => {
654
+ let cls = t * classes.length;
655
+ let idx = t >= 1 ? classes.length - 1 : Math.max(Math.floor(cls), 0);
656
+ let pair = classes[idx];
657
+ return pair === void 0 ? void 0 : interpolator(pair[0], pair[1], cls - idx);
658
+ };
659
+ };
660
+ const interpolatorLinear = interpolatorPiecewise(lerp);
661
+ const fixupAlpha = (arr) => {
662
+ let some_defined = false;
663
+ let res = arr.map((v) => {
664
+ if (v !== void 0) {
665
+ some_defined = true;
666
+ return v;
667
+ }
668
+ return 1;
669
+ });
670
+ return some_defined ? res : arr;
671
+ };
672
+ const definition$r = {
673
+ mode: "rgb",
674
+ channels: ["r", "g", "b", "alpha"],
675
+ parse: [
676
+ parseRgb,
677
+ parseHex,
678
+ parseRgbLegacy,
679
+ parseNamed,
680
+ parseTransparent,
681
+ "srgb"
682
+ ],
683
+ serialize: "srgb",
684
+ interpolate: {
685
+ r: interpolatorLinear,
686
+ g: interpolatorLinear,
687
+ b: interpolatorLinear,
688
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
689
+ },
690
+ gamut: true,
691
+ white: { r: 1, g: 1, b: 1 },
692
+ black: { r: 0, g: 0, b: 0 }
693
+ };
694
+ const linearize$2 = (v = 0) => Math.pow(Math.abs(v), 563 / 256) * Math.sign(v);
695
+ const convertA98ToXyz65 = (a98) => {
696
+ let r = linearize$2(a98.r);
697
+ let g = linearize$2(a98.g);
698
+ let b = linearize$2(a98.b);
699
+ let res = {
700
+ mode: "xyz65",
701
+ x: 0.5766690429101305 * r + 0.1855582379065463 * g + 0.1882286462349947 * b,
702
+ y: 0.297344975250536 * r + 0.6273635662554661 * g + 0.0752914584939979 * b,
703
+ z: 0.0270313613864123 * r + 0.0706888525358272 * g + 0.9913375368376386 * b
704
+ };
705
+ if (a98.alpha !== void 0) {
706
+ res.alpha = a98.alpha;
707
+ }
708
+ return res;
709
+ };
710
+ const gamma$2 = (v) => Math.pow(Math.abs(v), 256 / 563) * Math.sign(v);
711
+ const convertXyz65ToA98 = ({ x, y, z, alpha }) => {
712
+ if (x === void 0) x = 0;
713
+ if (y === void 0) y = 0;
714
+ if (z === void 0) z = 0;
715
+ let res = {
716
+ mode: "a98",
717
+ r: gamma$2(
718
+ x * 2.0415879038107465 - y * 0.5650069742788597 - 0.3447313507783297 * z
719
+ ),
720
+ g: gamma$2(
721
+ x * -0.9692436362808798 + y * 1.8759675015077206 + 0.0415550574071756 * z
722
+ ),
723
+ b: gamma$2(
724
+ x * 0.0134442806320312 - y * 0.1183623922310184 + 1.0151749943912058 * z
725
+ )
726
+ };
727
+ if (alpha !== void 0) {
728
+ res.alpha = alpha;
729
+ }
730
+ return res;
731
+ };
732
+ const fn$3 = (c2 = 0) => {
733
+ const abs2 = Math.abs(c2);
734
+ if (abs2 <= 0.04045) {
735
+ return c2 / 12.92;
736
+ }
737
+ return (Math.sign(c2) || 1) * Math.pow((abs2 + 0.055) / 1.055, 2.4);
738
+ };
739
+ const convertRgbToLrgb = ({ r, g, b, alpha }) => {
740
+ let res = {
741
+ mode: "lrgb",
742
+ r: fn$3(r),
743
+ g: fn$3(g),
744
+ b: fn$3(b)
745
+ };
746
+ if (alpha !== void 0) res.alpha = alpha;
747
+ return res;
748
+ };
749
+ const convertRgbToXyz65 = (rgb2) => {
750
+ let { r, g, b, alpha } = convertRgbToLrgb(rgb2);
751
+ let res = {
752
+ mode: "xyz65",
753
+ x: 0.4123907992659593 * r + 0.357584339383878 * g + 0.1804807884018343 * b,
754
+ y: 0.2126390058715102 * r + 0.715168678767756 * g + 0.0721923153607337 * b,
755
+ z: 0.0193308187155918 * r + 0.119194779794626 * g + 0.9505321522496607 * b
756
+ };
757
+ if (alpha !== void 0) {
758
+ res.alpha = alpha;
759
+ }
760
+ return res;
761
+ };
762
+ const fn$2 = (c2 = 0) => {
763
+ const abs2 = Math.abs(c2);
764
+ if (abs2 > 31308e-7) {
765
+ return (Math.sign(c2) || 1) * (1.055 * Math.pow(abs2, 1 / 2.4) - 0.055);
766
+ }
767
+ return c2 * 12.92;
768
+ };
769
+ const convertLrgbToRgb = ({ r, g, b, alpha }, mode = "rgb") => {
770
+ let res = {
771
+ mode,
772
+ r: fn$2(r),
773
+ g: fn$2(g),
774
+ b: fn$2(b)
775
+ };
776
+ if (alpha !== void 0) res.alpha = alpha;
777
+ return res;
778
+ };
779
+ const convertXyz65ToRgb = ({ x, y, z, alpha }) => {
780
+ if (x === void 0) x = 0;
781
+ if (y === void 0) y = 0;
782
+ if (z === void 0) z = 0;
783
+ let res = convertLrgbToRgb({
784
+ r: x * 3.2409699419045226 - y * 1.537383177570094 - 0.4986107602930034 * z,
785
+ g: x * -0.9692436362808796 + y * 1.8759675015077204 + 0.0415550574071756 * z,
786
+ b: x * 0.0556300796969936 - y * 0.2039769588889765 + 1.0569715142428784 * z
787
+ });
788
+ if (alpha !== void 0) {
789
+ res.alpha = alpha;
790
+ }
791
+ return res;
792
+ };
793
+ const definition$q = {
794
+ ...definition$r,
795
+ mode: "a98",
796
+ parse: ["a98-rgb"],
797
+ serialize: "a98-rgb",
798
+ fromMode: {
799
+ rgb: (color) => convertXyz65ToA98(convertRgbToXyz65(color)),
800
+ xyz65: convertXyz65ToA98
801
+ },
802
+ toMode: {
803
+ rgb: (color) => convertXyz65ToRgb(convertA98ToXyz65(color)),
804
+ xyz65: convertA98ToXyz65
805
+ }
806
+ };
807
+ const normalizeHue = (hue2) => (hue2 = hue2 % 360) < 0 ? hue2 + 360 : hue2;
808
+ const hue = (hues, fn2) => {
809
+ return hues.map((hue2, idx, arr) => {
810
+ if (hue2 === void 0) {
811
+ return hue2;
812
+ }
813
+ let normalized = normalizeHue(hue2);
814
+ if (idx === 0 || hues[idx - 1] === void 0) {
815
+ return normalized;
816
+ }
817
+ return fn2(normalized - normalizeHue(arr[idx - 1]));
818
+ }).reduce((acc, curr) => {
819
+ if (!acc.length || curr === void 0 || acc[acc.length - 1] === void 0) {
820
+ acc.push(curr);
821
+ return acc;
822
+ }
823
+ acc.push(curr + acc[acc.length - 1]);
824
+ return acc;
825
+ }, []);
826
+ };
827
+ const fixupHueShorter = (arr) => hue(arr, (d) => Math.abs(d) <= 180 ? d : d - 360 * Math.sign(d));
828
+ const M = [-0.14861, 1.78277, -0.29227, -0.90649, 1.97294, 0];
829
+ const degToRad = Math.PI / 180;
830
+ const radToDeg = 180 / Math.PI;
831
+ let DE = M[3] * M[4];
832
+ let BE = M[1] * M[4];
833
+ let BCAD = M[1] * M[2] - M[0] * M[3];
834
+ const convertRgbToCubehelix = ({ r, g, b, alpha }) => {
835
+ if (r === void 0) r = 0;
836
+ if (g === void 0) g = 0;
837
+ if (b === void 0) b = 0;
838
+ let l = (BCAD * b + r * DE - g * BE) / (BCAD + DE - BE);
839
+ let x = b - l;
840
+ let y = (M[4] * (g - l) - M[2] * x) / M[3];
841
+ let res = {
842
+ mode: "cubehelix",
843
+ l,
844
+ s: l === 0 || l === 1 ? void 0 : Math.sqrt(x * x + y * y) / (M[4] * l * (1 - l))
845
+ };
846
+ if (res.s) res.h = Math.atan2(y, x) * radToDeg - 120;
847
+ if (alpha !== void 0) res.alpha = alpha;
848
+ return res;
849
+ };
850
+ const convertCubehelixToRgb = ({ h, s, l, alpha }) => {
851
+ let res = { mode: "rgb" };
852
+ h = (h === void 0 ? 0 : h + 120) * degToRad;
853
+ if (l === void 0) l = 0;
854
+ let amp = s === void 0 ? 0 : s * l * (1 - l);
855
+ let cosh = Math.cos(h);
856
+ let sinh = Math.sin(h);
857
+ res.r = l + amp * (M[0] * cosh + M[1] * sinh);
858
+ res.g = l + amp * (M[2] * cosh + M[3] * sinh);
859
+ res.b = l + amp * (M[4] * cosh + M[5] * sinh);
860
+ if (alpha !== void 0) res.alpha = alpha;
861
+ return res;
862
+ };
863
+ const differenceHueSaturation = (std, smp) => {
864
+ if (std.h === void 0 || smp.h === void 0 || !std.s || !smp.s) {
865
+ return 0;
866
+ }
867
+ let std_h = normalizeHue(std.h);
868
+ let smp_h = normalizeHue(smp.h);
869
+ let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);
870
+ return 2 * Math.sqrt(std.s * smp.s) * dH;
871
+ };
872
+ const differenceHueNaive = (std, smp) => {
873
+ if (std.h === void 0 || smp.h === void 0) {
874
+ return 0;
875
+ }
876
+ let std_h = normalizeHue(std.h);
877
+ let smp_h = normalizeHue(smp.h);
878
+ if (Math.abs(smp_h - std_h) > 180) {
879
+ return std_h - (smp_h - 360 * Math.sign(smp_h - std_h));
880
+ }
881
+ return smp_h - std_h;
882
+ };
883
+ const differenceHueChroma = (std, smp) => {
884
+ if (std.h === void 0 || smp.h === void 0 || !std.c || !smp.c) {
885
+ return 0;
886
+ }
887
+ let std_h = normalizeHue(std.h);
888
+ let smp_h = normalizeHue(smp.h);
889
+ let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);
890
+ return 2 * Math.sqrt(std.c * smp.c) * dH;
891
+ };
892
+ const averageAngle = (val) => {
893
+ let sum = val.reduce(
894
+ (sum2, val2) => {
895
+ if (val2 !== void 0) {
896
+ let rad = val2 * Math.PI / 180;
897
+ sum2.sin += Math.sin(rad);
898
+ sum2.cos += Math.cos(rad);
899
+ }
900
+ return sum2;
901
+ },
902
+ { sin: 0, cos: 0 }
903
+ );
904
+ let angle = Math.atan2(sum.sin, sum.cos) * 180 / Math.PI;
905
+ return angle < 0 ? 360 + angle : angle;
906
+ };
907
+ const definition$p = {
908
+ mode: "cubehelix",
909
+ channels: ["h", "s", "l", "alpha"],
910
+ parse: ["--cubehelix"],
911
+ serialize: "--cubehelix",
912
+ ranges: {
913
+ h: [0, 360],
914
+ s: [0, 4.614],
915
+ l: [0, 1]
916
+ },
917
+ fromMode: {
918
+ rgb: convertRgbToCubehelix
919
+ },
920
+ toMode: {
921
+ rgb: convertCubehelixToRgb
922
+ },
923
+ interpolate: {
924
+ h: {
925
+ use: interpolatorLinear,
926
+ fixup: fixupHueShorter
927
+ },
928
+ s: interpolatorLinear,
929
+ l: interpolatorLinear,
930
+ alpha: {
931
+ use: interpolatorLinear,
932
+ fixup: fixupAlpha
933
+ }
934
+ },
935
+ difference: {
936
+ h: differenceHueSaturation
937
+ },
938
+ average: {
939
+ h: averageAngle
940
+ }
941
+ };
942
+ const convertLabToLch = ({ l, a, b, alpha }, mode = "lch") => {
943
+ if (a === void 0) a = 0;
944
+ if (b === void 0) b = 0;
945
+ let c2 = Math.sqrt(a * a + b * b);
946
+ let res = { mode, l, c: c2 };
947
+ if (c2) res.h = normalizeHue(Math.atan2(b, a) * 180 / Math.PI);
948
+ if (alpha !== void 0) res.alpha = alpha;
949
+ return res;
950
+ };
951
+ const convertLchToLab = ({ l, c: c2, h, alpha }, mode = "lab") => {
952
+ if (h === void 0) h = 0;
953
+ let res = {
954
+ mode,
955
+ l,
956
+ a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,
957
+ b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0
958
+ };
959
+ if (alpha !== void 0) res.alpha = alpha;
960
+ return res;
961
+ };
962
+ const k$1 = Math.pow(29, 3) / Math.pow(3, 3);
963
+ const e$1 = Math.pow(6, 3) / Math.pow(29, 3);
964
+ const D50 = {
965
+ X: 0.3457 / 0.3585,
966
+ Y: 1,
967
+ Z: (1 - 0.3457 - 0.3585) / 0.3585
968
+ };
969
+ const D65 = {
970
+ X: 0.3127 / 0.329,
971
+ Y: 1,
972
+ Z: (1 - 0.3127 - 0.329) / 0.329
973
+ };
974
+ let fn$1 = (v) => Math.pow(v, 3) > e$1 ? Math.pow(v, 3) : (116 * v - 16) / k$1;
975
+ const convertLab65ToXyz65 = ({ l, a, b, alpha }) => {
976
+ if (l === void 0) l = 0;
977
+ if (a === void 0) a = 0;
978
+ if (b === void 0) b = 0;
979
+ let fy = (l + 16) / 116;
980
+ let fx = a / 500 + fy;
981
+ let fz = fy - b / 200;
982
+ let res = {
983
+ mode: "xyz65",
984
+ x: fn$1(fx) * D65.X,
985
+ y: fn$1(fy) * D65.Y,
986
+ z: fn$1(fz) * D65.Z
987
+ };
988
+ if (alpha !== void 0) {
989
+ res.alpha = alpha;
990
+ }
991
+ return res;
992
+ };
993
+ const convertLab65ToRgb = (lab) => convertXyz65ToRgb(convertLab65ToXyz65(lab));
994
+ const f$1 = (value) => value > e$1 ? Math.cbrt(value) : (k$1 * value + 16) / 116;
995
+ const convertXyz65ToLab65 = ({ x, y, z, alpha }) => {
996
+ if (x === void 0) x = 0;
997
+ if (y === void 0) y = 0;
998
+ if (z === void 0) z = 0;
999
+ let f0 = f$1(x / D65.X);
1000
+ let f1 = f$1(y / D65.Y);
1001
+ let f2 = f$1(z / D65.Z);
1002
+ let res = {
1003
+ mode: "lab65",
1004
+ l: 116 * f1 - 16,
1005
+ a: 500 * (f0 - f1),
1006
+ b: 200 * (f1 - f2)
1007
+ };
1008
+ if (alpha !== void 0) {
1009
+ res.alpha = alpha;
1010
+ }
1011
+ return res;
1012
+ };
1013
+ const convertRgbToLab65 = (rgb2) => {
1014
+ let res = convertXyz65ToLab65(convertRgbToXyz65(rgb2));
1015
+ if (rgb2.r === rgb2.b && rgb2.b === rgb2.g) {
1016
+ res.a = res.b = 0;
1017
+ }
1018
+ return res;
1019
+ };
1020
+ const kE = 1;
1021
+ const kCH = 1;
1022
+ const θ = 26 / 180 * Math.PI;
1023
+ const cosθ = Math.cos(θ);
1024
+ const sinθ = Math.sin(θ);
1025
+ const factor = 100 / Math.log(139 / 100);
1026
+ const convertDlchToLab65 = ({ l, c: c2, h, alpha }) => {
1027
+ if (l === void 0) l = 0;
1028
+ if (c2 === void 0) c2 = 0;
1029
+ if (h === void 0) h = 0;
1030
+ let res = {
1031
+ mode: "lab65",
1032
+ l: (Math.exp(l * kE / factor) - 1) / 39e-4
1033
+ };
1034
+ let G = (Math.exp(0.0435 * c2 * kCH * kE) - 1) / 0.075;
1035
+ let e2 = G * Math.cos(h / 180 * Math.PI - θ);
1036
+ let f2 = G * Math.sin(h / 180 * Math.PI - θ);
1037
+ res.a = e2 * cosθ - f2 / 0.83 * sinθ;
1038
+ res.b = e2 * sinθ + f2 / 0.83 * cosθ;
1039
+ if (alpha !== void 0) res.alpha = alpha;
1040
+ return res;
1041
+ };
1042
+ const convertLab65ToDlch = ({ l, a, b, alpha }) => {
1043
+ if (l === void 0) l = 0;
1044
+ if (a === void 0) a = 0;
1045
+ if (b === void 0) b = 0;
1046
+ let e2 = a * cosθ + b * sinθ;
1047
+ let f2 = 0.83 * (b * cosθ - a * sinθ);
1048
+ let G = Math.sqrt(e2 * e2 + f2 * f2);
1049
+ let res = {
1050
+ mode: "dlch",
1051
+ l: factor / kE * Math.log(1 + 39e-4 * l),
1052
+ c: Math.log(1 + 0.075 * G) / (0.0435 * kCH * kE)
1053
+ };
1054
+ if (res.c) {
1055
+ res.h = normalizeHue((Math.atan2(f2, e2) + θ) / Math.PI * 180);
1056
+ }
1057
+ if (alpha !== void 0) res.alpha = alpha;
1058
+ return res;
1059
+ };
1060
+ const convertDlabToLab65 = (c2) => convertDlchToLab65(convertLabToLch(c2, "dlch"));
1061
+ const convertLab65ToDlab = (c2) => convertLchToLab(convertLab65ToDlch(c2), "dlab");
1062
+ const definition$o = {
1063
+ mode: "dlab",
1064
+ parse: ["--din99o-lab"],
1065
+ serialize: "--din99o-lab",
1066
+ toMode: {
1067
+ lab65: convertDlabToLab65,
1068
+ rgb: (c2) => convertLab65ToRgb(convertDlabToLab65(c2))
1069
+ },
1070
+ fromMode: {
1071
+ lab65: convertLab65ToDlab,
1072
+ rgb: (c2) => convertLab65ToDlab(convertRgbToLab65(c2))
1073
+ },
1074
+ channels: ["l", "a", "b", "alpha"],
1075
+ ranges: {
1076
+ l: [0, 100],
1077
+ a: [-40.09, 45.501],
1078
+ b: [-40.469, 44.344]
1079
+ },
1080
+ interpolate: {
1081
+ l: interpolatorLinear,
1082
+ a: interpolatorLinear,
1083
+ b: interpolatorLinear,
1084
+ alpha: {
1085
+ use: interpolatorLinear,
1086
+ fixup: fixupAlpha
1087
+ }
1088
+ }
1089
+ };
1090
+ const definition$n = {
1091
+ mode: "dlch",
1092
+ parse: ["--din99o-lch"],
1093
+ serialize: "--din99o-lch",
1094
+ toMode: {
1095
+ lab65: convertDlchToLab65,
1096
+ dlab: (c2) => convertLchToLab(c2, "dlab"),
1097
+ rgb: (c2) => convertLab65ToRgb(convertDlchToLab65(c2))
1098
+ },
1099
+ fromMode: {
1100
+ lab65: convertLab65ToDlch,
1101
+ dlab: (c2) => convertLabToLch(c2, "dlch"),
1102
+ rgb: (c2) => convertLab65ToDlch(convertRgbToLab65(c2))
1103
+ },
1104
+ channels: ["l", "c", "h", "alpha"],
1105
+ ranges: {
1106
+ l: [0, 100],
1107
+ c: [0, 51.484],
1108
+ h: [0, 360]
1109
+ },
1110
+ interpolate: {
1111
+ l: interpolatorLinear,
1112
+ c: interpolatorLinear,
1113
+ h: {
1114
+ use: interpolatorLinear,
1115
+ fixup: fixupHueShorter
1116
+ },
1117
+ alpha: {
1118
+ use: interpolatorLinear,
1119
+ fixup: fixupAlpha
1120
+ }
1121
+ },
1122
+ difference: {
1123
+ h: differenceHueChroma
1124
+ },
1125
+ average: {
1126
+ h: averageAngle
1127
+ }
1128
+ };
1129
+ function convertHsiToRgb({ h, s, i, alpha }) {
1130
+ h = normalizeHue(h !== void 0 ? h : 0);
1131
+ if (s === void 0) s = 0;
1132
+ if (i === void 0) i = 0;
1133
+ let f2 = Math.abs(h / 60 % 2 - 1);
1134
+ let res;
1135
+ switch (Math.floor(h / 60)) {
1136
+ case 0:
1137
+ res = {
1138
+ r: i * (1 + s * (3 / (2 - f2) - 1)),
1139
+ g: i * (1 + s * (3 * (1 - f2) / (2 - f2) - 1)),
1140
+ b: i * (1 - s)
1141
+ };
1142
+ break;
1143
+ case 1:
1144
+ res = {
1145
+ r: i * (1 + s * (3 * (1 - f2) / (2 - f2) - 1)),
1146
+ g: i * (1 + s * (3 / (2 - f2) - 1)),
1147
+ b: i * (1 - s)
1148
+ };
1149
+ break;
1150
+ case 2:
1151
+ res = {
1152
+ r: i * (1 - s),
1153
+ g: i * (1 + s * (3 / (2 - f2) - 1)),
1154
+ b: i * (1 + s * (3 * (1 - f2) / (2 - f2) - 1))
1155
+ };
1156
+ break;
1157
+ case 3:
1158
+ res = {
1159
+ r: i * (1 - s),
1160
+ g: i * (1 + s * (3 * (1 - f2) / (2 - f2) - 1)),
1161
+ b: i * (1 + s * (3 / (2 - f2) - 1))
1162
+ };
1163
+ break;
1164
+ case 4:
1165
+ res = {
1166
+ r: i * (1 + s * (3 * (1 - f2) / (2 - f2) - 1)),
1167
+ g: i * (1 - s),
1168
+ b: i * (1 + s * (3 / (2 - f2) - 1))
1169
+ };
1170
+ break;
1171
+ case 5:
1172
+ res = {
1173
+ r: i * (1 + s * (3 / (2 - f2) - 1)),
1174
+ g: i * (1 - s),
1175
+ b: i * (1 + s * (3 * (1 - f2) / (2 - f2) - 1))
1176
+ };
1177
+ break;
1178
+ default:
1179
+ res = { r: i * (1 - s), g: i * (1 - s), b: i * (1 - s) };
1180
+ }
1181
+ res.mode = "rgb";
1182
+ if (alpha !== void 0) res.alpha = alpha;
1183
+ return res;
1184
+ }
1185
+ function convertRgbToHsi({ r, g, b, alpha }) {
1186
+ if (r === void 0) r = 0;
1187
+ if (g === void 0) g = 0;
1188
+ if (b === void 0) b = 0;
1189
+ let M3 = Math.max(r, g, b), m = Math.min(r, g, b);
1190
+ let res = {
1191
+ mode: "hsi",
1192
+ s: r + g + b === 0 ? 0 : 1 - 3 * m / (r + g + b),
1193
+ i: (r + g + b) / 3
1194
+ };
1195
+ if (M3 - m !== 0)
1196
+ res.h = (M3 === r ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r) / (M3 - m) + 2 : (r - g) / (M3 - m) + 4) * 60;
1197
+ if (alpha !== void 0) res.alpha = alpha;
1198
+ return res;
1199
+ }
1200
+ const definition$m = {
1201
+ mode: "hsi",
1202
+ toMode: {
1203
+ rgb: convertHsiToRgb
1204
+ },
1205
+ parse: ["--hsi"],
1206
+ serialize: "--hsi",
1207
+ fromMode: {
1208
+ rgb: convertRgbToHsi
1209
+ },
1210
+ channels: ["h", "s", "i", "alpha"],
1211
+ ranges: {
1212
+ h: [0, 360]
1213
+ },
1214
+ gamut: "rgb",
1215
+ interpolate: {
1216
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1217
+ s: interpolatorLinear,
1218
+ i: interpolatorLinear,
1219
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1220
+ },
1221
+ difference: {
1222
+ h: differenceHueSaturation
1223
+ },
1224
+ average: {
1225
+ h: averageAngle
1226
+ }
1227
+ };
1228
+ function convertHslToRgb({ h, s, l, alpha }) {
1229
+ h = normalizeHue(h !== void 0 ? h : 0);
1230
+ if (s === void 0) s = 0;
1231
+ if (l === void 0) l = 0;
1232
+ let m1 = l + s * (l < 0.5 ? l : 1 - l);
1233
+ let m2 = m1 - (m1 - l) * 2 * Math.abs(h / 60 % 2 - 1);
1234
+ let res;
1235
+ switch (Math.floor(h / 60)) {
1236
+ case 0:
1237
+ res = { r: m1, g: m2, b: 2 * l - m1 };
1238
+ break;
1239
+ case 1:
1240
+ res = { r: m2, g: m1, b: 2 * l - m1 };
1241
+ break;
1242
+ case 2:
1243
+ res = { r: 2 * l - m1, g: m1, b: m2 };
1244
+ break;
1245
+ case 3:
1246
+ res = { r: 2 * l - m1, g: m2, b: m1 };
1247
+ break;
1248
+ case 4:
1249
+ res = { r: m2, g: 2 * l - m1, b: m1 };
1250
+ break;
1251
+ case 5:
1252
+ res = { r: m1, g: 2 * l - m1, b: m2 };
1253
+ break;
1254
+ default:
1255
+ res = { r: 2 * l - m1, g: 2 * l - m1, b: 2 * l - m1 };
1256
+ }
1257
+ res.mode = "rgb";
1258
+ if (alpha !== void 0) res.alpha = alpha;
1259
+ return res;
1260
+ }
1261
+ function convertRgbToHsl({ r, g, b, alpha }) {
1262
+ if (r === void 0) r = 0;
1263
+ if (g === void 0) g = 0;
1264
+ if (b === void 0) b = 0;
1265
+ let M3 = Math.max(r, g, b), m = Math.min(r, g, b);
1266
+ let res = {
1267
+ mode: "hsl",
1268
+ s: M3 === m ? 0 : (M3 - m) / (1 - Math.abs(M3 + m - 1)),
1269
+ l: 0.5 * (M3 + m)
1270
+ };
1271
+ if (M3 - m !== 0)
1272
+ res.h = (M3 === r ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r) / (M3 - m) + 2 : (r - g) / (M3 - m) + 4) * 60;
1273
+ if (alpha !== void 0) res.alpha = alpha;
1274
+ return res;
1275
+ }
1276
+ const hueToDeg = (val, unit) => {
1277
+ switch (unit) {
1278
+ case "deg":
1279
+ return +val;
1280
+ case "rad":
1281
+ return val / Math.PI * 180;
1282
+ case "grad":
1283
+ return val / 10 * 9;
1284
+ case "turn":
1285
+ return val * 360;
1286
+ }
1287
+ };
1288
+ const hsl_old = new RegExp(
1289
+ `^hsla?\\(\\s*${hue$1}${c}${per}${c}${per}\\s*(?:,\\s*${num_per}\\s*)?\\)$`
1290
+ );
1291
+ const parseHslLegacy = (color) => {
1292
+ let match = color.match(hsl_old);
1293
+ if (!match) return;
1294
+ let res = { mode: "hsl" };
1295
+ if (match[3] !== void 0) {
1296
+ res.h = +match[3];
1297
+ } else if (match[1] !== void 0 && match[2] !== void 0) {
1298
+ res.h = hueToDeg(match[1], match[2]);
1299
+ }
1300
+ if (match[4] !== void 0) {
1301
+ res.s = Math.min(Math.max(0, match[4] / 100), 1);
1302
+ }
1303
+ if (match[5] !== void 0) {
1304
+ res.l = Math.min(Math.max(0, match[5] / 100), 1);
1305
+ }
1306
+ if (match[6] !== void 0) {
1307
+ res.alpha = Math.max(0, Math.min(1, match[6] / 100));
1308
+ } else if (match[7] !== void 0) {
1309
+ res.alpha = Math.max(0, Math.min(1, +match[7]));
1310
+ }
1311
+ return res;
1312
+ };
1313
+ function parseHsl(color, parsed) {
1314
+ if (!parsed || parsed[0] !== "hsl" && parsed[0] !== "hsla") {
1315
+ return void 0;
1316
+ }
1317
+ const res = { mode: "hsl" };
1318
+ const [, h, s, l, alpha] = parsed;
1319
+ if (h.type !== Tok.None) {
1320
+ if (h.type === Tok.Percentage) {
1321
+ return void 0;
1322
+ }
1323
+ res.h = h.value;
1324
+ }
1325
+ if (s.type !== Tok.None) {
1326
+ if (s.type === Tok.Hue) {
1327
+ return void 0;
1328
+ }
1329
+ res.s = s.value / 100;
1330
+ }
1331
+ if (l.type !== Tok.None) {
1332
+ if (l.type === Tok.Hue) {
1333
+ return void 0;
1334
+ }
1335
+ res.l = l.value / 100;
1336
+ }
1337
+ if (alpha.type !== Tok.None) {
1338
+ res.alpha = Math.min(
1339
+ 1,
1340
+ Math.max(
1341
+ 0,
1342
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
1343
+ )
1344
+ );
1345
+ }
1346
+ return res;
1347
+ }
1348
+ const definition$l = {
1349
+ mode: "hsl",
1350
+ toMode: {
1351
+ rgb: convertHslToRgb
1352
+ },
1353
+ fromMode: {
1354
+ rgb: convertRgbToHsl
1355
+ },
1356
+ channels: ["h", "s", "l", "alpha"],
1357
+ ranges: {
1358
+ h: [0, 360]
1359
+ },
1360
+ gamut: "rgb",
1361
+ parse: [parseHsl, parseHslLegacy],
1362
+ serialize: (c2) => `hsl(${c2.h !== void 0 ? c2.h : "none"} ${c2.s !== void 0 ? c2.s * 100 + "%" : "none"} ${c2.l !== void 0 ? c2.l * 100 + "%" : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`,
1363
+ interpolate: {
1364
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1365
+ s: interpolatorLinear,
1366
+ l: interpolatorLinear,
1367
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1368
+ },
1369
+ difference: {
1370
+ h: differenceHueSaturation
1371
+ },
1372
+ average: {
1373
+ h: averageAngle
1374
+ }
1375
+ };
1376
+ function convertHsvToRgb({ h, s, v, alpha }) {
1377
+ h = normalizeHue(h !== void 0 ? h : 0);
1378
+ if (s === void 0) s = 0;
1379
+ if (v === void 0) v = 0;
1380
+ let f2 = Math.abs(h / 60 % 2 - 1);
1381
+ let res;
1382
+ switch (Math.floor(h / 60)) {
1383
+ case 0:
1384
+ res = { r: v, g: v * (1 - s * f2), b: v * (1 - s) };
1385
+ break;
1386
+ case 1:
1387
+ res = { r: v * (1 - s * f2), g: v, b: v * (1 - s) };
1388
+ break;
1389
+ case 2:
1390
+ res = { r: v * (1 - s), g: v, b: v * (1 - s * f2) };
1391
+ break;
1392
+ case 3:
1393
+ res = { r: v * (1 - s), g: v * (1 - s * f2), b: v };
1394
+ break;
1395
+ case 4:
1396
+ res = { r: v * (1 - s * f2), g: v * (1 - s), b: v };
1397
+ break;
1398
+ case 5:
1399
+ res = { r: v, g: v * (1 - s), b: v * (1 - s * f2) };
1400
+ break;
1401
+ default:
1402
+ res = { r: v * (1 - s), g: v * (1 - s), b: v * (1 - s) };
1403
+ }
1404
+ res.mode = "rgb";
1405
+ if (alpha !== void 0) res.alpha = alpha;
1406
+ return res;
1407
+ }
1408
+ function convertRgbToHsv({ r, g, b, alpha }) {
1409
+ if (r === void 0) r = 0;
1410
+ if (g === void 0) g = 0;
1411
+ if (b === void 0) b = 0;
1412
+ let M3 = Math.max(r, g, b), m = Math.min(r, g, b);
1413
+ let res = {
1414
+ mode: "hsv",
1415
+ s: M3 === 0 ? 0 : 1 - m / M3,
1416
+ v: M3
1417
+ };
1418
+ if (M3 - m !== 0)
1419
+ res.h = (M3 === r ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r) / (M3 - m) + 2 : (r - g) / (M3 - m) + 4) * 60;
1420
+ if (alpha !== void 0) res.alpha = alpha;
1421
+ return res;
1422
+ }
1423
+ const definition$k = {
1424
+ mode: "hsv",
1425
+ toMode: {
1426
+ rgb: convertHsvToRgb
1427
+ },
1428
+ parse: ["--hsv"],
1429
+ serialize: "--hsv",
1430
+ fromMode: {
1431
+ rgb: convertRgbToHsv
1432
+ },
1433
+ channels: ["h", "s", "v", "alpha"],
1434
+ ranges: {
1435
+ h: [0, 360]
1436
+ },
1437
+ gamut: "rgb",
1438
+ interpolate: {
1439
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1440
+ s: interpolatorLinear,
1441
+ v: interpolatorLinear,
1442
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1443
+ },
1444
+ difference: {
1445
+ h: differenceHueSaturation
1446
+ },
1447
+ average: {
1448
+ h: averageAngle
1449
+ }
1450
+ };
1451
+ function convertHwbToRgb({ h, w, b, alpha }) {
1452
+ if (w === void 0) w = 0;
1453
+ if (b === void 0) b = 0;
1454
+ if (w + b > 1) {
1455
+ let s = w + b;
1456
+ w /= s;
1457
+ b /= s;
1458
+ }
1459
+ return convertHsvToRgb({
1460
+ h,
1461
+ s: b === 1 ? 1 : 1 - w / (1 - b),
1462
+ v: 1 - b,
1463
+ alpha
1464
+ });
1465
+ }
1466
+ function convertRgbToHwb(rgba) {
1467
+ let hsv = convertRgbToHsv(rgba);
1468
+ if (hsv === void 0) return void 0;
1469
+ let s = hsv.s !== void 0 ? hsv.s : 0;
1470
+ let v = hsv.v !== void 0 ? hsv.v : 0;
1471
+ let res = {
1472
+ mode: "hwb",
1473
+ w: (1 - s) * v,
1474
+ b: 1 - v
1475
+ };
1476
+ if (hsv.h !== void 0) res.h = hsv.h;
1477
+ if (hsv.alpha !== void 0) res.alpha = hsv.alpha;
1478
+ return res;
1479
+ }
1480
+ function ParseHwb(color, parsed) {
1481
+ if (!parsed || parsed[0] !== "hwb") {
1482
+ return void 0;
1483
+ }
1484
+ const res = { mode: "hwb" };
1485
+ const [, h, w, b, alpha] = parsed;
1486
+ if (h.type !== Tok.None) {
1487
+ if (h.type === Tok.Percentage) {
1488
+ return void 0;
1489
+ }
1490
+ res.h = h.value;
1491
+ }
1492
+ if (w.type !== Tok.None) {
1493
+ if (w.type === Tok.Hue) {
1494
+ return void 0;
1495
+ }
1496
+ res.w = w.value / 100;
1497
+ }
1498
+ if (b.type !== Tok.None) {
1499
+ if (b.type === Tok.Hue) {
1500
+ return void 0;
1501
+ }
1502
+ res.b = b.value / 100;
1503
+ }
1504
+ if (alpha.type !== Tok.None) {
1505
+ res.alpha = Math.min(
1506
+ 1,
1507
+ Math.max(
1508
+ 0,
1509
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
1510
+ )
1511
+ );
1512
+ }
1513
+ return res;
1514
+ }
1515
+ const definition$j = {
1516
+ mode: "hwb",
1517
+ toMode: {
1518
+ rgb: convertHwbToRgb
1519
+ },
1520
+ fromMode: {
1521
+ rgb: convertRgbToHwb
1522
+ },
1523
+ channels: ["h", "w", "b", "alpha"],
1524
+ ranges: {
1525
+ h: [0, 360]
1526
+ },
1527
+ gamut: "rgb",
1528
+ parse: [ParseHwb],
1529
+ serialize: (c2) => `hwb(${c2.h !== void 0 ? c2.h : "none"} ${c2.w !== void 0 ? c2.w * 100 + "%" : "none"} ${c2.b !== void 0 ? c2.b * 100 + "%" : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`,
1530
+ interpolate: {
1531
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1532
+ w: interpolatorLinear,
1533
+ b: interpolatorLinear,
1534
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1535
+ },
1536
+ difference: {
1537
+ h: differenceHueNaive
1538
+ },
1539
+ average: {
1540
+ h: averageAngle
1541
+ }
1542
+ };
1543
+ const YW = 203;
1544
+ const M1 = 0.1593017578125;
1545
+ const M2 = 78.84375;
1546
+ const C1 = 0.8359375;
1547
+ const C2 = 18.8515625;
1548
+ const C3 = 18.6875;
1549
+ function transferPqDecode(v) {
1550
+ if (v < 0) return 0;
1551
+ const c2 = Math.pow(v, 1 / M2);
1552
+ return 1e4 * Math.pow(Math.max(0, c2 - C1) / (C2 - C3 * c2), 1 / M1);
1553
+ }
1554
+ function transferPqEncode(v) {
1555
+ if (v < 0) return 0;
1556
+ const c2 = Math.pow(v / 1e4, M1);
1557
+ return Math.pow((C1 + C2 * c2) / (1 + C3 * c2), M2);
1558
+ }
1559
+ const toRel = (c2) => Math.max(c2 / YW, 0);
1560
+ const convertItpToXyz65 = ({ i, t, p: p2, alpha }) => {
1561
+ if (i === void 0) i = 0;
1562
+ if (t === void 0) t = 0;
1563
+ if (p2 === void 0) p2 = 0;
1564
+ const l = transferPqDecode(
1565
+ i + 0.008609037037932761 * t + 0.11102962500302593 * p2
1566
+ );
1567
+ const m = transferPqDecode(
1568
+ i - 0.00860903703793275 * t - 0.11102962500302599 * p2
1569
+ );
1570
+ const s = transferPqDecode(
1571
+ i + 0.5600313357106791 * t - 0.32062717498731885 * p2
1572
+ );
1573
+ const res = {
1574
+ mode: "xyz65",
1575
+ x: toRel(
1576
+ 2.070152218389422 * l - 1.3263473389671556 * m + 0.2066510476294051 * s
1577
+ ),
1578
+ y: toRel(
1579
+ 0.3647385209748074 * l + 0.680566024947227 * m - 0.0453045459220346 * s
1580
+ ),
1581
+ z: toRel(
1582
+ -0.049747207535812 * l - 0.0492609666966138 * m + 1.1880659249923042 * s
1583
+ )
1584
+ };
1585
+ if (alpha !== void 0) {
1586
+ res.alpha = alpha;
1587
+ }
1588
+ return res;
1589
+ };
1590
+ const toAbs = (c2 = 0) => Math.max(c2 * YW, 0);
1591
+ const convertXyz65ToItp = ({ x, y, z, alpha }) => {
1592
+ const absX = toAbs(x);
1593
+ const absY = toAbs(y);
1594
+ const absZ = toAbs(z);
1595
+ const l = transferPqEncode(
1596
+ 0.3592832590121217 * absX + 0.6976051147779502 * absY - 0.0358915932320289 * absZ
1597
+ );
1598
+ const m = transferPqEncode(
1599
+ -0.1920808463704995 * absX + 1.1004767970374323 * absY + 0.0753748658519118 * absZ
1600
+ );
1601
+ const s = transferPqEncode(
1602
+ 0.0070797844607477 * absX + 0.0748396662186366 * absY + 0.8433265453898765 * absZ
1603
+ );
1604
+ const i = 0.5 * l + 0.5 * m;
1605
+ const t = 1.61376953125 * l - 3.323486328125 * m + 1.709716796875 * s;
1606
+ const p2 = 4.378173828125 * l - 4.24560546875 * m - 0.132568359375 * s;
1607
+ const res = { mode: "itp", i, t, p: p2 };
1608
+ if (alpha !== void 0) {
1609
+ res.alpha = alpha;
1610
+ }
1611
+ return res;
1612
+ };
1613
+ const definition$i = {
1614
+ mode: "itp",
1615
+ channels: ["i", "t", "p", "alpha"],
1616
+ parse: ["--ictcp"],
1617
+ serialize: "--ictcp",
1618
+ toMode: {
1619
+ xyz65: convertItpToXyz65,
1620
+ rgb: (color) => convertXyz65ToRgb(convertItpToXyz65(color))
1621
+ },
1622
+ fromMode: {
1623
+ xyz65: convertXyz65ToItp,
1624
+ rgb: (color) => convertXyz65ToItp(convertRgbToXyz65(color))
1625
+ },
1626
+ ranges: {
1627
+ i: [0, 0.581],
1628
+ t: [-0.369, 0.272],
1629
+ p: [-0.164, 0.331]
1630
+ },
1631
+ interpolate: {
1632
+ i: interpolatorLinear,
1633
+ t: interpolatorLinear,
1634
+ p: interpolatorLinear,
1635
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1636
+ }
1637
+ };
1638
+ const p$1 = 134.03437499999998;
1639
+ const d0$1 = 16295499532821565e-27;
1640
+ const jabPqEncode = (v) => {
1641
+ if (v < 0) return 0;
1642
+ let vn2 = Math.pow(v / 1e4, M1);
1643
+ return Math.pow((C1 + C2 * vn2) / (1 + C3 * vn2), p$1);
1644
+ };
1645
+ const abs = (v = 0) => Math.max(v * 203, 0);
1646
+ const convertXyz65ToJab = ({ x, y, z, alpha }) => {
1647
+ x = abs(x);
1648
+ y = abs(y);
1649
+ z = abs(z);
1650
+ let xp = 1.15 * x - 0.15 * z;
1651
+ let yp = 0.66 * y + 0.34 * x;
1652
+ let l = jabPqEncode(0.41478972 * xp + 0.579999 * yp + 0.014648 * z);
1653
+ let m = jabPqEncode(-0.20151 * xp + 1.120649 * yp + 0.0531008 * z);
1654
+ let s = jabPqEncode(-0.0166008 * xp + 0.2648 * yp + 0.6684799 * z);
1655
+ let i = (l + m) / 2;
1656
+ let res = {
1657
+ mode: "jab",
1658
+ j: 0.44 * i / (1 - 0.56 * i) - d0$1,
1659
+ a: 3.524 * l - 4.066708 * m + 0.542708 * s,
1660
+ b: 0.199076 * l + 1.096799 * m - 1.295875 * s
1661
+ };
1662
+ if (alpha !== void 0) {
1663
+ res.alpha = alpha;
1664
+ }
1665
+ return res;
1666
+ };
1667
+ const p = 134.03437499999998;
1668
+ const d0 = 16295499532821565e-27;
1669
+ const jabPqDecode = (v) => {
1670
+ if (v < 0) return 0;
1671
+ let vp = Math.pow(v, 1 / p);
1672
+ return 1e4 * Math.pow((C1 - vp) / (C3 * vp - C2), 1 / M1);
1673
+ };
1674
+ const rel = (v) => v / 203;
1675
+ const convertJabToXyz65 = ({ j, a, b, alpha }) => {
1676
+ if (j === void 0) j = 0;
1677
+ if (a === void 0) a = 0;
1678
+ if (b === void 0) b = 0;
1679
+ let i = (j + d0) / (0.44 + 0.56 * (j + d0));
1680
+ let l = jabPqDecode(i + 0.13860504 * a + 0.058047316 * b);
1681
+ let m = jabPqDecode(i - 0.13860504 * a - 0.058047316 * b);
1682
+ let s = jabPqDecode(i - 0.096019242 * a - 0.8118919 * b);
1683
+ let res = {
1684
+ mode: "xyz65",
1685
+ x: rel(
1686
+ 1.661373024652174 * l - 0.914523081304348 * m + 0.23136208173913045 * s
1687
+ ),
1688
+ y: rel(
1689
+ -0.3250758611844533 * l + 1.571847026732543 * m - 0.21825383453227928 * s
1690
+ ),
1691
+ z: rel(-0.090982811 * l - 0.31272829 * m + 1.5227666 * s)
1692
+ };
1693
+ if (alpha !== void 0) {
1694
+ res.alpha = alpha;
1695
+ }
1696
+ return res;
1697
+ };
1698
+ const convertRgbToJab = (rgb2) => {
1699
+ let res = convertXyz65ToJab(convertRgbToXyz65(rgb2));
1700
+ if (rgb2.r === rgb2.b && rgb2.b === rgb2.g) {
1701
+ res.a = res.b = 0;
1702
+ }
1703
+ return res;
1704
+ };
1705
+ const convertJabToRgb = (color) => convertXyz65ToRgb(convertJabToXyz65(color));
1706
+ const definition$h = {
1707
+ mode: "jab",
1708
+ channels: ["j", "a", "b", "alpha"],
1709
+ parse: ["--jzazbz"],
1710
+ serialize: "--jzazbz",
1711
+ fromMode: {
1712
+ rgb: convertRgbToJab,
1713
+ xyz65: convertXyz65ToJab
1714
+ },
1715
+ toMode: {
1716
+ rgb: convertJabToRgb,
1717
+ xyz65: convertJabToXyz65
1718
+ },
1719
+ ranges: {
1720
+ j: [0, 0.222],
1721
+ a: [-0.109, 0.129],
1722
+ b: [-0.185, 0.134]
1723
+ },
1724
+ interpolate: {
1725
+ j: interpolatorLinear,
1726
+ a: interpolatorLinear,
1727
+ b: interpolatorLinear,
1728
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1729
+ }
1730
+ };
1731
+ const convertJabToJch = ({ j, a, b, alpha }) => {
1732
+ if (a === void 0) a = 0;
1733
+ if (b === void 0) b = 0;
1734
+ let c2 = Math.sqrt(a * a + b * b);
1735
+ let res = {
1736
+ mode: "jch",
1737
+ j,
1738
+ c: c2
1739
+ };
1740
+ if (c2) {
1741
+ res.h = normalizeHue(Math.atan2(b, a) * 180 / Math.PI);
1742
+ }
1743
+ if (alpha !== void 0) {
1744
+ res.alpha = alpha;
1745
+ }
1746
+ return res;
1747
+ };
1748
+ const convertJchToJab = ({ j, c: c2, h, alpha }) => {
1749
+ if (h === void 0) h = 0;
1750
+ let res = {
1751
+ mode: "jab",
1752
+ j,
1753
+ a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,
1754
+ b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0
1755
+ };
1756
+ if (alpha !== void 0) res.alpha = alpha;
1757
+ return res;
1758
+ };
1759
+ const definition$g = {
1760
+ mode: "jch",
1761
+ parse: ["--jzczhz"],
1762
+ serialize: "--jzczhz",
1763
+ toMode: {
1764
+ jab: convertJchToJab,
1765
+ rgb: (c2) => convertJabToRgb(convertJchToJab(c2))
1766
+ },
1767
+ fromMode: {
1768
+ rgb: (c2) => convertJabToJch(convertRgbToJab(c2)),
1769
+ jab: convertJabToJch
1770
+ },
1771
+ channels: ["j", "c", "h", "alpha"],
1772
+ ranges: {
1773
+ j: [0, 0.221],
1774
+ c: [0, 0.19],
1775
+ h: [0, 360]
1776
+ },
1777
+ interpolate: {
1778
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1779
+ c: interpolatorLinear,
1780
+ j: interpolatorLinear,
1781
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1782
+ },
1783
+ difference: {
1784
+ h: differenceHueChroma
1785
+ },
1786
+ average: {
1787
+ h: averageAngle
1788
+ }
1789
+ };
1790
+ const k = Math.pow(29, 3) / Math.pow(3, 3);
1791
+ const e = Math.pow(6, 3) / Math.pow(29, 3);
1792
+ let fn = (v) => Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k;
1793
+ const convertLabToXyz50 = ({ l, a, b, alpha }) => {
1794
+ if (l === void 0) l = 0;
1795
+ if (a === void 0) a = 0;
1796
+ if (b === void 0) b = 0;
1797
+ let fy = (l + 16) / 116;
1798
+ let fx = a / 500 + fy;
1799
+ let fz = fy - b / 200;
1800
+ let res = {
1801
+ mode: "xyz50",
1802
+ x: fn(fx) * D50.X,
1803
+ y: fn(fy) * D50.Y,
1804
+ z: fn(fz) * D50.Z
1805
+ };
1806
+ if (alpha !== void 0) {
1807
+ res.alpha = alpha;
1808
+ }
1809
+ return res;
1810
+ };
1811
+ const convertXyz50ToRgb = ({ x, y, z, alpha }) => {
1812
+ if (x === void 0) x = 0;
1813
+ if (y === void 0) y = 0;
1814
+ if (z === void 0) z = 0;
1815
+ let res = convertLrgbToRgb({
1816
+ r: x * 3.1341359569958707 - y * 1.6173863321612538 - 0.4906619460083532 * z,
1817
+ g: x * -0.978795502912089 + y * 1.916254567259524 + 0.03344273116131949 * z,
1818
+ b: x * 0.07195537988411677 - y * 0.2289768264158322 + 1.405386058324125 * z
1819
+ });
1820
+ if (alpha !== void 0) {
1821
+ res.alpha = alpha;
1822
+ }
1823
+ return res;
1824
+ };
1825
+ const convertLabToRgb = (lab) => convertXyz50ToRgb(convertLabToXyz50(lab));
1826
+ const convertRgbToXyz50 = (rgb2) => {
1827
+ let { r, g, b, alpha } = convertRgbToLrgb(rgb2);
1828
+ let res = {
1829
+ mode: "xyz50",
1830
+ x: 0.436065742824811 * r + 0.3851514688337912 * g + 0.14307845442264197 * b,
1831
+ y: 0.22249319175623702 * r + 0.7168870538238823 * g + 0.06061979053616537 * b,
1832
+ z: 0.013923904500943465 * r + 0.09708128566574634 * g + 0.7140993584005155 * b
1833
+ };
1834
+ if (alpha !== void 0) {
1835
+ res.alpha = alpha;
1836
+ }
1837
+ return res;
1838
+ };
1839
+ const f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;
1840
+ const convertXyz50ToLab = ({ x, y, z, alpha }) => {
1841
+ if (x === void 0) x = 0;
1842
+ if (y === void 0) y = 0;
1843
+ if (z === void 0) z = 0;
1844
+ let f0 = f(x / D50.X);
1845
+ let f1 = f(y / D50.Y);
1846
+ let f2 = f(z / D50.Z);
1847
+ let res = {
1848
+ mode: "lab",
1849
+ l: 116 * f1 - 16,
1850
+ a: 500 * (f0 - f1),
1851
+ b: 200 * (f1 - f2)
1852
+ };
1853
+ if (alpha !== void 0) {
1854
+ res.alpha = alpha;
1855
+ }
1856
+ return res;
1857
+ };
1858
+ const convertRgbToLab = (rgb2) => {
1859
+ let res = convertXyz50ToLab(convertRgbToXyz50(rgb2));
1860
+ if (rgb2.r === rgb2.b && rgb2.b === rgb2.g) {
1861
+ res.a = res.b = 0;
1862
+ }
1863
+ return res;
1864
+ };
1865
+ function parseLab(color, parsed) {
1866
+ if (!parsed || parsed[0] !== "lab") {
1867
+ return void 0;
1868
+ }
1869
+ const res = { mode: "lab" };
1870
+ const [, l, a, b, alpha] = parsed;
1871
+ if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {
1872
+ return void 0;
1873
+ }
1874
+ if (l.type !== Tok.None) {
1875
+ res.l = Math.min(Math.max(0, l.value), 100);
1876
+ }
1877
+ if (a.type !== Tok.None) {
1878
+ res.a = a.type === Tok.Number ? a.value : a.value * 125 / 100;
1879
+ }
1880
+ if (b.type !== Tok.None) {
1881
+ res.b = b.type === Tok.Number ? b.value : b.value * 125 / 100;
1882
+ }
1883
+ if (alpha.type !== Tok.None) {
1884
+ res.alpha = Math.min(
1885
+ 1,
1886
+ Math.max(
1887
+ 0,
1888
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
1889
+ )
1890
+ );
1891
+ }
1892
+ return res;
1893
+ }
1894
+ const definition$f = {
1895
+ mode: "lab",
1896
+ toMode: {
1897
+ xyz50: convertLabToXyz50,
1898
+ rgb: convertLabToRgb
1899
+ },
1900
+ fromMode: {
1901
+ xyz50: convertXyz50ToLab,
1902
+ rgb: convertRgbToLab
1903
+ },
1904
+ channels: ["l", "a", "b", "alpha"],
1905
+ ranges: {
1906
+ l: [0, 100],
1907
+ a: [-125, 125],
1908
+ b: [-125, 125]
1909
+ },
1910
+ parse: [parseLab],
1911
+ serialize: (c2) => `lab(${c2.l !== void 0 ? c2.l : "none"} ${c2.a !== void 0 ? c2.a : "none"} ${c2.b !== void 0 ? c2.b : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`,
1912
+ interpolate: {
1913
+ l: interpolatorLinear,
1914
+ a: interpolatorLinear,
1915
+ b: interpolatorLinear,
1916
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1917
+ }
1918
+ };
1919
+ const definition$e = {
1920
+ ...definition$f,
1921
+ mode: "lab65",
1922
+ parse: ["--lab-d65"],
1923
+ serialize: "--lab-d65",
1924
+ toMode: {
1925
+ xyz65: convertLab65ToXyz65,
1926
+ rgb: convertLab65ToRgb
1927
+ },
1928
+ fromMode: {
1929
+ xyz65: convertXyz65ToLab65,
1930
+ rgb: convertRgbToLab65
1931
+ },
1932
+ ranges: {
1933
+ l: [0, 100],
1934
+ a: [-125, 125],
1935
+ b: [-125, 125]
1936
+ }
1937
+ };
1938
+ function parseLch(color, parsed) {
1939
+ if (!parsed || parsed[0] !== "lch") {
1940
+ return void 0;
1941
+ }
1942
+ const res = { mode: "lch" };
1943
+ const [, l, c2, h, alpha] = parsed;
1944
+ if (l.type !== Tok.None) {
1945
+ if (l.type === Tok.Hue) {
1946
+ return void 0;
1947
+ }
1948
+ res.l = Math.min(Math.max(0, l.value), 100);
1949
+ }
1950
+ if (c2.type !== Tok.None) {
1951
+ res.c = Math.max(
1952
+ 0,
1953
+ c2.type === Tok.Number ? c2.value : c2.value * 150 / 100
1954
+ );
1955
+ }
1956
+ if (h.type !== Tok.None) {
1957
+ if (h.type === Tok.Percentage) {
1958
+ return void 0;
1959
+ }
1960
+ res.h = h.value;
1961
+ }
1962
+ if (alpha.type !== Tok.None) {
1963
+ res.alpha = Math.min(
1964
+ 1,
1965
+ Math.max(
1966
+ 0,
1967
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
1968
+ )
1969
+ );
1970
+ }
1971
+ return res;
1972
+ }
1973
+ const definition$d = {
1974
+ mode: "lch",
1975
+ toMode: {
1976
+ lab: convertLchToLab,
1977
+ rgb: (c2) => convertLabToRgb(convertLchToLab(c2))
1978
+ },
1979
+ fromMode: {
1980
+ rgb: (c2) => convertLabToLch(convertRgbToLab(c2)),
1981
+ lab: convertLabToLch
1982
+ },
1983
+ channels: ["l", "c", "h", "alpha"],
1984
+ ranges: {
1985
+ l: [0, 100],
1986
+ c: [0, 150],
1987
+ h: [0, 360]
1988
+ },
1989
+ parse: [parseLch],
1990
+ serialize: (c2) => `lch(${c2.l !== void 0 ? c2.l : "none"} ${c2.c !== void 0 ? c2.c : "none"} ${c2.h !== void 0 ? c2.h : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`,
1991
+ interpolate: {
1992
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
1993
+ c: interpolatorLinear,
1994
+ l: interpolatorLinear,
1995
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
1996
+ },
1997
+ difference: {
1998
+ h: differenceHueChroma
1999
+ },
2000
+ average: {
2001
+ h: averageAngle
2002
+ }
2003
+ };
2004
+ const definition$c = {
2005
+ ...definition$d,
2006
+ mode: "lch65",
2007
+ parse: ["--lch-d65"],
2008
+ serialize: "--lch-d65",
2009
+ toMode: {
2010
+ lab65: (c2) => convertLchToLab(c2, "lab65"),
2011
+ rgb: (c2) => convertLab65ToRgb(convertLchToLab(c2, "lab65"))
2012
+ },
2013
+ fromMode: {
2014
+ rgb: (c2) => convertLabToLch(convertRgbToLab65(c2), "lch65"),
2015
+ lab65: (c2) => convertLabToLch(c2, "lch65")
2016
+ },
2017
+ ranges: {
2018
+ l: [0, 100],
2019
+ c: [0, 150],
2020
+ h: [0, 360]
2021
+ }
2022
+ };
2023
+ const convertLuvToLchuv = ({ l, u, v, alpha }) => {
2024
+ if (u === void 0) u = 0;
2025
+ if (v === void 0) v = 0;
2026
+ let c2 = Math.sqrt(u * u + v * v);
2027
+ let res = {
2028
+ mode: "lchuv",
2029
+ l,
2030
+ c: c2
2031
+ };
2032
+ if (c2) {
2033
+ res.h = normalizeHue(Math.atan2(v, u) * 180 / Math.PI);
2034
+ }
2035
+ if (alpha !== void 0) {
2036
+ res.alpha = alpha;
2037
+ }
2038
+ return res;
2039
+ };
2040
+ const convertLchuvToLuv = ({ l, c: c2, h, alpha }) => {
2041
+ if (h === void 0) h = 0;
2042
+ let res = {
2043
+ mode: "luv",
2044
+ l,
2045
+ u: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,
2046
+ v: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0
2047
+ };
2048
+ if (alpha !== void 0) {
2049
+ res.alpha = alpha;
2050
+ }
2051
+ return res;
2052
+ };
2053
+ const u_fn$1 = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);
2054
+ const v_fn$1 = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);
2055
+ const un$1 = u_fn$1(D50.X, D50.Y, D50.Z);
2056
+ const vn$1 = v_fn$1(D50.X, D50.Y, D50.Z);
2057
+ const l_fn = (value) => value <= e ? k * value : 116 * Math.cbrt(value) - 16;
2058
+ const convertXyz50ToLuv = ({ x, y, z, alpha }) => {
2059
+ if (x === void 0) x = 0;
2060
+ if (y === void 0) y = 0;
2061
+ if (z === void 0) z = 0;
2062
+ let l = l_fn(y / D50.Y);
2063
+ let u = u_fn$1(x, y, z);
2064
+ let v = v_fn$1(x, y, z);
2065
+ if (!isFinite(u) || !isFinite(v)) {
2066
+ l = u = v = 0;
2067
+ } else {
2068
+ u = 13 * l * (u - un$1);
2069
+ v = 13 * l * (v - vn$1);
2070
+ }
2071
+ let res = {
2072
+ mode: "luv",
2073
+ l,
2074
+ u,
2075
+ v
2076
+ };
2077
+ if (alpha !== void 0) {
2078
+ res.alpha = alpha;
2079
+ }
2080
+ return res;
2081
+ };
2082
+ const u_fn = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);
2083
+ const v_fn = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);
2084
+ const un = u_fn(D50.X, D50.Y, D50.Z);
2085
+ const vn = v_fn(D50.X, D50.Y, D50.Z);
2086
+ const convertLuvToXyz50 = ({ l, u, v, alpha }) => {
2087
+ if (l === void 0) l = 0;
2088
+ if (l === 0) {
2089
+ return { mode: "xyz50", x: 0, y: 0, z: 0 };
2090
+ }
2091
+ if (u === void 0) u = 0;
2092
+ if (v === void 0) v = 0;
2093
+ let up = u / (13 * l) + un;
2094
+ let vp = v / (13 * l) + vn;
2095
+ let y = D50.Y * (l <= 8 ? l / k : Math.pow((l + 16) / 116, 3));
2096
+ let x = y * (9 * up) / (4 * vp);
2097
+ let z = y * (12 - 3 * up - 20 * vp) / (4 * vp);
2098
+ let res = { mode: "xyz50", x, y, z };
2099
+ if (alpha !== void 0) {
2100
+ res.alpha = alpha;
2101
+ }
2102
+ return res;
2103
+ };
2104
+ const convertRgbToLchuv = (rgb2) => convertLuvToLchuv(convertXyz50ToLuv(convertRgbToXyz50(rgb2)));
2105
+ const convertLchuvToRgb = (lchuv) => convertXyz50ToRgb(convertLuvToXyz50(convertLchuvToLuv(lchuv)));
2106
+ const definition$b = {
2107
+ mode: "lchuv",
2108
+ toMode: {
2109
+ luv: convertLchuvToLuv,
2110
+ rgb: convertLchuvToRgb
2111
+ },
2112
+ fromMode: {
2113
+ rgb: convertRgbToLchuv,
2114
+ luv: convertLuvToLchuv
2115
+ },
2116
+ channels: ["l", "c", "h", "alpha"],
2117
+ parse: ["--lchuv"],
2118
+ serialize: "--lchuv",
2119
+ ranges: {
2120
+ l: [0, 100],
2121
+ c: [0, 176.956],
2122
+ h: [0, 360]
2123
+ },
2124
+ interpolate: {
2125
+ h: { use: interpolatorLinear, fixup: fixupHueShorter },
2126
+ c: interpolatorLinear,
2127
+ l: interpolatorLinear,
2128
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
2129
+ },
2130
+ difference: {
2131
+ h: differenceHueChroma
2132
+ },
2133
+ average: {
2134
+ h: averageAngle
2135
+ }
2136
+ };
2137
+ const definition$a = {
2138
+ ...definition$r,
2139
+ mode: "lrgb",
2140
+ toMode: {
2141
+ rgb: convertLrgbToRgb
2142
+ },
2143
+ fromMode: {
2144
+ rgb: convertRgbToLrgb
2145
+ },
2146
+ parse: ["srgb-linear"],
2147
+ serialize: "srgb-linear"
2148
+ };
2149
+ const definition$9 = {
2150
+ mode: "luv",
2151
+ toMode: {
2152
+ xyz50: convertLuvToXyz50,
2153
+ rgb: (luv) => convertXyz50ToRgb(convertLuvToXyz50(luv))
2154
+ },
2155
+ fromMode: {
2156
+ xyz50: convertXyz50ToLuv,
2157
+ rgb: (rgb2) => convertXyz50ToLuv(convertRgbToXyz50(rgb2))
2158
+ },
2159
+ channels: ["l", "u", "v", "alpha"],
2160
+ parse: ["--luv"],
2161
+ serialize: "--luv",
2162
+ ranges: {
2163
+ l: [0, 100],
2164
+ u: [-84.936, 175.042],
2165
+ v: [-125.882, 87.243]
2166
+ },
2167
+ interpolate: {
2168
+ l: interpolatorLinear,
2169
+ u: interpolatorLinear,
2170
+ v: interpolatorLinear,
2171
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
2172
+ }
2173
+ };
2174
+ const convertLrgbToOklab = ({ r, g, b, alpha }) => {
2175
+ if (r === void 0) r = 0;
2176
+ if (g === void 0) g = 0;
2177
+ if (b === void 0) b = 0;
2178
+ let L = Math.cbrt(
2179
+ 0.412221469470763 * r + 0.5363325372617348 * g + 0.0514459932675022 * b
2180
+ );
2181
+ let M3 = Math.cbrt(
2182
+ 0.2119034958178252 * r + 0.6806995506452344 * g + 0.1073969535369406 * b
2183
+ );
2184
+ let S = Math.cbrt(
2185
+ 0.0883024591900564 * r + 0.2817188391361215 * g + 0.6299787016738222 * b
2186
+ );
2187
+ let res = {
2188
+ mode: "oklab",
2189
+ l: 0.210454268309314 * L + 0.7936177747023054 * M3 - 0.0040720430116193 * S,
2190
+ a: 1.9779985324311684 * L - 2.42859224204858 * M3 + 0.450593709617411 * S,
2191
+ b: 0.0259040424655478 * L + 0.7827717124575296 * M3 - 0.8086757549230774 * S
2192
+ };
2193
+ if (alpha !== void 0) {
2194
+ res.alpha = alpha;
2195
+ }
2196
+ return res;
2197
+ };
2198
+ const convertRgbToOklab = (rgb2) => {
2199
+ let res = convertLrgbToOklab(convertRgbToLrgb(rgb2));
2200
+ if (rgb2.r === rgb2.b && rgb2.b === rgb2.g) {
2201
+ res.a = res.b = 0;
2202
+ }
2203
+ return res;
2204
+ };
2205
+ const convertOklabToLrgb = ({ l, a, b, alpha }) => {
2206
+ if (l === void 0) l = 0;
2207
+ if (a === void 0) a = 0;
2208
+ if (b === void 0) b = 0;
2209
+ let L = Math.pow(l + 0.3963377773761749 * a + 0.2158037573099136 * b, 3);
2210
+ let M3 = Math.pow(l - 0.1055613458156586 * a - 0.0638541728258133 * b, 3);
2211
+ let S = Math.pow(l - 0.0894841775298119 * a - 1.2914855480194092 * b, 3);
2212
+ let res = {
2213
+ mode: "lrgb",
2214
+ r: 4.076741636075957 * L - 3.3077115392580616 * M3 + 0.2309699031821044 * S,
2215
+ g: -1.2684379732850317 * L + 2.6097573492876887 * M3 - 0.3413193760026573 * S,
2216
+ b: -0.0041960761386756 * L - 0.7034186179359362 * M3 + 1.7076146940746117 * S
2217
+ };
2218
+ if (alpha !== void 0) {
2219
+ res.alpha = alpha;
2220
+ }
2221
+ return res;
2222
+ };
2223
+ const convertOklabToRgb = (c2) => convertLrgbToRgb(convertOklabToLrgb(c2));
2224
+ function toe(x) {
2225
+ const k_1 = 0.206;
2226
+ const k_2 = 0.03;
2227
+ const k_3 = (1 + k_1) / (1 + k_2);
2228
+ 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));
2229
+ }
2230
+ function toe_inv(x) {
2231
+ const k_1 = 0.206;
2232
+ const k_2 = 0.03;
2233
+ const k_3 = (1 + k_1) / (1 + k_2);
2234
+ return (x * x + k_1 * x) / (k_3 * (x + k_2));
2235
+ }
2236
+ function compute_max_saturation(a, b) {
2237
+ let k0, k1, k2, k3, k4, wl, wm, ws;
2238
+ if (-1.88170328 * a - 0.80936493 * b > 1) {
2239
+ k0 = 1.19086277;
2240
+ k1 = 1.76576728;
2241
+ k2 = 0.59662641;
2242
+ k3 = 0.75515197;
2243
+ k4 = 0.56771245;
2244
+ wl = 4.0767416621;
2245
+ wm = -3.3077115913;
2246
+ ws = 0.2309699292;
2247
+ } else if (1.81444104 * a - 1.19445276 * b > 1) {
2248
+ k0 = 0.73956515;
2249
+ k1 = -0.45954404;
2250
+ k2 = 0.08285427;
2251
+ k3 = 0.1254107;
2252
+ k4 = 0.14503204;
2253
+ wl = -1.2684380046;
2254
+ wm = 2.6097574011;
2255
+ ws = -0.3413193965;
2256
+ } else {
2257
+ k0 = 1.35733652;
2258
+ k1 = -915799e-8;
2259
+ k2 = -1.1513021;
2260
+ k3 = -0.50559606;
2261
+ k4 = 692167e-8;
2262
+ wl = -0.0041960863;
2263
+ wm = -0.7034186147;
2264
+ ws = 1.707614701;
2265
+ }
2266
+ let S = k0 + k1 * a + k2 * b + k3 * a * a + k4 * a * b;
2267
+ let k_l = 0.3963377774 * a + 0.2158037573 * b;
2268
+ let k_m = -0.1055613458 * a - 0.0638541728 * b;
2269
+ let k_s = -0.0894841775 * a - 1.291485548 * b;
2270
+ {
2271
+ let l_ = 1 + S * k_l;
2272
+ let m_ = 1 + S * k_m;
2273
+ let s_ = 1 + S * k_s;
2274
+ let l = l_ * l_ * l_;
2275
+ let m = m_ * m_ * m_;
2276
+ let s = s_ * s_ * s_;
2277
+ let l_dS = 3 * k_l * l_ * l_;
2278
+ let m_dS = 3 * k_m * m_ * m_;
2279
+ let s_dS = 3 * k_s * s_ * s_;
2280
+ let l_dS2 = 6 * k_l * k_l * l_;
2281
+ let m_dS2 = 6 * k_m * k_m * m_;
2282
+ let s_dS2 = 6 * k_s * k_s * s_;
2283
+ let f2 = wl * l + wm * m + ws * s;
2284
+ let f1 = wl * l_dS + wm * m_dS + ws * s_dS;
2285
+ let f22 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2;
2286
+ S = S - f2 * f1 / (f1 * f1 - 0.5 * f2 * f22);
2287
+ }
2288
+ return S;
2289
+ }
2290
+ function find_cusp(a, b) {
2291
+ let S_cusp = compute_max_saturation(a, b);
2292
+ let rgb2 = convertOklabToLrgb({ l: 1, a: S_cusp * a, b: S_cusp * b });
2293
+ let L_cusp = Math.cbrt(1 / Math.max(rgb2.r, rgb2.g, rgb2.b));
2294
+ let C_cusp = L_cusp * S_cusp;
2295
+ return [L_cusp, C_cusp];
2296
+ }
2297
+ function find_gamut_intersection(a, b, L1, C12, L0, cusp = null) {
2298
+ if (!cusp) {
2299
+ cusp = find_cusp(a, b);
2300
+ }
2301
+ let t;
2302
+ if ((L1 - L0) * cusp[1] - (cusp[0] - L0) * C12 <= 0) {
2303
+ t = cusp[1] * L0 / (C12 * cusp[0] + cusp[1] * (L0 - L1));
2304
+ } else {
2305
+ t = cusp[1] * (L0 - 1) / (C12 * (cusp[0] - 1) + cusp[1] * (L0 - L1));
2306
+ {
2307
+ let dL = L1 - L0;
2308
+ let dC = C12;
2309
+ let k_l = 0.3963377774 * a + 0.2158037573 * b;
2310
+ let k_m = -0.1055613458 * a - 0.0638541728 * b;
2311
+ let k_s = -0.0894841775 * a - 1.291485548 * b;
2312
+ let l_dt = dL + dC * k_l;
2313
+ let m_dt = dL + dC * k_m;
2314
+ let s_dt = dL + dC * k_s;
2315
+ {
2316
+ let L = L0 * (1 - t) + t * L1;
2317
+ let C = t * C12;
2318
+ let l_ = L + C * k_l;
2319
+ let m_ = L + C * k_m;
2320
+ let s_ = L + C * k_s;
2321
+ let l = l_ * l_ * l_;
2322
+ let m = m_ * m_ * m_;
2323
+ let s = s_ * s_ * s_;
2324
+ let ldt = 3 * l_dt * l_ * l_;
2325
+ let mdt = 3 * m_dt * m_ * m_;
2326
+ let sdt = 3 * s_dt * s_ * s_;
2327
+ let ldt2 = 6 * l_dt * l_dt * l_;
2328
+ let mdt2 = 6 * m_dt * m_dt * m_;
2329
+ let sdt2 = 6 * s_dt * s_dt * s_;
2330
+ let r = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s - 1;
2331
+ let r1 = 4.0767416621 * ldt - 3.3077115913 * mdt + 0.2309699292 * sdt;
2332
+ let r2 = 4.0767416621 * ldt2 - 3.3077115913 * mdt2 + 0.2309699292 * sdt2;
2333
+ let u_r = r1 / (r1 * r1 - 0.5 * r * r2);
2334
+ let t_r = -r * u_r;
2335
+ let g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s - 1;
2336
+ let g1 = -1.2684380046 * ldt + 2.6097574011 * mdt - 0.3413193965 * sdt;
2337
+ let g2 = -1.2684380046 * ldt2 + 2.6097574011 * mdt2 - 0.3413193965 * sdt2;
2338
+ let u_g = g1 / (g1 * g1 - 0.5 * g * g2);
2339
+ let t_g = -g * u_g;
2340
+ let b2 = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s - 1;
2341
+ let b1 = -0.0041960863 * ldt - 0.7034186147 * mdt + 1.707614701 * sdt;
2342
+ let b22 = -0.0041960863 * ldt2 - 0.7034186147 * mdt2 + 1.707614701 * sdt2;
2343
+ let u_b = b1 / (b1 * b1 - 0.5 * b2 * b22);
2344
+ let t_b = -b2 * u_b;
2345
+ t_r = u_r >= 0 ? t_r : 1e6;
2346
+ t_g = u_g >= 0 ? t_g : 1e6;
2347
+ t_b = u_b >= 0 ? t_b : 1e6;
2348
+ t += Math.min(t_r, Math.min(t_g, t_b));
2349
+ }
2350
+ }
2351
+ }
2352
+ return t;
2353
+ }
2354
+ function get_ST_max(a_, b_, cusp = null) {
2355
+ if (!cusp) {
2356
+ cusp = find_cusp(a_, b_);
2357
+ }
2358
+ let L = cusp[0];
2359
+ let C = cusp[1];
2360
+ return [C / L, C / (1 - L)];
2361
+ }
2362
+ function get_Cs(L, a_, b_) {
2363
+ let cusp = find_cusp(a_, b_);
2364
+ let C_max = find_gamut_intersection(a_, b_, L, 1, L, cusp);
2365
+ let ST_max = get_ST_max(a_, b_, cusp);
2366
+ 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_))));
2367
+ let T_mid = 0.11239642 + 1 / (1.6132032 - 0.68124379 * b_ + a_ * (0.40370612 + 0.90148123 * b_ + a_ * (-0.27087943 + 0.6122399 * b_ + a_ * (299215e-8 - 0.45399568 * b_ - 0.14661872 * a_))));
2368
+ let k2 = C_max / Math.min(L * ST_max[0], (1 - L) * ST_max[1]);
2369
+ let C_a = L * S_mid;
2370
+ let C_b = (1 - L) * T_mid;
2371
+ let C_mid = 0.9 * k2 * Math.sqrt(
2372
+ Math.sqrt(
2373
+ 1 / (1 / (C_a * C_a * C_a * C_a) + 1 / (C_b * C_b * C_b * C_b))
2374
+ )
2375
+ );
2376
+ C_a = L * 0.4;
2377
+ C_b = (1 - L) * 0.8;
2378
+ let C_0 = Math.sqrt(1 / (1 / (C_a * C_a) + 1 / (C_b * C_b)));
2379
+ return [C_0, C_mid, C_max];
2380
+ }
2381
+ function convertOklabToOkhsl(lab) {
2382
+ const l = lab.l !== void 0 ? lab.l : 0;
2383
+ const a = lab.a !== void 0 ? lab.a : 0;
2384
+ const b = lab.b !== void 0 ? lab.b : 0;
2385
+ const ret = { mode: "okhsl", l: toe(l) };
2386
+ if (lab.alpha !== void 0) {
2387
+ ret.alpha = lab.alpha;
2388
+ }
2389
+ let c2 = Math.sqrt(a * a + b * b);
2390
+ if (!c2) {
2391
+ ret.s = 0;
2392
+ return ret;
2393
+ }
2394
+ let [C_0, C_mid, C_max] = get_Cs(l, a / c2, b / c2);
2395
+ let s;
2396
+ if (c2 < C_mid) {
2397
+ let k_0 = 0;
2398
+ let k_1 = 0.8 * C_0;
2399
+ let k_2 = 1 - k_1 / C_mid;
2400
+ let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));
2401
+ s = t * 0.8;
2402
+ } else {
2403
+ let k_0 = C_mid;
2404
+ let k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;
2405
+ let k_2 = 1 - k_1 / (C_max - C_mid);
2406
+ let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));
2407
+ s = 0.8 + 0.2 * t;
2408
+ }
2409
+ if (s) {
2410
+ ret.s = s;
2411
+ ret.h = normalizeHue(Math.atan2(b, a) * 180 / Math.PI);
2412
+ }
2413
+ return ret;
2414
+ }
2415
+ function convertOkhslToOklab(hsl) {
2416
+ let h = hsl.h !== void 0 ? hsl.h : 0;
2417
+ let s = hsl.s !== void 0 ? hsl.s : 0;
2418
+ let l = hsl.l !== void 0 ? hsl.l : 0;
2419
+ const ret = { mode: "oklab", l: toe_inv(l) };
2420
+ if (hsl.alpha !== void 0) {
2421
+ ret.alpha = hsl.alpha;
2422
+ }
2423
+ if (!s || l === 1) {
2424
+ ret.a = ret.b = 0;
2425
+ return ret;
2426
+ }
2427
+ let a_ = Math.cos(h / 180 * Math.PI);
2428
+ let b_ = Math.sin(h / 180 * Math.PI);
2429
+ let [C_0, C_mid, C_max] = get_Cs(ret.l, a_, b_);
2430
+ let t, k_0, k_1, k_2;
2431
+ if (s < 0.8) {
2432
+ t = 1.25 * s;
2433
+ k_0 = 0;
2434
+ k_1 = 0.8 * C_0;
2435
+ k_2 = 1 - k_1 / C_mid;
2436
+ } else {
2437
+ t = 5 * (s - 0.8);
2438
+ k_0 = C_mid;
2439
+ k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;
2440
+ k_2 = 1 - k_1 / (C_max - C_mid);
2441
+ }
2442
+ let C = k_0 + t * k_1 / (1 - k_2 * t);
2443
+ ret.a = C * a_;
2444
+ ret.b = C * b_;
2445
+ return ret;
2446
+ }
2447
+ const modeOkhsl = {
2448
+ ...definition$l,
2449
+ mode: "okhsl",
2450
+ channels: ["h", "s", "l", "alpha"],
2451
+ parse: ["--okhsl"],
2452
+ serialize: "--okhsl",
2453
+ fromMode: {
2454
+ oklab: convertOklabToOkhsl,
2455
+ rgb: (c2) => convertOklabToOkhsl(convertRgbToOklab(c2))
2456
+ },
2457
+ toMode: {
2458
+ oklab: convertOkhslToOklab,
2459
+ rgb: (c2) => convertOklabToRgb(convertOkhslToOklab(c2))
2460
+ }
2461
+ };
2462
+ function convertOklabToOkhsv(lab) {
2463
+ let l = lab.l !== void 0 ? lab.l : 0;
2464
+ let a = lab.a !== void 0 ? lab.a : 0;
2465
+ let b = lab.b !== void 0 ? lab.b : 0;
2466
+ let c2 = Math.sqrt(a * a + b * b);
2467
+ let a_ = c2 ? a / c2 : 1;
2468
+ let b_ = c2 ? b / c2 : 1;
2469
+ let [S_max, T] = get_ST_max(a_, b_);
2470
+ let S_0 = 0.5;
2471
+ let k2 = 1 - S_0 / S_max;
2472
+ let t = T / (c2 + l * T);
2473
+ let L_v = t * l;
2474
+ let C_v = t * c2;
2475
+ let L_vt = toe_inv(L_v);
2476
+ let C_vt = C_v * L_vt / L_v;
2477
+ let rgb_scale = convertOklabToLrgb({ l: L_vt, a: a_ * C_vt, b: b_ * C_vt });
2478
+ let scale_L = Math.cbrt(
2479
+ 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)
2480
+ );
2481
+ l = l / scale_L;
2482
+ c2 = c2 / scale_L * toe(l) / l;
2483
+ l = toe(l);
2484
+ const ret = {
2485
+ mode: "okhsv",
2486
+ s: c2 ? (S_0 + T) * C_v / (T * S_0 + T * k2 * C_v) : 0,
2487
+ v: l ? l / L_v : 0
2488
+ };
2489
+ if (ret.s) {
2490
+ ret.h = normalizeHue(Math.atan2(b, a) * 180 / Math.PI);
2491
+ }
2492
+ if (lab.alpha !== void 0) {
2493
+ ret.alpha = lab.alpha;
2494
+ }
2495
+ return ret;
2496
+ }
2497
+ function convertOkhsvToOklab(hsv) {
2498
+ const ret = { mode: "oklab" };
2499
+ if (hsv.alpha !== void 0) {
2500
+ ret.alpha = hsv.alpha;
2501
+ }
2502
+ const h = hsv.h !== void 0 ? hsv.h : 0;
2503
+ const s = hsv.s !== void 0 ? hsv.s : 0;
2504
+ const v = hsv.v !== void 0 ? hsv.v : 0;
2505
+ const a_ = Math.cos(h / 180 * Math.PI);
2506
+ const b_ = Math.sin(h / 180 * Math.PI);
2507
+ const [S_max, T] = get_ST_max(a_, b_);
2508
+ const S_0 = 0.5;
2509
+ const k2 = 1 - S_0 / S_max;
2510
+ const L_v = 1 - s * S_0 / (S_0 + T - T * k2 * s);
2511
+ const C_v = s * T * S_0 / (S_0 + T - T * k2 * s);
2512
+ const L_vt = toe_inv(L_v);
2513
+ const C_vt = C_v * L_vt / L_v;
2514
+ const rgb_scale = convertOklabToLrgb({
2515
+ l: L_vt,
2516
+ a: a_ * C_vt,
2517
+ b: b_ * C_vt
2518
+ });
2519
+ const scale_L = Math.cbrt(
2520
+ 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)
2521
+ );
2522
+ const L_new = toe_inv(v * L_v);
2523
+ const C = C_v * L_new / L_v;
2524
+ ret.l = L_new * scale_L;
2525
+ ret.a = C * a_ * scale_L;
2526
+ ret.b = C * b_ * scale_L;
2527
+ return ret;
2528
+ }
2529
+ const modeOkhsv = {
2530
+ ...definition$k,
2531
+ mode: "okhsv",
2532
+ channels: ["h", "s", "v", "alpha"],
2533
+ parse: ["--okhsv"],
2534
+ serialize: "--okhsv",
2535
+ fromMode: {
2536
+ oklab: convertOklabToOkhsv,
2537
+ rgb: (c2) => convertOklabToOkhsv(convertRgbToOklab(c2))
2538
+ },
2539
+ toMode: {
2540
+ oklab: convertOkhsvToOklab,
2541
+ rgb: (c2) => convertOklabToRgb(convertOkhsvToOklab(c2))
2542
+ }
2543
+ };
2544
+ function parseOklab(color, parsed) {
2545
+ if (!parsed || parsed[0] !== "oklab") {
2546
+ return void 0;
2547
+ }
2548
+ const res = { mode: "oklab" };
2549
+ const [, l, a, b, alpha] = parsed;
2550
+ if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {
2551
+ return void 0;
2552
+ }
2553
+ if (l.type !== Tok.None) {
2554
+ res.l = Math.min(
2555
+ Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),
2556
+ 1
2557
+ );
2558
+ }
2559
+ if (a.type !== Tok.None) {
2560
+ res.a = a.type === Tok.Number ? a.value : a.value * 0.4 / 100;
2561
+ }
2562
+ if (b.type !== Tok.None) {
2563
+ res.b = b.type === Tok.Number ? b.value : b.value * 0.4 / 100;
2564
+ }
2565
+ if (alpha.type !== Tok.None) {
2566
+ res.alpha = Math.min(
2567
+ 1,
2568
+ Math.max(
2569
+ 0,
2570
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
2571
+ )
2572
+ );
2573
+ }
2574
+ return res;
2575
+ }
2576
+ const definition$8 = {
2577
+ ...definition$f,
2578
+ mode: "oklab",
2579
+ toMode: {
2580
+ lrgb: convertOklabToLrgb,
2581
+ rgb: convertOklabToRgb
2582
+ },
2583
+ fromMode: {
2584
+ lrgb: convertLrgbToOklab,
2585
+ rgb: convertRgbToOklab
2586
+ },
2587
+ ranges: {
2588
+ l: [0, 1],
2589
+ a: [-0.4, 0.4],
2590
+ b: [-0.4, 0.4]
2591
+ },
2592
+ parse: [parseOklab],
2593
+ serialize: (c2) => `oklab(${c2.l !== void 0 ? c2.l : "none"} ${c2.a !== void 0 ? c2.a : "none"} ${c2.b !== void 0 ? c2.b : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`
2594
+ };
2595
+ function parseOklch(color, parsed) {
2596
+ if (!parsed || parsed[0] !== "oklch") {
2597
+ return void 0;
2598
+ }
2599
+ const res = { mode: "oklch" };
2600
+ const [, l, c2, h, alpha] = parsed;
2601
+ if (l.type !== Tok.None) {
2602
+ if (l.type === Tok.Hue) {
2603
+ return void 0;
2604
+ }
2605
+ res.l = Math.min(
2606
+ Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),
2607
+ 1
2608
+ );
2609
+ }
2610
+ if (c2.type !== Tok.None) {
2611
+ res.c = Math.max(
2612
+ 0,
2613
+ c2.type === Tok.Number ? c2.value : c2.value * 0.4 / 100
2614
+ );
2615
+ }
2616
+ if (h.type !== Tok.None) {
2617
+ if (h.type === Tok.Percentage) {
2618
+ return void 0;
2619
+ }
2620
+ res.h = h.value;
2621
+ }
2622
+ if (alpha.type !== Tok.None) {
2623
+ res.alpha = Math.min(
2624
+ 1,
2625
+ Math.max(
2626
+ 0,
2627
+ alpha.type === Tok.Number ? alpha.value : alpha.value / 100
2628
+ )
2629
+ );
2630
+ }
2631
+ return res;
2632
+ }
2633
+ const definition$7 = {
2634
+ ...definition$d,
2635
+ mode: "oklch",
2636
+ toMode: {
2637
+ oklab: (c2) => convertLchToLab(c2, "oklab"),
2638
+ rgb: (c2) => convertOklabToRgb(convertLchToLab(c2, "oklab"))
2639
+ },
2640
+ fromMode: {
2641
+ rgb: (c2) => convertLabToLch(convertRgbToOklab(c2), "oklch"),
2642
+ oklab: (c2) => convertLabToLch(c2, "oklch")
2643
+ },
2644
+ parse: [parseOklch],
2645
+ serialize: (c2) => `oklch(${c2.l !== void 0 ? c2.l : "none"} ${c2.c !== void 0 ? c2.c : "none"} ${c2.h !== void 0 ? c2.h : "none"}${c2.alpha < 1 ? ` / ${c2.alpha}` : ""})`,
2646
+ ranges: {
2647
+ l: [0, 1],
2648
+ c: [0, 0.4],
2649
+ h: [0, 360]
2650
+ }
2651
+ };
2652
+ const convertP3ToXyz65 = (rgb2) => {
2653
+ let { r, g, b, alpha } = convertRgbToLrgb(rgb2);
2654
+ let res = {
2655
+ mode: "xyz65",
2656
+ x: 0.486570948648216 * r + 0.265667693169093 * g + 0.1982172852343625 * b,
2657
+ y: 0.2289745640697487 * r + 0.6917385218365062 * g + 0.079286914093745 * b,
2658
+ z: 0 * r + 0.0451133818589026 * g + 1.043944368900976 * b
2659
+ };
2660
+ if (alpha !== void 0) {
2661
+ res.alpha = alpha;
2662
+ }
2663
+ return res;
2664
+ };
2665
+ const convertXyz65ToP3 = ({ x, y, z, alpha }) => {
2666
+ if (x === void 0) x = 0;
2667
+ if (y === void 0) y = 0;
2668
+ if (z === void 0) z = 0;
2669
+ let res = convertLrgbToRgb(
2670
+ {
2671
+ r: x * 2.4934969119414263 - y * 0.9313836179191242 - 0.402710784450717 * z,
2672
+ g: x * -0.8294889695615749 + y * 1.7626640603183465 + 0.0236246858419436 * z,
2673
+ b: x * 0.0358458302437845 - y * 0.0761723892680418 + 0.9568845240076871 * z
2674
+ },
2675
+ "p3"
2676
+ );
2677
+ if (alpha !== void 0) {
2678
+ res.alpha = alpha;
2679
+ }
2680
+ return res;
2681
+ };
2682
+ const definition$6 = {
2683
+ ...definition$r,
2684
+ mode: "p3",
2685
+ parse: ["display-p3"],
2686
+ serialize: "display-p3",
2687
+ fromMode: {
2688
+ rgb: (color) => convertXyz65ToP3(convertRgbToXyz65(color)),
2689
+ xyz65: convertXyz65ToP3
2690
+ },
2691
+ toMode: {
2692
+ rgb: (color) => convertXyz65ToRgb(convertP3ToXyz65(color)),
2693
+ xyz65: convertP3ToXyz65
2694
+ }
2695
+ };
2696
+ const gamma$1 = (v) => {
2697
+ let abs2 = Math.abs(v);
2698
+ if (abs2 >= 1 / 512) {
2699
+ return Math.sign(v) * Math.pow(abs2, 1 / 1.8);
2700
+ }
2701
+ return 16 * v;
2702
+ };
2703
+ const convertXyz50ToProphoto = ({ x, y, z, alpha }) => {
2704
+ if (x === void 0) x = 0;
2705
+ if (y === void 0) y = 0;
2706
+ if (z === void 0) z = 0;
2707
+ let res = {
2708
+ mode: "prophoto",
2709
+ r: gamma$1(
2710
+ x * 1.3457868816471585 - y * 0.2555720873797946 - 0.0511018649755453 * z
2711
+ ),
2712
+ g: gamma$1(
2713
+ x * -0.5446307051249019 + y * 1.5082477428451466 + 0.0205274474364214 * z
2714
+ ),
2715
+ b: gamma$1(x * 0 + y * 0 + 1.2119675456389452 * z)
2716
+ };
2717
+ if (alpha !== void 0) {
2718
+ res.alpha = alpha;
2719
+ }
2720
+ return res;
2721
+ };
2722
+ const linearize$1 = (v = 0) => {
2723
+ let abs2 = Math.abs(v);
2724
+ if (abs2 >= 16 / 512) {
2725
+ return Math.sign(v) * Math.pow(abs2, 1.8);
2726
+ }
2727
+ return v / 16;
2728
+ };
2729
+ const convertProphotoToXyz50 = (prophoto) => {
2730
+ let r = linearize$1(prophoto.r);
2731
+ let g = linearize$1(prophoto.g);
2732
+ let b = linearize$1(prophoto.b);
2733
+ let res = {
2734
+ mode: "xyz50",
2735
+ x: 0.7977666449006423 * r + 0.1351812974005331 * g + 0.0313477341283922 * b,
2736
+ y: 0.2880748288194013 * r + 0.7118352342418731 * g + 899369387256e-16 * b,
2737
+ z: 0 * r + 0 * g + 0.8251046025104602 * b
2738
+ };
2739
+ if (prophoto.alpha !== void 0) {
2740
+ res.alpha = prophoto.alpha;
2741
+ }
2742
+ return res;
2743
+ };
2744
+ const definition$5 = {
2745
+ ...definition$r,
2746
+ mode: "prophoto",
2747
+ parse: ["prophoto-rgb"],
2748
+ serialize: "prophoto-rgb",
2749
+ fromMode: {
2750
+ xyz50: convertXyz50ToProphoto,
2751
+ rgb: (color) => convertXyz50ToProphoto(convertRgbToXyz50(color))
2752
+ },
2753
+ toMode: {
2754
+ xyz50: convertProphotoToXyz50,
2755
+ rgb: (color) => convertXyz50ToRgb(convertProphotoToXyz50(color))
2756
+ }
2757
+ };
2758
+ const α$1 = 1.09929682680944;
2759
+ const β$1 = 0.018053968510807;
2760
+ const gamma = (v) => {
2761
+ const abs2 = Math.abs(v);
2762
+ if (abs2 > β$1) {
2763
+ return (Math.sign(v) || 1) * (α$1 * Math.pow(abs2, 0.45) - (α$1 - 1));
2764
+ }
2765
+ return 4.5 * v;
2766
+ };
2767
+ const convertXyz65ToRec2020 = ({ x, y, z, alpha }) => {
2768
+ if (x === void 0) x = 0;
2769
+ if (y === void 0) y = 0;
2770
+ if (z === void 0) z = 0;
2771
+ let res = {
2772
+ mode: "rec2020",
2773
+ r: gamma(
2774
+ x * 1.7166511879712683 - y * 0.3556707837763925 - 0.2533662813736599 * z
2775
+ ),
2776
+ g: gamma(
2777
+ x * -0.6666843518324893 + y * 1.6164812366349395 + 0.0157685458139111 * z
2778
+ ),
2779
+ b: gamma(
2780
+ x * 0.0176398574453108 - y * 0.0427706132578085 + 0.9421031212354739 * z
2781
+ )
2782
+ };
2783
+ if (alpha !== void 0) {
2784
+ res.alpha = alpha;
2785
+ }
2786
+ return res;
2787
+ };
2788
+ const α = 1.09929682680944;
2789
+ const β = 0.018053968510807;
2790
+ const linearize = (v = 0) => {
2791
+ let abs2 = Math.abs(v);
2792
+ if (abs2 < β * 4.5) {
2793
+ return v / 4.5;
2794
+ }
2795
+ return (Math.sign(v) || 1) * Math.pow((abs2 + α - 1) / α, 1 / 0.45);
2796
+ };
2797
+ const convertRec2020ToXyz65 = (rec2020) => {
2798
+ let r = linearize(rec2020.r);
2799
+ let g = linearize(rec2020.g);
2800
+ let b = linearize(rec2020.b);
2801
+ let res = {
2802
+ mode: "xyz65",
2803
+ x: 0.6369580483012911 * r + 0.1446169035862083 * g + 0.1688809751641721 * b,
2804
+ y: 0.262700212011267 * r + 0.6779980715188708 * g + 0.059301716469862 * b,
2805
+ z: 0 * r + 0.0280726930490874 * g + 1.0609850577107909 * b
2806
+ };
2807
+ if (rec2020.alpha !== void 0) {
2808
+ res.alpha = rec2020.alpha;
2809
+ }
2810
+ return res;
2811
+ };
2812
+ const definition$4 = {
2813
+ ...definition$r,
2814
+ mode: "rec2020",
2815
+ fromMode: {
2816
+ xyz65: convertXyz65ToRec2020,
2817
+ rgb: (color) => convertXyz65ToRec2020(convertRgbToXyz65(color))
2818
+ },
2819
+ toMode: {
2820
+ xyz65: convertRec2020ToXyz65,
2821
+ rgb: (color) => convertXyz65ToRgb(convertRec2020ToXyz65(color))
2822
+ },
2823
+ parse: ["rec2020"],
2824
+ serialize: "rec2020"
2825
+ };
2826
+ const bias = 0.0037930732552754493;
2827
+ const bias_cbrt = Math.cbrt(bias);
2828
+ const transfer$1 = (v) => Math.cbrt(v) - bias_cbrt;
2829
+ const convertRgbToXyb = (color) => {
2830
+ const { r, g, b, alpha } = convertRgbToLrgb(color);
2831
+ const l = transfer$1(0.3 * r + 0.622 * g + 0.078 * b + bias);
2832
+ const m = transfer$1(0.23 * r + 0.692 * g + 0.078 * b + bias);
2833
+ const s = transfer$1(
2834
+ 0.2434226892454782 * r + 0.2047674442449682 * g + 0.5518098665095535 * b + bias
2835
+ );
2836
+ const res = {
2837
+ mode: "xyb",
2838
+ x: (l - m) / 2,
2839
+ y: (l + m) / 2,
2840
+ /* Apply default chroma from luma (subtract Y from B) */
2841
+ b: s - (l + m) / 2
2842
+ };
2843
+ if (alpha !== void 0) res.alpha = alpha;
2844
+ return res;
2845
+ };
2846
+ const transfer = (v) => Math.pow(v + bias_cbrt, 3);
2847
+ const convertXybToRgb = ({ x, y, b, alpha }) => {
2848
+ if (x === void 0) x = 0;
2849
+ if (y === void 0) y = 0;
2850
+ if (b === void 0) b = 0;
2851
+ const l = transfer(x + y) - bias;
2852
+ const m = transfer(y - x) - bias;
2853
+ const s = transfer(b + y) - bias;
2854
+ const res = convertLrgbToRgb({
2855
+ r: 11.031566904639861 * l - 9.866943908131562 * m - 0.16462299650829934 * s,
2856
+ g: -3.2541473810744237 * l + 4.418770377582723 * m - 0.16462299650829934 * s,
2857
+ b: -3.6588512867136815 * l + 2.7129230459360922 * m + 1.9459282407775895 * s
2858
+ });
2859
+ if (alpha !== void 0) res.alpha = alpha;
2860
+ return res;
2861
+ };
2862
+ const definition$3 = {
2863
+ mode: "xyb",
2864
+ channels: ["x", "y", "b", "alpha"],
2865
+ parse: ["--xyb"],
2866
+ serialize: "--xyb",
2867
+ toMode: {
2868
+ rgb: convertXybToRgb
2869
+ },
2870
+ fromMode: {
2871
+ rgb: convertRgbToXyb
2872
+ },
2873
+ ranges: {
2874
+ x: [-0.0154, 0.0281],
2875
+ y: [0, 0.8453],
2876
+ b: [-0.2778, 0.388]
2877
+ },
2878
+ interpolate: {
2879
+ x: interpolatorLinear,
2880
+ y: interpolatorLinear,
2881
+ b: interpolatorLinear,
2882
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
2883
+ }
2884
+ };
2885
+ const definition$2 = {
2886
+ mode: "xyz50",
2887
+ parse: ["xyz-d50"],
2888
+ serialize: "xyz-d50",
2889
+ toMode: {
2890
+ rgb: convertXyz50ToRgb,
2891
+ lab: convertXyz50ToLab
2892
+ },
2893
+ fromMode: {
2894
+ rgb: convertRgbToXyz50,
2895
+ lab: convertLabToXyz50
2896
+ },
2897
+ channels: ["x", "y", "z", "alpha"],
2898
+ ranges: {
2899
+ x: [0, 0.964],
2900
+ y: [0, 0.999],
2901
+ z: [0, 0.825]
2902
+ },
2903
+ interpolate: {
2904
+ x: interpolatorLinear,
2905
+ y: interpolatorLinear,
2906
+ z: interpolatorLinear,
2907
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
2908
+ }
2909
+ };
2910
+ const convertXyz65ToXyz50 = (xyz65) => {
2911
+ let { x, y, z, alpha } = xyz65;
2912
+ if (x === void 0) x = 0;
2913
+ if (y === void 0) y = 0;
2914
+ if (z === void 0) z = 0;
2915
+ let res = {
2916
+ mode: "xyz50",
2917
+ x: 1.0479298208405488 * x + 0.0229467933410191 * y - 0.0501922295431356 * z,
2918
+ y: 0.0296278156881593 * x + 0.990434484573249 * y - 0.0170738250293851 * z,
2919
+ z: -0.0092430581525912 * x + 0.0150551448965779 * y + 0.7518742899580008 * z
2920
+ };
2921
+ if (alpha !== void 0) {
2922
+ res.alpha = alpha;
2923
+ }
2924
+ return res;
2925
+ };
2926
+ const convertXyz50ToXyz65 = (xyz50) => {
2927
+ let { x, y, z, alpha } = xyz50;
2928
+ if (x === void 0) x = 0;
2929
+ if (y === void 0) y = 0;
2930
+ if (z === void 0) z = 0;
2931
+ let res = {
2932
+ mode: "xyz65",
2933
+ x: 0.9554734527042182 * x - 0.0230985368742614 * y + 0.0632593086610217 * z,
2934
+ y: -0.0283697069632081 * x + 1.0099954580058226 * y + 0.021041398966943 * z,
2935
+ z: 0.0123140016883199 * x - 0.0205076964334779 * y + 1.3303659366080753 * z
2936
+ };
2937
+ if (alpha !== void 0) {
2938
+ res.alpha = alpha;
2939
+ }
2940
+ return res;
2941
+ };
2942
+ const definition$1 = {
2943
+ mode: "xyz65",
2944
+ toMode: {
2945
+ rgb: convertXyz65ToRgb,
2946
+ xyz50: convertXyz65ToXyz50
2947
+ },
2948
+ fromMode: {
2949
+ rgb: convertRgbToXyz65,
2950
+ xyz50: convertXyz50ToXyz65
2951
+ },
2952
+ ranges: {
2953
+ x: [0, 0.95],
2954
+ y: [0, 1],
2955
+ z: [0, 1.088]
2956
+ },
2957
+ channels: ["x", "y", "z", "alpha"],
2958
+ parse: ["xyz", "xyz-d65"],
2959
+ serialize: "xyz-d65",
2960
+ interpolate: {
2961
+ x: interpolatorLinear,
2962
+ y: interpolatorLinear,
2963
+ z: interpolatorLinear,
2964
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
2965
+ }
2966
+ };
2967
+ const convertRgbToYiq = ({ r, g, b, alpha }) => {
2968
+ if (r === void 0) r = 0;
2969
+ if (g === void 0) g = 0;
2970
+ if (b === void 0) b = 0;
2971
+ const res = {
2972
+ mode: "yiq",
2973
+ y: 0.29889531 * r + 0.58662247 * g + 0.11448223 * b,
2974
+ i: 0.59597799 * r - 0.2741761 * g - 0.32180189 * b,
2975
+ q: 0.21147017 * r - 0.52261711 * g + 0.31114694 * b
2976
+ };
2977
+ if (alpha !== void 0) res.alpha = alpha;
2978
+ return res;
2979
+ };
2980
+ const convertYiqToRgb = ({ y, i, q, alpha }) => {
2981
+ if (y === void 0) y = 0;
2982
+ if (i === void 0) i = 0;
2983
+ if (q === void 0) q = 0;
2984
+ const res = {
2985
+ mode: "rgb",
2986
+ r: y + 0.95608445 * i + 0.6208885 * q,
2987
+ g: y - 0.27137664 * i - 0.6486059 * q,
2988
+ b: y - 1.10561724 * i + 1.70250126 * q
2989
+ };
2990
+ if (alpha !== void 0) res.alpha = alpha;
2991
+ return res;
2992
+ };
2993
+ const definition = {
2994
+ mode: "yiq",
2995
+ toMode: {
2996
+ rgb: convertYiqToRgb
2997
+ },
2998
+ fromMode: {
2999
+ rgb: convertRgbToYiq
3000
+ },
3001
+ channels: ["y", "i", "q", "alpha"],
3002
+ parse: ["--yiq"],
3003
+ serialize: "--yiq",
3004
+ ranges: {
3005
+ i: [-0.595, 0.595],
3006
+ q: [-0.522, 0.522]
3007
+ },
3008
+ interpolate: {
3009
+ y: interpolatorLinear,
3010
+ i: interpolatorLinear,
3011
+ q: interpolatorLinear,
3012
+ alpha: { use: interpolatorLinear, fixup: fixupAlpha }
3013
+ }
3014
+ };
3015
+ const clamp = (value) => Math.max(0, Math.min(1, value || 0));
3016
+ const fixup = (value) => Math.round(clamp(value) * 255);
3017
+ const rgb = converter("rgb");
3018
+ const serializeHex = (color) => {
3019
+ if (color === void 0) {
3020
+ return void 0;
3021
+ }
3022
+ let r = fixup(color.r);
3023
+ let g = fixup(color.g);
3024
+ let b = fixup(color.b);
3025
+ return "#" + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);
3026
+ };
3027
+ const serializeHex8 = (color) => {
3028
+ if (color === void 0) {
3029
+ return void 0;
3030
+ }
3031
+ let a = fixup(color.alpha !== void 0 ? color.alpha : 1);
3032
+ return serializeHex(color) + (1 << 8 | a).toString(16).slice(1);
3033
+ };
3034
+ const formatHex = (c2) => serializeHex(rgb(c2));
3035
+ const formatHex8 = (c2) => serializeHex8(rgb(c2));
3036
+ useMode(definition$q);
3037
+ useMode(definition$p);
3038
+ useMode(definition$o);
3039
+ useMode(definition$n);
3040
+ useMode(definition$m);
3041
+ useMode(definition$l);
3042
+ useMode(definition$k);
3043
+ useMode(definition$j);
3044
+ useMode(definition$i);
3045
+ useMode(definition$h);
3046
+ useMode(definition$g);
3047
+ useMode(definition$f);
3048
+ useMode(definition$e);
3049
+ useMode(definition$d);
3050
+ useMode(definition$c);
3051
+ useMode(definition$b);
3052
+ useMode(definition$a);
3053
+ useMode(definition$9);
3054
+ useMode(modeOkhsl);
3055
+ useMode(modeOkhsv);
3056
+ useMode(definition$8);
3057
+ useMode(definition$7);
3058
+ useMode(definition$6);
3059
+ useMode(definition$5);
3060
+ useMode(definition$4);
3061
+ useMode(definition$r);
3062
+ useMode(definition$3);
3063
+ useMode(definition$2);
3064
+ useMode(definition$1);
3065
+ useMode(definition);
3066
+ function styleframeToFigmaName(name) {
3067
+ return name.replace(/\./g, "/");
3068
+ }
3069
+ function figmaToStyleframeName(name) {
3070
+ return name.replace(/\//g, ".");
3071
+ }
3072
+ function extractCategory(name) {
3073
+ const separator = name.includes("/") ? "/" : ".";
3074
+ return name.split(separator)[0] ?? "";
3075
+ }
3076
+ function toVariableIdentifier(name) {
3077
+ return (name.includes("/") ? figmaToStyleframeName(name) : name).split(".").map((part, index) => index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)).join("");
3078
+ }
3079
+ function cssColorToFigma(value) {
3080
+ const parsed = parse(value);
3081
+ if (!parsed) return null;
3082
+ const rgb2 = parsed;
3083
+ return {
3084
+ r: rgb2.r ?? 0,
3085
+ g: rgb2.g ?? 0,
3086
+ b: rgb2.b ?? 0,
3087
+ a: rgb2.alpha ?? 1
3088
+ };
3089
+ }
3090
+ function figmaColorToCss(rgba) {
3091
+ const color = {
3092
+ mode: "rgb",
3093
+ r: rgba.r,
3094
+ g: rgba.g,
3095
+ b: rgba.b,
3096
+ alpha: rgba.a ?? 1
3097
+ };
3098
+ if (rgba.a !== void 0 && rgba.a < 1) return formatHex8(color) ?? "#000000";
3099
+ return formatHex(color) ?? "#000000";
3100
+ }
3101
+ function parseDimension(value) {
3102
+ const match = value.match(/^(-?\d*\.?\d+)(px|rem|em|%|vh|vw|vmin|vmax|ch)?$/);
3103
+ if (!match) return null;
3104
+ return {
3105
+ value: Number.parseFloat(match[1] ?? "0"),
3106
+ unit: match[2] ?? ""
3107
+ };
3108
+ }
3109
+ function dimensionToPixels(value, baseFontSize = 16) {
3110
+ const parsed = parseDimension(value);
3111
+ if (!parsed) return null;
3112
+ switch (parsed.unit) {
3113
+ case "px":
3114
+ case "":
3115
+ return parsed.value;
3116
+ case "rem":
3117
+ case "em":
3118
+ return parsed.value * baseFontSize;
3119
+ case "%":
3120
+ return parsed.value;
3121
+ default:
3122
+ return null;
3123
+ }
3124
+ }
3125
+ function isColorValue(value) {
3126
+ if (value.startsWith("#")) return true;
3127
+ if (value.startsWith("rgb")) return true;
3128
+ if (value.startsWith("hsl")) return true;
3129
+ if (value.startsWith("oklch")) return true;
3130
+ if (value.startsWith("oklab")) return true;
3131
+ if (value.startsWith("lch")) return true;
3132
+ if (value.startsWith("lab")) return true;
3133
+ return parse(value) !== void 0;
3134
+ }
3135
+ function isDimensionValue(value) {
3136
+ return parseDimension(value) !== null;
3137
+ }
3138
+ function detectFigmaType(value) {
3139
+ if (typeof value === "boolean") return "BOOLEAN";
3140
+ if (typeof value === "number") return "FLOAT";
3141
+ if (typeof value === "string") {
3142
+ if (isColorValue(value)) return "COLOR";
3143
+ if (isDimensionValue(value)) return "FLOAT";
3144
+ return "STRING";
3145
+ }
3146
+ return "STRING";
3147
+ }
3148
+ function styleframeValueToFigma(value, type, baseFontSize = 16) {
3149
+ if (typeof value === "boolean") return value;
3150
+ if (typeof value === "number") return value;
3151
+ if (typeof value !== "string") return null;
3152
+ switch (type) {
3153
+ case "COLOR":
3154
+ return cssColorToFigma(value);
3155
+ case "FLOAT":
3156
+ return dimensionToPixels(value, baseFontSize);
3157
+ case "BOOLEAN":
3158
+ return value === "true";
3159
+ case "STRING":
3160
+ default:
3161
+ return value;
3162
+ }
3163
+ }
3164
+ function figmaValueToStyleframe(value, type, useRem = false, baseFontSize = 16) {
3165
+ switch (type) {
3166
+ case "COLOR":
3167
+ if (typeof value === "object" && "r" in value) return figmaColorToCss(value);
3168
+ return String(value);
3169
+ case "FLOAT":
3170
+ if (typeof value === "number") {
3171
+ if (useRem) return `${value / baseFontSize}rem`;
3172
+ return `${value}px`;
3173
+ }
3174
+ return typeof value === "string" ? value : String(value);
3175
+ case "BOOLEAN":
3176
+ return Boolean(value);
3177
+ case "STRING":
3178
+ default:
3179
+ return String(value);
3180
+ }
3181
+ }
3182
+ const COMPOSABLE_MAP = {
3183
+ color: "useColor",
3184
+ spacing: "useSpacing",
3185
+ fontSize: "useFontSize",
3186
+ fontWeight: "useFontWeight",
3187
+ fontFamily: "useFontFamily",
3188
+ lineHeight: "useLineHeight",
3189
+ letterSpacing: "useLetterSpacing",
3190
+ borderWidth: "useBorderWidth",
3191
+ borderRadius: "useBorderRadius",
3192
+ boxShadow: "useBoxShadow"
3193
+ };
3194
+ function isVariableAlias(value) {
3195
+ return typeof value === "object" && value !== null && "type" in value && value.type === "VARIABLE_ALIAS";
3196
+ }
3197
+ function isFigmaColor(value) {
3198
+ return typeof value === "object" && value !== null && "r" in value && "g" in value && "b" in value;
3199
+ }
3200
+ function parseVariables(data, options) {
3201
+ const { useRem = false, baseFontSize = 16, defaultModeName } = options;
3202
+ const defaultMode = defaultModeName || data.modes[0] || "Default";
3203
+ const themeNames = data.modes.filter((m) => m !== defaultMode);
3204
+ const nameMap = /* @__PURE__ */ new Map();
3205
+ for (const v of data.variables) nameMap.set(v.name, figmaToStyleframeName(v.name));
3206
+ const variables = [];
3207
+ const themeVariablesMap = /* @__PURE__ */ new Map();
3208
+ for (const themeName of themeNames) themeVariablesMap.set(themeName, []);
3209
+ for (const variable of data.variables) {
3210
+ const styleframeName = figmaToStyleframeName(variable.name);
3211
+ const category = extractCategory(styleframeName);
3212
+ const defaultValue = variable.values[defaultMode];
3213
+ if (defaultValue === void 0) continue;
3214
+ let type = "string";
3215
+ if (variable.type === "COLOR") type = "color";
3216
+ else if (variable.type === "FLOAT") type = "number";
3217
+ else if (variable.type === "BOOLEAN") type = "boolean";
3218
+ const isReference = isVariableAlias(defaultValue);
3219
+ let referenceTo;
3220
+ let value;
3221
+ if (isReference) {
3222
+ referenceTo = variable.aliasTo ? figmaToStyleframeName(variable.aliasTo) : void 0;
3223
+ value = "";
3224
+ } else if (isFigmaColor(defaultValue)) value = figmaValueToStyleframe(defaultValue, "COLOR", useRem, baseFontSize);
3225
+ else if (typeof defaultValue === "number") value = figmaValueToStyleframe(defaultValue, "FLOAT", useRem, baseFontSize);
3226
+ else if (typeof defaultValue === "boolean") value = defaultValue;
3227
+ else value = String(defaultValue);
3228
+ variables.push({
3229
+ name: styleframeName,
3230
+ value,
3231
+ type,
3232
+ category,
3233
+ isReference,
3234
+ referenceTo
3235
+ });
3236
+ for (const themeName of themeNames) {
3237
+ const themeValue = variable.values[themeName];
3238
+ if (themeValue === void 0) continue;
3239
+ const isThemeReference = isVariableAlias(themeValue);
3240
+ let themeStyleframeValue;
3241
+ if (isThemeReference) continue;
3242
+ else if (isFigmaColor(themeValue)) themeStyleframeValue = figmaValueToStyleframe(themeValue, "COLOR", useRem, baseFontSize);
3243
+ else if (typeof themeValue === "number") themeStyleframeValue = figmaValueToStyleframe(themeValue, "FLOAT", useRem, baseFontSize);
3244
+ else if (typeof themeValue === "boolean") themeStyleframeValue = themeValue;
3245
+ else themeStyleframeValue = String(themeValue);
3246
+ if (themeStyleframeValue !== value) {
3247
+ const themeVariables = themeVariablesMap.get(themeName) || [];
3248
+ themeVariables.push({
3249
+ name: styleframeName,
3250
+ value: themeStyleframeValue,
3251
+ type,
3252
+ category,
3253
+ isReference: false
3254
+ });
3255
+ themeVariablesMap.set(themeName, themeVariables);
3256
+ }
3257
+ }
3258
+ }
3259
+ const themes = [];
3260
+ for (const [name, vars] of themeVariablesMap) if (vars.length > 0) themes.push({
3261
+ name: name.toLowerCase(),
3262
+ variables: vars
3263
+ });
3264
+ return {
3265
+ variables,
3266
+ themes
3267
+ };
3268
+ }
3269
+ function groupByCategory(variables) {
3270
+ const groups = /* @__PURE__ */ new Map();
3271
+ for (const v of variables) {
3272
+ const existing = groups.get(v.category) || [];
3273
+ existing.push(v);
3274
+ groups.set(v.category, existing);
3275
+ }
3276
+ return groups;
3277
+ }
3278
+ function generateComposableCode(category, variables, instanceName) {
3279
+ const composableName = COMPOSABLE_MAP[category];
3280
+ if (!composableName) return null;
3281
+ const nonRefVars = variables.filter((v) => !v.isReference);
3282
+ if (nonRefVars.length === 0) return null;
3283
+ const identifiers = [];
3284
+ const valueEntries = [];
3285
+ for (const v of nonRefVars) {
3286
+ const key = v.name.split(".").slice(1).join(".") || v.name;
3287
+ const identifier = toVariableIdentifier(v.name);
3288
+ identifiers.push(identifier);
3289
+ const valueStr = typeof v.value === "string" ? `"${v.value}"` : String(v.value);
3290
+ valueEntries.push(` ${key}: ${valueStr},`);
3291
+ }
3292
+ return {
3293
+ code: `const { ${identifiers.join(", ")} } = ${composableName}(${instanceName}, {
3294
+ ${valueEntries.join("\n")}
3295
+ });`,
3296
+ identifiers,
3297
+ composable: composableName
3298
+ };
3299
+ }
3300
+ function generateVariableCode(variable) {
3301
+ const identifier = toVariableIdentifier(variable.name);
3302
+ if (variable.isReference) {
3303
+ if (variable.referenceTo) {
3304
+ const refTarget = toVariableIdentifier(variable.referenceTo);
3305
+ return `const ${identifier} = variable("${variable.name}", ref(${refTarget}));`;
3306
+ }
3307
+ return null;
3308
+ }
3309
+ const valueStr = typeof variable.value === "string" ? `"${variable.value}"` : String(variable.value);
3310
+ return `const ${identifier} = variable("${variable.name}", ${valueStr});`;
3311
+ }
3312
+ function generateThemeCode(theme, instanceName) {
3313
+ const lines = [];
3314
+ lines.push(`theme("${theme.name}", (ctx) => {`);
3315
+ for (const v of theme.variables) {
3316
+ const identifier = toVariableIdentifier(v.name);
3317
+ const valueStr = typeof v.value === "string" ? `"${v.value}"` : String(v.value);
3318
+ lines.push(` ctx.variable(${identifier}, ${valueStr});`);
3319
+ }
3320
+ lines.push("});");
3321
+ return lines.join("\n");
3322
+ }
3323
+ function generateStyleframeCode(data, options = {}) {
3324
+ const { useComposables = true, instanceName = "s" } = options;
3325
+ const { variables, themes } = parseVariables(data, options);
3326
+ const grouped = groupByCategory(variables);
3327
+ const imports = ["styleframe"];
3328
+ const usedComposables = /* @__PURE__ */ new Set();
3329
+ const lines = [];
3330
+ const generatedIdentifiers = /* @__PURE__ */ new Set();
3331
+ for (const [category, vars] of grouped) {
3332
+ lines.push(`
3333
+ // ${category.charAt(0).toUpperCase() + category.slice(1)} variables`);
3334
+ if (useComposables) {
3335
+ const composableResult = generateComposableCode(category, vars, instanceName);
3336
+ if (composableResult) {
3337
+ lines.push(composableResult.code);
3338
+ usedComposables.add(composableResult.composable);
3339
+ for (const id of composableResult.identifiers) generatedIdentifiers.add(id);
3340
+ }
3341
+ }
3342
+ for (const v of vars) {
3343
+ const identifier = toVariableIdentifier(v.name);
3344
+ if (generatedIdentifiers.has(identifier)) continue;
3345
+ if (!useComposables || v.isReference || !COMPOSABLE_MAP[category]) {
3346
+ const code$1 = generateVariableCode(v);
3347
+ if (code$1) {
3348
+ lines.push(code$1);
3349
+ generatedIdentifiers.add(identifier);
3350
+ }
3351
+ }
3352
+ }
3353
+ }
3354
+ if (themes.length > 0) {
3355
+ lines.push("");
3356
+ for (const theme of themes) lines.push(generateThemeCode(theme));
3357
+ }
3358
+ const composableImports = Array.from(usedComposables).sort();
3359
+ let code = `import { styleframe } from "styleframe";
3360
+ `;
3361
+ if (composableImports.length > 0) {
3362
+ code += `import { ${composableImports.join(", ")} } from "@styleframe/theme";
3363
+ `;
3364
+ imports.push(...composableImports);
3365
+ }
3366
+ code += `
3367
+ const ${instanceName} = styleframe();
3368
+ `;
3369
+ code += `const { variable, ref, theme } = ${instanceName};
3370
+ `;
3371
+ code += lines.join("\n");
3372
+ code += `
3373
+
3374
+ export default ${instanceName};
3375
+ `;
3376
+ return {
3377
+ code,
3378
+ variables,
3379
+ themes,
3380
+ imports
3381
+ };
3382
+ }
3383
+ function isDTCGAlias(value) {
3384
+ return typeof value === "string" && value.startsWith("{") && value.endsWith("}");
3385
+ }
3386
+ function isDTCGToken(value) {
3387
+ return typeof value === "object" && value !== null && "$value" in value;
3388
+ }
3389
+ function isDTCGGroup(value) {
3390
+ return typeof value === "object" && value !== null && !("$value" in value) && !Array.isArray(value);
3391
+ }
3392
+ function figmaTypeToDTCG(figmaType) {
3393
+ switch (figmaType) {
3394
+ case "COLOR":
3395
+ return "color";
3396
+ case "FLOAT":
3397
+ return "dimension";
3398
+ case "STRING":
3399
+ return "string";
3400
+ case "BOOLEAN":
3401
+ return "string";
3402
+ default:
3403
+ return "string";
3404
+ }
3405
+ }
3406
+ function dtcgTypeToFigma(dtcgType) {
3407
+ switch (dtcgType) {
3408
+ case "color":
3409
+ return "COLOR";
3410
+ case "dimension":
3411
+ case "number":
3412
+ case "fontWeight":
3413
+ case "duration":
3414
+ return "FLOAT";
3415
+ case "fontFamily":
3416
+ case "string":
3417
+ return "STRING";
3418
+ case "cubicBezier":
3419
+ return "STRING";
3420
+ default:
3421
+ return "STRING";
3422
+ }
3423
+ }
3424
+ function parseAlias(alias) {
3425
+ return alias.slice(1, -1);
3426
+ }
3427
+ function createAlias(path) {
3428
+ return `{${path.replace(/\//g, ".")}}`;
3429
+ }
3430
+ function figmaPathToDTCG(figmaPath) {
3431
+ return figmaPath.replace(/\//g, ".");
3432
+ }
3433
+ function dtcgPathToFigma(dtcgPath) {
3434
+ return dtcgPath.replace(/\./g, "/");
3435
+ }
3436
+ function getPathSegments(path) {
3437
+ return path.split(/[./]/);
3438
+ }
3439
+ const DTCG_SCHEMA_URL = "https://design-tokens.github.io/community-group/format/";
3440
+ function toDTCG(data, options = {}) {
3441
+ const { includeSchema = true, schemaUrl = DTCG_SCHEMA_URL, useModifiers = true, themeNames } = options;
3442
+ const doc = {};
3443
+ if (includeSchema) doc.$schema = schemaUrl;
3444
+ doc.$extensions = { "dev.styleframe": {
3445
+ collection: data.collection,
3446
+ modes: data.modes
3447
+ } };
3448
+ const defaultMode = data.modes[0] || "Default";
3449
+ const themeModes = themeNames ? data.modes.filter((m) => themeNames.includes(m) && m !== defaultMode) : data.modes.slice(1);
3450
+ const modeOverrides = /* @__PURE__ */ new Map();
3451
+ for (const mode of themeModes) modeOverrides.set(mode, /* @__PURE__ */ new Map());
3452
+ for (const variable of data.variables) {
3453
+ const { token, overrides } = variableToTokenWithOverrides(variable, data.modes, useModifiers, themeModes);
3454
+ setNestedToken(doc, variable.name, token);
3455
+ if (useModifiers) for (const [modeName, value] of overrides) {
3456
+ const modeMap = modeOverrides.get(modeName);
3457
+ if (modeMap) {
3458
+ const tokenPath = figmaPathToDTCG(variable.name);
3459
+ modeMap.set(tokenPath, value);
3460
+ }
3461
+ }
3462
+ }
3463
+ if (useModifiers && themeModes.length > 0 && hasAnyOverrides(modeOverrides)) doc.$modifiers = { theme: {
3464
+ $type: "modifier",
3465
+ contexts: buildModifierContexts(modeOverrides)
3466
+ } };
3467
+ return doc;
3468
+ }
3469
+ function variableToTokenWithOverrides(variable, modes2, useModifiers, themeModes) {
3470
+ const defaultMode = modes2[0] || "Default";
3471
+ const defaultValue = variable.values[defaultMode];
3472
+ const dtcgType = figmaTypeToDTCG(variable.type);
3473
+ const overrides = /* @__PURE__ */ new Map();
3474
+ if (variable.aliasTo) {
3475
+ const token$1 = {
3476
+ $value: createAlias(variable.aliasTo),
3477
+ $type: dtcgType
3478
+ };
3479
+ if (variable.description) token$1.$description = variable.description;
3480
+ return {
3481
+ token: token$1,
3482
+ overrides
3483
+ };
3484
+ }
3485
+ const $value = convertValueToDTCG(defaultValue, variable.type);
3486
+ const token = {
3487
+ $value,
3488
+ $type: dtcgType
3489
+ };
3490
+ if (variable.description) token.$description = variable.description;
3491
+ if (modes2.length > 1) {
3492
+ const modeValues = {};
3493
+ let hasModeOverrides = false;
3494
+ for (const mode of modes2) {
3495
+ if (mode === defaultMode) continue;
3496
+ const modeValue = variable.values[mode];
3497
+ if (modeValue !== void 0) {
3498
+ const convertedValue = convertValueToDTCG(modeValue, variable.type);
3499
+ if (convertedValue !== $value) {
3500
+ const isThemeMode = themeModes.includes(mode);
3501
+ if (useModifiers && isThemeMode) overrides.set(mode, convertedValue);
3502
+ else if (!useModifiers || !isThemeMode) {
3503
+ modeValues[mode] = convertedValue;
3504
+ hasModeOverrides = true;
3505
+ }
3506
+ }
3507
+ }
3508
+ }
3509
+ if (hasModeOverrides) token.$extensions = { "dev.styleframe": { modes: modeValues } };
3510
+ }
3511
+ return {
3512
+ token,
3513
+ overrides
3514
+ };
3515
+ }
3516
+ function convertValueToDTCG(value, type) {
3517
+ if (type === "COLOR" && typeof value === "object" && value !== null && "r" in value) return figmaColorToCss(value);
3518
+ if (type === "FLOAT" && typeof value === "number") return `${value}px`;
3519
+ if (typeof value === "boolean") return value.toString();
3520
+ return String(value);
3521
+ }
3522
+ function setNestedToken(doc, path, token) {
3523
+ const segments = getPathSegments(path);
3524
+ let current = doc;
3525
+ for (let i = 0; i < segments.length - 1; i++) {
3526
+ const segment = segments[i];
3527
+ if (!current[segment] || typeof current[segment] !== "object") current[segment] = {};
3528
+ current = current[segment];
3529
+ }
3530
+ const leafKey = segments[segments.length - 1];
3531
+ current[leafKey] = token;
3532
+ }
3533
+ function hasAnyOverrides(modeOverrides) {
3534
+ for (const overrides of modeOverrides.values()) if (overrides.size > 0) return true;
3535
+ return false;
3536
+ }
3537
+ function buildModifierContexts(modeOverrides) {
3538
+ const contexts = {};
3539
+ for (const [modeName, tokenOverrides] of modeOverrides) {
3540
+ if (tokenOverrides.size === 0) continue;
3541
+ const context = {};
3542
+ for (const [tokenPath, value] of tokenOverrides) setNestedValue(context, tokenPath, { $value: value });
3543
+ contexts[modeName] = context;
3544
+ }
3545
+ return contexts;
3546
+ }
3547
+ function setNestedValue(obj, path, value) {
3548
+ const segments = path.split(".");
3549
+ let current = obj;
3550
+ for (let i = 0; i < segments.length - 1; i++) {
3551
+ const segment = segments[i];
3552
+ if (!current[segment] || typeof current[segment] !== "object" || "$value" in current[segment]) current[segment] = {};
3553
+ current = current[segment];
3554
+ }
3555
+ current[segments[segments.length - 1]] = value;
3556
+ }
3557
+ function fromDTCG(doc, options = {}) {
3558
+ const { defaultModeName = "Default", collectionName, preferredModifier = "theme" } = options;
3559
+ const { modes: modes2 } = extractModes(doc, defaultModeName, preferredModifier);
3560
+ const sfExtension = doc.$extensions?.["dev.styleframe"];
3561
+ const collection = collectionName || sfExtension?.collection || "Design Tokens";
3562
+ const variables = [];
3563
+ const modifierOverrides = extractModifierOverrides(doc, preferredModifier);
3564
+ walkTokens(doc, "", modes2[0] || defaultModeName, (path, token, inheritedType) => {
3565
+ const variable = tokenToVariableWithModifiers(path, token, inheritedType, modes2, modes2[0] || defaultModeName, modifierOverrides);
3566
+ if (variable) variables.push(variable);
3567
+ });
3568
+ return {
3569
+ collection,
3570
+ modes: modes2,
3571
+ variables
3572
+ };
3573
+ }
3574
+ function walkTokens(node, parentPath, defaultModeName, callback, inheritedType) {
3575
+ const currentType = node.$type || inheritedType;
3576
+ for (const [key, value] of Object.entries(node)) {
3577
+ if (key.startsWith("$")) continue;
3578
+ const path = parentPath ? `${parentPath}/${key}` : key;
3579
+ if (isDTCGToken(value)) callback(path, value, currentType);
3580
+ else if (isDTCGGroup(value)) walkTokens(value, path, defaultModeName, callback, currentType);
3581
+ }
3582
+ }
3583
+ function extractModes(doc, defaultModeName, preferredModifier) {
3584
+ const modifier = doc.$modifiers?.[preferredModifier];
3585
+ if (modifier && modifier.contexts) {
3586
+ const contextNames = Object.keys(modifier.contexts);
3587
+ if (contextNames.length > 0) {
3588
+ const sfExtension$1 = doc.$extensions?.["dev.styleframe"];
3589
+ const defaultMode = modifier.$default || sfExtension$1?.modes?.[0] || defaultModeName;
3590
+ return {
3591
+ modes: [defaultMode, ...contextNames.filter((n) => n !== defaultMode)],
3592
+ modeSource: "modifier"
3593
+ };
3594
+ }
3595
+ }
3596
+ const sfExtension = doc.$extensions?.["dev.styleframe"];
3597
+ if (sfExtension?.modes && sfExtension.modes.length > 0) return {
3598
+ modes: sfExtension.modes,
3599
+ modeSource: "extension"
3600
+ };
3601
+ return {
3602
+ modes: [defaultModeName],
3603
+ modeSource: "default"
3604
+ };
3605
+ }
3606
+ function extractModifierOverrides(doc, preferredModifier) {
3607
+ const overrides = /* @__PURE__ */ new Map();
3608
+ const modifier = doc.$modifiers?.[preferredModifier];
3609
+ if (!modifier?.contexts) return overrides;
3610
+ for (const [contextName, context] of Object.entries(modifier.contexts)) walkModifierContext(context, "", (tokenPath, value) => {
3611
+ if (!overrides.has(tokenPath)) overrides.set(tokenPath, /* @__PURE__ */ new Map());
3612
+ overrides.get(tokenPath).set(contextName, value);
3613
+ });
3614
+ return overrides;
3615
+ }
3616
+ function walkModifierContext(context, parentPath, callback) {
3617
+ for (const [key, value] of Object.entries(context)) {
3618
+ const path = parentPath ? `${parentPath}.${key}` : key;
3619
+ if (value && typeof value === "object" && "$value" in value) callback(path, value.$value);
3620
+ else if (value && typeof value === "object") walkModifierContext(value, path, callback);
3621
+ }
3622
+ }
3623
+ function tokenToVariableWithModifiers(path, token, inheritedType, modes2, defaultModeName, modifierOverrides) {
3624
+ const figmaType = dtcgTypeToFigma(token.$type || inheritedType || "string");
3625
+ const isAlias = isDTCGAlias(token.$value);
3626
+ let aliasTo;
3627
+ const values = {};
3628
+ if (isAlias) {
3629
+ aliasTo = parseAlias(token.$value);
3630
+ values[defaultModeName] = {
3631
+ type: "VARIABLE_ALIAS",
3632
+ id: dtcgPathToFigma(aliasTo)
3633
+ };
3634
+ } else {
3635
+ values[defaultModeName] = convertValueToFigma(token.$value, figmaType);
3636
+ const tokenPath = path.replace(/\//g, ".");
3637
+ const pathOverrides = modifierOverrides.get(tokenPath);
3638
+ if (pathOverrides) for (const [modeName, modeValue] of pathOverrides) if (isDTCGAlias(modeValue)) values[modeName] = {
3639
+ type: "VARIABLE_ALIAS",
3640
+ id: dtcgPathToFigma(parseAlias(modeValue))
3641
+ };
3642
+ else values[modeName] = convertValueToFigma(modeValue, figmaType);
3643
+ if (!pathOverrides || pathOverrides.size === 0) {
3644
+ const legacyModeOverrides = token.$extensions?.["dev.styleframe"]?.modes;
3645
+ if (legacyModeOverrides) for (const [modeName, modeValue] of Object.entries(legacyModeOverrides)) if (isDTCGAlias(modeValue)) values[modeName] = {
3646
+ type: "VARIABLE_ALIAS",
3647
+ id: dtcgPathToFigma(parseAlias(modeValue))
3648
+ };
3649
+ else values[modeName] = convertValueToFigma(modeValue, figmaType);
3650
+ }
3651
+ }
3652
+ return {
3653
+ name: path,
3654
+ styleframeName: path.replace(/\//g, "."),
3655
+ type: figmaType,
3656
+ values,
3657
+ aliasTo,
3658
+ description: token.$description
3659
+ };
3660
+ }
3661
+ function convertValueToFigma(value, figmaType) {
3662
+ if (figmaType === "COLOR" && typeof value === "string") {
3663
+ const rgba = cssColorToFigma(value);
3664
+ if (rgba) return rgba;
3665
+ }
3666
+ if (figmaType === "FLOAT") {
3667
+ if (typeof value === "number") return value;
3668
+ if (typeof value === "string") {
3669
+ const pixels = dimensionToPixels(value);
3670
+ if (pixels !== null) return pixels;
3671
+ const num2 = Number.parseFloat(value);
3672
+ if (!Number.isNaN(num2)) return num2;
3673
+ }
3674
+ }
3675
+ if (figmaType === "BOOLEAN") {
3676
+ if (typeof value === "boolean") return value;
3677
+ if (value === "true") return true;
3678
+ if (value === "false") return false;
3679
+ }
3680
+ return String(value);
3681
+ }
3682
+ export {
3683
+ styleframeToFigmaName as a,
3684
+ detectFigmaType as d,
3685
+ fromDTCG as f,
3686
+ generateStyleframeCode as g,
3687
+ styleframeValueToFigma as s,
3688
+ toDTCG as t
3689
+ };