PluginProbe
Gutenberg / 22.3.0
Gutenberg v22.3.0
23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 12.6.0 7.4.0 All 402 releases
gutenberg / build / scripts / theme / index.js

index.js in Gutenberg 22.3.0, at build/scripts/theme/index.js

3,975 lines 118.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 var wp;
2 (wp ||= {}).theme = (() => {
3 var __create = Object.create;
4 var __defProp = Object.defineProperty;
5 var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6 var __getOwnPropNames = Object.getOwnPropertyNames;
7 var __getProtoOf = Object.getPrototypeOf;
8 var __hasOwnProp = Object.prototype.hasOwnProperty;
9 var __commonJS = (cb, mod) => function __require() {
10 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
11 };
12 var __export = (target, all) => {
13 for (var name in all)
14 __defProp(target, name, { get: all[name], enumerable: true });
15 };
16 var __copyProps = (to2, from, except, desc) => {
17 if (from && typeof from === "object" || typeof from === "function") {
18 for (let key of __getOwnPropNames(from))
19 if (!__hasOwnProp.call(to2, key) && key !== except)
20 __defProp(to2, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
21 }
22 return to2;
23 };
24 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
25 // If the importer is in node compatibility mode or this is not an ESM
26 // file that has been converted to a CommonJS file using a Babel-
27 // compatible transform (i.e. "__esModule" has not been set), then set
28 // "default" to the CommonJS "module.exports" for node compatibility.
29 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
30 mod
31 ));
32 var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
33
34 // package-external:@wordpress/private-apis
35 var require_private_apis = __commonJS({
36 "package-external:@wordpress/private-apis"(exports, module) {
37 module.exports = window.wp.privateApis;
38 }
39 });
40
41 // package-external:@wordpress/element
42 var require_element = __commonJS({
43 "package-external:@wordpress/element"(exports, module) {
44 module.exports = window.wp.element;
45 }
46 });
47
48 // vendor-external:react/jsx-runtime
49 var require_jsx_runtime = __commonJS({
50 "vendor-external:react/jsx-runtime"(exports, module) {
51 module.exports = window.ReactJSXRuntime;
52 }
53 });
54
55 // packages/theme/build-module/index.js
56 var index_exports = {};
57 __export(index_exports, {
58 privateApis: () => privateApis
59 });
60
61 // packages/theme/build-module/lock-unlock.js
62 var import_private_apis = __toESM(require_private_apis());
63 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
64 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
65 "@wordpress/theme"
66 );
67
68 // packages/theme/build-module/theme-provider.js
69 var import_element3 = __toESM(require_element());
70
71 // packages/theme/build-module/context.js
72 var import_element = __toESM(require_element());
73 var ThemeContext = (0, import_element.createContext)({
74 resolvedSettings: {
75 color: {}
76 }
77 });
78
79 // node_modules/colorjs.io/src/multiply-matrices.js
80 function multiplyMatrices(A, B) {
81 let m = A.length;
82 if (!Array.isArray(A[0])) {
83 A = [A];
84 }
85 if (!Array.isArray(B[0])) {
86 B = B.map((x) => [x]);
87 }
88 let p2 = B[0].length;
89 let B_cols = B[0].map((_, i) => B.map((x) => x[i]));
90 let product = A.map((row) => B_cols.map((col) => {
91 let ret = 0;
92 if (!Array.isArray(row)) {
93 for (let c of col) {
94 ret += row * c;
95 }
96 return ret;
97 }
98 for (let i = 0; i < row.length; i++) {
99 ret += row[i] * (col[i] || 0);
100 }
101 return ret;
102 }));
103 if (m === 1) {
104 product = product[0];
105 }
106 if (p2 === 1) {
107 return product.map((x) => x[0]);
108 }
109 return product;
110 }
111
112 // node_modules/colorjs.io/src/util.js
113 function isString(str) {
114 return type(str) === "string";
115 }
116 function type(o) {
117 let str = Object.prototype.toString.call(o);
118 return (str.match(/^\[object\s+(.*?)\]$/)[1] || "").toLowerCase();
119 }
120 function serializeNumber(n2, { precision, unit }) {
121 if (isNone(n2)) {
122 return "none";
123 }
124 return toPrecision(n2, precision) + (unit ?? "");
125 }
126 function isNone(n2) {
127 return Number.isNaN(n2) || n2 instanceof Number && n2?.none;
128 }
129 function toPrecision(n2, precision) {
130 if (n2 === 0) {
131 return 0;
132 }
133 let integer = ~~n2;
134 let digits = 0;
135 if (integer && precision) {
136 digits = ~~Math.log10(Math.abs(integer)) + 1;
137 }
138 const multiplier = 10 ** (precision - digits);
139 return Math.floor(n2 * multiplier + 0.5) / multiplier;
140 }
141 var angleFactor = {
142 deg: 1,
143 grad: 0.9,
144 rad: 180 / Math.PI,
145 turn: 360
146 };
147 function parseFunction(str) {
148 if (!str) {
149 return;
150 }
151 str = str.trim();
152 const isFunctionRegex = /^([a-z]+)\((.+?)\)$/i;
153 const isNumberRegex = /^-?[\d.]+$/;
154 const unitValueRegex = /%|deg|g?rad|turn$/;
155 const singleArgument = /\/?\s*(none|[-\w.]+(?:%|deg|g?rad|turn)?)/g;
156 let parts = str.match(isFunctionRegex);
157 if (parts) {
158 let args = [];
159 parts[2].replace(singleArgument, ($0, rawArg) => {
160 let match = rawArg.match(unitValueRegex);
161 let arg = rawArg;
162 if (match) {
163 let unit = match[0];
164 let unitlessArg = arg.slice(0, -unit.length);
165 if (unit === "%") {
166 arg = new Number(unitlessArg / 100);
167 arg.type = "<percentage>";
168 } else {
169 arg = new Number(unitlessArg * angleFactor[unit]);
170 arg.type = "<angle>";
171 arg.unit = unit;
172 }
173 } else if (isNumberRegex.test(arg)) {
174 arg = new Number(arg);
175 arg.type = "<number>";
176 } else if (arg === "none") {
177 arg = new Number(NaN);
178 arg.none = true;
179 }
180 if ($0.startsWith("/")) {
181 arg = arg instanceof Number ? arg : new Number(arg);
182 arg.alpha = true;
183 }
184 if (typeof arg === "object" && arg instanceof Number) {
185 arg.raw = rawArg;
186 }
187 args.push(arg);
188 });
189 return {
190 name: parts[1].toLowerCase(),
191 rawName: parts[1],
192 rawArgs: parts[2],
193 // An argument could be (as of css-color-4):
194 // a number, percentage, degrees (hue), ident (in color())
195 args
196 };
197 }
198 }
199 function last(arr) {
200 return arr[arr.length - 1];
201 }
202 function interpolate(start, end, p2) {
203 if (isNaN(start)) {
204 return end;
205 }
206 if (isNaN(end)) {
207 return start;
208 }
209 return start + (end - start) * p2;
210 }
211 function interpolateInv(start, end, value) {
212 return (value - start) / (end - start);
213 }
214 function mapRange(from, to2, value) {
215 return interpolate(to2[0], to2[1], interpolateInv(from[0], from[1], value));
216 }
217 function parseCoordGrammar(coordGrammars) {
218 return coordGrammars.map((coordGrammar2) => {
219 return coordGrammar2.split("|").map((type2) => {
220 type2 = type2.trim();
221 let range = type2.match(/^(<[a-z]+>)\[(-?[.\d]+),\s*(-?[.\d]+)\]?$/);
222 if (range) {
223 let ret = new String(range[1]);
224 ret.range = [+range[2], +range[3]];
225 return ret;
226 }
227 return type2;
228 });
229 });
230 }
231 function clamp(min, val, max) {
232 return Math.max(Math.min(max, val), min);
233 }
234 function copySign(to2, from) {
235 return Math.sign(to2) === Math.sign(from) ? to2 : -to2;
236 }
237 function spow(base, exp) {
238 return copySign(Math.abs(base) ** exp, base);
239 }
240 function zdiv(n2, d2) {
241 return d2 === 0 ? 0 : n2 / d2;
242 }
243 function bisectLeft(arr, value, lo = 0, hi = arr.length) {
244 while (lo < hi) {
245 const mid = lo + hi >> 1;
246 if (arr[mid] < value) {
247 lo = mid + 1;
248 } else {
249 hi = mid;
250 }
251 }
252 return lo;
253 }
254
255 // node_modules/colorjs.io/src/hooks.js
256 var Hooks = class {
257 add(name, callback, first) {
258 if (typeof arguments[0] != "string") {
259 for (var name in arguments[0]) {
260 this.add(name, arguments[0][name], arguments[1]);
261 }
262 return;
263 }
264 (Array.isArray(name) ? name : [name]).forEach(function(name2) {
265 this[name2] = this[name2] || [];
266 if (callback) {
267 this[name2][first ? "unshift" : "push"](callback);
268 }
269 }, this);
270 }
271 run(name, env) {
272 this[name] = this[name] || [];
273 this[name].forEach(function(callback) {
274 callback.call(env && env.context ? env.context : env, env);
275 });
276 }
277 };
278 var hooks = new Hooks();
279 var hooks_default = hooks;
280
281 // node_modules/colorjs.io/src/adapt.js
282 var WHITES = {
283 // for compatibility, the four-digit chromaticity-derived ones everyone else uses
284 D50: [0.3457 / 0.3585, 1, (1 - 0.3457 - 0.3585) / 0.3585],
285 D65: [0.3127 / 0.329, 1, (1 - 0.3127 - 0.329) / 0.329]
286 };
287 function getWhite(name) {
288 if (Array.isArray(name)) {
289 return name;
290 }
291 return WHITES[name];
292 }
293 function adapt(W1, W2, XYZ, options = {}) {
294 W1 = getWhite(W1);
295 W2 = getWhite(W2);
296 if (!W1 || !W2) {
297 throw new TypeError(`Missing white point to convert ${!W1 ? "from" : ""}${!W1 && !W2 ? "/" : ""}${!W2 ? "to" : ""}`);
298 }
299 if (W1 === W2) {
300 return XYZ;
301 }
302 let env = { W1, W2, XYZ, options };
303 hooks_default.run("chromatic-adaptation-start", env);
304 if (!env.M) {
305 if (env.W1 === WHITES.D65 && env.W2 === WHITES.D50) {
306 env.M = [
307 [1.0479297925449969, 0.022946870601609652, -0.05019226628920524],
308 [0.02962780877005599, 0.9904344267538799, -0.017073799063418826],
309 [-0.009243040646204504, 0.015055191490298152, 0.7518742814281371]
310 ];
311 } else if (env.W1 === WHITES.D50 && env.W2 === WHITES.D65) {
312 env.M = [
313 [0.955473421488075, -0.02309845494876471, 0.06325924320057072],
314 [-0.0283697093338637, 1.0099953980813041, 0.021041441191917323],
315 [0.012314014864481998, -0.020507649298898964, 1.330365926242124]
316 ];
317 }
318 }
319 hooks_default.run("chromatic-adaptation-end", env);
320 if (env.M) {
321 return multiplyMatrices(env.M, env.XYZ);
322 } else {
323 throw new TypeError("Only Bradford CAT with white points D50 and D65 supported for now.");
324 }
325 }
326
327 // node_modules/colorjs.io/src/defaults.js
328 var defaults_default = {
329 gamut_mapping: "css",
330 precision: 5,
331 deltaE: "76",
332 // Default deltaE method
333 verbose: globalThis?.process?.env?.NODE_ENV?.toLowerCase() !== "test",
334 warn: function warn(msg) {
335 if (this.verbose) {
336 globalThis?.console?.warn?.(msg);
337 }
338 }
339 };
340
341 // node_modules/colorjs.io/src/parse.js
342 var noneTypes = /* @__PURE__ */ new Set(["<number>", "<percentage>", "<angle>"]);
343 function coerceCoords(space, format, name, coords) {
344 let types = Object.entries(space.coords).map(([id, coordMeta], i) => {
345 let coordGrammar2 = format.coordGrammar[i];
346 let arg = coords[i];
347 let providedType = arg?.type;
348 let type2;
349 if (arg.none) {
350 type2 = coordGrammar2.find((c) => noneTypes.has(c));
351 } else {
352 type2 = coordGrammar2.find((c) => c == providedType);
353 }
354 if (!type2) {
355 let coordName = coordMeta.name || id;
356 throw new TypeError(`${providedType ?? arg.raw} not allowed for ${coordName} in ${name}()`);
357 }
358 let fromRange = type2.range;
359 if (providedType === "<percentage>") {
360 fromRange ||= [0, 1];
361 }
362 let toRange = coordMeta.range || coordMeta.refRange;
363 if (fromRange && toRange) {
364 coords[i] = mapRange(fromRange, toRange, coords[i]);
365 }
366 return type2;
367 });
368 return types;
369 }
370 function parse(str, { meta } = {}) {
371 let env = { "str": String(str)?.trim() };
372 hooks_default.run("parse-start", env);
373 if (env.color) {
374 return env.color;
375 }
376 env.parsed = parseFunction(env.str);
377 if (env.parsed) {
378 let name = env.parsed.name;
379 if (name === "color") {
380 let id = env.parsed.args.shift();
381 let alternateId = id.startsWith("--") ? id.substring(2) : `--${id}`;
382 let ids = [id, alternateId];
383 let alpha = env.parsed.rawArgs.indexOf("/") > 0 ? env.parsed.args.pop() : 1;
384 for (let space of ColorSpace.all) {
385 let colorSpec = space.getFormat("color");
386 if (colorSpec) {
387 if (ids.includes(colorSpec.id) || colorSpec.ids?.filter((specId) => ids.includes(specId)).length) {
388 const coords = Object.keys(space.coords).map((_, i) => env.parsed.args[i] || 0);
389 let types;
390 if (colorSpec.coordGrammar) {
391 types = coerceCoords(space, colorSpec, "color", coords);
392 }
393 if (meta) {
394 Object.assign(meta, { formatId: "color", types });
395 }
396 if (colorSpec.id.startsWith("--") && !id.startsWith("--")) {
397 defaults_default.warn(`${space.name} is a non-standard space and not currently supported in the CSS spec. Use prefixed color(${colorSpec.id}) instead of color(${id}).`);
398 }
399 if (id.startsWith("--") && !colorSpec.id.startsWith("--")) {
400 defaults_default.warn(`${space.name} is a standard space and supported in the CSS spec. Use color(${colorSpec.id}) instead of prefixed color(${id}).`);
401 }
402 return { spaceId: space.id, coords, alpha };
403 }
404 }
405 }
406 let didYouMean = "";
407 let registryId = id in ColorSpace.registry ? id : alternateId;
408 if (registryId in ColorSpace.registry) {
409 let cssId = ColorSpace.registry[registryId].formats?.color?.id;
410 if (cssId) {
411 didYouMean = `Did you mean color(${cssId})?`;
412 }
413 }
414 throw new TypeError(`Cannot parse color(${id}). ` + (didYouMean || "Missing a plugin?"));
415 } else {
416 for (let space of ColorSpace.all) {
417 let format = space.getFormat(name);
418 if (format && format.type === "function") {
419 let alpha = 1;
420 if (format.lastAlpha || last(env.parsed.args).alpha) {
421 alpha = env.parsed.args.pop();
422 }
423 let coords = env.parsed.args;
424 let types;
425 if (format.coordGrammar) {
426 types = coerceCoords(space, format, name, coords);
427 }
428 if (meta) {
429 Object.assign(meta, { formatId: format.name, types });
430 }
431 return {
432 spaceId: space.id,
433 coords,
434 alpha
435 };
436 }
437 }
438 }
439 } else {
440 for (let space of ColorSpace.all) {
441 for (let formatId in space.formats) {
442 let format = space.formats[formatId];
443 if (format.type !== "custom") {
444 continue;
445 }
446 if (format.test && !format.test(env.str)) {
447 continue;
448 }
449 let color = format.parse(env.str);
450 if (color) {
451 color.alpha ??= 1;
452 if (meta) {
453 meta.formatId = formatId;
454 }
455 return color;
456 }
457 }
458 }
459 }
460 throw new TypeError(`Could not parse ${str} as a color. Missing a plugin?`);
461 }
462
463 // node_modules/colorjs.io/src/getColor.js
464 function getColor(color) {
465 if (Array.isArray(color)) {
466 return color.map(getColor);
467 }
468 if (!color) {
469 throw new TypeError("Empty color reference");
470 }
471 if (isString(color)) {
472 color = parse(color);
473 }
474 let space = color.space || color.spaceId;
475 if (!(space instanceof ColorSpace)) {
476 color.space = ColorSpace.get(space);
477 }
478 if (color.alpha === void 0) {
479 color.alpha = 1;
480 }
481 return color;
482 }
483
484 // node_modules/colorjs.io/src/space.js
485 var \u03B5 = 75e-6;
486 var ColorSpace = class _ColorSpace {
487 constructor(options) {
488 this.id = options.id;
489 this.name = options.name;
490 this.base = options.base ? _ColorSpace.get(options.base) : null;
491 this.aliases = options.aliases;
492 if (this.base) {
493 this.fromBase = options.fromBase;
494 this.toBase = options.toBase;
495 }
496 let coords = options.coords ?? this.base.coords;
497 for (let name in coords) {
498 if (!("name" in coords[name])) {
499 coords[name].name = name;
500 }
501 }
502 this.coords = coords;
503 let white4 = options.white ?? this.base.white ?? "D65";
504 this.white = getWhite(white4);
505 this.formats = options.formats ?? {};
506 for (let name in this.formats) {
507 let format = this.formats[name];
508 format.type ||= "function";
509 format.name ||= name;
510 }
511 if (!this.formats.color?.id) {
512 this.formats.color = {
513 ...this.formats.color ?? {},
514 id: options.cssId || this.id
515 };
516 }
517 if (options.gamutSpace) {
518 this.gamutSpace = options.gamutSpace === "self" ? this : _ColorSpace.get(options.gamutSpace);
519 } else {
520 if (this.isPolar) {
521 this.gamutSpace = this.base;
522 } else {
523 this.gamutSpace = this;
524 }
525 }
526 if (this.gamutSpace.isUnbounded) {
527 this.inGamut = (coords2, options2) => {
528 return true;
529 };
530 }
531 this.referred = options.referred;
532 Object.defineProperty(this, "path", {
533 value: getPath(this).reverse(),
534 writable: false,
535 enumerable: true,
536 configurable: true
537 });
538 hooks_default.run("colorspace-init-end", this);
539 }
540 inGamut(coords, { epsilon = \u03B5 } = {}) {
541 if (!this.equals(this.gamutSpace)) {
542 coords = this.to(this.gamutSpace, coords);
543 return this.gamutSpace.inGamut(coords, { epsilon });
544 }
545 let coordMeta = Object.values(this.coords);
546 return coords.every((c, i) => {
547 let meta = coordMeta[i];
548 if (meta.type !== "angle" && meta.range) {
549 if (Number.isNaN(c)) {
550 return true;
551 }
552 let [min, max] = meta.range;
553 return (min === void 0 || c >= min - epsilon) && (max === void 0 || c <= max + epsilon);
554 }
555 return true;
556 });
557 }
558 get isUnbounded() {
559 return Object.values(this.coords).every((coord) => !("range" in coord));
560 }
561 get cssId() {
562 return this.formats?.color?.id || this.id;
563 }
564 get isPolar() {
565 for (let id in this.coords) {
566 if (this.coords[id].type === "angle") {
567 return true;
568 }
569 }
570 return false;
571 }
572 getFormat(format) {
573 if (typeof format === "object") {
574 format = processFormat(format, this);
575 return format;
576 }
577 let ret;
578 if (format === "default") {
579 ret = Object.values(this.formats)[0];
580 } else {
581 ret = this.formats[format];
582 }
583 if (ret) {
584 ret = processFormat(ret, this);
585 return ret;
586 }
587 return null;
588 }
589 /**
590 * Check if this color space is the same as another color space reference.
591 * Allows proxying color space objects and comparing color spaces with ids.
592 * @param {string | ColorSpace} space ColorSpace object or id to compare to
593 * @returns {boolean}
594 */
595 equals(space) {
596 if (!space) {
597 return false;
598 }
599 return this === space || this.id === space || this.id === space.id;
600 }
601 to(space, coords) {
602 if (arguments.length === 1) {
603 const color = getColor(space);
604 [space, coords] = [color.space, color.coords];
605 }
606 space = _ColorSpace.get(space);
607 if (this.equals(space)) {
608 return coords;
609 }
610 coords = coords.map((c) => Number.isNaN(c) ? 0 : c);
611 let myPath = this.path;
612 let otherPath = space.path;
613 let connectionSpace, connectionSpaceIndex;
614 for (let i = 0; i < myPath.length; i++) {
615 if (myPath[i].equals(otherPath[i])) {
616 connectionSpace = myPath[i];
617 connectionSpaceIndex = i;
618 } else {
619 break;
620 }
621 }
622 if (!connectionSpace) {
623 throw new Error(`Cannot convert between color spaces ${this} and ${space}: no connection space was found`);
624 }
625 for (let i = myPath.length - 1; i > connectionSpaceIndex; i--) {
626 coords = myPath[i].toBase(coords);
627 }
628 for (let i = connectionSpaceIndex + 1; i < otherPath.length; i++) {
629 coords = otherPath[i].fromBase(coords);
630 }
631 return coords;
632 }
633 from(space, coords) {
634 if (arguments.length === 1) {
635 const color = getColor(space);
636 [space, coords] = [color.space, color.coords];
637 }
638 space = _ColorSpace.get(space);
639 return space.to(this, coords);
640 }
641 toString() {
642 return `${this.name} (${this.id})`;
643 }
644 getMinCoords() {
645 let ret = [];
646 for (let id in this.coords) {
647 let meta = this.coords[id];
648 let range = meta.range || meta.refRange;
649 ret.push(range?.min ?? 0);
650 }
651 return ret;
652 }
653 static registry = {};
654 // Returns array of unique color spaces
655 static get all() {
656 return [...new Set(Object.values(_ColorSpace.registry))];
657 }
658 static register(id, space) {
659 if (arguments.length === 1) {
660 space = arguments[0];
661 id = space.id;
662 }
663 space = this.get(space);
664 if (this.registry[id] && this.registry[id] !== space) {
665 throw new Error(`Duplicate color space registration: '${id}'`);
666 }
667 this.registry[id] = space;
668 if (arguments.length === 1 && space.aliases) {
669 for (let alias of space.aliases) {
670 this.register(alias, space);
671 }
672 }
673 return space;
674 }
675 /**
676 * Lookup ColorSpace object by name
677 * @param {ColorSpace | string} name
678 */
679 static get(space, ...alternatives) {
680 if (!space || space instanceof _ColorSpace) {
681 return space;
682 }
683 let argType = type(space);
684 if (argType === "string") {
685 let ret = _ColorSpace.registry[space.toLowerCase()];
686 if (!ret) {
687 throw new TypeError(`No color space found with id = "${space}"`);
688 }
689 return ret;
690 }
691 if (alternatives.length) {
692 return _ColorSpace.get(...alternatives);
693 }
694 throw new TypeError(`${space} is not a valid color space`);
695 }
696 /**
697 * Get metadata about a coordinate of a color space
698 *
699 * @static
700 * @param {Array | string} ref
701 * @param {ColorSpace | string} [workingSpace]
702 * @return {Object}
703 */
704 static resolveCoord(ref, workingSpace) {
705 let coordType = type(ref);
706 let space, coord;
707 if (coordType === "string") {
708 if (ref.includes(".")) {
709 [space, coord] = ref.split(".");
710 } else {
711 [space, coord] = [, ref];
712 }
713 } else if (Array.isArray(ref)) {
714 [space, coord] = ref;
715 } else {
716 space = ref.space;
717 coord = ref.coordId;
718 }
719 space = _ColorSpace.get(space);
720 if (!space) {
721 space = workingSpace;
722 }
723 if (!space) {
724 throw new TypeError(`Cannot resolve coordinate reference ${ref}: No color space specified and relative references are not allowed here`);
725 }
726 coordType = type(coord);
727 if (coordType === "number" || coordType === "string" && coord >= 0) {
728 let meta = Object.entries(space.coords)[coord];
729 if (meta) {
730 return { space, id: meta[0], index: coord, ...meta[1] };
731 }
732 }
733 space = _ColorSpace.get(space);
734 let normalizedCoord = coord.toLowerCase();
735 let i = 0;
736 for (let id in space.coords) {
737 let meta = space.coords[id];
738 if (id.toLowerCase() === normalizedCoord || meta.name?.toLowerCase() === normalizedCoord) {
739 return { space, id, index: i, ...meta };
740 }
741 i++;
742 }
743 throw new TypeError(`No "${coord}" coordinate found in ${space.name}. Its coordinates are: ${Object.keys(space.coords).join(", ")}`);
744 }
745 static DEFAULT_FORMAT = {
746 type: "functions",
747 name: "color"
748 };
749 };
750 function getPath(space) {
751 let ret = [space];
752 for (let s = space; s = s.base; ) {
753 ret.push(s);
754 }
755 return ret;
756 }
757 function processFormat(format, { coords } = {}) {
758 if (format.coords && !format.coordGrammar) {
759 format.type ||= "function";
760 format.name ||= "color";
761 format.coordGrammar = parseCoordGrammar(format.coords);
762 let coordFormats = Object.entries(coords).map(([id, coordMeta], i) => {
763 let outputType = format.coordGrammar[i][0];
764 let fromRange = coordMeta.range || coordMeta.refRange;
765 let toRange = outputType.range, suffix = "";
766 if (outputType == "<percentage>") {
767 toRange = [0, 100];
768 suffix = "%";
769 } else if (outputType == "<angle>") {
770 suffix = "deg";
771 }
772 return { fromRange, toRange, suffix };
773 });
774 format.serializeCoords = (coords2, precision) => {
775 return coords2.map((c, i) => {
776 let { fromRange, toRange, suffix } = coordFormats[i];
777 if (fromRange && toRange) {
778 c = mapRange(fromRange, toRange, c);
779 }
780 c = serializeNumber(c, { precision, unit: suffix });
781 return c;
782 });
783 };
784 }
785 return format;
786 }
787
788 // node_modules/colorjs.io/src/spaces/xyz-d65.js
789 var xyz_d65_default = new ColorSpace({
790 id: "xyz-d65",
791 name: "XYZ D65",
792 coords: {
793 x: { name: "X" },
794 y: { name: "Y" },
795 z: { name: "Z" }
796 },
797 white: "D65",
798 formats: {
799 color: {
800 ids: ["xyz-d65", "xyz"]
801 }
802 },
803 aliases: ["xyz"]
804 });
805
806 // node_modules/colorjs.io/src/rgbspace.js
807 var RGBColorSpace = class extends ColorSpace {
808 /**
809 * Creates a new RGB ColorSpace.
810 * If coords are not specified, they will use the default RGB coords.
811 * Instead of `fromBase()` and `toBase()` functions,
812 * you can specify to/from XYZ matrices and have `toBase()` and `fromBase()` automatically generated.
813 * @param {*} options - Same options as {@link ColorSpace} plus:
814 * @param {number[][]} options.toXYZ_M - Matrix to convert to XYZ
815 * @param {number[][]} options.fromXYZ_M - Matrix to convert from XYZ
816 */
817 constructor(options) {
818 if (!options.coords) {
819 options.coords = {
820 r: {
821 range: [0, 1],
822 name: "Red"
823 },
824 g: {
825 range: [0, 1],
826 name: "Green"
827 },
828 b: {
829 range: [0, 1],
830 name: "Blue"
831 }
832 };
833 }
834 if (!options.base) {
835 options.base = xyz_d65_default;
836 }
837 if (options.toXYZ_M && options.fromXYZ_M) {
838 options.toBase ??= (rgb) => {
839 let xyz = multiplyMatrices(options.toXYZ_M, rgb);
840 if (this.white !== this.base.white) {
841 xyz = adapt(this.white, this.base.white, xyz);
842 }
843 return xyz;
844 };
845 options.fromBase ??= (xyz) => {
846 xyz = adapt(this.base.white, this.white, xyz);
847 return multiplyMatrices(options.fromXYZ_M, xyz);
848 };
849 }
850 options.referred ??= "display";
851 super(options);
852 }
853 };
854
855 // node_modules/colorjs.io/src/getAll.js
856 function getAll(color, space) {
857 color = getColor(color);
858 if (!space || color.space.equals(space)) {
859 return color.coords.slice();
860 }
861 space = ColorSpace.get(space);
862 return space.from(color);
863 }
864
865 // node_modules/colorjs.io/src/get.js
866 function get(color, prop) {
867 color = getColor(color);
868 let { space, index } = ColorSpace.resolveCoord(prop, color.space);
869 let coords = getAll(color, space);
870 return coords[index];
871 }
872
873 // node_modules/colorjs.io/src/setAll.js
874 function setAll(color, space, coords) {
875 color = getColor(color);
876 space = ColorSpace.get(space);
877 color.coords = space.to(color.space, coords);
878 return color;
879 }
880 setAll.returns = "color";
881
882 // node_modules/colorjs.io/src/set.js
883 function set(color, prop, value) {
884 color = getColor(color);
885 if (arguments.length === 2 && type(arguments[1]) === "object") {
886 let object = arguments[1];
887 for (let p2 in object) {
888 set(color, p2, object[p2]);
889 }
890 } else {
891 if (typeof value === "function") {
892 value = value(get(color, prop));
893 }
894 let { space, index } = ColorSpace.resolveCoord(prop, color.space);
895 let coords = getAll(color, space);
896 coords[index] = value;
897 setAll(color, space, coords);
898 }
899 return color;
900 }
901 set.returns = "color";
902
903 // node_modules/colorjs.io/src/spaces/xyz-d50.js
904 var xyz_d50_default = new ColorSpace({
905 id: "xyz-d50",
906 name: "XYZ D50",
907 white: "D50",
908 base: xyz_d65_default,
909 fromBase: (coords) => adapt(xyz_d65_default.white, "D50", coords),
910 toBase: (coords) => adapt("D50", xyz_d65_default.white, coords)
911 });
912
913 // node_modules/colorjs.io/src/spaces/lab.js
914 var \u03B52 = 216 / 24389;
915 var \u03B53 = 24 / 116;
916 var \u03BA = 24389 / 27;
917 var white = WHITES.D50;
918 var lab_default = new ColorSpace({
919 id: "lab",
920 name: "Lab",
921 coords: {
922 l: {
923 refRange: [0, 100],
924 name: "Lightness"
925 },
926 a: {
927 refRange: [-125, 125]
928 },
929 b: {
930 refRange: [-125, 125]
931 }
932 },
933 // Assuming XYZ is relative to D50, convert to CIE Lab
934 // from CIE standard, which now defines these as a rational fraction
935 white,
936 base: xyz_d50_default,
937 // Convert D50-adapted XYX to Lab
938 // CIE 15.3:2004 section 8.2.1.1
939 fromBase(XYZ) {
940 let xyz = XYZ.map((value, i) => value / white[i]);
941 let f = xyz.map((value) => value > \u03B52 ? Math.cbrt(value) : (\u03BA * value + 16) / 116);
942 return [
943 116 * f[1] - 16,
944 // L
945 500 * (f[0] - f[1]),
946 // a
947 200 * (f[1] - f[2])
948 // b
949 ];
950 },
951 // Convert Lab to D50-adapted XYZ
952 // Same result as CIE 15.3:2004 Appendix D although the derivation is different
953 // http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
954 toBase(Lab) {
955 let f = [];
956 f[1] = (Lab[0] + 16) / 116;
957 f[0] = Lab[1] / 500 + f[1];
958 f[2] = f[1] - Lab[2] / 200;
959 let xyz = [
960 f[0] > \u03B53 ? Math.pow(f[0], 3) : (116 * f[0] - 16) / \u03BA,
961 Lab[0] > 8 ? Math.pow((Lab[0] + 16) / 116, 3) : Lab[0] / \u03BA,
962 f[2] > \u03B53 ? Math.pow(f[2], 3) : (116 * f[2] - 16) / \u03BA
963 ];
964 return xyz.map((value, i) => value * white[i]);
965 },
966 formats: {
967 "lab": {
968 coords: ["<number> | <percentage>", "<number> | <percentage>[-1,1]", "<number> | <percentage>[-1,1]"]
969 }
970 }
971 });
972
973 // node_modules/colorjs.io/src/angles.js
974 function constrain(angle) {
975 return (angle % 360 + 360) % 360;
976 }
977
978 // node_modules/colorjs.io/src/spaces/lch.js
979 var lch_default = new ColorSpace({
980 id: "lch",
981 name: "LCH",
982 coords: {
983 l: {
984 refRange: [0, 100],
985 name: "Lightness"
986 },
987 c: {
988 refRange: [0, 150],
989 name: "Chroma"
990 },
991 h: {
992 refRange: [0, 360],
993 type: "angle",
994 name: "Hue"
995 }
996 },
997 base: lab_default,
998 fromBase(Lab) {
999 let [L, a, b2] = Lab;
1000 let hue;
1001 const \u03B56 = 0.02;
1002 if (Math.abs(a) < \u03B56 && Math.abs(b2) < \u03B56) {
1003 hue = NaN;
1004 } else {
1005 hue = Math.atan2(b2, a) * 180 / Math.PI;
1006 }
1007 return [
1008 L,
1009 // L is still L
1010 Math.sqrt(a ** 2 + b2 ** 2),
1011 // Chroma
1012 constrain(hue)
1013 // Hue, in degrees [0 to 360)
1014 ];
1015 },
1016 toBase(LCH) {
1017 let [Lightness, Chroma, Hue] = LCH;
1018 if (Chroma < 0) {
1019 Chroma = 0;
1020 }
1021 if (isNaN(Hue)) {
1022 Hue = 0;
1023 }
1024 return [
1025 Lightness,
1026 // L is still L
1027 Chroma * Math.cos(Hue * Math.PI / 180),
1028 // a
1029 Chroma * Math.sin(Hue * Math.PI / 180)
1030 // b
1031 ];
1032 },
1033 formats: {
1034 "lch": {
1035 coords: ["<number> | <percentage>", "<number> | <percentage>", "<number> | <angle>"]
1036 }
1037 }
1038 });
1039
1040 // node_modules/colorjs.io/src/deltaE/deltaE2000.js
1041 var Gfactor = 25 ** 7;
1042 var \u03C0 = Math.PI;
1043 var r2d = 180 / \u03C0;
1044 var d2r = \u03C0 / 180;
1045 function pow7(x) {
1046 const x2 = x * x;
1047 const x7 = x2 * x2 * x2 * x;
1048 return x7;
1049 }
1050 function deltaE2000_default(color, sample, { kL = 1, kC = 1, kH = 1 } = {}) {
1051 [color, sample] = getColor([color, sample]);
1052 let [L1, a1, b1] = lab_default.from(color);
1053 let C1 = lch_default.from(lab_default, [L1, a1, b1])[1];
1054 let [L2, a2, b2] = lab_default.from(sample);
1055 let C2 = lch_default.from(lab_default, [L2, a2, b2])[1];
1056 if (C1 < 0) {
1057 C1 = 0;
1058 }
1059 if (C2 < 0) {
1060 C2 = 0;
1061 }
1062 let Cbar = (C1 + C2) / 2;
1063 let C7 = pow7(Cbar);
1064 let G = 0.5 * (1 - Math.sqrt(C7 / (C7 + Gfactor)));
1065 let adash1 = (1 + G) * a1;
1066 let adash2 = (1 + G) * a2;
1067 let Cdash1 = Math.sqrt(adash1 ** 2 + b1 ** 2);
1068 let Cdash2 = Math.sqrt(adash2 ** 2 + b2 ** 2);
1069 let h1 = adash1 === 0 && b1 === 0 ? 0 : Math.atan2(b1, adash1);
1070 let h2 = adash2 === 0 && b2 === 0 ? 0 : Math.atan2(b2, adash2);
1071 if (h1 < 0) {
1072 h1 += 2 * \u03C0;
1073 }
1074 if (h2 < 0) {
1075 h2 += 2 * \u03C0;
1076 }
1077 h1 *= r2d;
1078 h2 *= r2d;
1079 let \u0394L = L2 - L1;
1080 let \u0394C = Cdash2 - Cdash1;
1081 let hdiff = h2 - h1;
1082 let hsum = h1 + h2;
1083 let habs = Math.abs(hdiff);
1084 let \u0394h;
1085 if (Cdash1 * Cdash2 === 0) {
1086 \u0394h = 0;
1087 } else if (habs <= 180) {
1088 \u0394h = hdiff;
1089 } else if (hdiff > 180) {
1090 \u0394h = hdiff - 360;
1091 } else if (hdiff < -180) {
1092 \u0394h = hdiff + 360;
1093 } else {
1094 defaults_default.warn("the unthinkable has happened");
1095 }
1096 let \u0394H = 2 * Math.sqrt(Cdash2 * Cdash1) * Math.sin(\u0394h * d2r / 2);
1097 let Ldash = (L1 + L2) / 2;
1098 let Cdash = (Cdash1 + Cdash2) / 2;
1099 let Cdash7 = pow7(Cdash);
1100 let hdash;
1101 if (Cdash1 * Cdash2 === 0) {
1102 hdash = hsum;
1103 } else if (habs <= 180) {
1104 hdash = hsum / 2;
1105 } else if (hsum < 360) {
1106 hdash = (hsum + 360) / 2;
1107 } else {
1108 hdash = (hsum - 360) / 2;
1109 }
1110 let lsq = (Ldash - 50) ** 2;
1111 let SL = 1 + 0.015 * lsq / Math.sqrt(20 + lsq);
1112 let SC = 1 + 0.045 * Cdash;
1113 let T = 1;
1114 T -= 0.17 * Math.cos((hdash - 30) * d2r);
1115 T += 0.24 * Math.cos(2 * hdash * d2r);
1116 T += 0.32 * Math.cos((3 * hdash + 6) * d2r);
1117 T -= 0.2 * Math.cos((4 * hdash - 63) * d2r);
1118 let SH = 1 + 0.015 * Cdash * T;
1119 let \u0394\u03B8 = 30 * Math.exp(-1 * ((hdash - 275) / 25) ** 2);
1120 let RC = 2 * Math.sqrt(Cdash7 / (Cdash7 + Gfactor));
1121 let RT = -1 * Math.sin(2 * \u0394\u03B8 * d2r) * RC;
1122 let dE = (\u0394L / (kL * SL)) ** 2;
1123 dE += (\u0394C / (kC * SC)) ** 2;
1124 dE += (\u0394H / (kH * SH)) ** 2;
1125 dE += RT * (\u0394C / (kC * SC)) * (\u0394H / (kH * SH));
1126 return Math.sqrt(dE);
1127 }
1128
1129 // node_modules/colorjs.io/src/spaces/oklab.js
1130 var XYZtoLMS_M = [
1131 [0.819022437996703, 0.3619062600528904, -0.1288737815209879],
1132 [0.0329836539323885, 0.9292868615863434, 0.0361446663506424],
1133 [0.0481771893596242, 0.2642395317527308, 0.6335478284694309]
1134 ];
1135 var LMStoXYZ_M = [
1136 [1.2268798758459243, -0.5578149944602171, 0.2813910456659647],
1137 [-0.0405757452148008, 1.112286803280317, -0.0717110580655164],
1138 [-0.0763729366746601, -0.4214933324022432, 1.5869240198367816]
1139 ];
1140 var LMStoLab_M = [
1141 [0.210454268309314, 0.7936177747023054, -0.0040720430116193],
1142 [1.9779985324311684, -2.42859224204858, 0.450593709617411],
1143 [0.0259040424655478, 0.7827717124575296, -0.8086757549230774]
1144 ];
1145 var LabtoLMS_M = [
1146 [1, 0.3963377773761749, 0.2158037573099136],
1147 [1, -0.1055613458156586, -0.0638541728258133],
1148 [1, -0.0894841775298119, -1.2914855480194092]
1149 ];
1150 var oklab_default = new ColorSpace({
1151 id: "oklab",
1152 name: "Oklab",
1153 coords: {
1154 l: {
1155 refRange: [0, 1],
1156 name: "Lightness"
1157 },
1158 a: {
1159 refRange: [-0.4, 0.4]
1160 },
1161 b: {
1162 refRange: [-0.4, 0.4]
1163 }
1164 },
1165 // Note that XYZ is relative to D65
1166 white: "D65",
1167 base: xyz_d65_default,
1168 fromBase(XYZ) {
1169 let LMS = multiplyMatrices(XYZtoLMS_M, XYZ);
1170 let LMSg = LMS.map((val) => Math.cbrt(val));
1171 return multiplyMatrices(LMStoLab_M, LMSg);
1172 },
1173 toBase(OKLab) {
1174 let LMSg = multiplyMatrices(LabtoLMS_M, OKLab);
1175 let LMS = LMSg.map((val) => val ** 3);
1176 return multiplyMatrices(LMStoXYZ_M, LMS);
1177 },
1178 formats: {
1179 "oklab": {
1180 coords: ["<percentage> | <number>", "<number> | <percentage>[-1,1]", "<number> | <percentage>[-1,1]"]
1181 }
1182 }
1183 });
1184
1185 // node_modules/colorjs.io/src/deltaE/deltaEOK.js
1186 function deltaEOK_default(color, sample) {
1187 [color, sample] = getColor([color, sample]);
1188 let [L1, a1, b1] = oklab_default.from(color);
1189 let [L2, a2, b2] = oklab_default.from(sample);
1190 let \u0394L = L1 - L2;
1191 let \u0394a = a1 - a2;
1192 let \u0394b = b1 - b2;
1193 return Math.sqrt(\u0394L ** 2 + \u0394a ** 2 + \u0394b ** 2);
1194 }
1195
1196 // node_modules/colorjs.io/src/inGamut.js
1197 var \u03B54 = 75e-6;
1198 function inGamut(color, space, { epsilon = \u03B54 } = {}) {
1199 color = getColor(color);
1200 if (!space) {
1201 space = color.space;
1202 }
1203 space = ColorSpace.get(space);
1204 let coords = color.coords;
1205 if (space !== color.space) {
1206 coords = space.from(color);
1207 }
1208 return space.inGamut(coords, { epsilon });
1209 }
1210
1211 // node_modules/colorjs.io/src/clone.js
1212 function clone(color) {
1213 return {
1214 space: color.space,
1215 coords: color.coords.slice(),
1216 alpha: color.alpha
1217 };
1218 }
1219
1220 // node_modules/colorjs.io/src/distance.js
1221 function distance(color1, color2, space = "lab") {
1222 space = ColorSpace.get(space);
1223 let coords1 = space.from(color1);
1224 let coords2 = space.from(color2);
1225 return Math.sqrt(coords1.reduce((acc, c13, i) => {
1226 let c23 = coords2[i];
1227 if (isNaN(c13) || isNaN(c23)) {
1228 return acc;
1229 }
1230 return acc + (c23 - c13) ** 2;
1231 }, 0));
1232 }
1233
1234 // node_modules/colorjs.io/src/deltaE/deltaE76.js
1235 function deltaE76(color, sample) {
1236 return distance(color, sample, "lab");
1237 }
1238
1239 // node_modules/colorjs.io/src/deltaE/deltaECMC.js
1240 var \u03C02 = Math.PI;
1241 var d2r2 = \u03C02 / 180;
1242 function deltaECMC_default(color, sample, { l = 2, c = 1 } = {}) {
1243 [color, sample] = getColor([color, sample]);
1244 let [L1, a1, b1] = lab_default.from(color);
1245 let [, C1, H1] = lch_default.from(lab_default, [L1, a1, b1]);
1246 let [L2, a2, b2] = lab_default.from(sample);
1247 let C2 = lch_default.from(lab_default, [L2, a2, b2])[1];
1248 if (C1 < 0) {
1249 C1 = 0;
1250 }
1251 if (C2 < 0) {
1252 C2 = 0;
1253 }
1254 let \u0394L = L1 - L2;
1255 let \u0394C = C1 - C2;
1256 let \u0394a = a1 - a2;
1257 let \u0394b = b1 - b2;
1258 let H2 = \u0394a ** 2 + \u0394b ** 2 - \u0394C ** 2;
1259 let SL = 0.511;
1260 if (L1 >= 16) {
1261 SL = 0.040975 * L1 / (1 + 0.01765 * L1);
1262 }
1263 let SC = 0.0638 * C1 / (1 + 0.0131 * C1) + 0.638;
1264 let T;
1265 if (Number.isNaN(H1)) {
1266 H1 = 0;
1267 }
1268 if (H1 >= 164 && H1 <= 345) {
1269 T = 0.56 + Math.abs(0.2 * Math.cos((H1 + 168) * d2r2));
1270 } else {
1271 T = 0.36 + Math.abs(0.4 * Math.cos((H1 + 35) * d2r2));
1272 }
1273 let C4 = Math.pow(C1, 4);
1274 let F = Math.sqrt(C4 / (C4 + 1900));
1275 let SH = SC * (F * T + 1 - F);
1276 let dE = (\u0394L / (l * SL)) ** 2;
1277 dE += (\u0394C / (c * SC)) ** 2;
1278 dE += H2 / SH ** 2;
1279 return Math.sqrt(dE);
1280 }
1281
1282 // node_modules/colorjs.io/src/spaces/xyz-abs-d65.js
1283 var Yw = 203;
1284 var xyz_abs_d65_default = new ColorSpace({
1285 // Absolute CIE XYZ, with a D65 whitepoint,
1286 // as used in most HDR colorspaces as a starting point.
1287 // SDR spaces are converted per BT.2048
1288 // so that diffuse, media white is 203 cd/m²
1289 id: "xyz-abs-d65",
1290 cssId: "--xyz-abs-d65",
1291 name: "Absolute XYZ D65",
1292 coords: {
1293 x: {
1294 refRange: [0, 9504.7],
1295 name: "Xa"
1296 },
1297 y: {
1298 refRange: [0, 1e4],
1299 name: "Ya"
1300 },
1301 z: {
1302 refRange: [0, 10888.3],
1303 name: "Za"
1304 }
1305 },
1306 base: xyz_d65_default,
1307 fromBase(XYZ) {
1308 return XYZ.map((v) => Math.max(v * Yw, 0));
1309 },
1310 toBase(AbsXYZ) {
1311 return AbsXYZ.map((v) => Math.max(v / Yw, 0));
1312 }
1313 });
1314
1315 // node_modules/colorjs.io/src/spaces/jzazbz.js
1316 var b = 1.15;
1317 var g = 0.66;
1318 var n = 2610 / 2 ** 14;
1319 var ninv = 2 ** 14 / 2610;
1320 var c1 = 3424 / 2 ** 12;
1321 var c2 = 2413 / 2 ** 7;
1322 var c3 = 2392 / 2 ** 7;
1323 var p = 1.7 * 2523 / 2 ** 5;
1324 var pinv = 2 ** 5 / (1.7 * 2523);
1325 var d = -0.56;
1326 var d0 = 16295499532821565e-27;
1327 var XYZtoCone_M = [
1328 [0.41478972, 0.579999, 0.014648],
1329 [-0.20151, 1.120649, 0.0531008],
1330 [-0.0166008, 0.2648, 0.6684799]
1331 ];
1332 var ConetoXYZ_M = [
1333 [1.9242264357876067, -1.0047923125953657, 0.037651404030618],
1334 [0.35031676209499907, 0.7264811939316552, -0.06538442294808501],
1335 [-0.09098281098284752, -0.3127282905230739, 1.5227665613052603]
1336 ];
1337 var ConetoIab_M = [
1338 [0.5, 0.5, 0],
1339 [3.524, -4.066708, 0.542708],
1340 [0.199076, 1.096799, -1.295875]
1341 ];
1342 var IabtoCone_M = [
1343 [1, 0.1386050432715393, 0.05804731615611886],
1344 [0.9999999999999999, -0.1386050432715393, -0.05804731615611886],
1345 [0.9999999999999998, -0.09601924202631895, -0.8118918960560388]
1346 ];
1347 var jzazbz_default = new ColorSpace({
1348 id: "jzazbz",
1349 name: "Jzazbz",
1350 coords: {
1351 jz: {
1352 refRange: [0, 1],
1353 name: "Jz"
1354 },
1355 az: {
1356 refRange: [-0.5, 0.5]
1357 },
1358 bz: {
1359 refRange: [-0.5, 0.5]
1360 }
1361 },
1362 base: xyz_abs_d65_default,
1363 fromBase(XYZ) {
1364 let [Xa, Ya, Za] = XYZ;
1365 let Xm = b * Xa - (b - 1) * Za;
1366 let Ym = g * Ya - (g - 1) * Xa;
1367 let LMS = multiplyMatrices(XYZtoCone_M, [Xm, Ym, Za]);
1368 let PQLMS = LMS.map(function(val) {
1369 let num = c1 + c2 * (val / 1e4) ** n;
1370 let denom = 1 + c3 * (val / 1e4) ** n;
1371 return (num / denom) ** p;
1372 });
1373 let [Iz, az, bz] = multiplyMatrices(ConetoIab_M, PQLMS);
1374 let Jz = (1 + d) * Iz / (1 + d * Iz) - d0;
1375 return [Jz, az, bz];
1376 },
1377 toBase(Jzazbz) {
1378 let [Jz, az, bz] = Jzazbz;
1379 let Iz = (Jz + d0) / (1 + d - d * (Jz + d0));
1380 let PQLMS = multiplyMatrices(IabtoCone_M, [Iz, az, bz]);
1381 let LMS = PQLMS.map(function(val) {
1382 let num = c1 - val ** pinv;
1383 let denom = c3 * val ** pinv - c2;
1384 let x = 1e4 * (num / denom) ** ninv;
1385 return x;
1386 });
1387 let [Xm, Ym, Za] = multiplyMatrices(ConetoXYZ_M, LMS);
1388 let Xa = (Xm + (b - 1) * Za) / b;
1389 let Ya = (Ym + (g - 1) * Xa) / g;
1390 return [Xa, Ya, Za];
1391 },
1392 formats: {
1393 // https://drafts.csswg.org/css-color-hdr/#Jzazbz
1394 "color": {
1395 coords: ["<number> | <percentage>", "<number> | <percentage>[-1,1]", "<number> | <percentage>[-1,1]"]
1396 }
1397 }
1398 });
1399
1400 // node_modules/colorjs.io/src/spaces/jzczhz.js
1401 var jzczhz_default = new ColorSpace({
1402 id: "jzczhz",
1403 name: "JzCzHz",
1404 coords: {
1405 jz: {
1406 refRange: [0, 1],
1407 name: "Jz"
1408 },
1409 cz: {
1410 refRange: [0, 1],
1411 name: "Chroma"
1412 },
1413 hz: {
1414 refRange: [0, 360],
1415 type: "angle",
1416 name: "Hue"
1417 }
1418 },
1419 base: jzazbz_default,
1420 fromBase(jzazbz) {
1421 let [Jz, az, bz] = jzazbz;
1422 let hue;
1423 const \u03B56 = 2e-4;
1424 if (Math.abs(az) < \u03B56 && Math.abs(bz) < \u03B56) {
1425 hue = NaN;
1426 } else {
1427 hue = Math.atan2(bz, az) * 180 / Math.PI;
1428 }
1429 return [
1430 Jz,
1431 // Jz is still Jz
1432 Math.sqrt(az ** 2 + bz ** 2),
1433 // Chroma
1434 constrain(hue)
1435 // Hue, in degrees [0 to 360)
1436 ];
1437 },
1438 toBase(jzczhz) {
1439 return [
1440 jzczhz[0],
1441 // Jz is still Jz
1442 jzczhz[1] * Math.cos(jzczhz[2] * Math.PI / 180),
1443 // az
1444 jzczhz[1] * Math.sin(jzczhz[2] * Math.PI / 180)
1445 // bz
1446 ];
1447 }
1448 });
1449
1450 // node_modules/colorjs.io/src/deltaE/deltaEJz.js
1451 function deltaEJz_default(color, sample) {
1452 [color, sample] = getColor([color, sample]);
1453 let [Jz1, Cz1, Hz1] = jzczhz_default.from(color);
1454 let [Jz2, Cz2, Hz2] = jzczhz_default.from(sample);
1455 let \u0394J = Jz1 - Jz2;
1456 let \u0394C = Cz1 - Cz2;
1457 if (Number.isNaN(Hz1) && Number.isNaN(Hz2)) {
1458 Hz1 = 0;
1459 Hz2 = 0;
1460 } else if (Number.isNaN(Hz1)) {
1461 Hz1 = Hz2;
1462 } else if (Number.isNaN(Hz2)) {
1463 Hz2 = Hz1;
1464 }
1465 let \u0394h = Hz1 - Hz2;
1466 let \u0394H = 2 * Math.sqrt(Cz1 * Cz2) * Math.sin(\u0394h / 2 * (Math.PI / 180));
1467 return Math.sqrt(\u0394J ** 2 + \u0394C ** 2 + \u0394H ** 2);
1468 }
1469
1470 // node_modules/colorjs.io/src/spaces/ictcp.js
1471 var c12 = 3424 / 4096;
1472 var c22 = 2413 / 128;
1473 var c32 = 2392 / 128;
1474 var m1 = 2610 / 16384;
1475 var m2 = 2523 / 32;
1476 var im1 = 16384 / 2610;
1477 var im2 = 32 / 2523;
1478 var XYZtoLMS_M2 = [
1479 [0.3592832590121217, 0.6976051147779502, -0.035891593232029],
1480 [-0.1920808463704993, 1.100476797037432, 0.0753748658519118],
1481 [0.0070797844607479, 0.0748396662186362, 0.8433265453898765]
1482 ];
1483 var LMStoIPT_M = [
1484 [2048 / 4096, 2048 / 4096, 0],
1485 [6610 / 4096, -13613 / 4096, 7003 / 4096],
1486 [17933 / 4096, -17390 / 4096, -543 / 4096]
1487 ];
1488 var IPTtoLMS_M = [
1489 [0.9999999999999998, 0.0086090370379328, 0.111029625003026],
1490 [0.9999999999999998, -0.0086090370379328, -0.1110296250030259],
1491 [0.9999999999999998, 0.5600313357106791, -0.3206271749873188]
1492 ];
1493 var LMStoXYZ_M2 = [
1494 [2.0701522183894223, -1.3263473389671563, 0.2066510476294053],
1495 [0.3647385209748072, 0.6805660249472273, -0.0453045459220347],
1496 [-0.0497472075358123, -0.0492609666966131, 1.1880659249923042]
1497 ];
1498 var ictcp_default = new ColorSpace({
1499 id: "ictcp",
1500 name: "ICTCP",
1501 // From BT.2100-2 page 7:
1502 // During production, signal values are expected to exceed the
1503 // range E′ = [0.0 : 1.0]. This provides processing headroom and avoids
1504 // signal degradation during cascaded processing. Such values of E′,
1505 // below 0.0 or exceeding 1.0, should not be clipped during production
1506 // and exchange.
1507 // Values below 0.0 should not be clipped in reference displays (even
1508 // though they represent “negative” light) to allow the black level of
1509 // the signal (LB) to be properly set using test signals known as “PLUGE”
1510 coords: {
1511 i: {
1512 refRange: [0, 1],
1513 // Constant luminance,
1514 name: "I"
1515 },
1516 ct: {
1517 refRange: [-0.5, 0.5],
1518 // Full BT.2020 gamut in range [-0.5, 0.5]
1519 name: "CT"
1520 },
1521 cp: {
1522 refRange: [-0.5, 0.5],
1523 name: "CP"
1524 }
1525 },
1526 base: xyz_abs_d65_default,
1527 fromBase(XYZ) {
1528 let LMS = multiplyMatrices(XYZtoLMS_M2, XYZ);
1529 return LMStoICtCp(LMS);
1530 },
1531 toBase(ICtCp) {
1532 let LMS = ICtCptoLMS(ICtCp);
1533 return multiplyMatrices(LMStoXYZ_M2, LMS);
1534 }
1535 });
1536 function LMStoICtCp(LMS) {
1537 let PQLMS = LMS.map(function(val) {
1538 let num = c12 + c22 * (val / 1e4) ** m1;
1539 let denom = 1 + c32 * (val / 1e4) ** m1;
1540 return (num / denom) ** m2;
1541 });
1542 return multiplyMatrices(LMStoIPT_M, PQLMS);
1543 }
1544 function ICtCptoLMS(ICtCp) {
1545 let PQLMS = multiplyMatrices(IPTtoLMS_M, ICtCp);
1546 let LMS = PQLMS.map(function(val) {
1547 let num = Math.max(val ** im2 - c12, 0);
1548 let denom = c22 - c32 * val ** im2;
1549 return 1e4 * (num / denom) ** im1;
1550 });
1551 return LMS;
1552 }
1553
1554 // node_modules/colorjs.io/src/deltaE/deltaEITP.js
1555 function deltaEITP_default(color, sample) {
1556 [color, sample] = getColor([color, sample]);
1557 let [I1, T1, P1] = ictcp_default.from(color);
1558 let [I2, T2, P2] = ictcp_default.from(sample);
1559 return 720 * Math.sqrt((I1 - I2) ** 2 + 0.25 * (T1 - T2) ** 2 + (P1 - P2) ** 2);
1560 }
1561
1562 // node_modules/colorjs.io/src/spaces/cam16.js
1563 var white2 = WHITES.D65;
1564 var adaptedCoef = 0.42;
1565 var adaptedCoefInv = 1 / adaptedCoef;
1566 var tau = 2 * Math.PI;
1567 var cat16 = [
1568 [0.401288, 0.650173, -0.051461],
1569 [-0.250268, 1.204414, 0.045854],
1570 [-2079e-6, 0.048952, 0.953127]
1571 ];
1572 var cat16Inv = [
1573 [1.8620678550872327, -1.0112546305316843, 0.14918677544445175],
1574 [0.38752654323613717, 0.6214474419314753, -0.008973985167612518],
1575 [-0.015841498849333856, -0.03412293802851557, 1.0499644368778496]
1576 ];
1577 var m12 = [
1578 [460, 451, 288],
1579 [460, -891, -261],
1580 [460, -220, -6300]
1581 ];
1582 var surroundMap = {
1583 dark: [0.8, 0.525, 0.8],
1584 dim: [0.9, 0.59, 0.9],
1585 average: [1, 0.69, 1]
1586 };
1587 var hueQuadMap = {
1588 // Red, Yellow, Green, Blue, Red
1589 h: [20.14, 90, 164.25, 237.53, 380.14],
1590 e: [0.8, 0.7, 1, 1.2, 0.8],
1591 H: [0, 100, 200, 300, 400]
1592 };
1593 var rad2deg = 180 / Math.PI;
1594 var deg2rad = Math.PI / 180;
1595 function adapt2(coords, fl) {
1596 const temp = coords.map((c) => {
1597 const x = spow(fl * Math.abs(c) * 0.01, adaptedCoef);
1598 return 400 * copySign(x, c) / (x + 27.13);
1599 });
1600 return temp;
1601 }
1602 function unadapt(adapted, fl) {
1603 const constant = 100 / fl * 27.13 ** adaptedCoefInv;
1604 return adapted.map((c) => {
1605 const cabs = Math.abs(c);
1606 return copySign(constant * spow(cabs / (400 - cabs), adaptedCoefInv), c);
1607 });
1608 }
1609 function hueQuadrature(h) {
1610 let hp = constrain(h);
1611 if (hp <= hueQuadMap.h[0]) {
1612 hp += 360;
1613 }
1614 const i = bisectLeft(hueQuadMap.h, hp) - 1;
1615 const [hi, hii] = hueQuadMap.h.slice(i, i + 2);
1616 const [ei, eii] = hueQuadMap.e.slice(i, i + 2);
1617 const Hi = hueQuadMap.H[i];
1618 const t = (hp - hi) / ei;
1619 return Hi + 100 * t / (t + (hii - hp) / eii);
1620 }
1621 function invHueQuadrature(H) {
1622 let Hp = (H % 400 + 400) % 400;
1623 const i = Math.floor(0.01 * Hp);
1624 Hp = Hp % 100;
1625 const [hi, hii] = hueQuadMap.h.slice(i, i + 2);
1626 const [ei, eii] = hueQuadMap.e.slice(i, i + 2);
1627 return constrain(
1628 (Hp * (eii * hi - ei * hii) - 100 * hi * eii) / (Hp * (eii - ei) - 100 * eii)
1629 );
1630 }
1631 function environment(refWhite, adaptingLuminance, backgroundLuminance, surround, discounting) {
1632 const env = {};
1633 env.discounting = discounting;
1634 env.refWhite = refWhite;
1635 env.surround = surround;
1636 const xyzW = refWhite.map((c) => {
1637 return c * 100;
1638 });
1639 env.la = adaptingLuminance;
1640 env.yb = backgroundLuminance;
1641 const yw = xyzW[1];
1642 const rgbW = multiplyMatrices(cat16, xyzW);
1643 surround = surroundMap[env.surround];
1644 const f = surround[0];
1645 env.c = surround[1];
1646 env.nc = surround[2];
1647 const k = 1 / (5 * env.la + 1);
1648 const k4 = k ** 4;
1649 env.fl = k4 * env.la + 0.1 * (1 - k4) * (1 - k4) * Math.cbrt(5 * env.la);
1650 env.flRoot = env.fl ** 0.25;
1651 env.n = env.yb / yw;
1652 env.z = 1.48 + Math.sqrt(env.n);
1653 env.nbb = 0.725 * env.n ** -0.2;
1654 env.ncb = env.nbb;
1655 const d2 = discounting ? 1 : Math.max(
1656 Math.min(f * (1 - 1 / 3.6 * Math.exp((-env.la - 42) / 92)), 1),
1657 0
1658 );
1659 env.dRgb = rgbW.map((c) => {
1660 return interpolate(1, yw / c, d2);
1661 });
1662 env.dRgbInv = env.dRgb.map((c) => {
1663 return 1 / c;
1664 });
1665 const rgbCW = rgbW.map((c, i) => {
1666 return c * env.dRgb[i];
1667 });
1668 const rgbAW = adapt2(rgbCW, env.fl);
1669 env.aW = env.nbb * (2 * rgbAW[0] + rgbAW[1] + 0.05 * rgbAW[2]);
1670 return env;
1671 }
1672 var viewingConditions = environment(
1673 white2,
1674 64 / Math.PI * 0.2,
1675 20,
1676 "average",
1677 false
1678 );
1679 function fromCam16(cam16, env) {
1680 if (!(cam16.J !== void 0 ^ cam16.Q !== void 0)) {
1681 throw new Error("Conversion requires one and only one: 'J' or 'Q'");
1682 }
1683 if (!(cam16.C !== void 0 ^ cam16.M !== void 0 ^ cam16.s !== void 0)) {
1684 throw new Error("Conversion requires one and only one: 'C', 'M' or 's'");
1685 }
1686 if (!(cam16.h !== void 0 ^ cam16.H !== void 0)) {
1687 throw new Error("Conversion requires one and only one: 'h' or 'H'");
1688 }
1689 if (cam16.J === 0 || cam16.Q === 0) {
1690 return [0, 0, 0];
1691 }
1692 let hRad = 0;
1693 if (cam16.h !== void 0) {
1694 hRad = constrain(cam16.h) * deg2rad;
1695 } else {
1696 hRad = invHueQuadrature(cam16.H) * deg2rad;
1697 }
1698 const cosh = Math.cos(hRad);
1699 const sinh = Math.sin(hRad);
1700 let Jroot = 0;
1701 if (cam16.J !== void 0) {
1702 Jroot = spow(cam16.J, 1 / 2) * 0.1;
1703 } else if (cam16.Q !== void 0) {
1704 Jroot = 0.25 * env.c * cam16.Q / ((env.aW + 4) * env.flRoot);
1705 }
1706 let alpha = 0;
1707 if (cam16.C !== void 0) {
1708 alpha = cam16.C / Jroot;
1709 } else if (cam16.M !== void 0) {
1710 alpha = cam16.M / env.flRoot / Jroot;
1711 } else if (cam16.s !== void 0) {
1712 alpha = 4e-4 * cam16.s ** 2 * (env.aW + 4) / env.c;
1713 }
1714 const t = spow(
1715 alpha * Math.pow(1.64 - Math.pow(0.29, env.n), -0.73),
1716 10 / 9
1717 );
1718 const et = 0.25 * (Math.cos(hRad + 2) + 3.8);
1719 const A = env.aW * spow(Jroot, 2 / env.c / env.z);
1720 const p1 = 5e4 / 13 * env.nc * env.ncb * et;
1721 const p2 = A / env.nbb;
1722 const r = 23 * (p2 + 0.305) * zdiv(t, 23 * p1 + t * (11 * cosh + 108 * sinh));
1723 const a = r * cosh;
1724 const b2 = r * sinh;
1725 const rgb_c = unadapt(
1726 multiplyMatrices(m12, [p2, a, b2]).map((c) => {
1727 return c * 1 / 1403;
1728 }),
1729 env.fl
1730 );
1731 return multiplyMatrices(
1732 cat16Inv,
1733 rgb_c.map((c, i) => {
1734 return c * env.dRgbInv[i];
1735 })
1736 ).map((c) => {
1737 return c / 100;
1738 });
1739 }
1740 function toCam16(xyzd65, env) {
1741 const xyz100 = xyzd65.map((c) => {
1742 return c * 100;
1743 });
1744 const rgbA = adapt2(
1745 multiplyMatrices(cat16, xyz100).map((c, i) => {
1746 return c * env.dRgb[i];
1747 }),
1748 env.fl
1749 );
1750 const a = rgbA[0] + (-12 * rgbA[1] + rgbA[2]) / 11;
1751 const b2 = (rgbA[0] + rgbA[1] - 2 * rgbA[2]) / 9;
1752 const hRad = (Math.atan2(b2, a) % tau + tau) % tau;
1753 const et = 0.25 * (Math.cos(hRad + 2) + 3.8);
1754 const t = 5e4 / 13 * env.nc * env.ncb * zdiv(
1755 et * Math.sqrt(a ** 2 + b2 ** 2),
1756 rgbA[0] + rgbA[1] + 1.05 * rgbA[2] + 0.305
1757 );
1758 const alpha = spow(t, 0.9) * Math.pow(1.64 - Math.pow(0.29, env.n), 0.73);
1759 const A = env.nbb * (2 * rgbA[0] + rgbA[1] + 0.05 * rgbA[2]);
1760 const Jroot = spow(A / env.aW, 0.5 * env.c * env.z);
1761 const J = 100 * spow(Jroot, 2);
1762 const Q = 4 / env.c * Jroot * (env.aW + 4) * env.flRoot;
1763 const C = alpha * Jroot;
1764 const M = C * env.flRoot;
1765 const h = constrain(hRad * rad2deg);
1766 const H = hueQuadrature(h);
1767 const s = 50 * spow(env.c * alpha / (env.aW + 4), 1 / 2);
1768 return { J, C, h, s, Q, M, H };
1769 }
1770 var cam16_default = new ColorSpace({
1771 id: "cam16-jmh",
1772 cssId: "--cam16-jmh",
1773 name: "CAM16-JMh",
1774 coords: {
1775 j: {
1776 refRange: [0, 100],
1777 name: "J"
1778 },
1779 m: {
1780 refRange: [0, 105],
1781 name: "Colorfulness"
1782 },
1783 h: {
1784 refRange: [0, 360],
1785 type: "angle",
1786 name: "Hue"
1787 }
1788 },
1789 base: xyz_d65_default,
1790 fromBase(xyz) {
1791 const cam16 = toCam16(xyz, viewingConditions);
1792 return [cam16.J, cam16.M, cam16.h];
1793 },
1794 toBase(cam16) {
1795 return fromCam16(
1796 { J: cam16[0], M: cam16[1], h: cam16[2] },
1797 viewingConditions
1798 );
1799 }
1800 });
1801
1802 // node_modules/colorjs.io/src/spaces/hct.js
1803 var white3 = WHITES.D65;
1804 var \u03B55 = 216 / 24389;
1805 var \u03BA2 = 24389 / 27;
1806 function toLstar(y) {
1807 const fy = y > \u03B55 ? Math.cbrt(y) : (\u03BA2 * y + 16) / 116;
1808 return 116 * fy - 16;
1809 }
1810 function fromLstar(lstar) {
1811 return lstar > 8 ? Math.pow((lstar + 16) / 116, 3) : lstar / \u03BA2;
1812 }
1813 function fromHct(coords, env) {
1814 let [h, c, t] = coords;
1815 let xyz = [];
1816 let j = 0;
1817 if (t === 0) {
1818 return [0, 0, 0];
1819 }
1820 let y = fromLstar(t);
1821 if (t > 0) {
1822 j = 0.00379058511492914 * t ** 2 + 0.608983189401032 * t + 0.9155088574762233;
1823 } else {
1824 j = 9514440756550361e-21 * t ** 2 + 0.08693057439788597 * t - 21.928975842194614;
1825 }
1826 const threshold = 2e-12;
1827 const max_attempts = 15;
1828 let attempt = 0;
1829 let last2 = Infinity;
1830 let best = j;
1831 while (attempt <= max_attempts) {
1832 xyz = fromCam16({ J: j, C: c, h }, env);
1833 const delta = Math.abs(xyz[1] - y);
1834 if (delta < last2) {
1835 if (delta <= threshold) {
1836 return xyz;
1837 }
1838 best = j;
1839 last2 = delta;
1840 }
1841 j = j - (xyz[1] - y) * j / (2 * xyz[1]);
1842 attempt += 1;
1843 }
1844 return fromCam16({ J: j, C: c, h }, env);
1845 }
1846 function toHct(xyz, env) {
1847 const t = toLstar(xyz[1]);
1848 if (t === 0) {
1849 return [0, 0, 0];
1850 }
1851 const cam16 = toCam16(xyz, viewingConditions2);
1852 return [constrain(cam16.h), cam16.C, t];
1853 }
1854 var viewingConditions2 = environment(
1855 white3,
1856 200 / Math.PI * fromLstar(50),
1857 fromLstar(50) * 100,
1858 "average",
1859 false
1860 );
1861 var hct_default = new ColorSpace({
1862 id: "hct",
1863 name: "HCT",
1864 coords: {
1865 h: {
1866 refRange: [0, 360],
1867 type: "angle",
1868 name: "Hue"
1869 },
1870 c: {
1871 refRange: [0, 145],
1872 name: "Colorfulness"
1873 },
1874 t: {
1875 refRange: [0, 100],
1876 name: "Tone"
1877 }
1878 },
1879 base: xyz_d65_default,
1880 fromBase(xyz) {
1881 return toHct(xyz, viewingConditions2);
1882 },
1883 toBase(hct) {
1884 return fromHct(hct, viewingConditions2);
1885 },
1886 formats: {
1887 color: {
1888 id: "--hct",
1889 coords: ["<number> | <angle>", "<percentage> | <number>", "<percentage> | <number>"]
1890 }
1891 }
1892 });
1893
1894 // node_modules/colorjs.io/src/deltaE/deltaEHCT.js
1895 var rad2deg2 = 180 / Math.PI;
1896 var deg2rad2 = Math.PI / 180;
1897 var ucsCoeff = [1, 7e-3, 0.0228];
1898 function convertUcsAb(coords) {
1899 if (coords[1] < 0) {
1900 coords = hct_default.fromBase(hct_default.toBase(coords));
1901 }
1902 const M = Math.log(Math.max(1 + ucsCoeff[2] * coords[1] * viewingConditions2.flRoot, 1)) / ucsCoeff[2];
1903 const hrad = coords[0] * deg2rad2;
1904 const a = M * Math.cos(hrad);
1905 const b2 = M * Math.sin(hrad);
1906 return [coords[2], a, b2];
1907 }
1908 function deltaEHCT_default(color, sample) {
1909 [color, sample] = getColor([color, sample]);
1910 let [t1, a1, b1] = convertUcsAb(hct_default.from(color));
1911 let [t2, a2, b2] = convertUcsAb(hct_default.from(sample));
1912 return Math.sqrt((t1 - t2) ** 2 + (a1 - a2) ** 2 + (b1 - b2) ** 2);
1913 }
1914
1915 // node_modules/colorjs.io/src/deltaE/index.js
1916 var deltaE_default = {
1917 deltaE76,
1918 deltaECMC: deltaECMC_default,
1919 deltaE2000: deltaE2000_default,
1920 deltaEJz: deltaEJz_default,
1921 deltaEITP: deltaEITP_default,
1922 deltaEOK: deltaEOK_default,
1923 deltaEHCT: deltaEHCT_default
1924 };
1925
1926 // node_modules/colorjs.io/src/toGamut.js
1927 function calcEpsilon(jnd) {
1928 const order = !jnd ? 0 : Math.floor(Math.log10(Math.abs(jnd)));
1929 return Math.max(parseFloat(`1e${order - 2}`), 1e-6);
1930 }
1931 var GMAPPRESET = {
1932 "hct": {
1933 method: "hct.c",
1934 jnd: 2,
1935 deltaEMethod: "hct",
1936 blackWhiteClamp: {}
1937 },
1938 "hct-tonal": {
1939 method: "hct.c",
1940 jnd: 0,
1941 deltaEMethod: "hct",
1942 blackWhiteClamp: { channel: "hct.t", min: 0, max: 100 }
1943 }
1944 };
1945 function toGamut(color, {
1946 method = defaults_default.gamut_mapping,
1947 space = void 0,
1948 deltaEMethod = "",
1949 jnd = 2,
1950 blackWhiteClamp = {}
1951 } = {}) {
1952 color = getColor(color);
1953 if (isString(arguments[1])) {
1954 space = arguments[1];
1955 } else if (!space) {
1956 space = color.space;
1957 }
1958 space = ColorSpace.get(space);
1959 if (inGamut(color, space, { epsilon: 0 })) {
1960 return color;
1961 }
1962 let spaceColor;
1963 if (method === "css") {
1964 spaceColor = toGamutCSS(color, { space });
1965 } else {
1966 if (method !== "clip" && !inGamut(color, space)) {
1967 if (Object.prototype.hasOwnProperty.call(GMAPPRESET, method)) {
1968 ({ method, jnd, deltaEMethod, blackWhiteClamp } = GMAPPRESET[method]);
1969 }
1970 let de = deltaE2000_default;
1971 if (deltaEMethod !== "") {
1972 for (let m in deltaE_default) {
1973 if ("deltae" + deltaEMethod.toLowerCase() === m.toLowerCase()) {
1974 de = deltaE_default[m];
1975 break;
1976 }
1977 }
1978 }
1979 let clipped = toGamut(to(color, space), { method: "clip", space });
1980 if (de(color, clipped) > jnd) {
1981 if (Object.keys(blackWhiteClamp).length === 3) {
1982 let channelMeta = ColorSpace.resolveCoord(blackWhiteClamp.channel);
1983 let channel = get(to(color, channelMeta.space), channelMeta.id);
1984 if (isNone(channel)) {
1985 channel = 0;
1986 }
1987 if (channel >= blackWhiteClamp.max) {
1988 return to({ space: "xyz-d65", coords: WHITES["D65"] }, color.space);
1989 } else if (channel <= blackWhiteClamp.min) {
1990 return to({ space: "xyz-d65", coords: [0, 0, 0] }, color.space);
1991 }
1992 }
1993 let coordMeta = ColorSpace.resolveCoord(method);
1994 let mapSpace = coordMeta.space;
1995 let coordId = coordMeta.id;
1996 let mappedColor = to(color, mapSpace);
1997 mappedColor.coords.forEach((c, i) => {
1998 if (isNone(c)) {
1999 mappedColor.coords[i] = 0;
2000 }
2001 });
2002 let bounds = coordMeta.range || coordMeta.refRange;
2003 let min = bounds[0];
2004 let \u03B56 = calcEpsilon(jnd);
2005 let low = min;
2006 let high = get(mappedColor, coordId);
2007 while (high - low > \u03B56) {
2008 let clipped2 = clone(mappedColor);
2009 clipped2 = toGamut(clipped2, { space, method: "clip" });
2010 let deltaE = de(mappedColor, clipped2);
2011 if (deltaE - jnd < \u03B56) {
2012 low = get(mappedColor, coordId);
2013 } else {
2014 high = get(mappedColor, coordId);
2015 }
2016 set(mappedColor, coordId, (low + high) / 2);
2017 }
2018 spaceColor = to(mappedColor, space);
2019 } else {
2020 spaceColor = clipped;
2021 }
2022 } else {
2023 spaceColor = to(color, space);
2024 }
2025 if (method === "clip" || !inGamut(spaceColor, space, { epsilon: 0 })) {
2026 let bounds = Object.values(space.coords).map((c) => c.range || []);
2027 spaceColor.coords = spaceColor.coords.map((c, i) => {
2028 let [min, max] = bounds[i];
2029 if (min !== void 0) {
2030 c = Math.max(min, c);
2031 }
2032 if (max !== void 0) {
2033 c = Math.min(c, max);
2034 }
2035 return c;
2036 });
2037 }
2038 }
2039 if (space !== color.space) {
2040 spaceColor = to(spaceColor, color.space);
2041 }
2042 color.coords = spaceColor.coords;
2043 return color;
2044 }
2045 toGamut.returns = "color";
2046 var COLORS = {
2047 WHITE: { space: oklab_default, coords: [1, 0, 0] },
2048 BLACK: { space: oklab_default, coords: [0, 0, 0] }
2049 };
2050 function toGamutCSS(origin, { space } = {}) {
2051 const JND = 0.02;
2052 const \u03B56 = 1e-4;
2053 origin = getColor(origin);
2054 if (!space) {
2055 space = origin.space;
2056 }
2057 space = ColorSpace.get(space);
2058 const oklchSpace = ColorSpace.get("oklch");
2059 if (space.isUnbounded) {
2060 return to(origin, space);
2061 }
2062 const origin_OKLCH = to(origin, oklchSpace);
2063 let L = origin_OKLCH.coords[0];
2064 if (L >= 1) {
2065 const white4 = to(COLORS.WHITE, space);
2066 white4.alpha = origin.alpha;
2067 return to(white4, space);
2068 }
2069 if (L <= 0) {
2070 const black = to(COLORS.BLACK, space);
2071 black.alpha = origin.alpha;
2072 return to(black, space);
2073 }
2074 if (inGamut(origin_OKLCH, space, { epsilon: 0 })) {
2075 return to(origin_OKLCH, space);
2076 }
2077 function clip(_color) {
2078 const destColor = to(_color, space);
2079 const spaceCoords = Object.values(space.coords);
2080 destColor.coords = destColor.coords.map((coord, index) => {
2081 if ("range" in spaceCoords[index]) {
2082 const [min2, max2] = spaceCoords[index].range;
2083 return clamp(min2, coord, max2);
2084 }
2085 return coord;
2086 });
2087 return destColor;
2088 }
2089 let min = 0;
2090 let max = origin_OKLCH.coords[1];
2091 let min_inGamut = true;
2092 let current = clone(origin_OKLCH);
2093 let clipped = clip(current);
2094 let E = deltaEOK_default(clipped, current);
2095 if (E < JND) {
2096 return clipped;
2097 }
2098 while (max - min > \u03B56) {
2099 const chroma = (min + max) / 2;
2100 current.coords[1] = chroma;
2101 if (min_inGamut && inGamut(current, space, { epsilon: 0 })) {
2102 min = chroma;
2103 } else {
2104 clipped = clip(current);
2105 E = deltaEOK_default(clipped, current);
2106 if (E < JND) {
2107 if (JND - E < \u03B56) {
2108 break;
2109 } else {
2110 min_inGamut = false;
2111 min = chroma;
2112 }
2113 } else {
2114 max = chroma;
2115 }
2116 }
2117 }
2118 return clipped;
2119 }
2120
2121 // node_modules/colorjs.io/src/to.js
2122 function to(color, space, { inGamut: inGamut2 } = {}) {
2123 color = getColor(color);
2124 space = ColorSpace.get(space);
2125 let coords = space.from(color);
2126 let ret = { space, coords, alpha: color.alpha };
2127 if (inGamut2) {
2128 ret = toGamut(ret, inGamut2 === true ? void 0 : inGamut2);
2129 }
2130 return ret;
2131 }
2132 to.returns = "color";
2133
2134 // node_modules/colorjs.io/src/serialize.js
2135 function serialize(color, {
2136 precision = defaults_default.precision,
2137 format = "default",
2138 inGamut: inGamut2 = true,
2139 ...customOptions
2140 } = {}) {
2141 let ret;
2142 color = getColor(color);
2143 let formatId = format;
2144 format = color.space.getFormat(format) ?? color.space.getFormat("default") ?? ColorSpace.DEFAULT_FORMAT;
2145 let coords = color.coords.slice();
2146 inGamut2 ||= format.toGamut;
2147 if (inGamut2 && !inGamut(color)) {
2148 coords = toGamut(clone(color), inGamut2 === true ? void 0 : inGamut2).coords;
2149 }
2150 if (format.type === "custom") {
2151 customOptions.precision = precision;
2152 if (format.serialize) {
2153 ret = format.serialize(coords, color.alpha, customOptions);
2154 } else {
2155 throw new TypeError(`format ${formatId} can only be used to parse colors, not for serialization`);
2156 }
2157 } else {
2158 let name = format.name || "color";
2159 if (format.serializeCoords) {
2160 coords = format.serializeCoords(coords, precision);
2161 } else {
2162 if (precision !== null) {
2163 coords = coords.map((c) => {
2164 return serializeNumber(c, { precision });
2165 });
2166 }
2167 }
2168 let args = [...coords];
2169 if (name === "color") {
2170 let cssId = format.id || format.ids?.[0] || color.space.id;
2171 args.unshift(cssId);
2172 }
2173 let alpha = color.alpha;
2174 if (precision !== null) {
2175 alpha = serializeNumber(alpha, { precision });
2176 }
2177 let strAlpha = color.alpha >= 1 || format.noAlpha ? "" : `${format.commas ? "," : " /"} ${alpha}`;
2178 ret = `${name}(${args.join(format.commas ? ", " : " ")}${strAlpha})`;
2179 }
2180 return ret;
2181 }
2182
2183 // node_modules/colorjs.io/src/spaces/p3-linear.js
2184 var toXYZ_M = [
2185 [0.4865709486482162, 0.26566769316909306, 0.1982172852343625],
2186 [0.2289745640697488, 0.6917385218365064, 0.079286914093745],
2187 [0, 0.04511338185890264, 1.043944368900976]
2188 ];
2189 var fromXYZ_M = [
2190 [2.493496911941425, -0.9313836179191239, -0.40271078445071684],
2191 [-0.8294889695615747, 1.7626640603183463, 0.023624685841943577],
2192 [0.03584583024378447, -0.07617238926804182, 0.9568845240076872]
2193 ];
2194 var p3_linear_default = new RGBColorSpace({
2195 id: "p3-linear",
2196 cssId: "--display-p3-linear",
2197 name: "Linear P3",
2198 white: "D65",
2199 toXYZ_M,
2200 fromXYZ_M
2201 });
2202
2203 // node_modules/colorjs.io/src/spaces/srgb-linear.js
2204 var toXYZ_M2 = [
2205 [0.41239079926595934, 0.357584339383878, 0.1804807884018343],
2206 [0.21263900587151027, 0.715168678767756, 0.07219231536073371],
2207 [0.01933081871559182, 0.11919477979462598, 0.9505321522496607]
2208 ];
2209 var fromXYZ_M2 = [
2210 [3.2409699419045226, -1.537383177570094, -0.4986107602930034],
2211 [-0.9692436362808796, 1.8759675015077202, 0.04155505740717559],
2212 [0.05563007969699366, -0.20397695888897652, 1.0569715142428786]
2213 ];
2214 var srgb_linear_default = new RGBColorSpace({
2215 id: "srgb-linear",
2216 name: "Linear sRGB",
2217 white: "D65",
2218 toXYZ_M: toXYZ_M2,
2219 fromXYZ_M: fromXYZ_M2
2220 });
2221
2222 // node_modules/colorjs.io/src/keywords.js
2223 var keywords_default = {
2224 "aliceblue": [240 / 255, 248 / 255, 1],
2225 "antiquewhite": [250 / 255, 235 / 255, 215 / 255],
2226 "aqua": [0, 1, 1],
2227 "aquamarine": [127 / 255, 1, 212 / 255],
2228 "azure": [240 / 255, 1, 1],
2229 "beige": [245 / 255, 245 / 255, 220 / 255],
2230 "bisque": [1, 228 / 255, 196 / 255],
2231 "black": [0, 0, 0],
2232 "blanchedalmond": [1, 235 / 255, 205 / 255],
2233 "blue": [0, 0, 1],
2234 "blueviolet": [138 / 255, 43 / 255, 226 / 255],
2235 "brown": [165 / 255, 42 / 255, 42 / 255],
2236 "burlywood": [222 / 255, 184 / 255, 135 / 255],
2237 "cadetblue": [95 / 255, 158 / 255, 160 / 255],
2238 "chartreuse": [127 / 255, 1, 0],
2239 "chocolate": [210 / 255, 105 / 255, 30 / 255],
2240 "coral": [1, 127 / 255, 80 / 255],
2241 "cornflowerblue": [100 / 255, 149 / 255, 237 / 255],
2242 "cornsilk": [1, 248 / 255, 220 / 255],
2243 "crimson": [220 / 255, 20 / 255, 60 / 255],
2244 "cyan": [0, 1, 1],
2245 "darkblue": [0, 0, 139 / 255],
2246 "darkcyan": [0, 139 / 255, 139 / 255],
2247 "darkgoldenrod": [184 / 255, 134 / 255, 11 / 255],
2248 "darkgray": [169 / 255, 169 / 255, 169 / 255],
2249 "darkgreen": [0, 100 / 255, 0],
2250 "darkgrey": [169 / 255, 169 / 255, 169 / 255],
2251 "darkkhaki": [189 / 255, 183 / 255, 107 / 255],
2252 "darkmagenta": [139 / 255, 0, 139 / 255],
2253 "darkolivegreen": [85 / 255, 107 / 255, 47 / 255],
2254 "darkorange": [1, 140 / 255, 0],
2255 "darkorchid": [153 / 255, 50 / 255, 204 / 255],
2256 "darkred": [139 / 255, 0, 0],
2257 "darksalmon": [233 / 255, 150 / 255, 122 / 255],
2258 "darkseagreen": [143 / 255, 188 / 255, 143 / 255],
2259 "darkslateblue": [72 / 255, 61 / 255, 139 / 255],
2260 "darkslategray": [47 / 255, 79 / 255, 79 / 255],
2261 "darkslategrey": [47 / 255, 79 / 255, 79 / 255],
2262 "darkturquoise": [0, 206 / 255, 209 / 255],
2263 "darkviolet": [148 / 255, 0, 211 / 255],
2264 "deeppink": [1, 20 / 255, 147 / 255],
2265 "deepskyblue": [0, 191 / 255, 1],
2266 "dimgray": [105 / 255, 105 / 255, 105 / 255],
2267 "dimgrey": [105 / 255, 105 / 255, 105 / 255],
2268 "dodgerblue": [30 / 255, 144 / 255, 1],
2269 "firebrick": [178 / 255, 34 / 255, 34 / 255],
2270 "floralwhite": [1, 250 / 255, 240 / 255],
2271 "forestgreen": [34 / 255, 139 / 255, 34 / 255],
2272 "fuchsia": [1, 0, 1],
2273 "gainsboro": [220 / 255, 220 / 255, 220 / 255],
2274 "ghostwhite": [248 / 255, 248 / 255, 1],
2275 "gold": [1, 215 / 255, 0],
2276 "goldenrod": [218 / 255, 165 / 255, 32 / 255],
2277 "gray": [128 / 255, 128 / 255, 128 / 255],
2278 "green": [0, 128 / 255, 0],
2279 "greenyellow": [173 / 255, 1, 47 / 255],
2280 "grey": [128 / 255, 128 / 255, 128 / 255],
2281 "honeydew": [240 / 255, 1, 240 / 255],
2282 "hotpink": [1, 105 / 255, 180 / 255],
2283 "indianred": [205 / 255, 92 / 255, 92 / 255],
2284 "indigo": [75 / 255, 0, 130 / 255],
2285 "ivory": [1, 1, 240 / 255],
2286 "khaki": [240 / 255, 230 / 255, 140 / 255],
2287 "lavender": [230 / 255, 230 / 255, 250 / 255],
2288 "lavenderblush": [1, 240 / 255, 245 / 255],
2289 "lawngreen": [124 / 255, 252 / 255, 0],
2290 "lemonchiffon": [1, 250 / 255, 205 / 255],
2291 "lightblue": [173 / 255, 216 / 255, 230 / 255],
2292 "lightcoral": [240 / 255, 128 / 255, 128 / 255],
2293 "lightcyan": [224 / 255, 1, 1],
2294 "lightgoldenrodyellow": [250 / 255, 250 / 255, 210 / 255],
2295 "lightgray": [211 / 255, 211 / 255, 211 / 255],
2296 "lightgreen": [144 / 255, 238 / 255, 144 / 255],
2297 "lightgrey": [211 / 255, 211 / 255, 211 / 255],
2298 "lightpink": [1, 182 / 255, 193 / 255],
2299 "lightsalmon": [1, 160 / 255, 122 / 255],
2300 "lightseagreen": [32 / 255, 178 / 255, 170 / 255],
2301 "lightskyblue": [135 / 255, 206 / 255, 250 / 255],
2302 "lightslategray": [119 / 255, 136 / 255, 153 / 255],
2303 "lightslategrey": [119 / 255, 136 / 255, 153 / 255],
2304 "lightsteelblue": [176 / 255, 196 / 255, 222 / 255],
2305 "lightyellow": [1, 1, 224 / 255],
2306 "lime": [0, 1, 0],
2307 "limegreen": [50 / 255, 205 / 255, 50 / 255],
2308 "linen": [250 / 255, 240 / 255, 230 / 255],
2309 "magenta": [1, 0, 1],
2310 "maroon": [128 / 255, 0, 0],
2311 "mediumaquamarine": [102 / 255, 205 / 255, 170 / 255],
2312 "mediumblue": [0, 0, 205 / 255],
2313 "mediumorchid": [186 / 255, 85 / 255, 211 / 255],
2314 "mediumpurple": [147 / 255, 112 / 255, 219 / 255],
2315 "mediumseagreen": [60 / 255, 179 / 255, 113 / 255],
2316 "mediumslateblue": [123 / 255, 104 / 255, 238 / 255],
2317 "mediumspringgreen": [0, 250 / 255, 154 / 255],
2318 "mediumturquoise": [72 / 255, 209 / 255, 204 / 255],
2319 "mediumvioletred": [199 / 255, 21 / 255, 133 / 255],
2320 "midnightblue": [25 / 255, 25 / 255, 112 / 255],
2321 "mintcream": [245 / 255, 1, 250 / 255],
2322 "mistyrose": [1, 228 / 255, 225 / 255],
2323 "moccasin": [1, 228 / 255, 181 / 255],
2324 "navajowhite": [1, 222 / 255, 173 / 255],
2325 "navy": [0, 0, 128 / 255],
2326 "oldlace": [253 / 255, 245 / 255, 230 / 255],
2327 "olive": [128 / 255, 128 / 255, 0],
2328 "olivedrab": [107 / 255, 142 / 255, 35 / 255],
2329 "orange": [1, 165 / 255, 0],
2330 "orangered": [1, 69 / 255, 0],
2331 "orchid": [218 / 255, 112 / 255, 214 / 255],
2332 "palegoldenrod": [238 / 255, 232 / 255, 170 / 255],
2333 "palegreen": [152 / 255, 251 / 255, 152 / 255],
2334 "paleturquoise": [175 / 255, 238 / 255, 238 / 255],
2335 "palevioletred": [219 / 255, 112 / 255, 147 / 255],
2336 "papayawhip": [1, 239 / 255, 213 / 255],
2337 "peachpuff": [1, 218 / 255, 185 / 255],
2338 "peru": [205 / 255, 133 / 255, 63 / 255],
2339 "pink": [1, 192 / 255, 203 / 255],
2340 "plum": [221 / 255, 160 / 255, 221 / 255],
2341 "powderblue": [176 / 255, 224 / 255, 230 / 255],
2342 "purple": [128 / 255, 0, 128 / 255],
2343 "rebeccapurple": [102 / 255, 51 / 255, 153 / 255],
2344 "red": [1, 0, 0],
2345 "rosybrown": [188 / 255, 143 / 255, 143 / 255],
2346 "royalblue": [65 / 255, 105 / 255, 225 / 255],
2347 "saddlebrown": [139 / 255, 69 / 255, 19 / 255],
2348 "salmon": [250 / 255, 128 / 255, 114 / 255],
2349 "sandybrown": [244 / 255, 164 / 255, 96 / 255],
2350 "seagreen": [46 / 255, 139 / 255, 87 / 255],
2351 "seashell": [1, 245 / 255, 238 / 255],
2352 "sienna": [160 / 255, 82 / 255, 45 / 255],
2353 "silver": [192 / 255, 192 / 255, 192 / 255],
2354 "skyblue": [135 / 255, 206 / 255, 235 / 255],
2355 "slateblue": [106 / 255, 90 / 255, 205 / 255],
2356 "slategray": [112 / 255, 128 / 255, 144 / 255],
2357 "slategrey": [112 / 255, 128 / 255, 144 / 255],
2358 "snow": [1, 250 / 255, 250 / 255],
2359 "springgreen": [0, 1, 127 / 255],
2360 "steelblue": [70 / 255, 130 / 255, 180 / 255],
2361 "tan": [210 / 255, 180 / 255, 140 / 255],
2362 "teal": [0, 128 / 255, 128 / 255],
2363 "thistle": [216 / 255, 191 / 255, 216 / 255],
2364 "tomato": [1, 99 / 255, 71 / 255],
2365 "turquoise": [64 / 255, 224 / 255, 208 / 255],
2366 "violet": [238 / 255, 130 / 255, 238 / 255],
2367 "wheat": [245 / 255, 222 / 255, 179 / 255],
2368 "white": [1, 1, 1],
2369 "whitesmoke": [245 / 255, 245 / 255, 245 / 255],
2370 "yellow": [1, 1, 0],
2371 "yellowgreen": [154 / 255, 205 / 255, 50 / 255]
2372 };
2373
2374 // node_modules/colorjs.io/src/spaces/srgb.js
2375 var coordGrammar = Array(3).fill("<percentage> | <number>[0, 255]");
2376 var coordGrammarNumber = Array(3).fill("<number>[0, 255]");
2377 var srgb_default = new RGBColorSpace({
2378 id: "srgb",
2379 name: "sRGB",
2380 base: srgb_linear_default,
2381 fromBase: (rgb) => {
2382 return rgb.map((val) => {
2383 let sign = val < 0 ? -1 : 1;
2384 let abs = val * sign;
2385 if (abs > 31308e-7) {
2386 return sign * (1.055 * abs ** (1 / 2.4) - 0.055);
2387 }
2388 return 12.92 * val;
2389 });
2390 },
2391 toBase: (rgb) => {
2392 return rgb.map((val) => {
2393 let sign = val < 0 ? -1 : 1;
2394 let abs = val * sign;
2395 if (abs <= 0.04045) {
2396 return val / 12.92;
2397 }
2398 return sign * ((abs + 0.055) / 1.055) ** 2.4;
2399 });
2400 },
2401 formats: {
2402 "rgb": {
2403 coords: coordGrammar
2404 },
2405 "rgb_number": {
2406 name: "rgb",
2407 commas: true,
2408 coords: coordGrammarNumber,
2409 noAlpha: true
2410 },
2411 "color": {
2412 /* use defaults */
2413 },
2414 "rgba": {
2415 coords: coordGrammar,
2416 commas: true,
2417 lastAlpha: true
2418 },
2419 "rgba_number": {
2420 name: "rgba",
2421 commas: true,
2422 coords: coordGrammarNumber
2423 },
2424 "hex": {
2425 type: "custom",
2426 toGamut: true,
2427 test: (str) => /^#([a-f0-9]{3,4}){1,2}$/i.test(str),
2428 parse(str) {
2429 if (str.length <= 5) {
2430 str = str.replace(/[a-f0-9]/gi, "$&$&");
2431 }
2432 let rgba = [];
2433 str.replace(/[a-f0-9]{2}/gi, (component) => {
2434 rgba.push(parseInt(component, 16) / 255);
2435 });
2436 return {
2437 spaceId: "srgb",
2438 coords: rgba.slice(0, 3),
2439 alpha: rgba.slice(3)[0]
2440 };
2441 },
2442 serialize: (coords, alpha, {
2443 collapse = true
2444 // collapse to 3-4 digit hex when possible?
2445 } = {}) => {
2446 if (alpha < 1) {
2447 coords.push(alpha);
2448 }
2449 coords = coords.map((c) => Math.round(c * 255));
2450 let collapsible = collapse && coords.every((c) => c % 17 === 0);
2451 let hex = coords.map((c) => {
2452 if (collapsible) {
2453 return (c / 17).toString(16);
2454 }
2455 return c.toString(16).padStart(2, "0");
2456 }).join("");
2457 return "#" + hex;
2458 }
2459 },
2460 "keyword": {
2461 type: "custom",
2462 test: (str) => /^[a-z]+$/i.test(str),
2463 parse(str) {
2464 str = str.toLowerCase();
2465 let ret = { spaceId: "srgb", coords: null, alpha: 1 };
2466 if (str === "transparent") {
2467 ret.coords = keywords_default.black;
2468 ret.alpha = 0;
2469 } else {
2470 ret.coords = keywords_default[str];
2471 }
2472 if (ret.coords) {
2473 return ret;
2474 }
2475 }
2476 }
2477 }
2478 });
2479
2480 // node_modules/colorjs.io/src/spaces/p3.js
2481 var p3_default = new RGBColorSpace({
2482 id: "p3",
2483 cssId: "display-p3",
2484 name: "P3",
2485 base: p3_linear_default,
2486 // Gamma encoding/decoding is the same as sRGB
2487 fromBase: srgb_default.fromBase,
2488 toBase: srgb_default.toBase
2489 });
2490
2491 // node_modules/colorjs.io/src/luminance.js
2492 function getLuminance(color) {
2493 return get(color, [xyz_d65_default, "y"]);
2494 }
2495
2496 // node_modules/colorjs.io/src/contrast/WCAG21.js
2497 function contrastWCAG21(color1, color2) {
2498 color1 = getColor(color1);
2499 color2 = getColor(color2);
2500 let Y1 = Math.max(getLuminance(color1), 0);
2501 let Y2 = Math.max(getLuminance(color2), 0);
2502 if (Y2 > Y1) {
2503 [Y1, Y2] = [Y2, Y1];
2504 }
2505 return (Y1 + 0.05) / (Y2 + 0.05);
2506 }
2507
2508 // node_modules/colorjs.io/src/spaces/hsl.js
2509 var hsl_default = new ColorSpace({
2510 id: "hsl",
2511 name: "HSL",
2512 coords: {
2513 h: {
2514 refRange: [0, 360],
2515 type: "angle",
2516 name: "Hue"
2517 },
2518 s: {
2519 range: [0, 100],
2520 name: "Saturation"
2521 },
2522 l: {
2523 range: [0, 100],
2524 name: "Lightness"
2525 }
2526 },
2527 base: srgb_default,
2528 // Adapted from https://drafts.csswg.org/css-color-4/better-rgbToHsl.js
2529 fromBase: (rgb) => {
2530 let max = Math.max(...rgb);
2531 let min = Math.min(...rgb);
2532 let [r, g2, b2] = rgb;
2533 let [h, s, l] = [NaN, 0, (min + max) / 2];
2534 let d2 = max - min;
2535 if (d2 !== 0) {
2536 s = l === 0 || l === 1 ? 0 : (max - l) / Math.min(l, 1 - l);
2537 switch (max) {
2538 case r:
2539 h = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
2540 break;
2541 case g2:
2542 h = (b2 - r) / d2 + 2;
2543 break;
2544 case b2:
2545 h = (r - g2) / d2 + 4;
2546 }
2547 h = h * 60;
2548 }
2549 if (s < 0) {
2550 h += 180;
2551 s = Math.abs(s);
2552 }
2553 if (h >= 360) {
2554 h -= 360;
2555 }
2556 return [h, s * 100, l * 100];
2557 },
2558 // Adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB_alternative
2559 toBase: (hsl) => {
2560 let [h, s, l] = hsl;
2561 h = h % 360;
2562 if (h < 0) {
2563 h += 360;
2564 }
2565 s /= 100;
2566 l /= 100;
2567 function f(n2) {
2568 let k = (n2 + h / 30) % 12;
2569 let a = s * Math.min(l, 1 - l);
2570 return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));
2571 }
2572 return [f(0), f(8), f(4)];
2573 },
2574 formats: {
2575 "hsl": {
2576 coords: ["<number> | <angle>", "<percentage>", "<percentage>"]
2577 },
2578 "hsla": {
2579 coords: ["<number> | <angle>", "<percentage>", "<percentage>"],
2580 commas: true,
2581 lastAlpha: true
2582 }
2583 }
2584 });
2585
2586 // node_modules/colorjs.io/src/spaces/oklch.js
2587 var oklch_default = new ColorSpace({
2588 id: "oklch",
2589 name: "Oklch",
2590 coords: {
2591 l: {
2592 refRange: [0, 1],
2593 name: "Lightness"
2594 },
2595 c: {
2596 refRange: [0, 0.4],
2597 name: "Chroma"
2598 },
2599 h: {
2600 refRange: [0, 360],
2601 type: "angle",
2602 name: "Hue"
2603 }
2604 },
2605 white: "D65",
2606 base: oklab_default,
2607 fromBase(oklab) {
2608 let [L, a, b2] = oklab;
2609 let h;
2610 const \u03B56 = 2e-4;
2611 if (Math.abs(a) < \u03B56 && Math.abs(b2) < \u03B56) {
2612 h = NaN;
2613 } else {
2614 h = Math.atan2(b2, a) * 180 / Math.PI;
2615 }
2616 return [
2617 L,
2618 // OKLab L is still L
2619 Math.sqrt(a ** 2 + b2 ** 2),
2620 // Chroma
2621 constrain(h)
2622 // Hue, in degrees [0 to 360)
2623 ];
2624 },
2625 // Convert from polar form
2626 toBase(oklch) {
2627 let [L, C, h] = oklch;
2628 let a, b2;
2629 if (isNaN(h)) {
2630 a = 0;
2631 b2 = 0;
2632 } else {
2633 a = C * Math.cos(h * Math.PI / 180);
2634 b2 = C * Math.sin(h * Math.PI / 180);
2635 }
2636 return [L, a, b2];
2637 },
2638 formats: {
2639 "oklch": {
2640 coords: ["<percentage> | <number>", "<number> | <percentage>[0,1]", "<number> | <angle>"]
2641 }
2642 }
2643 });
2644
2645 // node_modules/memize/dist/index.js
2646 function memize(fn, options) {
2647 var size = 0;
2648 var head;
2649 var tail;
2650 options = options || {};
2651 function memoized() {
2652 var node = head, len = arguments.length, args, i;
2653 searchCache: while (node) {
2654 if (node.args.length !== arguments.length) {
2655 node = node.next;
2656 continue;
2657 }
2658 for (i = 0; i < len; i++) {
2659 if (node.args[i] !== arguments[i]) {
2660 node = node.next;
2661 continue searchCache;
2662 }
2663 }
2664 if (node !== head) {
2665 if (node === tail) {
2666 tail = node.prev;
2667 }
2668 node.prev.next = node.next;
2669 if (node.next) {
2670 node.next.prev = node.prev;
2671 }
2672 node.next = head;
2673 node.prev = null;
2674 head.prev = node;
2675 head = node;
2676 }
2677 return node.val;
2678 }
2679 args = new Array(len);
2680 for (i = 0; i < len; i++) {
2681 args[i] = arguments[i];
2682 }
2683 node = {
2684 args,
2685 // Generate the result from original function
2686 val: fn.apply(null, args)
2687 };
2688 if (head) {
2689 head.prev = node;
2690 node.next = head;
2691 } else {
2692 tail = node;
2693 }
2694 if (size === /** @type {MemizeOptions} */
2695 options.maxSize) {
2696 tail = /** @type {MemizeCacheNode} */
2697 tail.prev;
2698 tail.next = null;
2699 } else {
2700 size++;
2701 }
2702 head = node;
2703 return node.val;
2704 }
2705 memoized.clear = function() {
2706 head = null;
2707 tail = null;
2708 size = 0;
2709 };
2710 return memoized;
2711 }
2712
2713 // packages/theme/build-module/use-theme-provider-styles.js
2714 var import_element2 = __toESM(require_element());
2715
2716 // packages/theme/build-module/color-ramps/lib/register-color-spaces.js
2717 ColorSpace.register(srgb_default);
2718 ColorSpace.register(oklch_default);
2719 ColorSpace.register(p3_default);
2720 ColorSpace.register(hsl_default);
2721
2722 // packages/theme/build-module/prebuilt/ts/color-tokens.js
2723 var color_tokens_default = {
2724 "primary-bgFill1": ["bg-interactive-brand-strong"],
2725 "primary-fgFill": [
2726 "fg-interactive-brand-strong",
2727 "fg-interactive-brand-strong-active"
2728 ],
2729 "primary-bgFill2": ["bg-interactive-brand-strong-active"],
2730 "primary-surface2": ["bg-interactive-brand-active"],
2731 "primary-surface4": ["bg-interactive-brand-weak-active"],
2732 "primary-fgSurface3": [
2733 "fg-interactive-brand",
2734 "fg-interactive-brand-active"
2735 ],
2736 "primary-stroke3": [
2737 "bg-thumb-brand",
2738 "bg-thumb-brand-active",
2739 "stroke-focus-brand",
2740 "stroke-interactive-brand",
2741 "stroke-surface-brand-strong"
2742 ],
2743 "primary-stroke4": ["stroke-interactive-brand-active"],
2744 "primary-stroke1": ["stroke-surface-brand"],
2745 "primary-surface1": ["bg-surface-brand"],
2746 "info-surface2": ["bg-surface-info-weak"],
2747 "info-surface4": ["bg-surface-info"],
2748 "info-fgSurface4": ["fg-content-info"],
2749 "info-fgSurface3": ["fg-content-info-weak"],
2750 "info-stroke3": ["stroke-surface-info-strong"],
2751 "info-stroke1": ["stroke-surface-info"],
2752 "success-surface2": ["bg-surface-success-weak"],
2753 "success-surface4": ["bg-surface-success"],
2754 "success-fgSurface4": ["fg-content-success"],
2755 "success-fgSurface3": ["fg-content-success-weak"],
2756 "success-stroke3": ["stroke-surface-success-strong"],
2757 "success-stroke1": ["stroke-surface-success"],
2758 "warning-surface2": ["bg-surface-warning-weak"],
2759 "warning-surface4": ["bg-surface-warning"],
2760 "warning-fgSurface4": ["fg-content-warning"],
2761 "warning-fgSurface3": ["fg-content-warning-weak"],
2762 "warning-stroke3": ["stroke-surface-warning-strong"],
2763 "warning-stroke1": ["stroke-surface-warning"],
2764 "error-bgFill1": ["bg-interactive-error-strong"],
2765 "error-fgFill": [
2766 "fg-interactive-error-strong",
2767 "fg-interactive-error-strong-active"
2768 ],
2769 "error-bgFill2": ["bg-interactive-error-strong-active"],
2770 "error-surface2": [
2771 "bg-interactive-error-active",
2772 "bg-surface-error-weak"
2773 ],
2774 "error-surface4": [
2775 "bg-interactive-error-weak-active",
2776 "bg-surface-error"
2777 ],
2778 "error-fgSurface4": ["fg-content-error"],
2779 "error-fgSurface3": [
2780 "fg-content-error-weak",
2781 "fg-interactive-error",
2782 "fg-interactive-error-active"
2783 ],
2784 "error-stroke3": [
2785 "stroke-interactive-error",
2786 "stroke-interactive-error-strong",
2787 "stroke-surface-error-strong"
2788 ],
2789 "error-stroke4": ["stroke-interactive-error-active"],
2790 "error-stroke1": ["stroke-surface-error"],
2791 "bg-surface2": ["bg-surface-neutral"],
2792 "bg-surface6": [
2793 "bg-interactive-brand-strong-disabled",
2794 "bg-interactive-error-strong-disabled",
2795 "bg-interactive-neutral-strong-disabled"
2796 ],
2797 "bg-surface5": [
2798 "bg-interactive-brand-disabled",
2799 "bg-interactive-brand-weak-disabled",
2800 "bg-interactive-error-disabled",
2801 "bg-interactive-error-weak-disabled",
2802 "bg-interactive-neutral-disabled",
2803 "bg-interactive-neutral-weak-disabled"
2804 ],
2805 "bg-surface4": [
2806 "bg-interactive-neutral-active",
2807 "bg-interactive-neutral-weak-active"
2808 ],
2809 "bg-surface3": ["bg-surface-neutral-strong"],
2810 "bg-fgSurface4": [
2811 "fg-content-neutral",
2812 "fg-interactive-neutral",
2813 "fg-interactive-neutral-active"
2814 ],
2815 "bg-fgSurface3": [
2816 "fg-content-neutral-weak",
2817 "fg-interactive-brand-strong-disabled",
2818 "fg-interactive-error-strong-disabled",
2819 "fg-interactive-neutral-strong-disabled",
2820 "fg-interactive-neutral-weak"
2821 ],
2822 "bg-fgSurface2": [
2823 "fg-interactive-brand-disabled",
2824 "fg-interactive-error-disabled",
2825 "fg-interactive-neutral-disabled",
2826 "fg-interactive-neutral-weak-disabled"
2827 ],
2828 "bg-stroke3": [
2829 "bg-thumb-neutral-weak",
2830 "stroke-interactive-neutral",
2831 "stroke-surface-neutral-strong"
2832 ],
2833 "bg-stroke4": [
2834 "bg-thumb-neutral-weak-active",
2835 "stroke-interactive-neutral-active",
2836 "stroke-interactive-neutral-strong"
2837 ],
2838 "bg-stroke2": [
2839 "bg-thumb-brand-disabled",
2840 "bg-track-neutral",
2841 "stroke-interactive-neutral-disabled",
2842 "stroke-surface-neutral"
2843 ],
2844 "bg-stroke1": ["bg-track-neutral-weak", "stroke-surface-neutral-weak"],
2845 "bg-bgFillInverted2": ["bg-interactive-neutral-strong-active"],
2846 "bg-bgFillInverted1": ["bg-interactive-neutral-strong"],
2847 "bg-fgFillInverted": [
2848 "fg-interactive-neutral-strong",
2849 "fg-interactive-neutral-strong-active"
2850 ],
2851 "bg-surface1": ["bg-surface-neutral-weak"],
2852 "caution-surface2": ["bg-surface-caution-weak"],
2853 "caution-surface4": ["bg-surface-caution"],
2854 "caution-fgSurface4": ["fg-content-caution"],
2855 "caution-fgSurface3": ["fg-content-caution-weak"]
2856 };
2857
2858 // packages/theme/build-module/color-ramps/lib/color-utils.js
2859 function getColorString(color) {
2860 return serialize(to(color, srgb_default), { format: "hex", inGamut: true });
2861 }
2862 function getContrast(colorA, colorB) {
2863 return contrastWCAG21(colorA, colorB);
2864 }
2865 function clampToGamut(c) {
2866 return to(toGamut(c, { space: srgb_default, method: "css" }), oklch_default);
2867 }
2868
2869 // packages/theme/build-module/color-ramps/lib/constants.js
2870 var WHITE = to("white", oklch_default);
2871 var BLACK = to("black", oklch_default);
2872 var UNIVERSAL_CONTRAST_TOPUP = 0.02;
2873 var WHITE_TEXT_CONTRAST_MARGIN = 3.1;
2874 var ACCENT_SCALE_BASE_LIGHTNESS_THRESHOLDS = {
2875 lighter: { min: 0.2, max: 0.4 },
2876 darker: { min: 0.75, max: 0.98 }
2877 };
2878 var CONTRAST_EPSILON = 4e-3;
2879 var MAX_BISECTION_ITERATIONS = 10;
2880 var DEFAULT_SEED_COLORS = {
2881 bg: "#f8f8f8",
2882 primary: "#3858e9",
2883 info: "#0090ff",
2884 success: "#4ab866",
2885 caution: "#f0d149",
2886 warning: "#f0b849",
2887 error: "#cc1818"
2888 };
2889
2890 // packages/theme/build-module/color-ramps/lib/utils.js
2891 function buildDependencyGraph(config) {
2892 const dependencies = /* @__PURE__ */ new Map();
2893 const dependents = /* @__PURE__ */ new Map();
2894 Object.keys(config).forEach((step) => {
2895 dependencies.set(step, []);
2896 });
2897 dependents.set("seed", []);
2898 Object.keys(config).forEach((step) => {
2899 dependents.set(step, []);
2900 });
2901 Object.entries(config).forEach(([stepName, stepConfig]) => {
2902 const step = stepName;
2903 const reference = stepConfig.contrast.reference;
2904 dependencies.get(step).push(reference);
2905 dependents.get(reference).push(step);
2906 if (stepConfig.sameAsIfPossible) {
2907 dependencies.get(step).push(stepConfig.sameAsIfPossible);
2908 dependents.get(stepConfig.sameAsIfPossible).push(step);
2909 }
2910 });
2911 return { dependencies, dependents };
2912 }
2913 function sortByDependency(config) {
2914 const { dependents } = buildDependencyGraph(config);
2915 const result = [];
2916 const visited = /* @__PURE__ */ new Set();
2917 const visiting = /* @__PURE__ */ new Set();
2918 function visit(node) {
2919 if (visiting.has(node)) {
2920 throw new Error(
2921 `Circular dependency detected involving step: ${String(
2922 node
2923 )}`
2924 );
2925 }
2926 if (visited.has(node)) {
2927 return;
2928 }
2929 visiting.add(node);
2930 const nodeDependents = dependents.get(node) || [];
2931 nodeDependents.forEach((dependent) => {
2932 visit(dependent);
2933 });
2934 visiting.delete(node);
2935 visited.add(node);
2936 if (node !== "seed") {
2937 result.unshift(node);
2938 }
2939 }
2940 visit("seed");
2941 return result;
2942 }
2943 function stepsForStep(stepName, config) {
2944 const result = /* @__PURE__ */ new Set();
2945 function visit(step) {
2946 if (step === "seed" || result.has(step)) {
2947 return;
2948 }
2949 const stepConfig = config[step];
2950 if (!stepConfig) {
2951 return;
2952 }
2953 visit(stepConfig.contrast.reference);
2954 if (stepConfig.sameAsIfPossible) {
2955 visit(stepConfig.sameAsIfPossible);
2956 }
2957 result.add(step);
2958 }
2959 visit(stepName);
2960 return Array.from(result);
2961 }
2962 function computeBetterFgColorDirection(seed, preferLighter) {
2963 const contrastAgainstBlack = getContrast(seed, BLACK);
2964 const contrastAgainstWhite = getContrast(seed, WHITE);
2965 return contrastAgainstBlack > contrastAgainstWhite + (preferLighter ? WHITE_TEXT_CONTRAST_MARGIN : 0) ? { better: "darker", worse: "lighter" } : { better: "lighter", worse: "darker" };
2966 }
2967 function adjustContrastTarget(target) {
2968 if (target === 1) {
2969 return 1;
2970 }
2971 return target + UNIVERSAL_CONTRAST_TOPUP;
2972 }
2973 function clampAccentScaleReferenceLightness(rawLightness, direction) {
2974 const thresholds = ACCENT_SCALE_BASE_LIGHTNESS_THRESHOLDS[direction];
2975 return Math.max(thresholds.min, Math.min(thresholds.max, rawLightness));
2976 }
2977 function solveWithBisect(calculateC, calculateValue, initLowerL, initLowerValue, initUpperL, initUpperValue) {
2978 let lowerL = initLowerL;
2979 let lowerValue = initLowerValue;
2980 let lowerReplaced = false;
2981 let upperL = initUpperL;
2982 let upperValue = initUpperValue;
2983 let upperReplaced = false;
2984 let bestC;
2985 let bestValue;
2986 let iterations = 0;
2987 while (true) {
2988 iterations++;
2989 const newL = (lowerL * upperValue - upperL * lowerValue) / (upperValue - lowerValue);
2990 bestC = calculateC(newL);
2991 bestValue = calculateValue(bestC);
2992 if (Math.abs(bestValue) <= CONTRAST_EPSILON || iterations >= MAX_BISECTION_ITERATIONS) {
2993 break;
2994 }
2995 if (bestValue <= 0) {
2996 lowerL = newL;
2997 lowerValue = bestValue;
2998 if (lowerReplaced) {
2999 upperValue /= 2;
3000 }
3001 lowerReplaced = true;
3002 upperReplaced = false;
3003 } else {
3004 upperL = newL;
3005 upperValue = bestValue;
3006 if (upperReplaced) {
3007 lowerValue /= 2;
3008 }
3009 upperReplaced = true;
3010 lowerReplaced = false;
3011 }
3012 }
3013 return bestC;
3014 }
3015
3016 // packages/theme/build-module/color-ramps/lib/taper-chroma.js
3017 function taperChroma(seed, lTarget, options = {}) {
3018 const gamut = options.gamut ?? srgb_default;
3019 const alpha = options.alpha ?? 0.65;
3020 const carry = options.carry ?? 0.5;
3021 const cUpperBound = options.cUpperBound ?? 0.45;
3022 const radiusLight = options.radiusLight ?? 0.2;
3023 const radiusDark = options.radiusDark ?? 0.2;
3024 const kLight = options.kLight ?? 0.85;
3025 const kDark = options.kDark ?? 0.85;
3026 const achromaEpsilon = options.achromaEpsilon ?? 5e-3;
3027 const cSeed = Math.max(0, get(seed, [oklch_default, "c"]));
3028 let hSeed = Number(get(seed, [oklch_default, "h"]));
3029 const chromaIsTiny = cSeed < achromaEpsilon;
3030 const hueIsInvalid = !Number.isFinite(hSeed);
3031 if (chromaIsTiny || hueIsInvalid) {
3032 if (typeof options.hueFallback === "number") {
3033 hSeed = normalizeHue(options.hueFallback);
3034 } else {
3035 return {
3036 space: oklch_default,
3037 coords: [clamp01(lTarget), 0, 0],
3038 alpha: 1
3039 };
3040 }
3041 }
3042 const lSeed = clamp01(get(seed, [oklch_default, "l"]));
3043 const cmaxSeed = getCachedMaxChromaAtLH(lSeed, hSeed, gamut, cUpperBound);
3044 const cmaxTarget = getCachedMaxChromaAtLH(
3045 clamp01(lTarget),
3046 hSeed,
3047 gamut,
3048 cUpperBound
3049 );
3050 let seedRelative = 0;
3051 const denom = cmaxSeed > 0 ? cmaxSeed : 1e-6;
3052 seedRelative = clamp01(cSeed / denom);
3053 const cIntendedBase = alpha * cmaxTarget;
3054 const cWithCarry = cIntendedBase * Math.pow(seedRelative, clamp01(carry));
3055 const t = continuousTaper(lSeed, lTarget, {
3056 radiusLight,
3057 radiusDark,
3058 kLight,
3059 kDark
3060 });
3061 const cPlanned = cWithCarry * t;
3062 const lOut = clamp01(lTarget);
3063 return { l: lOut, c: cPlanned };
3064 }
3065 function clamp01(x) {
3066 if (x < 0) {
3067 return 0;
3068 }
3069 if (x > 1) {
3070 return 1;
3071 }
3072 return x;
3073 }
3074 function normalizeHue(h) {
3075 let hue = h % 360;
3076 if (hue < 0) {
3077 hue += 360;
3078 }
3079 return hue;
3080 }
3081 function raisedCosine(u) {
3082 const x = clamp01(u);
3083 return 0.5 - 0.5 * Math.cos(Math.PI * x);
3084 }
3085 function continuousTaper(seedL, targetL, opts) {
3086 const d2 = targetL - seedL;
3087 if (d2 >= 0) {
3088 const u2 = opts.radiusLight > 0 ? Math.abs(d2) / opts.radiusLight : 1;
3089 const w2 = raisedCosine(u2 > 1 ? 1 : u2);
3090 return 1 - (1 - opts.kLight) * w2;
3091 }
3092 const u = opts.radiusDark > 0 ? Math.abs(d2) / opts.radiusDark : 1;
3093 const w = raisedCosine(u > 1 ? 1 : u);
3094 return 1 - (1 - opts.kDark) * w;
3095 }
3096 var maxChromaCache = /* @__PURE__ */ new Map();
3097 function keyMax(l, h, gamut, cap) {
3098 const lq = quantize(l, 0.05);
3099 const hq = quantize(normalizeHue(h), 10);
3100 const cq = quantize(cap, 0.05);
3101 return `${gamut}|L:${lq}|H:${hq}|cap:${cq}`;
3102 }
3103 function quantize(x, step) {
3104 const k = Math.round(x / step);
3105 return k * step;
3106 }
3107 function getCachedMaxChromaAtLH(l, h, gamutSpace, cap) {
3108 const gamut = gamutSpace.id;
3109 const key = keyMax(l, h, gamut, cap);
3110 const hit = maxChromaCache.get(key);
3111 if (typeof hit === "number") {
3112 return hit;
3113 }
3114 const computed = maxInGamutChromaAtLH(l, h, gamutSpace, cap);
3115 maxChromaCache.set(key, computed);
3116 return computed;
3117 }
3118 function maxInGamutChromaAtLH(l, h, gamutSpace, cap) {
3119 const probe = {
3120 space: oklch_default,
3121 coords: [l, cap, h],
3122 alpha: 1
3123 };
3124 const clamped = toGamut(probe, { space: gamutSpace, method: "css" });
3125 return get(clamped, [oklch_default, "c"]);
3126 }
3127
3128 // packages/theme/build-module/color-ramps/lib/find-color-with-constraints.js
3129 function cdiff(c13, c23) {
3130 return Math.log(c13 / c23);
3131 }
3132 function findColorMeetingRequirements(reference, seed, target, direction, {
3133 lightnessConstraint,
3134 taperChromaOptions
3135 } = {}) {
3136 if (target <= 1) {
3137 return {
3138 color: reference,
3139 reached: true,
3140 achieved: 1
3141 };
3142 }
3143 function getColorForL(l) {
3144 let newL = l;
3145 let newC = get(seed, [oklch_default, "c"]);
3146 if (taperChromaOptions) {
3147 const tapered = taperChroma(seed, newL, taperChromaOptions);
3148 if ("l" in tapered && "c" in tapered) {
3149 newL = tapered.l;
3150 newC = tapered.c;
3151 } else {
3152 return tapered;
3153 }
3154 }
3155 return clampToGamut({
3156 spaceId: "oklch",
3157 coords: [newL, newC, get(seed, [oklch_default, "h"])]
3158 });
3159 }
3160 const mostContrastingL = direction === "lighter" ? 1 : 0;
3161 const mostContrastingColor = direction === "lighter" ? WHITE : BLACK;
3162 const highestContrast = getContrast(reference, mostContrastingColor);
3163 if (lightnessConstraint) {
3164 const colorWithExactL = getColorForL(lightnessConstraint.value);
3165 const exactLContrast = getContrast(reference, colorWithExactL);
3166 const exactLContrastMeetsTarget = cdiff(exactLContrast, target) >= -CONTRAST_EPSILON;
3167 if (exactLContrastMeetsTarget || lightnessConstraint.type === "force") {
3168 return {
3169 color: colorWithExactL,
3170 reached: exactLContrastMeetsTarget,
3171 achieved: exactLContrast,
3172 deficit: exactLContrastMeetsTarget ? cdiff(exactLContrast, highestContrast) : cdiff(target, exactLContrast)
3173 };
3174 }
3175 }
3176 if (cdiff(highestContrast, target) <= CONTRAST_EPSILON) {
3177 return {
3178 color: mostContrastingColor,
3179 reached: cdiff(highestContrast, target) >= -CONTRAST_EPSILON,
3180 achieved: highestContrast,
3181 deficit: cdiff(target, highestContrast)
3182 };
3183 }
3184 const lowerL = get(reference, [oklch_default, "l"]);
3185 const lowerContrast = cdiff(1, target);
3186 const upperL = mostContrastingL;
3187 const upperContrast = cdiff(highestContrast, target);
3188 const bestColor = solveWithBisect(
3189 getColorForL,
3190 (c) => cdiff(getContrast(reference, c), target),
3191 lowerL,
3192 lowerContrast,
3193 upperL,
3194 upperContrast
3195 );
3196 return {
3197 color: bestColor,
3198 reached: true,
3199 achieved: target,
3200 // Negative number that specifies how much room we have.
3201 deficit: cdiff(target, highestContrast)
3202 };
3203 }
3204
3205 // packages/theme/build-module/color-ramps/lib/index.js
3206 function calculateRamp({
3207 seed,
3208 sortedSteps,
3209 config,
3210 mainDir,
3211 oppDir,
3212 pinLightness
3213 }) {
3214 const rampResults = {};
3215 let warnings;
3216 let maxDeficit = -Infinity;
3217 let maxDeficitDirection = "lighter";
3218 let maxDeficitStep;
3219 const calculatedColors = /* @__PURE__ */ new Map();
3220 calculatedColors.set("seed", seed);
3221 for (const stepName of sortedSteps) {
3222 let computeDirection = function(color, followDirection) {
3223 if (followDirection === "main") {
3224 return mainDir;
3225 }
3226 if (followDirection === "opposite") {
3227 return oppDir;
3228 }
3229 if (followDirection === "best") {
3230 return computeBetterFgColorDirection(
3231 color,
3232 contrast.preferLighter
3233 ).better;
3234 }
3235 return followDirection;
3236 };
3237 const {
3238 contrast,
3239 lightness: stepLightnessConstraint,
3240 taperChromaOptions,
3241 sameAsIfPossible
3242 } = config[stepName];
3243 const referenceColor = calculatedColors.get(contrast.reference);
3244 if (!referenceColor) {
3245 throw new Error(
3246 `Reference color for step ${stepName} not found: ${contrast.reference}`
3247 );
3248 }
3249 if (sameAsIfPossible) {
3250 const candidateColor = calculatedColors.get(sameAsIfPossible);
3251 if (!candidateColor) {
3252 throw new Error(
3253 `Same-as color for step ${stepName} not found: ${sameAsIfPossible}`
3254 );
3255 }
3256 const candidateContrast = getContrast(
3257 referenceColor,
3258 candidateColor
3259 );
3260 const adjustedTarget2 = adjustContrastTarget(contrast.target);
3261 if (candidateContrast >= adjustedTarget2) {
3262 calculatedColors.set(stepName, candidateColor);
3263 rampResults[stepName] = getColorString(candidateColor);
3264 continue;
3265 }
3266 }
3267 const computedDir = computeDirection(
3268 referenceColor,
3269 contrast.followDirection
3270 );
3271 const adjustedTarget = adjustContrastTarget(contrast.target);
3272 let lightnessConstraint;
3273 if (pinLightness?.stepName === stepName) {
3274 lightnessConstraint = {
3275 value: pinLightness.value,
3276 type: "force"
3277 };
3278 } else if (stepLightnessConstraint) {
3279 lightnessConstraint = {
3280 value: stepLightnessConstraint(computedDir),
3281 type: "onlyIfSucceeds"
3282 };
3283 }
3284 const searchResults = findColorMeetingRequirements(
3285 referenceColor,
3286 seed,
3287 adjustedTarget,
3288 computedDir,
3289 {
3290 lightnessConstraint,
3291 taperChromaOptions
3292 }
3293 );
3294 if (!contrast.ignoreWhenAdjustingSeed && searchResults.deficit && searchResults.deficit > maxDeficit) {
3295 maxDeficit = searchResults.deficit;
3296 maxDeficitDirection = computedDir;
3297 maxDeficitStep = stepName;
3298 }
3299 calculatedColors.set(stepName, searchResults.color);
3300 rampResults[stepName] = getColorString(searchResults.color);
3301 if (!searchResults.reached && !contrast.ignoreWhenAdjustingSeed) {
3302 warnings ??= [];
3303 warnings.push(stepName);
3304 }
3305 }
3306 return {
3307 rampResults,
3308 warnings,
3309 maxDeficit,
3310 maxDeficitDirection,
3311 maxDeficitStep
3312 };
3313 }
3314 function buildRamp(seedArg, config, {
3315 mainDirection,
3316 pinLightness,
3317 rescaleToFitContrastTargets = true
3318 } = {}) {
3319 let seed;
3320 try {
3321 seed = clampToGamut(parse(seedArg));
3322 } catch (error) {
3323 throw new Error(
3324 `Invalid seed color "${seedArg}": ${error instanceof Error ? error.message : "Unknown error"}`
3325 );
3326 }
3327 let mainDir = "lighter";
3328 let oppDir = "darker";
3329 if (mainDirection) {
3330 mainDir = mainDirection;
3331 oppDir = mainDirection === "darker" ? "lighter" : "darker";
3332 } else {
3333 const { better, worse } = computeBetterFgColorDirection(seed);
3334 mainDir = better;
3335 oppDir = worse;
3336 }
3337 const sortedSteps = sortByDependency(config);
3338 const {
3339 rampResults,
3340 warnings,
3341 maxDeficit,
3342 maxDeficitDirection,
3343 maxDeficitStep
3344 } = calculateRamp({
3345 seed,
3346 sortedSteps,
3347 config,
3348 mainDir,
3349 oppDir,
3350 pinLightness
3351 });
3352 let bestRamp = rampResults;
3353 if (maxDeficit > CONTRAST_EPSILON && rescaleToFitContrastTargets) {
3354 let getSeedForL = function(l) {
3355 return clampToGamut(set(clone(seed), [oklch_default, "l"], l));
3356 }, getDeficitForSeed = function(s) {
3357 const iterationResults = calculateRamp({
3358 seed: s,
3359 sortedSteps: iterSteps,
3360 config,
3361 mainDir,
3362 oppDir,
3363 pinLightness
3364 });
3365 return iterationResults.maxDeficitDirection === maxDeficitDirection ? iterationResults.maxDeficit : -maxDeficit;
3366 };
3367 const iterSteps = stepsForStep(maxDeficitStep, config);
3368 const lowerSeedL = maxDeficitDirection === "lighter" ? 0 : 1;
3369 const lowerDeficit = -maxDeficit;
3370 const upperSeedL = get(seed, [oklch_default, "l"]);
3371 const upperDeficit = maxDeficit;
3372 const bestSeed = solveWithBisect(
3373 getSeedForL,
3374 getDeficitForSeed,
3375 lowerSeedL,
3376 lowerDeficit,
3377 upperSeedL,
3378 upperDeficit
3379 );
3380 bestRamp = calculateRamp({
3381 seed: bestSeed,
3382 sortedSteps,
3383 config,
3384 mainDir,
3385 oppDir,
3386 pinLightness
3387 }).rampResults;
3388 }
3389 if (mainDir === "darker") {
3390 const tmpSurface1 = bestRamp.surface1;
3391 bestRamp.surface1 = bestRamp.surface3;
3392 bestRamp.surface3 = tmpSurface1;
3393 }
3394 return {
3395 ramp: bestRamp,
3396 warnings,
3397 direction: mainDir
3398 };
3399 }
3400
3401 // packages/theme/build-module/color-ramps/lib/ramp-configs.js
3402 var lightnessConstraintForegroundHighContrast = (direction) => direction === "lighter" ? 0.9551 : 0.235;
3403 var lightnessConstraintForegroundMediumContrast = (direction) => direction === "lighter" ? 0.77 : 0.56;
3404 var lightnessConstraintBgFill = (direction) => direction === "lighter" ? 0.67 : 0.45;
3405 var BG_SURFACE_TAPER_CHROMA = {
3406 alpha: 0.7
3407 };
3408 var FG_TAPER_CHROMA = {
3409 alpha: 0.6,
3410 kLight: 0.2,
3411 kDark: 0.2
3412 };
3413 var STROKE_TAPER_CHROMA = {
3414 alpha: 0.6,
3415 radiusDark: 0.01,
3416 radiusLight: 0.01,
3417 kLight: 0.8,
3418 kDark: 0.8
3419 };
3420 var ACCENT_SURFACE_TAPER_CHROMA = {
3421 alpha: 0.75,
3422 radiusDark: 0.01,
3423 radiusLight: 0.01
3424 };
3425 var fgSurface4Config = {
3426 contrast: {
3427 reference: "surface3",
3428 followDirection: "main",
3429 target: 7,
3430 preferLighter: true
3431 },
3432 lightness: lightnessConstraintForegroundHighContrast,
3433 taperChromaOptions: FG_TAPER_CHROMA
3434 };
3435 var BG_RAMP_CONFIG = {
3436 // Surface
3437 surface1: {
3438 contrast: {
3439 reference: "surface2",
3440 followDirection: "opposite",
3441 target: 1.06,
3442 ignoreWhenAdjustingSeed: true
3443 },
3444 taperChromaOptions: BG_SURFACE_TAPER_CHROMA
3445 },
3446 surface2: {
3447 contrast: {
3448 reference: "seed",
3449 followDirection: "main",
3450 target: 1
3451 }
3452 },
3453 surface3: {
3454 contrast: {
3455 reference: "surface2",
3456 followDirection: "main",
3457 target: 1.06
3458 },
3459 taperChromaOptions: BG_SURFACE_TAPER_CHROMA
3460 },
3461 surface4: {
3462 contrast: {
3463 reference: "surface2",
3464 followDirection: "main",
3465 target: 1.12
3466 },
3467 taperChromaOptions: BG_SURFACE_TAPER_CHROMA
3468 },
3469 surface5: {
3470 contrast: {
3471 reference: "surface2",
3472 followDirection: "main",
3473 target: 1.2
3474 },
3475 taperChromaOptions: BG_SURFACE_TAPER_CHROMA
3476 },
3477 surface6: {
3478 contrast: {
3479 reference: "surface2",
3480 followDirection: "main",
3481 target: 1.4
3482 },
3483 taperChromaOptions: BG_SURFACE_TAPER_CHROMA
3484 },
3485 // Bg fill
3486 bgFill1: {
3487 contrast: {
3488 reference: "surface2",
3489 followDirection: "main",
3490 target: 4
3491 },
3492 lightness: lightnessConstraintBgFill
3493 },
3494 bgFill2: {
3495 contrast: {
3496 reference: "bgFill1",
3497 followDirection: "main",
3498 target: 1.2
3499 }
3500 },
3501 bgFillInverted1: {
3502 contrast: {
3503 reference: "bgFillInverted2",
3504 followDirection: "opposite",
3505 target: 1.2
3506 }
3507 },
3508 bgFillInverted2: fgSurface4Config,
3509 bgFillDark: {
3510 contrast: {
3511 reference: "surface3",
3512 followDirection: "darker",
3513 // This is what causes the token to be always dark
3514 target: 7,
3515 ignoreWhenAdjustingSeed: true
3516 },
3517 lightness: lightnessConstraintForegroundHighContrast,
3518 taperChromaOptions: FG_TAPER_CHROMA
3519 },
3520 // Stroke
3521 stroke1: {
3522 contrast: {
3523 reference: "stroke3",
3524 followDirection: "opposite",
3525 target: 2.6
3526 },
3527 taperChromaOptions: STROKE_TAPER_CHROMA
3528 },
3529 stroke2: {
3530 contrast: {
3531 reference: "stroke3",
3532 followDirection: "opposite",
3533 target: 2.4
3534 },
3535 taperChromaOptions: STROKE_TAPER_CHROMA
3536 },
3537 stroke3: {
3538 contrast: {
3539 reference: "surface3",
3540 followDirection: "main",
3541 target: 3
3542 },
3543 taperChromaOptions: STROKE_TAPER_CHROMA
3544 },
3545 stroke4: {
3546 contrast: {
3547 reference: "stroke3",
3548 followDirection: "main",
3549 target: 1.5
3550 },
3551 taperChromaOptions: STROKE_TAPER_CHROMA
3552 },
3553 // fgSurface
3554 fgSurface1: {
3555 contrast: {
3556 reference: "surface3",
3557 followDirection: "main",
3558 target: 2,
3559 preferLighter: true
3560 },
3561 taperChromaOptions: FG_TAPER_CHROMA
3562 },
3563 fgSurface2: {
3564 contrast: {
3565 reference: "surface3",
3566 followDirection: "main",
3567 target: 3,
3568 preferLighter: true
3569 },
3570 taperChromaOptions: FG_TAPER_CHROMA
3571 },
3572 fgSurface3: {
3573 contrast: {
3574 reference: "surface3",
3575 followDirection: "main",
3576 target: 4.5,
3577 preferLighter: true
3578 },
3579 lightness: lightnessConstraintForegroundMediumContrast,
3580 taperChromaOptions: FG_TAPER_CHROMA
3581 },
3582 fgSurface4: fgSurface4Config,
3583 // fgFill
3584 fgFill: {
3585 contrast: {
3586 reference: "bgFill1",
3587 followDirection: "best",
3588 target: 4.5,
3589 preferLighter: true
3590 },
3591 lightness: lightnessConstraintForegroundHighContrast,
3592 taperChromaOptions: FG_TAPER_CHROMA
3593 },
3594 fgFillInverted: {
3595 contrast: {
3596 reference: "bgFillInverted1",
3597 followDirection: "best",
3598 target: 4.5,
3599 preferLighter: true
3600 },
3601 lightness: lightnessConstraintForegroundHighContrast,
3602 taperChromaOptions: FG_TAPER_CHROMA
3603 },
3604 fgFillDark: {
3605 contrast: {
3606 reference: "bgFillDark",
3607 followDirection: "best",
3608 target: 4.5,
3609 preferLighter: true
3610 },
3611 lightness: lightnessConstraintForegroundHighContrast,
3612 taperChromaOptions: FG_TAPER_CHROMA
3613 }
3614 };
3615 var ACCENT_RAMP_CONFIG = {
3616 ...BG_RAMP_CONFIG,
3617 surface1: {
3618 ...BG_RAMP_CONFIG.surface1,
3619 taperChromaOptions: ACCENT_SURFACE_TAPER_CHROMA
3620 },
3621 surface2: {
3622 contrast: {
3623 reference: "bgFill1",
3624 followDirection: "opposite",
3625 target: BG_RAMP_CONFIG.bgFill1.contrast.target,
3626 ignoreWhenAdjustingSeed: true
3627 },
3628 taperChromaOptions: ACCENT_SURFACE_TAPER_CHROMA
3629 },
3630 surface3: {
3631 ...BG_RAMP_CONFIG.surface3,
3632 taperChromaOptions: ACCENT_SURFACE_TAPER_CHROMA
3633 },
3634 surface4: {
3635 ...BG_RAMP_CONFIG.surface4,
3636 taperChromaOptions: ACCENT_SURFACE_TAPER_CHROMA
3637 },
3638 surface5: {
3639 ...BG_RAMP_CONFIG.surface5,
3640 taperChromaOptions: ACCENT_SURFACE_TAPER_CHROMA
3641 },
3642 surface6: {
3643 ...BG_RAMP_CONFIG.surface6,
3644 taperChromaOptions: ACCENT_SURFACE_TAPER_CHROMA
3645 },
3646 bgFill1: {
3647 contrast: {
3648 reference: "seed",
3649 followDirection: "main",
3650 target: 1
3651 }
3652 },
3653 stroke1: {
3654 ...BG_RAMP_CONFIG.stroke1
3655 },
3656 stroke2: {
3657 ...BG_RAMP_CONFIG.stroke2
3658 },
3659 stroke3: {
3660 ...BG_RAMP_CONFIG.stroke3,
3661 sameAsIfPossible: "fgSurface3",
3662 taperChromaOptions: void 0
3663 },
3664 stroke4: {
3665 ...BG_RAMP_CONFIG.stroke4,
3666 taperChromaOptions: void 0
3667 },
3668 // fgSurface: do not de-saturate
3669 fgSurface1: {
3670 ...BG_RAMP_CONFIG.fgSurface1,
3671 taperChromaOptions: void 0
3672 },
3673 fgSurface2: {
3674 ...BG_RAMP_CONFIG.fgSurface2,
3675 taperChromaOptions: void 0
3676 },
3677 fgSurface3: {
3678 ...BG_RAMP_CONFIG.fgSurface3,
3679 taperChromaOptions: void 0,
3680 sameAsIfPossible: "bgFill1"
3681 },
3682 fgSurface4: {
3683 ...BG_RAMP_CONFIG.fgSurface4,
3684 taperChromaOptions: void 0
3685 }
3686 };
3687
3688 // packages/theme/build-module/color-ramps/index.js
3689 function buildBgRamp(seed) {
3690 if (typeof seed !== "string" || seed.trim() === "") {
3691 throw new Error("Seed color must be a non-empty string");
3692 }
3693 return buildRamp(seed, BG_RAMP_CONFIG);
3694 }
3695 var STEP_TO_PIN = "surface2";
3696 function getBgRampInfo(ramp) {
3697 return {
3698 mainDirection: ramp.direction,
3699 pinLightness: {
3700 stepName: STEP_TO_PIN,
3701 value: clampAccentScaleReferenceLightness(
3702 get(parse(ramp.ramp[STEP_TO_PIN]), [oklch_default, "l"]),
3703 ramp.direction
3704 )
3705 }
3706 };
3707 }
3708 function buildAccentRamp(seed, bgRamp) {
3709 if (typeof seed !== "string" || seed.trim() === "") {
3710 throw new Error("Seed color must be a non-empty string");
3711 }
3712 const bgRampInfo = bgRamp ? getBgRampInfo(bgRamp) : void 0;
3713 return buildRamp(seed, ACCENT_RAMP_CONFIG, bgRampInfo);
3714 }
3715
3716 // packages/theme/build-module/use-theme-provider-styles.js
3717 var getCachedBgRamp = memize(buildBgRamp, { maxSize: 10 });
3718 var getCachedAccentRamp = memize(buildAccentRamp, { maxSize: 10 });
3719 var legacyWpComponentsOverridesCSS = [
3720 ["--wp-components-color-accent", "var(--wp-admin-theme-color)"],
3721 [
3722 "--wp-components-color-accent-darker-10",
3723 "var(--wp-admin-theme-color-darker-10)"
3724 ],
3725 [
3726 "--wp-components-color-accent-darker-20",
3727 "var(--wp-admin-theme-color-darker-20)"
3728 ],
3729 [
3730 "--wp-components-color-accent-inverted",
3731 "var(--wpds-color-fg-interactive-brand-strong)"
3732 ],
3733 [
3734 "--wp-components-color-background",
3735 "var(--wpds-color-bg-surface-neutral-strong)"
3736 ],
3737 [
3738 "--wp-components-color-foreground",
3739 "var(--wpds-color-fg-content-neutral)"
3740 ],
3741 [
3742 "--wp-components-color-foreground-inverted",
3743 "var(--wpds-color-bg-surface-neutral)"
3744 ],
3745 [
3746 "--wp-components-color-gray-100",
3747 "var(--wpds-color-bg-surface-neutral)"
3748 ],
3749 [
3750 "--wp-components-color-gray-200",
3751 "var(--wpds-color-stroke-surface-neutral)"
3752 ],
3753 [
3754 "--wp-components-color-gray-300",
3755 "var(--wpds-color-stroke-surface-neutral)"
3756 ],
3757 [
3758 "--wp-components-color-gray-400",
3759 "var(--wpds-color-stroke-interactive-neutral)"
3760 ],
3761 [
3762 "--wp-components-color-gray-600",
3763 "var(--wpds-color-stroke-interactive-neutral)"
3764 ],
3765 [
3766 "--wp-components-color-gray-700",
3767 "var(--wpds-color-fg-content-neutral-weak)"
3768 ],
3769 [
3770 "--wp-components-color-gray-800",
3771 "var(--wpds-color-fg-content-neutral)"
3772 ]
3773 ];
3774 function customRgbFormat(color) {
3775 const rgb = to(color, srgb_default);
3776 return [get(rgb, "srgb.r"), get(rgb, "srgb.g"), get(rgb, "srgb.b")].map((n2) => Math.round(n2 * 255)).join(", ");
3777 }
3778 function legacyWpAdminThemeOverridesCSS(accent) {
3779 const parsedAccent = to(parse(accent), hsl_default);
3780 const coords = parsedAccent.coords;
3781 const darker10 = to(
3782 {
3783 space: hsl_default,
3784 coords: [
3785 coords[0],
3786 // h
3787 coords[1],
3788 // s
3789 Math.max(0, Math.min(100, coords[2] - 5))
3790 // l (reduced by 5%)
3791 ]
3792 },
3793 srgb_default
3794 );
3795 const darker20 = to(
3796 {
3797 space: hsl_default,
3798 coords: [
3799 coords[0],
3800 // h
3801 coords[1],
3802 // s
3803 Math.max(0, Math.min(100, coords[2] - 10))
3804 // l (reduced by 10%)
3805 ]
3806 },
3807 srgb_default
3808 );
3809 return [
3810 [
3811 "--wp-admin-theme-color",
3812 serialize(to(parsedAccent, srgb_default), { format: "hex" })
3813 ],
3814 ["--wp-admin-theme-color--rgb", customRgbFormat(parsedAccent)],
3815 [
3816 "--wp-admin-theme-color-darker-10",
3817 serialize(darker10, { format: "hex" })
3818 ],
3819 [
3820 "--wp-admin-theme-color-darker-10--rgb",
3821 customRgbFormat(darker10)
3822 ],
3823 [
3824 "--wp-admin-theme-color-darker-20",
3825 serialize(darker20, { format: "hex" })
3826 ],
3827 [
3828 "--wp-admin-theme-color-darker-20--rgb",
3829 customRgbFormat(darker20)
3830 ]
3831 ];
3832 }
3833 function colorTokensCSS(computedColorRamps) {
3834 const entries = [];
3835 for (const [rampName, { ramp }] of computedColorRamps) {
3836 for (const [tokenName, tokenValue] of Object.entries(ramp)) {
3837 const key = `${rampName}-${tokenName}`;
3838 const aliasedBy = color_tokens_default[key] ?? [];
3839 for (const aliasedId of aliasedBy) {
3840 entries.push([`--wpds-color-${aliasedId}`, tokenValue]);
3841 }
3842 }
3843 }
3844 return entries;
3845 }
3846 function generateStyles({
3847 primary,
3848 computedColorRamps
3849 }) {
3850 return Object.fromEntries(
3851 [
3852 // Semantic color tokens
3853 colorTokensCSS(computedColorRamps),
3854 // Legacy overrides
3855 legacyWpAdminThemeOverridesCSS(primary),
3856 legacyWpComponentsOverridesCSS
3857 ].flat()
3858 );
3859 }
3860 function useThemeProviderStyles({
3861 color = {}
3862 } = {}) {
3863 const { resolvedSettings: inheritedSettings } = (0, import_element2.useContext)(ThemeContext);
3864 const primary = color.primary ?? inheritedSettings.color?.primary ?? DEFAULT_SEED_COLORS.primary;
3865 const bg = color.bg ?? inheritedSettings.color?.bg ?? DEFAULT_SEED_COLORS.bg;
3866 const resolvedSettings = (0, import_element2.useMemo)(
3867 () => ({
3868 color: {
3869 primary,
3870 bg
3871 }
3872 }),
3873 [primary, bg]
3874 );
3875 const themeProviderStyles = (0, import_element2.useMemo)(() => {
3876 const seeds = {
3877 ...DEFAULT_SEED_COLORS,
3878 bg,
3879 primary
3880 };
3881 const computedColorRamps = /* @__PURE__ */ new Map();
3882 const bgRamp = getCachedBgRamp(seeds.bg);
3883 Object.entries(seeds).forEach(([rampName, seed]) => {
3884 if (rampName === "bg") {
3885 computedColorRamps.set(rampName, bgRamp);
3886 } else {
3887 computedColorRamps.set(
3888 rampName,
3889 getCachedAccentRamp(seed, bgRamp)
3890 );
3891 }
3892 });
3893 return generateStyles({
3894 primary: seeds.primary,
3895 computedColorRamps
3896 });
3897 }, [primary, bg]);
3898 return {
3899 resolvedSettings,
3900 themeProviderStyles
3901 };
3902 }
3903
3904 // packages/theme/build-module/theme-provider.js
3905 var import_jsx_runtime = __toESM(require_jsx_runtime());
3906 var css = `.style-module__root__26kw6 {
3907 display: contents;
3908 }
3909 `;
3910 document.head.appendChild(document.createElement("style")).appendChild(document.createTextNode(css));
3911 var style_default = {
3912 "root": "style-module__root__26kw6"
3913 };
3914 function cssObjectToText(values) {
3915 return Object.entries(values).map(([key, value]) => `${key}: ${value};`).join("");
3916 }
3917 function generateCSSSelector({
3918 instanceId,
3919 isRoot
3920 }) {
3921 const rootSel = `[data-wpds-root-provider="true"]`;
3922 const instanceIdSel = `[data-wpds-theme-provider-id="${instanceId}"]`;
3923 const selectors = [];
3924 if (isRoot) {
3925 selectors.push(
3926 `:root:has(.${style_default.root}${rootSel}${instanceIdSel})`
3927 );
3928 }
3929 selectors.push(`.${style_default.root}.${style_default.root}${instanceIdSel}`);
3930 return selectors.join(",");
3931 }
3932 var ThemeProvider = ({
3933 children,
3934 color = {},
3935 isRoot = false,
3936 density
3937 }) => {
3938 const instanceId = (0, import_element3.useId)();
3939 const { themeProviderStyles, resolvedSettings } = useThemeProviderStyles({
3940 color
3941 });
3942 const contextValue = (0, import_element3.useMemo)(
3943 () => ({
3944 resolvedSettings
3945 }),
3946 [resolvedSettings]
3947 );
3948 return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
3949 themeProviderStyles ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("style", { children: `${generateCSSSelector({
3950 instanceId,
3951 isRoot
3952 })} {${cssObjectToText(themeProviderStyles)}}` }) : null,
3953 /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3954 "div",
3955 {
3956 "data-wpds-theme-provider-id": instanceId,
3957 "data-wpds-root-provider": isRoot,
3958 "data-wpds-density": density,
3959 className: style_default.root,
3960 children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext.Provider, { value: contextValue, children })
3961 }
3962 )
3963 ] });
3964 };
3965
3966 // packages/theme/build-module/private-apis.js
3967 var privateApis = {};
3968 lock(privateApis, {
3969 ThemeProvider,
3970 useThemeProviderStyles
3971 });
3972 return __toCommonJS(index_exports);
3973 })();
3974 //# sourceMappingURL=index.js.map
3975