chromonym 1.0.0 → 1.1.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.
Files changed (74) hide show
  1. package/README.md +165 -3
  2. package/dist/colorspaces/index.d.ts +4 -0
  3. package/dist/colorspaces/index.d.ts.map +1 -0
  4. package/dist/colorspaces/index.js +4 -0
  5. package/dist/colorspaces/index.js.map +1 -0
  6. package/dist/colorspaces/pantone.d.ts +919 -0
  7. package/dist/colorspaces/pantone.d.ts.map +1 -0
  8. package/dist/colorspaces/pantone.js +918 -0
  9. package/dist/colorspaces/pantone.js.map +1 -0
  10. package/dist/colorspaces/web.d.ts +156 -0
  11. package/dist/colorspaces/web.d.ts.map +1 -0
  12. package/dist/colorspaces/web.js +155 -0
  13. package/dist/colorspaces/web.js.map +1 -0
  14. package/dist/colorspaces/x11.d.ts +667 -0
  15. package/dist/colorspaces/x11.d.ts.map +1 -0
  16. package/dist/colorspaces/x11.js +666 -0
  17. package/dist/colorspaces/x11.js.map +1 -0
  18. package/dist/conversions/hex.d.ts +13 -0
  19. package/dist/conversions/hex.d.ts.map +1 -0
  20. package/dist/conversions/hex.js +39 -0
  21. package/dist/conversions/hex.js.map +1 -0
  22. package/dist/conversions/hsl.d.ts +12 -0
  23. package/dist/conversions/hsl.d.ts.map +1 -0
  24. package/dist/conversions/hsl.js +90 -0
  25. package/dist/conversions/hsl.js.map +1 -0
  26. package/dist/conversions/hsv.d.ts +12 -0
  27. package/dist/conversions/hsv.d.ts.map +1 -0
  28. package/dist/conversions/hsv.js +85 -0
  29. package/dist/conversions/hsv.js.map +1 -0
  30. package/dist/conversions/index.d.ts +6 -0
  31. package/dist/conversions/index.d.ts.map +1 -0
  32. package/dist/conversions/index.js +6 -0
  33. package/dist/conversions/index.js.map +1 -0
  34. package/dist/conversions/pantone.d.ts +14 -0
  35. package/dist/conversions/pantone.d.ts.map +1 -0
  36. package/dist/conversions/pantone.js +63 -0
  37. package/dist/conversions/pantone.js.map +1 -0
  38. package/dist/conversions/rgb.d.ts +13 -0
  39. package/dist/conversions/rgb.d.ts.map +1 -0
  40. package/dist/conversions/rgb.js +46 -0
  41. package/dist/conversions/rgb.js.map +1 -0
  42. package/dist/convert.d.ts +10 -0
  43. package/dist/convert.d.ts.map +1 -0
  44. package/dist/convert.js +51 -0
  45. package/dist/convert.js.map +1 -0
  46. package/dist/detectFormat.d.ts +9 -0
  47. package/dist/detectFormat.d.ts.map +1 -0
  48. package/dist/detectFormat.js +47 -0
  49. package/dist/detectFormat.js.map +1 -0
  50. package/dist/identify.d.ts +12 -0
  51. package/dist/identify.d.ts.map +1 -0
  52. package/dist/identify.js +44 -0
  53. package/dist/identify.js.map +1 -0
  54. package/dist/index.d.ts +14 -337
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +15 -267
  57. package/dist/index.js.map +1 -1
  58. package/dist/math/euclideanDistance.d.ts +9 -0
  59. package/dist/math/euclideanDistance.d.ts.map +1 -0
  60. package/dist/math/euclideanDistance.js +13 -0
  61. package/dist/math/euclideanDistance.js.map +1 -0
  62. package/dist/math/index.d.ts +2 -0
  63. package/dist/math/index.d.ts.map +1 -0
  64. package/dist/math/index.js +4 -0
  65. package/dist/math/index.js.map +1 -0
  66. package/dist/resolve.d.ts +14 -0
  67. package/dist/resolve.d.ts.map +1 -0
  68. package/dist/resolve.js +49 -0
  69. package/dist/resolve.js.map +1 -0
  70. package/dist/types.d.ts +42 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +4 -0
  73. package/dist/types.js.map +1 -0
  74. package/package.json +4 -2
@@ -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":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAI/C;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAsB7C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAM9C"}
@@ -0,0 +1,39 @@
1
+ const HEX_RE = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
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 function hexToRgba(hex) {
8
+ const match = HEX_RE.exec(hex);
9
+ const body = match?.[1];
10
+ if (!body)
11
+ throw new Error(`Invalid hex color: ${hex}`);
12
+ if (body.length === 3) {
13
+ const r = body.charAt(0);
14
+ const g = body.charAt(1);
15
+ const b = body.charAt(2);
16
+ return {
17
+ r: parseInt(r + r, 16),
18
+ g: parseInt(g + g, 16),
19
+ b: parseInt(b + b, 16),
20
+ a: 1,
21
+ };
22
+ }
23
+ const r = parseInt(body.slice(0, 2), 16);
24
+ const g = parseInt(body.slice(2, 4), 16);
25
+ const b = parseInt(body.slice(4, 6), 16);
26
+ const a = body.length === 8 ? parseInt(body.slice(6, 8), 16) / 255 : 1;
27
+ return { r, g, b, a };
28
+ }
29
+ /**
30
+ * Emit a 6-digit lowercase hex string. Alpha is dropped; out-of-range
31
+ * channel values are clamped to 0..255; fractional values are rounded.
32
+ */
33
+ export function rgbaToHex(rgba) {
34
+ const clamp = (n) => Math.max(0, Math.min(255, Math.round(n)))
35
+ .toString(16)
36
+ .padStart(2, '0');
37
+ return `#${clamp(rgba.r)}${clamp(rgba.g)}${clamp(rgba.b)}`;
38
+ }
39
+ //# sourceMappingURL=hex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hex.js","sourceRoot":"","sources":["../../src/conversions/hex.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,2CAA2C,CAAC;AAE3D;;;;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;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAU;IAClC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAClC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACtC,QAAQ,CAAC,EAAE,CAAC;SACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtB,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAc,CAAC;AACzE,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":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAK1D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAqD/C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAyB/C"}
@@ -0,0 +1,90 @@
1
+ const HSL_RE = /^hsl\s*\(\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)%?\s*,\s*(-?\d+(?:\.\d+)?)%?\s*\)$/i;
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 function hslToRgba(input) {
7
+ let h;
8
+ let s;
9
+ let l;
10
+ if (typeof input === 'string') {
11
+ const match = HSL_RE.exec(input);
12
+ if (!match)
13
+ throw new Error(`Invalid hsl string: ${input}`);
14
+ h = Number(match[1]);
15
+ s = Number(match[2]);
16
+ l = Number(match[3]);
17
+ }
18
+ else {
19
+ h = input.h;
20
+ s = input.s;
21
+ l = input.l;
22
+ }
23
+ const sat = s / 100;
24
+ const lig = l / 100;
25
+ if (sat === 0) {
26
+ const v = Math.round(lig * 255);
27
+ return { r: v, g: v, b: v, a: 1 };
28
+ }
29
+ const c = (1 - Math.abs(2 * lig - 1)) * sat;
30
+ const hp = (((h % 360) + 360) % 360) / 60;
31
+ const x = c * (1 - Math.abs((hp % 2) - 1));
32
+ const m = lig - c / 2;
33
+ let r1;
34
+ let g1;
35
+ let b1;
36
+ if (hp < 1) {
37
+ [r1, g1, b1] = [c, x, 0];
38
+ }
39
+ else if (hp < 2) {
40
+ [r1, g1, b1] = [x, c, 0];
41
+ }
42
+ else if (hp < 3) {
43
+ [r1, g1, b1] = [0, c, x];
44
+ }
45
+ else if (hp < 4) {
46
+ [r1, g1, b1] = [0, x, c];
47
+ }
48
+ else if (hp < 5) {
49
+ [r1, g1, b1] = [x, 0, c];
50
+ }
51
+ else {
52
+ [r1, g1, b1] = [c, 0, x];
53
+ }
54
+ return {
55
+ r: Math.round((r1 + m) * 255),
56
+ g: Math.round((g1 + m) * 255),
57
+ b: Math.round((b1 + m) * 255),
58
+ a: 1,
59
+ };
60
+ }
61
+ /**
62
+ * Emit an `hsl(h, s%, l%)` string from Rgba. Alpha is dropped; all
63
+ * three components are rounded to whole numbers.
64
+ */
65
+ export function rgbaToHsl(rgba) {
66
+ const rn = rgba.r / 255;
67
+ const gn = rgba.g / 255;
68
+ const bn = rgba.b / 255;
69
+ const max = Math.max(rn, gn, bn);
70
+ const min = Math.min(rn, gn, bn);
71
+ const l = (max + min) / 2;
72
+ if (max === min) {
73
+ return `hsl(0, 0%, ${Math.round(l * 100)}%)`;
74
+ }
75
+ const delta = max - min;
76
+ const s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);
77
+ let h;
78
+ if (max === rn) {
79
+ h = (gn - bn) / delta + (gn < bn ? 6 : 0);
80
+ }
81
+ else if (max === gn) {
82
+ h = (bn - rn) / delta + 2;
83
+ }
84
+ else {
85
+ h = (rn - gn) / delta + 4;
86
+ }
87
+ h *= 60;
88
+ return `hsl(${Math.round(h)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`;
89
+ }
90
+ //# 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":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAK1D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CA+C/C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAuB/C"}
@@ -0,0 +1,85 @@
1
+ const HSV_RE = /^hsv\s*\(\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)%?\s*,\s*(-?\d+(?:\.\d+)?)%?\s*\)$/i;
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 function hsvToRgba(input) {
7
+ let h;
8
+ let s;
9
+ let v;
10
+ if (typeof input === 'string') {
11
+ const match = HSV_RE.exec(input);
12
+ if (!match)
13
+ throw new Error(`Invalid hsv string: ${input}`);
14
+ h = Number(match[1]);
15
+ s = Number(match[2]);
16
+ v = Number(match[3]);
17
+ }
18
+ else {
19
+ h = input.h;
20
+ s = input.s;
21
+ v = input.v;
22
+ }
23
+ const sat = s / 100;
24
+ const val = v / 100;
25
+ const c = val * sat;
26
+ const hp = (((h % 360) + 360) % 360) / 60;
27
+ const x = c * (1 - Math.abs((hp % 2) - 1));
28
+ const m = val - c;
29
+ let r1;
30
+ let g1;
31
+ let b1;
32
+ if (hp < 1) {
33
+ [r1, g1, b1] = [c, x, 0];
34
+ }
35
+ else if (hp < 2) {
36
+ [r1, g1, b1] = [x, c, 0];
37
+ }
38
+ else if (hp < 3) {
39
+ [r1, g1, b1] = [0, c, x];
40
+ }
41
+ else if (hp < 4) {
42
+ [r1, g1, b1] = [0, x, c];
43
+ }
44
+ else if (hp < 5) {
45
+ [r1, g1, b1] = [x, 0, c];
46
+ }
47
+ else {
48
+ [r1, g1, b1] = [c, 0, x];
49
+ }
50
+ return {
51
+ r: Math.round((r1 + m) * 255),
52
+ g: Math.round((g1 + m) * 255),
53
+ b: Math.round((b1 + m) * 255),
54
+ a: 1,
55
+ };
56
+ }
57
+ /**
58
+ * Emit an `hsv(h, s%, v%)` string from Rgba. Alpha is dropped; all
59
+ * three components are rounded to whole numbers.
60
+ */
61
+ export function rgbaToHsv(rgba) {
62
+ const rn = rgba.r / 255;
63
+ const gn = rgba.g / 255;
64
+ const bn = rgba.b / 255;
65
+ const max = Math.max(rn, gn, bn);
66
+ const min = Math.min(rn, gn, bn);
67
+ const delta = max - min;
68
+ const v = max;
69
+ const s = max === 0 ? 0 : delta / max;
70
+ let h = 0;
71
+ if (delta !== 0) {
72
+ if (max === rn) {
73
+ h = (gn - bn) / delta + (gn < bn ? 6 : 0);
74
+ }
75
+ else if (max === gn) {
76
+ h = (bn - rn) / delta + 2;
77
+ }
78
+ else {
79
+ h = (rn - gn) / delta + 4;
80
+ }
81
+ h *= 60;
82
+ }
83
+ return `hsv(${Math.round(h)}, ${Math.round(s * 100)}%, ${Math.round(v * 100)}%)`;
84
+ }
85
+ //# 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,14 @@
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 code (Coated) to the given Rgba by
11
+ * Euclidean distance in RGB. Alpha is ignored. Always returns a code.
12
+ */
13
+ export declare function rgbaToPantone(rgba: Rgba): PantoneCode;
14
+ //# 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;AAoC5D;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAKrD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAarD"}
@@ -0,0 +1,63 @@
1
+ import { pantone } from '../colorspaces/pantone';
2
+ import { euclideanDistance } from '../math/euclideanDistance';
3
+ import { hexToRgba } from './hex';
4
+ // Strip casing, common prefixes ("Pantone", "PMS"), and all non-alphanumeric
5
+ // characters so that "185 C", "185c", "Pantone 185 C", "PMS185C" all match
6
+ // the stored canonical key "185C".
7
+ function normalize(s) {
8
+ return s
9
+ .toLowerCase()
10
+ .replace(/^(pantone|pms)\s*/, '')
11
+ .replace(/[^a-z0-9]/g, '');
12
+ }
13
+ // Lazy normalized-name -> canonical-key index.
14
+ let nameIndex = null;
15
+ function getNameIndex() {
16
+ if (!nameIndex) {
17
+ nameIndex = new Map();
18
+ for (const key of Object.keys(pantone)) {
19
+ nameIndex.set(normalize(key), key);
20
+ }
21
+ }
22
+ return nameIndex;
23
+ }
24
+ // Lazy canonical-key -> rgba index (precomputed to avoid per-lookup hex parsing).
25
+ let rgbaIndex = null;
26
+ function getRgbaIndex() {
27
+ if (!rgbaIndex) {
28
+ rgbaIndex = Object.entries(pantone).map(([code, hex]) => [code, hexToRgba(hex)]);
29
+ }
30
+ return rgbaIndex;
31
+ }
32
+ /**
33
+ * Resolve a Pantone code to Rgba.
34
+ * Accepts any casing, spacing, and common prefixes ("PMS", "Pantone")
35
+ * since non-alphanumeric characters are stripped before lookup.
36
+ * Throws on unknown codes.
37
+ */
38
+ export function pantoneToRgba(code) {
39
+ const canonical = getNameIndex().get(normalize(code));
40
+ if (canonical === undefined)
41
+ throw new Error(`Unknown Pantone code: ${code}`);
42
+ const hex = pantone[canonical];
43
+ return hexToRgba(hex);
44
+ }
45
+ /**
46
+ * Find the nearest Pantone code (Coated) to the given Rgba by
47
+ * Euclidean distance in RGB. Alpha is ignored. Always returns a code.
48
+ */
49
+ export function rgbaToPantone(rgba) {
50
+ const entries = getRgbaIndex();
51
+ // Pantone colorspace has 907 entries; first-entry fallback is defensive.
52
+ let bestCode = entries[0]?.[0] ?? '';
53
+ let bestDistance = Infinity;
54
+ for (const [code, candidate] of entries) {
55
+ const d = euclideanDistance(rgba, candidate);
56
+ if (d < bestDistance) {
57
+ bestDistance = d;
58
+ bestCode = code;
59
+ }
60
+ }
61
+ return bestCode;
62
+ }
63
+ //# 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,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,6EAA6E;AAC7E,2EAA2E;AAC3E,mCAAmC;AACnC,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC;SACL,WAAW,EAAE;SACb,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,+CAA+C;AAC/C,IAAI,SAAS,GAA+B,IAAI,CAAC;AACjD,SAAS,YAAY;IACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kFAAkF;AAClF,IAAI,SAAS,GAAsD,IAAI,CAAC;AACxE,SAAS,YAAY;IACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CACrC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,GAAe,CAAC,CAAU,CAC7D,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,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,GAAG,CAAC,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAU;IACtC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,yEAAyE;IACzE,IAAI,QAAQ,GAAW,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,YAAY,GAAG,QAAQ,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC;YACrB,YAAY,GAAG,CAAC,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,QAAuB,CAAC;AACjC,CAAC"}
@@ -0,0 +1,13 @@
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
+ * Throws on malformed strings.
6
+ */
7
+ export declare function rgbToRgba(input: RgbInput | RgbaInput): Rgba;
8
+ /**
9
+ * Emit an `rgb(r, g, b)` string. Alpha is dropped; out-of-range values
10
+ * are clamped to 0..255; fractional values are rounded.
11
+ */
12
+ export declare function rgbaToRgb(rgba: Rgba): RgbString;
13
+ //# sourceMappingURL=rgb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rgb.d.ts","sourceRoot":"","sources":["../../src/conversions/rgb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAa,SAAS,EAAE,MAAM,UAAU,CAAC;AAKhF;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CA+B3D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAG/C"}
@@ -0,0 +1,46 @@
1
+ const RGB_RE = /^rgba?\s*\(\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*(?:,\s*(\d*\.?\d+)\s*)?\)$/i;
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
+ * Throws on malformed strings.
6
+ */
7
+ export function rgbToRgba(input) {
8
+ if (Array.isArray(input)) {
9
+ const a = input.length === 4 ? input[3] : 1;
10
+ return {
11
+ r: input[0],
12
+ g: input[1],
13
+ b: input[2],
14
+ a,
15
+ };
16
+ }
17
+ if (typeof input === 'string') {
18
+ const match = RGB_RE.exec(input);
19
+ if (!match)
20
+ throw new Error(`Invalid rgb(a) string: ${input}`);
21
+ return {
22
+ r: Number(match[1]),
23
+ g: Number(match[2]),
24
+ b: Number(match[3]),
25
+ a: match[4] !== undefined ? Number(match[4]) : 1,
26
+ };
27
+ }
28
+ // Object form — TypeScript's Array.isArray narrowing doesn't exclude
29
+ // readonly tuple types from the union, so cast after the guards.
30
+ const obj = input;
31
+ return {
32
+ r: obj.r,
33
+ g: obj.g,
34
+ b: obj.b,
35
+ a: 'a' in obj ? obj.a : 1,
36
+ };
37
+ }
38
+ /**
39
+ * Emit an `rgb(r, g, b)` string. Alpha is dropped; out-of-range values
40
+ * are clamped to 0..255; fractional values are rounded.
41
+ */
42
+ export function rgbaToRgb(rgba) {
43
+ const clamp = (n) => Math.max(0, Math.min(255, Math.round(n)));
44
+ return `rgb(${clamp(rgba.r)}, ${clamp(rgba.g)}, ${clamp(rgba.b)})`;
45
+ }
46
+ //# sourceMappingURL=rgb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rgb.js","sourceRoot":"","sources":["../../src/conversions/rgb.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GACV,+GAA+G,CAAC;AAElH;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,KAA2B;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,OAAO;YACL,CAAC,EAAE,KAAK,CAAC,CAAC,CAAW;YACrB,CAAC,EAAE,KAAK,CAAC,CAAC,CAAW;YACrB,CAAC,EAAE,KAAK,CAAC,CAAC,CAAW;YACrB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;QAC/D,OAAO;YACL,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,iEAAiE;IACjE,MAAM,GAAG,GAAG,KAAyB,CAAC;IACtC,OAAO;QACL,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAU;IAClC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAgB,CAAC;AAClF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ColorFormat, ColorInput, ColorValue } from './types';
2
+ /**
3
+ * Detect the input color format, normalize to Rgba, and emit the result
4
+ * in the requested output format. Colorspace-independent.
5
+ * Throws if the input isn't a recognized color shape.
6
+ */
7
+ export declare function convert(input: ColorInput, opts?: {
8
+ format?: ColorFormat;
9
+ }): ColorValue;
10
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,UAAU,EAQX,MAAM,SAAS,CAAC;AAuCjB;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,UAAU,CAG1F"}
@@ -0,0 +1,51 @@
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 toRgba(input) {
8
+ const format = detectFormat(input);
9
+ switch (format) {
10
+ case 'HEX':
11
+ return hexToRgba(input);
12
+ case 'RGB':
13
+ return rgbToRgba(input);
14
+ case 'RGBA':
15
+ return rgbToRgba(input);
16
+ case 'HSL':
17
+ return hslToRgba(input);
18
+ case 'HSV':
19
+ return hsvToRgba(input);
20
+ case 'PANTONE':
21
+ return pantoneToRgba(input);
22
+ default:
23
+ throw new Error(`Unrecognized color input: ${String(input)}`);
24
+ }
25
+ }
26
+ function fromRgba(rgba, format) {
27
+ switch (format) {
28
+ case 'HEX':
29
+ return rgbaToHex(rgba);
30
+ case 'RGB':
31
+ return rgbaToRgb(rgba);
32
+ case 'RGBA':
33
+ return rgba;
34
+ case 'HSL':
35
+ return rgbaToHsl(rgba);
36
+ case 'HSV':
37
+ return rgbaToHsv(rgba);
38
+ case 'PANTONE':
39
+ return rgbaToPantone(rgba);
40
+ }
41
+ }
42
+ /**
43
+ * Detect the input color format, normalize to Rgba, and emit the result
44
+ * in the requested output format. Colorspace-independent.
45
+ * Throws if the input isn't a recognized color shape.
46
+ */
47
+ export function convert(input, opts = {}) {
48
+ const { format = 'HEX' } = opts;
49
+ return fromRgba(toRgba(input), format);
50
+ }
51
+ //# 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,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAc9C,SAAS,MAAM,CAAC,KAAiB;IAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,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,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAU,EAAE,MAAmB;IAC/C,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,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IAChC,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,9 @@
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
+ export declare function detectFormat(input: ColorInput): DetectedFormat;
9
+ //# 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;AAWrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CA2B9D"}
@@ -0,0 +1,47 @@
1
+ const HEX_RE = /^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
2
+ const RGBA_STR_RE = /^rgba\s*\(/i;
3
+ const RGB_STR_RE = /^rgb\s*\(/i;
4
+ const HSL_STR_RE = /^hsl\s*\(/i;
5
+ const HSV_STR_RE = /^hsv\s*\(/i;
6
+ // Conservative: matches "<digits> C|U|M" with optional "Pantone" prefix.
7
+ // Refine once the real Pantone code list lands.
8
+ const PANTONE_RE = /^(?:pantone\s+)?\d+\s*[CUM]$/i;
9
+ export function detectFormat(input) {
10
+ if (typeof input === 'string') {
11
+ if (input === '')
12
+ return 'UNKNOWN';
13
+ if (HEX_RE.test(input))
14
+ return 'HEX';
15
+ if (RGBA_STR_RE.test(input))
16
+ return 'RGBA';
17
+ if (RGB_STR_RE.test(input))
18
+ return 'RGB';
19
+ if (HSL_STR_RE.test(input))
20
+ return 'HSL';
21
+ if (HSV_STR_RE.test(input))
22
+ return 'HSV';
23
+ if (PANTONE_RE.test(input))
24
+ return 'PANTONE';
25
+ return 'UNKNOWN';
26
+ }
27
+ if (Array.isArray(input)) {
28
+ if (input.length === 4)
29
+ return 'RGBA';
30
+ if (input.length === 3)
31
+ return 'RGB';
32
+ return 'UNKNOWN';
33
+ }
34
+ if (input !== null && typeof input === 'object') {
35
+ if ('h' in input && 'v' in input)
36
+ return 'HSV';
37
+ if ('h' in input && 'l' in input)
38
+ return 'HSL';
39
+ if ('a' in input)
40
+ return 'RGBA';
41
+ if ('r' in input)
42
+ return 'RGB';
43
+ return 'UNKNOWN';
44
+ }
45
+ return 'UNKNOWN';
46
+ }
47
+ //# sourceMappingURL=detectFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectFormat.js","sourceRoot":"","sources":["../src/detectFormat.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,GAAG,6CAA6C,CAAC;AAC7D,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,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,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,GAAG,IAAI,KAAK;YAAE,OAAO,MAAM,CAAC;QAChC,IAAI,GAAG,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ColorInput, ColorspaceName } from './types';
2
+ /**
3
+ * Identify the nearest-named color for any color input.
4
+ * Uses Euclidean distance in RGB (alpha is ignored).
5
+ * Returns `null` if the input isn't a recognized color shape.
6
+ *
7
+ * Defaults: colorspace = 'web'.
8
+ */
9
+ export declare function identify(input: ColorInput, opts?: {
10
+ colorspace?: ColorspaceName;
11
+ }): string | null;
12
+ //# sourceMappingURL=identify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identify.d.ts","sourceRoot":"","sources":["../src/identify.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAc,cAAc,EAAkB,MAAM,SAAS,CAAC;AAiBtF;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,cAAc,CAAA;CAAO,GACzC,MAAM,GAAG,IAAI,CAiBf"}