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