@terrazzo/plugin-tailwind 0.2.0 → 0.3.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/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # @terrazzo/plugin-tailwind
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#507](https://github.com/terrazzoapp/terrazzo/pull/507) [`0060100`](https://github.com/terrazzoapp/terrazzo/commit/00601002a731dc009fb4ef2b438a01b087325a1a) Thanks [@drwpow](https://github.com/drwpow)! - ⚠️ Breaking change: remove HSV as a supported colorSpace, because it’s absent from CSS Color Module 4
8
+
9
+ - [#507](https://github.com/terrazzoapp/terrazzo/pull/507) [`0060100`](https://github.com/terrazzoapp/terrazzo/commit/00601002a731dc009fb4ef2b438a01b087325a1a) Thanks [@drwpow](https://github.com/drwpow)! - ⚠️ Breaking change: align color token ranges to CSS Color Module 4. This results in breaking changes to HSL and HWB, which normalize to `0 - 100`, rather than `0 - 1`:
10
+
11
+ ```diff
12
+ {
13
+ "colorSpace": "hsl",
14
+ - "components": [270, 0.5, 0.4]
15
+ + "components": [270, 50, 40]
16
+ }
17
+ ```
18
+
19
+ All other color spaces should be unaffected, as they were already matching CSS Color Module 4.
20
+
21
+ ### Patch Changes
22
+
23
+ - [#507](https://github.com/terrazzoapp/terrazzo/pull/507) [`0060100`](https://github.com/terrazzoapp/terrazzo/commit/00601002a731dc009fb4ef2b438a01b087325a1a) Thanks [@drwpow](https://github.com/drwpow)! - Fix a98-rgb colorSpace, accidentally referring to it as "a98"
24
+
25
+ - Updated dependencies [[`0060100`](https://github.com/terrazzoapp/terrazzo/commit/00601002a731dc009fb4ef2b438a01b087325a1a), [`0060100`](https://github.com/terrazzoapp/terrazzo/commit/00601002a731dc009fb4ef2b438a01b087325a1a), [`0060100`](https://github.com/terrazzoapp/terrazzo/commit/00601002a731dc009fb4ef2b438a01b087325a1a)]:
26
+ - @terrazzo/token-tools@0.10.0
27
+ - @terrazzo/cli@0.10.0
28
+ - @terrazzo/plugin-css@0.10.0
29
+
30
+ ## 0.2.1
31
+
32
+ ### Patch Changes
33
+
34
+ - [#502](https://github.com/terrazzoapp/terrazzo/pull/502) [`c9792bd`](https://github.com/terrazzoapp/terrazzo/commit/c9792bdef27aa2edab3f9f74b37a794f0a14da59) Thanks [@drwpow](https://github.com/drwpow)! - Fix bug in parsing LAB colors
35
+
36
+ - [#502](https://github.com/terrazzoapp/terrazzo/pull/502) [`c9792bd`](https://github.com/terrazzoapp/terrazzo/commit/c9792bdef27aa2edab3f9f74b37a794f0a14da59) Thanks [@drwpow](https://github.com/drwpow)! - Add support for lab65 colors (not technically part of CSS Module 4 spec, but a nice convenience)
37
+
38
+ - Updated dependencies [[`c9792bd`](https://github.com/terrazzoapp/terrazzo/commit/c9792bdef27aa2edab3f9f74b37a794f0a14da59), [`c9792bd`](https://github.com/terrazzoapp/terrazzo/commit/c9792bdef27aa2edab3f9f74b37a794f0a14da59)]:
39
+ - @terrazzo/token-tools@0.9.1
40
+ - @terrazzo/cli@0.9.1
41
+ - @terrazzo/plugin-css@0.9.1
42
+
3
43
  ## 0.2.0
4
44
 
5
45
  ### Minor Changes
package/dist/index.js CHANGED
@@ -231,28 +231,28 @@ const modes = {};
231
231
  const parsers = [];
232
232
  const colorProfiles = {};
233
233
  const identity = (v) => v;
234
- const useMode = (definition$15) => {
235
- converters$1[definition$15.mode] = {
236
- ...converters$1[definition$15.mode],
237
- ...definition$15.toMode
234
+ const useMode = (definition$16) => {
235
+ converters$1[definition$16.mode] = {
236
+ ...converters$1[definition$16.mode],
237
+ ...definition$16.toMode
238
238
  };
239
- Object.keys(definition$15.fromMode || {}).forEach((k$2) => {
240
- if (!converters$1[k$2]) converters$1[k$2] = {};
241
- converters$1[k$2][definition$15.mode] = definition$15.fromMode[k$2];
239
+ Object.keys(definition$16.fromMode || {}).forEach((k$3) => {
240
+ if (!converters$1[k$3]) converters$1[k$3] = {};
241
+ converters$1[k$3][definition$16.mode] = definition$16.fromMode[k$3];
242
242
  });
243
- if (!definition$15.ranges) definition$15.ranges = {};
244
- if (!definition$15.difference) definition$15.difference = {};
245
- definition$15.channels.forEach((channel) => {
246
- if (definition$15.ranges[channel] === void 0) definition$15.ranges[channel] = [0, 1];
247
- if (!definition$15.interpolate[channel]) throw new Error(`Missing interpolator for: ${channel}`);
248
- if (typeof definition$15.interpolate[channel] === "function") definition$15.interpolate[channel] = { use: definition$15.interpolate[channel] };
249
- if (!definition$15.interpolate[channel].fixup) definition$15.interpolate[channel].fixup = identity;
243
+ if (!definition$16.ranges) definition$16.ranges = {};
244
+ if (!definition$16.difference) definition$16.difference = {};
245
+ definition$16.channels.forEach((channel) => {
246
+ if (definition$16.ranges[channel] === void 0) definition$16.ranges[channel] = [0, 1];
247
+ if (!definition$16.interpolate[channel]) throw new Error(`Missing interpolator for: ${channel}`);
248
+ if (typeof definition$16.interpolate[channel] === "function") definition$16.interpolate[channel] = { use: definition$16.interpolate[channel] };
249
+ if (!definition$16.interpolate[channel].fixup) definition$16.interpolate[channel].fixup = identity;
250
250
  });
251
- modes[definition$15.mode] = definition$15;
252
- (definition$15.parse || []).forEach((parser) => {
253
- useParser(parser, definition$15.mode);
251
+ modes[definition$16.mode] = definition$16;
252
+ (definition$16.parse || []).forEach((parser) => {
253
+ useParser(parser, definition$16.mode);
254
254
  });
255
- return converter_default(definition$15.mode);
255
+ return converter_default(definition$16.mode);
256
256
  };
257
257
  const getMode = (mode) => modes[mode];
258
258
  const useParser = (parser, mode) => {
@@ -567,7 +567,7 @@ const fixupAlpha = (arr) => {
567
567
  });
568
568
  return some_defined ? res : arr;
569
569
  };
570
- const definition$14 = {
570
+ const definition$15 = {
571
571
  mode: "rgb",
572
572
  channels: [
573
573
  "r",
@@ -605,7 +605,7 @@ const definition$14 = {
605
605
  b: 0
606
606
  }
607
607
  };
608
- var definition_default$12 = definition$14;
608
+ var definition_default$12 = definition$15;
609
609
  const linearize$2 = (v = 0) => Math.pow(Math.abs(v), 563 / 256) * Math.sign(v);
610
610
  const convertA98ToXyz65 = (a98) => {
611
611
  let r$1 = linearize$2(a98.r);
@@ -636,7 +636,7 @@ const convertXyz65ToA98 = ({ x, y, z, alpha }) => {
636
636
  return res;
637
637
  };
638
638
  var convertXyz65ToA98_default = convertXyz65ToA98;
639
- const fn$2 = (c$1 = 0) => {
639
+ const fn$3 = (c$1 = 0) => {
640
640
  const abs = Math.abs(c$1);
641
641
  if (abs <= .04045) return c$1 / 12.92;
642
642
  return (Math.sign(c$1) || 1) * Math.pow((abs + .055) / 1.055, 2.4);
@@ -644,9 +644,9 @@ const fn$2 = (c$1 = 0) => {
644
644
  const convertRgbToLrgb = ({ r: r$1, g, b, alpha }) => {
645
645
  let res = {
646
646
  mode: "lrgb",
647
- r: fn$2(r$1),
648
- g: fn$2(g),
649
- b: fn$2(b)
647
+ r: fn$3(r$1),
648
+ g: fn$3(g),
649
+ b: fn$3(b)
650
650
  };
651
651
  if (alpha !== void 0) res.alpha = alpha;
652
652
  return res;
@@ -664,7 +664,7 @@ const convertRgbToXyz65 = (rgb$2) => {
664
664
  return res;
665
665
  };
666
666
  var convertRgbToXyz65_default = convertRgbToXyz65;
667
- const fn$1 = (c$1 = 0) => {
667
+ const fn$2 = (c$1 = 0) => {
668
668
  const abs = Math.abs(c$1);
669
669
  if (abs > .0031308) return (Math.sign(c$1) || 1) * (1.055 * Math.pow(abs, 1 / 2.4) - .055);
670
670
  return c$1 * 12.92;
@@ -672,9 +672,9 @@ const fn$1 = (c$1 = 0) => {
672
672
  const convertLrgbToRgb = ({ r: r$1, g, b, alpha }, mode = "rgb") => {
673
673
  let res = {
674
674
  mode,
675
- r: fn$1(r$1),
676
- g: fn$1(g),
677
- b: fn$1(b)
675
+ r: fn$2(r$1),
676
+ g: fn$2(g),
677
+ b: fn$2(b)
678
678
  };
679
679
  if (alpha !== void 0) res.alpha = alpha;
680
680
  return res;
@@ -693,7 +693,7 @@ const convertXyz65ToRgb = ({ x, y, z, alpha }) => {
693
693
  return res;
694
694
  };
695
695
  var convertXyz65ToRgb_default = convertXyz65ToRgb;
696
- const definition$13 = {
696
+ const definition$14 = {
697
697
  ...definition_default$12,
698
698
  mode: "a98",
699
699
  parse: ["a98-rgb"],
@@ -707,7 +707,7 @@ const definition$13 = {
707
707
  xyz65: convertA98ToXyz65_default
708
708
  }
709
709
  };
710
- var definition_default = definition$13;
710
+ var definition_default = definition$14;
711
711
  const normalizeHue = (hue$2) => (hue$2 = hue$2 % 360) < 0 ? hue$2 + 360 : hue$2;
712
712
  var normalizeHue_default = normalizeHue;
713
713
  function convertHslToRgb({ h, s, l, alpha }) {
@@ -827,12 +827,12 @@ function parseHsl(color, parsed) {
827
827
  return res;
828
828
  }
829
829
  var parseHsl_default = parseHsl;
830
- const hue = (hues, fn$3) => {
830
+ const hue = (hues, fn$4) => {
831
831
  return hues.map((hue$2, idx, arr) => {
832
832
  if (hue$2 === void 0) return hue$2;
833
833
  let normalized = normalizeHue_default(hue$2);
834
834
  if (idx === 0 || hues[idx - 1] === void 0) return normalized;
835
- return fn$3(normalized - normalizeHue_default(arr[idx - 1]));
835
+ return fn$4(normalized - normalizeHue_default(arr[idx - 1]));
836
836
  }).reduce((acc, curr) => {
837
837
  if (!acc.length || curr === void 0 || acc[acc.length - 1] === void 0) {
838
838
  acc.push(curr);
@@ -879,7 +879,7 @@ const averageAngle = (val) => {
879
879
  let angle = Math.atan2(sum.sin, sum.cos) * 180 / Math.PI;
880
880
  return angle < 0 ? 360 + angle : angle;
881
881
  };
882
- const definition$12 = {
882
+ const definition$13 = {
883
883
  mode: "hsl",
884
884
  toMode: { rgb: convertHslToRgb },
885
885
  fromMode: { rgb: convertRgbToHsl },
@@ -908,24 +908,24 @@ const definition$12 = {
908
908
  difference: { h: differenceHueSaturation },
909
909
  average: { h: averageAngle }
910
910
  };
911
- var definition_default$1 = definition$12;
911
+ var definition_default$1 = definition$13;
912
912
  function convertHsvToRgb({ h, s, v, alpha }) {
913
913
  h = normalizeHue_default(h !== void 0 ? h : 0);
914
914
  if (s === void 0) s = 0;
915
915
  if (v === void 0) v = 0;
916
- let f$1 = Math.abs(h / 60 % 2 - 1);
916
+ let f$2 = Math.abs(h / 60 % 2 - 1);
917
917
  let res;
918
918
  switch (Math.floor(h / 60)) {
919
919
  case 0:
920
920
  res = {
921
921
  r: v,
922
- g: v * (1 - s * f$1),
922
+ g: v * (1 - s * f$2),
923
923
  b: v * (1 - s)
924
924
  };
925
925
  break;
926
926
  case 1:
927
927
  res = {
928
- r: v * (1 - s * f$1),
928
+ r: v * (1 - s * f$2),
929
929
  g: v,
930
930
  b: v * (1 - s)
931
931
  };
@@ -934,19 +934,19 @@ function convertHsvToRgb({ h, s, v, alpha }) {
934
934
  res = {
935
935
  r: v * (1 - s),
936
936
  g: v,
937
- b: v * (1 - s * f$1)
937
+ b: v * (1 - s * f$2)
938
938
  };
939
939
  break;
940
940
  case 3:
941
941
  res = {
942
942
  r: v * (1 - s),
943
- g: v * (1 - s * f$1),
943
+ g: v * (1 - s * f$2),
944
944
  b: v
945
945
  };
946
946
  break;
947
947
  case 4:
948
948
  res = {
949
- r: v * (1 - s * f$1),
949
+ r: v * (1 - s * f$2),
950
950
  g: v * (1 - s),
951
951
  b: v
952
952
  };
@@ -955,7 +955,7 @@ function convertHsvToRgb({ h, s, v, alpha }) {
955
955
  res = {
956
956
  r: v,
957
957
  g: v * (1 - s),
958
- b: v * (1 - s * f$1)
958
+ b: v * (1 - s * f$2)
959
959
  };
960
960
  break;
961
961
  default: res = {
@@ -982,7 +982,7 @@ function convertRgbToHsv({ r: r$1, g, b, alpha }) {
982
982
  if (alpha !== void 0) res.alpha = alpha;
983
983
  return res;
984
984
  }
985
- const definition$11 = {
985
+ const definition$12 = {
986
986
  mode: "hsv",
987
987
  toMode: { rgb: convertHsvToRgb },
988
988
  parse: ["--hsv"],
@@ -1011,7 +1011,7 @@ const definition$11 = {
1011
1011
  difference: { h: differenceHueSaturation },
1012
1012
  average: { h: averageAngle }
1013
1013
  };
1014
- var definition_default$2 = definition$11;
1014
+ var definition_default$15 = definition$12;
1015
1015
  function convertHwbToRgb({ h, w, b, alpha }) {
1016
1016
  if (w === void 0) w = 0;
1017
1017
  if (b === void 0) b = 0;
@@ -1061,7 +1061,7 @@ function ParseHwb(color, parsed) {
1061
1061
  return res;
1062
1062
  }
1063
1063
  var parseHwb_default = ParseHwb;
1064
- const definition$10 = {
1064
+ const definition$11 = {
1065
1065
  mode: "hwb",
1066
1066
  toMode: { rgb: convertHwbToRgb },
1067
1067
  fromMode: { rgb: convertRgbToHwb },
@@ -1090,9 +1090,9 @@ const definition$10 = {
1090
1090
  difference: { h: differenceHueNaive },
1091
1091
  average: { h: averageAngle }
1092
1092
  };
1093
- var definition_default$3 = definition$10;
1094
- const k = Math.pow(29, 3) / Math.pow(3, 3);
1095
- const e = Math.pow(6, 3) / Math.pow(29, 3);
1093
+ var definition_default$2 = definition$11;
1094
+ const k$1 = Math.pow(29, 3) / Math.pow(3, 3);
1095
+ const e$1 = Math.pow(6, 3) / Math.pow(29, 3);
1096
1096
  const D50 = {
1097
1097
  X: .3457 / .3585,
1098
1098
  Y: 1,
@@ -1103,9 +1103,9 @@ const D65 = {
1103
1103
  Y: 1,
1104
1104
  Z: .3583 / .329
1105
1105
  };
1106
- const k$1 = Math.pow(29, 3) / Math.pow(3, 3);
1107
- const e$1 = Math.pow(6, 3) / Math.pow(29, 3);
1108
- let fn = (v) => Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k;
1106
+ const k$2 = Math.pow(29, 3) / Math.pow(3, 3);
1107
+ const e$2 = Math.pow(6, 3) / Math.pow(29, 3);
1108
+ let fn$1 = (v) => Math.pow(v, 3) > e$1 ? Math.pow(v, 3) : (116 * v - 16) / k$1;
1109
1109
  const convertLabToXyz50 = ({ l, a, b, alpha }) => {
1110
1110
  if (l === void 0) l = 0;
1111
1111
  if (a === void 0) a = 0;
@@ -1115,9 +1115,9 @@ const convertLabToXyz50 = ({ l, a, b, alpha }) => {
1115
1115
  let fz = fy - b / 200;
1116
1116
  let res = {
1117
1117
  mode: "xyz50",
1118
- x: fn(fx) * D50.X,
1119
- y: fn(fy) * D50.Y,
1120
- z: fn(fz) * D50.Z
1118
+ x: fn$1(fx) * D50.X,
1119
+ y: fn$1(fy) * D50.Y,
1120
+ z: fn$1(fz) * D50.Z
1121
1121
  };
1122
1122
  if (alpha !== void 0) res.alpha = alpha;
1123
1123
  return res;
@@ -1150,14 +1150,14 @@ const convertRgbToXyz50 = (rgb$2) => {
1150
1150
  return res;
1151
1151
  };
1152
1152
  var convertRgbToXyz50_default = convertRgbToXyz50;
1153
- const f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;
1153
+ const f$1 = (value) => value > e$1 ? Math.cbrt(value) : (k$1 * value + 16) / 116;
1154
1154
  const convertXyz50ToLab = ({ x, y, z, alpha }) => {
1155
1155
  if (x === void 0) x = 0;
1156
1156
  if (y === void 0) y = 0;
1157
1157
  if (z === void 0) z = 0;
1158
- let f0 = f(x / D50.X);
1159
- let f1 = f(y / D50.Y);
1160
- let f2 = f(z / D50.Z);
1158
+ let f0 = f$1(x / D50.X);
1159
+ let f1 = f$1(y / D50.Y);
1160
+ let f2 = f$1(z / D50.Z);
1161
1161
  let res = {
1162
1162
  mode: "lab",
1163
1163
  l: 116 * f1 - 16,
@@ -1186,7 +1186,7 @@ function parseLab(color, parsed) {
1186
1186
  return res;
1187
1187
  }
1188
1188
  var parseLab_default = parseLab;
1189
- const definition$9 = {
1189
+ const definition$10 = {
1190
1190
  mode: "lab",
1191
1191
  toMode: {
1192
1192
  xyz50: convertLabToXyz50_default,
@@ -1219,6 +1219,72 @@ const definition$9 = {
1219
1219
  }
1220
1220
  }
1221
1221
  };
1222
+ var definition_default$3 = definition$10;
1223
+ const k = Math.pow(29, 3) / Math.pow(3, 3);
1224
+ const e = Math.pow(6, 3) / Math.pow(29, 3);
1225
+ let fn = (v) => Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k;
1226
+ const convertLab65ToXyz65 = ({ l, a, b, alpha }) => {
1227
+ if (l === void 0) l = 0;
1228
+ if (a === void 0) a = 0;
1229
+ if (b === void 0) b = 0;
1230
+ let fy = (l + 16) / 116;
1231
+ let fx = a / 500 + fy;
1232
+ let fz = fy - b / 200;
1233
+ let res = {
1234
+ mode: "xyz65",
1235
+ x: fn(fx) * D65.X,
1236
+ y: fn(fy) * D65.Y,
1237
+ z: fn(fz) * D65.Z
1238
+ };
1239
+ if (alpha !== void 0) res.alpha = alpha;
1240
+ return res;
1241
+ };
1242
+ var convertLab65ToXyz65_default = convertLab65ToXyz65;
1243
+ const convertLab65ToRgb = (lab) => convertXyz65ToRgb_default(convertLab65ToXyz65_default(lab));
1244
+ var convertLab65ToRgb_default = convertLab65ToRgb;
1245
+ const f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;
1246
+ const convertXyz65ToLab65 = ({ x, y, z, alpha }) => {
1247
+ if (x === void 0) x = 0;
1248
+ if (y === void 0) y = 0;
1249
+ if (z === void 0) z = 0;
1250
+ let f0 = f(x / D65.X);
1251
+ let f1 = f(y / D65.Y);
1252
+ let f2 = f(z / D65.Z);
1253
+ let res = {
1254
+ mode: "lab65",
1255
+ l: 116 * f1 - 16,
1256
+ a: 500 * (f0 - f1),
1257
+ b: 200 * (f1 - f2)
1258
+ };
1259
+ if (alpha !== void 0) res.alpha = alpha;
1260
+ return res;
1261
+ };
1262
+ var convertXyz65ToLab65_default = convertXyz65ToLab65;
1263
+ const convertRgbToLab65 = (rgb$2) => {
1264
+ let res = convertXyz65ToLab65_default(convertRgbToXyz65_default(rgb$2));
1265
+ if (rgb$2.r === rgb$2.b && rgb$2.b === rgb$2.g) res.a = res.b = 0;
1266
+ return res;
1267
+ };
1268
+ var convertRgbToLab65_default = convertRgbToLab65;
1269
+ const definition$9 = {
1270
+ ...definition_default$3,
1271
+ mode: "lab65",
1272
+ parse: ["--lab-d65"],
1273
+ serialize: "--lab-d65",
1274
+ toMode: {
1275
+ xyz65: convertLab65ToXyz65_default,
1276
+ rgb: convertLab65ToRgb_default
1277
+ },
1278
+ fromMode: {
1279
+ xyz65: convertXyz65ToLab65_default,
1280
+ rgb: convertRgbToLab65_default
1281
+ },
1282
+ ranges: {
1283
+ l: [0, 100],
1284
+ a: [-86.182, 98.234],
1285
+ b: [-107.86, 94.477]
1286
+ }
1287
+ };
1222
1288
  var definition_default$4 = definition$9;
1223
1289
  const convertLabToLch = ({ l, a, b, alpha }, mode = "lch") => {
1224
1290
  if (a === void 0) a = 0;
@@ -1366,7 +1432,7 @@ function parseOklab(color, parsed) {
1366
1432
  }
1367
1433
  var parseOklab_default = parseOklab;
1368
1434
  const definition$6 = {
1369
- ...definition_default$4,
1435
+ ...definition_default$3,
1370
1436
  mode: "oklab",
1371
1437
  toMode: {
1372
1438
  lrgb: convertOklabToLrgb_default,
@@ -1670,6 +1736,171 @@ const definition = {
1670
1736
  }
1671
1737
  };
1672
1738
  var definition_default$14 = definition;
1739
+ function toe(x) {
1740
+ const k_1 = .206;
1741
+ const k_2 = .03;
1742
+ const k_3 = (1 + k_1) / (1 + k_2);
1743
+ return .5 * (k_3 * x - k_1 + Math.sqrt((k_3 * x - k_1) * (k_3 * x - k_1) + 4 * k_2 * k_3 * x));
1744
+ }
1745
+ function toe_inv(x) {
1746
+ const k_1 = .206;
1747
+ const k_2 = .03;
1748
+ const k_3 = (1 + k_1) / (1 + k_2);
1749
+ return (x * x + k_1 * x) / (k_3 * (x + k_2));
1750
+ }
1751
+ function compute_max_saturation(a, b) {
1752
+ let k0, k1, k2, k3, k4, wl, wm, ws;
1753
+ if (-1.88170328 * a - .80936493 * b > 1) {
1754
+ k0 = 1.19086277;
1755
+ k1 = 1.76576728;
1756
+ k2 = .59662641;
1757
+ k3 = .75515197;
1758
+ k4 = .56771245;
1759
+ wl = 4.0767416621;
1760
+ wm = -3.3077115913;
1761
+ ws = .2309699292;
1762
+ } else if (1.81444104 * a - 1.19445276 * b > 1) {
1763
+ k0 = .73956515;
1764
+ k1 = -.45954404;
1765
+ k2 = .08285427;
1766
+ k3 = .1254107;
1767
+ k4 = .14503204;
1768
+ wl = -1.2684380046;
1769
+ wm = 2.6097574011;
1770
+ ws = -.3413193965;
1771
+ } else {
1772
+ k0 = 1.35733652;
1773
+ k1 = -.00915799;
1774
+ k2 = -1.1513021;
1775
+ k3 = -.50559606;
1776
+ k4 = .00692167;
1777
+ wl = -.0041960863;
1778
+ wm = -.7034186147;
1779
+ ws = 1.707614701;
1780
+ }
1781
+ let S = k0 + k1 * a + k2 * b + k3 * a * a + k4 * a * b;
1782
+ let k_l = .3963377774 * a + .2158037573 * b;
1783
+ let k_m = -.1055613458 * a - .0638541728 * b;
1784
+ let k_s = -.0894841775 * a - 1.291485548 * b;
1785
+ {
1786
+ let l_ = 1 + S * k_l;
1787
+ let m_ = 1 + S * k_m;
1788
+ let s_ = 1 + S * k_s;
1789
+ let l = l_ * l_ * l_;
1790
+ let m = m_ * m_ * m_;
1791
+ let s = s_ * s_ * s_;
1792
+ let l_dS = 3 * k_l * l_ * l_;
1793
+ let m_dS = 3 * k_m * m_ * m_;
1794
+ let s_dS = 3 * k_s * s_ * s_;
1795
+ let l_dS2 = 6 * k_l * k_l * l_;
1796
+ let m_dS2 = 6 * k_m * k_m * m_;
1797
+ let s_dS2 = 6 * k_s * k_s * s_;
1798
+ let f$2 = wl * l + wm * m + ws * s;
1799
+ let f1 = wl * l_dS + wm * m_dS + ws * s_dS;
1800
+ let f2 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2;
1801
+ S = S - f$2 * f1 / (f1 * f1 - .5 * f$2 * f2);
1802
+ }
1803
+ return S;
1804
+ }
1805
+ function find_cusp(a, b) {
1806
+ let S_cusp = compute_max_saturation(a, b);
1807
+ let rgb$2 = convertOklabToLrgb_default({
1808
+ l: 1,
1809
+ a: S_cusp * a,
1810
+ b: S_cusp * b
1811
+ });
1812
+ let L_cusp = Math.cbrt(1 / Math.max(rgb$2.r, rgb$2.g, rgb$2.b));
1813
+ let C_cusp = L_cusp * S_cusp;
1814
+ return [L_cusp, C_cusp];
1815
+ }
1816
+ function get_ST_max(a_, b_, cusp = null) {
1817
+ if (!cusp) cusp = find_cusp(a_, b_);
1818
+ let L = cusp[0];
1819
+ let C = cusp[1];
1820
+ return [C / L, C / (1 - L)];
1821
+ }
1822
+ function convertOklabToOkhsv(lab) {
1823
+ let l = lab.l !== void 0 ? lab.l : 0;
1824
+ let a = lab.a !== void 0 ? lab.a : 0;
1825
+ let b = lab.b !== void 0 ? lab.b : 0;
1826
+ let c$1 = Math.sqrt(a * a + b * b);
1827
+ let a_ = c$1 ? a / c$1 : 1;
1828
+ let b_ = c$1 ? b / c$1 : 1;
1829
+ let [S_max, T] = get_ST_max(a_, b_);
1830
+ let S_0 = .5;
1831
+ let k$3 = 1 - S_0 / S_max;
1832
+ let t = T / (c$1 + l * T);
1833
+ let L_v = t * l;
1834
+ let C_v = t * c$1;
1835
+ let L_vt = toe_inv(L_v);
1836
+ let C_vt = C_v * L_vt / L_v;
1837
+ let rgb_scale = convertOklabToLrgb_default({
1838
+ l: L_vt,
1839
+ a: a_ * C_vt,
1840
+ b: b_ * C_vt
1841
+ });
1842
+ let scale_L = Math.cbrt(1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0));
1843
+ l = l / scale_L;
1844
+ c$1 = c$1 / scale_L * toe(l) / l;
1845
+ l = toe(l);
1846
+ const ret = {
1847
+ mode: "okhsv",
1848
+ s: c$1 ? (S_0 + T) * C_v / (T * S_0 + T * k$3 * C_v) : 0,
1849
+ v: l ? l / L_v : 0
1850
+ };
1851
+ if (ret.s) ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);
1852
+ if (lab.alpha !== void 0) ret.alpha = lab.alpha;
1853
+ return ret;
1854
+ }
1855
+ function convertOkhsvToOklab(hsv) {
1856
+ const ret = { mode: "oklab" };
1857
+ if (hsv.alpha !== void 0) ret.alpha = hsv.alpha;
1858
+ const h = hsv.h !== void 0 ? hsv.h : 0;
1859
+ const s = hsv.s !== void 0 ? hsv.s : 0;
1860
+ const v = hsv.v !== void 0 ? hsv.v : 0;
1861
+ const a_ = Math.cos(h / 180 * Math.PI);
1862
+ const b_ = Math.sin(h / 180 * Math.PI);
1863
+ const [S_max, T] = get_ST_max(a_, b_);
1864
+ const S_0 = .5;
1865
+ const k$3 = 1 - S_0 / S_max;
1866
+ const L_v = 1 - s * S_0 / (S_0 + T - T * k$3 * s);
1867
+ const C_v = s * T * S_0 / (S_0 + T - T * k$3 * s);
1868
+ const L_vt = toe_inv(L_v);
1869
+ const C_vt = C_v * L_vt / L_v;
1870
+ const rgb_scale = convertOklabToLrgb_default({
1871
+ l: L_vt,
1872
+ a: a_ * C_vt,
1873
+ b: b_ * C_vt
1874
+ });
1875
+ const scale_L = Math.cbrt(1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0));
1876
+ const L_new = toe_inv(v * L_v);
1877
+ const C = C_v * L_new / L_v;
1878
+ ret.l = L_new * scale_L;
1879
+ ret.a = C * a_ * scale_L;
1880
+ ret.b = C * b_ * scale_L;
1881
+ return ret;
1882
+ }
1883
+ const modeOkhsv = {
1884
+ ...definition_default$15,
1885
+ mode: "okhsv",
1886
+ channels: [
1887
+ "h",
1888
+ "s",
1889
+ "v",
1890
+ "alpha"
1891
+ ],
1892
+ parse: ["--okhsv"],
1893
+ serialize: "--okhsv",
1894
+ fromMode: {
1895
+ oklab: convertOklabToOkhsv,
1896
+ rgb: (c$1) => convertOklabToOkhsv(convertRgbToOklab_default(c$1))
1897
+ },
1898
+ toMode: {
1899
+ oklab: convertOkhsvToOklab,
1900
+ rgb: (c$1) => convertOklabToRgb_default(convertOkhsvToOklab(c$1))
1901
+ }
1902
+ };
1903
+ var modeOkhsv_default = modeOkhsv;
1673
1904
  const r = (value, precision) => Math.round(value * (precision = Math.pow(10, precision))) / precision;
1674
1905
  const round = (precision = 4) => (value) => typeof value === "number" ? r(value, precision) : value;
1675
1906
  var round_default = round;
@@ -1680,13 +1911,14 @@ const rgb = converter_default("rgb");
1680
1911
  const converters = {
1681
1912
  a98: useMode(definition_default),
1682
1913
  hsl: useMode(definition_default$1),
1683
- hsv: useMode(definition_default$2),
1684
- hwb: useMode(definition_default$3),
1685
- lab: useMode(definition_default$4),
1914
+ hwb: useMode(definition_default$2),
1915
+ lab: useMode(definition_default$3),
1916
+ lab65: useMode(definition_default$4),
1686
1917
  lch: useMode(definition_default$5),
1687
1918
  lrgb: useMode(definition_default$6),
1688
1919
  oklab: useMode(definition_default$7),
1689
1920
  oklch: useMode(definition_default$8),
1921
+ okhsv: useMode(modeOkhsv_default),
1690
1922
  p3: useMode(definition_default$9),
1691
1923
  prophoto: useMode(definition_default$10),
1692
1924
  rec2020: useMode(definition_default$11),