@styleframe/figma 1.0.0

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