@zag-js/color-utils 1.41.1 → 2.0.0-next.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/dist/area-gradient.js +5 -0
- package/dist/area-gradient.mjs +7 -1
- package/dist/color-format-gradient.d.mts +23 -1
- package/dist/color-format-gradient.d.ts +23 -1
- package/dist/color-format-gradient.js +33 -0
- package/dist/color-format-gradient.mjs +31 -0
- package/dist/gamut.d.mts +6 -0
- package/dist/gamut.d.ts +6 -0
- package/dist/gamut.js +37 -0
- package/dist/gamut.mjs +14 -0
- package/dist/hsb-color.d.mts +5 -0
- package/dist/hsb-color.d.ts +5 -0
- package/dist/hsb-color.js +37 -0
- package/dist/hsb-color.mjs +37 -0
- package/dist/hsl-color.js +3 -0
- package/dist/hsl-color.mjs +3 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +25 -2
- package/dist/index.mjs +22 -1
- package/dist/oklab-color.d.mts +64 -0
- package/dist/oklab-color.d.ts +64 -0
- package/dist/oklab-color.js +396 -0
- package/dist/oklab-color.mjs +370 -0
- package/dist/oklab-math.d.mts +47 -0
- package/dist/oklab-math.d.ts +47 -0
- package/dist/oklab-math.js +167 -0
- package/dist/oklab-math.mjs +133 -0
- package/dist/parse-color.js +2 -1
- package/dist/parse-color.mjs +2 -1
- package/dist/rgb-color.js +9 -0
- package/dist/rgb-color.mjs +9 -0
- package/dist/types.d.mts +2 -2
- package/dist/types.d.ts +2 -2
- package/package.json +2 -2
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import "./chunk-QZ7TP4HQ.mjs";
|
|
2
|
+
|
|
3
|
+
// src/oklab-math.ts
|
|
4
|
+
function srgbChannelToLinear(c) {
|
|
5
|
+
return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
6
|
+
}
|
|
7
|
+
function linearChannelToSrgb(c) {
|
|
8
|
+
return c <= 31308e-7 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;
|
|
9
|
+
}
|
|
10
|
+
function srgbToLinearRgb(r255, g255, b255) {
|
|
11
|
+
return {
|
|
12
|
+
r: srgbChannelToLinear(r255 / 255),
|
|
13
|
+
g: srgbChannelToLinear(g255 / 255),
|
|
14
|
+
b: srgbChannelToLinear(b255 / 255)
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function linearRgbToSrgb({ r, g, b }) {
|
|
18
|
+
return {
|
|
19
|
+
r: Math.round(clamp01(linearChannelToSrgb(r)) * 255),
|
|
20
|
+
g: Math.round(clamp01(linearChannelToSrgb(g)) * 255),
|
|
21
|
+
b: Math.round(clamp01(linearChannelToSrgb(b)) * 255)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function clamp01(x) {
|
|
25
|
+
return x < 0 ? 0 : x > 1 ? 1 : x;
|
|
26
|
+
}
|
|
27
|
+
function linearRgbToOklab({ r, g, b }) {
|
|
28
|
+
const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;
|
|
29
|
+
const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;
|
|
30
|
+
const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;
|
|
31
|
+
const l_ = Math.cbrt(l);
|
|
32
|
+
const m_ = Math.cbrt(m);
|
|
33
|
+
const s_ = Math.cbrt(s);
|
|
34
|
+
return {
|
|
35
|
+
L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,
|
|
36
|
+
a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,
|
|
37
|
+
b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function oklabToLinearRgb(L, a, b) {
|
|
41
|
+
const l_ = L + 0.3963377774 * a + 0.2158037573 * b;
|
|
42
|
+
const m_ = L - 0.1055613458 * a - 0.0638541728 * b;
|
|
43
|
+
const s_ = L - 0.0894841775 * a - 1.291485548 * b;
|
|
44
|
+
const l = l_ * l_ * l_;
|
|
45
|
+
const m = m_ * m_ * m_;
|
|
46
|
+
const s = s_ * s_ * s_;
|
|
47
|
+
return {
|
|
48
|
+
r: 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
|
|
49
|
+
g: -1.2684380046 * l + 2.6097574011 * m - 0.341319396 * s,
|
|
50
|
+
b: -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function oklchToOklab(L, C, Hdeg) {
|
|
54
|
+
const h = Hdeg * Math.PI / 180;
|
|
55
|
+
return {
|
|
56
|
+
L,
|
|
57
|
+
a: C * Math.cos(h),
|
|
58
|
+
b: C * Math.sin(h)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function oklabToOklch(L, a, b) {
|
|
62
|
+
const C = Math.sqrt(a * a + b * b);
|
|
63
|
+
let H = Math.atan2(b, a) * 180 / Math.PI;
|
|
64
|
+
if (H < 0) H += 360;
|
|
65
|
+
return { L, C, H };
|
|
66
|
+
}
|
|
67
|
+
function isLinearRgbInSrgbGamut({ r, g, b }, eps = 1e-3) {
|
|
68
|
+
return r >= -eps && r <= 1 + eps && g >= -eps && g <= 1 + eps && b >= -eps && b <= 1 + eps;
|
|
69
|
+
}
|
|
70
|
+
function linearDisplayP3ToLinearSrgb(r, g, b) {
|
|
71
|
+
const x = 0.4865709486482162 * r + 0.26566769316909306 * g + 0.1982172852343625 * b;
|
|
72
|
+
const y = 0.2289745640697488 * r + 0.6917385218365064 * g + 0.079286914093745 * b;
|
|
73
|
+
const z = 0 * r + 0.04511338185890264 * g + 1.043944368900976 * b;
|
|
74
|
+
return {
|
|
75
|
+
r: 3.2404541621141054 * x - 1.5371385940306088 * y - 0.4985314095560158 * z,
|
|
76
|
+
g: -0.9692660305051868 * x + 1.8760108454466942 * y + 0.0415560175303498 * z,
|
|
77
|
+
b: 0.0556434309591147 * x - 0.2039769598730574 * y + 1.0572251882231791 * z
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function hsvToRgb(h, s, v) {
|
|
81
|
+
const c = v * s;
|
|
82
|
+
const x = c * (1 - Math.abs(h / 60 % 2 - 1));
|
|
83
|
+
const m = v - c;
|
|
84
|
+
let r1 = 0, g1 = 0, b1 = 0;
|
|
85
|
+
if (h < 60) {
|
|
86
|
+
r1 = c;
|
|
87
|
+
g1 = x;
|
|
88
|
+
b1 = 0;
|
|
89
|
+
} else if (h < 120) {
|
|
90
|
+
r1 = x;
|
|
91
|
+
g1 = c;
|
|
92
|
+
b1 = 0;
|
|
93
|
+
} else if (h < 180) {
|
|
94
|
+
r1 = 0;
|
|
95
|
+
g1 = c;
|
|
96
|
+
b1 = x;
|
|
97
|
+
} else if (h < 240) {
|
|
98
|
+
r1 = 0;
|
|
99
|
+
g1 = x;
|
|
100
|
+
b1 = c;
|
|
101
|
+
} else if (h < 300) {
|
|
102
|
+
r1 = x;
|
|
103
|
+
g1 = 0;
|
|
104
|
+
b1 = c;
|
|
105
|
+
} else {
|
|
106
|
+
r1 = c;
|
|
107
|
+
g1 = 0;
|
|
108
|
+
b1 = x;
|
|
109
|
+
}
|
|
110
|
+
return [r1 + m, g1 + m, b1 + m];
|
|
111
|
+
}
|
|
112
|
+
function isDisplayP3HsvInSrgbGamut(h, s, v, eps = 1e-3) {
|
|
113
|
+
const [r, g, b] = hsvToRgb(h, s, v);
|
|
114
|
+
const lr = srgbChannelToLinear(r);
|
|
115
|
+
const lg = srgbChannelToLinear(g);
|
|
116
|
+
const lb = srgbChannelToLinear(b);
|
|
117
|
+
const srgb = linearDisplayP3ToLinearSrgb(lr, lg, lb);
|
|
118
|
+
return isLinearRgbInSrgbGamut(srgb, eps);
|
|
119
|
+
}
|
|
120
|
+
export {
|
|
121
|
+
hsvToRgb,
|
|
122
|
+
isDisplayP3HsvInSrgbGamut,
|
|
123
|
+
isLinearRgbInSrgbGamut,
|
|
124
|
+
linearChannelToSrgb,
|
|
125
|
+
linearDisplayP3ToLinearSrgb,
|
|
126
|
+
linearRgbToOklab,
|
|
127
|
+
linearRgbToSrgb,
|
|
128
|
+
oklabToLinearRgb,
|
|
129
|
+
oklabToOklch,
|
|
130
|
+
oklchToOklab,
|
|
131
|
+
srgbChannelToLinear,
|
|
132
|
+
srgbToLinearRgb
|
|
133
|
+
};
|
package/dist/parse-color.js
CHANGED
|
@@ -26,13 +26,14 @@ __export(parse_color_exports, {
|
|
|
26
26
|
module.exports = __toCommonJS(parse_color_exports);
|
|
27
27
|
var import_hsb_color = require("./hsb-color.js");
|
|
28
28
|
var import_hsl_color = require("./hsl-color.js");
|
|
29
|
+
var import_oklab_color = require("./oklab-color.js");
|
|
29
30
|
var import_native_color = require("./native-color.js");
|
|
30
31
|
var import_rgb_color = require("./rgb-color.js");
|
|
31
32
|
var parseColor = (value) => {
|
|
32
33
|
if (import_native_color.nativeColorMap.has(value)) {
|
|
33
34
|
return parseColor(import_native_color.nativeColorMap.get(value));
|
|
34
35
|
}
|
|
35
|
-
const result = import_rgb_color.RGBColor.parse(value) || import_hsb_color.HSBColor.parse(value) || import_hsl_color.HSLColor.parse(value);
|
|
36
|
+
const result = import_oklab_color.OklabColor.parse(value) || import_oklab_color.OklchColor.parse(value) || import_rgb_color.RGBColor.parse(value) || import_hsb_color.HSBColor.parse(value) || import_hsl_color.HSLColor.parse(value);
|
|
36
37
|
if (!result) {
|
|
37
38
|
const error = new Error("Invalid color value: " + value);
|
|
38
39
|
Error.captureStackTrace?.(error, parseColor);
|
package/dist/parse-color.mjs
CHANGED
|
@@ -3,13 +3,14 @@ import "./chunk-QZ7TP4HQ.mjs";
|
|
|
3
3
|
// src/parse-color.ts
|
|
4
4
|
import { HSBColor } from "./hsb-color.mjs";
|
|
5
5
|
import { HSLColor } from "./hsl-color.mjs";
|
|
6
|
+
import { OklabColor, OklchColor } from "./oklab-color.mjs";
|
|
6
7
|
import { nativeColorMap } from "./native-color.mjs";
|
|
7
8
|
import { RGBColor } from "./rgb-color.mjs";
|
|
8
9
|
var parseColor = (value) => {
|
|
9
10
|
if (nativeColorMap.has(value)) {
|
|
10
11
|
return parseColor(nativeColorMap.get(value));
|
|
11
12
|
}
|
|
12
|
-
const result = RGBColor.parse(value) || HSBColor.parse(value) || HSLColor.parse(value);
|
|
13
|
+
const result = OklabColor.parse(value) || OklchColor.parse(value) || RGBColor.parse(value) || HSBColor.parse(value) || HSLColor.parse(value);
|
|
13
14
|
if (!result) {
|
|
14
15
|
const error = new Error("Invalid color value: " + value);
|
|
15
16
|
Error.captureStackTrace?.(error, parseColor);
|
package/dist/rgb-color.js
CHANGED
|
@@ -29,6 +29,8 @@ var import_utils = require("@zag-js/utils");
|
|
|
29
29
|
var import_color = require("./color.js");
|
|
30
30
|
var import_hsb_color = require("./hsb-color.js");
|
|
31
31
|
var import_hsl_color = require("./hsl-color.js");
|
|
32
|
+
var import_oklab_math = require("./oklab-math.js");
|
|
33
|
+
var import_oklab_color = require("./oklab-color.js");
|
|
32
34
|
var HEX_COLOR_REGEX = /^#[\da-f]+$/i;
|
|
33
35
|
var RGB_COLOR_REGEX = /^rgba?\((.*)\)$/;
|
|
34
36
|
var HEX_STARTING_REGEX = /[^#]/gi;
|
|
@@ -82,6 +84,13 @@ var _RGBColor = class _RGBColor extends import_color.Color {
|
|
|
82
84
|
return this.toHSB();
|
|
83
85
|
case "hsla":
|
|
84
86
|
return this.toHSL();
|
|
87
|
+
case "oklab": {
|
|
88
|
+
const lin = (0, import_oklab_math.srgbToLinearRgb)(this.red, this.green, this.blue);
|
|
89
|
+
const { L, a, b } = (0, import_oklab_math.linearRgbToOklab)(lin);
|
|
90
|
+
return new import_oklab_color.OklabColor(L, a, b, (0, import_utils.toFixedNumber)(this.alpha, 4));
|
|
91
|
+
}
|
|
92
|
+
case "oklch":
|
|
93
|
+
return this.toFormat("oklab").toFormat("oklch");
|
|
85
94
|
default:
|
|
86
95
|
throw new Error("Unsupported color conversion: rgb -> " + format);
|
|
87
96
|
}
|
package/dist/rgb-color.mjs
CHANGED
|
@@ -7,6 +7,8 @@ import { clampValue, toFixedNumber } from "@zag-js/utils";
|
|
|
7
7
|
import { Color } from "./color.mjs";
|
|
8
8
|
import { HSBColor } from "./hsb-color.mjs";
|
|
9
9
|
import { HSLColor } from "./hsl-color.mjs";
|
|
10
|
+
import { linearRgbToOklab, srgbToLinearRgb } from "./oklab-math.mjs";
|
|
11
|
+
import { OklabColor } from "./oklab-color.mjs";
|
|
10
12
|
var HEX_COLOR_REGEX = /^#[\da-f]+$/i;
|
|
11
13
|
var RGB_COLOR_REGEX = /^rgba?\((.*)\)$/;
|
|
12
14
|
var HEX_STARTING_REGEX = /[^#]/gi;
|
|
@@ -60,6 +62,13 @@ var _RGBColor = class _RGBColor extends Color {
|
|
|
60
62
|
return this.toHSB();
|
|
61
63
|
case "hsla":
|
|
62
64
|
return this.toHSL();
|
|
65
|
+
case "oklab": {
|
|
66
|
+
const lin = srgbToLinearRgb(this.red, this.green, this.blue);
|
|
67
|
+
const { L, a, b } = linearRgbToOklab(lin);
|
|
68
|
+
return new OklabColor(L, a, b, toFixedNumber(this.alpha, 4));
|
|
69
|
+
}
|
|
70
|
+
case "oklch":
|
|
71
|
+
return this.toFormat("oklab").toFormat("oklch");
|
|
63
72
|
default:
|
|
64
73
|
throw new Error("Unsupported color conversion: rgb -> " + format);
|
|
65
74
|
}
|
package/dist/types.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
type ColorHexFormat = "hex" | "hexa";
|
|
2
|
-
type ColorFormat = "rgba" | "hsla" | "hsba";
|
|
2
|
+
type ColorFormat = "rgba" | "hsla" | "hsba" | "oklab" | "oklch";
|
|
3
3
|
type ColorStringFormat = ColorHexFormat | ColorFormat | "rgb" | "hsl" | "hsb" | "css";
|
|
4
|
-
type ColorChannel = "hue" | "saturation" | "brightness" | "lightness" | "red" | "green" | "blue" | "alpha";
|
|
4
|
+
type ColorChannel = "hue" | "saturation" | "brightness" | "lightness" | "red" | "green" | "blue" | "a" | "b" | "chroma" | "alpha";
|
|
5
5
|
interface Color2DAxes {
|
|
6
6
|
xChannel: ColorChannel;
|
|
7
7
|
yChannel: ColorChannel;
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
type ColorHexFormat = "hex" | "hexa";
|
|
2
|
-
type ColorFormat = "rgba" | "hsla" | "hsba";
|
|
2
|
+
type ColorFormat = "rgba" | "hsla" | "hsba" | "oklab" | "oklch";
|
|
3
3
|
type ColorStringFormat = ColorHexFormat | ColorFormat | "rgb" | "hsl" | "hsb" | "css";
|
|
4
|
-
type ColorChannel = "hue" | "saturation" | "brightness" | "lightness" | "red" | "green" | "blue" | "alpha";
|
|
4
|
+
type ColorChannel = "hue" | "saturation" | "brightness" | "lightness" | "red" | "green" | "blue" | "a" | "b" | "chroma" | "alpha";
|
|
5
5
|
interface Color2DAxes {
|
|
6
6
|
xChannel: ColorChannel;
|
|
7
7
|
yChannel: ColorChannel;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zag-js/color-utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-next.0",
|
|
4
4
|
"description": "Color utilities for zag.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"clean-package": "../../../clean-package.config.json",
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@zag-js/utils": "
|
|
27
|
+
"@zag-js/utils": "2.0.0-next.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"clean-package": "2.2.0"
|