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.
Files changed (95) hide show
  1. package/NOTICE.md +39 -0
  2. package/README.md +240 -3
  3. package/dist/colorspaces/index.d.ts +4 -0
  4. package/dist/colorspaces/index.d.ts.map +1 -0
  5. package/dist/colorspaces/index.js +4 -0
  6. package/dist/colorspaces/index.js.map +1 -0
  7. package/dist/colorspaces/pantone.d.ts +919 -0
  8. package/dist/colorspaces/pantone.d.ts.map +1 -0
  9. package/dist/colorspaces/pantone.js +918 -0
  10. package/dist/colorspaces/pantone.js.map +1 -0
  11. package/dist/colorspaces/registry.d.ts +26 -0
  12. package/dist/colorspaces/registry.d.ts.map +1 -0
  13. package/dist/colorspaces/registry.js +36 -0
  14. package/dist/colorspaces/registry.js.map +1 -0
  15. package/dist/colorspaces/web.d.ts +156 -0
  16. package/dist/colorspaces/web.d.ts.map +1 -0
  17. package/dist/colorspaces/web.js +155 -0
  18. package/dist/colorspaces/web.js.map +1 -0
  19. package/dist/colorspaces/x11.d.ts +667 -0
  20. package/dist/colorspaces/x11.d.ts.map +1 -0
  21. package/dist/colorspaces/x11.js +666 -0
  22. package/dist/colorspaces/x11.js.map +1 -0
  23. package/dist/conversions/hex.d.ts +13 -0
  24. package/dist/conversions/hex.d.ts.map +1 -0
  25. package/dist/conversions/hex.js +40 -0
  26. package/dist/conversions/hex.js.map +1 -0
  27. package/dist/conversions/hsl.d.ts +12 -0
  28. package/dist/conversions/hsl.d.ts.map +1 -0
  29. package/dist/conversions/hsl.js +72 -0
  30. package/dist/conversions/hsl.js.map +1 -0
  31. package/dist/conversions/hsv.d.ts +12 -0
  32. package/dist/conversions/hsv.d.ts.map +1 -0
  33. package/dist/conversions/hsv.js +67 -0
  34. package/dist/conversions/hsv.js.map +1 -0
  35. package/dist/conversions/index.d.ts +6 -0
  36. package/dist/conversions/index.d.ts.map +1 -0
  37. package/dist/conversions/index.js +6 -0
  38. package/dist/conversions/index.js.map +1 -0
  39. package/dist/conversions/pantone.d.ts +17 -0
  40. package/dist/conversions/pantone.d.ts.map +1 -0
  41. package/dist/conversions/pantone.js +27 -0
  42. package/dist/conversions/pantone.js.map +1 -0
  43. package/dist/conversions/rgb.d.ts +15 -0
  44. package/dist/conversions/rgb.d.ts.map +1 -0
  45. package/dist/conversions/rgb.js +57 -0
  46. package/dist/conversions/rgb.js.map +1 -0
  47. package/dist/convert.d.ts +21 -0
  48. package/dist/convert.d.ts.map +1 -0
  49. package/dist/convert.js +69 -0
  50. package/dist/convert.js.map +1 -0
  51. package/dist/detectFormat.d.ts +17 -0
  52. package/dist/detectFormat.d.ts.map +1 -0
  53. package/dist/detectFormat.js +59 -0
  54. package/dist/detectFormat.js.map +1 -0
  55. package/dist/identify.d.ts +20 -0
  56. package/dist/identify.d.ts.map +1 -0
  57. package/dist/identify.js +29 -0
  58. package/dist/identify.js.map +1 -0
  59. package/dist/index.d.ts +14 -337
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +15 -267
  62. package/dist/index.js.map +1 -1
  63. package/dist/indexing.d.ts +44 -0
  64. package/dist/indexing.d.ts.map +1 -0
  65. package/dist/indexing.js +140 -0
  66. package/dist/indexing.js.map +1 -0
  67. package/dist/math/clamp.d.ts +11 -0
  68. package/dist/math/clamp.d.ts.map +1 -0
  69. package/dist/math/clamp.js +18 -0
  70. package/dist/math/clamp.js.map +1 -0
  71. package/dist/math/colorSpace.d.ts +39 -0
  72. package/dist/math/colorSpace.d.ts.map +1 -0
  73. package/dist/math/colorSpace.js +85 -0
  74. package/dist/math/colorSpace.js.map +1 -0
  75. package/dist/math/deltaE.d.ts +47 -0
  76. package/dist/math/deltaE.d.ts.map +1 -0
  77. package/dist/math/deltaE.js +185 -0
  78. package/dist/math/deltaE.js.map +1 -0
  79. package/dist/math/euclideanDistance.d.ts +16 -0
  80. package/dist/math/euclideanDistance.d.ts.map +1 -0
  81. package/dist/math/euclideanDistance.js +22 -0
  82. package/dist/math/euclideanDistance.js.map +1 -0
  83. package/dist/math/hueSector.d.ts +15 -0
  84. package/dist/math/hueSector.d.ts.map +1 -0
  85. package/dist/math/hueSector.js +27 -0
  86. package/dist/math/hueSector.js.map +1 -0
  87. package/dist/resolve.d.ts +14 -0
  88. package/dist/resolve.d.ts.map +1 -0
  89. package/dist/resolve.js +26 -0
  90. package/dist/resolve.js.map +1 -0
  91. package/dist/types.d.ts +43 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +4 -0
  94. package/dist/types.js.map +1 -0
  95. package/package.json +69 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorSpace.js","sourceRoot":"","sources":["../../src/math/colorSpace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * CIE color-difference metrics. Inputs are `Lab` triples (L, a, b) as
3
+ * produced by `rgbaToLab` from `colorSpace.ts`.
4
+ *
5
+ * All three metrics operate in CIELAB; the differences are in how each
6
+ * region of Lab space is weighted:
7
+ * ΔE*76 — simple Euclidean in Lab (CIE 1976). Fast, decent.
8
+ * ΔE*94 — adds chroma/hue weighting (CIE 1994). Better saturation handling.
9
+ * ΔE00 — also adjusts L/C/h + rotation correction in blue-purple region
10
+ * (CIE 2000, aka CIEDE2000). Current industry standard.
11
+ *
12
+ * References:
13
+ * CIE 15:2004 (Colorimetry), CIE TC1-29 (ΔE2000).
14
+ * G. Sharma, W. Wu, E.N. Dalal, "The CIEDE2000 Color-Difference Formula"
15
+ * (Color Research & Application, 2005) — canonical test vectors.
16
+ */
17
+ export type Lab = readonly [l: number, a: number, b: number];
18
+ /**
19
+ * ΔE*ab (CIE 1976). Simple Euclidean distance in Lab.
20
+ * Returns the *square* for speed — identify loops only need argmin, and
21
+ * sqrt is monotonic. Use `deltaE76` if you need the actual distance.
22
+ */
23
+ export declare function deltaE76Squared(p: Lab, q: Lab): number;
24
+ export declare function deltaE76(p: Lab, q: Lab): number;
25
+ /**
26
+ * ΔE*94 (CIE 1994). Weights the chroma and hue contributions relative to
27
+ * Lab Euclidean distance — fixes the "saturated colors feel too far apart"
28
+ * problem of ΔE*76. Uses graphic-arts constants (kL=1, K1=0.045, K2=0.015).
29
+ *
30
+ * Not symmetric in the strict sense (reference vs sample), but we treat
31
+ * both inputs as graphic-arts samples — the formula reduces to a
32
+ * symmetric form below.
33
+ */
34
+ export declare function deltaE94(p: Lab, q: Lab): number;
35
+ export declare function deltaE2000(p: Lab, q: Lab, kL?: number, kC?: number, kH?: number): number;
36
+ /**
37
+ * Squared Euclidean distance in OKLAB space (Björn Ottosson, 2020).
38
+ * OKLAB is perceptually uniform by construction — plain Euclidean IS the
39
+ * perceptual distance, no weighting needed. Returns the square for
40
+ * argmin speed; `deltaEok` returns the actual distance.
41
+ *
42
+ * Often gives more visually-accurate nearest-matches than CIEDE2000 in
43
+ * the saturated blue/purple region.
44
+ */
45
+ export declare function deltaEokSquared(p: Lab, q: Lab): number;
46
+ export declare function deltaEok(p: Lab, q: Lab): number;
47
+ //# sourceMappingURL=deltaE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deltaE.d.ts","sourceRoot":"","sources":["../../src/math/deltaE.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAE7D;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAKtD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAE/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAwB/C;AAgCD,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,SAAI,EAAE,EAAE,SAAI,EAAE,EAAE,SAAI,GAAG,MAAM,CAoFzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAKtD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAE/C"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * CIE color-difference metrics. Inputs are `Lab` triples (L, a, b) as
3
+ * produced by `rgbaToLab` from `colorSpace.ts`.
4
+ *
5
+ * All three metrics operate in CIELAB; the differences are in how each
6
+ * region of Lab space is weighted:
7
+ * ΔE*76 — simple Euclidean in Lab (CIE 1976). Fast, decent.
8
+ * ΔE*94 — adds chroma/hue weighting (CIE 1994). Better saturation handling.
9
+ * ΔE00 — also adjusts L/C/h + rotation correction in blue-purple region
10
+ * (CIE 2000, aka CIEDE2000). Current industry standard.
11
+ *
12
+ * References:
13
+ * CIE 15:2004 (Colorimetry), CIE TC1-29 (ΔE2000).
14
+ * G. Sharma, W. Wu, E.N. Dalal, "The CIEDE2000 Color-Difference Formula"
15
+ * (Color Research & Application, 2005) — canonical test vectors.
16
+ */
17
+ /**
18
+ * ΔE*ab (CIE 1976). Simple Euclidean distance in Lab.
19
+ * Returns the *square* for speed — identify loops only need argmin, and
20
+ * sqrt is monotonic. Use `deltaE76` if you need the actual distance.
21
+ */
22
+ export function deltaE76Squared(p, q) {
23
+ const dl = p[0] - q[0];
24
+ const da = p[1] - q[1];
25
+ const db = p[2] - q[2];
26
+ return dl * dl + da * da + db * db;
27
+ }
28
+ export function deltaE76(p, q) {
29
+ return Math.sqrt(deltaE76Squared(p, q));
30
+ }
31
+ /**
32
+ * ΔE*94 (CIE 1994). Weights the chroma and hue contributions relative to
33
+ * Lab Euclidean distance — fixes the "saturated colors feel too far apart"
34
+ * problem of ΔE*76. Uses graphic-arts constants (kL=1, K1=0.045, K2=0.015).
35
+ *
36
+ * Not symmetric in the strict sense (reference vs sample), but we treat
37
+ * both inputs as graphic-arts samples — the formula reduces to a
38
+ * symmetric form below.
39
+ */
40
+ export function deltaE94(p, q) {
41
+ const [l1, a1, b1] = p;
42
+ const [l2, a2, b2] = q;
43
+ const dL = l1 - l2;
44
+ const c1 = Math.hypot(a1, b1);
45
+ const c2 = Math.hypot(a2, b2);
46
+ const dC = c1 - c2;
47
+ const da = a1 - a2;
48
+ const db = b1 - b2;
49
+ const dH2 = da * da + db * db - dC * dC;
50
+ // dH² can go slightly negative due to floating-point — clamp.
51
+ const dH2Safe = dH2 < 0 ? 0 : dH2;
52
+ const K1 = 0.045;
53
+ const K2 = 0.015;
54
+ const sL = 1;
55
+ const sC = 1 + K1 * c1;
56
+ const sH = 1 + K2 * c1;
57
+ const termL = dL / sL;
58
+ const termC = dC / sC;
59
+ const termH = Math.sqrt(dH2Safe) / sH;
60
+ return Math.sqrt(termL * termL + termC * termC + termH * termH);
61
+ }
62
+ // ---- ΔE00 helpers --------------------------------------------------------
63
+ const DEG = Math.PI / 180;
64
+ const RAD = 180 / Math.PI;
65
+ function hueDeg(b, a) {
66
+ if (b === 0 && a === 0)
67
+ return 0;
68
+ return (Math.atan2(b, a) * RAD + 360) % 360;
69
+ }
70
+ /**
71
+ * ΔE*00 (CIE 2000 / CIEDE2000). Current industry-standard perceptual
72
+ * color-difference formula. Fixes the saturated-blue failure of ΔE76/94
73
+ * with a rotation term in the blue-purple region (h ≈ 275°).
74
+ *
75
+ * kL / kC / kH are parametric factors (default 1/1/1 = graphic arts).
76
+ * Reference: G. Sharma, W. Wu, E.N. Dalal, "The CIEDE2000 Color-Difference
77
+ * Formula" (Color Research & Application, 2005).
78
+ */
79
+ // Precomputed constant: 25^7 = 6,103,515,625. Appears twice in the formula.
80
+ const POW_25_7 = 6103515625;
81
+ // Inline pow(x, 7) — Math.pow with non-integer exponent is slower in V8
82
+ // than three multiplies. x² → x⁴ → x⁶·x.
83
+ function pow7(x) {
84
+ const x2 = x * x;
85
+ const x4 = x2 * x2;
86
+ return x4 * x2 * x;
87
+ }
88
+ export function deltaE2000(p, q, kL = 1, kC = 1, kH = 1) {
89
+ const l1 = p[0];
90
+ const a1 = p[1];
91
+ const b1 = p[2];
92
+ const l2 = q[0];
93
+ const a2 = q[1];
94
+ const b2 = q[2];
95
+ // Chromas and mean chroma. Lab values stay within ±150 so overflow
96
+ // protection in Math.hypot is unnecessary — plain sqrt(a²+b²) is ~3×
97
+ // faster in V8 and more than precise enough for our range.
98
+ const c1 = Math.sqrt(a1 * a1 + b1 * b1);
99
+ const c2 = Math.sqrt(a2 * a2 + b2 * b2);
100
+ const cBar = (c1 + c2) / 2;
101
+ const cBar7 = pow7(cBar);
102
+ // G-factor boost for a* in low-chroma regions.
103
+ const g = 0.5 * (1 - Math.sqrt(cBar7 / (cBar7 + POW_25_7)));
104
+ const a1p = (1 + g) * a1;
105
+ const a2p = (1 + g) * a2;
106
+ // Primed chroma and hue.
107
+ const c1p = Math.sqrt(a1p * a1p + b1 * b1);
108
+ const c2p = Math.sqrt(a2p * a2p + b2 * b2);
109
+ const h1p = hueDeg(b1, a1p);
110
+ const h2p = hueDeg(b2, a2p);
111
+ // Differences.
112
+ const dLp = l2 - l1;
113
+ const dCp = c2p - c1p;
114
+ let dhp;
115
+ if (c1p * c2p === 0) {
116
+ dhp = 0;
117
+ }
118
+ else {
119
+ const raw = h2p - h1p;
120
+ if (Math.abs(raw) <= 180)
121
+ dhp = raw;
122
+ else if (raw > 180)
123
+ dhp = raw - 360;
124
+ else
125
+ dhp = raw + 360;
126
+ }
127
+ const dHp = 2 * Math.sqrt(c1p * c2p) * Math.sin((dhp * DEG) / 2);
128
+ // Means.
129
+ const lBarP = (l1 + l2) / 2;
130
+ const cBarP = (c1p + c2p) / 2;
131
+ let hBarP;
132
+ if (c1p * c2p === 0) {
133
+ hBarP = h1p + h2p;
134
+ }
135
+ else if (Math.abs(h1p - h2p) <= 180) {
136
+ hBarP = (h1p + h2p) / 2;
137
+ }
138
+ else if (h1p + h2p < 360) {
139
+ hBarP = (h1p + h2p + 360) / 2;
140
+ }
141
+ else {
142
+ hBarP = (h1p + h2p - 360) / 2;
143
+ }
144
+ // Weighting function T.
145
+ const hBarRad = hBarP * DEG;
146
+ const t = 1 -
147
+ 0.17 * Math.cos(hBarRad - 30 * DEG) +
148
+ 0.24 * Math.cos(2 * hBarRad) +
149
+ 0.32 * Math.cos(3 * hBarRad + 6 * DEG) -
150
+ 0.2 * Math.cos(4 * hBarRad - 63 * DEG);
151
+ // Lightness, chroma, hue weighting factors.
152
+ const lBarMinus50Sq = (lBarP - 50) ** 2;
153
+ const sL = 1 + (0.015 * lBarMinus50Sq) / Math.sqrt(20 + lBarMinus50Sq);
154
+ const sC = 1 + 0.045 * cBarP;
155
+ const sH = 1 + 0.015 * cBarP * t;
156
+ // Rotation term — the blue-purple correction that ΔE94 lacks.
157
+ const hShift = (hBarP - 275) / 25;
158
+ const dTheta = 30 * Math.exp(-(hShift * hShift));
159
+ const cBarP7 = pow7(cBarP);
160
+ const rC = 2 * Math.sqrt(cBarP7 / (cBarP7 + POW_25_7));
161
+ const rT = -Math.sin(2 * dTheta * DEG) * rC;
162
+ const termL = dLp / (kL * sL);
163
+ const termC = dCp / (kC * sC);
164
+ const termH = dHp / (kH * sH);
165
+ return Math.sqrt(termL * termL + termC * termC + termH * termH + rT * termC * termH);
166
+ }
167
+ /**
168
+ * Squared Euclidean distance in OKLAB space (Björn Ottosson, 2020).
169
+ * OKLAB is perceptually uniform by construction — plain Euclidean IS the
170
+ * perceptual distance, no weighting needed. Returns the square for
171
+ * argmin speed; `deltaEok` returns the actual distance.
172
+ *
173
+ * Often gives more visually-accurate nearest-matches than CIEDE2000 in
174
+ * the saturated blue/purple region.
175
+ */
176
+ export function deltaEokSquared(p, q) {
177
+ const dl = p[0] - q[0];
178
+ const da = p[1] - q[1];
179
+ const db = p[2] - q[2];
180
+ return dl * dl + da * da + db * db;
181
+ }
182
+ export function deltaEok(p, q) {
183
+ return Math.sqrt(deltaEokSquared(p, q));
184
+ }
185
+ //# sourceMappingURL=deltaE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deltaE.js","sourceRoot":"","sources":["../../src/math/deltaE.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Rgba } from '../types';
2
+ /**
3
+ * Squared Euclidean distance between two colors in RGB space.
4
+ * Alpha channel is ignored. Faster than `euclideanDistance` — use this
5
+ * when you only need to compare or minimize (sqrt is monotonic, so
6
+ * argmin(d) === argmin(d²)).
7
+ */
8
+ export declare function squaredDistanceRgb(a: Rgba, b: Rgba): number;
9
+ /**
10
+ * Euclidean distance between two colors in RGB space.
11
+ * Alpha channel is ignored (matches classic `detect-color` behavior).
12
+ * Not perceptually accurate — use deltaE (CIE Lab) for color matching
13
+ * where perceptual uniformity matters.
14
+ */
15
+ export declare function euclideanDistance(a: Rgba, b: Rgba): number;
16
+ //# sourceMappingURL=euclideanDistance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"euclideanDistance.d.ts","sourceRoot":"","sources":["../../src/math/euclideanDistance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAErC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAK3D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Squared Euclidean distance between two colors in RGB space.
3
+ * Alpha channel is ignored. Faster than `euclideanDistance` — use this
4
+ * when you only need to compare or minimize (sqrt is monotonic, so
5
+ * argmin(d) === argmin(d²)).
6
+ */
7
+ export function squaredDistanceRgb(a, b) {
8
+ const dr = a.r - b.r;
9
+ const dg = a.g - b.g;
10
+ const db = a.b - b.b;
11
+ return dr * dr + dg * dg + db * db;
12
+ }
13
+ /**
14
+ * Euclidean distance between two colors in RGB space.
15
+ * Alpha channel is ignored (matches classic `detect-color` behavior).
16
+ * Not perceptually accurate — use deltaE (CIE Lab) for color matching
17
+ * where perceptual uniformity matters.
18
+ */
19
+ export function euclideanDistance(a, b) {
20
+ return Math.sqrt(squaredDistanceRgb(a, b));
21
+ }
22
+ //# sourceMappingURL=euclideanDistance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"euclideanDistance.js","sourceRoot":"","sources":["../../src/math/euclideanDistance.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAO,EAAE,CAAO;IACjD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAO,EAAE,CAAO;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Map a normalized hue sector value (range [0, 6)) plus chroma and its
3
+ * secondary into the primary-color tuple `[r', g', b']` used by the
4
+ * standard HSL→RGB and HSV→RGB algorithms. Each component is in [0, chroma].
5
+ *
6
+ * Shared by `hslToRgba` and `hsvToRgba`: same six-sector table, different
7
+ * formulas for chroma and the offset. The caller adds the offset and
8
+ * scales by 255.
9
+ *
10
+ * hueSector = h / 60 (h wrapped to [0, 360))
11
+ * chroma = HSL: (1 − |2l − 1|)·s ; HSV: v·s
12
+ * secondary = chroma · (1 − |hueSector mod 2 − 1|)
13
+ */
14
+ export declare function hueSectorToPrime(hueSector: number, chroma: number, secondary: number): [number, number, number];
15
+ //# sourceMappingURL=hueSector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hueSector.d.ts","sourceRoot":"","sources":["../../src/math/hueSector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAO1B"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Map a normalized hue sector value (range [0, 6)) plus chroma and its
3
+ * secondary into the primary-color tuple `[r', g', b']` used by the
4
+ * standard HSL→RGB and HSV→RGB algorithms. Each component is in [0, chroma].
5
+ *
6
+ * Shared by `hslToRgba` and `hsvToRgba`: same six-sector table, different
7
+ * formulas for chroma and the offset. The caller adds the offset and
8
+ * scales by 255.
9
+ *
10
+ * hueSector = h / 60 (h wrapped to [0, 360))
11
+ * chroma = HSL: (1 − |2l − 1|)·s ; HSV: v·s
12
+ * secondary = chroma · (1 − |hueSector mod 2 − 1|)
13
+ */
14
+ export function hueSectorToPrime(hueSector, chroma, secondary) {
15
+ if (hueSector < 1)
16
+ return [chroma, secondary, 0];
17
+ if (hueSector < 2)
18
+ return [secondary, chroma, 0];
19
+ if (hueSector < 3)
20
+ return [0, chroma, secondary];
21
+ if (hueSector < 4)
22
+ return [0, secondary, chroma];
23
+ if (hueSector < 5)
24
+ return [secondary, 0, chroma];
25
+ return [chroma, 0, secondary];
26
+ }
27
+ //# sourceMappingURL=hueSector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hueSector.js","sourceRoot":"","sources":["../../src/math/hueSector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,MAAc,EACd,SAAiB;IAEjB,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACjD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACjD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACjD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ColorFormat, ColorspaceName, ColorValue } from './types';
2
+ /**
3
+ * Resolve a human-readable name to a color. Normalizes the input
4
+ * (lowercases, strips non-alphanumeric characters, and for the pantone
5
+ * colorspace also strips a leading "Pantone" or "PMS" prefix) before
6
+ * looking it up in the chosen colorspace. Returns `null` if unknown.
7
+ *
8
+ * Defaults: colorspace = 'web', format = 'HEX'.
9
+ */
10
+ export declare function resolve(name: string, opts?: {
11
+ colorspace?: ColorspaceName;
12
+ format?: ColorFormat;
13
+ }): ColorValue | null;
14
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAY,MAAM,SAAS,CAAC;AAEjF;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAC/D,UAAU,GAAG,IAAI,CAUnB"}
@@ -0,0 +1,26 @@
1
+ import { COLORSPACE_NAMES, COLORSPACES, NORMALIZERS } from './colorspaces/registry';
2
+ import { hexToRgba } from './conversions/hex';
3
+ import { fromRgba } from './convert';
4
+ import { getNameIndex } from './indexing';
5
+ /**
6
+ * Resolve a human-readable name to a color. Normalizes the input
7
+ * (lowercases, strips non-alphanumeric characters, and for the pantone
8
+ * colorspace also strips a leading "Pantone" or "PMS" prefix) before
9
+ * looking it up in the chosen colorspace. Returns `null` if unknown.
10
+ *
11
+ * Defaults: colorspace = 'web', format = 'HEX'.
12
+ */
13
+ export function resolve(name, opts = {}) {
14
+ const { colorspace = 'web', format = 'HEX' } = opts;
15
+ if (!COLORSPACE_NAMES.has(colorspace))
16
+ return null;
17
+ const space = COLORSPACES[colorspace];
18
+ const normalize = NORMALIZERS[colorspace];
19
+ const canonical = getNameIndex(space, normalize).get(normalize(name));
20
+ if (canonical === undefined)
21
+ return null;
22
+ const hex = space[canonical];
23
+ // Skip detectFormat — we already know this is HEX (read from colorspace data).
24
+ return fromRgba(hexToRgba(hex), format);
25
+ }
26
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CACrB,IAAY,EACZ,IAAI,GAA0D,EAAE;IAEhE,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IACpD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAa,CAAC;IACzC,+EAA+E;IAC/E,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,43 @@
1
+ export type HexColor = `#${string}`;
2
+ export type RgbString = `rgb(${number},${number},${number})` | `rgb(${number}, ${number}, ${number})`;
3
+ export type RgbTuple = readonly [r: number, g: number, b: number];
4
+ export type RgbObject = {
5
+ r: number;
6
+ g: number;
7
+ b: number;
8
+ };
9
+ export type RgbInput = RgbString | RgbTuple | RgbObject;
10
+ export type RgbaString = `rgba(${number},${number},${number},${number})` | `rgba(${number}, ${number}, ${number}, ${number})`;
11
+ export type RgbaTuple = readonly [r: number, g: number, b: number, a: number];
12
+ export type Rgba = {
13
+ r: number;
14
+ g: number;
15
+ b: number;
16
+ a: number;
17
+ };
18
+ export type RgbaInput = RgbaString | RgbaTuple | Rgba;
19
+ export type HslString = `hsl(${number}, ${number}%, ${number}%)`;
20
+ export type HslObject = {
21
+ h: number;
22
+ s: number;
23
+ l: number;
24
+ };
25
+ export type HslInput = HslString | HslObject;
26
+ export type HsvString = `hsv(${number}, ${number}%, ${number}%)`;
27
+ export type HsvObject = {
28
+ h: number;
29
+ s: number;
30
+ v: number;
31
+ };
32
+ export type HsvInput = HsvString | HsvObject;
33
+ export type PantoneCode = string;
34
+ export type ColorInput = HexColor | RgbInput | RgbaInput | HslInput | HsvInput | PantoneCode;
35
+ declare const FORMAT_VALUES: readonly ['HEX', 'RGB', 'RGBA', 'HSL', 'HSV', 'PANTONE'];
36
+ export type ColorFormat = (typeof FORMAT_VALUES)[number];
37
+ export declare const COLOR_FORMATS: ReadonlySet<ColorFormat>;
38
+ export type ColorValue = HexColor | RgbString | Rgba | HslString | HsvString | PantoneCode;
39
+ export type Colorspace = Record<string, HexColor>;
40
+ export type ColorspaceName = 'web' | 'x11' | 'pantone';
41
+ export type DistanceMetric = 'euclidean-srgb' | 'euclidean-linear' | 'deltaE76' | 'deltaE94' | 'deltaE2000' | 'deltaEok';
42
+ export {};
43
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAC;AAGpC,MAAM,MAAM,SAAS,GACjB,OAAO,MAAM,IAAI,MAAM,IAAI,MAAM,GAAG,GACpC,OAAO,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC;AAC3C,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5D,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAGxD,MAAM,MAAM,UAAU,GAClB,QAAQ,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,GAAG,GAC/C,QAAQ,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC;AACvD,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9E,MAAM,MAAM,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC;AAGtD,MAAM,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,MAAM,MAAM,MAAM,IAAI,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5D,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAG7C,MAAM,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,MAAM,MAAM,MAAM,IAAI,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5D,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAI7C,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAGjC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAG7F,QAAA,MAAM,aAAa,YAAI,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;AAC/E,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,WAAW,CAA0B,CAAC;AAG9E,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAG3F,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAClD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;AAWvD,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,kBAAkB,GAClB,UAAU,GACV,UAAU,GACV,YAAY,GACZ,UAAU,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ // --- Format keys (SCREAMING_CAPS — these are lookup keys for converter dispatch) ---
2
+ const FORMAT_VALUES = ['HEX', 'RGB', 'RGBA', 'HSL', 'HSV', 'PANTONE'];
3
+ export const COLOR_FORMATS = new Set(FORMAT_VALUES);
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAoCA,sFAAsF;AACtF,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;AAE/E,MAAM,CAAC,MAAM,aAAa,GAA6B,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,12 +1,30 @@
1
1
  {
2
2
  "name": "chromonym",
3
- "version": "1.0.1",
4
- "description": "Color naming tool — resolve RGB or Hex color input to a human-readable name.",
3
+ "version": "1.2.0",
4
+ "description": "Tree-shakeable color-naming primitive for TypeScript. Identify, resolve, and convert colors across CSS, X11, and Pantone colorspaces — with perceptual distance metrics (CIEDE2000).",
5
5
  "keywords": [
6
6
  "color",
7
- "naming",
8
- "rgb",
7
+ "color-name",
8
+ "color-naming",
9
+ "color-identify",
10
+ "color-resolve",
11
+ "color-convert",
12
+ "nearest-color",
13
+ "css-colors",
14
+ "x11-colors",
15
+ "pantone",
16
+ "deltaE",
17
+ "ciede2000",
18
+ "lab",
19
+ "oklab",
20
+ "perceptual",
21
+ "typescript",
22
+ "tree-shakeable",
23
+ "tree-shaking",
9
24
  "hex",
25
+ "rgb",
26
+ "hsl",
27
+ "hsv",
10
28
  "palette",
11
29
  "chromonym"
12
30
  ],
@@ -21,6 +39,7 @@
21
39
  "url": "https://github.com/simiancraft/chromonym/issues"
22
40
  },
23
41
  "type": "module",
42
+ "sideEffects": false,
24
43
  "main": "./dist/index.js",
25
44
  "module": "./dist/index.js",
26
45
  "types": "./dist/index.d.ts",
@@ -28,12 +47,57 @@
28
47
  ".": {
29
48
  "types": "./dist/index.d.ts",
30
49
  "import": "./dist/index.js"
50
+ },
51
+ "./web": {
52
+ "types": "./dist/colorspaces/web.d.ts",
53
+ "import": "./dist/colorspaces/web.js"
54
+ },
55
+ "./x11": {
56
+ "types": "./dist/colorspaces/x11.d.ts",
57
+ "import": "./dist/colorspaces/x11.js"
58
+ },
59
+ "./pantone": {
60
+ "types": "./dist/colorspaces/pantone.d.ts",
61
+ "import": "./dist/colorspaces/pantone.js"
62
+ },
63
+ "./conversions/hex": {
64
+ "types": "./dist/conversions/hex.d.ts",
65
+ "import": "./dist/conversions/hex.js"
66
+ },
67
+ "./conversions/rgb": {
68
+ "types": "./dist/conversions/rgb.d.ts",
69
+ "import": "./dist/conversions/rgb.js"
70
+ },
71
+ "./conversions/hsl": {
72
+ "types": "./dist/conversions/hsl.d.ts",
73
+ "import": "./dist/conversions/hsl.js"
74
+ },
75
+ "./conversions/hsv": {
76
+ "types": "./dist/conversions/hsv.d.ts",
77
+ "import": "./dist/conversions/hsv.js"
78
+ },
79
+ "./conversions/pantone": {
80
+ "types": "./dist/conversions/pantone.d.ts",
81
+ "import": "./dist/conversions/pantone.js"
82
+ },
83
+ "./math/deltaE": {
84
+ "types": "./dist/math/deltaE.d.ts",
85
+ "import": "./dist/math/deltaE.js"
86
+ },
87
+ "./math/colorSpace": {
88
+ "types": "./dist/math/colorSpace.d.ts",
89
+ "import": "./dist/math/colorSpace.js"
90
+ },
91
+ "./types": {
92
+ "types": "./dist/types.d.ts",
93
+ "import": "./dist/types.js"
31
94
  }
32
95
  },
33
96
  "files": [
34
97
  "dist",
35
98
  "README.md",
36
- "LICENSE"
99
+ "LICENSE",
100
+ "NOTICE.md"
37
101
  ],
38
102
  "scripts": {
39
103
  "build": "tsgo",