PluginProbe
Gutenberg / 23.5.1
Gutenberg v23.5.1
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 23.5.1, at build/scripts/theme/index.js

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