webstudio 0.255.0 → 0.258.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/cli.js CHANGED
@@ -9,7 +9,7 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
9
9
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
10
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
11
11
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
12
- var _declarations, _dirtyBreakpoints, _a, _selector, _descendantSuffix, _mixinRules, _mixins, _declarations2, _cache, _NestingRule_instances, getDeclarations_fn, _b, _name, _c, _cached, _options, _d, _element, _name2, _e, _cssText, _mediaRules, _plainRules, _mixinRules2, _fontFaceRules, _transformValue, _element2, _f;
12
+ var _a, _b, _c, _declarations, _dirtyBreakpoints, _d, _selector, _descendantSuffix, _mixinRules, _mixins, _declarations2, _cache, _NestingRule_instances, getDeclarations_fn, _e, _name, _f, _cached, _options, _g, _element, _name2, _h, _cssText, _mediaRules, _plainRules, _mixinRules2, _fontFaceRules, _transformValue, _element2, _i;
13
13
  import { exit, cwd, chdir, argv } from "node:process";
14
14
  import { hideBin } from "yargs/helpers";
15
15
  import { join, dirname, normalize, basename, relative } from "node:path";
@@ -738,6 +738,1801 @@ new Map(
738
738
  return weightData.names.map((name2) => [name2, weight]);
739
739
  }).flat()
740
740
  );
741
+ function dot3(a2, b2) {
742
+ return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2];
743
+ }
744
+ function multiply_v3_m3x3(input2, matrix, out = [0, 0, 0]) {
745
+ const x2 = dot3(input2, matrix[0]);
746
+ const y2 = dot3(input2, matrix[1]);
747
+ const z2 = dot3(input2, matrix[2]);
748
+ out[0] = x2;
749
+ out[1] = y2;
750
+ out[2] = z2;
751
+ return out;
752
+ }
753
+ function isString(str) {
754
+ return type$1(str) === "string";
755
+ }
756
+ function type$1(o2) {
757
+ let str = Object.prototype.toString.call(o2);
758
+ return (str.match(/^\[object\s+(.*?)\]$/)[1] || "").toLowerCase();
759
+ }
760
+ function serializeNumber(n2, { precision = 16, unit }) {
761
+ if (isNone(n2)) {
762
+ return "none";
763
+ }
764
+ n2 = +toPrecision(n2, precision);
765
+ return n2 + (unit ?? "");
766
+ }
767
+ function isNone(n2) {
768
+ return n2 === null;
769
+ }
770
+ function toPrecision(n2, precision) {
771
+ if (n2 === 0) {
772
+ return 0;
773
+ }
774
+ let integer = ~~n2;
775
+ let digits = 0;
776
+ if (integer && precision) {
777
+ digits = ~~Math.log10(Math.abs(integer)) + 1;
778
+ }
779
+ const multiplier = 10 ** (precision - digits);
780
+ return Math.floor(n2 * multiplier + 0.5) / multiplier;
781
+ }
782
+ function interpolate(start, end, p2) {
783
+ if (isNaN(start)) {
784
+ return end;
785
+ }
786
+ if (isNaN(end)) {
787
+ return start;
788
+ }
789
+ return start + (end - start) * p2;
790
+ }
791
+ function interpolateInv(start, end, value) {
792
+ return (value - start) / (end - start);
793
+ }
794
+ function mapRange(from, to, value) {
795
+ if (!from || !to || from === to || from[0] === to[0] && from[1] === to[1] || isNaN(value) || value === null) {
796
+ return value;
797
+ }
798
+ return interpolate(to[0], to[1], interpolateInv(from[0], from[1], value));
799
+ }
800
+ function clamp(min, val, max) {
801
+ return Math.max(Math.min(max, val), min);
802
+ }
803
+ function isInstance(arg, constructor) {
804
+ var _a2;
805
+ if (arg instanceof constructor) {
806
+ return true;
807
+ }
808
+ const targetName = constructor.name;
809
+ while (arg) {
810
+ const proto = Object.getPrototypeOf(arg);
811
+ const constructorName = (_a2 = proto == null ? void 0 : proto.constructor) == null ? void 0 : _a2.name;
812
+ if (constructorName === targetName) {
813
+ return true;
814
+ }
815
+ if (!constructorName || constructorName === "Object") {
816
+ return false;
817
+ }
818
+ arg = proto;
819
+ }
820
+ return false;
821
+ }
822
+ class Type {
823
+ /**
824
+ * @param {any} type
825
+ * @param {import("./types.js").CoordMeta} coordMeta
826
+ */
827
+ constructor(type2, coordMeta) {
828
+ // Class properties - declared here so that type inference works
829
+ __publicField(this, "type");
830
+ __publicField(this, "coordMeta");
831
+ __publicField(this, "coordRange");
832
+ /** @type {[number, number]} */
833
+ __publicField(this, "range");
834
+ if (typeof type2 === "object") {
835
+ this.coordMeta = type2;
836
+ }
837
+ if (coordMeta) {
838
+ this.coordMeta = coordMeta;
839
+ this.coordRange = coordMeta.range ?? coordMeta.refRange;
840
+ }
841
+ if (typeof type2 === "string") {
842
+ let params = type2.trim().match(/^(?<type><[a-z]+>)(\[(?<min>-?[.\d]+),\s*(?<max>-?[.\d]+)\])?$/);
843
+ if (!params) {
844
+ throw new TypeError(`Cannot parse ${type2} as a type definition.`);
845
+ }
846
+ this.type = params.groups.type;
847
+ let { min, max } = params.groups;
848
+ if (min || max) {
849
+ this.range = [+min, +max];
850
+ }
851
+ }
852
+ }
853
+ /** @returns {[number, number]} */
854
+ get computedRange() {
855
+ if (this.range) {
856
+ return this.range;
857
+ }
858
+ if (this.type === "<percentage>") {
859
+ return this.percentageRange();
860
+ } else if (this.type === "<angle>") {
861
+ return [0, 360];
862
+ }
863
+ return null;
864
+ }
865
+ get unit() {
866
+ if (this.type === "<percentage>") {
867
+ return "%";
868
+ } else if (this.type === "<angle>") {
869
+ return "deg";
870
+ }
871
+ return "";
872
+ }
873
+ /**
874
+ * Map a number to the internal representation
875
+ * @param {number} number
876
+ */
877
+ resolve(number) {
878
+ if (this.type === "<angle>") {
879
+ return number;
880
+ }
881
+ let fromRange = this.computedRange;
882
+ let toRange = this.coordRange;
883
+ if (this.type === "<percentage>") {
884
+ toRange ?? (toRange = this.percentageRange());
885
+ }
886
+ return mapRange(fromRange, toRange, number);
887
+ }
888
+ /**
889
+ * Serialize a number from the internal representation to a string
890
+ * @param {number} number
891
+ * @param {number} [precision]
892
+ */
893
+ serialize(number, precision) {
894
+ let toRange = this.type === "<percentage>" ? this.percentageRange(100) : this.computedRange;
895
+ let unit = this.unit;
896
+ number = mapRange(this.coordRange, toRange, number);
897
+ return serializeNumber(number, { unit, precision });
898
+ }
899
+ toString() {
900
+ let ret = this.type;
901
+ if (this.range) {
902
+ let [min = "", max = ""] = this.range;
903
+ ret += `[${min},${max}]`;
904
+ }
905
+ return ret;
906
+ }
907
+ /**
908
+ * Returns a percentage range for values of this type
909
+ * @param {number} scale
910
+ * @returns {[number, number]}
911
+ */
912
+ percentageRange(scale = 1) {
913
+ let range;
914
+ if (this.coordMeta && this.coordMeta.range || this.coordRange && this.coordRange[0] >= 0) {
915
+ range = [0, 1];
916
+ } else {
917
+ range = [-1, 1];
918
+ }
919
+ return [range[0] * scale, range[1] * scale];
920
+ }
921
+ static get(type2, coordMeta) {
922
+ if (isInstance(type2, this)) {
923
+ return type2;
924
+ }
925
+ return new this(type2, coordMeta);
926
+ }
927
+ }
928
+ const instance = Symbol("instance");
929
+ class Format {
930
+ /**
931
+ * @param {FormatInterface} format
932
+ * @param {ColorSpace} space
933
+ */
934
+ constructor(format, space = format.space) {
935
+ // Class properties - declared here so that type inference works
936
+ __publicField(this, "type");
937
+ __publicField(this, "name");
938
+ __publicField(this, "spaceCoords");
939
+ /** @type {Type[][]} */
940
+ __publicField(this, "coords");
941
+ /** @type {string | undefined} */
942
+ __publicField(this, "id");
943
+ /** @type {boolean | undefined} */
944
+ __publicField(this, "alpha");
945
+ format[instance] = this;
946
+ this.type = "function";
947
+ this.name = "color";
948
+ Object.assign(this, format);
949
+ this.space = space;
950
+ if (this.type === "custom") {
951
+ return;
952
+ }
953
+ this.spaceCoords = Object.values(space.coords);
954
+ if (!this.coords) {
955
+ this.coords = this.spaceCoords.map((coordMeta) => {
956
+ let ret = ["<number>", "<percentage>"];
957
+ if (coordMeta.type === "angle") {
958
+ ret.push("<angle>");
959
+ }
960
+ return ret;
961
+ });
962
+ }
963
+ this.coords = this.coords.map(
964
+ /** @param {string | string[] | Type[]} types */
965
+ (types, i2) => {
966
+ let coordMeta = this.spaceCoords[i2];
967
+ if (typeof types === "string") {
968
+ types = types.trim().split(/\s*\|\s*/);
969
+ }
970
+ return types.map((type2) => Type.get(type2, coordMeta));
971
+ }
972
+ );
973
+ }
974
+ /**
975
+ * @param {Coords} coords
976
+ * @param {number} precision
977
+ * @param {Type[]} types
978
+ */
979
+ serializeCoords(coords, precision, types) {
980
+ types = coords.map((_, i2) => Type.get((types == null ? void 0 : types[i2]) ?? this.coords[i2][0], this.spaceCoords[i2]));
981
+ return coords.map((c2, i2) => types[i2].serialize(c2, precision));
982
+ }
983
+ /**
984
+ * Validates the coordinates of a color against a format's coord grammar and
985
+ * maps the coordinates to the range or refRange of the coordinates.
986
+ * @param {Coords} coords
987
+ * @param {[string, string, string]} types
988
+ */
989
+ coerceCoords(coords, types) {
990
+ return Object.entries(this.space.coords).map(([id, coordMeta], i2) => {
991
+ let arg = coords[i2];
992
+ if (isNone(arg) || isNaN(arg)) {
993
+ return arg;
994
+ }
995
+ let providedType = types[i2];
996
+ let type2 = this.coords[i2].find((c2) => c2.type == providedType);
997
+ if (!type2) {
998
+ let coordName = coordMeta.name || id;
999
+ throw new TypeError(
1000
+ `${providedType ?? /** @type {any} */
1001
+ (arg == null ? void 0 : arg.raw) ?? arg} not allowed for ${coordName} in ${this.name}()`
1002
+ );
1003
+ }
1004
+ arg = type2.resolve(arg);
1005
+ if (type2.range) {
1006
+ types[i2] = type2.toString();
1007
+ }
1008
+ return arg;
1009
+ });
1010
+ }
1011
+ /**
1012
+ * @returns {boolean | Required<FormatInterface>["serialize"]}
1013
+ */
1014
+ canSerialize() {
1015
+ return this.type === "function" || /** @type {any} */
1016
+ this.serialize;
1017
+ }
1018
+ /**
1019
+ * @param {string} str
1020
+ * @returns {(import("./types.js").ColorConstructor) | undefined | null}
1021
+ */
1022
+ parse(str) {
1023
+ return null;
1024
+ }
1025
+ /**
1026
+ * @param {Format | FormatInterface} format
1027
+ * @param {RemoveFirstElement<ConstructorParameters<typeof Format>>} args
1028
+ * @returns {Format}
1029
+ */
1030
+ static get(format, ...args) {
1031
+ if (!format || isInstance(format, this)) {
1032
+ return (
1033
+ /** @type {Format} */
1034
+ format
1035
+ );
1036
+ }
1037
+ if (format[instance]) {
1038
+ return format[instance];
1039
+ }
1040
+ return new Format(format, ...args);
1041
+ }
1042
+ }
1043
+ class Hooks {
1044
+ add(name2, callback, first) {
1045
+ if (typeof arguments[0] != "string") {
1046
+ for (var name2 in arguments[0]) {
1047
+ this.add(name2, arguments[0][name2], arguments[1]);
1048
+ }
1049
+ return;
1050
+ }
1051
+ (Array.isArray(name2) ? name2 : [name2]).forEach(function(name3) {
1052
+ this[name3] = this[name3] || [];
1053
+ if (callback) {
1054
+ this[name3][first ? "unshift" : "push"](callback);
1055
+ }
1056
+ }, this);
1057
+ }
1058
+ run(name2, env) {
1059
+ this[name2] = this[name2] || [];
1060
+ this[name2].forEach(function(callback) {
1061
+ callback.call(env && env.context ? env.context : env, env);
1062
+ });
1063
+ }
1064
+ }
1065
+ const hooks = new Hooks();
1066
+ const WHITES = {
1067
+ // for compatibility, the four-digit chromaticity-derived ones everyone else uses
1068
+ D50: [0.3457 / 0.3585, 1, (1 - 0.3457 - 0.3585) / 0.3585],
1069
+ D65: [0.3127 / 0.329, 1, (1 - 0.3127 - 0.329) / 0.329]
1070
+ };
1071
+ function getWhite(name2) {
1072
+ if (Array.isArray(name2)) {
1073
+ return name2;
1074
+ }
1075
+ return WHITES[name2];
1076
+ }
1077
+ function adapt(W1, W2, XYZ, options = {}) {
1078
+ W1 = getWhite(W1);
1079
+ W2 = getWhite(W2);
1080
+ if (!W1 || !W2) {
1081
+ throw new TypeError(
1082
+ `Missing white point to convert ${!W1 ? "from" : ""}${!W1 && !W2 ? "/" : ""}${!W2 ? "to" : ""}`
1083
+ );
1084
+ }
1085
+ if (W1 === W2) {
1086
+ return XYZ;
1087
+ }
1088
+ let env = { W1, W2, XYZ, options };
1089
+ hooks.run("chromatic-adaptation-start", env);
1090
+ if (!env.M) {
1091
+ if (env.W1 === WHITES.D65 && env.W2 === WHITES.D50) {
1092
+ env.M = [
1093
+ [1.0479297925449969, 0.022946870601609652, -0.05019226628920524],
1094
+ [0.02962780877005599, 0.9904344267538799, -0.017073799063418826],
1095
+ [-0.009243040646204504, 0.015055191490298152, 0.7518742814281371]
1096
+ ];
1097
+ } else if (env.W1 === WHITES.D50 && env.W2 === WHITES.D65) {
1098
+ env.M = [
1099
+ [0.955473421488075, -0.02309845494876471, 0.06325924320057072],
1100
+ [-0.0283697093338637, 1.0099953980813041, 0.021041441191917323],
1101
+ [0.012314014864481998, -0.020507649298898964, 1.330365926242124]
1102
+ ];
1103
+ }
1104
+ }
1105
+ hooks.run("chromatic-adaptation-end", env);
1106
+ if (env.M) {
1107
+ return multiply_v3_m3x3(env.XYZ, env.M);
1108
+ } else {
1109
+ throw new TypeError("Only Bradford CAT with white points D50 and D65 supported for now.");
1110
+ }
1111
+ }
1112
+ const defaults = {
1113
+ gamut_mapping: "css",
1114
+ precision: 5,
1115
+ deltaE: "76",
1116
+ // Default deltaE method
1117
+ verbose: ((_c = (_b = (_a = globalThis == null ? void 0 : globalThis.process) == null ? void 0 : _a.env) == null ? void 0 : _b.NODE_ENV) == null ? void 0 : _c.toLowerCase()) !== "test",
1118
+ warn: function warn(msg) {
1119
+ var _a2, _b2;
1120
+ if (this.verbose) {
1121
+ (_b2 = (_a2 = globalThis == null ? void 0 : globalThis.console) == null ? void 0 : _a2.warn) == null ? void 0 : _b2.call(_a2, msg);
1122
+ }
1123
+ }
1124
+ };
1125
+ function parse(str, options) {
1126
+ var _a2, _b2, _c2;
1127
+ let env = {
1128
+ str: (_a2 = String(str)) == null ? void 0 : _a2.trim(),
1129
+ options
1130
+ };
1131
+ hooks.run("parse-start", env);
1132
+ if (env.color) {
1133
+ return env.color;
1134
+ }
1135
+ env.parsed = parseFunction(env.str);
1136
+ let ret;
1137
+ let meta = env.options ? env.options.parseMeta ?? env.options.meta : null;
1138
+ if (env.parsed) {
1139
+ let name2 = env.parsed.name;
1140
+ let format;
1141
+ let space;
1142
+ let coords = env.parsed.args;
1143
+ let types = coords.map((c2, i2) => {
1144
+ var _a3;
1145
+ return (_a3 = env.parsed.argMeta[i2]) == null ? void 0 : _a3.type;
1146
+ });
1147
+ if (name2 === "color") {
1148
+ let id = coords.shift();
1149
+ types.shift();
1150
+ let alternateId = id.startsWith("--") ? id.substring(2) : `--${id}`;
1151
+ let ids = [id, alternateId];
1152
+ format = ColorSpace.findFormat({ name: name2, id: ids, type: "function" });
1153
+ if (!format) {
1154
+ let didYouMean;
1155
+ let registryId = id in ColorSpace.registry ? id : alternateId;
1156
+ if (registryId in ColorSpace.registry) {
1157
+ let cssId = (_c2 = (_b2 = ColorSpace.registry[registryId].formats) == null ? void 0 : _b2.color) == null ? void 0 : _c2.id;
1158
+ if (cssId) {
1159
+ let altColor = str.replace("color(" + id, "color(" + cssId);
1160
+ didYouMean = `Did you mean ${altColor}?`;
1161
+ }
1162
+ }
1163
+ throw new TypeError(
1164
+ `Cannot parse ${env.str}. ` + (didYouMean ?? "Missing a plugin?")
1165
+ );
1166
+ }
1167
+ space = format.space;
1168
+ if (format.id.startsWith("--") && !id.startsWith("--")) {
1169
+ defaults.warn(
1170
+ `${space.name} is a non-standard space and not currently supported in the CSS spec. Use prefixed color(${format.id}) instead of color(${id}).`
1171
+ );
1172
+ }
1173
+ if (id.startsWith("--") && !format.id.startsWith("--")) {
1174
+ defaults.warn(
1175
+ `${space.name} is a standard space and supported in the CSS spec. Use color(${format.id}) instead of prefixed color(${id}).`
1176
+ );
1177
+ }
1178
+ } else {
1179
+ format = ColorSpace.findFormat({ name: name2, type: "function" });
1180
+ space = format.space;
1181
+ }
1182
+ if (meta) {
1183
+ Object.assign(meta, {
1184
+ format,
1185
+ formatId: format.name,
1186
+ types,
1187
+ commas: env.parsed.commas
1188
+ });
1189
+ }
1190
+ let alpha = 1;
1191
+ if (env.parsed.lastAlpha) {
1192
+ alpha = env.parsed.args.pop();
1193
+ if (meta) {
1194
+ meta.alphaType = types.pop();
1195
+ }
1196
+ }
1197
+ let coordCount = format.coords.length;
1198
+ if (coords.length !== coordCount) {
1199
+ throw new TypeError(
1200
+ `Expected ${coordCount} coordinates for ${space.id} in ${env.str}), got ${coords.length}`
1201
+ );
1202
+ }
1203
+ coords = format.coerceCoords(coords, types);
1204
+ ret = { spaceId: space.id, coords, alpha };
1205
+ } else {
1206
+ spaceloop: for (let space of ColorSpace.all) {
1207
+ for (let formatId in space.formats) {
1208
+ let format = space.formats[formatId];
1209
+ if (format.type !== "custom") {
1210
+ continue;
1211
+ }
1212
+ if (format.test && !format.test(env.str)) {
1213
+ continue;
1214
+ }
1215
+ let formatObject = space.getFormat(format);
1216
+ let color = formatObject.parse(env.str);
1217
+ if (color) {
1218
+ if (meta) {
1219
+ Object.assign(meta, { format: formatObject, formatId });
1220
+ }
1221
+ ret = color;
1222
+ break spaceloop;
1223
+ }
1224
+ }
1225
+ }
1226
+ }
1227
+ if (!ret) {
1228
+ throw new TypeError(`Could not parse ${str} as a color. Missing a plugin?`);
1229
+ }
1230
+ ret.alpha = isNone(ret.alpha) ? ret.alpha : ret.alpha === void 0 ? 1 : clamp(0, ret.alpha, 1);
1231
+ return ret;
1232
+ }
1233
+ const units = {
1234
+ "%": 0.01,
1235
+ deg: 1,
1236
+ grad: 0.9,
1237
+ rad: 180 / Math.PI,
1238
+ turn: 360
1239
+ };
1240
+ const regex = {
1241
+ // Need to list calc(NaN) explicitly as otherwise its ending paren would terminate the function call
1242
+ function: /^([a-z]+)\(((?:calc\(NaN\)|.)+?)\)$/i,
1243
+ number: /^([-+]?(?:[0-9]*\.)?[0-9]+(e[-+]?[0-9]+)?)$/i,
1244
+ unitValue: RegExp(`(${Object.keys(units).join("|")})$`),
1245
+ // NOTE The -+ are not just for prefix, but also for idents, and e+N notation!
1246
+ singleArgument: /\/?\s*(none|NaN|calc\(NaN\)|[-+\w.]+(?:%|deg|g?rad|turn)?)/g
1247
+ };
1248
+ function parseArgument(rawArg) {
1249
+ var _a2;
1250
+ let meta = {};
1251
+ let unit = (_a2 = rawArg.match(regex.unitValue)) == null ? void 0 : _a2[0];
1252
+ let value = meta.raw = rawArg;
1253
+ if (unit) {
1254
+ meta.type = unit === "%" ? "<percentage>" : "<angle>";
1255
+ meta.unit = unit;
1256
+ meta.unitless = Number(value.slice(0, -unit.length));
1257
+ value = meta.unitless * units[unit];
1258
+ } else if (regex.number.test(value)) {
1259
+ value = Number(value);
1260
+ meta.type = "<number>";
1261
+ } else if (value === "none") {
1262
+ value = null;
1263
+ } else if (value === "NaN" || value === "calc(NaN)") {
1264
+ value = NaN;
1265
+ meta.type = "<number>";
1266
+ } else {
1267
+ meta.type = "<ident>";
1268
+ }
1269
+ return { value: (
1270
+ /** @type {number} */
1271
+ value
1272
+ ), meta: (
1273
+ /** @type {ArgumentMeta} */
1274
+ meta
1275
+ ) };
1276
+ }
1277
+ function parseFunction(str) {
1278
+ if (!str) {
1279
+ return;
1280
+ }
1281
+ str = str.trim();
1282
+ let parts = str.match(regex.function);
1283
+ if (parts) {
1284
+ let args = [];
1285
+ let argMeta = [];
1286
+ let lastAlpha = false;
1287
+ let name2 = parts[1].toLowerCase();
1288
+ let separators = parts[2].replace(regex.singleArgument, ($0, rawArg) => {
1289
+ let { value, meta } = parseArgument(rawArg);
1290
+ if (
1291
+ // If there's a slash here, it's modern syntax
1292
+ $0.startsWith("/") || // If there's still elements to process after there's already 3 in `args` (and the we're not dealing with "color()"), it's likely to be a legacy color like "hsl(0, 0%, 0%, 0.5)"
1293
+ name2 !== "color" && args.length === 3
1294
+ ) {
1295
+ lastAlpha = true;
1296
+ }
1297
+ args.push(value);
1298
+ argMeta.push(meta);
1299
+ return "";
1300
+ });
1301
+ return {
1302
+ name: name2,
1303
+ args,
1304
+ argMeta,
1305
+ lastAlpha,
1306
+ commas: separators.includes(","),
1307
+ rawName: parts[1],
1308
+ rawArgs: parts[2]
1309
+ };
1310
+ }
1311
+ }
1312
+ function getColor(color, options) {
1313
+ if (Array.isArray(color)) {
1314
+ return color.map((c2) => getColor(c2, options));
1315
+ }
1316
+ if (!color) {
1317
+ throw new TypeError("Empty color reference");
1318
+ }
1319
+ if (isString(color)) {
1320
+ color = parse(color, options);
1321
+ }
1322
+ let space = color.space || color.spaceId;
1323
+ if (typeof space === "string") {
1324
+ color.space = ColorSpace.get(space);
1325
+ }
1326
+ if (color.alpha === void 0) {
1327
+ color.alpha = 1;
1328
+ }
1329
+ return color;
1330
+ }
1331
+ const ε$1 = 75e-6;
1332
+ const _ColorSpace = class _ColorSpace {
1333
+ constructor(options) {
1334
+ var _a2;
1335
+ this.id = options.id;
1336
+ this.name = options.name;
1337
+ this.base = options.base ? _ColorSpace.get(options.base) : null;
1338
+ this.aliases = options.aliases;
1339
+ if (this.base) {
1340
+ this.fromBase = options.fromBase;
1341
+ this.toBase = options.toBase;
1342
+ }
1343
+ let coords = options.coords ?? this.base.coords;
1344
+ for (let name2 in coords) {
1345
+ if (!("name" in coords[name2])) {
1346
+ coords[name2].name = name2;
1347
+ }
1348
+ }
1349
+ this.coords = coords;
1350
+ let white2 = options.white ?? this.base.white ?? "D65";
1351
+ this.white = getWhite(white2);
1352
+ this.formats = options.formats ?? {};
1353
+ for (let name2 in this.formats) {
1354
+ let format = this.formats[name2];
1355
+ format.type || (format.type = "function");
1356
+ format.name || (format.name = name2);
1357
+ }
1358
+ if (!((_a2 = this.formats.color) == null ? void 0 : _a2.id)) {
1359
+ this.formats.color = {
1360
+ ...this.formats.color ?? {},
1361
+ id: options.cssId || this.id
1362
+ };
1363
+ }
1364
+ if (options.gamutSpace) {
1365
+ this.gamutSpace = options.gamutSpace === "self" ? this : _ColorSpace.get(options.gamutSpace);
1366
+ } else {
1367
+ if (this.isPolar) {
1368
+ this.gamutSpace = this.base;
1369
+ } else {
1370
+ this.gamutSpace = this;
1371
+ }
1372
+ }
1373
+ if (this.gamutSpace.isUnbounded) {
1374
+ this.inGamut = (coords2, options2) => {
1375
+ return true;
1376
+ };
1377
+ }
1378
+ this.referred = options.referred;
1379
+ Object.defineProperty(this, "path", {
1380
+ value: getPath(this).reverse(),
1381
+ writable: false,
1382
+ enumerable: true,
1383
+ configurable: true
1384
+ });
1385
+ hooks.run("colorspace-init-end", this);
1386
+ }
1387
+ inGamut(coords, { epsilon = ε$1 } = {}) {
1388
+ if (!this.equals(this.gamutSpace)) {
1389
+ coords = this.to(this.gamutSpace, coords);
1390
+ return this.gamutSpace.inGamut(coords, { epsilon });
1391
+ }
1392
+ let coordMeta = Object.values(this.coords);
1393
+ return coords.every((c2, i2) => {
1394
+ let meta = coordMeta[i2];
1395
+ if (meta.type !== "angle" && meta.range) {
1396
+ if (isNone(c2)) {
1397
+ return true;
1398
+ }
1399
+ let [min, max] = meta.range;
1400
+ return (min === void 0 || c2 >= min - epsilon) && (max === void 0 || c2 <= max + epsilon);
1401
+ }
1402
+ return true;
1403
+ });
1404
+ }
1405
+ get isUnbounded() {
1406
+ return Object.values(this.coords).every((coord) => !("range" in coord));
1407
+ }
1408
+ get cssId() {
1409
+ var _a2, _b2;
1410
+ return ((_b2 = (_a2 = this.formats) == null ? void 0 : _a2.color) == null ? void 0 : _b2.id) || this.id;
1411
+ }
1412
+ get isPolar() {
1413
+ for (let id in this.coords) {
1414
+ if (this.coords[id].type === "angle") {
1415
+ return true;
1416
+ }
1417
+ }
1418
+ return false;
1419
+ }
1420
+ /**
1421
+ * Lookup a format in this color space
1422
+ * @param {string | object | Format} format - Format id if string. If object, it's converted to a `Format` object and returned.
1423
+ * @returns {Format}
1424
+ */
1425
+ getFormat(format) {
1426
+ if (!format) {
1427
+ return null;
1428
+ }
1429
+ if (format === "default") {
1430
+ format = Object.values(this.formats)[0];
1431
+ } else if (typeof format === "string") {
1432
+ format = this.formats[format];
1433
+ }
1434
+ let ret = Format.get(format, this);
1435
+ if (ret !== format && format.name in this.formats) {
1436
+ this.formats[format.name] = ret;
1437
+ }
1438
+ return ret;
1439
+ }
1440
+ /**
1441
+ * Check if this color space is the same as another color space reference.
1442
+ * Allows proxying color space objects and comparing color spaces with ids.
1443
+ * @param {string | ColorSpace} space ColorSpace object or id to compare to
1444
+ * @returns {boolean}
1445
+ */
1446
+ equals(space) {
1447
+ if (!space) {
1448
+ return false;
1449
+ }
1450
+ return this === space || this.id === space || this.id === space.id;
1451
+ }
1452
+ to(space, coords) {
1453
+ if (arguments.length === 1) {
1454
+ const color = getColor(space);
1455
+ [space, coords] = [color.space, color.coords];
1456
+ }
1457
+ space = _ColorSpace.get(space);
1458
+ if (this.equals(space)) {
1459
+ return coords;
1460
+ }
1461
+ coords = coords.map((c2) => isNone(c2) ? 0 : c2);
1462
+ let myPath = this.path;
1463
+ let otherPath = space.path;
1464
+ let connectionSpace, connectionSpaceIndex;
1465
+ for (let i2 = 0; i2 < myPath.length; i2++) {
1466
+ if (myPath[i2].equals(otherPath[i2])) {
1467
+ connectionSpace = myPath[i2];
1468
+ connectionSpaceIndex = i2;
1469
+ } else {
1470
+ break;
1471
+ }
1472
+ }
1473
+ if (!connectionSpace) {
1474
+ throw new Error(
1475
+ `Cannot convert between color spaces ${this} and ${space}: no connection space was found`
1476
+ );
1477
+ }
1478
+ for (let i2 = myPath.length - 1; i2 > connectionSpaceIndex; i2--) {
1479
+ coords = myPath[i2].toBase(coords);
1480
+ }
1481
+ for (let i2 = connectionSpaceIndex + 1; i2 < otherPath.length; i2++) {
1482
+ coords = otherPath[i2].fromBase(coords);
1483
+ }
1484
+ return coords;
1485
+ }
1486
+ from(space, coords) {
1487
+ if (arguments.length === 1) {
1488
+ const color = getColor(space);
1489
+ [space, coords] = [color.space, color.coords];
1490
+ }
1491
+ space = _ColorSpace.get(space);
1492
+ return space.to(this, coords);
1493
+ }
1494
+ toString() {
1495
+ return `${this.name} (${this.id})`;
1496
+ }
1497
+ getMinCoords() {
1498
+ let ret = [];
1499
+ for (let id in this.coords) {
1500
+ let meta = this.coords[id];
1501
+ let range = meta.range || meta.refRange;
1502
+ ret.push((range == null ? void 0 : range.min) ?? 0);
1503
+ }
1504
+ return ret;
1505
+ }
1506
+ // Returns array of unique color spaces
1507
+ static get all() {
1508
+ return [...new Set(Object.values(_ColorSpace.registry))];
1509
+ }
1510
+ static register(id, space) {
1511
+ if (arguments.length === 1) {
1512
+ space = arguments[0];
1513
+ id = space.id;
1514
+ }
1515
+ space = this.get(space);
1516
+ if (this.registry[id] && this.registry[id] !== space) {
1517
+ throw new Error(`Duplicate color space registration: '${id}'`);
1518
+ }
1519
+ this.registry[id] = space;
1520
+ if (arguments.length === 1 && space.aliases) {
1521
+ for (let alias of space.aliases) {
1522
+ this.register(alias, space);
1523
+ }
1524
+ }
1525
+ return space;
1526
+ }
1527
+ /**
1528
+ * Lookup ColorSpace object by name
1529
+ * @param {ColorSpace | string} name
1530
+ */
1531
+ static get(space, ...alternatives) {
1532
+ if (!space || isInstance(space, this)) {
1533
+ return space;
1534
+ }
1535
+ let argType = type$1(space);
1536
+ if (argType === "string") {
1537
+ let ret = _ColorSpace.registry[space.toLowerCase()];
1538
+ if (!ret) {
1539
+ throw new TypeError(`No color space found with id = "${space}"`);
1540
+ }
1541
+ return ret;
1542
+ }
1543
+ if (alternatives.length) {
1544
+ return _ColorSpace.get(...alternatives);
1545
+ }
1546
+ throw new TypeError(`${space} is not a valid color space`);
1547
+ }
1548
+ /**
1549
+ * Look up all color spaces for a format that matches certain criteria
1550
+ * @param {object | string} filters
1551
+ * @param {Array<ColorSpace>} [spaces=ColorSpace.all]
1552
+ * @returns {Format | null}
1553
+ */
1554
+ static findFormat(filters, spaces = _ColorSpace.all) {
1555
+ if (!filters) {
1556
+ return null;
1557
+ }
1558
+ if (typeof filters === "string") {
1559
+ filters = { name: filters };
1560
+ }
1561
+ for (let space of spaces) {
1562
+ for (let [name2, format] of Object.entries(space.formats)) {
1563
+ format.name ?? (format.name = name2);
1564
+ format.type ?? (format.type = "function");
1565
+ let matches = (!filters.name || format.name === filters.name) && (!filters.type || format.type === filters.type);
1566
+ if (filters.id) {
1567
+ let ids = format.ids || [format.id];
1568
+ let filterIds = Array.isArray(filters.id) ? filters.id : [filters.id];
1569
+ matches && (matches = filterIds.some((id) => ids.includes(id)));
1570
+ }
1571
+ if (matches) {
1572
+ let ret = Format.get(format, space);
1573
+ if (ret !== format) {
1574
+ space.formats[format.name] = ret;
1575
+ }
1576
+ return ret;
1577
+ }
1578
+ }
1579
+ }
1580
+ return null;
1581
+ }
1582
+ /**
1583
+ * Get metadata about a coordinate of a color space
1584
+ *
1585
+ * @static
1586
+ * @param {Array | string} ref
1587
+ * @param {ColorSpace | string} [workingSpace]
1588
+ * @return {Object}
1589
+ */
1590
+ static resolveCoord(ref, workingSpace) {
1591
+ var _a2;
1592
+ let coordType = type$1(ref);
1593
+ let space, coord;
1594
+ if (coordType === "string") {
1595
+ if (ref.includes(".")) {
1596
+ [space, coord] = ref.split(".");
1597
+ } else {
1598
+ [space, coord] = [, ref];
1599
+ }
1600
+ } else if (Array.isArray(ref)) {
1601
+ [space, coord] = ref;
1602
+ } else {
1603
+ space = ref.space;
1604
+ coord = ref.coordId;
1605
+ }
1606
+ space = _ColorSpace.get(space);
1607
+ if (!space) {
1608
+ space = workingSpace;
1609
+ }
1610
+ if (!space) {
1611
+ throw new TypeError(
1612
+ `Cannot resolve coordinate reference ${ref}: No color space specified and relative references are not allowed here`
1613
+ );
1614
+ }
1615
+ coordType = type$1(coord);
1616
+ if (coordType === "number" || coordType === "string" && coord >= 0) {
1617
+ let meta = Object.entries(space.coords)[coord];
1618
+ if (meta) {
1619
+ return { space, id: meta[0], index: coord, ...meta[1] };
1620
+ }
1621
+ }
1622
+ space = _ColorSpace.get(space);
1623
+ let normalizedCoord = coord.toLowerCase();
1624
+ let i2 = 0;
1625
+ for (let id in space.coords) {
1626
+ let meta = space.coords[id];
1627
+ if (id.toLowerCase() === normalizedCoord || ((_a2 = meta.name) == null ? void 0 : _a2.toLowerCase()) === normalizedCoord) {
1628
+ return { space, id, index: i2, ...meta };
1629
+ }
1630
+ i2++;
1631
+ }
1632
+ throw new TypeError(
1633
+ `No "${coord}" coordinate found in ${space.name}. Its coordinates are: ${Object.keys(space.coords).join(", ")}`
1634
+ );
1635
+ }
1636
+ };
1637
+ __publicField(_ColorSpace, "registry", {});
1638
+ __publicField(_ColorSpace, "DEFAULT_FORMAT", {
1639
+ type: "functions",
1640
+ name: "color"
1641
+ });
1642
+ let ColorSpace = _ColorSpace;
1643
+ function getPath(space) {
1644
+ let ret = [space];
1645
+ for (let s2 = space; s2 = s2.base; ) {
1646
+ ret.push(s2);
1647
+ }
1648
+ return ret;
1649
+ }
1650
+ const xyz_d65 = new ColorSpace({
1651
+ id: "xyz-d65",
1652
+ name: "XYZ D65",
1653
+ coords: {
1654
+ x: {
1655
+ refRange: [0, 1],
1656
+ name: "X"
1657
+ },
1658
+ y: {
1659
+ refRange: [0, 1],
1660
+ name: "Y"
1661
+ },
1662
+ z: {
1663
+ refRange: [0, 1],
1664
+ name: "Z"
1665
+ }
1666
+ },
1667
+ white: "D65",
1668
+ formats: {
1669
+ color: {
1670
+ ids: ["xyz-d65", "xyz"]
1671
+ }
1672
+ },
1673
+ aliases: ["xyz"]
1674
+ });
1675
+ class RGBColorSpace extends ColorSpace {
1676
+ /**
1677
+ * Creates a new RGB ColorSpace.
1678
+ * If coords are not specified, they will use the default RGB coords.
1679
+ * Instead of `fromBase()` and `toBase()` functions,
1680
+ * you can specify to/from XYZ matrices and have `toBase()` and `fromBase()` automatically generated.
1681
+ * @param {RGBOptions} options
1682
+ */
1683
+ constructor(options) {
1684
+ if (!options.coords) {
1685
+ options.coords = {
1686
+ r: {
1687
+ range: [0, 1],
1688
+ name: "Red"
1689
+ },
1690
+ g: {
1691
+ range: [0, 1],
1692
+ name: "Green"
1693
+ },
1694
+ b: {
1695
+ range: [0, 1],
1696
+ name: "Blue"
1697
+ }
1698
+ };
1699
+ }
1700
+ if (!options.base) {
1701
+ options.base = xyz_d65;
1702
+ }
1703
+ if (options.toXYZ_M && options.fromXYZ_M) {
1704
+ options.toBase ?? (options.toBase = (rgb) => {
1705
+ let xyz = multiply_v3_m3x3(rgb, options.toXYZ_M);
1706
+ if (this.white !== this.base.white) {
1707
+ xyz = adapt(this.white, this.base.white, xyz);
1708
+ }
1709
+ return xyz;
1710
+ });
1711
+ options.fromBase ?? (options.fromBase = (xyz) => {
1712
+ xyz = adapt(this.base.white, this.white, xyz);
1713
+ return multiply_v3_m3x3(xyz, options.fromXYZ_M);
1714
+ });
1715
+ }
1716
+ options.referred ?? (options.referred = "display");
1717
+ super(options);
1718
+ }
1719
+ }
1720
+ const XYZ_D50 = new ColorSpace({
1721
+ id: "xyz-d50",
1722
+ name: "XYZ D50",
1723
+ white: "D50",
1724
+ base: xyz_d65,
1725
+ fromBase: (coords) => adapt(xyz_d65.white, "D50", coords),
1726
+ toBase: (coords) => adapt("D50", xyz_d65.white, coords)
1727
+ });
1728
+ const ε = 216 / 24389;
1729
+ const ε3 = 24 / 116;
1730
+ const κ = 24389 / 27;
1731
+ let white = WHITES.D50;
1732
+ const lab = new ColorSpace({
1733
+ id: "lab",
1734
+ name: "Lab",
1735
+ coords: {
1736
+ l: {
1737
+ refRange: [0, 100],
1738
+ name: "Lightness"
1739
+ },
1740
+ a: {
1741
+ refRange: [-125, 125]
1742
+ },
1743
+ b: {
1744
+ refRange: [-125, 125]
1745
+ }
1746
+ },
1747
+ // Assuming XYZ is relative to D50, convert to CIE Lab
1748
+ // from CIE standard, which now defines these as a rational fraction
1749
+ white,
1750
+ base: XYZ_D50,
1751
+ // Convert D50-adapted XYX to Lab
1752
+ // CIE 15.3:2004 section 8.2.1.1
1753
+ fromBase(XYZ) {
1754
+ let xyz = XYZ.map((value, i2) => value / white[i2]);
1755
+ let f2 = xyz.map((value) => value > ε ? Math.cbrt(value) : (κ * value + 16) / 116);
1756
+ let L2 = 116 * f2[1] - 16;
1757
+ let a2 = 500 * (f2[0] - f2[1]);
1758
+ let b2 = 200 * (f2[1] - f2[2]);
1759
+ return [L2, a2, b2];
1760
+ },
1761
+ // Convert Lab to D50-adapted XYZ
1762
+ // Same result as CIE 15.3:2004 Appendix D although the derivation is different
1763
+ // http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
1764
+ toBase(Lab) {
1765
+ let [L2, a2, b2] = Lab;
1766
+ let f2 = [];
1767
+ f2[1] = (L2 + 16) / 116;
1768
+ f2[0] = a2 / 500 + f2[1];
1769
+ f2[2] = f2[1] - b2 / 200;
1770
+ let xyz = [
1771
+ f2[0] > ε3 ? Math.pow(f2[0], 3) : (116 * f2[0] - 16) / κ,
1772
+ Lab[0] > 8 ? Math.pow((Lab[0] + 16) / 116, 3) : Lab[0] / κ,
1773
+ f2[2] > ε3 ? Math.pow(f2[2], 3) : (116 * f2[2] - 16) / κ
1774
+ ];
1775
+ return xyz.map((value, i2) => value * white[i2]);
1776
+ },
1777
+ formats: {
1778
+ lab: {
1779
+ coords: [
1780
+ "<percentage> | <number>",
1781
+ "<number> | <percentage>",
1782
+ "<number> | <percentage>"
1783
+ ]
1784
+ }
1785
+ }
1786
+ });
1787
+ function constrain(angle) {
1788
+ if (typeof angle !== "number") {
1789
+ return angle;
1790
+ }
1791
+ return (angle % 360 + 360) % 360;
1792
+ }
1793
+ const lch = new ColorSpace({
1794
+ id: "lch",
1795
+ name: "LCH",
1796
+ coords: {
1797
+ l: {
1798
+ refRange: [0, 100],
1799
+ name: "Lightness"
1800
+ },
1801
+ c: {
1802
+ refRange: [0, 150],
1803
+ name: "Chroma"
1804
+ },
1805
+ h: {
1806
+ refRange: [0, 360],
1807
+ type: "angle",
1808
+ name: "Hue"
1809
+ }
1810
+ },
1811
+ base: lab,
1812
+ fromBase(Lab) {
1813
+ if (this.ε === void 0) {
1814
+ let range = Object.values(this.base.coords)[1].refRange;
1815
+ let extent = range[1] - range[0];
1816
+ this.ε = extent / 1e5;
1817
+ }
1818
+ let [L2, a2, b2] = Lab;
1819
+ let isAchromatic = Math.abs(a2) < this.ε && Math.abs(b2) < this.ε;
1820
+ let h7 = isAchromatic ? null : constrain(Math.atan2(b2, a2) * 180 / Math.PI);
1821
+ let C2 = isAchromatic ? 0 : Math.sqrt(a2 ** 2 + b2 ** 2);
1822
+ return [L2, C2, h7];
1823
+ },
1824
+ toBase(lch2) {
1825
+ let [L2, C2, h7] = lch2;
1826
+ let a2 = null, b2 = null;
1827
+ if (!isNone(h7)) {
1828
+ C2 = C2 < 0 ? 0 : C2;
1829
+ a2 = C2 * Math.cos(h7 * Math.PI / 180);
1830
+ b2 = C2 * Math.sin(h7 * Math.PI / 180);
1831
+ }
1832
+ return [L2, a2, b2];
1833
+ },
1834
+ formats: {
1835
+ lch: {
1836
+ coords: ["<percentage> | <number>", "<number> | <percentage>", "<number> | <angle>"]
1837
+ }
1838
+ }
1839
+ });
1840
+ const XYZtoLMS_M = [
1841
+ [0.819022437996703, 0.3619062600528904, -0.1288737815209879],
1842
+ [0.0329836539323885, 0.9292868615863434, 0.0361446663506424],
1843
+ [0.0481771893596242, 0.2642395317527308, 0.6335478284694309]
1844
+ ];
1845
+ const LMStoXYZ_M = [
1846
+ [1.2268798758459243, -0.5578149944602171, 0.2813910456659647],
1847
+ [-0.0405757452148008, 1.112286803280317, -0.0717110580655164],
1848
+ [-0.0763729366746601, -0.4214933324022432, 1.5869240198367816]
1849
+ ];
1850
+ const LMStoLab_M = [
1851
+ [0.210454268309314, 0.7936177747023054, -0.0040720430116193],
1852
+ [1.9779985324311684, -2.42859224204858, 0.450593709617411],
1853
+ [0.0259040424655478, 0.7827717124575296, -0.8086757549230774]
1854
+ ];
1855
+ const LabtoLMS_M = [
1856
+ [1, 0.3963377773761749, 0.2158037573099136],
1857
+ [1, -0.1055613458156586, -0.0638541728258133],
1858
+ [1, -0.0894841775298119, -1.2914855480194092]
1859
+ ];
1860
+ const Oklab = new ColorSpace({
1861
+ id: "oklab",
1862
+ name: "Oklab",
1863
+ coords: {
1864
+ l: {
1865
+ refRange: [0, 1],
1866
+ name: "Lightness"
1867
+ },
1868
+ a: {
1869
+ refRange: [-0.4, 0.4]
1870
+ },
1871
+ b: {
1872
+ refRange: [-0.4, 0.4]
1873
+ }
1874
+ },
1875
+ // Note that XYZ is relative to D65
1876
+ white: "D65",
1877
+ base: xyz_d65,
1878
+ fromBase(XYZ) {
1879
+ let LMS = multiply_v3_m3x3(XYZ, XYZtoLMS_M);
1880
+ LMS[0] = Math.cbrt(LMS[0]);
1881
+ LMS[1] = Math.cbrt(LMS[1]);
1882
+ LMS[2] = Math.cbrt(LMS[2]);
1883
+ return multiply_v3_m3x3(LMS, LMStoLab_M, LMS);
1884
+ },
1885
+ toBase(OKLab) {
1886
+ let LMSg = multiply_v3_m3x3(OKLab, LabtoLMS_M);
1887
+ LMSg[0] = LMSg[0] ** 3;
1888
+ LMSg[1] = LMSg[1] ** 3;
1889
+ LMSg[2] = LMSg[2] ** 3;
1890
+ return multiply_v3_m3x3(LMSg, LMStoXYZ_M, LMSg);
1891
+ },
1892
+ formats: {
1893
+ oklab: {
1894
+ coords: [
1895
+ "<percentage> | <number>",
1896
+ "<number> | <percentage>",
1897
+ "<number> | <percentage>"
1898
+ ]
1899
+ }
1900
+ }
1901
+ });
1902
+ const toXYZ_M$4 = [
1903
+ [0.6369580483012914, 0.14461690358620832, 0.1688809751641721],
1904
+ [0.2627002120112671, 0.6779980715188708, 0.05930171646986196],
1905
+ [0, 0.028072693049087428, 1.060985057710791]
1906
+ ];
1907
+ const fromXYZ_M$4 = [
1908
+ [1.716651187971268, -0.355670783776392, -0.25336628137366],
1909
+ [-0.666684351832489, 1.616481236634939, 0.0157685458139111],
1910
+ [0.017639857445311, -0.042770613257809, 0.942103121235474]
1911
+ ];
1912
+ const REC_2020_Linear = new RGBColorSpace({
1913
+ id: "rec2020-linear",
1914
+ cssId: "--rec2020-linear",
1915
+ name: "Linear REC.2020",
1916
+ white: "D65",
1917
+ toXYZ_M: toXYZ_M$4,
1918
+ fromXYZ_M: fromXYZ_M$4
1919
+ });
1920
+ const REC2020 = new RGBColorSpace({
1921
+ id: "rec2020",
1922
+ name: "REC.2020",
1923
+ base: REC_2020_Linear,
1924
+ // Reference electro-optical transfer function from Rec. ITU-R BT.1886 Annex 1
1925
+ // with b (black lift) = 0 and a (user gain) = 1
1926
+ // defined over the extended range, not clamped
1927
+ toBase(RGB) {
1928
+ return RGB.map(function(val) {
1929
+ let sign = val < 0 ? -1 : 1;
1930
+ let abs = val * sign;
1931
+ return sign * Math.pow(abs, 2.4);
1932
+ });
1933
+ },
1934
+ fromBase(RGB) {
1935
+ return RGB.map(function(val) {
1936
+ let sign = val < 0 ? -1 : 1;
1937
+ let abs = val * sign;
1938
+ return sign * Math.pow(abs, 1 / 2.4);
1939
+ });
1940
+ }
1941
+ });
1942
+ const toXYZ_M$3 = [
1943
+ [0.4865709486482162, 0.26566769316909306, 0.1982172852343625],
1944
+ [0.2289745640697488, 0.6917385218365064, 0.079286914093745],
1945
+ [0, 0.04511338185890264, 1.043944368900976]
1946
+ ];
1947
+ const fromXYZ_M$3 = [
1948
+ [2.493496911941425, -0.9313836179191239, -0.40271078445071684],
1949
+ [-0.8294889695615747, 1.7626640603183463, 0.023624685841943577],
1950
+ [0.03584583024378447, -0.07617238926804182, 0.9568845240076872]
1951
+ ];
1952
+ const P3Linear = new RGBColorSpace({
1953
+ id: "p3-linear",
1954
+ cssId: "display-p3-linear",
1955
+ name: "Linear P3",
1956
+ white: "D65",
1957
+ toXYZ_M: toXYZ_M$3,
1958
+ fromXYZ_M: fromXYZ_M$3
1959
+ });
1960
+ const toXYZ_M$2 = [
1961
+ [0.41239079926595934, 0.357584339383878, 0.1804807884018343],
1962
+ [0.21263900587151027, 0.715168678767756, 0.07219231536073371],
1963
+ [0.01933081871559182, 0.11919477979462598, 0.9505321522496607]
1964
+ ];
1965
+ const fromXYZ_M$2 = [
1966
+ [3.2409699419045226, -1.537383177570094, -0.4986107602930034],
1967
+ [-0.9692436362808796, 1.8759675015077202, 0.04155505740717559],
1968
+ [0.05563007969699366, -0.20397695888897652, 1.0569715142428786]
1969
+ ];
1970
+ const sRGBLinear = new RGBColorSpace({
1971
+ id: "srgb-linear",
1972
+ name: "Linear sRGB",
1973
+ white: "D65",
1974
+ toXYZ_M: toXYZ_M$2,
1975
+ fromXYZ_M: fromXYZ_M$2
1976
+ });
1977
+ const KEYWORDS = {
1978
+ aliceblue: [240 / 255, 248 / 255, 1],
1979
+ antiquewhite: [250 / 255, 235 / 255, 215 / 255],
1980
+ aqua: [0, 1, 1],
1981
+ aquamarine: [127 / 255, 1, 212 / 255],
1982
+ azure: [240 / 255, 1, 1],
1983
+ beige: [245 / 255, 245 / 255, 220 / 255],
1984
+ bisque: [1, 228 / 255, 196 / 255],
1985
+ black: [0, 0, 0],
1986
+ blanchedalmond: [1, 235 / 255, 205 / 255],
1987
+ blue: [0, 0, 1],
1988
+ blueviolet: [138 / 255, 43 / 255, 226 / 255],
1989
+ brown: [165 / 255, 42 / 255, 42 / 255],
1990
+ burlywood: [222 / 255, 184 / 255, 135 / 255],
1991
+ cadetblue: [95 / 255, 158 / 255, 160 / 255],
1992
+ chartreuse: [127 / 255, 1, 0],
1993
+ chocolate: [210 / 255, 105 / 255, 30 / 255],
1994
+ coral: [1, 127 / 255, 80 / 255],
1995
+ cornflowerblue: [100 / 255, 149 / 255, 237 / 255],
1996
+ cornsilk: [1, 248 / 255, 220 / 255],
1997
+ crimson: [220 / 255, 20 / 255, 60 / 255],
1998
+ cyan: [0, 1, 1],
1999
+ darkblue: [0, 0, 139 / 255],
2000
+ darkcyan: [0, 139 / 255, 139 / 255],
2001
+ darkgoldenrod: [184 / 255, 134 / 255, 11 / 255],
2002
+ darkgray: [169 / 255, 169 / 255, 169 / 255],
2003
+ darkgreen: [0, 100 / 255, 0],
2004
+ darkgrey: [169 / 255, 169 / 255, 169 / 255],
2005
+ darkkhaki: [189 / 255, 183 / 255, 107 / 255],
2006
+ darkmagenta: [139 / 255, 0, 139 / 255],
2007
+ darkolivegreen: [85 / 255, 107 / 255, 47 / 255],
2008
+ darkorange: [1, 140 / 255, 0],
2009
+ darkorchid: [153 / 255, 50 / 255, 204 / 255],
2010
+ darkred: [139 / 255, 0, 0],
2011
+ darksalmon: [233 / 255, 150 / 255, 122 / 255],
2012
+ darkseagreen: [143 / 255, 188 / 255, 143 / 255],
2013
+ darkslateblue: [72 / 255, 61 / 255, 139 / 255],
2014
+ darkslategray: [47 / 255, 79 / 255, 79 / 255],
2015
+ darkslategrey: [47 / 255, 79 / 255, 79 / 255],
2016
+ darkturquoise: [0, 206 / 255, 209 / 255],
2017
+ darkviolet: [148 / 255, 0, 211 / 255],
2018
+ deeppink: [1, 20 / 255, 147 / 255],
2019
+ deepskyblue: [0, 191 / 255, 1],
2020
+ dimgray: [105 / 255, 105 / 255, 105 / 255],
2021
+ dimgrey: [105 / 255, 105 / 255, 105 / 255],
2022
+ dodgerblue: [30 / 255, 144 / 255, 1],
2023
+ firebrick: [178 / 255, 34 / 255, 34 / 255],
2024
+ floralwhite: [1, 250 / 255, 240 / 255],
2025
+ forestgreen: [34 / 255, 139 / 255, 34 / 255],
2026
+ fuchsia: [1, 0, 1],
2027
+ gainsboro: [220 / 255, 220 / 255, 220 / 255],
2028
+ ghostwhite: [248 / 255, 248 / 255, 1],
2029
+ gold: [1, 215 / 255, 0],
2030
+ goldenrod: [218 / 255, 165 / 255, 32 / 255],
2031
+ gray: [128 / 255, 128 / 255, 128 / 255],
2032
+ green: [0, 128 / 255, 0],
2033
+ greenyellow: [173 / 255, 1, 47 / 255],
2034
+ grey: [128 / 255, 128 / 255, 128 / 255],
2035
+ honeydew: [240 / 255, 1, 240 / 255],
2036
+ hotpink: [1, 105 / 255, 180 / 255],
2037
+ indianred: [205 / 255, 92 / 255, 92 / 255],
2038
+ indigo: [75 / 255, 0, 130 / 255],
2039
+ ivory: [1, 1, 240 / 255],
2040
+ khaki: [240 / 255, 230 / 255, 140 / 255],
2041
+ lavender: [230 / 255, 230 / 255, 250 / 255],
2042
+ lavenderblush: [1, 240 / 255, 245 / 255],
2043
+ lawngreen: [124 / 255, 252 / 255, 0],
2044
+ lemonchiffon: [1, 250 / 255, 205 / 255],
2045
+ lightblue: [173 / 255, 216 / 255, 230 / 255],
2046
+ lightcoral: [240 / 255, 128 / 255, 128 / 255],
2047
+ lightcyan: [224 / 255, 1, 1],
2048
+ lightgoldenrodyellow: [250 / 255, 250 / 255, 210 / 255],
2049
+ lightgray: [211 / 255, 211 / 255, 211 / 255],
2050
+ lightgreen: [144 / 255, 238 / 255, 144 / 255],
2051
+ lightgrey: [211 / 255, 211 / 255, 211 / 255],
2052
+ lightpink: [1, 182 / 255, 193 / 255],
2053
+ lightsalmon: [1, 160 / 255, 122 / 255],
2054
+ lightseagreen: [32 / 255, 178 / 255, 170 / 255],
2055
+ lightskyblue: [135 / 255, 206 / 255, 250 / 255],
2056
+ lightslategray: [119 / 255, 136 / 255, 153 / 255],
2057
+ lightslategrey: [119 / 255, 136 / 255, 153 / 255],
2058
+ lightsteelblue: [176 / 255, 196 / 255, 222 / 255],
2059
+ lightyellow: [1, 1, 224 / 255],
2060
+ lime: [0, 1, 0],
2061
+ limegreen: [50 / 255, 205 / 255, 50 / 255],
2062
+ linen: [250 / 255, 240 / 255, 230 / 255],
2063
+ magenta: [1, 0, 1],
2064
+ maroon: [128 / 255, 0, 0],
2065
+ mediumaquamarine: [102 / 255, 205 / 255, 170 / 255],
2066
+ mediumblue: [0, 0, 205 / 255],
2067
+ mediumorchid: [186 / 255, 85 / 255, 211 / 255],
2068
+ mediumpurple: [147 / 255, 112 / 255, 219 / 255],
2069
+ mediumseagreen: [60 / 255, 179 / 255, 113 / 255],
2070
+ mediumslateblue: [123 / 255, 104 / 255, 238 / 255],
2071
+ mediumspringgreen: [0, 250 / 255, 154 / 255],
2072
+ mediumturquoise: [72 / 255, 209 / 255, 204 / 255],
2073
+ mediumvioletred: [199 / 255, 21 / 255, 133 / 255],
2074
+ midnightblue: [25 / 255, 25 / 255, 112 / 255],
2075
+ mintcream: [245 / 255, 1, 250 / 255],
2076
+ mistyrose: [1, 228 / 255, 225 / 255],
2077
+ moccasin: [1, 228 / 255, 181 / 255],
2078
+ navajowhite: [1, 222 / 255, 173 / 255],
2079
+ navy: [0, 0, 128 / 255],
2080
+ oldlace: [253 / 255, 245 / 255, 230 / 255],
2081
+ olive: [128 / 255, 128 / 255, 0],
2082
+ olivedrab: [107 / 255, 142 / 255, 35 / 255],
2083
+ orange: [1, 165 / 255, 0],
2084
+ orangered: [1, 69 / 255, 0],
2085
+ orchid: [218 / 255, 112 / 255, 214 / 255],
2086
+ palegoldenrod: [238 / 255, 232 / 255, 170 / 255],
2087
+ palegreen: [152 / 255, 251 / 255, 152 / 255],
2088
+ paleturquoise: [175 / 255, 238 / 255, 238 / 255],
2089
+ palevioletred: [219 / 255, 112 / 255, 147 / 255],
2090
+ papayawhip: [1, 239 / 255, 213 / 255],
2091
+ peachpuff: [1, 218 / 255, 185 / 255],
2092
+ peru: [205 / 255, 133 / 255, 63 / 255],
2093
+ pink: [1, 192 / 255, 203 / 255],
2094
+ plum: [221 / 255, 160 / 255, 221 / 255],
2095
+ powderblue: [176 / 255, 224 / 255, 230 / 255],
2096
+ purple: [128 / 255, 0, 128 / 255],
2097
+ rebeccapurple: [102 / 255, 51 / 255, 153 / 255],
2098
+ red: [1, 0, 0],
2099
+ rosybrown: [188 / 255, 143 / 255, 143 / 255],
2100
+ royalblue: [65 / 255, 105 / 255, 225 / 255],
2101
+ saddlebrown: [139 / 255, 69 / 255, 19 / 255],
2102
+ salmon: [250 / 255, 128 / 255, 114 / 255],
2103
+ sandybrown: [244 / 255, 164 / 255, 96 / 255],
2104
+ seagreen: [46 / 255, 139 / 255, 87 / 255],
2105
+ seashell: [1, 245 / 255, 238 / 255],
2106
+ sienna: [160 / 255, 82 / 255, 45 / 255],
2107
+ silver: [192 / 255, 192 / 255, 192 / 255],
2108
+ skyblue: [135 / 255, 206 / 255, 235 / 255],
2109
+ slateblue: [106 / 255, 90 / 255, 205 / 255],
2110
+ slategray: [112 / 255, 128 / 255, 144 / 255],
2111
+ slategrey: [112 / 255, 128 / 255, 144 / 255],
2112
+ snow: [1, 250 / 255, 250 / 255],
2113
+ springgreen: [0, 1, 127 / 255],
2114
+ steelblue: [70 / 255, 130 / 255, 180 / 255],
2115
+ tan: [210 / 255, 180 / 255, 140 / 255],
2116
+ teal: [0, 128 / 255, 128 / 255],
2117
+ thistle: [216 / 255, 191 / 255, 216 / 255],
2118
+ tomato: [1, 99 / 255, 71 / 255],
2119
+ turquoise: [64 / 255, 224 / 255, 208 / 255],
2120
+ violet: [238 / 255, 130 / 255, 238 / 255],
2121
+ wheat: [245 / 255, 222 / 255, 179 / 255],
2122
+ white: [1, 1, 1],
2123
+ whitesmoke: [245 / 255, 245 / 255, 245 / 255],
2124
+ yellow: [1, 1, 0],
2125
+ yellowgreen: [154 / 255, 205 / 255, 50 / 255]
2126
+ };
2127
+ let coordGrammar = Array(3).fill("<percentage> | <number>[0, 255]");
2128
+ let coordGrammarNumber = Array(3).fill("<number>[0, 255]");
2129
+ const sRGB = new RGBColorSpace({
2130
+ id: "srgb",
2131
+ name: "sRGB",
2132
+ base: sRGBLinear,
2133
+ fromBase: (rgb) => {
2134
+ return rgb.map((val) => {
2135
+ let sign = val < 0 ? -1 : 1;
2136
+ let abs = val * sign;
2137
+ if (abs > 31308e-7) {
2138
+ return sign * (1.055 * abs ** (1 / 2.4) - 0.055);
2139
+ }
2140
+ return 12.92 * val;
2141
+ });
2142
+ },
2143
+ toBase: (rgb) => {
2144
+ return rgb.map((val) => {
2145
+ let sign = val < 0 ? -1 : 1;
2146
+ let abs = val * sign;
2147
+ if (abs <= 0.04045) {
2148
+ return val / 12.92;
2149
+ }
2150
+ return sign * ((abs + 0.055) / 1.055) ** 2.4;
2151
+ });
2152
+ },
2153
+ formats: {
2154
+ rgb: {
2155
+ coords: coordGrammar
2156
+ },
2157
+ rgb_number: {
2158
+ name: "rgb",
2159
+ commas: true,
2160
+ coords: coordGrammarNumber,
2161
+ alpha: false
2162
+ },
2163
+ color: {
2164
+ /* use defaults */
2165
+ },
2166
+ rgba: {
2167
+ coords: coordGrammar,
2168
+ commas: true,
2169
+ alpha: true
2170
+ },
2171
+ rgba_number: {
2172
+ name: "rgba",
2173
+ commas: true,
2174
+ coords: coordGrammarNumber
2175
+ },
2176
+ hex: {
2177
+ type: "custom",
2178
+ toGamut: true,
2179
+ test: (str) => /^#(([a-f0-9]{2}){3,4}|[a-f0-9]{3,4})$/i.test(str),
2180
+ parse(str) {
2181
+ if (str.length <= 5) {
2182
+ str = str.replace(/[a-f0-9]/gi, "$&$&");
2183
+ }
2184
+ let rgba = [];
2185
+ str.replace(/[a-f0-9]{2}/gi, (component) => {
2186
+ rgba.push(parseInt(component, 16) / 255);
2187
+ });
2188
+ return {
2189
+ spaceId: "srgb",
2190
+ coords: (
2191
+ /** @type {Coords} */
2192
+ rgba.slice(0, 3)
2193
+ ),
2194
+ alpha: (
2195
+ /** @type {number} */
2196
+ rgba.slice(3)[0]
2197
+ )
2198
+ };
2199
+ },
2200
+ serialize: (coords, alpha, {
2201
+ collapse = true,
2202
+ // collapse to 3-4 digit hex when possible?
2203
+ alpha: alphaFormat
2204
+ } = {}) => {
2205
+ if (alphaFormat !== false && alpha < 1 || alphaFormat === true) {
2206
+ coords.push(alpha);
2207
+ }
2208
+ coords = /** @type {[number, number, number]} */
2209
+ coords.map((c2) => Math.round(c2 * 255));
2210
+ let collapsible = collapse && coords.every((c2) => c2 % 17 === 0);
2211
+ let hex = coords.map((c2) => {
2212
+ if (collapsible) {
2213
+ return (c2 / 17).toString(16);
2214
+ }
2215
+ return c2.toString(16).padStart(2, "0");
2216
+ }).join("");
2217
+ return "#" + hex;
2218
+ }
2219
+ },
2220
+ keyword: {
2221
+ type: "custom",
2222
+ test: (str) => /^[a-z]+$/i.test(str),
2223
+ parse(str) {
2224
+ str = str.toLowerCase();
2225
+ let ret = { spaceId: "srgb", coords: null, alpha: 1 };
2226
+ if (str === "transparent") {
2227
+ ret.coords = KEYWORDS.black;
2228
+ ret.alpha = 0;
2229
+ } else {
2230
+ ret.coords = KEYWORDS[str];
2231
+ }
2232
+ if (ret.coords) {
2233
+ return ret;
2234
+ }
2235
+ }
2236
+ }
2237
+ }
2238
+ });
2239
+ const P3 = new RGBColorSpace({
2240
+ id: "p3",
2241
+ cssId: "display-p3",
2242
+ name: "P3",
2243
+ base: P3Linear,
2244
+ // Gamma encoding/decoding is the same as sRGB
2245
+ fromBase: sRGB.fromBase,
2246
+ toBase: sRGB.toBase
2247
+ });
2248
+ const hsl = new ColorSpace({
2249
+ id: "hsl",
2250
+ name: "HSL",
2251
+ coords: {
2252
+ h: {
2253
+ refRange: [0, 360],
2254
+ type: "angle",
2255
+ name: "Hue"
2256
+ },
2257
+ s: {
2258
+ range: [0, 100],
2259
+ name: "Saturation"
2260
+ },
2261
+ l: {
2262
+ range: [0, 100],
2263
+ name: "Lightness"
2264
+ }
2265
+ },
2266
+ base: sRGB,
2267
+ // Adapted from https://drafts.csswg.org/css-color-4/better-rgbToHsl.js
2268
+ fromBase: (rgb) => {
2269
+ let max = Math.max(...rgb);
2270
+ let min = Math.min(...rgb);
2271
+ let [r2, g2, b2] = rgb;
2272
+ let [h7, s2, l2] = [null, 0, (min + max) / 2];
2273
+ let d2 = max - min;
2274
+ if (d2 !== 0) {
2275
+ s2 = l2 === 0 || l2 === 1 ? 0 : (max - l2) / Math.min(l2, 1 - l2);
2276
+ switch (max) {
2277
+ case r2:
2278
+ h7 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
2279
+ break;
2280
+ case g2:
2281
+ h7 = (b2 - r2) / d2 + 2;
2282
+ break;
2283
+ case b2:
2284
+ h7 = (r2 - g2) / d2 + 4;
2285
+ }
2286
+ h7 = h7 * 60;
2287
+ }
2288
+ if (s2 < 0) {
2289
+ h7 += 180;
2290
+ s2 = Math.abs(s2);
2291
+ }
2292
+ if (h7 >= 360) {
2293
+ h7 -= 360;
2294
+ }
2295
+ return [h7, s2 * 100, l2 * 100];
2296
+ },
2297
+ // Adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB_alternative
2298
+ toBase: (hsl2) => {
2299
+ let [h7, s2, l2] = hsl2;
2300
+ h7 = h7 % 360;
2301
+ if (h7 < 0) {
2302
+ h7 += 360;
2303
+ }
2304
+ s2 /= 100;
2305
+ l2 /= 100;
2306
+ function f2(n2) {
2307
+ let k2 = (n2 + h7 / 30) % 12;
2308
+ let a2 = s2 * Math.min(l2, 1 - l2);
2309
+ return l2 - a2 * Math.max(-1, Math.min(k2 - 3, 9 - k2, 1));
2310
+ }
2311
+ return [f2(0), f2(8), f2(4)];
2312
+ },
2313
+ formats: {
2314
+ hsl: {
2315
+ coords: ["<number> | <angle>", "<percentage> | <number>", "<percentage> | <number>"]
2316
+ },
2317
+ hsla: {
2318
+ coords: ["<number> | <angle>", "<percentage> | <number>", "<percentage> | <number>"],
2319
+ commas: true,
2320
+ alpha: true
2321
+ }
2322
+ }
2323
+ });
2324
+ const HSV = new ColorSpace({
2325
+ id: "hsv",
2326
+ name: "HSV",
2327
+ coords: {
2328
+ h: {
2329
+ refRange: [0, 360],
2330
+ type: "angle",
2331
+ name: "Hue"
2332
+ },
2333
+ s: {
2334
+ range: [0, 100],
2335
+ name: "Saturation"
2336
+ },
2337
+ v: {
2338
+ range: [0, 100],
2339
+ name: "Value"
2340
+ }
2341
+ },
2342
+ base: sRGB,
2343
+ // https://en.wikipedia.org/wiki/HSL_and_HSV#Formal_derivation
2344
+ fromBase(rgb) {
2345
+ let max = Math.max(...rgb);
2346
+ let min = Math.min(...rgb);
2347
+ let [r2, g2, b2] = rgb;
2348
+ let [h7, s2, v2] = [null, 0, max];
2349
+ let d2 = max - min;
2350
+ if (d2 !== 0) {
2351
+ switch (max) {
2352
+ case r2:
2353
+ h7 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
2354
+ break;
2355
+ case g2:
2356
+ h7 = (b2 - r2) / d2 + 2;
2357
+ break;
2358
+ case b2:
2359
+ h7 = (r2 - g2) / d2 + 4;
2360
+ }
2361
+ h7 = h7 * 60;
2362
+ }
2363
+ if (v2) {
2364
+ s2 = d2 / v2;
2365
+ }
2366
+ if (h7 >= 360) {
2367
+ h7 -= 360;
2368
+ }
2369
+ return [h7, s2 * 100, v2 * 100];
2370
+ },
2371
+ // Adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_RGB_alternative
2372
+ toBase(hsv) {
2373
+ let [h7, s2, v2] = hsv;
2374
+ h7 = h7 % 360;
2375
+ if (h7 < 0) {
2376
+ h7 += 360;
2377
+ }
2378
+ s2 /= 100;
2379
+ v2 /= 100;
2380
+ function f2(n2) {
2381
+ let k2 = (n2 + h7 / 60) % 6;
2382
+ return v2 - v2 * s2 * Math.max(0, Math.min(k2, 4 - k2, 1));
2383
+ }
2384
+ return [f2(5), f2(3), f2(1)];
2385
+ },
2386
+ formats: {
2387
+ color: {
2388
+ id: "--hsv",
2389
+ coords: ["<number> | <angle>", "<percentage> | <number>", "<percentage> | <number>"]
2390
+ }
2391
+ }
2392
+ });
2393
+ const hwb = new ColorSpace({
2394
+ id: "hwb",
2395
+ name: "HWB",
2396
+ coords: {
2397
+ h: {
2398
+ refRange: [0, 360],
2399
+ type: "angle",
2400
+ name: "Hue"
2401
+ },
2402
+ w: {
2403
+ range: [0, 100],
2404
+ name: "Whiteness"
2405
+ },
2406
+ b: {
2407
+ range: [0, 100],
2408
+ name: "Blackness"
2409
+ }
2410
+ },
2411
+ base: HSV,
2412
+ fromBase(hsv) {
2413
+ let [h7, s2, v2] = hsv;
2414
+ return [h7, v2 * (100 - s2) / 100, 100 - v2];
2415
+ },
2416
+ toBase(hwb2) {
2417
+ let [h7, w2, b2] = hwb2;
2418
+ w2 /= 100;
2419
+ b2 /= 100;
2420
+ let sum = w2 + b2;
2421
+ if (sum >= 1) {
2422
+ let gray = w2 / sum;
2423
+ return [h7, 0, gray * 100];
2424
+ }
2425
+ let v2 = 1 - b2;
2426
+ let s2 = v2 === 0 ? 0 : 1 - w2 / v2;
2427
+ return [h7, s2 * 100, v2 * 100];
2428
+ },
2429
+ formats: {
2430
+ hwb: {
2431
+ coords: ["<number> | <angle>", "<percentage> | <number>", "<percentage> | <number>"]
2432
+ }
2433
+ }
2434
+ });
2435
+ const toXYZ_M$1 = [
2436
+ [0.5766690429101305, 0.1855582379065463, 0.1882286462349947],
2437
+ [0.29734497525053605, 0.6273635662554661, 0.07529145849399788],
2438
+ [0.02703136138641234, 0.07068885253582723, 0.9913375368376388]
2439
+ ];
2440
+ const fromXYZ_M$1 = [
2441
+ [2.0415879038107465, -0.5650069742788596, -0.34473135077832956],
2442
+ [-0.9692436362808795, 1.8759675015077202, 0.04155505740717557],
2443
+ [0.013444280632031142, -0.11836239223101838, 1.0151749943912054]
2444
+ ];
2445
+ const A98Linear = new RGBColorSpace({
2446
+ id: "a98rgb-linear",
2447
+ cssId: "--a98-rgb-linear",
2448
+ name: "Linear Adobe® 98 RGB compatible",
2449
+ white: "D65",
2450
+ toXYZ_M: toXYZ_M$1,
2451
+ fromXYZ_M: fromXYZ_M$1
2452
+ });
2453
+ const a98rgb = new RGBColorSpace({
2454
+ id: "a98rgb",
2455
+ cssId: "a98-rgb",
2456
+ name: "Adobe® 98 RGB compatible",
2457
+ base: A98Linear,
2458
+ toBase: (RGB) => RGB.map((val) => Math.pow(Math.abs(val), 563 / 256) * Math.sign(val)),
2459
+ fromBase: (RGB) => RGB.map((val) => Math.pow(Math.abs(val), 256 / 563) * Math.sign(val))
2460
+ });
2461
+ const toXYZ_M = [
2462
+ [0.7977666449006423, 0.13518129740053308, 0.0313477341283922],
2463
+ [0.2880748288194013, 0.711835234241873, 8993693872564e-17],
2464
+ [0, 0, 0.8251046025104602]
2465
+ ];
2466
+ const fromXYZ_M = [
2467
+ [1.3457868816471583, -0.25557208737979464, -0.05110186497554526],
2468
+ [-0.5446307051249019, 1.5082477428451468, 0.02052744743642139],
2469
+ [0, 0, 1.2119675456389452]
2470
+ ];
2471
+ const ProPhotoLinear = new RGBColorSpace({
2472
+ id: "prophoto-linear",
2473
+ cssId: "--prophoto-rgb-linear",
2474
+ name: "Linear ProPhoto",
2475
+ white: "D50",
2476
+ base: XYZ_D50,
2477
+ toXYZ_M,
2478
+ fromXYZ_M
2479
+ });
2480
+ const Et = 1 / 512;
2481
+ const Et2 = 16 / 512;
2482
+ const prophoto = new RGBColorSpace({
2483
+ id: "prophoto",
2484
+ cssId: "prophoto-rgb",
2485
+ name: "ProPhoto",
2486
+ base: ProPhotoLinear,
2487
+ toBase(RGB) {
2488
+ return RGB.map((v2) => {
2489
+ let sign = v2 < 0 ? -1 : 1;
2490
+ let abs = v2 * sign;
2491
+ if (abs < Et2) {
2492
+ return v2 / 16;
2493
+ }
2494
+ return sign * abs ** 1.8;
2495
+ });
2496
+ },
2497
+ fromBase(RGB) {
2498
+ return RGB.map((v2) => {
2499
+ let sign = v2 < 0 ? -1 : 1;
2500
+ let abs = v2 * sign;
2501
+ if (abs >= Et) {
2502
+ return sign * abs ** (1 / 1.8);
2503
+ }
2504
+ return 16 * v2;
2505
+ });
2506
+ }
2507
+ });
2508
+ const oklch = new ColorSpace({
2509
+ id: "oklch",
2510
+ name: "OkLCh",
2511
+ coords: {
2512
+ l: {
2513
+ refRange: [0, 1],
2514
+ name: "Lightness"
2515
+ },
2516
+ c: {
2517
+ refRange: [0, 0.4],
2518
+ name: "Chroma"
2519
+ },
2520
+ h: {
2521
+ refRange: [0, 360],
2522
+ type: "angle",
2523
+ name: "Hue"
2524
+ }
2525
+ },
2526
+ white: "D65",
2527
+ base: Oklab,
2528
+ fromBase: lch.fromBase,
2529
+ toBase: lch.toBase,
2530
+ formats: {
2531
+ oklch: {
2532
+ coords: ["<percentage> | <number>", "<number> | <percentage>", "<number> | <angle>"]
2533
+ }
2534
+ }
2535
+ });
741
2536
  var prefixStyles = (styleMap) => {
742
2537
  const newStyleMap = /* @__PURE__ */ new Map();
743
2538
  for (const [property, value] of styleMap) {
@@ -822,8 +2617,14 @@ var toValue = (styleValue, transformValue) => {
822
2617
  }
823
2618
  if (value.type === "color") {
824
2619
  let [c1, c2, c3] = value.components;
825
- const alpha = value.alpha;
2620
+ const alpha = typeof value.alpha === "number" ? value.alpha : toValue(value.alpha);
826
2621
  switch (value.colorSpace) {
2622
+ case "hex": {
2623
+ const toHex = (v2) => Math.round(Math.min(Math.max(v2, 0), 1) * 255).toString(16).padStart(2, "0");
2624
+ const hex = `#${toHex(c1)}${toHex(c2)}${toHex(c3)}`;
2625
+ const alphaNum = typeof alpha === "number" ? alpha : 1;
2626
+ return alphaNum < 1 ? hex + toHex(alphaNum) : hex;
2627
+ }
827
2628
  case "srgb": {
828
2629
  c1 = Math.round(c1 * 255);
829
2630
  c2 = Math.round(c2 * 255);
@@ -842,11 +2643,15 @@ var toValue = (styleValue, transformValue) => {
842
2643
  return `oklab(${c1} ${c2} ${c3} / ${alpha})`;
843
2644
  case "oklch":
844
2645
  return `oklch(${c1} ${c2} ${c3} / ${alpha})`;
845
- // Fall back to color() function for less common color spaces
2646
+ // Fall back to color() function for less common color spaces.
2647
+ // colorjs uses internal short names that differ from CSS predefined color space identifiers.
846
2648
  case "p3":
847
- case "srgb-linear":
2649
+ return `color(display-p3 ${c1} ${c2} ${c3} / ${alpha})`;
848
2650
  case "a98rgb":
2651
+ return `color(a98-rgb ${c1} ${c2} ${c3} / ${alpha})`;
849
2652
  case "prophoto":
2653
+ return `color(prophoto-rgb ${c1} ${c2} ${c3} / ${alpha})`;
2654
+ case "srgb-linear":
850
2655
  case "rec2020":
851
2656
  case "xyz-d65":
852
2657
  case "xyz-d50":
@@ -939,6 +2744,7 @@ var ColorValue = z.object({
939
2744
  type: z.literal("color"),
940
2745
  // all these color spaces are defined by design tokens specification
941
2746
  colorSpace: z.union([
2747
+ z.literal("hex"),
942
2748
  z.literal("srgb"),
943
2749
  z.literal("p3"),
944
2750
  z.literal("srgb-linear"),
@@ -955,7 +2761,7 @@ var ColorValue = z.object({
955
2761
  z.literal("xyz-d50")
956
2762
  ]),
957
2763
  components: z.tuple([z.number(), z.number(), z.number()]),
958
- alpha: z.number(),
2764
+ alpha: z.union([z.number(), z.lazy(() => VarValue)]),
959
2765
  hidden: z.boolean().optional()
960
2766
  });
961
2767
  var FunctionValue = z.object({
@@ -1087,12 +2893,12 @@ var isLonghandValue = (value) => {
1087
2893
  var mergeBorder = (styleMap, base) => {
1088
2894
  const width = styleMap.get(`${base}-width`);
1089
2895
  const style = styleMap.get(`${base}-style`);
1090
- const color = styleMap.get(`${base}-color`);
1091
- if (isLonghandValue(width) && isLonghandValue(style) && isLonghandValue(color)) {
2896
+ const color2 = styleMap.get(`${base}-color`);
2897
+ if (isLonghandValue(width) && isLonghandValue(style) && isLonghandValue(color2)) {
1092
2898
  styleMap.delete(`${base}-width`);
1093
2899
  styleMap.delete(`${base}-style`);
1094
2900
  styleMap.delete(`${base}-color`);
1095
- styleMap.set(base, { type: "tuple", value: [width, style, color] });
2901
+ styleMap.set(base, { type: "tuple", value: [width, style, color2] });
1096
2902
  }
1097
2903
  };
1098
2904
  var mergeBox = (styleMap, base) => {
@@ -1250,7 +3056,7 @@ var getDeclarationKey = (declaraionKey) => {
1250
3056
  const { breakpoint, selector, property } = declaraionKey;
1251
3057
  return `${breakpoint}:${selector}:${property}`;
1252
3058
  };
1253
- var MixinRule = (_a = class {
3059
+ var MixinRule = (_d = class {
1254
3060
  constructor() {
1255
3061
  // use map to avoid duplicated properties
1256
3062
  __privateAdd(this, _declarations, /* @__PURE__ */ new Map());
@@ -1281,8 +3087,8 @@ var MixinRule = (_a = class {
1281
3087
  getDeclarations() {
1282
3088
  return __privateGet(this, _declarations).values();
1283
3089
  }
1284
- }, _declarations = new WeakMap(), _dirtyBreakpoints = new WeakMap(), _a);
1285
- var NestingRule = (_b = class {
3090
+ }, _declarations = new WeakMap(), _dirtyBreakpoints = new WeakMap(), _d);
3091
+ var NestingRule = (_e = class {
1286
3092
  constructor(mixinRules, selector, descendantSuffix) {
1287
3093
  __privateAdd(this, _NestingRule_instances);
1288
3094
  __privateAdd(this, _selector);
@@ -1391,8 +3197,8 @@ ${spaces}}
1391
3197
  declarations.set(getDeclarationKey(declaration), declaration);
1392
3198
  }
1393
3199
  return declarations.values();
1394
- }, _b);
1395
- var MediaRule = (_c = class {
3200
+ }, _e);
3201
+ var MediaRule = (_f = class {
1396
3202
  constructor(name2, options = {}) {
1397
3203
  __privateAdd(this, _name);
1398
3204
  __publicField(this, "options");
@@ -1451,7 +3257,7 @@ var MediaRule = (_c = class {
1451
3257
  ${rules.join("\n")}
1452
3258
  }`;
1453
3259
  }
1454
- }, _name = new WeakMap(), _c);
3260
+ }, _name = new WeakMap(), _f);
1455
3261
  var PlaintextRule = class {
1456
3262
  constructor(cssText) {
1457
3263
  __publicField(this, "cssText");
@@ -1461,7 +3267,7 @@ var PlaintextRule = class {
1461
3267
  return this.cssText;
1462
3268
  }
1463
3269
  };
1464
- var FontFaceRule = (_d = class {
3270
+ var FontFaceRule = (_g = class {
1465
3271
  constructor(options) {
1466
3272
  __privateAdd(this, _cached);
1467
3273
  __privateAdd(this, _options);
@@ -1491,7 +3297,7 @@ var FontFaceRule = (_d = class {
1491
3297
  }`);
1492
3298
  return __privateGet(this, _cached);
1493
3299
  }
1494
- }, _cached = new WeakMap(), _options = new WeakMap(), _d);
3300
+ }, _cached = new WeakMap(), _options = new WeakMap(), _g);
1495
3301
  var isSimulatedCondition = (options) => options.mediaType !== void 0 && options.condition === void 0 && options.minWidth === void 0 && options.maxWidth === void 0;
1496
3302
  var isCondition = (options) => options.condition !== void 0 || isSimulatedCondition(options);
1497
3303
  var compareMedia = (optionA, optionB) => {
@@ -1526,7 +3332,7 @@ var compareMedia = (optionA, optionB) => {
1526
3332
  }
1527
3333
  return "minWidth" in optionA ? 1 : -1;
1528
3334
  };
1529
- var StyleElement = (_e = class {
3335
+ var StyleElement = (_h = class {
1530
3336
  constructor(name2 = "") {
1531
3337
  __privateAdd(this, _element);
1532
3338
  __privateAdd(this, _name2);
@@ -1565,8 +3371,8 @@ var StyleElement = (_e = class {
1565
3371
  return __privateGet(this, _element).getAttribute(name2);
1566
3372
  }
1567
3373
  }
1568
- }, _element = new WeakMap(), _name2 = new WeakMap(), _e);
1569
- var StyleSheet = (_f = class {
3374
+ }, _element = new WeakMap(), _name2 = new WeakMap(), _h);
3375
+ var StyleSheet = (_i = class {
1570
3376
  constructor(element) {
1571
3377
  __privateAdd(this, _cssText, "");
1572
3378
  __privateAdd(this, _mediaRules, /* @__PURE__ */ new Map());
@@ -1676,7 +3482,7 @@ var StyleSheet = (_f = class {
1676
3482
  getAttribute(name2) {
1677
3483
  return __privateGet(this, _element2).getAttribute(name2);
1678
3484
  }
1679
- }, _cssText = new WeakMap(), _mediaRules = new WeakMap(), _plainRules = new WeakMap(), _mixinRules2 = new WeakMap(), _fontFaceRules = new WeakMap(), _transformValue = new WeakMap(), _element2 = new WeakMap(), _f);
3485
+ }, _cssText = new WeakMap(), _mediaRules = new WeakMap(), _plainRules = new WeakMap(), _mixinRules2 = new WeakMap(), _fontFaceRules = new WeakMap(), _transformValue = new WeakMap(), _element2 = new WeakMap(), _i);
1680
3486
  var StyleSheetRegular = class extends StyleSheet {
1681
3487
  };
1682
3488
  var createRegularStyleSheet = (options) => {
@@ -1723,6 +3529,23 @@ var generateAtomic = (sheet, options) => {
1723
3529
  });
1724
3530
  return { cssText, classes };
1725
3531
  };
3532
+ ColorSpace.register(sRGB);
3533
+ ColorSpace.register(sRGBLinear);
3534
+ ColorSpace.register(hsl);
3535
+ ColorSpace.register(hwb);
3536
+ ColorSpace.register(lab);
3537
+ ColorSpace.register(lch);
3538
+ ColorSpace.register(Oklab);
3539
+ ColorSpace.register(oklch);
3540
+ ColorSpace.register(P3);
3541
+ ColorSpace.register(a98rgb);
3542
+ ColorSpace.register(prophoto);
3543
+ ColorSpace.register(REC2020);
3544
+ ColorSpace.register(xyz_d65);
3545
+ ColorSpace.register(XYZ_D50);
3546
+ ColorSpace.registry["display-p3"] = P3;
3547
+ ColorSpace.registry["a98-rgb"] = a98rgb;
3548
+ ColorSpace.registry["prophoto-rgb"] = prophoto;
1726
3549
  var AccordionIcon = `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 16 16" width="100%" height="100%" style="display: block;"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M13.056 8H14.5V4.101a1.3 1.3 0 0 0-1.3-1.299H2.8a1.3 1.3 0 0 0-1.3 1.3V8H13.056ZM13.056 13.198h.145a1.3 1.3 0 0 0 1.299-1.3V8h-13v3.899a1.3 1.3 0 0 0 1.3 1.299h10.256Z"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="m10.026 4.913.975.976.976-.976M10.026 10.111l.975.976.976-.976"/></svg>`;
1727
3550
  var AddTemplateInstanceIcon = `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 16 16" width="100%" height="100%" style="display: block;"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.5 2H3.333A1.333 1.333 0 0 0 2 3.333V4.5M14 12.667c0 .021 0 .042-.002.063M11.5 14h1.167a1.333 1.333 0 0 0 1.331-1.27m0 0V11.5M2 11.5v1.167A1.333 1.333 0 0 0 3.333 14H4.5M7 14h2M2 7v2M8.461 4.77H14M11.23 2v5.538"/></svg>`;
1728
3551
  var AnimationGroupIcon = `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 16 16" width="100%" height="100%" style="display: block;"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M4.5 8.3C6.3 7.7 7.8 8 9.3 11c.3-1.8 1.2-4.5 2.1-6M4.208 1.5H2.944A1.444 1.444 0 0 0 1.5 2.944v1.264m13 0V2.944A1.444 1.444 0 0 0 13.056 1.5h-1.264M14.5 13.056c0 .023 0 .046-.002.069M11.792 14.5h1.264a1.444 1.444 0 0 0 1.442-1.375m0 0v-1.333m-12.998 0v1.264A1.444 1.444 0 0 0 2.944 14.5h1.264m2.709-13h2.166m-2.166 13h2.166M1.5 6.917v2.166m13-2.166v2.166"/></svg>`;
@@ -2339,12 +4162,11 @@ var Breakpoint = z.object({
2339
4162
  if (condition !== void 0) {
2340
4163
  return minWidth === void 0 && maxWidth === void 0;
2341
4164
  }
2342
- return (
2343
- // Either min or max width have to be defined
2344
- minWidth !== void 0 && maxWidth === void 0 || minWidth === void 0 && maxWidth !== void 0 || // This is a base breakpoint
2345
- minWidth === void 0 && maxWidth === void 0
2346
- );
2347
- }, "Either minWidth, maxWidth, or condition should be defined, but not both");
4165
+ if (minWidth !== void 0 && maxWidth !== void 0) {
4166
+ return minWidth < maxWidth;
4167
+ }
4168
+ return true;
4169
+ }, "Width-based (minWidth/maxWidth) and condition are mutually exclusive, and minWidth must be less than maxWidth");
2348
4170
  z.map(BreakpointId, Breakpoint);
2349
4171
  var StyleSourceId = z.string();
2350
4172
  var StyleSourceToken = z.object({
@@ -2427,7 +4249,7 @@ var Tag = z.object({
2427
4249
  defaultValue: z.undefined().optional(),
2428
4250
  options: z.array(z.string())
2429
4251
  });
2430
- var Number = z.object({
4252
+ var Number$1 = z.object({
2431
4253
  ...common,
2432
4254
  control: z.literal("number"),
2433
4255
  type: z.literal("number"),
@@ -2571,7 +4393,7 @@ var AnimationAction = z.object({
2571
4393
  });
2572
4394
  var PropMeta = z.union([
2573
4395
  Tag,
2574
- Number,
4396
+ Number$1,
2575
4397
  Range,
2576
4398
  Text,
2577
4399
  Resource2,
@@ -2900,6 +4722,11 @@ var span$1 = div$1;
2900
4722
  var html = [
2901
4723
  { property: "display", value: { type: "keyword", value: "grid" } },
2902
4724
  { property: "min-height", value: { type: "unit", unit: "%", value: 100 } },
4725
+ { property: "grid-template-rows", value: { type: "keyword", value: "auto" } },
4726
+ {
4727
+ property: "grid-template-columns",
4728
+ value: { type: "unit", unit: "fr", value: 1 }
4729
+ },
2903
4730
  {
2904
4731
  property: "font-family",
2905
4732
  value: { type: "fontFamily", value: ["Arial", "Roboto", "sans-serif"] }
@@ -3334,7 +5161,7 @@ var tags = [
3334
5161
  ];
3335
5162
  var rootComponent = "ws:root";
3336
5163
  var rootMeta = {
3337
- label: "Global Root",
5164
+ label: "Global root",
3338
5165
  icon: SettingsIcon,
3339
5166
  presetStyle: {
3340
5167
  html
@@ -3447,15 +5274,15 @@ var coreMetas = {
3447
5274
  var isCoreComponent = (component) => component === rootComponent || component === elementComponent || component === collectionComponent || component === descendantComponent || component === blockComponent || component === blockTemplateComponent;
3448
5275
  var ROOT_INSTANCE_ID = ":root";
3449
5276
  var traverseInstances = (instances, instanceId, callback) => {
3450
- const instance = instances.get(instanceId);
3451
- if (instance === void 0) {
5277
+ const instance2 = instances.get(instanceId);
5278
+ if (instance2 === void 0) {
3452
5279
  return;
3453
5280
  }
3454
- const skipTraversingChildren = callback(instance);
5281
+ const skipTraversingChildren = callback(instance2);
3455
5282
  if (skipTraversingChildren === false) {
3456
5283
  return;
3457
5284
  }
3458
- for (const child of instance.children) {
5285
+ for (const child of instance2.children) {
3459
5286
  if (child.type === "id") {
3460
5287
  traverseInstances(instances, child.value, callback);
3461
5288
  }
@@ -3463,8 +5290,8 @@ var traverseInstances = (instances, instanceId, callback) => {
3463
5290
  };
3464
5291
  var findTreeInstanceIds = (instances, rootInstanceId) => {
3465
5292
  const ids = /* @__PURE__ */ new Set([rootInstanceId]);
3466
- traverseInstances(instances, rootInstanceId, (instance) => {
3467
- ids.add(instance.id);
5293
+ traverseInstances(instances, rootInstanceId, (instance2) => {
5294
+ ids.add(instance2.id);
3468
5295
  });
3469
5296
  return ids;
3470
5297
  };
@@ -3488,16 +5315,16 @@ var getIndexesWithinAncestors = (metas, instances, rootIds) => {
3488
5315
  }
3489
5316
  const indexes = /* @__PURE__ */ new Map();
3490
5317
  const traverseInstances2 = (instances2, instanceId, latestIndexes2 = /* @__PURE__ */ new Map()) => {
3491
- const instance = instances2.get(instanceId);
3492
- if (instance === void 0) {
5318
+ const instance2 = instances2.get(instanceId);
5319
+ if (instance2 === void 0) {
3493
5320
  return;
3494
5321
  }
3495
- const meta = metas.get(instance.component);
3496
- if (ancestors.has(instance.component)) {
5322
+ const meta = metas.get(instance2.component);
5323
+ if (ancestors.has(instance2.component)) {
3497
5324
  latestIndexes2 = new Map(latestIndexes2);
3498
- latestIndexes2.set(instance.component, /* @__PURE__ */ new Map());
5325
+ latestIndexes2.set(instance2.component, /* @__PURE__ */ new Map());
3499
5326
  }
3500
- if (instance.component === blockTemplateComponent) {
5327
+ if (instance2.component === blockTemplateComponent) {
3501
5328
  latestIndexes2 = new Map(latestIndexes2);
3502
5329
  for (const key of latestIndexes2.keys()) {
3503
5330
  latestIndexes2.set(key, /* @__PURE__ */ new Map());
@@ -3506,13 +5333,13 @@ var getIndexesWithinAncestors = (metas, instances, rootIds) => {
3506
5333
  if ((meta == null ? void 0 : meta.indexWithinAncestor) !== void 0) {
3507
5334
  const ancestorIndexes = latestIndexes2.get(meta.indexWithinAncestor);
3508
5335
  if (ancestorIndexes) {
3509
- let index = ancestorIndexes.get(instance.component) ?? -1;
5336
+ let index = ancestorIndexes.get(instance2.component) ?? -1;
3510
5337
  index += 1;
3511
- ancestorIndexes.set(instance.component, index);
3512
- indexes.set(instance.id, index);
5338
+ ancestorIndexes.set(instance2.component, index);
5339
+ indexes.set(instance2.id, index);
3513
5340
  }
3514
5341
  }
3515
- for (const child of instance.children) {
5342
+ for (const child of instance2.children) {
3516
5343
  if (child.type === "id") {
3517
5344
  traverseInstances2(instances2, child.value, latestIndexes2);
3518
5345
  }
@@ -4104,16 +5931,16 @@ var generateCss = ({
4104
5931
  tagByInstanceId.set(prop.instanceId, prop.value);
4105
5932
  }
4106
5933
  }
4107
- for (const instance of instances.values()) {
4108
- const propTag = tagByInstanceId.get(instance.id);
4109
- const meta = componentMetas.get(instance.component);
5934
+ for (const instance2 of instances.values()) {
5935
+ const propTag = tagByInstanceId.get(instance2.id);
5936
+ const meta = componentMetas.get(instance2.component);
4110
5937
  const metaTag = Object.keys((meta == null ? void 0 : meta.presetStyle) ?? {}).at(0);
4111
- let componentTags = tagsByComponent.get(instance.component);
5938
+ let componentTags = tagsByComponent.get(instance2.component);
4112
5939
  if (componentTags === void 0) {
4113
5940
  componentTags = /* @__PURE__ */ new Set();
4114
- tagsByComponent.set(instance.component, componentTags);
5941
+ tagsByComponent.set(instance2.component, componentTags);
4115
5942
  }
4116
- const tag = instance.tag ?? propTag ?? metaTag;
5943
+ const tag = instance2.tag ?? propTag ?? metaTag;
4117
5944
  if (tag) {
4118
5945
  componentTags.add(tag);
4119
5946
  }
@@ -4160,14 +5987,14 @@ var generateCss = ({
4160
5987
  }
4161
5988
  const classes = /* @__PURE__ */ new Map();
4162
5989
  const parentIdByInstanceId = /* @__PURE__ */ new Map();
4163
- for (const instance of instances.values()) {
4164
- const presetClass = presetClasses.get(instance.component);
5990
+ for (const instance2 of instances.values()) {
5991
+ const presetClass = presetClasses.get(instance2.component);
4165
5992
  if (presetClass) {
4166
- classes.set(instance.id, [presetClass]);
5993
+ classes.set(instance2.id, [presetClass]);
4167
5994
  }
4168
- for (const child of instance.children) {
5995
+ for (const child of instance2.children) {
4169
5996
  if (child.type === "id") {
4170
- parentIdByInstanceId.set(child.value, instance.id);
5997
+ parentIdByInstanceId.set(child.value, instance2.id);
4171
5998
  }
4172
5999
  }
4173
6000
  }
@@ -4187,11 +6014,11 @@ var generateCss = ({
4187
6014
  continue;
4188
6015
  }
4189
6016
  let descendantSuffix = "";
4190
- const instance = instances.get(instanceId);
4191
- if (instance === void 0) {
6017
+ const instance2 = instances.get(instanceId);
6018
+ if (instance2 === void 0) {
4192
6019
  continue;
4193
6020
  }
4194
- if (instance.component === descendantComponent) {
6021
+ if (instance2.component === descendantComponent) {
4195
6022
  const parentId = parentIdByInstanceId.get(instanceId);
4196
6023
  const descendantSelector = descendantSelectorByInstanceId.get(instanceId);
4197
6024
  if (parentId && descendantSelector) {
@@ -4199,9 +6026,9 @@ var generateCss = ({
4199
6026
  instanceId = parentId;
4200
6027
  }
4201
6028
  }
4202
- const meta = componentMetas.get(instance.component);
4203
- const [_namespace, shortName] = parseComponentName(instance.component);
4204
- const baseName = instance.label ?? (meta == null ? void 0 : meta.label) ?? shortName;
6029
+ const meta = componentMetas.get(instance2.component);
6030
+ const [_namespace, shortName] = parseComponentName(instance2.component);
6031
+ const baseName = instance2.label ?? (meta == null ? void 0 : meta.label) ?? shortName;
4205
6032
  const className = `w-${scope.getName(instanceId, baseName)}`;
4206
6033
  if (atomic === false) {
4207
6034
  let classList = classes.get(instanceId);
@@ -4620,7 +6447,7 @@ var generateJsxElement = ({
4620
6447
  scope,
4621
6448
  metas,
4622
6449
  tagsOverrides,
4623
- instance,
6450
+ instance: instance2,
4624
6451
  props,
4625
6452
  dataSources,
4626
6453
  usedDataSources,
@@ -4629,20 +6456,20 @@ var generateJsxElement = ({
4629
6456
  classesMap
4630
6457
  }) => {
4631
6458
  var _a2;
4632
- if (instance.component === descendantComponent) {
6459
+ if (instance2.component === descendantComponent) {
4633
6460
  return "";
4634
6461
  }
4635
- const meta = metas.get(instance.component);
6462
+ const meta = metas.get(instance2.component);
4636
6463
  const hasTags = Object.keys((meta == null ? void 0 : meta.presetStyle) ?? {}).length > 0;
4637
6464
  let generatedProps = "";
4638
- const index = indexesWithinAncestors.get(instance.id);
6465
+ const index = indexesWithinAncestors.get(instance2.id);
4639
6466
  if (index !== void 0) {
4640
6467
  generatedProps += `
4641
6468
  ${indexProperty}="${index}"`;
4642
6469
  }
4643
- if (instance.tag !== void 0 && instance.component !== elementComponent) {
6470
+ if (instance2.tag !== void 0 && instance2.component !== elementComponent) {
4644
6471
  generatedProps += `
4645
- ${tagProperty}=${JSON.stringify(instance.tag)}`;
6472
+ ${tagProperty}=${JSON.stringify(instance2.tag)}`;
4646
6473
  }
4647
6474
  let conditionValue;
4648
6475
  let collectionDataValue;
@@ -4650,7 +6477,7 @@ ${tagProperty}=${JSON.stringify(instance.tag)}`;
4650
6477
  let collectionItemKeyValue;
4651
6478
  let classNameValue;
4652
6479
  for (const prop of props.values()) {
4653
- if (prop.instanceId !== instance.id) {
6480
+ if (prop.instanceId !== instance2.id) {
4654
6481
  continue;
4655
6482
  }
4656
6483
  const propValue = generatePropValue({
@@ -4676,7 +6503,7 @@ ${tagProperty}=${JSON.stringify(instance.tag)}`;
4676
6503
  conditionValue = propValue;
4677
6504
  continue;
4678
6505
  }
4679
- if (instance.component === collectionComponent) {
6506
+ if (instance2.component === collectionComponent) {
4680
6507
  if (prop.name === "data") {
4681
6508
  collectionDataValue = propValue;
4682
6509
  }
@@ -4697,7 +6524,7 @@ ${tagProperty}=${JSON.stringify(instance.tag)}`;
4697
6524
  ${name2}={${propValue}}`;
4698
6525
  }
4699
6526
  }
4700
- const classMapArray = classesMap == null ? void 0 : classesMap.get(instance.id);
6527
+ const classMapArray = classesMap == null ? void 0 : classesMap.get(instance2.id);
4701
6528
  if (classMapArray || classNameValue) {
4702
6529
  let classNameTemplate = classMapArray ? classMapArray.join(" ") : "";
4703
6530
  if (classNameValue) {
@@ -4709,14 +6536,14 @@ ${name2}={${propValue}}`;
4709
6536
  generatedProps += "\nclassName={`" + classNameTemplate + "`}";
4710
6537
  }
4711
6538
  let generatedElement = "";
4712
- if (instance.component === blockTemplateComponent) {
6539
+ if (instance2.component === blockTemplateComponent) {
4713
6540
  return "";
4714
6541
  }
4715
- if (instance.component === collectionComponent) {
6542
+ if (instance2.component === collectionComponent) {
4716
6543
  if (collectionDataValue === void 0 || collectionItemValue === void 0) {
4717
6544
  return "";
4718
6545
  }
4719
- const indexVariable = scope.getName(`${instance.id}-index`, "index");
6546
+ const indexVariable = scope.getName(`${instance2.id}-index`, "index");
4720
6547
  const keyVariable = collectionItemKeyValue ?? indexVariable;
4721
6548
  generatedElement += `{${generateCollectionIterationCode({
4722
6549
  dataExpression: collectionDataValue,
@@ -4735,22 +6562,22 @@ ${name2}={${propValue}}`;
4735
6562
  `;
4736
6563
  generatedElement += `}
4737
6564
  `;
4738
- } else if (instance.component === blockComponent) {
6565
+ } else if (instance2.component === blockComponent) {
4739
6566
  generatedElement += children;
4740
6567
  } else {
4741
6568
  let componentVariable;
4742
- if (instance.component === elementComponent) {
4743
- componentVariable = instance.tag ?? "div";
6569
+ if (instance2.component === elementComponent) {
6570
+ componentVariable = instance2.tag ?? "div";
4744
6571
  const componentDescriptor = tagsOverrides == null ? void 0 : tagsOverrides[componentVariable];
4745
6572
  if (componentDescriptor !== void 0) {
4746
6573
  const [_importSource, importSpecifier] = componentDescriptor.split(":");
4747
6574
  componentVariable = scope.getName(componentDescriptor, importSpecifier);
4748
6575
  }
4749
6576
  } else {
4750
- const [_namespace, shortName] = parseComponentName(instance.component);
4751
- componentVariable = scope.getName(instance.component, shortName);
6577
+ const [_namespace, shortName] = parseComponentName(instance2.component);
6578
+ componentVariable = scope.getName(instance2.component, shortName);
4752
6579
  }
4753
- if (instance.children.length === 0) {
6580
+ if (instance2.children.length === 0) {
4754
6581
  generatedElement += `<${componentVariable}${generatedProps} />
4755
6582
  `;
4756
6583
  } else {
@@ -4771,7 +6598,7 @@ ${name2}={${propValue}}`;
4771
6598
  }
4772
6599
  conditionalElement += `${before}(${conditionValue}) &&
4773
6600
  `;
4774
- if (instance.component === collectionComponent) {
6601
+ if (instance2.component === collectionComponent) {
4775
6602
  conditionalElement += "<>\n";
4776
6603
  conditionalElement += generatedElement;
4777
6604
  conditionalElement += "</>\n";
@@ -4821,8 +6648,8 @@ var generateJsxChildren = ({
4821
6648
  }
4822
6649
  if (child.type === "id") {
4823
6650
  const instanceId = child.value;
4824
- const instance = instances.get(instanceId);
4825
- if (instance === void 0) {
6651
+ const instance2 = instances.get(instanceId);
6652
+ if (instance2 === void 0) {
4826
6653
  continue;
4827
6654
  }
4828
6655
  generatedChildren += generateJsxElement({
@@ -4830,7 +6657,7 @@ var generateJsxChildren = ({
4830
6657
  scope,
4831
6658
  metas,
4832
6659
  tagsOverrides,
4833
- instance,
6660
+ instance: instance2,
4834
6661
  props,
4835
6662
  dataSources,
4836
6663
  usedDataSources,
@@ -4841,7 +6668,7 @@ var generateJsxChildren = ({
4841
6668
  scope,
4842
6669
  metas,
4843
6670
  tagsOverrides,
4844
- children: instance.children,
6671
+ children: instance2.children,
4845
6672
  instances,
4846
6673
  props,
4847
6674
  dataSources,
@@ -4867,19 +6694,19 @@ var generateWebstudioComponent = ({
4867
6694
  tagsOverrides,
4868
6695
  classesMap
4869
6696
  }) => {
4870
- const instance = instances.get(rootInstanceId);
6697
+ const instance2 = instances.get(rootInstanceId);
4871
6698
  const indexesWithinAncestors = getIndexesWithinAncestors(metas, instances, [
4872
6699
  rootInstanceId
4873
6700
  ]);
4874
6701
  const usedDataSources = /* @__PURE__ */ new Map();
4875
6702
  let generatedJsx = "<></>\n";
4876
- if (instance) {
6703
+ if (instance2) {
4877
6704
  generatedJsx = generateJsxElement({
4878
6705
  context: "expression",
4879
6706
  scope,
4880
6707
  metas,
4881
6708
  tagsOverrides,
4882
- instance,
6709
+ instance: instance2,
4883
6710
  props,
4884
6711
  dataSources,
4885
6712
  usedDataSources,
@@ -4889,7 +6716,7 @@ var generateWebstudioComponent = ({
4889
6716
  scope,
4890
6717
  metas,
4891
6718
  tagsOverrides,
4892
- children: instance.children,
6719
+ children: instance2.children,
4893
6720
  instances,
4894
6721
  props,
4895
6722
  dataSources,
@@ -8459,7 +10286,7 @@ audit=false
8459
10286
  fund=false
8460
10287
  `;
8461
10288
  const prebuild = async (options) => {
8462
- var _a2, _b2, _c2, _d2, _e2, _f2, _g, _h, _i, _j, _k;
10289
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j, _k;
8463
10290
  if (options.template.length === 0) {
8464
10291
  log.error(
8465
10292
  `Template is not provided
@@ -8527,12 +10354,12 @@ Please check webstudio --help for more details`
8527
10354
  );
8528
10355
  pageInstanceSet.add(ROOT_INSTANCE_ID);
8529
10356
  const instances = [];
8530
- for (const [_instanceId, instance] of siteData.build.instances) {
8531
- if (pageInstanceSet.has(instance.id)) {
8532
- instances.push([instance.id, instance]);
8533
- const meta = framework.metas[instance.component];
10357
+ for (const [_instanceId, instance2] of siteData.build.instances) {
10358
+ if (pageInstanceSet.has(instance2.id)) {
10359
+ instances.push([instance2.id, instance2]);
10360
+ const meta = framework.metas[instance2.component];
8534
10361
  if (meta) {
8535
- usedMetas.set(instance.component, meta);
10362
+ usedMetas.set(instance2.component, meta);
8536
10363
  }
8537
10364
  }
8538
10365
  }
@@ -8625,7 +10452,7 @@ Please check webstudio --help for more details`
8625
10452
  // pass only used metas to not generate unused preset styles
8626
10453
  componentMetas: usedMetas,
8627
10454
  assetBaseUrl,
8628
- atomic: ((_g = siteData.build.pages.compiler) == null ? void 0 : _g.atomicStyles) ?? true
10455
+ atomic: ((_g2 = siteData.build.pages.compiler) == null ? void 0 : _g2.atomicStyles) ?? true
8629
10456
  });
8630
10457
  await createFileIfNotExists(join(generatedDir, "index.css"), cssText);
8631
10458
  for (const page of Object.values(siteData.pages)) {
@@ -8648,22 +10475,22 @@ Please check webstudio --help for more details`
8648
10475
  if ((firstChild == null ? void 0 : firstChild.type) === "id") {
8649
10476
  rootInstanceId = firstChild.value;
8650
10477
  }
8651
- for (const instance of instances.values()) {
8652
- if (isCoreComponent(instance.component)) {
10478
+ for (const instance2 of instances.values()) {
10479
+ if (isCoreComponent(instance2.component)) {
8653
10480
  continue;
8654
10481
  }
8655
- if (((_h = usedMetas.get(instance.component)) == null ? void 0 : _h.category) === "xml") {
10482
+ if (((_h2 = usedMetas.get(instance2.component)) == null ? void 0 : _h2.category) === "xml") {
8656
10483
  continue;
8657
10484
  }
8658
- instances.delete(instance.id);
10485
+ instances.delete(instance2.id);
8659
10486
  }
8660
10487
  }
8661
10488
  const imports2 = /* @__PURE__ */ new Map();
8662
- for (const instance of instances.values()) {
8663
- let descriptor = framework.components[instance.component];
8664
- let id = instance.component;
8665
- if (instance.component === elementComponent && instance.tag) {
8666
- descriptor = framework.tags[instance.tag];
10489
+ for (const instance2 of instances.values()) {
10490
+ let descriptor = framework.components[instance2.component];
10491
+ let id = instance2.component;
10492
+ if (instance2.component === elementComponent && instance2.tag) {
10493
+ descriptor = framework.tags[instance2.tag];
8667
10494
  id = descriptor;
8668
10495
  }
8669
10496
  if (descriptor === void 0) {
@@ -8725,7 +10552,7 @@ Please check webstudio --help for more details`
8725
10552
  const projectMeta = siteData.build.pages.meta;
8726
10553
  const contactEmail = (
8727
10554
  // fallback to user email when contact email is empty string
8728
- (projectMeta == null ? void 0 : projectMeta.contactEmail) || ((_i = siteData.user) == null ? void 0 : _i.email) || void 0
10555
+ (projectMeta == null ? void 0 : projectMeta.contactEmail) || ((_i2 = siteData.user) == null ? void 0 : _i2.email) || void 0
8729
10556
  );
8730
10557
  const favIconAsset = (_j = assets.get((projectMeta == null ? void 0 : projectMeta.faviconAssetId) ?? "")) == null ? void 0 : _j.name;
8731
10558
  const pagePath = getPagePath(page.id, siteData.build.pages);
@@ -9041,7 +10868,7 @@ const getDeploymentInstructions = (deployTarget) => {
9041
10868
  }
9042
10869
  };
9043
10870
  const name = "webstudio";
9044
- const version = "0.255.0";
10871
+ const version = "0.258.0";
9045
10872
  const description = "Webstudio CLI";
9046
10873
  const author = "Webstudio <github@webstudio.is>";
9047
10874
  const homepage = "https://webstudio.is";