@csstools/convert-colors 1.4.0 → 2.0.1
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/README.md +6 -50
- package/index.js +2 -359
- package/index.js.map +1 -0
- package/index.mjs +2 -0
- package/index.mjs.map +1 -0
- package/package.json +33 -32
- package/CHANGELOG.md +0 -27
- package/index.bundle.js +0 -1091
- package/lib/hsl-hsv.js +0 -30
- package/lib/hwb-hsv.js +0 -31
- package/lib/lab-lch.js +0 -31
- package/lib/lab-xyz.js +0 -68
- package/lib/rgb-hsl.js +0 -50
- package/lib/rgb-hsv.js +0 -47
- package/lib/rgb-hwb.js +0 -32
- package/lib/rgb-xyz.js +0 -42
- package/lib/util.js +0 -87
package/lib/hsl-hsv.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/* Convert between HSL and HSV
|
|
2
|
-
/* ========================================================================== */
|
|
3
|
-
|
|
4
|
-
export function hsl2hsv(hslH, hslS, hslL) {
|
|
5
|
-
const hsv1 = hslS * (hslL < 50 ? hslL : 100 - hslL) / 100;
|
|
6
|
-
const hsvS = hsv1 === 0 ? 0 : 2 * hsv1 / (hslL + hsv1) * 100;
|
|
7
|
-
const hsvV = hslL + hsv1;
|
|
8
|
-
|
|
9
|
-
return [ hslH, hsvS, hsvV ];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function hsv2hsl(hsvH, hsvS, hsvV) {
|
|
13
|
-
const hslL = (200 - hsvS) * hsvV / 100;
|
|
14
|
-
|
|
15
|
-
const [ hslS, hslV ] = [
|
|
16
|
-
hslL === 0 || hslL === 200 ? 0 : hsvS * hsvV / 100 / (hslL <= 100 ? hslL : 200 - hslL) * 100,
|
|
17
|
-
hslL * 5 / 10
|
|
18
|
-
];
|
|
19
|
-
|
|
20
|
-
return [ hsvH, hslS, hslV ];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/*
|
|
24
|
-
|
|
25
|
-
References
|
|
26
|
-
----------
|
|
27
|
-
|
|
28
|
-
- https://gist.github.com/defims/0ca2ef8832833186ed396a2f8a204117
|
|
29
|
-
|
|
30
|
-
/* ========================================================================== */
|
package/lib/hwb-hsv.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/* Convert between HWB and HSV
|
|
2
|
-
/* ========================================================================== */
|
|
3
|
-
|
|
4
|
-
export function hwb2hsv(hwbH, hwbW, hwbB) {
|
|
5
|
-
const [ hsvH, hsvS, hsvV ] = [
|
|
6
|
-
hwbH,
|
|
7
|
-
hwbB === 100 ? 0 : 100 - hwbW / (100 - hwbB) * 100,
|
|
8
|
-
100 - hwbB
|
|
9
|
-
];
|
|
10
|
-
|
|
11
|
-
return [ hsvH, hsvS, hsvV ];
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function hsv2hwb(hsvH, hsvS, hsvV) {
|
|
15
|
-
const [ hwbH, hwbW, hwbB ] = [
|
|
16
|
-
hsvH,
|
|
17
|
-
(100 - hsvS) * hsvV / 100,
|
|
18
|
-
100 - hsvV
|
|
19
|
-
];
|
|
20
|
-
|
|
21
|
-
return [ hwbH, hwbW, hwbB ];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/*
|
|
25
|
-
|
|
26
|
-
References
|
|
27
|
-
----------
|
|
28
|
-
|
|
29
|
-
- https://en.wikipedia.org/wiki/HWB_color_model#Converting_to_and_from_HSV
|
|
30
|
-
|
|
31
|
-
/* ========================================================================== */
|
package/lib/lab-lch.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/* Convert between Lab and XYZ
|
|
2
|
-
/* ========================================================================== */
|
|
3
|
-
|
|
4
|
-
export function lab2lch(labL, labA, labB) {
|
|
5
|
-
const [ lchC, lchH ] = [
|
|
6
|
-
Math.sqrt(Math.pow(labA, 2) + Math.pow(labB, 2)), // convert to chroma
|
|
7
|
-
Math.atan2(labB, labA) * 180 / Math.PI // convert to hue, in degrees
|
|
8
|
-
];
|
|
9
|
-
|
|
10
|
-
return [ labL, lchC, lchH ];
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function lch2lab(lchL, lchC, lchH) {
|
|
14
|
-
// convert to Lab a and b from the polar form
|
|
15
|
-
const [ labA, labB ] = [
|
|
16
|
-
lchC * Math.cos(lchH * Math.PI / 180),
|
|
17
|
-
lchC * Math.sin(lchH * Math.PI / 180)
|
|
18
|
-
];
|
|
19
|
-
|
|
20
|
-
return [ lchL, labA, labB ];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/*
|
|
24
|
-
|
|
25
|
-
References
|
|
26
|
-
----------
|
|
27
|
-
|
|
28
|
-
- https://www.w3.org/TR/css-color-4/#lch-to-lab
|
|
29
|
-
- https://www.w3.org/TR/css-color-4/#color-conversion-code
|
|
30
|
-
|
|
31
|
-
/* ========================================================================== */
|
package/lib/lab-xyz.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { epsilon, kappa, wd50X, wd50Y, wd50Z, matrix } from './util';
|
|
2
|
-
|
|
3
|
-
/* Convert between Lab and XYZ
|
|
4
|
-
/* ========================================================================== */
|
|
5
|
-
|
|
6
|
-
export function lab2xyz(labL, labA, labB) {
|
|
7
|
-
// compute f, starting with the luminance-related term
|
|
8
|
-
const f2 = (labL + 16) / 116;
|
|
9
|
-
const f1 = labA / 500 + f2;
|
|
10
|
-
const f3 = f2 - labB / 200;
|
|
11
|
-
|
|
12
|
-
// compute pre-scaled XYZ
|
|
13
|
-
const [ initX, initY, initZ ] = [
|
|
14
|
-
Math.pow(f1, 3) > epsilon ? Math.pow(f1, 3) : (116 * f1 - 16) / kappa,
|
|
15
|
-
labL > kappa * epsilon ? Math.pow((labL + 16) / 116, 3) : labL / kappa,
|
|
16
|
-
Math.pow(f3, 3) > epsilon ? Math.pow(f3, 3) : (116 * f3 - 16) / kappa
|
|
17
|
-
];
|
|
18
|
-
|
|
19
|
-
const [ xyzX, xyzY, xyzZ ] = matrix(
|
|
20
|
-
// compute XYZ by scaling pre-scaled XYZ by reference white
|
|
21
|
-
[ initX * wd50X, initY * wd50Y, initZ * wd50Z ],
|
|
22
|
-
// calculate D65 XYZ from D50 XYZ
|
|
23
|
-
[
|
|
24
|
-
[ 0.9555766, -0.0230393, 0.0631636],
|
|
25
|
-
[-0.0282895, 1.0099416, 0.0210077],
|
|
26
|
-
[ 0.0122982, -0.0204830, 1.3299098]
|
|
27
|
-
]
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
return [ xyzX, xyzY, xyzZ ];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function xyz2lab(xyzX, xyzY, xyzZ) {
|
|
34
|
-
// calculate D50 XYZ from D65 XYZ
|
|
35
|
-
const [ d50X, d50Y, d50Z ] = matrix([ xyzX, xyzY, xyzZ ], [
|
|
36
|
-
[ 1.0478112, 0.0228866, -0.0501270],
|
|
37
|
-
[ 0.0295424, 0.9904844, -0.0170491],
|
|
38
|
-
[-0.0092345, 0.0150436, 0.7521316]
|
|
39
|
-
]);
|
|
40
|
-
|
|
41
|
-
// calculate f
|
|
42
|
-
const [ f1, f2, f3 ] = [
|
|
43
|
-
d50X / wd50X,
|
|
44
|
-
d50Y / wd50Y,
|
|
45
|
-
d50Z / wd50Z
|
|
46
|
-
].map(
|
|
47
|
-
value => value > epsilon ? Math.cbrt(value) : (kappa * value + 16) / 116
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
const [ labL, labA, labB ] = [
|
|
51
|
-
116 * f2 - 16,
|
|
52
|
-
500 * (f1 - f2),
|
|
53
|
-
200 * (f2 - f3)
|
|
54
|
-
];
|
|
55
|
-
|
|
56
|
-
return [ labL, labA, labB ];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/*
|
|
60
|
-
|
|
61
|
-
References
|
|
62
|
-
----------
|
|
63
|
-
|
|
64
|
-
- https://www.w3.org/TR/css-color-4/#rgb-to-lab
|
|
65
|
-
- https://www.w3.org/TR/css-color-4/#color-conversion-code
|
|
66
|
-
- https://www.easyrgb.com/en/math.php
|
|
67
|
-
|
|
68
|
-
/* ========================================================================== */
|
package/lib/rgb-hsl.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { rgb2hue, rgb2value, rgb2whiteness, hue2rgb } from './util';
|
|
2
|
-
|
|
3
|
-
/* Convert between RGB and HSL
|
|
4
|
-
/* ========================================================================== */
|
|
5
|
-
|
|
6
|
-
export function rgb2hsl(rgbR, rgbG, rgbB, fallbackhue) {
|
|
7
|
-
const hslH = rgb2hue(rgbR, rgbG, rgbB, fallbackhue);
|
|
8
|
-
const hslV = rgb2value(rgbR, rgbG, rgbB);
|
|
9
|
-
const hslW = rgb2whiteness(rgbR, rgbG, rgbB);
|
|
10
|
-
|
|
11
|
-
// calculate value/whiteness delta
|
|
12
|
-
const hslD = hslV - hslW;
|
|
13
|
-
|
|
14
|
-
// calculate lightness
|
|
15
|
-
const hslL = (hslV + hslW) / 2;
|
|
16
|
-
|
|
17
|
-
// calculate saturation
|
|
18
|
-
const hslS = hslD === 0 ? 0 : hslD / (100 - Math.abs(2 * hslL - 100)) * 100;
|
|
19
|
-
|
|
20
|
-
return [ hslH, hslS, hslL ];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function hsl2rgb(hslH, hslS, hslL) {
|
|
24
|
-
// calcuate t2
|
|
25
|
-
const t2 = hslL <= 50 ? hslL * (hslS + 100) / 100 : hslL + hslS - hslL * hslS / 100;
|
|
26
|
-
|
|
27
|
-
// calcuate t1
|
|
28
|
-
const t1 = hslL * 2 - t2;
|
|
29
|
-
|
|
30
|
-
// calculate rgb
|
|
31
|
-
const [ rgbR, rgbG, rgbB ] = [
|
|
32
|
-
hue2rgb(t1, t2, hslH + 120),
|
|
33
|
-
hue2rgb(t1, t2, hslH),
|
|
34
|
-
hue2rgb(t1, t2, hslH - 120)
|
|
35
|
-
];
|
|
36
|
-
|
|
37
|
-
return [ rgbR, rgbG, rgbB ];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/*
|
|
41
|
-
|
|
42
|
-
References
|
|
43
|
-
----------
|
|
44
|
-
|
|
45
|
-
- https://www.w3.org/TR/css-color-3/#hsl-color
|
|
46
|
-
- https://www.w3.org/TR/css-color-4/#hsl-to-rgb
|
|
47
|
-
- https://www.rapidtables.com/convert/color/rgb-to-hsl.html
|
|
48
|
-
- https://www.rapidtables.com/convert/color/hsl-to-rgb.html
|
|
49
|
-
|
|
50
|
-
/* ========================================================================== */
|
package/lib/rgb-hsv.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { rgb2value, rgb2whiteness, rgb2hue } from './util';
|
|
2
|
-
|
|
3
|
-
/* Convert between RGB and HSV
|
|
4
|
-
/* ========================================================================== */
|
|
5
|
-
|
|
6
|
-
export function rgb2hsv(rgbR, rgbG, rgbB, fallbackhue) {
|
|
7
|
-
const hsvV = rgb2value(rgbR, rgbG, rgbB);
|
|
8
|
-
const hsvW = rgb2whiteness(rgbR, rgbG, rgbB);
|
|
9
|
-
const hsvH = rgb2hue(rgbR, rgbG, rgbB, fallbackhue);
|
|
10
|
-
|
|
11
|
-
// calculate saturation
|
|
12
|
-
const hsvS = hsvV === hsvW ? 0 : (hsvV - hsvW) / hsvV * 100;
|
|
13
|
-
|
|
14
|
-
return [ hsvH, hsvS, hsvV ];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function hsv2rgb(hsvH, hsvS, hsvV) {
|
|
18
|
-
const rgbI = Math.floor(hsvH / 60);
|
|
19
|
-
|
|
20
|
-
// calculate rgb parts
|
|
21
|
-
const rgbF = hsvH / 60 - rgbI & 1 ? hsvH / 60 - rgbI : 1 - hsvH / 60 - rgbI;
|
|
22
|
-
const rgbM = hsvV * (100 - hsvS) / 100;
|
|
23
|
-
const rgbN = hsvV * (100 - hsvS * rgbF) / 100;
|
|
24
|
-
|
|
25
|
-
const [ rgbR, rgbG, rgbB ] = rgbI === 5
|
|
26
|
-
? [ hsvV, rgbM, rgbN ]
|
|
27
|
-
: rgbI === 4
|
|
28
|
-
? [ rgbN, rgbM, hsvV ]
|
|
29
|
-
: rgbI === 3
|
|
30
|
-
? [ rgbM, rgbN, hsvV ]
|
|
31
|
-
: rgbI === 2
|
|
32
|
-
? [ rgbM, hsvV, rgbN ]
|
|
33
|
-
: rgbI === 1
|
|
34
|
-
? [ rgbN, hsvV, rgbM ]
|
|
35
|
-
: [ hsvV, rgbN, rgbM ];
|
|
36
|
-
|
|
37
|
-
return [ rgbR, rgbG, rgbB ];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/*
|
|
41
|
-
|
|
42
|
-
References
|
|
43
|
-
----------
|
|
44
|
-
|
|
45
|
-
- http://alvyray.com/Papers/CG/hsv2rgb.htm
|
|
46
|
-
|
|
47
|
-
/* ========================================================================== */
|
package/lib/rgb-hwb.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { rgb2hue, rgb2whiteness, rgb2value } from './util';
|
|
2
|
-
import { hsl2rgb } from './rgb-hsl';
|
|
3
|
-
|
|
4
|
-
/* Convert between RGB and HWB
|
|
5
|
-
/* ========================================================================== */
|
|
6
|
-
|
|
7
|
-
export function rgb2hwb(rgbR, rgbG, rgbB, fallbackhue) {
|
|
8
|
-
const hwbH = rgb2hue(rgbR, rgbG, rgbB, fallbackhue);
|
|
9
|
-
const hwbW = rgb2whiteness(rgbR, rgbG, rgbB);
|
|
10
|
-
const hwbV = rgb2value(rgbR, rgbG, rgbB);
|
|
11
|
-
const hwbB = 100 - hwbV;
|
|
12
|
-
|
|
13
|
-
return [hwbH, hwbW, hwbB];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function hwb2rgb(hwbH, hwbW, hwbB, fallbackhue) {
|
|
17
|
-
const [ rgbR, rgbG, rgbB ] = hsl2rgb(hwbH, 100, 50, fallbackhue).map(
|
|
18
|
-
v => v * (100 - hwbW - hwbB) / 100 + hwbW
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
return [ rgbR, rgbG, rgbB ];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/*
|
|
25
|
-
|
|
26
|
-
References
|
|
27
|
-
----------
|
|
28
|
-
|
|
29
|
-
- https://www.w3.org/TR/css-color-4/#hwb-to-rgb
|
|
30
|
-
- http://alvyray.com/Papers/CG/hwb2rgb.htm
|
|
31
|
-
|
|
32
|
-
/* ========================================================================== */
|
package/lib/rgb-xyz.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { matrix } from './util';
|
|
2
|
-
|
|
3
|
-
/* Convert between RGB and XYZ
|
|
4
|
-
/* ========================================================================== */
|
|
5
|
-
|
|
6
|
-
export function rgb2xyz(rgbR, rgbG, rgbB) {
|
|
7
|
-
const [ lrgbR, lrgbB, lrgbG ] = [ rgbR, rgbG, rgbB ].map(
|
|
8
|
-
v => v > 4.045 ? Math.pow((v + 5.5) / 105.5, 2.4) * 100 : v / 12.92
|
|
9
|
-
);
|
|
10
|
-
|
|
11
|
-
const [ xyzX, xyzY, xyzZ ] = matrix([ lrgbR, lrgbB, lrgbG ], [
|
|
12
|
-
[0.4124564, 0.3575761, 0.1804375],
|
|
13
|
-
[0.2126729, 0.7151522, 0.0721750],
|
|
14
|
-
[0.0193339, 0.1191920, 0.9503041]
|
|
15
|
-
]);
|
|
16
|
-
|
|
17
|
-
return [ xyzX, xyzY, xyzZ ];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function xyz2rgb(xyzX, xyzY, xyzZ) {
|
|
21
|
-
const [ lrgbR, lrgbB, lrgbG ] = matrix([ xyzX, xyzY, xyzZ ], [
|
|
22
|
-
[ 3.2404542, -1.5371385, -0.4985314],
|
|
23
|
-
[-0.9692660, 1.8760108, 0.0415560],
|
|
24
|
-
[ 0.0556434, -0.2040259, 1.0572252]
|
|
25
|
-
]);
|
|
26
|
-
|
|
27
|
-
const [ rgbR, rgbG, rgbB ] = [ lrgbR, lrgbB, lrgbG ].map(
|
|
28
|
-
v => v > 0.31308 ? 1.055 * Math.pow(v / 100, 1 / 2.4) * 100 - 5.5 : 12.92 * v
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
return [ rgbR, rgbG, rgbB ];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/*
|
|
35
|
-
|
|
36
|
-
References
|
|
37
|
-
----------
|
|
38
|
-
|
|
39
|
-
- https://www.w3.org/TR/css-color-4/#rgb-to-lab
|
|
40
|
-
- https://www.w3.org/TR/css-color-4/#color-conversion-code
|
|
41
|
-
|
|
42
|
-
/* ========================================================================== */
|
package/lib/util.js
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/* Convert between RGB and Hue
|
|
2
|
-
/* ========================================================================== */
|
|
3
|
-
|
|
4
|
-
export function rgb2hue(rgbR, rgbG, rgbB, fallbackhue = 0) {
|
|
5
|
-
const value = rgb2value(rgbR, rgbG, rgbB);
|
|
6
|
-
const whiteness = rgb2whiteness(rgbR, rgbG, rgbB);
|
|
7
|
-
const delta = value - whiteness;
|
|
8
|
-
|
|
9
|
-
if (delta) {
|
|
10
|
-
// calculate segment
|
|
11
|
-
const segment = value === rgbR
|
|
12
|
-
? (rgbG - rgbB) / delta
|
|
13
|
-
: value === rgbG
|
|
14
|
-
? (rgbB - rgbR) / delta
|
|
15
|
-
: (rgbR - rgbG) / delta;
|
|
16
|
-
|
|
17
|
-
// calculate shift
|
|
18
|
-
const shift = value === rgbR
|
|
19
|
-
? segment < 0
|
|
20
|
-
? 360 / 60
|
|
21
|
-
: 0 / 60
|
|
22
|
-
: value === rgbG
|
|
23
|
-
? 120 / 60
|
|
24
|
-
: 240 / 60;
|
|
25
|
-
|
|
26
|
-
// calculate hue
|
|
27
|
-
const hue = (segment + shift) * 60;
|
|
28
|
-
|
|
29
|
-
return hue;
|
|
30
|
-
} else {
|
|
31
|
-
// otherwise return the fallback hue
|
|
32
|
-
return fallbackhue;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function hue2rgb(t1, t2, hue) {
|
|
37
|
-
// calculate the ranged hue
|
|
38
|
-
const rhue = hue < 0 ? hue + 360 : hue > 360 ? hue - 360 : hue;
|
|
39
|
-
|
|
40
|
-
// calculate the rgb value
|
|
41
|
-
const rgb = rhue * 6 < 360
|
|
42
|
-
? t1 + (t2 - t1) * rhue / 60
|
|
43
|
-
: rhue * 2 < 360
|
|
44
|
-
? t2
|
|
45
|
-
: rhue * 3 < 720
|
|
46
|
-
? t1 + (t2 - t1) * (240 - rhue) / 60
|
|
47
|
-
: t1;
|
|
48
|
-
|
|
49
|
-
return rgb;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/* RGB tooling
|
|
53
|
-
/* ========================================================================== */
|
|
54
|
-
|
|
55
|
-
export function rgb2value(rgbR, rgbG, rgbB) {
|
|
56
|
-
const value = Math.max(rgbR, rgbG, rgbB);
|
|
57
|
-
|
|
58
|
-
return value;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export function rgb2whiteness(rgbR, rgbG, rgbB) {
|
|
62
|
-
const whiteness = Math.min(rgbR, rgbG, rgbB);
|
|
63
|
-
|
|
64
|
-
return whiteness;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/* Math matrix
|
|
68
|
-
/* ========================================================================== */
|
|
69
|
-
|
|
70
|
-
export function matrix(params, mats) {
|
|
71
|
-
return mats.map(mat => mat.reduce((acc, value, index) => acc + params[index] * value, 0));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/* D50 reference white
|
|
75
|
-
/* ========================================================================== */
|
|
76
|
-
|
|
77
|
-
export const [ wd50X, wd50Y, wd50Z ] = [ 96.42, 100, 82.49 ];
|
|
78
|
-
|
|
79
|
-
/* Epsilon
|
|
80
|
-
/* ========================================================================== */
|
|
81
|
-
|
|
82
|
-
export const epsilon = Math.pow(6, 3) / Math.pow(29, 3);
|
|
83
|
-
|
|
84
|
-
/* Kappa
|
|
85
|
-
/* ========================================================================== */
|
|
86
|
-
|
|
87
|
-
export const kappa = Math.pow(29, 3) / Math.pow(3, 3);
|