chromonym 1.0.1 → 1.2.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/NOTICE.md +39 -0
- package/README.md +240 -3
- package/dist/colorspaces/index.d.ts +4 -0
- package/dist/colorspaces/index.d.ts.map +1 -0
- package/dist/colorspaces/index.js +4 -0
- package/dist/colorspaces/index.js.map +1 -0
- package/dist/colorspaces/pantone.d.ts +919 -0
- package/dist/colorspaces/pantone.d.ts.map +1 -0
- package/dist/colorspaces/pantone.js +918 -0
- package/dist/colorspaces/pantone.js.map +1 -0
- package/dist/colorspaces/registry.d.ts +26 -0
- package/dist/colorspaces/registry.d.ts.map +1 -0
- package/dist/colorspaces/registry.js +36 -0
- package/dist/colorspaces/registry.js.map +1 -0
- package/dist/colorspaces/web.d.ts +156 -0
- package/dist/colorspaces/web.d.ts.map +1 -0
- package/dist/colorspaces/web.js +155 -0
- package/dist/colorspaces/web.js.map +1 -0
- package/dist/colorspaces/x11.d.ts +667 -0
- package/dist/colorspaces/x11.d.ts.map +1 -0
- package/dist/colorspaces/x11.js +666 -0
- package/dist/colorspaces/x11.js.map +1 -0
- package/dist/conversions/hex.d.ts +13 -0
- package/dist/conversions/hex.d.ts.map +1 -0
- package/dist/conversions/hex.js +40 -0
- package/dist/conversions/hex.js.map +1 -0
- package/dist/conversions/hsl.d.ts +12 -0
- package/dist/conversions/hsl.d.ts.map +1 -0
- package/dist/conversions/hsl.js +72 -0
- package/dist/conversions/hsl.js.map +1 -0
- package/dist/conversions/hsv.d.ts +12 -0
- package/dist/conversions/hsv.d.ts.map +1 -0
- package/dist/conversions/hsv.js +67 -0
- package/dist/conversions/hsv.js.map +1 -0
- package/dist/conversions/index.d.ts +6 -0
- package/dist/conversions/index.d.ts.map +1 -0
- package/dist/conversions/index.js +6 -0
- package/dist/conversions/index.js.map +1 -0
- package/dist/conversions/pantone.d.ts +17 -0
- package/dist/conversions/pantone.d.ts.map +1 -0
- package/dist/conversions/pantone.js +27 -0
- package/dist/conversions/pantone.js.map +1 -0
- package/dist/conversions/rgb.d.ts +15 -0
- package/dist/conversions/rgb.d.ts.map +1 -0
- package/dist/conversions/rgb.js +57 -0
- package/dist/conversions/rgb.js.map +1 -0
- package/dist/convert.d.ts +21 -0
- package/dist/convert.d.ts.map +1 -0
- package/dist/convert.js +69 -0
- package/dist/convert.js.map +1 -0
- package/dist/detectFormat.d.ts +17 -0
- package/dist/detectFormat.d.ts.map +1 -0
- package/dist/detectFormat.js +59 -0
- package/dist/detectFormat.js.map +1 -0
- package/dist/identify.d.ts +20 -0
- package/dist/identify.d.ts.map +1 -0
- package/dist/identify.js +29 -0
- package/dist/identify.js.map +1 -0
- package/dist/index.d.ts +14 -337
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -267
- package/dist/index.js.map +1 -1
- package/dist/indexing.d.ts +44 -0
- package/dist/indexing.d.ts.map +1 -0
- package/dist/indexing.js +140 -0
- package/dist/indexing.js.map +1 -0
- package/dist/math/clamp.d.ts +11 -0
- package/dist/math/clamp.d.ts.map +1 -0
- package/dist/math/clamp.js +18 -0
- package/dist/math/clamp.js.map +1 -0
- package/dist/math/colorSpace.d.ts +39 -0
- package/dist/math/colorSpace.d.ts.map +1 -0
- package/dist/math/colorSpace.js +85 -0
- package/dist/math/colorSpace.js.map +1 -0
- package/dist/math/deltaE.d.ts +47 -0
- package/dist/math/deltaE.d.ts.map +1 -0
- package/dist/math/deltaE.js +185 -0
- package/dist/math/deltaE.js.map +1 -0
- package/dist/math/euclideanDistance.d.ts +16 -0
- package/dist/math/euclideanDistance.d.ts.map +1 -0
- package/dist/math/euclideanDistance.js +22 -0
- package/dist/math/euclideanDistance.js.map +1 -0
- package/dist/math/hueSector.d.ts +15 -0
- package/dist/math/hueSector.d.ts.map +1 -0
- package/dist/math/hueSector.js +27 -0
- package/dist/math/hueSector.js.map +1 -0
- package/dist/resolve.d.ts +14 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +26 -0
- package/dist/resolve.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +69 -5
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HexColor, Rgba } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a hex color string into the canonical Rgba representation.
|
|
4
|
+
* Accepts 3-digit (`#rgb`), 6-digit (`#rrggbb`), and 8-digit (`#rrggbbaa`).
|
|
5
|
+
* Throws on any other input shape.
|
|
6
|
+
*/
|
|
7
|
+
export declare function hexToRgba(hex: HexColor): Rgba;
|
|
8
|
+
/**
|
|
9
|
+
* Emit a 6-digit lowercase hex string. Alpha is dropped; out-of-range
|
|
10
|
+
* channel values are clamped to 0..255; fractional values are rounded.
|
|
11
|
+
*/
|
|
12
|
+
export declare function rgbaToHex(rgba: Rgba): HexColor;
|
|
13
|
+
//# sourceMappingURL=hex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex.d.ts","sourceRoot":"","sources":["../../src/conversions/hex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAsB7C;AAMD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAE9C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { HEX_RE } from '../detectFormat';
|
|
2
|
+
import { clamp } from '../math/clamp';
|
|
3
|
+
/**
|
|
4
|
+
* Parse a hex color string into the canonical Rgba representation.
|
|
5
|
+
* Accepts 3-digit (`#rgb`), 6-digit (`#rrggbb`), and 8-digit (`#rrggbbaa`).
|
|
6
|
+
* Throws on any other input shape.
|
|
7
|
+
*/
|
|
8
|
+
export function hexToRgba(hex) {
|
|
9
|
+
const match = HEX_RE.exec(hex);
|
|
10
|
+
const body = match?.[1];
|
|
11
|
+
if (!body)
|
|
12
|
+
throw new Error(`Invalid hex color: ${hex}`);
|
|
13
|
+
if (body.length === 3) {
|
|
14
|
+
const r = body.charAt(0);
|
|
15
|
+
const g = body.charAt(1);
|
|
16
|
+
const b = body.charAt(2);
|
|
17
|
+
return {
|
|
18
|
+
r: parseInt(r + r, 16),
|
|
19
|
+
g: parseInt(g + g, 16),
|
|
20
|
+
b: parseInt(b + b, 16),
|
|
21
|
+
a: 1,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const r = parseInt(body.slice(0, 2), 16);
|
|
25
|
+
const g = parseInt(body.slice(2, 4), 16);
|
|
26
|
+
const b = parseInt(body.slice(4, 6), 16);
|
|
27
|
+
const a = body.length === 8 ? parseInt(body.slice(6, 8), 16) / 255 : 1;
|
|
28
|
+
return { r, g, b, a };
|
|
29
|
+
}
|
|
30
|
+
function channelToHex(n) {
|
|
31
|
+
return clamp(Math.round(n), 0, 255).toString(16).padStart(2, '0');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Emit a 6-digit lowercase hex string. Alpha is dropped; out-of-range
|
|
35
|
+
* channel values are clamped to 0..255; fractional values are rounded.
|
|
36
|
+
*/
|
|
37
|
+
export function rgbaToHex(rgba) {
|
|
38
|
+
return `#${channelToHex(rgba.r)}${channelToHex(rgba.g)}${channelToHex(rgba.b)}`;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=hex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex.js","sourceRoot":"","sources":["../../src/conversions/hex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAa;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO;YACL,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACtB,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACtB,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACtB,CAAC,EAAE,CAAC;SACL,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAU;IAClC,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAc,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HslInput, HslString, Rgba } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Parse HSL input (string or object) into canonical Rgba.
|
|
4
|
+
* Hue wraps modulo 360; saturation and lightness are 0..100 percent.
|
|
5
|
+
*/
|
|
6
|
+
export declare function hslToRgba(input: HslInput): Rgba;
|
|
7
|
+
/**
|
|
8
|
+
* Emit an `hsl(h, s%, l%)` string from Rgba. Alpha is dropped; all
|
|
9
|
+
* three components are rounded to whole numbers.
|
|
10
|
+
*/
|
|
11
|
+
export declare function rgbaToHsl(rgba: Rgba): HslString;
|
|
12
|
+
//# sourceMappingURL=hsl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hsl.d.ts","sourceRoot":"","sources":["../../src/conversions/hsl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAK1D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAqC/C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAyB/C"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { requireFinite } from '../math/clamp';
|
|
2
|
+
import { hueSectorToPrime } from '../math/hueSector';
|
|
3
|
+
const HSL_RE = /^hsl\s*\(\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)%?\s*,\s*(-?\d+(?:\.\d+)?)%?\s*\)$/i;
|
|
4
|
+
/**
|
|
5
|
+
* Parse HSL input (string or object) into canonical Rgba.
|
|
6
|
+
* Hue wraps modulo 360; saturation and lightness are 0..100 percent.
|
|
7
|
+
*/
|
|
8
|
+
export function hslToRgba(input) {
|
|
9
|
+
let h;
|
|
10
|
+
let s;
|
|
11
|
+
let l;
|
|
12
|
+
if (typeof input === 'string') {
|
|
13
|
+
const match = HSL_RE.exec(input);
|
|
14
|
+
if (!match)
|
|
15
|
+
throw new Error(`Invalid hsl string: ${input}`);
|
|
16
|
+
h = Number(match[1]);
|
|
17
|
+
s = Number(match[2]);
|
|
18
|
+
l = Number(match[3]);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
h = requireFinite(input.h, 'h');
|
|
22
|
+
s = requireFinite(input.s, 's');
|
|
23
|
+
l = requireFinite(input.l, 'l');
|
|
24
|
+
}
|
|
25
|
+
const saturation = s / 100;
|
|
26
|
+
const lightness = l / 100;
|
|
27
|
+
if (saturation === 0) {
|
|
28
|
+
const gray = Math.round(lightness * 255);
|
|
29
|
+
return { r: gray, g: gray, b: gray, a: 1 };
|
|
30
|
+
}
|
|
31
|
+
const chroma = (1 - Math.abs(2 * lightness - 1)) * saturation;
|
|
32
|
+
const hueSector = (((h % 360) + 360) % 360) / 60;
|
|
33
|
+
const secondary = chroma * (1 - Math.abs((hueSector % 2) - 1));
|
|
34
|
+
const lightnessOffset = lightness - chroma / 2;
|
|
35
|
+
const [rPrime, gPrime, bPrime] = hueSectorToPrime(hueSector, chroma, secondary);
|
|
36
|
+
return {
|
|
37
|
+
r: Math.round((rPrime + lightnessOffset) * 255),
|
|
38
|
+
g: Math.round((gPrime + lightnessOffset) * 255),
|
|
39
|
+
b: Math.round((bPrime + lightnessOffset) * 255),
|
|
40
|
+
a: 1,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Emit an `hsl(h, s%, l%)` string from Rgba. Alpha is dropped; all
|
|
45
|
+
* three components are rounded to whole numbers.
|
|
46
|
+
*/
|
|
47
|
+
export function rgbaToHsl(rgba) {
|
|
48
|
+
const rNorm = rgba.r / 255;
|
|
49
|
+
const gNorm = rgba.g / 255;
|
|
50
|
+
const bNorm = rgba.b / 255;
|
|
51
|
+
const max = Math.max(rNorm, gNorm, bNorm);
|
|
52
|
+
const min = Math.min(rNorm, gNorm, bNorm);
|
|
53
|
+
const lightness = (max + min) / 2;
|
|
54
|
+
if (max === min) {
|
|
55
|
+
return `hsl(0, 0%, ${Math.round(lightness * 100)}%)`;
|
|
56
|
+
}
|
|
57
|
+
const delta = max - min;
|
|
58
|
+
const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);
|
|
59
|
+
let hue;
|
|
60
|
+
if (max === rNorm) {
|
|
61
|
+
hue = (gNorm - bNorm) / delta + (gNorm < bNorm ? 6 : 0);
|
|
62
|
+
}
|
|
63
|
+
else if (max === gNorm) {
|
|
64
|
+
hue = (bNorm - rNorm) / delta + 2;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
hue = (rNorm - gNorm) / delta + 4;
|
|
68
|
+
}
|
|
69
|
+
hue *= 60;
|
|
70
|
+
return `hsl(${Math.round(hue)}, ${Math.round(saturation * 100)}%, ${Math.round(lightness * 100)}%)`;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=hsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hsl.js","sourceRoot":"","sources":["../../src/conversions/hsl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HsvInput, HsvString, Rgba } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Parse HSV input (string or object) into canonical Rgba.
|
|
4
|
+
* Hue wraps modulo 360; saturation and value are 0..100 percent.
|
|
5
|
+
*/
|
|
6
|
+
export declare function hsvToRgba(input: HsvInput): Rgba;
|
|
7
|
+
/**
|
|
8
|
+
* Emit an `hsv(h, s%, v%)` string from Rgba. Alpha is dropped; all
|
|
9
|
+
* three components are rounded to whole numbers.
|
|
10
|
+
*/
|
|
11
|
+
export declare function rgbaToHsv(rgba: Rgba): HsvString;
|
|
12
|
+
//# sourceMappingURL=hsv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hsv.d.ts","sourceRoot":"","sources":["../../src/conversions/hsv.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAK1D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CA+B/C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAuB/C"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { requireFinite } from '../math/clamp';
|
|
2
|
+
import { hueSectorToPrime } from '../math/hueSector';
|
|
3
|
+
const HSV_RE = /^hsv\s*\(\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)%?\s*,\s*(-?\d+(?:\.\d+)?)%?\s*\)$/i;
|
|
4
|
+
/**
|
|
5
|
+
* Parse HSV input (string or object) into canonical Rgba.
|
|
6
|
+
* Hue wraps modulo 360; saturation and value are 0..100 percent.
|
|
7
|
+
*/
|
|
8
|
+
export function hsvToRgba(input) {
|
|
9
|
+
let h;
|
|
10
|
+
let s;
|
|
11
|
+
let v;
|
|
12
|
+
if (typeof input === 'string') {
|
|
13
|
+
const match = HSV_RE.exec(input);
|
|
14
|
+
if (!match)
|
|
15
|
+
throw new Error(`Invalid hsv string: ${input}`);
|
|
16
|
+
h = Number(match[1]);
|
|
17
|
+
s = Number(match[2]);
|
|
18
|
+
v = Number(match[3]);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
h = requireFinite(input.h, 'h');
|
|
22
|
+
s = requireFinite(input.s, 's');
|
|
23
|
+
v = requireFinite(input.v, 'v');
|
|
24
|
+
}
|
|
25
|
+
const saturation = s / 100;
|
|
26
|
+
const value = v / 100;
|
|
27
|
+
const chroma = value * saturation;
|
|
28
|
+
const hueSector = (((h % 360) + 360) % 360) / 60;
|
|
29
|
+
const secondary = chroma * (1 - Math.abs((hueSector % 2) - 1));
|
|
30
|
+
const valueOffset = value - chroma;
|
|
31
|
+
const [rPrime, gPrime, bPrime] = hueSectorToPrime(hueSector, chroma, secondary);
|
|
32
|
+
return {
|
|
33
|
+
r: Math.round((rPrime + valueOffset) * 255),
|
|
34
|
+
g: Math.round((gPrime + valueOffset) * 255),
|
|
35
|
+
b: Math.round((bPrime + valueOffset) * 255),
|
|
36
|
+
a: 1,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Emit an `hsv(h, s%, v%)` string from Rgba. Alpha is dropped; all
|
|
41
|
+
* three components are rounded to whole numbers.
|
|
42
|
+
*/
|
|
43
|
+
export function rgbaToHsv(rgba) {
|
|
44
|
+
const rNorm = rgba.r / 255;
|
|
45
|
+
const gNorm = rgba.g / 255;
|
|
46
|
+
const bNorm = rgba.b / 255;
|
|
47
|
+
const max = Math.max(rNorm, gNorm, bNorm);
|
|
48
|
+
const min = Math.min(rNorm, gNorm, bNorm);
|
|
49
|
+
const delta = max - min;
|
|
50
|
+
const value = max;
|
|
51
|
+
const saturation = max === 0 ? 0 : delta / max;
|
|
52
|
+
let hue = 0;
|
|
53
|
+
if (delta !== 0) {
|
|
54
|
+
if (max === rNorm) {
|
|
55
|
+
hue = (gNorm - bNorm) / delta + (gNorm < bNorm ? 6 : 0);
|
|
56
|
+
}
|
|
57
|
+
else if (max === gNorm) {
|
|
58
|
+
hue = (bNorm - rNorm) / delta + 2;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
hue = (rNorm - gNorm) / delta + 4;
|
|
62
|
+
}
|
|
63
|
+
hue *= 60;
|
|
64
|
+
}
|
|
65
|
+
return `hsv(${Math.round(hue)}, ${Math.round(saturation * 100)}%, ${Math.round(value * 100)}%)`;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=hsv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hsv.js","sourceRoot":"","sources":["../../src/conversions/hsv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { hexToRgba, rgbaToHex } from './hex';
|
|
2
|
+
export { hslToRgba, rgbaToHsl } from './hsl';
|
|
3
|
+
export { hsvToRgba, rgbaToHsv } from './hsv';
|
|
4
|
+
export { pantoneToRgba, rgbaToPantone } from './pantone';
|
|
5
|
+
export { rgbaToRgb, rgbToRgba } from './rgb';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { hexToRgba, rgbaToHex } from './hex';
|
|
2
|
+
export { hslToRgba, rgbaToHsl } from './hsl';
|
|
3
|
+
export { hsvToRgba, rgbaToHsv } from './hsv';
|
|
4
|
+
export { pantoneToRgba, rgbaToPantone } from './pantone';
|
|
5
|
+
export { rgbaToRgb, rgbToRgba } from './rgb';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conversions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PantoneCode, Rgba } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a Pantone code to Rgba.
|
|
4
|
+
* Accepts any casing, spacing, and common prefixes ("PMS", "Pantone")
|
|
5
|
+
* since non-alphanumeric characters are stripped before lookup.
|
|
6
|
+
* Throws on unknown codes.
|
|
7
|
+
*/
|
|
8
|
+
export declare function pantoneToRgba(code: PantoneCode): Rgba;
|
|
9
|
+
/**
|
|
10
|
+
* Find the nearest Pantone Coated code to the given Rgba. Uses ΔE*00
|
|
11
|
+
* (CIEDE2000) — the industry-standard perceptual metric — by default, since
|
|
12
|
+
* Pantone values cluster densely in the saturated blue/purple region where
|
|
13
|
+
* sRGB Euclidean distance gives visually wrong answers.
|
|
14
|
+
* Alpha is ignored. Always returns a code.
|
|
15
|
+
*/
|
|
16
|
+
export declare function rgbaToPantone(rgba: Rgba): PantoneCode;
|
|
17
|
+
//# sourceMappingURL=pantone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pantone.d.ts","sourceRoot":"","sources":["../../src/conversions/pantone.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,WAAW,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAG5D;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAKrD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAErD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { pantone } from '../colorspaces/pantone';
|
|
2
|
+
import { getNameIndex, nearest, pantoneNormalize } from '../indexing';
|
|
3
|
+
import { hexToRgba } from './hex';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve a Pantone code to Rgba.
|
|
6
|
+
* Accepts any casing, spacing, and common prefixes ("PMS", "Pantone")
|
|
7
|
+
* since non-alphanumeric characters are stripped before lookup.
|
|
8
|
+
* Throws on unknown codes.
|
|
9
|
+
*/
|
|
10
|
+
export function pantoneToRgba(code) {
|
|
11
|
+
const canonical = getNameIndex(pantone, pantoneNormalize).get(pantoneNormalize(code));
|
|
12
|
+
if (canonical === undefined)
|
|
13
|
+
throw new Error(`Unknown Pantone code: ${code}`);
|
|
14
|
+
const hex = pantone[canonical];
|
|
15
|
+
return hexToRgba(hex);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Find the nearest Pantone Coated code to the given Rgba. Uses ΔE*00
|
|
19
|
+
* (CIEDE2000) — the industry-standard perceptual metric — by default, since
|
|
20
|
+
* Pantone values cluster densely in the saturated blue/purple region where
|
|
21
|
+
* sRGB Euclidean distance gives visually wrong answers.
|
|
22
|
+
* Alpha is ignored. Always returns a code.
|
|
23
|
+
*/
|
|
24
|
+
export function rgbaToPantone(rgba) {
|
|
25
|
+
return nearest(rgba, pantone, 'deltaE2000');
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=pantone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pantone.js","sourceRoot":"","sources":["../../src/conversions/pantone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACtF,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,OAAO,CAAC,SAAiC,CAAC,CAAC;IACvD,OAAO,SAAS,CAAC,GAAe,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAAU;IACtC,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAgB,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Rgba, RgbaInput, RgbInput, RgbString } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Normalize any RGB/RGBA input shape (string, tuple, or object) into
|
|
4
|
+
* the canonical Rgba representation. Alpha defaults to 1 when absent.
|
|
5
|
+
* Rejects non-finite numeric inputs; clamps r/g/b to [0,255] and a to [0,1].
|
|
6
|
+
* Throws on malformed strings.
|
|
7
|
+
*/
|
|
8
|
+
export declare function rgbToRgba(input: RgbInput | RgbaInput): Rgba;
|
|
9
|
+
/**
|
|
10
|
+
* Emit an `rgb(r, g, b)` string. Alpha is dropped; values are
|
|
11
|
+
* already-clamped by rgbToRgba, but we re-clamp defensively for direct
|
|
12
|
+
* Rgba-object callers who bypass the input normalizer.
|
|
13
|
+
*/
|
|
14
|
+
export declare function rgbaToRgb(rgba: Rgba): RgbString;
|
|
15
|
+
//# sourceMappingURL=rgb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgb.d.ts","sourceRoot":"","sources":["../../src/conversions/rgb.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAa,SAAS,EAAE,MAAM,UAAU,CAAC;AAahF;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CA+B3D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAK/C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { clamp, requireFinite } from '../math/clamp';
|
|
2
|
+
const RGB_RE = /^rgba?\s*\(\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*(?:,\s*(\d*\.?\d+)\s*)?\)$/i;
|
|
3
|
+
function sanitizeChannel(n, label) {
|
|
4
|
+
return clamp(requireFinite(n, label), 0, 255);
|
|
5
|
+
}
|
|
6
|
+
function sanitizeAlpha(n) {
|
|
7
|
+
return clamp(requireFinite(n, 'alpha'), 0, 1);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Normalize any RGB/RGBA input shape (string, tuple, or object) into
|
|
11
|
+
* the canonical Rgba representation. Alpha defaults to 1 when absent.
|
|
12
|
+
* Rejects non-finite numeric inputs; clamps r/g/b to [0,255] and a to [0,1].
|
|
13
|
+
* Throws on malformed strings.
|
|
14
|
+
*/
|
|
15
|
+
export function rgbToRgba(input) {
|
|
16
|
+
if (Array.isArray(input)) {
|
|
17
|
+
const rawA = input.length === 4 ? input[3] : 1;
|
|
18
|
+
return {
|
|
19
|
+
r: sanitizeChannel(input[0], 'r'),
|
|
20
|
+
g: sanitizeChannel(input[1], 'g'),
|
|
21
|
+
b: sanitizeChannel(input[2], 'b'),
|
|
22
|
+
a: sanitizeAlpha(rawA),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (typeof input === 'string') {
|
|
26
|
+
const match = RGB_RE.exec(input);
|
|
27
|
+
if (!match)
|
|
28
|
+
throw new Error(`Invalid rgb(a) string: ${input}`);
|
|
29
|
+
return {
|
|
30
|
+
r: sanitizeChannel(Number(match[1]), 'r'),
|
|
31
|
+
g: sanitizeChannel(Number(match[2]), 'g'),
|
|
32
|
+
b: sanitizeChannel(Number(match[3]), 'b'),
|
|
33
|
+
a: sanitizeAlpha(match[4] !== undefined ? Number(match[4]) : 1),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// Object form — TypeScript's Array.isArray narrowing doesn't exclude
|
|
37
|
+
// readonly tuple types from the union, so cast after the guards.
|
|
38
|
+
const obj = input;
|
|
39
|
+
return {
|
|
40
|
+
r: sanitizeChannel(obj.r, 'r'),
|
|
41
|
+
g: sanitizeChannel(obj.g, 'g'),
|
|
42
|
+
b: sanitizeChannel(obj.b, 'b'),
|
|
43
|
+
a: sanitizeAlpha('a' in obj ? obj.a : 1),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Emit an `rgb(r, g, b)` string. Alpha is dropped; values are
|
|
48
|
+
* already-clamped by rgbToRgba, but we re-clamp defensively for direct
|
|
49
|
+
* Rgba-object callers who bypass the input normalizer.
|
|
50
|
+
*/
|
|
51
|
+
export function rgbaToRgb(rgba) {
|
|
52
|
+
const r = clamp(Math.round(rgba.r), 0, 255);
|
|
53
|
+
const g = clamp(Math.round(rgba.g), 0, 255);
|
|
54
|
+
const b = clamp(Math.round(rgba.b), 0, 255);
|
|
55
|
+
return `rgb(${r}, ${g}, ${b})`;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=rgb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgb.js","sourceRoot":"","sources":["../../src/conversions/rgb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type DetectedFormat } from './detectFormat';
|
|
2
|
+
import type { ColorFormat, ColorInput, ColorValue, Rgba } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Normalize any recognized color input to canonical `Rgba`.
|
|
5
|
+
* Pass `knownFormat` when the caller has already run `detectFormat` to skip
|
|
6
|
+
* the redundant detection. Throws on `UNKNOWN` input.
|
|
7
|
+
*/
|
|
8
|
+
export declare function toRgba(input: ColorInput, knownFormat?: DetectedFormat): Rgba;
|
|
9
|
+
/**
|
|
10
|
+
* Emit a canonical `Rgba` in the target format. Colorspace-independent.
|
|
11
|
+
*/
|
|
12
|
+
export declare function fromRgba(rgba: Rgba, format?: ColorFormat): ColorValue;
|
|
13
|
+
/**
|
|
14
|
+
* Detect the input color format, normalize to Rgba, and emit the result
|
|
15
|
+
* in the requested output format. Colorspace-independent.
|
|
16
|
+
* Throws if the input isn't a recognized color shape.
|
|
17
|
+
*/
|
|
18
|
+
export declare function convert(input: ColorInput, opts?: {
|
|
19
|
+
format?: ColorFormat;
|
|
20
|
+
}): ColorValue;
|
|
21
|
+
//# sourceMappingURL=convert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,cAAc,EAAgB,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,UAAU,EAKV,IAAI,EAGL,MAAM,SAAS,CAAC;AAYjB;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,cAAc,GAAG,IAAI,CAkB5E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,GAAE,WAAmB,GAAG,UAAU,CAe5E;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,UAAU,CAE1F"}
|
package/dist/convert.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { hexToRgba, rgbaToHex } from './conversions/hex';
|
|
2
|
+
import { hslToRgba, rgbaToHsl } from './conversions/hsl';
|
|
3
|
+
import { hsvToRgba, rgbaToHsv } from './conversions/hsv';
|
|
4
|
+
import { pantoneToRgba, rgbaToPantone } from './conversions/pantone';
|
|
5
|
+
import { rgbaToRgb, rgbToRgba } from './conversions/rgb';
|
|
6
|
+
import { detectFormat } from './detectFormat';
|
|
7
|
+
function safeStringify(x) {
|
|
8
|
+
if (x === undefined)
|
|
9
|
+
return 'undefined';
|
|
10
|
+
try {
|
|
11
|
+
const s = JSON.stringify(x);
|
|
12
|
+
return s === undefined ? String(x) : s;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return Object.prototype.toString.call(x);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Normalize any recognized color input to canonical `Rgba`.
|
|
20
|
+
* Pass `knownFormat` when the caller has already run `detectFormat` to skip
|
|
21
|
+
* the redundant detection. Throws on `UNKNOWN` input.
|
|
22
|
+
*/
|
|
23
|
+
export function toRgba(input, knownFormat) {
|
|
24
|
+
const format = knownFormat ?? detectFormat(input);
|
|
25
|
+
switch (format) {
|
|
26
|
+
case 'HEX':
|
|
27
|
+
return hexToRgba(input);
|
|
28
|
+
case 'RGB':
|
|
29
|
+
return rgbToRgba(input);
|
|
30
|
+
case 'RGBA':
|
|
31
|
+
return rgbToRgba(input);
|
|
32
|
+
case 'HSL':
|
|
33
|
+
return hslToRgba(input);
|
|
34
|
+
case 'HSV':
|
|
35
|
+
return hsvToRgba(input);
|
|
36
|
+
case 'PANTONE':
|
|
37
|
+
return pantoneToRgba(input);
|
|
38
|
+
default:
|
|
39
|
+
throw new Error(`Unrecognized color input: ${safeStringify(input)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Emit a canonical `Rgba` in the target format. Colorspace-independent.
|
|
44
|
+
*/
|
|
45
|
+
export function fromRgba(rgba, format = 'HEX') {
|
|
46
|
+
switch (format) {
|
|
47
|
+
case 'HEX':
|
|
48
|
+
return rgbaToHex(rgba);
|
|
49
|
+
case 'RGB':
|
|
50
|
+
return rgbaToRgb(rgba);
|
|
51
|
+
case 'RGBA':
|
|
52
|
+
return rgba;
|
|
53
|
+
case 'HSL':
|
|
54
|
+
return rgbaToHsl(rgba);
|
|
55
|
+
case 'HSV':
|
|
56
|
+
return rgbaToHsv(rgba);
|
|
57
|
+
case 'PANTONE':
|
|
58
|
+
return rgbaToPantone(rgba);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Detect the input color format, normalize to Rgba, and emit the result
|
|
63
|
+
* in the requested output format. Colorspace-independent.
|
|
64
|
+
* Throws if the input isn't a recognized color shape.
|
|
65
|
+
*/
|
|
66
|
+
export function convert(input, opts = {}) {
|
|
67
|
+
return fromRgba(toRgba(input), opts.format ?? 'HEX');
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAuB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAcnE,SAAS,aAAa,CAAC,CAAU;IAC/B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,KAAiB,EAAE,WAA4B;IACpE,MAAM,MAAM,GAAG,WAAW,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IAClD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,KAAiB,CAAC,CAAC;QACtC,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,KAAiB,CAAC,CAAC;QACtC,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,KAAkB,CAAC,CAAC;QACvC,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,KAAiB,CAAC,CAAC;QACtC,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,KAAiB,CAAC,CAAC;QACtC,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC,KAAoB,CAAC,CAAC;QAC7C;YACE,MAAM,IAAI,KAAK,CAAC,6BAA6B,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAU,EAAE,MAAM,GAAgB,KAAK;IAC9D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,KAAiB,EAAE,IAAI,GAA6B,EAAE;IAC5E,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ColorFormat, ColorInput } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* A color comes in, a format key comes out.
|
|
4
|
+
* 'UNKNOWN' signals the caller that the input isn't a recognized color shape.
|
|
5
|
+
* Used as the dispatch key for format-specific converters.
|
|
6
|
+
*/
|
|
7
|
+
export type DetectedFormat = ColorFormat | 'UNKNOWN';
|
|
8
|
+
/** Shared with `src/conversions/hex.ts`. Capture group is used there; .test() ignores it here. */
|
|
9
|
+
export declare const HEX_RE: RegExp;
|
|
10
|
+
/**
|
|
11
|
+
* Runtime type-guard — returns `true` if `input` looks like something any of
|
|
12
|
+
* chromonym's converters can parse. Cheaper than catching a `convert` throw
|
|
13
|
+
* and more ergonomic than hand-rolling `detectFormat(x) !== 'UNKNOWN'`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isColor(input: unknown): input is ColorInput;
|
|
16
|
+
export declare function detectFormat(input: ColorInput): DetectedFormat;
|
|
17
|
+
//# sourceMappingURL=detectFormat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectFormat.d.ts","sourceRoot":"","sources":["../src/detectFormat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvD;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,SAAS,CAAC;AAErD,kGAAkG;AAClG,eAAO,MAAM,MAAM,QAA8C,CAAC;AASlE;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAE3D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CA8B9D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** Shared with `src/conversions/hex.ts`. Capture group is used there; .test() ignores it here. */
|
|
2
|
+
export const HEX_RE = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
|
|
3
|
+
const RGBA_STR_RE = /^rgba\s*\(/i;
|
|
4
|
+
const RGB_STR_RE = /^rgb\s*\(/i;
|
|
5
|
+
const HSL_STR_RE = /^hsl\s*\(/i;
|
|
6
|
+
const HSV_STR_RE = /^hsv\s*\(/i;
|
|
7
|
+
// Conservative: matches "<digits> C|U|M" with optional "Pantone" prefix.
|
|
8
|
+
// Refine once the real Pantone code list lands.
|
|
9
|
+
const PANTONE_RE = /^(?:pantone\s+)?\d+\s*[CUM]$/i;
|
|
10
|
+
/**
|
|
11
|
+
* Runtime type-guard — returns `true` if `input` looks like something any of
|
|
12
|
+
* chromonym's converters can parse. Cheaper than catching a `convert` throw
|
|
13
|
+
* and more ergonomic than hand-rolling `detectFormat(x) !== 'UNKNOWN'`.
|
|
14
|
+
*/
|
|
15
|
+
export function isColor(input) {
|
|
16
|
+
return detectFormat(input) !== 'UNKNOWN';
|
|
17
|
+
}
|
|
18
|
+
export function detectFormat(input) {
|
|
19
|
+
if (typeof input === 'string') {
|
|
20
|
+
if (input === '')
|
|
21
|
+
return 'UNKNOWN';
|
|
22
|
+
if (HEX_RE.test(input))
|
|
23
|
+
return 'HEX';
|
|
24
|
+
if (RGBA_STR_RE.test(input))
|
|
25
|
+
return 'RGBA';
|
|
26
|
+
if (RGB_STR_RE.test(input))
|
|
27
|
+
return 'RGB';
|
|
28
|
+
if (HSL_STR_RE.test(input))
|
|
29
|
+
return 'HSL';
|
|
30
|
+
if (HSV_STR_RE.test(input))
|
|
31
|
+
return 'HSV';
|
|
32
|
+
if (PANTONE_RE.test(input))
|
|
33
|
+
return 'PANTONE';
|
|
34
|
+
return 'UNKNOWN';
|
|
35
|
+
}
|
|
36
|
+
if (Array.isArray(input)) {
|
|
37
|
+
if (input.length === 4)
|
|
38
|
+
return 'RGBA';
|
|
39
|
+
if (input.length === 3)
|
|
40
|
+
return 'RGB';
|
|
41
|
+
return 'UNKNOWN';
|
|
42
|
+
}
|
|
43
|
+
if (input !== null && typeof input === 'object') {
|
|
44
|
+
// Use Object.hasOwn — `in` walks the prototype chain and can be
|
|
45
|
+
// abused by attacker-controlled prototypes to misclassify inputs.
|
|
46
|
+
const has = Object.hasOwn;
|
|
47
|
+
if (has(input, 'h') && has(input, 'v'))
|
|
48
|
+
return 'HSV';
|
|
49
|
+
if (has(input, 'h') && has(input, 'l'))
|
|
50
|
+
return 'HSL';
|
|
51
|
+
if (has(input, 'r') && has(input, 'a'))
|
|
52
|
+
return 'RGBA';
|
|
53
|
+
if (has(input, 'r'))
|
|
54
|
+
return 'RGB';
|
|
55
|
+
return 'UNKNOWN';
|
|
56
|
+
}
|
|
57
|
+
return 'UNKNOWN';
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=detectFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectFormat.js","sourceRoot":"","sources":["../src/detectFormat.ts"],"names":[],"mappings":"AASA,kGAAkG;AAClG,MAAM,CAAC,MAAM,MAAM,GAAG,2CAA2C,CAAC;AAClE,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,yEAAyE;AACzE,gDAAgD;AAChD,MAAM,UAAU,GAAG,+BAA+B,CAAC;AAEnD;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,YAAY,CAAC,KAAmB,CAAC,KAAK,SAAS,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAC3C,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACzC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACzC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACzC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,gEAAgE;QAChE,kEAAkE;QAClE,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;QAC1B,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;QACtD,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { toRgba } from './convert';
|
|
2
|
+
import type { ColorspaceName, DistanceMetric } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Identify the nearest-named color for any color input.
|
|
5
|
+
*
|
|
6
|
+
* The distance metric defaults to the colorspace's recommended choice
|
|
7
|
+
* (web/x11: `deltaE76`, pantone: `deltaE2000`). Override with the `metric`
|
|
8
|
+
* option — e.g. `{ metric: 'euclidean-srgb' }` for maximum speed, or
|
|
9
|
+
* `{ metric: 'deltaE2000' }` for strictest perceptual accuracy.
|
|
10
|
+
*
|
|
11
|
+
* Returns `null` if the input isn't a recognized color shape or the
|
|
12
|
+
* colorspace name isn't one of `web` / `x11` / `pantone`.
|
|
13
|
+
*
|
|
14
|
+
* Defaults: colorspace = 'web', metric = DEFAULT_METRICS[colorspace].
|
|
15
|
+
*/
|
|
16
|
+
export declare function identify(input: Parameters<typeof toRgba>[0], opts?: {
|
|
17
|
+
colorspace?: ColorspaceName;
|
|
18
|
+
metric?: DistanceMetric;
|
|
19
|
+
}): string | null;
|
|
20
|
+
//# sourceMappingURL=identify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identify.d.ts","sourceRoot":"","sources":["../src/identify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9D;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,EACnC,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,cAAc,CAAA;CAAO,GAClE,MAAM,GAAG,IAAI,CAUf"}
|