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