@terrazzo/plugin-tailwind 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,88 +1,1778 @@
1
- /**
2
- * @module @terrazzo/plugin-tailwind
3
- * @license MIT License
4
- *
5
- * Copyright (c) 2021 Drew Powers
6
- *
7
- * Permission is hereby granted, free of charge, to any person obtaining a copy
8
- * of this software and associated documentation files (the "Software"), to deal
9
- * in the Software without restriction, including without limitation the rights
10
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- * copies of the Software, and to permit persons to whom the Software is
12
- * furnished to do so, subject to the following conditions:
13
- *
14
- * The above copyright notice and this permission notice shall be included in all
15
- * copies or substantial portions of the Software.
16
- *
17
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
- * SOFTWARE.
24
- */
25
- import { FORMAT_ID as FORMAT_CSS } from '@terrazzo/plugin-css';
26
- import { flattenThemeObj } from './lib.js';
27
- export const FORMAT_ID = 'tailwind';
28
- export * from './lib.js';
29
- export default function pluginTailwind(options) {
30
- const filename = options?.filename ?? options?.fileName ?? 'tailwind-theme.css';
31
- return {
32
- name: '@terrazzo/plugin-tailwind',
33
- enforce: 'post', // ensure this comes after @terrazzo/plugin-css
34
- config(config) {
35
- if (!config.plugins.some((p) => p.name === '@terrazzo/plugin-css')) {
36
- throw new Error('@terrazzo/plugin-css missing! Please install and add to the plugins array to use the Tailwind plugin.');
37
- }
38
- if (!options || !options.theme) {
39
- throw new Error('Missing Tailwind `theme` option.');
40
- }
41
- },
42
- async transform({ getTransforms, setTransform }) {
43
- const variants = [{ variant: '.', mode: '.' }, ...(options?.modeVariants ?? [])];
44
- for (const { variant, mode } of variants) {
45
- const flatTheme = flattenThemeObj(options.theme);
46
- for (const { path, value } of flatTheme) {
47
- for (const token of getTransforms({
48
- format: FORMAT_CSS,
49
- id: value,
50
- mode,
51
- })) {
52
- let relName = token.id.split('.').at(-1);
53
- for (const subgroup of [...(Array.isArray(value) ? value : [value])]) {
54
- const match = subgroup.replace(/\*.*/, '');
55
- relName = token.id.replace(match, '');
56
- }
57
- setTransform(token.id, {
58
- format: FORMAT_ID,
59
- localID: `--${path.join('-')}-${relName.replace(/\./g, '-')}`,
60
- value: typeof token.value === 'object' ? token.value['.'] : token.value,
61
- mode: variant, // ! <- not the original mode!
62
- });
63
- }
64
- }
65
- }
66
- },
67
- async build({ getTransforms, outputFile }) {
68
- const output = ['@import "tailwind";', ''];
69
- const variants = { '.': [] };
70
- for (const token of getTransforms({ format: FORMAT_ID })) {
71
- const { localID, value, mode } = token;
72
- if (!variants[mode]) {
73
- variants[mode] = [];
74
- }
75
- variants[mode].push(`${localID}: ${value};`);
76
- }
77
- for (const [variant, values] of Object.entries(variants)) {
78
- output.push(variant === '.' ? '@theme {' : `@variant ${variant} {`);
79
- for (const value of values) {
80
- output.push(` ${value}`);
81
- }
82
- output.push('}', '');
83
- }
84
- outputFile(filename, output.join('\n'));
85
- },
86
- };
1
+ //#region ../plugin-css/dist/index.js
2
+ const parseNumber = (color, len) => {
3
+ if (typeof color !== "number") return;
4
+ if (len === 3) return {
5
+ mode: "rgb",
6
+ r: (color >> 8 & 15 | color >> 4 & 240) / 255,
7
+ g: (color >> 4 & 15 | color & 240) / 255,
8
+ b: (color & 15 | color << 4 & 240) / 255
9
+ };
10
+ if (len === 4) return {
11
+ mode: "rgb",
12
+ r: (color >> 12 & 15 | color >> 8 & 240) / 255,
13
+ g: (color >> 8 & 15 | color >> 4 & 240) / 255,
14
+ b: (color >> 4 & 15 | color & 240) / 255,
15
+ alpha: (color & 15 | color << 4 & 240) / 255
16
+ };
17
+ if (len === 6) return {
18
+ mode: "rgb",
19
+ r: (color >> 16 & 255) / 255,
20
+ g: (color >> 8 & 255) / 255,
21
+ b: (color & 255) / 255
22
+ };
23
+ if (len === 8) return {
24
+ mode: "rgb",
25
+ r: (color >> 24 & 255) / 255,
26
+ g: (color >> 16 & 255) / 255,
27
+ b: (color >> 8 & 255) / 255,
28
+ alpha: (color & 255) / 255
29
+ };
30
+ };
31
+ var parseNumber_default = parseNumber;
32
+ const named = {
33
+ aliceblue: 15792383,
34
+ antiquewhite: 16444375,
35
+ aqua: 65535,
36
+ aquamarine: 8388564,
37
+ azure: 15794175,
38
+ beige: 16119260,
39
+ bisque: 16770244,
40
+ black: 0,
41
+ blanchedalmond: 16772045,
42
+ blue: 255,
43
+ blueviolet: 9055202,
44
+ brown: 10824234,
45
+ burlywood: 14596231,
46
+ cadetblue: 6266528,
47
+ chartreuse: 8388352,
48
+ chocolate: 13789470,
49
+ coral: 16744272,
50
+ cornflowerblue: 6591981,
51
+ cornsilk: 16775388,
52
+ crimson: 14423100,
53
+ cyan: 65535,
54
+ darkblue: 139,
55
+ darkcyan: 35723,
56
+ darkgoldenrod: 12092939,
57
+ darkgray: 11119017,
58
+ darkgreen: 25600,
59
+ darkgrey: 11119017,
60
+ darkkhaki: 12433259,
61
+ darkmagenta: 9109643,
62
+ darkolivegreen: 5597999,
63
+ darkorange: 16747520,
64
+ darkorchid: 10040012,
65
+ darkred: 9109504,
66
+ darksalmon: 15308410,
67
+ darkseagreen: 9419919,
68
+ darkslateblue: 4734347,
69
+ darkslategray: 3100495,
70
+ darkslategrey: 3100495,
71
+ darkturquoise: 52945,
72
+ darkviolet: 9699539,
73
+ deeppink: 16716947,
74
+ deepskyblue: 49151,
75
+ dimgray: 6908265,
76
+ dimgrey: 6908265,
77
+ dodgerblue: 2003199,
78
+ firebrick: 11674146,
79
+ floralwhite: 16775920,
80
+ forestgreen: 2263842,
81
+ fuchsia: 16711935,
82
+ gainsboro: 14474460,
83
+ ghostwhite: 16316671,
84
+ gold: 16766720,
85
+ goldenrod: 14329120,
86
+ gray: 8421504,
87
+ green: 32768,
88
+ greenyellow: 11403055,
89
+ grey: 8421504,
90
+ honeydew: 15794160,
91
+ hotpink: 16738740,
92
+ indianred: 13458524,
93
+ indigo: 4915330,
94
+ ivory: 16777200,
95
+ khaki: 15787660,
96
+ lavender: 15132410,
97
+ lavenderblush: 16773365,
98
+ lawngreen: 8190976,
99
+ lemonchiffon: 16775885,
100
+ lightblue: 11393254,
101
+ lightcoral: 15761536,
102
+ lightcyan: 14745599,
103
+ lightgoldenrodyellow: 16448210,
104
+ lightgray: 13882323,
105
+ lightgreen: 9498256,
106
+ lightgrey: 13882323,
107
+ lightpink: 16758465,
108
+ lightsalmon: 16752762,
109
+ lightseagreen: 2142890,
110
+ lightskyblue: 8900346,
111
+ lightslategray: 7833753,
112
+ lightslategrey: 7833753,
113
+ lightsteelblue: 11584734,
114
+ lightyellow: 16777184,
115
+ lime: 65280,
116
+ limegreen: 3329330,
117
+ linen: 16445670,
118
+ magenta: 16711935,
119
+ maroon: 8388608,
120
+ mediumaquamarine: 6737322,
121
+ mediumblue: 205,
122
+ mediumorchid: 12211667,
123
+ mediumpurple: 9662683,
124
+ mediumseagreen: 3978097,
125
+ mediumslateblue: 8087790,
126
+ mediumspringgreen: 64154,
127
+ mediumturquoise: 4772300,
128
+ mediumvioletred: 13047173,
129
+ midnightblue: 1644912,
130
+ mintcream: 16121850,
131
+ mistyrose: 16770273,
132
+ moccasin: 16770229,
133
+ navajowhite: 16768685,
134
+ navy: 128,
135
+ oldlace: 16643558,
136
+ olive: 8421376,
137
+ olivedrab: 7048739,
138
+ orange: 16753920,
139
+ orangered: 16729344,
140
+ orchid: 14315734,
141
+ palegoldenrod: 15657130,
142
+ palegreen: 10025880,
143
+ paleturquoise: 11529966,
144
+ palevioletred: 14381203,
145
+ papayawhip: 16773077,
146
+ peachpuff: 16767673,
147
+ peru: 13468991,
148
+ pink: 16761035,
149
+ plum: 14524637,
150
+ powderblue: 11591910,
151
+ purple: 8388736,
152
+ rebeccapurple: 6697881,
153
+ red: 16711680,
154
+ rosybrown: 12357519,
155
+ royalblue: 4286945,
156
+ saddlebrown: 9127187,
157
+ salmon: 16416882,
158
+ sandybrown: 16032864,
159
+ seagreen: 3050327,
160
+ seashell: 16774638,
161
+ sienna: 10506797,
162
+ silver: 12632256,
163
+ skyblue: 8900331,
164
+ slateblue: 6970061,
165
+ slategray: 7372944,
166
+ slategrey: 7372944,
167
+ snow: 16775930,
168
+ springgreen: 65407,
169
+ steelblue: 4620980,
170
+ tan: 13808780,
171
+ teal: 32896,
172
+ thistle: 14204888,
173
+ tomato: 16737095,
174
+ turquoise: 4251856,
175
+ violet: 15631086,
176
+ wheat: 16113331,
177
+ white: 16777215,
178
+ whitesmoke: 16119285,
179
+ yellow: 16776960,
180
+ yellowgreen: 10145074
181
+ };
182
+ var named_default = named;
183
+ const parseNamed = (color) => {
184
+ return parseNumber_default(named_default[color.toLowerCase()], 6);
185
+ };
186
+ var parseNamed_default = parseNamed;
187
+ const hex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;
188
+ const parseHex = (color) => {
189
+ let match;
190
+ return (match = color.match(hex)) ? parseNumber_default(parseInt(match[1], 16), match[1].length) : void 0;
191
+ };
192
+ var parseHex_default = parseHex;
193
+ const num$1 = "([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)";
194
+ const num_none = `(?:${num$1}|none)`;
195
+ const per = `${num$1}%`;
196
+ const per_none = `(?:${num$1}%|none)`;
197
+ const num_per = `(?:${num$1}%|${num$1})`;
198
+ const num_per_none = `(?:${num$1}%|${num$1}|none)`;
199
+ const hue$1 = `(?:${num$1}(deg|grad|rad|turn)|${num$1})`;
200
+ const hue_none = `(?:${num$1}(deg|grad|rad|turn)|${num$1}|none)`;
201
+ const c = `\\s*,\\s*`;
202
+ const rx_num_per_none = new RegExp("^" + num_per_none + "$");
203
+ const rgb_num_old = new RegExp(`^rgba?\\(\\s*${num$1}${c}${num$1}${c}${num$1}\\s*(?:,\\s*${num_per}\\s*)?\\)$`);
204
+ const rgb_per_old = new RegExp(`^rgba?\\(\\s*${per}${c}${per}${c}${per}\\s*(?:,\\s*${num_per}\\s*)?\\)$`);
205
+ const parseRgbLegacy = (color) => {
206
+ let res = { mode: "rgb" };
207
+ let match;
208
+ if (match = color.match(rgb_num_old)) {
209
+ if (match[1] !== void 0) res.r = match[1] / 255;
210
+ if (match[2] !== void 0) res.g = match[2] / 255;
211
+ if (match[3] !== void 0) res.b = match[3] / 255;
212
+ } else if (match = color.match(rgb_per_old)) {
213
+ if (match[1] !== void 0) res.r = match[1] / 100;
214
+ if (match[2] !== void 0) res.g = match[2] / 100;
215
+ if (match[3] !== void 0) res.b = match[3] / 100;
216
+ } else return void 0;
217
+ if (match[4] !== void 0) res.alpha = Math.max(0, Math.min(1, match[4] / 100));
218
+ else if (match[5] !== void 0) res.alpha = Math.max(0, Math.min(1, +match[5]));
219
+ return res;
220
+ };
221
+ var parseRgbLegacy_default = parseRgbLegacy;
222
+ const prepare = (color, mode) => color === void 0 ? void 0 : typeof color !== "object" ? parse_default(color) : color.mode !== void 0 ? color : mode ? {
223
+ ...color,
224
+ mode
225
+ } : void 0;
226
+ var _prepare_default = prepare;
227
+ const converter = (target_mode = "rgb") => (color) => (color = _prepare_default(color, target_mode)) !== void 0 ? color.mode === target_mode ? color : converters$1[color.mode][target_mode] ? converters$1[color.mode][target_mode](color) : target_mode === "rgb" ? converters$1[color.mode].rgb(color) : converters$1.rgb[target_mode](converters$1[color.mode].rgb(color)) : void 0;
228
+ var converter_default = converter;
229
+ const converters$1 = {};
230
+ const modes = {};
231
+ const parsers = [];
232
+ const colorProfiles = {};
233
+ const identity = (v) => v;
234
+ const useMode = (definition$15) => {
235
+ converters$1[definition$15.mode] = {
236
+ ...converters$1[definition$15.mode],
237
+ ...definition$15.toMode
238
+ };
239
+ Object.keys(definition$15.fromMode || {}).forEach((k$2) => {
240
+ if (!converters$1[k$2]) converters$1[k$2] = {};
241
+ converters$1[k$2][definition$15.mode] = definition$15.fromMode[k$2];
242
+ });
243
+ if (!definition$15.ranges) definition$15.ranges = {};
244
+ if (!definition$15.difference) definition$15.difference = {};
245
+ definition$15.channels.forEach((channel) => {
246
+ if (definition$15.ranges[channel] === void 0) definition$15.ranges[channel] = [0, 1];
247
+ if (!definition$15.interpolate[channel]) throw new Error(`Missing interpolator for: ${channel}`);
248
+ if (typeof definition$15.interpolate[channel] === "function") definition$15.interpolate[channel] = { use: definition$15.interpolate[channel] };
249
+ if (!definition$15.interpolate[channel].fixup) definition$15.interpolate[channel].fixup = identity;
250
+ });
251
+ modes[definition$15.mode] = definition$15;
252
+ (definition$15.parse || []).forEach((parser) => {
253
+ useParser(parser, definition$15.mode);
254
+ });
255
+ return converter_default(definition$15.mode);
256
+ };
257
+ const getMode = (mode) => modes[mode];
258
+ const useParser = (parser, mode) => {
259
+ if (typeof parser === "string") {
260
+ if (!mode) throw new Error(`'mode' required when 'parser' is a string`);
261
+ colorProfiles[parser] = mode;
262
+ } else if (typeof parser === "function") {
263
+ if (parsers.indexOf(parser) < 0) parsers.push(parser);
264
+ }
265
+ };
266
+ const IdentStartCodePoint = /[^\x00-\x7F]|[a-zA-Z_]/;
267
+ const IdentCodePoint = /[^\x00-\x7F]|[-\w]/;
268
+ const Tok = {
269
+ Function: "function",
270
+ Ident: "ident",
271
+ Number: "number",
272
+ Percentage: "percentage",
273
+ ParenClose: ")",
274
+ None: "none",
275
+ Hue: "hue",
276
+ Alpha: "alpha"
277
+ };
278
+ let _i = 0;
279
+ function is_num(chars) {
280
+ let ch = chars[_i];
281
+ let ch1 = chars[_i + 1];
282
+ if (ch === "-" || ch === "+") return /\d/.test(ch1) || ch1 === "." && /\d/.test(chars[_i + 2]);
283
+ if (ch === ".") return /\d/.test(ch1);
284
+ return /\d/.test(ch);
87
285
  }
286
+ function is_ident(chars) {
287
+ if (_i >= chars.length) return false;
288
+ let ch = chars[_i];
289
+ if (IdentStartCodePoint.test(ch)) return true;
290
+ if (ch === "-") {
291
+ if (chars.length - _i < 2) return false;
292
+ let ch1 = chars[_i + 1];
293
+ if (ch1 === "-" || IdentStartCodePoint.test(ch1)) return true;
294
+ return false;
295
+ }
296
+ return false;
297
+ }
298
+ const huenits = {
299
+ deg: 1,
300
+ rad: 180 / Math.PI,
301
+ grad: 9 / 10,
302
+ turn: 360
303
+ };
304
+ function num(chars) {
305
+ let value = "";
306
+ if (chars[_i] === "-" || chars[_i] === "+") value += chars[_i++];
307
+ value += digits(chars);
308
+ if (chars[_i] === "." && /\d/.test(chars[_i + 1])) value += chars[_i++] + digits(chars);
309
+ if (chars[_i] === "e" || chars[_i] === "E") {
310
+ if ((chars[_i + 1] === "-" || chars[_i + 1] === "+") && /\d/.test(chars[_i + 2])) value += chars[_i++] + chars[_i++] + digits(chars);
311
+ else if (/\d/.test(chars[_i + 1])) value += chars[_i++] + digits(chars);
312
+ }
313
+ if (is_ident(chars)) {
314
+ let id = ident(chars);
315
+ if (id === "deg" || id === "rad" || id === "turn" || id === "grad") return {
316
+ type: Tok.Hue,
317
+ value: value * huenits[id]
318
+ };
319
+ return void 0;
320
+ }
321
+ if (chars[_i] === "%") {
322
+ _i++;
323
+ return {
324
+ type: Tok.Percentage,
325
+ value: +value
326
+ };
327
+ }
328
+ return {
329
+ type: Tok.Number,
330
+ value: +value
331
+ };
332
+ }
333
+ function digits(chars) {
334
+ let v = "";
335
+ while (/\d/.test(chars[_i])) v += chars[_i++];
336
+ return v;
337
+ }
338
+ function ident(chars) {
339
+ let v = "";
340
+ while (_i < chars.length && IdentCodePoint.test(chars[_i])) v += chars[_i++];
341
+ return v;
342
+ }
343
+ function identlike(chars) {
344
+ let v = ident(chars);
345
+ if (chars[_i] === "(") {
346
+ _i++;
347
+ return {
348
+ type: Tok.Function,
349
+ value: v
350
+ };
351
+ }
352
+ if (v === "none") return {
353
+ type: Tok.None,
354
+ value: void 0
355
+ };
356
+ return {
357
+ type: Tok.Ident,
358
+ value: v
359
+ };
360
+ }
361
+ function tokenize(str = "") {
362
+ let chars = str.trim();
363
+ let tokens = [];
364
+ let ch;
365
+ _i = 0;
366
+ while (_i < chars.length) {
367
+ ch = chars[_i++];
368
+ if (ch === "\n" || ch === " " || ch === " ") {
369
+ while (_i < chars.length && (chars[_i] === "\n" || chars[_i] === " " || chars[_i] === " ")) _i++;
370
+ continue;
371
+ }
372
+ if (ch === ",") return void 0;
373
+ if (ch === ")") {
374
+ tokens.push({ type: Tok.ParenClose });
375
+ continue;
376
+ }
377
+ if (ch === "+") {
378
+ _i--;
379
+ if (is_num(chars)) {
380
+ tokens.push(num(chars));
381
+ continue;
382
+ }
383
+ return void 0;
384
+ }
385
+ if (ch === "-") {
386
+ _i--;
387
+ if (is_num(chars)) {
388
+ tokens.push(num(chars));
389
+ continue;
390
+ }
391
+ if (is_ident(chars)) {
392
+ tokens.push({
393
+ type: Tok.Ident,
394
+ value: ident(chars)
395
+ });
396
+ continue;
397
+ }
398
+ return void 0;
399
+ }
400
+ if (ch === ".") {
401
+ _i--;
402
+ if (is_num(chars)) {
403
+ tokens.push(num(chars));
404
+ continue;
405
+ }
406
+ return void 0;
407
+ }
408
+ if (ch === "/") {
409
+ while (_i < chars.length && (chars[_i] === "\n" || chars[_i] === " " || chars[_i] === " ")) _i++;
410
+ let alpha;
411
+ if (is_num(chars)) {
412
+ alpha = num(chars);
413
+ if (alpha.type !== Tok.Hue) {
414
+ tokens.push({
415
+ type: Tok.Alpha,
416
+ value: alpha
417
+ });
418
+ continue;
419
+ }
420
+ }
421
+ if (is_ident(chars)) {
422
+ if (ident(chars) === "none") {
423
+ tokens.push({
424
+ type: Tok.Alpha,
425
+ value: {
426
+ type: Tok.None,
427
+ value: void 0
428
+ }
429
+ });
430
+ continue;
431
+ }
432
+ }
433
+ return void 0;
434
+ }
435
+ if (/\d/.test(ch)) {
436
+ _i--;
437
+ tokens.push(num(chars));
438
+ continue;
439
+ }
440
+ if (IdentStartCodePoint.test(ch)) {
441
+ _i--;
442
+ tokens.push(identlike(chars));
443
+ continue;
444
+ }
445
+ return void 0;
446
+ }
447
+ return tokens;
448
+ }
449
+ function parseColorSyntax(tokens) {
450
+ tokens._i = 0;
451
+ let token = tokens[tokens._i++];
452
+ if (!token || token.type !== Tok.Function || token.value !== "color") return void 0;
453
+ token = tokens[tokens._i++];
454
+ if (token.type !== Tok.Ident) return void 0;
455
+ const mode = colorProfiles[token.value];
456
+ if (!mode) return void 0;
457
+ const res = { mode };
458
+ const coords = consumeCoords(tokens, false);
459
+ if (!coords) return void 0;
460
+ const channels = getMode(mode).channels;
461
+ for (let ii = 0, c$1, ch; ii < channels.length; ii++) {
462
+ c$1 = coords[ii];
463
+ ch = channels[ii];
464
+ if (c$1.type !== Tok.None) {
465
+ res[ch] = c$1.type === Tok.Number ? c$1.value : c$1.value / 100;
466
+ if (ch === "alpha") res[ch] = Math.max(0, Math.min(1, res[ch]));
467
+ }
468
+ }
469
+ return res;
470
+ }
471
+ function consumeCoords(tokens, includeHue) {
472
+ const coords = [];
473
+ let token;
474
+ while (tokens._i < tokens.length) {
475
+ token = tokens[tokens._i++];
476
+ if (token.type === Tok.None || token.type === Tok.Number || token.type === Tok.Alpha || token.type === Tok.Percentage || includeHue && token.type === Tok.Hue) {
477
+ coords.push(token);
478
+ continue;
479
+ }
480
+ if (token.type === Tok.ParenClose) {
481
+ if (tokens._i < tokens.length) return void 0;
482
+ continue;
483
+ }
484
+ return void 0;
485
+ }
486
+ if (coords.length < 3 || coords.length > 4) return void 0;
487
+ if (coords.length === 4) {
488
+ if (coords[3].type !== Tok.Alpha) return void 0;
489
+ coords[3] = coords[3].value;
490
+ }
491
+ if (coords.length === 3) coords.push({
492
+ type: Tok.None,
493
+ value: void 0
494
+ });
495
+ return coords.every((c$1) => c$1.type !== Tok.Alpha) ? coords : void 0;
496
+ }
497
+ function parseModernSyntax(tokens, includeHue) {
498
+ tokens._i = 0;
499
+ let token = tokens[tokens._i++];
500
+ if (!token || token.type !== Tok.Function) return void 0;
501
+ let coords = consumeCoords(tokens, includeHue);
502
+ if (!coords) return void 0;
503
+ coords.unshift(token.value);
504
+ return coords;
505
+ }
506
+ const parse = (color) => {
507
+ if (typeof color !== "string") return void 0;
508
+ const tokens = tokenize(color);
509
+ const parsed = tokens ? parseModernSyntax(tokens, true) : void 0;
510
+ let result = void 0;
511
+ let i = 0;
512
+ let len = parsers.length;
513
+ while (i < len) if ((result = parsers[i++](color, parsed)) !== void 0) return result;
514
+ return tokens ? parseColorSyntax(tokens) : void 0;
515
+ };
516
+ var parse_default = parse;
517
+ function parseRgb(color, parsed) {
518
+ if (!parsed || parsed[0] !== "rgb" && parsed[0] !== "rgba") return void 0;
519
+ const res = { mode: "rgb" };
520
+ const [, r$1, g, b, alpha] = parsed;
521
+ if (r$1.type === Tok.Hue || g.type === Tok.Hue || b.type === Tok.Hue) return void 0;
522
+ if (r$1.type !== Tok.None) res.r = r$1.type === Tok.Number ? r$1.value / 255 : r$1.value / 100;
523
+ if (g.type !== Tok.None) res.g = g.type === Tok.Number ? g.value / 255 : g.value / 100;
524
+ if (b.type !== Tok.None) res.b = b.type === Tok.Number ? b.value / 255 : b.value / 100;
525
+ if (alpha.type !== Tok.None) res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
526
+ return res;
527
+ }
528
+ var parseRgb_default = parseRgb;
529
+ const parseTransparent = (c$1) => c$1 === "transparent" ? {
530
+ mode: "rgb",
531
+ r: 0,
532
+ g: 0,
533
+ b: 0,
534
+ alpha: 0
535
+ } : void 0;
536
+ var parseTransparent_default = parseTransparent;
537
+ const lerp = (a, b, t) => a + t * (b - a);
538
+ const get_classes = (arr) => {
539
+ let classes = [];
540
+ for (let i = 0; i < arr.length - 1; i++) {
541
+ let a = arr[i];
542
+ let b = arr[i + 1];
543
+ if (a === void 0 && b === void 0) classes.push(void 0);
544
+ else if (a !== void 0 && b !== void 0) classes.push([a, b]);
545
+ else classes.push(a !== void 0 ? [a, a] : [b, b]);
546
+ }
547
+ return classes;
548
+ };
549
+ const interpolatorPiecewise = (interpolator) => (arr) => {
550
+ let classes = get_classes(arr);
551
+ return (t) => {
552
+ let cls = t * classes.length;
553
+ let idx = t >= 1 ? classes.length - 1 : Math.max(Math.floor(cls), 0);
554
+ let pair = classes[idx];
555
+ return pair === void 0 ? void 0 : interpolator(pair[0], pair[1], cls - idx);
556
+ };
557
+ };
558
+ const interpolatorLinear = interpolatorPiecewise(lerp);
559
+ const fixupAlpha = (arr) => {
560
+ let some_defined = false;
561
+ let res = arr.map((v) => {
562
+ if (v !== void 0) {
563
+ some_defined = true;
564
+ return v;
565
+ }
566
+ return 1;
567
+ });
568
+ return some_defined ? res : arr;
569
+ };
570
+ const definition$14 = {
571
+ mode: "rgb",
572
+ channels: [
573
+ "r",
574
+ "g",
575
+ "b",
576
+ "alpha"
577
+ ],
578
+ parse: [
579
+ parseRgb_default,
580
+ parseHex_default,
581
+ parseRgbLegacy_default,
582
+ parseNamed_default,
583
+ parseTransparent_default,
584
+ "srgb"
585
+ ],
586
+ serialize: "srgb",
587
+ interpolate: {
588
+ r: interpolatorLinear,
589
+ g: interpolatorLinear,
590
+ b: interpolatorLinear,
591
+ alpha: {
592
+ use: interpolatorLinear,
593
+ fixup: fixupAlpha
594
+ }
595
+ },
596
+ gamut: true,
597
+ white: {
598
+ r: 1,
599
+ g: 1,
600
+ b: 1
601
+ },
602
+ black: {
603
+ r: 0,
604
+ g: 0,
605
+ b: 0
606
+ }
607
+ };
608
+ var definition_default$12 = definition$14;
609
+ const linearize$2 = (v = 0) => Math.pow(Math.abs(v), 563 / 256) * Math.sign(v);
610
+ const convertA98ToXyz65 = (a98) => {
611
+ let r$1 = linearize$2(a98.r);
612
+ let g = linearize$2(a98.g);
613
+ let b = linearize$2(a98.b);
614
+ let res = {
615
+ mode: "xyz65",
616
+ x: .5766690429101305 * r$1 + .1855582379065463 * g + .1882286462349947 * b,
617
+ y: .297344975250536 * r$1 + .6273635662554661 * g + .0752914584939979 * b,
618
+ z: .0270313613864123 * r$1 + .0706888525358272 * g + .9913375368376386 * b
619
+ };
620
+ if (a98.alpha !== void 0) res.alpha = a98.alpha;
621
+ return res;
622
+ };
623
+ var convertA98ToXyz65_default = convertA98ToXyz65;
624
+ const gamma$2 = (v) => Math.pow(Math.abs(v), 256 / 563) * Math.sign(v);
625
+ const convertXyz65ToA98 = ({ x, y, z, alpha }) => {
626
+ if (x === void 0) x = 0;
627
+ if (y === void 0) y = 0;
628
+ if (z === void 0) z = 0;
629
+ let res = {
630
+ mode: "a98",
631
+ r: gamma$2(x * 2.0415879038107465 - y * .5650069742788597 - .3447313507783297 * z),
632
+ g: gamma$2(x * -.9692436362808798 + y * 1.8759675015077206 + .0415550574071756 * z),
633
+ b: gamma$2(x * .0134442806320312 - y * .1183623922310184 + 1.0151749943912058 * z)
634
+ };
635
+ if (alpha !== void 0) res.alpha = alpha;
636
+ return res;
637
+ };
638
+ var convertXyz65ToA98_default = convertXyz65ToA98;
639
+ const fn$2 = (c$1 = 0) => {
640
+ const abs = Math.abs(c$1);
641
+ if (abs <= .04045) return c$1 / 12.92;
642
+ return (Math.sign(c$1) || 1) * Math.pow((abs + .055) / 1.055, 2.4);
643
+ };
644
+ const convertRgbToLrgb = ({ r: r$1, g, b, alpha }) => {
645
+ let res = {
646
+ mode: "lrgb",
647
+ r: fn$2(r$1),
648
+ g: fn$2(g),
649
+ b: fn$2(b)
650
+ };
651
+ if (alpha !== void 0) res.alpha = alpha;
652
+ return res;
653
+ };
654
+ var convertRgbToLrgb_default = convertRgbToLrgb;
655
+ const convertRgbToXyz65 = (rgb$2) => {
656
+ let { r: r$1, g, b, alpha } = convertRgbToLrgb_default(rgb$2);
657
+ let res = {
658
+ mode: "xyz65",
659
+ x: .4123907992659593 * r$1 + .357584339383878 * g + .1804807884018343 * b,
660
+ y: .2126390058715102 * r$1 + .715168678767756 * g + .0721923153607337 * b,
661
+ z: .0193308187155918 * r$1 + .119194779794626 * g + .9505321522496607 * b
662
+ };
663
+ if (alpha !== void 0) res.alpha = alpha;
664
+ return res;
665
+ };
666
+ var convertRgbToXyz65_default = convertRgbToXyz65;
667
+ const fn$1 = (c$1 = 0) => {
668
+ const abs = Math.abs(c$1);
669
+ if (abs > .0031308) return (Math.sign(c$1) || 1) * (1.055 * Math.pow(abs, 1 / 2.4) - .055);
670
+ return c$1 * 12.92;
671
+ };
672
+ const convertLrgbToRgb = ({ r: r$1, g, b, alpha }, mode = "rgb") => {
673
+ let res = {
674
+ mode,
675
+ r: fn$1(r$1),
676
+ g: fn$1(g),
677
+ b: fn$1(b)
678
+ };
679
+ if (alpha !== void 0) res.alpha = alpha;
680
+ return res;
681
+ };
682
+ var convertLrgbToRgb_default = convertLrgbToRgb;
683
+ const convertXyz65ToRgb = ({ x, y, z, alpha }) => {
684
+ if (x === void 0) x = 0;
685
+ if (y === void 0) y = 0;
686
+ if (z === void 0) z = 0;
687
+ let res = convertLrgbToRgb_default({
688
+ r: x * 3.2409699419045226 - y * 1.537383177570094 - .4986107602930034 * z,
689
+ g: x * -.9692436362808796 + y * 1.8759675015077204 + .0415550574071756 * z,
690
+ b: x * .0556300796969936 - y * .2039769588889765 + 1.0569715142428784 * z
691
+ });
692
+ if (alpha !== void 0) res.alpha = alpha;
693
+ return res;
694
+ };
695
+ var convertXyz65ToRgb_default = convertXyz65ToRgb;
696
+ const definition$13 = {
697
+ ...definition_default$12,
698
+ mode: "a98",
699
+ parse: ["a98-rgb"],
700
+ serialize: "a98-rgb",
701
+ fromMode: {
702
+ rgb: (color) => convertXyz65ToA98_default(convertRgbToXyz65_default(color)),
703
+ xyz65: convertXyz65ToA98_default
704
+ },
705
+ toMode: {
706
+ rgb: (color) => convertXyz65ToRgb_default(convertA98ToXyz65_default(color)),
707
+ xyz65: convertA98ToXyz65_default
708
+ }
709
+ };
710
+ var definition_default = definition$13;
711
+ const normalizeHue = (hue$2) => (hue$2 = hue$2 % 360) < 0 ? hue$2 + 360 : hue$2;
712
+ var normalizeHue_default = normalizeHue;
713
+ function convertHslToRgb({ h, s, l, alpha }) {
714
+ h = normalizeHue_default(h !== void 0 ? h : 0);
715
+ if (s === void 0) s = 0;
716
+ if (l === void 0) l = 0;
717
+ let m1 = l + s * (l < .5 ? l : 1 - l);
718
+ let m2 = m1 - (m1 - l) * 2 * Math.abs(h / 60 % 2 - 1);
719
+ let res;
720
+ switch (Math.floor(h / 60)) {
721
+ case 0:
722
+ res = {
723
+ r: m1,
724
+ g: m2,
725
+ b: 2 * l - m1
726
+ };
727
+ break;
728
+ case 1:
729
+ res = {
730
+ r: m2,
731
+ g: m1,
732
+ b: 2 * l - m1
733
+ };
734
+ break;
735
+ case 2:
736
+ res = {
737
+ r: 2 * l - m1,
738
+ g: m1,
739
+ b: m2
740
+ };
741
+ break;
742
+ case 3:
743
+ res = {
744
+ r: 2 * l - m1,
745
+ g: m2,
746
+ b: m1
747
+ };
748
+ break;
749
+ case 4:
750
+ res = {
751
+ r: m2,
752
+ g: 2 * l - m1,
753
+ b: m1
754
+ };
755
+ break;
756
+ case 5:
757
+ res = {
758
+ r: m1,
759
+ g: 2 * l - m1,
760
+ b: m2
761
+ };
762
+ break;
763
+ default: res = {
764
+ r: 2 * l - m1,
765
+ g: 2 * l - m1,
766
+ b: 2 * l - m1
767
+ };
768
+ }
769
+ res.mode = "rgb";
770
+ if (alpha !== void 0) res.alpha = alpha;
771
+ return res;
772
+ }
773
+ function convertRgbToHsl({ r: r$1, g, b, alpha }) {
774
+ if (r$1 === void 0) r$1 = 0;
775
+ if (g === void 0) g = 0;
776
+ if (b === void 0) b = 0;
777
+ let M = Math.max(r$1, g, b), m = Math.min(r$1, g, b);
778
+ let res = {
779
+ mode: "hsl",
780
+ s: M === m ? 0 : (M - m) / (1 - Math.abs(M + m - 1)),
781
+ l: .5 * (M + m)
782
+ };
783
+ if (M - m !== 0) res.h = (M === r$1 ? (g - b) / (M - m) + (g < b) * 6 : M === g ? (b - r$1) / (M - m) + 2 : (r$1 - g) / (M - m) + 4) * 60;
784
+ if (alpha !== void 0) res.alpha = alpha;
785
+ return res;
786
+ }
787
+ const hueToDeg = (val, unit) => {
788
+ switch (unit) {
789
+ case "deg": return +val;
790
+ case "rad": return val / Math.PI * 180;
791
+ case "grad": return val / 10 * 9;
792
+ case "turn": return val * 360;
793
+ }
794
+ };
795
+ var hue_default = hueToDeg;
796
+ const hsl_old = new RegExp(`^hsla?\\(\\s*${hue$1}${c}${per}${c}${per}\\s*(?:,\\s*${num_per}\\s*)?\\)$`);
797
+ const parseHslLegacy = (color) => {
798
+ let match = color.match(hsl_old);
799
+ if (!match) return;
800
+ let res = { mode: "hsl" };
801
+ if (match[3] !== void 0) res.h = +match[3];
802
+ else if (match[1] !== void 0 && match[2] !== void 0) res.h = hue_default(match[1], match[2]);
803
+ if (match[4] !== void 0) res.s = Math.min(Math.max(0, match[4] / 100), 1);
804
+ if (match[5] !== void 0) res.l = Math.min(Math.max(0, match[5] / 100), 1);
805
+ if (match[6] !== void 0) res.alpha = Math.max(0, Math.min(1, match[6] / 100));
806
+ else if (match[7] !== void 0) res.alpha = Math.max(0, Math.min(1, +match[7]));
807
+ return res;
808
+ };
809
+ var parseHslLegacy_default = parseHslLegacy;
810
+ function parseHsl(color, parsed) {
811
+ if (!parsed || parsed[0] !== "hsl" && parsed[0] !== "hsla") return void 0;
812
+ const res = { mode: "hsl" };
813
+ const [, h, s, l, alpha] = parsed;
814
+ if (h.type !== Tok.None) {
815
+ if (h.type === Tok.Percentage) return void 0;
816
+ res.h = h.value;
817
+ }
818
+ if (s.type !== Tok.None) {
819
+ if (s.type === Tok.Hue) return void 0;
820
+ res.s = s.value / 100;
821
+ }
822
+ if (l.type !== Tok.None) {
823
+ if (l.type === Tok.Hue) return void 0;
824
+ res.l = l.value / 100;
825
+ }
826
+ if (alpha.type !== Tok.None) res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
827
+ return res;
828
+ }
829
+ var parseHsl_default = parseHsl;
830
+ const hue = (hues, fn$3) => {
831
+ return hues.map((hue$2, idx, arr) => {
832
+ if (hue$2 === void 0) return hue$2;
833
+ let normalized = normalizeHue_default(hue$2);
834
+ if (idx === 0 || hues[idx - 1] === void 0) return normalized;
835
+ return fn$3(normalized - normalizeHue_default(arr[idx - 1]));
836
+ }).reduce((acc, curr) => {
837
+ if (!acc.length || curr === void 0 || acc[acc.length - 1] === void 0) {
838
+ acc.push(curr);
839
+ return acc;
840
+ }
841
+ acc.push(curr + acc[acc.length - 1]);
842
+ return acc;
843
+ }, []);
844
+ };
845
+ const fixupHueShorter = (arr) => hue(arr, (d) => Math.abs(d) <= 180 ? d : d - 360 * Math.sign(d));
846
+ const differenceHueSaturation = (std, smp) => {
847
+ if (std.h === void 0 || smp.h === void 0 || !std.s || !smp.s) return 0;
848
+ let std_h = normalizeHue_default(std.h);
849
+ let smp_h = normalizeHue_default(smp.h);
850
+ let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);
851
+ return 2 * Math.sqrt(std.s * smp.s) * dH;
852
+ };
853
+ const differenceHueNaive = (std, smp) => {
854
+ if (std.h === void 0 || smp.h === void 0) return 0;
855
+ let std_h = normalizeHue_default(std.h);
856
+ let smp_h = normalizeHue_default(smp.h);
857
+ if (Math.abs(smp_h - std_h) > 180) return std_h - (smp_h - 360 * Math.sign(smp_h - std_h));
858
+ return smp_h - std_h;
859
+ };
860
+ const differenceHueChroma = (std, smp) => {
861
+ if (std.h === void 0 || smp.h === void 0 || !std.c || !smp.c) return 0;
862
+ let std_h = normalizeHue_default(std.h);
863
+ let smp_h = normalizeHue_default(smp.h);
864
+ let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);
865
+ return 2 * Math.sqrt(std.c * smp.c) * dH;
866
+ };
867
+ const averageAngle = (val) => {
868
+ let sum = val.reduce((sum$1, val$1) => {
869
+ if (val$1 !== void 0) {
870
+ let rad = val$1 * Math.PI / 180;
871
+ sum$1.sin += Math.sin(rad);
872
+ sum$1.cos += Math.cos(rad);
873
+ }
874
+ return sum$1;
875
+ }, {
876
+ sin: 0,
877
+ cos: 0
878
+ });
879
+ let angle = Math.atan2(sum.sin, sum.cos) * 180 / Math.PI;
880
+ return angle < 0 ? 360 + angle : angle;
881
+ };
882
+ const definition$12 = {
883
+ mode: "hsl",
884
+ toMode: { rgb: convertHslToRgb },
885
+ fromMode: { rgb: convertRgbToHsl },
886
+ channels: [
887
+ "h",
888
+ "s",
889
+ "l",
890
+ "alpha"
891
+ ],
892
+ ranges: { h: [0, 360] },
893
+ gamut: "rgb",
894
+ parse: [parseHsl_default, parseHslLegacy_default],
895
+ serialize: (c$1) => `hsl(${c$1.h !== void 0 ? c$1.h : "none"} ${c$1.s !== void 0 ? c$1.s * 100 + "%" : "none"} ${c$1.l !== void 0 ? c$1.l * 100 + "%" : "none"}${c$1.alpha < 1 ? ` / ${c$1.alpha}` : ""})`,
896
+ interpolate: {
897
+ h: {
898
+ use: interpolatorLinear,
899
+ fixup: fixupHueShorter
900
+ },
901
+ s: interpolatorLinear,
902
+ l: interpolatorLinear,
903
+ alpha: {
904
+ use: interpolatorLinear,
905
+ fixup: fixupAlpha
906
+ }
907
+ },
908
+ difference: { h: differenceHueSaturation },
909
+ average: { h: averageAngle }
910
+ };
911
+ var definition_default$1 = definition$12;
912
+ function convertHsvToRgb({ h, s, v, alpha }) {
913
+ h = normalizeHue_default(h !== void 0 ? h : 0);
914
+ if (s === void 0) s = 0;
915
+ if (v === void 0) v = 0;
916
+ let f$1 = Math.abs(h / 60 % 2 - 1);
917
+ let res;
918
+ switch (Math.floor(h / 60)) {
919
+ case 0:
920
+ res = {
921
+ r: v,
922
+ g: v * (1 - s * f$1),
923
+ b: v * (1 - s)
924
+ };
925
+ break;
926
+ case 1:
927
+ res = {
928
+ r: v * (1 - s * f$1),
929
+ g: v,
930
+ b: v * (1 - s)
931
+ };
932
+ break;
933
+ case 2:
934
+ res = {
935
+ r: v * (1 - s),
936
+ g: v,
937
+ b: v * (1 - s * f$1)
938
+ };
939
+ break;
940
+ case 3:
941
+ res = {
942
+ r: v * (1 - s),
943
+ g: v * (1 - s * f$1),
944
+ b: v
945
+ };
946
+ break;
947
+ case 4:
948
+ res = {
949
+ r: v * (1 - s * f$1),
950
+ g: v * (1 - s),
951
+ b: v
952
+ };
953
+ break;
954
+ case 5:
955
+ res = {
956
+ r: v,
957
+ g: v * (1 - s),
958
+ b: v * (1 - s * f$1)
959
+ };
960
+ break;
961
+ default: res = {
962
+ r: v * (1 - s),
963
+ g: v * (1 - s),
964
+ b: v * (1 - s)
965
+ };
966
+ }
967
+ res.mode = "rgb";
968
+ if (alpha !== void 0) res.alpha = alpha;
969
+ return res;
970
+ }
971
+ function convertRgbToHsv({ r: r$1, g, b, alpha }) {
972
+ if (r$1 === void 0) r$1 = 0;
973
+ if (g === void 0) g = 0;
974
+ if (b === void 0) b = 0;
975
+ let M = Math.max(r$1, g, b), m = Math.min(r$1, g, b);
976
+ let res = {
977
+ mode: "hsv",
978
+ s: M === 0 ? 0 : 1 - m / M,
979
+ v: M
980
+ };
981
+ if (M - m !== 0) res.h = (M === r$1 ? (g - b) / (M - m) + (g < b) * 6 : M === g ? (b - r$1) / (M - m) + 2 : (r$1 - g) / (M - m) + 4) * 60;
982
+ if (alpha !== void 0) res.alpha = alpha;
983
+ return res;
984
+ }
985
+ const definition$11 = {
986
+ mode: "hsv",
987
+ toMode: { rgb: convertHsvToRgb },
988
+ parse: ["--hsv"],
989
+ serialize: "--hsv",
990
+ fromMode: { rgb: convertRgbToHsv },
991
+ channels: [
992
+ "h",
993
+ "s",
994
+ "v",
995
+ "alpha"
996
+ ],
997
+ ranges: { h: [0, 360] },
998
+ gamut: "rgb",
999
+ interpolate: {
1000
+ h: {
1001
+ use: interpolatorLinear,
1002
+ fixup: fixupHueShorter
1003
+ },
1004
+ s: interpolatorLinear,
1005
+ v: interpolatorLinear,
1006
+ alpha: {
1007
+ use: interpolatorLinear,
1008
+ fixup: fixupAlpha
1009
+ }
1010
+ },
1011
+ difference: { h: differenceHueSaturation },
1012
+ average: { h: averageAngle }
1013
+ };
1014
+ var definition_default$2 = definition$11;
1015
+ function convertHwbToRgb({ h, w, b, alpha }) {
1016
+ if (w === void 0) w = 0;
1017
+ if (b === void 0) b = 0;
1018
+ if (w + b > 1) {
1019
+ let s = w + b;
1020
+ w /= s;
1021
+ b /= s;
1022
+ }
1023
+ return convertHsvToRgb({
1024
+ h,
1025
+ s: b === 1 ? 1 : 1 - w / (1 - b),
1026
+ v: 1 - b,
1027
+ alpha
1028
+ });
1029
+ }
1030
+ function convertRgbToHwb(rgba) {
1031
+ let hsv = convertRgbToHsv(rgba);
1032
+ if (hsv === void 0) return void 0;
1033
+ let s = hsv.s !== void 0 ? hsv.s : 0;
1034
+ let v = hsv.v !== void 0 ? hsv.v : 0;
1035
+ let res = {
1036
+ mode: "hwb",
1037
+ w: (1 - s) * v,
1038
+ b: 1 - v
1039
+ };
1040
+ if (hsv.h !== void 0) res.h = hsv.h;
1041
+ if (hsv.alpha !== void 0) res.alpha = hsv.alpha;
1042
+ return res;
1043
+ }
1044
+ function ParseHwb(color, parsed) {
1045
+ if (!parsed || parsed[0] !== "hwb") return void 0;
1046
+ const res = { mode: "hwb" };
1047
+ const [, h, w, b, alpha] = parsed;
1048
+ if (h.type !== Tok.None) {
1049
+ if (h.type === Tok.Percentage) return void 0;
1050
+ res.h = h.value;
1051
+ }
1052
+ if (w.type !== Tok.None) {
1053
+ if (w.type === Tok.Hue) return void 0;
1054
+ res.w = w.value / 100;
1055
+ }
1056
+ if (b.type !== Tok.None) {
1057
+ if (b.type === Tok.Hue) return void 0;
1058
+ res.b = b.value / 100;
1059
+ }
1060
+ if (alpha.type !== Tok.None) res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
1061
+ return res;
1062
+ }
1063
+ var parseHwb_default = ParseHwb;
1064
+ const definition$10 = {
1065
+ mode: "hwb",
1066
+ toMode: { rgb: convertHwbToRgb },
1067
+ fromMode: { rgb: convertRgbToHwb },
1068
+ channels: [
1069
+ "h",
1070
+ "w",
1071
+ "b",
1072
+ "alpha"
1073
+ ],
1074
+ ranges: { h: [0, 360] },
1075
+ gamut: "rgb",
1076
+ parse: [parseHwb_default],
1077
+ serialize: (c$1) => `hwb(${c$1.h !== void 0 ? c$1.h : "none"} ${c$1.w !== void 0 ? c$1.w * 100 + "%" : "none"} ${c$1.b !== void 0 ? c$1.b * 100 + "%" : "none"}${c$1.alpha < 1 ? ` / ${c$1.alpha}` : ""})`,
1078
+ interpolate: {
1079
+ h: {
1080
+ use: interpolatorLinear,
1081
+ fixup: fixupHueShorter
1082
+ },
1083
+ w: interpolatorLinear,
1084
+ b: interpolatorLinear,
1085
+ alpha: {
1086
+ use: interpolatorLinear,
1087
+ fixup: fixupAlpha
1088
+ }
1089
+ },
1090
+ difference: { h: differenceHueNaive },
1091
+ average: { h: averageAngle }
1092
+ };
1093
+ var definition_default$3 = definition$10;
1094
+ const k = Math.pow(29, 3) / Math.pow(3, 3);
1095
+ const e = Math.pow(6, 3) / Math.pow(29, 3);
1096
+ const D50 = {
1097
+ X: .3457 / .3585,
1098
+ Y: 1,
1099
+ Z: .2958 / .3585
1100
+ };
1101
+ const D65 = {
1102
+ X: .3127 / .329,
1103
+ Y: 1,
1104
+ Z: .3583 / .329
1105
+ };
1106
+ const k$1 = Math.pow(29, 3) / Math.pow(3, 3);
1107
+ const e$1 = Math.pow(6, 3) / Math.pow(29, 3);
1108
+ let fn = (v) => Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k;
1109
+ const convertLabToXyz50 = ({ l, a, b, alpha }) => {
1110
+ if (l === void 0) l = 0;
1111
+ if (a === void 0) a = 0;
1112
+ if (b === void 0) b = 0;
1113
+ let fy = (l + 16) / 116;
1114
+ let fx = a / 500 + fy;
1115
+ let fz = fy - b / 200;
1116
+ let res = {
1117
+ mode: "xyz50",
1118
+ x: fn(fx) * D50.X,
1119
+ y: fn(fy) * D50.Y,
1120
+ z: fn(fz) * D50.Z
1121
+ };
1122
+ if (alpha !== void 0) res.alpha = alpha;
1123
+ return res;
1124
+ };
1125
+ var convertLabToXyz50_default = convertLabToXyz50;
1126
+ const convertXyz50ToRgb = ({ x, y, z, alpha }) => {
1127
+ if (x === void 0) x = 0;
1128
+ if (y === void 0) y = 0;
1129
+ if (z === void 0) z = 0;
1130
+ let res = convertLrgbToRgb_default({
1131
+ r: x * 3.1341359569958707 - y * 1.6173863321612538 - .4906619460083532 * z,
1132
+ g: x * -.978795502912089 + y * 1.916254567259524 + .03344273116131949 * z,
1133
+ b: x * .07195537988411677 - y * .2289768264158322 + 1.405386058324125 * z
1134
+ });
1135
+ if (alpha !== void 0) res.alpha = alpha;
1136
+ return res;
1137
+ };
1138
+ var convertXyz50ToRgb_default = convertXyz50ToRgb;
1139
+ const convertLabToRgb = (lab) => convertXyz50ToRgb_default(convertLabToXyz50_default(lab));
1140
+ var convertLabToRgb_default = convertLabToRgb;
1141
+ const convertRgbToXyz50 = (rgb$2) => {
1142
+ let { r: r$1, g, b, alpha } = convertRgbToLrgb_default(rgb$2);
1143
+ let res = {
1144
+ mode: "xyz50",
1145
+ x: .436065742824811 * r$1 + .3851514688337912 * g + .14307845442264197 * b,
1146
+ y: .22249319175623702 * r$1 + .7168870538238823 * g + .06061979053616537 * b,
1147
+ z: .013923904500943465 * r$1 + .09708128566574634 * g + .7140993584005155 * b
1148
+ };
1149
+ if (alpha !== void 0) res.alpha = alpha;
1150
+ return res;
1151
+ };
1152
+ var convertRgbToXyz50_default = convertRgbToXyz50;
1153
+ const f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;
1154
+ const convertXyz50ToLab = ({ x, y, z, alpha }) => {
1155
+ if (x === void 0) x = 0;
1156
+ if (y === void 0) y = 0;
1157
+ if (z === void 0) z = 0;
1158
+ let f0 = f(x / D50.X);
1159
+ let f1 = f(y / D50.Y);
1160
+ let f2 = f(z / D50.Z);
1161
+ let res = {
1162
+ mode: "lab",
1163
+ l: 116 * f1 - 16,
1164
+ a: 500 * (f0 - f1),
1165
+ b: 200 * (f1 - f2)
1166
+ };
1167
+ if (alpha !== void 0) res.alpha = alpha;
1168
+ return res;
1169
+ };
1170
+ var convertXyz50ToLab_default = convertXyz50ToLab;
1171
+ const convertRgbToLab = (rgb$2) => {
1172
+ let res = convertXyz50ToLab_default(convertRgbToXyz50_default(rgb$2));
1173
+ if (rgb$2.r === rgb$2.b && rgb$2.b === rgb$2.g) res.a = res.b = 0;
1174
+ return res;
1175
+ };
1176
+ var convertRgbToLab_default = convertRgbToLab;
1177
+ function parseLab(color, parsed) {
1178
+ if (!parsed || parsed[0] !== "lab") return void 0;
1179
+ const res = { mode: "lab" };
1180
+ const [, l, a, b, alpha] = parsed;
1181
+ if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) return void 0;
1182
+ if (l.type !== Tok.None) res.l = Math.min(Math.max(0, l.value), 100);
1183
+ if (a.type !== Tok.None) res.a = a.type === Tok.Number ? a.value : a.value * 125 / 100;
1184
+ if (b.type !== Tok.None) res.b = b.type === Tok.Number ? b.value : b.value * 125 / 100;
1185
+ if (alpha.type !== Tok.None) res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
1186
+ return res;
1187
+ }
1188
+ var parseLab_default = parseLab;
1189
+ const definition$9 = {
1190
+ mode: "lab",
1191
+ toMode: {
1192
+ xyz50: convertLabToXyz50_default,
1193
+ rgb: convertLabToRgb_default
1194
+ },
1195
+ fromMode: {
1196
+ xyz50: convertXyz50ToLab_default,
1197
+ rgb: convertRgbToLab_default
1198
+ },
1199
+ channels: [
1200
+ "l",
1201
+ "a",
1202
+ "b",
1203
+ "alpha"
1204
+ ],
1205
+ ranges: {
1206
+ l: [0, 100],
1207
+ a: [-100, 100],
1208
+ b: [-100, 100]
1209
+ },
1210
+ parse: [parseLab_default],
1211
+ serialize: (c$1) => `lab(${c$1.l !== void 0 ? c$1.l : "none"} ${c$1.a !== void 0 ? c$1.a : "none"} ${c$1.b !== void 0 ? c$1.b : "none"}${c$1.alpha < 1 ? ` / ${c$1.alpha}` : ""})`,
1212
+ interpolate: {
1213
+ l: interpolatorLinear,
1214
+ a: interpolatorLinear,
1215
+ b: interpolatorLinear,
1216
+ alpha: {
1217
+ use: interpolatorLinear,
1218
+ fixup: fixupAlpha
1219
+ }
1220
+ }
1221
+ };
1222
+ var definition_default$4 = definition$9;
1223
+ const convertLabToLch = ({ l, a, b, alpha }, mode = "lch") => {
1224
+ if (a === void 0) a = 0;
1225
+ if (b === void 0) b = 0;
1226
+ let c$1 = Math.sqrt(a * a + b * b);
1227
+ let res = {
1228
+ mode,
1229
+ l,
1230
+ c: c$1
1231
+ };
1232
+ if (c$1) res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);
1233
+ if (alpha !== void 0) res.alpha = alpha;
1234
+ return res;
1235
+ };
1236
+ var convertLabToLch_default = convertLabToLch;
1237
+ const convertLchToLab = ({ l, c: c$1, h, alpha }, mode = "lab") => {
1238
+ if (h === void 0) h = 0;
1239
+ let res = {
1240
+ mode,
1241
+ l,
1242
+ a: c$1 ? c$1 * Math.cos(h / 180 * Math.PI) : 0,
1243
+ b: c$1 ? c$1 * Math.sin(h / 180 * Math.PI) : 0
1244
+ };
1245
+ if (alpha !== void 0) res.alpha = alpha;
1246
+ return res;
1247
+ };
1248
+ var convertLchToLab_default = convertLchToLab;
1249
+ function parseLch(color, parsed) {
1250
+ if (!parsed || parsed[0] !== "lch") return void 0;
1251
+ const res = { mode: "lch" };
1252
+ const [, l, c$1, h, alpha] = parsed;
1253
+ if (l.type !== Tok.None) {
1254
+ if (l.type === Tok.Hue) return void 0;
1255
+ res.l = Math.min(Math.max(0, l.value), 100);
1256
+ }
1257
+ if (c$1.type !== Tok.None) res.c = Math.max(0, c$1.type === Tok.Number ? c$1.value : c$1.value * 150 / 100);
1258
+ if (h.type !== Tok.None) {
1259
+ if (h.type === Tok.Percentage) return void 0;
1260
+ res.h = h.value;
1261
+ }
1262
+ if (alpha.type !== Tok.None) res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
1263
+ return res;
1264
+ }
1265
+ var parseLch_default = parseLch;
1266
+ const definition$8 = {
1267
+ mode: "lch",
1268
+ toMode: {
1269
+ lab: convertLchToLab_default,
1270
+ rgb: (c$1) => convertLabToRgb_default(convertLchToLab_default(c$1))
1271
+ },
1272
+ fromMode: {
1273
+ rgb: (c$1) => convertLabToLch_default(convertRgbToLab_default(c$1)),
1274
+ lab: convertLabToLch_default
1275
+ },
1276
+ channels: [
1277
+ "l",
1278
+ "c",
1279
+ "h",
1280
+ "alpha"
1281
+ ],
1282
+ ranges: {
1283
+ l: [0, 100],
1284
+ c: [0, 150],
1285
+ h: [0, 360]
1286
+ },
1287
+ parse: [parseLch_default],
1288
+ serialize: (c$1) => `lch(${c$1.l !== void 0 ? c$1.l : "none"} ${c$1.c !== void 0 ? c$1.c : "none"} ${c$1.h !== void 0 ? c$1.h : "none"}${c$1.alpha < 1 ? ` / ${c$1.alpha}` : ""})`,
1289
+ interpolate: {
1290
+ h: {
1291
+ use: interpolatorLinear,
1292
+ fixup: fixupHueShorter
1293
+ },
1294
+ c: interpolatorLinear,
1295
+ l: interpolatorLinear,
1296
+ alpha: {
1297
+ use: interpolatorLinear,
1298
+ fixup: fixupAlpha
1299
+ }
1300
+ },
1301
+ difference: { h: differenceHueChroma },
1302
+ average: { h: averageAngle }
1303
+ };
1304
+ var definition_default$5 = definition$8;
1305
+ const definition$7 = {
1306
+ ...definition_default$12,
1307
+ mode: "lrgb",
1308
+ toMode: { rgb: convertLrgbToRgb_default },
1309
+ fromMode: { rgb: convertRgbToLrgb_default },
1310
+ parse: ["srgb-linear"],
1311
+ serialize: "srgb-linear"
1312
+ };
1313
+ var definition_default$6 = definition$7;
1314
+ const convertOklabToLrgb = ({ l, a, b, alpha }) => {
1315
+ if (l === void 0) l = 0;
1316
+ if (a === void 0) a = 0;
1317
+ if (b === void 0) b = 0;
1318
+ let L = Math.pow(l * .9999999984505198 + .39633779217376786 * a + .2158037580607588 * b, 3);
1319
+ let M = Math.pow(l * 1.0000000088817609 - .10556134232365635 * a - .06385417477170591 * b, 3);
1320
+ let S = Math.pow(l * 1.0000000546724108 - .08948418209496575 * a - 1.2914855378640917 * b, 3);
1321
+ let res = {
1322
+ mode: "lrgb",
1323
+ r: 4.076741661347994 * L - 3.307711590408193 * M + .230969928729428 * S,
1324
+ g: -1.2684380040921763 * L + 2.6097574006633715 * M - .3413193963102197 * S,
1325
+ b: -.004196086541837188 * L - .7034186144594493 * M + 1.7076147009309444 * S
1326
+ };
1327
+ if (alpha !== void 0) res.alpha = alpha;
1328
+ return res;
1329
+ };
1330
+ var convertOklabToLrgb_default = convertOklabToLrgb;
1331
+ const convertLrgbToOklab = ({ r: r$1, g, b, alpha }) => {
1332
+ if (r$1 === void 0) r$1 = 0;
1333
+ if (g === void 0) g = 0;
1334
+ if (b === void 0) b = 0;
1335
+ let L = Math.cbrt(.41222147079999993 * r$1 + .5363325363 * g + .0514459929 * b);
1336
+ let M = Math.cbrt(.2119034981999999 * r$1 + .6806995450999999 * g + .1073969566 * b);
1337
+ let S = Math.cbrt(.08830246189999998 * r$1 + .2817188376 * g + .6299787005000002 * b);
1338
+ let res = {
1339
+ mode: "oklab",
1340
+ l: .2104542553 * L + .793617785 * M - .0040720468 * S,
1341
+ a: 1.9779984951 * L - 2.428592205 * M + .4505937099 * S,
1342
+ b: .0259040371 * L + .7827717662 * M - .808675766 * S
1343
+ };
1344
+ if (alpha !== void 0) res.alpha = alpha;
1345
+ return res;
1346
+ };
1347
+ var convertLrgbToOklab_default = convertLrgbToOklab;
1348
+ const convertRgbToOklab = (rgb$2) => {
1349
+ let res = convertLrgbToOklab_default(convertRgbToLrgb_default(rgb$2));
1350
+ if (rgb$2.r === rgb$2.b && rgb$2.b === rgb$2.g) res.a = res.b = 0;
1351
+ return res;
1352
+ };
1353
+ var convertRgbToOklab_default = convertRgbToOklab;
1354
+ const convertOklabToRgb = (c$1) => convertLrgbToRgb_default(convertOklabToLrgb_default(c$1));
1355
+ var convertOklabToRgb_default = convertOklabToRgb;
1356
+ function parseOklab(color, parsed) {
1357
+ if (!parsed || parsed[0] !== "oklab") return void 0;
1358
+ const res = { mode: "oklab" };
1359
+ const [, l, a, b, alpha] = parsed;
1360
+ if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) return void 0;
1361
+ if (l.type !== Tok.None) res.l = Math.min(Math.max(0, l.type === Tok.Number ? l.value : l.value / 100), 1);
1362
+ if (a.type !== Tok.None) res.a = a.type === Tok.Number ? a.value : a.value * .4 / 100;
1363
+ if (b.type !== Tok.None) res.b = b.type === Tok.Number ? b.value : b.value * .4 / 100;
1364
+ if (alpha.type !== Tok.None) res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
1365
+ return res;
1366
+ }
1367
+ var parseOklab_default = parseOklab;
1368
+ const definition$6 = {
1369
+ ...definition_default$4,
1370
+ mode: "oklab",
1371
+ toMode: {
1372
+ lrgb: convertOklabToLrgb_default,
1373
+ rgb: convertOklabToRgb_default
1374
+ },
1375
+ fromMode: {
1376
+ lrgb: convertLrgbToOklab_default,
1377
+ rgb: convertRgbToOklab_default
1378
+ },
1379
+ ranges: {
1380
+ l: [0, 1],
1381
+ a: [-.4, .4],
1382
+ b: [-.4, .4]
1383
+ },
1384
+ parse: [parseOklab_default],
1385
+ serialize: (c$1) => `oklab(${c$1.l !== void 0 ? c$1.l : "none"} ${c$1.a !== void 0 ? c$1.a : "none"} ${c$1.b !== void 0 ? c$1.b : "none"}${c$1.alpha < 1 ? ` / ${c$1.alpha}` : ""})`
1386
+ };
1387
+ var definition_default$7 = definition$6;
1388
+ function parseOklch(color, parsed) {
1389
+ if (!parsed || parsed[0] !== "oklch") return void 0;
1390
+ const res = { mode: "oklch" };
1391
+ const [, l, c$1, h, alpha] = parsed;
1392
+ if (l.type !== Tok.None) {
1393
+ if (l.type === Tok.Hue) return void 0;
1394
+ res.l = Math.min(Math.max(0, l.type === Tok.Number ? l.value : l.value / 100), 1);
1395
+ }
1396
+ if (c$1.type !== Tok.None) res.c = Math.max(0, c$1.type === Tok.Number ? c$1.value : c$1.value * .4 / 100);
1397
+ if (h.type !== Tok.None) {
1398
+ if (h.type === Tok.Percentage) return void 0;
1399
+ res.h = h.value;
1400
+ }
1401
+ if (alpha.type !== Tok.None) res.alpha = Math.min(1, Math.max(0, alpha.type === Tok.Number ? alpha.value : alpha.value / 100));
1402
+ return res;
1403
+ }
1404
+ var parseOklch_default = parseOklch;
1405
+ const definition$5 = {
1406
+ ...definition_default$5,
1407
+ mode: "oklch",
1408
+ toMode: {
1409
+ oklab: (c$1) => convertLchToLab_default(c$1, "oklab"),
1410
+ rgb: (c$1) => convertOklabToRgb_default(convertLchToLab_default(c$1, "oklab"))
1411
+ },
1412
+ fromMode: {
1413
+ rgb: (c$1) => convertLabToLch_default(convertRgbToOklab_default(c$1), "oklch"),
1414
+ oklab: (c$1) => convertLabToLch_default(c$1, "oklch")
1415
+ },
1416
+ parse: [parseOklch_default],
1417
+ serialize: (c$1) => `oklch(${c$1.l !== void 0 ? c$1.l : "none"} ${c$1.c !== void 0 ? c$1.c : "none"} ${c$1.h !== void 0 ? c$1.h : "none"}${c$1.alpha < 1 ? ` / ${c$1.alpha}` : ""})`,
1418
+ ranges: {
1419
+ l: [0, 1],
1420
+ c: [0, .4],
1421
+ h: [0, 360]
1422
+ }
1423
+ };
1424
+ var definition_default$8 = definition$5;
1425
+ const convertP3ToXyz65 = (rgb$2) => {
1426
+ let { r: r$1, g, b, alpha } = convertRgbToLrgb_default(rgb$2);
1427
+ let res = {
1428
+ mode: "xyz65",
1429
+ x: .486570948648216 * r$1 + .265667693169093 * g + .1982172852343625 * b,
1430
+ y: .2289745640697487 * r$1 + .6917385218365062 * g + .079286914093745 * b,
1431
+ z: 0 * r$1 + .0451133818589026 * g + 1.043944368900976 * b
1432
+ };
1433
+ if (alpha !== void 0) res.alpha = alpha;
1434
+ return res;
1435
+ };
1436
+ var convertP3ToXyz65_default = convertP3ToXyz65;
1437
+ const convertXyz65ToP3 = ({ x, y, z, alpha }) => {
1438
+ if (x === void 0) x = 0;
1439
+ if (y === void 0) y = 0;
1440
+ if (z === void 0) z = 0;
1441
+ let res = convertLrgbToRgb_default({
1442
+ r: x * 2.4934969119414263 - y * .9313836179191242 - .402710784450717 * z,
1443
+ g: x * -.8294889695615749 + y * 1.7626640603183465 + .0236246858419436 * z,
1444
+ b: x * .0358458302437845 - y * .0761723892680418 + .9568845240076871 * z
1445
+ }, "p3");
1446
+ if (alpha !== void 0) res.alpha = alpha;
1447
+ return res;
1448
+ };
1449
+ var convertXyz65ToP3_default = convertXyz65ToP3;
1450
+ const definition$4 = {
1451
+ ...definition_default$12,
1452
+ mode: "p3",
1453
+ parse: ["display-p3"],
1454
+ serialize: "display-p3",
1455
+ fromMode: {
1456
+ rgb: (color) => convertXyz65ToP3_default(convertRgbToXyz65_default(color)),
1457
+ xyz65: convertXyz65ToP3_default
1458
+ },
1459
+ toMode: {
1460
+ rgb: (color) => convertXyz65ToRgb_default(convertP3ToXyz65_default(color)),
1461
+ xyz65: convertP3ToXyz65_default
1462
+ }
1463
+ };
1464
+ var definition_default$9 = definition$4;
1465
+ const gamma$1 = (v) => {
1466
+ let abs = Math.abs(v);
1467
+ if (abs >= 1 / 512) return Math.sign(v) * Math.pow(abs, 1 / 1.8);
1468
+ return 16 * v;
1469
+ };
1470
+ const convertXyz50ToProphoto = ({ x, y, z, alpha }) => {
1471
+ if (x === void 0) x = 0;
1472
+ if (y === void 0) y = 0;
1473
+ if (z === void 0) z = 0;
1474
+ let res = {
1475
+ mode: "prophoto",
1476
+ r: gamma$1(x * 1.3457868816471585 - y * .2555720873797946 - .0511018649755453 * z),
1477
+ g: gamma$1(x * -.5446307051249019 + y * 1.5082477428451466 + .0205274474364214 * z),
1478
+ b: gamma$1(x * 0 + y * 0 + 1.2119675456389452 * z)
1479
+ };
1480
+ if (alpha !== void 0) res.alpha = alpha;
1481
+ return res;
1482
+ };
1483
+ var convertXyz50ToProphoto_default = convertXyz50ToProphoto;
1484
+ const linearize$1 = (v = 0) => {
1485
+ let abs = Math.abs(v);
1486
+ if (abs >= 16 / 512) return Math.sign(v) * Math.pow(abs, 1.8);
1487
+ return v / 16;
1488
+ };
1489
+ const convertProphotoToXyz50 = (prophoto) => {
1490
+ let r$1 = linearize$1(prophoto.r);
1491
+ let g = linearize$1(prophoto.g);
1492
+ let b = linearize$1(prophoto.b);
1493
+ let res = {
1494
+ mode: "xyz50",
1495
+ x: .7977666449006423 * r$1 + .1351812974005331 * g + .0313477341283922 * b,
1496
+ y: .2880748288194013 * r$1 + .7118352342418731 * g + 899369387256e-16 * b,
1497
+ z: 0 * r$1 + 0 * g + .8251046025104602 * b
1498
+ };
1499
+ if (prophoto.alpha !== void 0) res.alpha = prophoto.alpha;
1500
+ return res;
1501
+ };
1502
+ var convertProphotoToXyz50_default = convertProphotoToXyz50;
1503
+ const definition$3 = {
1504
+ ...definition_default$12,
1505
+ mode: "prophoto",
1506
+ parse: ["prophoto-rgb"],
1507
+ serialize: "prophoto-rgb",
1508
+ fromMode: {
1509
+ xyz50: convertXyz50ToProphoto_default,
1510
+ rgb: (color) => convertXyz50ToProphoto_default(convertRgbToXyz50_default(color))
1511
+ },
1512
+ toMode: {
1513
+ xyz50: convertProphotoToXyz50_default,
1514
+ rgb: (color) => convertXyz50ToRgb_default(convertProphotoToXyz50_default(color))
1515
+ }
1516
+ };
1517
+ var definition_default$10 = definition$3;
1518
+ const α$1 = 1.09929682680944;
1519
+ const β$1 = .018053968510807;
1520
+ const gamma = (v) => {
1521
+ const abs = Math.abs(v);
1522
+ if (abs > β$1) return (Math.sign(v) || 1) * (α$1 * Math.pow(abs, .45) - (α$1 - 1));
1523
+ return 4.5 * v;
1524
+ };
1525
+ const convertXyz65ToRec2020 = ({ x, y, z, alpha }) => {
1526
+ if (x === void 0) x = 0;
1527
+ if (y === void 0) y = 0;
1528
+ if (z === void 0) z = 0;
1529
+ let res = {
1530
+ mode: "rec2020",
1531
+ r: gamma(x * 1.7166511879712683 - y * .3556707837763925 - .2533662813736599 * z),
1532
+ g: gamma(x * -.6666843518324893 + y * 1.6164812366349395 + .0157685458139111 * z),
1533
+ b: gamma(x * .0176398574453108 - y * .0427706132578085 + .9421031212354739 * z)
1534
+ };
1535
+ if (alpha !== void 0) res.alpha = alpha;
1536
+ return res;
1537
+ };
1538
+ var convertXyz65ToRec2020_default = convertXyz65ToRec2020;
1539
+ const α = 1.09929682680944;
1540
+ const β = .018053968510807;
1541
+ const linearize = (v = 0) => {
1542
+ let abs = Math.abs(v);
1543
+ if (abs < β * 4.5) return v / 4.5;
1544
+ return (Math.sign(v) || 1) * Math.pow((abs + α - 1) / α, 1 / .45);
1545
+ };
1546
+ const convertRec2020ToXyz65 = (rec2020) => {
1547
+ let r$1 = linearize(rec2020.r);
1548
+ let g = linearize(rec2020.g);
1549
+ let b = linearize(rec2020.b);
1550
+ let res = {
1551
+ mode: "xyz65",
1552
+ x: .6369580483012911 * r$1 + .1446169035862083 * g + .1688809751641721 * b,
1553
+ y: .262700212011267 * r$1 + .6779980715188708 * g + .059301716469862 * b,
1554
+ z: 0 * r$1 + .0280726930490874 * g + 1.0609850577107909 * b
1555
+ };
1556
+ if (rec2020.alpha !== void 0) res.alpha = rec2020.alpha;
1557
+ return res;
1558
+ };
1559
+ var convertRec2020ToXyz65_default = convertRec2020ToXyz65;
1560
+ const definition$2 = {
1561
+ ...definition_default$12,
1562
+ mode: "rec2020",
1563
+ fromMode: {
1564
+ xyz65: convertXyz65ToRec2020_default,
1565
+ rgb: (color) => convertXyz65ToRec2020_default(convertRgbToXyz65_default(color))
1566
+ },
1567
+ toMode: {
1568
+ xyz65: convertRec2020ToXyz65_default,
1569
+ rgb: (color) => convertXyz65ToRgb_default(convertRec2020ToXyz65_default(color))
1570
+ },
1571
+ parse: ["rec2020"],
1572
+ serialize: "rec2020"
1573
+ };
1574
+ var definition_default$11 = definition$2;
1575
+ const definition$1 = {
1576
+ mode: "xyz50",
1577
+ parse: ["xyz-d50"],
1578
+ serialize: "xyz-d50",
1579
+ toMode: {
1580
+ rgb: convertXyz50ToRgb_default,
1581
+ lab: convertXyz50ToLab_default
1582
+ },
1583
+ fromMode: {
1584
+ rgb: convertRgbToXyz50_default,
1585
+ lab: convertLabToXyz50_default
1586
+ },
1587
+ channels: [
1588
+ "x",
1589
+ "y",
1590
+ "z",
1591
+ "alpha"
1592
+ ],
1593
+ ranges: {
1594
+ x: [0, .964],
1595
+ y: [0, .999],
1596
+ z: [0, .825]
1597
+ },
1598
+ interpolate: {
1599
+ x: interpolatorLinear,
1600
+ y: interpolatorLinear,
1601
+ z: interpolatorLinear,
1602
+ alpha: {
1603
+ use: interpolatorLinear,
1604
+ fixup: fixupAlpha
1605
+ }
1606
+ }
1607
+ };
1608
+ var definition_default$13 = definition$1;
1609
+ const convertXyz65ToXyz50 = (xyz65) => {
1610
+ let { x, y, z, alpha } = xyz65;
1611
+ if (x === void 0) x = 0;
1612
+ if (y === void 0) y = 0;
1613
+ if (z === void 0) z = 0;
1614
+ let res = {
1615
+ mode: "xyz50",
1616
+ x: 1.0479298208405488 * x + .0229467933410191 * y - .0501922295431356 * z,
1617
+ y: .0296278156881593 * x + .990434484573249 * y - .0170738250293851 * z,
1618
+ z: -.0092430581525912 * x + .0150551448965779 * y + .7518742899580008 * z
1619
+ };
1620
+ if (alpha !== void 0) res.alpha = alpha;
1621
+ return res;
1622
+ };
1623
+ var convertXyz65ToXyz50_default = convertXyz65ToXyz50;
1624
+ const convertXyz50ToXyz65 = (xyz50) => {
1625
+ let { x, y, z, alpha } = xyz50;
1626
+ if (x === void 0) x = 0;
1627
+ if (y === void 0) y = 0;
1628
+ if (z === void 0) z = 0;
1629
+ let res = {
1630
+ mode: "xyz65",
1631
+ x: .9554734527042182 * x - .0230985368742614 * y + .0632593086610217 * z,
1632
+ y: -.0283697069632081 * x + 1.0099954580058226 * y + .021041398966943 * z,
1633
+ z: .0123140016883199 * x - .0205076964334779 * y + 1.3303659366080753 * z
1634
+ };
1635
+ if (alpha !== void 0) res.alpha = alpha;
1636
+ return res;
1637
+ };
1638
+ var convertXyz50ToXyz65_default = convertXyz50ToXyz65;
1639
+ const definition = {
1640
+ mode: "xyz65",
1641
+ toMode: {
1642
+ rgb: convertXyz65ToRgb_default,
1643
+ xyz50: convertXyz65ToXyz50_default
1644
+ },
1645
+ fromMode: {
1646
+ rgb: convertRgbToXyz65_default,
1647
+ xyz50: convertXyz50ToXyz65_default
1648
+ },
1649
+ ranges: {
1650
+ x: [0, .95],
1651
+ y: [0, 1],
1652
+ z: [0, 1.088]
1653
+ },
1654
+ channels: [
1655
+ "x",
1656
+ "y",
1657
+ "z",
1658
+ "alpha"
1659
+ ],
1660
+ parse: ["xyz", "xyz-d65"],
1661
+ serialize: "xyz-d65",
1662
+ interpolate: {
1663
+ x: interpolatorLinear,
1664
+ y: interpolatorLinear,
1665
+ z: interpolatorLinear,
1666
+ alpha: {
1667
+ use: interpolatorLinear,
1668
+ fixup: fixupAlpha
1669
+ }
1670
+ }
1671
+ };
1672
+ var definition_default$14 = definition;
1673
+ const r = (value, precision) => Math.round(value * (precision = Math.pow(10, precision))) / precision;
1674
+ const round = (precision = 4) => (value) => typeof value === "number" ? r(value, precision) : value;
1675
+ var round_default = round;
1676
+ let twoDecimals = round_default(2);
1677
+ const rgb$1 = converter_default("rgb");
1678
+ const hsl = converter_default("hsl");
1679
+ const rgb = converter_default("rgb");
1680
+ const converters = {
1681
+ a98: useMode(definition_default),
1682
+ hsl: useMode(definition_default$1),
1683
+ hsv: useMode(definition_default$2),
1684
+ hwb: useMode(definition_default$3),
1685
+ lab: useMode(definition_default$4),
1686
+ lch: useMode(definition_default$5),
1687
+ lrgb: useMode(definition_default$6),
1688
+ oklab: useMode(definition_default$7),
1689
+ oklch: useMode(definition_default$8),
1690
+ p3: useMode(definition_default$9),
1691
+ prophoto: useMode(definition_default$10),
1692
+ rec2020: useMode(definition_default$11),
1693
+ rgb: useMode(definition_default$12),
1694
+ xyz50: useMode(definition_default$13),
1695
+ xyz65: useMode(definition_default$14)
1696
+ };
1697
+ const FORMAT_ID$1 = "css";
1698
+
1699
+ //#endregion
1700
+ //#region src/lib.ts
1701
+ /** Flatten an arbitrarily-nested object */
1702
+ function flattenThemeObj(themeObj) {
1703
+ const result = [];
1704
+ function traverse(obj, path) {
1705
+ for (const [key, value] of Object.entries(obj)) {
1706
+ const newPath = [...path, key];
1707
+ if (typeof value === "string" || Array.isArray(value)) {
1708
+ if (Array.isArray(value) && (value.length === 0 || value.some((v) => typeof v !== "string"))) throw new Error(`Invalid value at path "${newPath.join(".")}": expected a string or an array of strings, but got ${JSON.stringify(value)}`);
1709
+ result.push({
1710
+ path: newPath,
1711
+ value
1712
+ });
1713
+ } else if (typeof value === "object" && value !== null) traverse(value, newPath);
1714
+ }
1715
+ }
1716
+ traverse(themeObj, []);
1717
+ return result;
1718
+ }
1719
+
1720
+ //#endregion
1721
+ //#region src/index.ts
1722
+ const FORMAT_ID = "tailwind";
1723
+ function pluginTailwind(options) {
1724
+ const filename = options?.filename ?? options?.fileName ?? "tailwind-theme.css";
1725
+ return {
1726
+ name: "@terrazzo/plugin-tailwind",
1727
+ enforce: "post",
1728
+ config(config) {
1729
+ if (!config.plugins.some((p) => p.name === "@terrazzo/plugin-css")) throw new Error("@terrazzo/plugin-css missing! Please install and add to the plugins array to use the Tailwind plugin.");
1730
+ if (!options || !options.theme) throw new Error("Missing Tailwind `theme` option.");
1731
+ },
1732
+ async transform({ getTransforms, setTransform }) {
1733
+ const variants = [{
1734
+ variant: ".",
1735
+ mode: "."
1736
+ }, ...options?.modeVariants ?? []];
1737
+ for (const { variant, mode } of variants) {
1738
+ const flatTheme = flattenThemeObj(options.theme);
1739
+ for (const { path, value } of flatTheme) for (const token of getTransforms({
1740
+ format: FORMAT_ID$1,
1741
+ id: value,
1742
+ mode
1743
+ })) {
1744
+ let relName = token.id.split(".").at(-1);
1745
+ for (const subgroup of [...Array.isArray(value) ? value : [value]]) {
1746
+ const match = subgroup.replace(/\*.*/, "");
1747
+ relName = token.id.replace(match, "");
1748
+ }
1749
+ setTransform(token.id, {
1750
+ format: FORMAT_ID,
1751
+ localID: `--${path.join("-")}-${relName.replace(/\./g, "-")}`,
1752
+ value: typeof token.value === "object" ? token.value["."] : token.value,
1753
+ mode: variant
1754
+ });
1755
+ }
1756
+ }
1757
+ },
1758
+ async build({ getTransforms, outputFile }) {
1759
+ const output = ["@import \"tailwind\";", ""];
1760
+ const variants = { ".": [] };
1761
+ for (const token of getTransforms({ format: FORMAT_ID })) {
1762
+ const { localID, value, mode } = token;
1763
+ if (!variants[mode]) variants[mode] = [];
1764
+ variants[mode].push(`${localID}: ${value};`);
1765
+ }
1766
+ for (const [variant, values] of Object.entries(variants)) {
1767
+ output.push(variant === "." ? "@theme {" : `@variant ${variant} {`);
1768
+ for (const value of values) output.push(` ${value}`);
1769
+ output.push("}", "");
1770
+ }
1771
+ outputFile(filename, output.join("\n"));
1772
+ }
1773
+ };
1774
+ }
1775
+
1776
+ //#endregion
1777
+ export { FORMAT_ID, pluginTailwind as default, flattenThemeObj };
88
1778
  //# sourceMappingURL=index.js.map