@thi.ng/color 5.6.2 → 5.6.4

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.
Files changed (111) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +1 -1
  3. package/alpha.js +6 -10
  4. package/analog.js +35 -67
  5. package/api/constants.js +128 -156
  6. package/api/gradients.js +0 -1
  7. package/api/names.js +154 -151
  8. package/api/ranges.js +0 -1
  9. package/api/system.js +21 -26
  10. package/api.js +27 -32
  11. package/clamp.js +18 -29
  12. package/closest-hue.js +6 -12
  13. package/color-range.js +159 -228
  14. package/color.js +29 -28
  15. package/contrast.js +7 -17
  16. package/convert.js +19 -40
  17. package/cosine-gradients.js +177 -229
  18. package/css/css.js +27 -53
  19. package/css/parse-css.js +94 -160
  20. package/defcolor.js +97 -108
  21. package/distance.js +96 -187
  22. package/gradients.js +29 -37
  23. package/hcy/hcy-rgb.js +20 -13
  24. package/hcy/hcy.js +9 -11
  25. package/hsi/hsi-rgb.js +32 -30
  26. package/hsi/hsi.js +9 -11
  27. package/hsl/hsl-css.js +9 -10
  28. package/hsl/hsl-hsv.js +12 -9
  29. package/hsl/hsl-rgb.js +14 -6
  30. package/hsl/hsl.js +14 -16
  31. package/hsv/hsv-css.js +4 -1
  32. package/hsv/hsv-hsl.js +11 -8
  33. package/hsv/hsv-rgb.js +14 -6
  34. package/hsv/hsv.js +14 -16
  35. package/hue.js +12 -12
  36. package/int/int-css.js +10 -6
  37. package/int/int-int.js +6 -10
  38. package/int/int-rgb.js +16 -5
  39. package/int/int-srgb.js +22 -4
  40. package/int/int.js +136 -142
  41. package/internal/css.js +16 -12
  42. package/internal/dispatch.js +6 -2
  43. package/internal/ensure.js +18 -16
  44. package/internal/matrix-ops.js +39 -41
  45. package/internal/scale.js +4 -2
  46. package/invert.js +46 -39
  47. package/is-black.js +12 -5
  48. package/is-gamut.js +8 -13
  49. package/is-gray.js +12 -5
  50. package/is-white.js +14 -7
  51. package/lab/lab-css.js +4 -9
  52. package/lab/lab-lab.js +6 -2
  53. package/lab/lab-lch.js +18 -10
  54. package/lab/lab-rgb.js +6 -14
  55. package/lab/lab-xyz.js +16 -20
  56. package/lab/lab50.js +18 -15
  57. package/lab/lab65.js +18 -15
  58. package/lch/lch-css.js +4 -9
  59. package/lch/lch.js +18 -23
  60. package/lighten.js +13 -17
  61. package/linear.js +6 -16
  62. package/luminance-rgb.js +14 -22
  63. package/luminance.js +16 -14
  64. package/max-chroma.js +1340 -227
  65. package/mix.js +34 -82
  66. package/oklab/oklab-css.js +4 -9
  67. package/oklab/oklab-rgb.js +17 -23
  68. package/oklab/oklab-xyz.js +22 -9
  69. package/oklab/oklab.js +19 -22
  70. package/oklch/oklab-oklch.js +10 -11
  71. package/oklch/oklch-css.js +4 -9
  72. package/oklch/oklch-oklab.js +9 -9
  73. package/oklch/oklch.js +14 -20
  74. package/package.json +19 -17
  75. package/rgb/hue-rgb.js +14 -11
  76. package/rgb/kelvin-rgba.js +23 -22
  77. package/rgb/rgb-css.js +4 -1
  78. package/rgb/rgb-hcv.js +14 -15
  79. package/rgb/rgb-hcy.js +10 -14
  80. package/rgb/rgb-hsi.js +13 -8
  81. package/rgb/rgb-hsl.js +8 -5
  82. package/rgb/rgb-hsv.js +7 -4
  83. package/rgb/rgb-lab.js +6 -18
  84. package/rgb/rgb-oklab.js +13 -19
  85. package/rgb/rgb-srgb.js +18 -8
  86. package/rgb/rgb-xyz.js +6 -19
  87. package/rgb/rgb-ycc.js +12 -17
  88. package/rgb/rgb.js +25 -22
  89. package/rotate.js +25 -38
  90. package/sort.js +24 -72
  91. package/srgb/srgb-css.js +9 -9
  92. package/srgb/srgb-int.js +6 -10
  93. package/srgb/srgb-rgb.js +18 -8
  94. package/srgb/srgb.js +16 -13
  95. package/strategies.js +42 -112
  96. package/swatches.js +28 -5
  97. package/tint.js +27 -53
  98. package/transform.js +274 -149
  99. package/variations.js +10 -9
  100. package/xyy/xyy-xyz.js +12 -11
  101. package/xyy/xyy.js +16 -13
  102. package/xyz/wavelength-xyz.js +14 -28
  103. package/xyz/xyz-lab.js +17 -26
  104. package/xyz/xyz-oklab.js +4 -1
  105. package/xyz/xyz-rgb.js +6 -18
  106. package/xyz/xyz-xyy.js +13 -12
  107. package/xyz/xyz-xyz.js +6 -2
  108. package/xyz/xyz50.js +20 -17
  109. package/xyz/xyz65.js +20 -17
  110. package/ycc/ycc-rgb.js +14 -19
  111. package/ycc/ycc.js +12 -9
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Change Log
2
2
 
3
- - **Last updated**: 2023-12-03T12:13:31Z
3
+ - **Last updated**: 2023-12-11T10:07:09Z
4
4
  - **Generator**: [thi.ng/monopub](https://thi.ng/monopub)
5
5
 
6
6
  All notable changes to this project will be documented in this file.
package/README.md CHANGED
@@ -602,7 +602,7 @@ For Node.js REPL:
602
602
  const color = await import("@thi.ng/color");
603
603
  ```
604
604
 
605
- Package sizes (brotli'd, pre-treeshake): ESM: 15.69 KB
605
+ Package sizes (brotli'd, pre-treeshake): ESM: 15.70 KB
606
606
 
607
607
  ## Dependencies
608
608
 
package/alpha.js CHANGED
@@ -1,11 +1,7 @@
1
1
  import { setC4 } from "@thi.ng/vectors/setc";
2
- export const alpha = (src) => src[3] !== undefined ? src[3] : 1;
3
- /**
4
- * Creates version of `src` color with modified `alpha` and writes result into
5
- * `out` (or if null, back into `src`).
6
- *
7
- * @param out
8
- * @param src
9
- * @param alpha
10
- */
11
- export const setAlpha = (out, src, alpha) => setC4(out || src, src[0], src[1], src[2], alpha);
2
+ const alpha = (src) => src[3] !== void 0 ? src[3] : 1;
3
+ const setAlpha = (out, src, alpha2) => setC4(out || src, src[0], src[1], src[2], alpha2);
4
+ export {
5
+ alpha,
6
+ setAlpha
7
+ };
package/analog.js CHANGED
@@ -5,35 +5,24 @@ import { SYSTEM } from "@thi.ng/random/system";
5
5
  import { setC4 } from "@thi.ng/vectors/setc";
6
6
  import { __dispatch1 } from "./internal/dispatch.js";
7
7
  import { __ensureAlpha } from "./internal/ensure.js";
8
- /** @internal */
9
8
  const analogU = (x, delta, rnd) => delta !== 0 ? x + rnd.norm(delta) : x;
10
- /** @internal */
11
9
  const analogN = (x, delta, rnd, post = clamp01) => delta !== 0 ? post(x + rnd.norm(delta)) : x;
12
- /** @internal */
13
10
  const analogH = (x, delta, rnd) => analogN(x, delta, rnd, fract);
14
- /** @internal */
15
- const analogA = (a, delta, rnd) => delta !== 0
16
- ? clamp01((a !== undefined ? a : 1) + rnd.norm(delta))
17
- : __ensureAlpha(a);
18
- export const defAnalog = (x, y, z) => (out, src, delta, rnd = SYSTEM) => setC4(out || src, x(src[0], delta, rnd), y(src[1], delta, rnd), z(src[2], delta, rnd), __ensureAlpha(src[3]));
19
- /** @internal */
11
+ const analogA = (a, delta, rnd) => delta !== 0 ? clamp01((a !== void 0 ? a : 1) + rnd.norm(delta)) : __ensureAlpha(a);
12
+ const defAnalog = (x, y, z) => (out, src, delta, rnd = SYSTEM) => setC4(
13
+ out || src,
14
+ x(src[0], delta, rnd),
15
+ y(src[1], delta, rnd),
16
+ z(src[2], delta, rnd),
17
+ __ensureAlpha(src[3])
18
+ );
20
19
  const analogHNN = defAnalog(analogH, analogN, analogN);
21
- /** @internal */
22
20
  const analogNNN = defAnalog(analogN, analogN, analogN);
23
- /** @internal */
24
21
  const analogNUU = defAnalog(analogN, analogU, analogU);
25
- /**
26
- * Returns a random analog color based on given `src` color and variance
27
- * `delta`. Each channel will be randomized by +/- `delta`, optionally using
28
- * provided
29
- * [`IRandom`](https://docs.thi.ng/umbrella/random/interfaces/IRandom.html)
30
- * PRNG.
31
- *
32
- * @remarks
33
- * If `out` is null, the resulting color will be written back into `src`.
34
- *
35
- */
36
- export const analog = defmulti(__dispatch1, { oklab: "lab50", oklch: "lch" }, {
22
+ const analog = defmulti(
23
+ __dispatch1,
24
+ { oklab: "lab50", oklch: "lch" },
25
+ {
37
26
  hcy: analogHNN,
38
27
  hsi: analogHNN,
39
28
  hsl: analogHNN,
@@ -42,47 +31,26 @@ export const analog = defmulti(__dispatch1, { oklab: "lab50", oklch: "lch" }, {
42
31
  lab65: analogNUU,
43
32
  lch: defAnalog(analogN, analogN, analogH),
44
33
  ycc: analogNUU,
45
- [DEFAULT]: analogNNN,
46
- });
47
- /**
48
- * Similar to {@link analogRGB}. Returns an analog color based on given HSVA
49
- * color, with each channel randomly varied by given channel-specific delta
50
- * amounts (and optionally given
51
- * [`IRandom`](https://docs.thi.ng/umbrella/random/interfaces/IRandom.html)
52
- * PRNG).
53
- *
54
- * @remarks
55
- * This function provides more user control than {@link analog}, but the latter
56
- * is recommended for most use cases.
57
- *
58
- * By default (unless `deltaS`, `deltaV`, `deltaA` are provided) only the hue of
59
- * the color will be modulated.
60
- *
61
- * @param out -
62
- * @param src -
63
- * @param deltaH -
64
- * @param deltaS -
65
- * @param deltaV -
66
- * @param deltaA -
67
- * @param rnd -
68
- */
69
- export const analogHsv = (out, src, deltaH, deltaS = 0, deltaV = 0, deltaA = 0, rnd = SYSTEM) => setC4(out || src, analogN(src[0], deltaH, rnd, fract), analogN(src[1], deltaS, rnd), analogN(src[2], deltaV, rnd), analogA(src[3], deltaA, rnd));
70
- /**
71
- * Similar to {@link analogHSV}. Returns an analog color based on given RGBA
72
- * color, with each channel randomly varied by given delta amounts (and
73
- * optionally given
74
- * [`IRandom`](https://docs.thi.ng/umbrella/random/interfaces/IRandom.html)
75
- * PRNG).
76
- *
77
- * @remarks
78
- * By default the green and blue channel variance will be the same as `deltaR`.
79
- *
80
- * @param out -
81
- * @param src -
82
- * @param deltaR -
83
- * @param deltaG -
84
- * @param deltaB -
85
- * @param deltaA -
86
- * @param rnd -
87
- */
88
- export const analogRgb = (out, src, deltaR, deltaG = deltaR, deltaB = deltaR, deltaA = 0, rnd = SYSTEM) => setC4(out || src, analogN(src[0], deltaR, rnd), analogN(src[1], deltaG, rnd), analogN(src[2], deltaB, rnd), analogA(src[3], deltaA, rnd));
34
+ [DEFAULT]: analogNNN
35
+ }
36
+ );
37
+ const analogHsv = (out, src, deltaH, deltaS = 0, deltaV = 0, deltaA = 0, rnd = SYSTEM) => setC4(
38
+ out || src,
39
+ analogN(src[0], deltaH, rnd, fract),
40
+ analogN(src[1], deltaS, rnd),
41
+ analogN(src[2], deltaV, rnd),
42
+ analogA(src[3], deltaA, rnd)
43
+ );
44
+ const analogRgb = (out, src, deltaR, deltaG = deltaR, deltaB = deltaR, deltaA = 0, rnd = SYSTEM) => setC4(
45
+ out || src,
46
+ analogN(src[0], deltaR, rnd),
47
+ analogN(src[1], deltaG, rnd),
48
+ analogN(src[2], deltaB, rnd),
49
+ analogA(src[3], deltaA, rnd)
50
+ );
51
+ export {
52
+ analog,
53
+ analogHsv,
54
+ analogRgb,
55
+ defAnalog
56
+ };
package/api/constants.js CHANGED
@@ -1,167 +1,139 @@
1
1
  import { float } from "@thi.ng/strings/float";
2
2
  import { percent } from "@thi.ng/strings/percent";
3
- /**
4
- * RGB black
5
- */
6
- export const BLACK = Object.freeze([0, 0, 0, 1]);
7
- /**
8
- * RGB white
9
- */
10
- export const WHITE = Object.freeze([1, 1, 1, 1]);
11
- /**
12
- * RGB red
13
- */
14
- export const RED = Object.freeze([1, 0, 0, 1]);
15
- /**
16
- * RGB green
17
- */
18
- export const GREEN = Object.freeze([0, 1, 0, 1]);
19
- /**
20
- * RGB blue
21
- */
22
- export const BLUE = Object.freeze([0, 0, 1, 1]);
23
- /**
24
- * RGB cyan
25
- */
26
- export const CYAN = Object.freeze([0, 1, 1, 1]);
27
- /**
28
- * RGB magenta
29
- */
30
- export const MAGENTA = Object.freeze([1, 0, 1, 1]);
31
- /**
32
- * RGB yellow
33
- */
34
- export const YELLOW = Object.freeze([1, 1, 0, 1]);
35
- /**
36
- * ITU-R BT.601 RGB luminance coeffs
37
- *
38
- * @remarks
39
- * Reference:
40
- * https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.601_conversion
41
- */
42
- export const RGB_LUMINANCE_REC601 = [0.299, 0.587, 0.114];
43
- /**
44
- * ITU-R BT.709 RGB luminance coeffs
45
- *
46
- * @remarks
47
- * Reference:
48
- * https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.709_conversion
49
- */
50
- export const RGB_LUMINANCE_REC709 = [0.2126, 0.7152, 0.0722];
51
- /**
52
- * ITU-R BT.2020 RGB luminance coeffs
53
- *
54
- * @remarks
55
- * Reference:
56
- * https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.2020_conversion
57
- */
58
- export const RGB_LUMINANCE_REC2020 = [0.2627, 0.678, 0.0593];
59
- /**
60
- * sRGB to XYZ D65 conversion matrix
61
- *
62
- * @remarks
63
- * Reference:
64
- * http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
65
- */
66
- export const RGB_XYZ_D50 = [
67
- 0.4360747, 0.2225045, 0.0139322, 0.3850649, 0.7168786, 0.0971045, 0.1430804,
68
- 0.0606169, 0.7141733,
3
+ const BLACK = Object.freeze([0, 0, 0, 1]);
4
+ const WHITE = Object.freeze([1, 1, 1, 1]);
5
+ const RED = Object.freeze([1, 0, 0, 1]);
6
+ const GREEN = Object.freeze([0, 1, 0, 1]);
7
+ const BLUE = Object.freeze([0, 0, 1, 1]);
8
+ const CYAN = Object.freeze([0, 1, 1, 1]);
9
+ const MAGENTA = Object.freeze([1, 0, 1, 1]);
10
+ const YELLOW = Object.freeze([1, 1, 0, 1]);
11
+ const RGB_LUMINANCE_REC601 = [0.299, 0.587, 0.114];
12
+ const RGB_LUMINANCE_REC709 = [0.2126, 0.7152, 0.0722];
13
+ const RGB_LUMINANCE_REC2020 = [0.2627, 0.678, 0.0593];
14
+ const RGB_XYZ_D50 = [
15
+ 0.4360747,
16
+ 0.2225045,
17
+ 0.0139322,
18
+ 0.3850649,
19
+ 0.7168786,
20
+ 0.0971045,
21
+ 0.1430804,
22
+ 0.0606169,
23
+ 0.7141733
69
24
  ];
70
- /**
71
- * XYZ D50 to sRGB conversion matrix
72
- *
73
- * @remarks
74
- * Reference:
75
- * http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
76
- */
77
- export const XYZ_RGB_D50 = [
78
- 3.1338561, -0.9787684, 0.0719453, -1.6168667, 1.9161415, -0.2289914,
79
- -0.4906146, 0.033454, 1.4052427,
25
+ const XYZ_RGB_D50 = [
26
+ 3.1338561,
27
+ -0.9787684,
28
+ 0.0719453,
29
+ -1.6168667,
30
+ 1.9161415,
31
+ -0.2289914,
32
+ -0.4906146,
33
+ 0.033454,
34
+ 1.4052427
80
35
  ];
81
- /**
82
- * sRGB to XYZ D65 conversion matrix
83
- *
84
- * @remarks
85
- * Reference:
86
- * http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
87
- */
88
- export const RGB_XYZ_D65 = [
89
- 0.4124564, 0.2126729, 0.0193339, 0.3575761, 0.7151522, 0.119192, 0.1804375,
90
- 0.072175, 0.9503041,
36
+ const RGB_XYZ_D65 = [
37
+ 0.4124564,
38
+ 0.2126729,
39
+ 0.0193339,
40
+ 0.3575761,
41
+ 0.7151522,
42
+ 0.119192,
43
+ 0.1804375,
44
+ 0.072175,
45
+ 0.9503041
91
46
  ];
92
- /**
93
- * XYZ D65 to sRGB conversion matrix
94
- *
95
- * @remarks
96
- * Reference:
97
- * http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
98
- */
99
- export const XYZ_RGB_D65 = [
100
- 3.2404542, -0.969266, 0.0556434, -1.5371385, 1.8760108, -0.2040259,
101
- -0.4985314, 0.041556, 1.0572252,
47
+ const XYZ_RGB_D65 = [
48
+ 3.2404542,
49
+ -0.969266,
50
+ 0.0556434,
51
+ -1.5371385,
52
+ 1.8760108,
53
+ -0.2040259,
54
+ -0.4985314,
55
+ 0.041556,
56
+ 1.0572252
102
57
  ];
103
- /**
104
- * D50 -> D65 chromatic adaptation matrix. Inverse of {@link BRADFORD_D65_D50}.
105
- *
106
- * @remarks
107
- * Reference:
108
- * http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html
109
- */
110
- export const BRADFORD_D50_D65 = [
111
- 0.9555766, -0.0282895, 0.0122982, -0.0230393, 1.0099416, -0.020483,
112
- 0.0631636, 0.0210077, 1.3299098,
58
+ const BRADFORD_D50_D65 = [
59
+ 0.9555766,
60
+ -0.0282895,
61
+ 0.0122982,
62
+ -0.0230393,
63
+ 1.0099416,
64
+ -0.020483,
65
+ 0.0631636,
66
+ 0.0210077,
67
+ 1.3299098
113
68
  ];
114
- /**
115
- * D65 -> D50 chromatic adaptation matrix. Inverse of {@link BRADFORD_D50_D65}.
116
- *
117
- * @remarks
118
- * Reference:
119
- * http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html
120
- */
121
- export const BRADFORD_D65_D50 = [
122
- 1.0478112, 0.0295424, -0.0092345, 0.0228866, 0.9904844, 0.0150436,
123
- -0.050127, -0.0170491, 0.7521316,
69
+ const BRADFORD_D65_D50 = [
70
+ 1.0478112,
71
+ 0.0295424,
72
+ -92345e-7,
73
+ 0.0228866,
74
+ 0.9904844,
75
+ 0.0150436,
76
+ -0.050127,
77
+ -0.0170491,
78
+ 0.7521316
124
79
  ];
125
- /**
126
- * CIE Standard Illuminant D50
127
- */
128
- export const D50 = [0.96422, 1, 0.82521];
129
- /**
130
- * CIE Standard Illuminant D65
131
- *
132
- * Reference:
133
- * https://en.wikipedia.org/wiki/Illuminant_D65
134
- */
135
- export const D65 = [0.95047, 1, 1.08883];
136
- export const OKLAB_M1 = [
137
- 0.8189330101, 0.0329845436, 0.0482003018, 0.3618667424, 0.9293118715,
138
- 0.2643662691, -0.1288597137, 0.0361456387, 0.633851707,
80
+ const D50 = [0.96422, 1, 0.82521];
81
+ const D65 = [0.95047, 1, 1.08883];
82
+ const OKLAB_M1 = [
83
+ 0.8189330101,
84
+ 0.0329845436,
85
+ 0.0482003018,
86
+ 0.3618667424,
87
+ 0.9293118715,
88
+ 0.2643662691,
89
+ -0.1288597137,
90
+ 0.0361456387,
91
+ 0.633851707
139
92
  ];
140
- export const OKLAB_M2 = [
141
- 0.2104542553, 1.9779984951, 0.0259040371, 0.793617785, -2.428592205,
142
- 0.7827717662, -0.0040720468, 0.4505937099, -0.808675766,
93
+ const OKLAB_M2 = [
94
+ 0.2104542553,
95
+ 1.9779984951,
96
+ 0.0259040371,
97
+ 0.793617785,
98
+ -2.428592205,
99
+ 0.7827717662,
100
+ -0.0040720468,
101
+ 0.4505937099,
102
+ -0.808675766
143
103
  ];
144
- /**
145
- * Float value formatter
146
- *
147
- * @internal
148
- */
149
- export let FF = float(3);
150
- /**
151
- * Percentage value formatter
152
- *
153
- * @internal
154
- */
155
- export let PC = percent(3);
156
- /**
157
- * Sets precision for CSS formatted values to `x` significant digits (default:
158
- * 3).
159
- *
160
- * @param x -
161
- */
162
- export const setPrecision = (x) => {
163
- FF = float(x);
164
- PC = percent(x);
104
+ let FF = float(3);
105
+ let PC = percent(3);
106
+ const setPrecision = (x) => {
107
+ FF = float(x);
108
+ PC = percent(x);
109
+ };
110
+ const INV8BIT = 1 / 255;
111
+ const EPS = 1 / 256;
112
+ export {
113
+ BLACK,
114
+ BLUE,
115
+ BRADFORD_D50_D65,
116
+ BRADFORD_D65_D50,
117
+ CYAN,
118
+ D50,
119
+ D65,
120
+ EPS,
121
+ FF,
122
+ GREEN,
123
+ INV8BIT,
124
+ MAGENTA,
125
+ OKLAB_M1,
126
+ OKLAB_M2,
127
+ PC,
128
+ RED,
129
+ RGB_LUMINANCE_REC2020,
130
+ RGB_LUMINANCE_REC601,
131
+ RGB_LUMINANCE_REC709,
132
+ RGB_XYZ_D50,
133
+ RGB_XYZ_D65,
134
+ WHITE,
135
+ XYZ_RGB_D50,
136
+ XYZ_RGB_D65,
137
+ YELLOW,
138
+ setPrecision
165
139
  };
166
- export const INV8BIT = 1 / 0xff;
167
- export const EPS = 1 / 256;
package/api/gradients.js CHANGED
@@ -1 +0,0 @@
1
- export {};