@ansh-ui/core 0.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/LICENSE +21 -0
- package/dist/behaviours.cjs +64 -0
- package/dist/behaviours.cjs.map +1 -0
- package/dist/behaviours.d.cts +3 -0
- package/dist/behaviours.d.ts +3 -0
- package/dist/behaviours.js +7 -0
- package/dist/behaviours.js.map +1 -0
- package/dist/chunk-23GSSIMK.cjs +439 -0
- package/dist/chunk-23GSSIMK.cjs.map +1 -0
- package/dist/chunk-56NNBIAO.js +2446 -0
- package/dist/chunk-56NNBIAO.js.map +1 -0
- package/dist/chunk-6PFYGJWD.cjs +136 -0
- package/dist/chunk-6PFYGJWD.cjs.map +1 -0
- package/dist/chunk-7MEIXWPH.js +313 -0
- package/dist/chunk-7MEIXWPH.js.map +1 -0
- package/dist/chunk-7MYTSAPR.js +83 -0
- package/dist/chunk-7MYTSAPR.js.map +1 -0
- package/dist/chunk-BOQQHICI.js +1036 -0
- package/dist/chunk-BOQQHICI.js.map +1 -0
- package/dist/chunk-C6XPQO2O.js +1170 -0
- package/dist/chunk-C6XPQO2O.js.map +1 -0
- package/dist/chunk-DXJ63QAR.cjs +723 -0
- package/dist/chunk-DXJ63QAR.cjs.map +1 -0
- package/dist/chunk-FAVIEION.js +705 -0
- package/dist/chunk-FAVIEION.js.map +1 -0
- package/dist/chunk-FNR35HTL.cjs +107 -0
- package/dist/chunk-FNR35HTL.cjs.map +1 -0
- package/dist/chunk-GHBRGMSO.cjs +91 -0
- package/dist/chunk-GHBRGMSO.cjs.map +1 -0
- package/dist/chunk-GJRIHN76.cjs +359 -0
- package/dist/chunk-GJRIHN76.cjs.map +1 -0
- package/dist/chunk-ILKUL7GD.cjs +115 -0
- package/dist/chunk-ILKUL7GD.cjs.map +1 -0
- package/dist/chunk-KTUBCQC3.js +409 -0
- package/dist/chunk-KTUBCQC3.js.map +1 -0
- package/dist/chunk-KU2C6GEA.js +90 -0
- package/dist/chunk-KU2C6GEA.js.map +1 -0
- package/dist/chunk-LGA3N3YJ.cjs +413 -0
- package/dist/chunk-LGA3N3YJ.cjs.map +1 -0
- package/dist/chunk-MMO7KO53.cjs +1060 -0
- package/dist/chunk-MMO7KO53.cjs.map +1 -0
- package/dist/chunk-NSXKCJJ7.js +109 -0
- package/dist/chunk-NSXKCJJ7.js.map +1 -0
- package/dist/chunk-QALZKHWH.js +387 -0
- package/dist/chunk-QALZKHWH.js.map +1 -0
- package/dist/chunk-R7UJ7MWP.cjs +2479 -0
- package/dist/chunk-R7UJ7MWP.cjs.map +1 -0
- package/dist/chunk-UJBXY6QC.cjs +1186 -0
- package/dist/chunk-UJBXY6QC.cjs.map +1 -0
- package/dist/chunk-YFQXRC5R.js +99 -0
- package/dist/chunk-YFQXRC5R.js.map +1 -0
- package/dist/color.cjs +257 -0
- package/dist/color.cjs.map +1 -0
- package/dist/color.d.cts +303 -0
- package/dist/color.d.ts +303 -0
- package/dist/color.js +8 -0
- package/dist/color.js.map +1 -0
- package/dist/easing.cjs +189 -0
- package/dist/easing.cjs.map +1 -0
- package/dist/easing.d.cts +134 -0
- package/dist/easing.d.ts +134 -0
- package/dist/easing.js +4 -0
- package/dist/easing.js.map +1 -0
- package/dist/effects.cjs +99 -0
- package/dist/effects.cjs.map +1 -0
- package/dist/effects.d.cts +5 -0
- package/dist/effects.d.ts +5 -0
- package/dist/effects.js +10 -0
- package/dist/effects.js.map +1 -0
- package/dist/index-CCdpefMp.d.ts +967 -0
- package/dist/index-CQEEPu-D.d.ts +435 -0
- package/dist/index-DHOfsEIn.d.cts +967 -0
- package/dist/index-Dl8GCsya.d.cts +435 -0
- package/dist/index.cjs +2206 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1122 -0
- package/dist/index.d.ts +1122 -0
- package/dist/index.js +1182 -0
- package/dist/index.js.map +1 -0
- package/dist/math.cjs +238 -0
- package/dist/math.cjs.map +1 -0
- package/dist/math.d.cts +120 -0
- package/dist/math.d.ts +120 -0
- package/dist/math.js +5 -0
- package/dist/math.js.map +1 -0
- package/dist/noise.cjs +78 -0
- package/dist/noise.cjs.map +1 -0
- package/dist/noise.d.cts +190 -0
- package/dist/noise.d.ts +190 -0
- package/dist/noise.js +5 -0
- package/dist/noise.js.map +1 -0
- package/dist/palette-6HkVltYU.d.cts +219 -0
- package/dist/palette-6HkVltYU.d.ts +219 -0
- package/dist/random--4mSc5Lp.d.cts +75 -0
- package/dist/random--4mSc5Lp.d.ts +75 -0
- package/dist/reduced-motion-D0LUgZle.d.cts +120 -0
- package/dist/reduced-motion-D0LUgZle.d.ts +120 -0
- package/dist/types-B1FLLf3-.d.cts +21 -0
- package/dist/types-B1FLLf3-.d.ts +21 -0
- package/package.json +78 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { clamp, wrap } from './chunk-KU2C6GEA.js';
|
|
2
|
+
|
|
3
|
+
// src/color/convert.ts
|
|
4
|
+
function srgbToLinearChannel(c) {
|
|
5
|
+
return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
6
|
+
}
|
|
7
|
+
function linearToSrgbChannel(c) {
|
|
8
|
+
return c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055;
|
|
9
|
+
}
|
|
10
|
+
function rgbToLinear(rgb) {
|
|
11
|
+
return {
|
|
12
|
+
r: srgbToLinearChannel(rgb.r),
|
|
13
|
+
g: srgbToLinearChannel(rgb.g),
|
|
14
|
+
b: srgbToLinearChannel(rgb.b),
|
|
15
|
+
a: rgb.a
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function linearToRgb(lin) {
|
|
19
|
+
return {
|
|
20
|
+
r: linearToSrgbChannel(lin.r),
|
|
21
|
+
g: linearToSrgbChannel(lin.g),
|
|
22
|
+
b: linearToSrgbChannel(lin.b),
|
|
23
|
+
a: lin.a
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function linearToOklab(lin) {
|
|
27
|
+
const l = 0.4122214708 * lin.r + 0.5363325363 * lin.g + 0.0514459929 * lin.b;
|
|
28
|
+
const m = 0.2119034982 * lin.r + 0.6806995451 * lin.g + 0.1073969566 * lin.b;
|
|
29
|
+
const s = 0.0883024619 * lin.r + 0.2817188376 * lin.g + 0.6299787005 * lin.b;
|
|
30
|
+
const l_ = Math.cbrt(l);
|
|
31
|
+
const m_ = Math.cbrt(m);
|
|
32
|
+
const s_ = Math.cbrt(s);
|
|
33
|
+
return {
|
|
34
|
+
l: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,
|
|
35
|
+
a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,
|
|
36
|
+
b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,
|
|
37
|
+
alpha: lin.a
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function oklabToLinear(lab) {
|
|
41
|
+
const l_ = lab.l + 0.3963377774 * lab.a + 0.2158037573 * lab.b;
|
|
42
|
+
const m_ = lab.l - 0.1055613458 * lab.a - 0.0638541728 * lab.b;
|
|
43
|
+
const s_ = lab.l - 0.0894841775 * lab.a - 1.291485548 * lab.b;
|
|
44
|
+
const l = l_ * l_ * l_;
|
|
45
|
+
const m = m_ * m_ * m_;
|
|
46
|
+
const s = s_ * s_ * s_;
|
|
47
|
+
return {
|
|
48
|
+
r: 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
|
|
49
|
+
g: -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
|
|
50
|
+
b: -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,
|
|
51
|
+
a: lab.alpha
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function rgbToOklab(rgb) {
|
|
55
|
+
return linearToOklab(rgbToLinear(rgb));
|
|
56
|
+
}
|
|
57
|
+
function oklabToRgb(lab) {
|
|
58
|
+
const lin = oklabToLinear(lab);
|
|
59
|
+
return {
|
|
60
|
+
r: clamp(linearToSrgbChannel(lin.r), 0, 1),
|
|
61
|
+
g: clamp(linearToSrgbChannel(lin.g), 0, 1),
|
|
62
|
+
b: clamp(linearToSrgbChannel(lin.b), 0, 1),
|
|
63
|
+
a: lab.alpha
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function oklabToOklch(lab) {
|
|
67
|
+
const c = Math.hypot(lab.a, lab.b);
|
|
68
|
+
const h = c < 1e-7 ? 0 : wrap(Math.atan2(lab.b, lab.a) * 180 / Math.PI, 0, 360);
|
|
69
|
+
return { l: lab.l, c, h, alpha: lab.alpha };
|
|
70
|
+
}
|
|
71
|
+
function oklchToOklab(lch) {
|
|
72
|
+
const rad = lch.h * Math.PI / 180;
|
|
73
|
+
return {
|
|
74
|
+
l: lch.l,
|
|
75
|
+
a: Math.cos(rad) * lch.c,
|
|
76
|
+
b: Math.sin(rad) * lch.c,
|
|
77
|
+
alpha: lch.alpha
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function rgbToOklch(rgb) {
|
|
81
|
+
return oklabToOklch(rgbToOklab(rgb));
|
|
82
|
+
}
|
|
83
|
+
function oklchToRgb(lch) {
|
|
84
|
+
return oklabToRgb(oklchToOklab(lch));
|
|
85
|
+
}
|
|
86
|
+
function rgbToHsl(rgb) {
|
|
87
|
+
const max = Math.max(rgb.r, rgb.g, rgb.b);
|
|
88
|
+
const min = Math.min(rgb.r, rgb.g, rgb.b);
|
|
89
|
+
const delta = max - min;
|
|
90
|
+
const l = (max + min) / 2;
|
|
91
|
+
let h = 0;
|
|
92
|
+
let s = 0;
|
|
93
|
+
if (delta > 1e-7) {
|
|
94
|
+
s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);
|
|
95
|
+
if (max === rgb.r) h = ((rgb.g - rgb.b) / delta + (rgb.g < rgb.b ? 6 : 0)) * 60;
|
|
96
|
+
else if (max === rgb.g) h = ((rgb.b - rgb.r) / delta + 2) * 60;
|
|
97
|
+
else h = ((rgb.r - rgb.g) / delta + 4) * 60;
|
|
98
|
+
}
|
|
99
|
+
return { h, s, l, a: rgb.a };
|
|
100
|
+
}
|
|
101
|
+
function hslToRgb(hsl) {
|
|
102
|
+
const h = wrap(hsl.h, 0, 360) / 360;
|
|
103
|
+
const s = clamp(hsl.s, 0, 1);
|
|
104
|
+
const l = clamp(hsl.l, 0, 1);
|
|
105
|
+
if (s === 0) return { r: l, g: l, b: l, a: hsl.a };
|
|
106
|
+
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
107
|
+
const p = 2 * l - q;
|
|
108
|
+
return {
|
|
109
|
+
r: hueToChannel(p, q, h + 1 / 3),
|
|
110
|
+
g: hueToChannel(p, q, h),
|
|
111
|
+
b: hueToChannel(p, q, h - 1 / 3),
|
|
112
|
+
a: hsl.a
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function hueToChannel(p, q, t) {
|
|
116
|
+
let tt = t;
|
|
117
|
+
if (tt < 0) tt += 1;
|
|
118
|
+
if (tt > 1) tt -= 1;
|
|
119
|
+
if (tt < 1 / 6) return p + (q - p) * 6 * tt;
|
|
120
|
+
if (tt < 1 / 2) return q;
|
|
121
|
+
if (tt < 2 / 3) return p + (q - p) * (2 / 3 - tt) * 6;
|
|
122
|
+
return p;
|
|
123
|
+
}
|
|
124
|
+
function rgbToHsv(rgb) {
|
|
125
|
+
const max = Math.max(rgb.r, rgb.g, rgb.b);
|
|
126
|
+
const min = Math.min(rgb.r, rgb.g, rgb.b);
|
|
127
|
+
const delta = max - min;
|
|
128
|
+
let h = 0;
|
|
129
|
+
if (delta > 1e-7) {
|
|
130
|
+
if (max === rgb.r) h = ((rgb.g - rgb.b) / delta + (rgb.g < rgb.b ? 6 : 0)) * 60;
|
|
131
|
+
else if (max === rgb.g) h = ((rgb.b - rgb.r) / delta + 2) * 60;
|
|
132
|
+
else h = ((rgb.r - rgb.g) / delta + 4) * 60;
|
|
133
|
+
}
|
|
134
|
+
return { h, s: max === 0 ? 0 : delta / max, v: max, a: rgb.a };
|
|
135
|
+
}
|
|
136
|
+
function hsvToRgb(hsv) {
|
|
137
|
+
const h = wrap(hsv.h, 0, 360) / 60;
|
|
138
|
+
const s = clamp(hsv.s, 0, 1);
|
|
139
|
+
const v = clamp(hsv.v, 0, 1);
|
|
140
|
+
const i = Math.floor(h);
|
|
141
|
+
const f = h - i;
|
|
142
|
+
const p = v * (1 - s);
|
|
143
|
+
const q = v * (1 - s * f);
|
|
144
|
+
const t = v * (1 - s * (1 - f));
|
|
145
|
+
switch (i % 6) {
|
|
146
|
+
case 0:
|
|
147
|
+
return { r: v, g: t, b: p, a: hsv.a };
|
|
148
|
+
case 1:
|
|
149
|
+
return { r: q, g: v, b: p, a: hsv.a };
|
|
150
|
+
case 2:
|
|
151
|
+
return { r: p, g: v, b: t, a: hsv.a };
|
|
152
|
+
case 3:
|
|
153
|
+
return { r: p, g: q, b: v, a: hsv.a };
|
|
154
|
+
case 4:
|
|
155
|
+
return { r: t, g: p, b: v, a: hsv.a };
|
|
156
|
+
default:
|
|
157
|
+
return { r: v, g: p, b: q, a: hsv.a };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function relativeLuminance(rgb) {
|
|
161
|
+
const lin = rgbToLinear(rgb);
|
|
162
|
+
return 0.2126 * lin.r + 0.7152 * lin.g + 0.0722 * lin.b;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// src/color/named.ts
|
|
166
|
+
var PACKED = "aliceblue f0f8ff antiquewhite faebd7 aqua 0ff aquamarine 7fffd4 azure f0ffff beige f5f5dc bisque ffe4c4 black 000 blanchedalmond ffebcd blue 00f blueviolet 8a2be2 brown a52a2a burlywood deb887 cadetblue 5f9ea0 chartreuse 7fff00 chocolate d2691e coral ff7f50 cornflowerblue 6495ed cornsilk fff8dc crimson dc143c cyan 0ff darkblue 00008b darkcyan 008b8b darkgoldenrod b8860b darkgray a9a9a9 darkgreen 006400 darkgrey a9a9a9 darkkhaki bdb76b darkmagenta 8b008b darkolivegreen 556b2f darkorange ff8c00 darkorchid 9932cc darkred 8b0000 darksalmon e9967a darkseagreen 8fbc8f darkslateblue 483d8b darkslategray 2f4f4f darkslategrey 2f4f4f darkturquoise 00ced1 darkviolet 9400d3 deeppink ff1493 deepskyblue 00bfff dimgray 696969 dimgrey 696969 dodgerblue 1e90ff firebrick b22222 floralwhite fffaf0 forestgreen 228b22 fuchsia f0f gainsboro dcdcdc ghostwhite f8f8ff gold ffd700 goldenrod daa520 gray 808080 green 008000 greenyellow adff2f grey 808080 honeydew f0fff0 hotpink ff69b4 indianred cd5c5c indigo 4b0082 ivory fffff0 khaki f0e68c lavender e6e6fa lavenderblush fff0f5 lawngreen 7cfc00 lemonchiffon fffacd lightblue add8e6 lightcoral f08080 lightcyan e0ffff lightgoldenrodyellow fafad2 lightgray d3d3d3 lightgreen 90ee90 lightgrey d3d3d3 lightpink ffb6c1 lightsalmon ffa07a lightseagreen 20b2aa lightskyblue 87cefa lightslategray 789 lightslategrey 789 lightsteelblue b0c4de lightyellow ffffe0 lime 0f0 limegreen 32cd32 linen faf0e6 magenta f0f maroon 800000 mediumaquamarine 66cdaa mediumblue 0000cd mediumorchid ba55d3 mediumpurple 9370db mediumseagreen 3cb371 mediumslateblue 7b68ee mediumspringgreen 00fa9a mediumturquoise 48d1cc mediumvioletred c71585 midnightblue 191970 mintcream f5fffa mistyrose ffe4e1 moccasin ffe4b5 navajowhite ffdead navy 000080 oldlace fdf5e6 olive 808000 olivedrab 6b8e23 orange ffa500 orangered ff4500 orchid da70d6 palegoldenrod eee8aa palegreen 98fb98 paleturquoise afeeee palevioletred db7093 papayawhip ffefd5 peachpuff ffdab9 peru cd853f pink ffc0cb plum dda0dd powderblue b0e0e6 purple 800080 rebeccapurple 639 red f00 rosybrown bc8f8f royalblue 4169e1 saddlebrown 8b4513 salmon fa8072 sandybrown f4a460 seagreen 2e8b57 seashell fff5ee sienna a0522d silver c0c0c0 skyblue 87ceeb slateblue 6a5acd slategray 708090 slategrey 708090 snow fffafa springgreen 00ff7f steelblue 4682b4 tan d2b48c teal 008080 thistle d8bfd8 tomato ff6347 turquoise 40e0d0 violet ee82ee wheat f5deb3 white fff whitesmoke f5f5f5 yellow ff0 yellowgreen 9acd32";
|
|
167
|
+
var lookup = null;
|
|
168
|
+
function namedColorToHex(name) {
|
|
169
|
+
if (lookup === null) {
|
|
170
|
+
lookup = /* @__PURE__ */ new Map();
|
|
171
|
+
const parts = PACKED.split(" ");
|
|
172
|
+
for (let i = 0; i < parts.length - 1; i += 2) {
|
|
173
|
+
lookup.set(parts[i], `#${parts[i + 1]}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return lookup.get(name.toLowerCase());
|
|
177
|
+
}
|
|
178
|
+
function listNamedColors() {
|
|
179
|
+
namedColorToHex("black");
|
|
180
|
+
return [...lookup.keys()];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// src/color/parse.ts
|
|
184
|
+
var TRANSPARENT = { r: 0, g: 0, b: 0, a: 0 };
|
|
185
|
+
var cache = /* @__PURE__ */ new Map();
|
|
186
|
+
var MAX_CACHE = 512;
|
|
187
|
+
var ColorParseError = class extends Error {
|
|
188
|
+
constructor(input) {
|
|
189
|
+
super(
|
|
190
|
+
`[ansh] Could not parse colour "${input}". Supported: hex, rgb(), hsl(), hsv(), oklch(), oklab(), CSS colour keywords, and var(--token).`
|
|
191
|
+
);
|
|
192
|
+
this.input = input;
|
|
193
|
+
this.name = "ColorParseError";
|
|
194
|
+
}
|
|
195
|
+
input;
|
|
196
|
+
};
|
|
197
|
+
function parseColor(input) {
|
|
198
|
+
if (typeof input !== "string") return fromObject(input);
|
|
199
|
+
const key = input;
|
|
200
|
+
const cached = cache.get(key);
|
|
201
|
+
if (cached) return cached;
|
|
202
|
+
const parsed = parseString(input.trim());
|
|
203
|
+
if (!parsed) throw new ColorParseError(input);
|
|
204
|
+
if (cache.size >= MAX_CACHE) cache.clear();
|
|
205
|
+
cache.set(key, parsed);
|
|
206
|
+
return parsed;
|
|
207
|
+
}
|
|
208
|
+
function tryParseColor(input) {
|
|
209
|
+
try {
|
|
210
|
+
return parseColor(input);
|
|
211
|
+
} catch {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function fromObject(input) {
|
|
216
|
+
if ("r" in input) {
|
|
217
|
+
return {
|
|
218
|
+
r: clamp(input.r, 0, 1),
|
|
219
|
+
g: clamp(input.g, 0, 1),
|
|
220
|
+
b: clamp(input.b, 0, 1),
|
|
221
|
+
a: clamp(input.a ?? 1, 0, 1)
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
if ("c" in input) return oklchToRgb({ ...input, alpha: input.alpha ?? 1 });
|
|
225
|
+
if ("s" in input) return hslToRgb({ ...input, a: input.a ?? 1 });
|
|
226
|
+
return oklabToRgb({ ...input, alpha: input.alpha ?? 1 });
|
|
227
|
+
}
|
|
228
|
+
function parseString(raw) {
|
|
229
|
+
if (raw.length === 0) return null;
|
|
230
|
+
const lower = raw.toLowerCase();
|
|
231
|
+
if (lower === "transparent") return TRANSPARENT;
|
|
232
|
+
if (lower === "currentcolor" || lower === "inherit") return resolveComputed(raw);
|
|
233
|
+
if (raw.startsWith("#")) return parseHex(raw);
|
|
234
|
+
if (lower.startsWith("var(")) return resolveComputed(raw);
|
|
235
|
+
const fnMatch = /^([a-z]+)\((.*)\)$/is.exec(raw);
|
|
236
|
+
if (fnMatch) {
|
|
237
|
+
const fn = fnMatch[1].toLowerCase();
|
|
238
|
+
const args = splitArgs(fnMatch[2]);
|
|
239
|
+
switch (fn) {
|
|
240
|
+
case "rgb":
|
|
241
|
+
case "rgba":
|
|
242
|
+
return parseRgbFn(args);
|
|
243
|
+
case "hsl":
|
|
244
|
+
case "hsla":
|
|
245
|
+
return parseHslFn(args);
|
|
246
|
+
case "hsv":
|
|
247
|
+
case "hsb":
|
|
248
|
+
return parseHsvFn(args);
|
|
249
|
+
case "oklch":
|
|
250
|
+
return parseOklchFn(args);
|
|
251
|
+
case "oklab":
|
|
252
|
+
return parseOklabFn(args);
|
|
253
|
+
default:
|
|
254
|
+
return resolveComputed(raw);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const named = namedColorToHex(lower);
|
|
258
|
+
if (named) return parseHex(named);
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
function splitArgs(body) {
|
|
262
|
+
return body.replace(/\//g, " / ").split(/[\s,]+/).filter((s) => s.length > 0);
|
|
263
|
+
}
|
|
264
|
+
function parseHex(hex) {
|
|
265
|
+
const h = hex.slice(1);
|
|
266
|
+
if (!/^[0-9a-f]+$/i.test(h)) return null;
|
|
267
|
+
const expand = (c) => parseInt(c + c, 16) / 255;
|
|
268
|
+
const byte = (s) => parseInt(s, 16) / 255;
|
|
269
|
+
switch (h.length) {
|
|
270
|
+
case 3:
|
|
271
|
+
return { r: expand(h[0]), g: expand(h[1]), b: expand(h[2]), a: 1 };
|
|
272
|
+
case 4:
|
|
273
|
+
return { r: expand(h[0]), g: expand(h[1]), b: expand(h[2]), a: expand(h[3]) };
|
|
274
|
+
case 6:
|
|
275
|
+
return { r: byte(h.slice(0, 2)), g: byte(h.slice(2, 4)), b: byte(h.slice(4, 6)), a: 1 };
|
|
276
|
+
case 8:
|
|
277
|
+
return {
|
|
278
|
+
r: byte(h.slice(0, 2)),
|
|
279
|
+
g: byte(h.slice(2, 4)),
|
|
280
|
+
b: byte(h.slice(4, 6)),
|
|
281
|
+
a: byte(h.slice(6, 8))
|
|
282
|
+
};
|
|
283
|
+
default:
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
function num(token, scale = 1) {
|
|
288
|
+
if (token === void 0) return null;
|
|
289
|
+
if (token === "none") return 0;
|
|
290
|
+
const isPercent = token.endsWith("%");
|
|
291
|
+
const value = Number.parseFloat(isPercent ? token.slice(0, -1) : token);
|
|
292
|
+
if (!Number.isFinite(value)) return null;
|
|
293
|
+
return isPercent ? value / 100 * scale : value;
|
|
294
|
+
}
|
|
295
|
+
function readAlpha(args, fromIndex) {
|
|
296
|
+
const slash = args.indexOf("/", fromIndex);
|
|
297
|
+
const token = slash >= 0 ? args[slash + 1] : args[fromIndex];
|
|
298
|
+
if (token === void 0) return 1;
|
|
299
|
+
const parsed = num(token, 1);
|
|
300
|
+
return parsed === null ? 1 : clamp(parsed, 0, 1);
|
|
301
|
+
}
|
|
302
|
+
function parseRgbFn(args) {
|
|
303
|
+
const r = num(args[0], 255);
|
|
304
|
+
const g = num(args[1], 255);
|
|
305
|
+
const b = num(args[2], 255);
|
|
306
|
+
if (r === null || g === null || b === null) return null;
|
|
307
|
+
return {
|
|
308
|
+
r: clamp(r / 255, 0, 1),
|
|
309
|
+
g: clamp(g / 255, 0, 1),
|
|
310
|
+
b: clamp(b / 255, 0, 1),
|
|
311
|
+
a: readAlpha(args, 3)
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
function parseHslFn(args) {
|
|
315
|
+
const h = parseHue(args[0]);
|
|
316
|
+
const s = num(args[1], 1);
|
|
317
|
+
const l = num(args[2], 1);
|
|
318
|
+
if (h === null || s === null || l === null) return null;
|
|
319
|
+
return hslToRgb({ h, s: clamp(s, 0, 1), l: clamp(l, 0, 1), a: readAlpha(args, 3) });
|
|
320
|
+
}
|
|
321
|
+
function parseHsvFn(args) {
|
|
322
|
+
const h = parseHue(args[0]);
|
|
323
|
+
const s = num(args[1], 1);
|
|
324
|
+
const v = num(args[2], 1);
|
|
325
|
+
if (h === null || s === null || v === null) return null;
|
|
326
|
+
return hsvToRgb({ h, s: clamp(s, 0, 1), v: clamp(v, 0, 1), a: readAlpha(args, 3) });
|
|
327
|
+
}
|
|
328
|
+
function parseOklchFn(args) {
|
|
329
|
+
const l = num(args[0], 1);
|
|
330
|
+
const c = num(args[1], 0.4);
|
|
331
|
+
const h = parseHue(args[2]);
|
|
332
|
+
if (l === null || c === null || h === null) return null;
|
|
333
|
+
return oklchToRgb({ l: clamp(l, 0, 1), c: Math.max(0, c), h, alpha: readAlpha(args, 3) });
|
|
334
|
+
}
|
|
335
|
+
function parseOklabFn(args) {
|
|
336
|
+
const l = num(args[0], 1);
|
|
337
|
+
const a = num(args[1], 0.4);
|
|
338
|
+
const b = num(args[2], 0.4);
|
|
339
|
+
if (l === null || a === null || b === null) return null;
|
|
340
|
+
return oklabToRgb({ l: clamp(l, 0, 1), a, b, alpha: readAlpha(args, 3) });
|
|
341
|
+
}
|
|
342
|
+
function parseHue(token) {
|
|
343
|
+
if (token === void 0) return null;
|
|
344
|
+
const match = /^(-?[\d.]+)(deg|grad|rad|turn)?$/i.exec(token.trim());
|
|
345
|
+
if (!match) return null;
|
|
346
|
+
const value = Number.parseFloat(match[1]);
|
|
347
|
+
if (!Number.isFinite(value)) return null;
|
|
348
|
+
switch ((match[2] ?? "deg").toLowerCase()) {
|
|
349
|
+
case "grad":
|
|
350
|
+
return wrap(value * 0.9, 0, 360);
|
|
351
|
+
case "rad":
|
|
352
|
+
return wrap(value * 180 / Math.PI, 0, 360);
|
|
353
|
+
case "turn":
|
|
354
|
+
return wrap(value * 360, 0, 360);
|
|
355
|
+
default:
|
|
356
|
+
return wrap(value, 0, 360);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
function resolveComputed(value) {
|
|
360
|
+
if (typeof document === "undefined") return null;
|
|
361
|
+
const probe = document.createElement("span");
|
|
362
|
+
probe.style.display = "none";
|
|
363
|
+
probe.style.color = "";
|
|
364
|
+
probe.style.color = value;
|
|
365
|
+
if (probe.style.color === "") return null;
|
|
366
|
+
document.body.appendChild(probe);
|
|
367
|
+
const computed = getComputedStyle(probe).color;
|
|
368
|
+
document.body.removeChild(probe);
|
|
369
|
+
if (!computed) return null;
|
|
370
|
+
const parsed = parseString(computed);
|
|
371
|
+
return parsed;
|
|
372
|
+
}
|
|
373
|
+
function resolveCssVariable(name, element) {
|
|
374
|
+
if (typeof document === "undefined") return null;
|
|
375
|
+
const target = element ?? document.documentElement;
|
|
376
|
+
const prop = name.startsWith("--") ? name : `--${name}`;
|
|
377
|
+
const raw = getComputedStyle(target).getPropertyValue(prop).trim();
|
|
378
|
+
if (!raw) return null;
|
|
379
|
+
return tryParseColor(raw);
|
|
380
|
+
}
|
|
381
|
+
function clearColorCache() {
|
|
382
|
+
cache.clear();
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
export { ColorParseError, clearColorCache, hslToRgb, hsvToRgb, linearToOklab, linearToRgb, linearToSrgbChannel, listNamedColors, namedColorToHex, oklabToLinear, oklabToOklch, oklabToRgb, oklchToOklab, oklchToRgb, parseColor, relativeLuminance, resolveComputed, resolveCssVariable, rgbToHsl, rgbToHsv, rgbToLinear, rgbToOklab, rgbToOklch, srgbToLinearChannel, tryParseColor };
|
|
386
|
+
//# sourceMappingURL=chunk-QALZKHWH.js.map
|
|
387
|
+
//# sourceMappingURL=chunk-QALZKHWH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/color/convert.ts","../src/color/named.ts","../src/color/parse.ts"],"names":[],"mappings":"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","file":"chunk-QALZKHWH.js","sourcesContent":["import { clamp, wrap } from '../math/scalar'\nimport type { Hsl, Hsv, LinearRgb, Oklab, Oklch, Rgb } from './types'\n\n/**\n * Colour space conversions.\n *\n * Matrices for OKLab are Björn Ottosson's published values. They are reproduced to full\n * precision deliberately — truncating them introduces a visible hue shift in saturated blues.\n */\n\n// ---------------------------------------------------------------------------\n// sRGB transfer function\n// ---------------------------------------------------------------------------\n\n/** Remove the sRGB gamma curve from a single channel. */\nexport function srgbToLinearChannel(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n}\n\n/** Apply the sRGB gamma curve to a single channel. */\nexport function linearToSrgbChannel(c: number): number {\n return c <= 0.0031308 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055\n}\n\nexport function rgbToLinear(rgb: Rgb): LinearRgb {\n return {\n r: srgbToLinearChannel(rgb.r),\n g: srgbToLinearChannel(rgb.g),\n b: srgbToLinearChannel(rgb.b),\n a: rgb.a,\n }\n}\n\nexport function linearToRgb(lin: LinearRgb): Rgb {\n return {\n r: linearToSrgbChannel(lin.r),\n g: linearToSrgbChannel(lin.g),\n b: linearToSrgbChannel(lin.b),\n a: lin.a,\n }\n}\n\n// ---------------------------------------------------------------------------\n// OKLab\n// ---------------------------------------------------------------------------\n\nexport function linearToOklab(lin: LinearRgb): Oklab {\n const l = 0.4122214708 * lin.r + 0.5363325363 * lin.g + 0.0514459929 * lin.b\n const m = 0.2119034982 * lin.r + 0.6806995451 * lin.g + 0.1073969566 * lin.b\n const s = 0.0883024619 * lin.r + 0.2817188376 * lin.g + 0.6299787005 * lin.b\n\n // Cube root is signed so that (rare) small negative LMS values from out-of-gamut\n // inputs don't produce NaN and blow up the whole gradient.\n const l_ = Math.cbrt(l)\n const m_ = Math.cbrt(m)\n const s_ = Math.cbrt(s)\n\n return {\n l: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\n alpha: lin.a,\n }\n}\n\nexport function oklabToLinear(lab: Oklab): LinearRgb {\n const l_ = lab.l + 0.3963377774 * lab.a + 0.2158037573 * lab.b\n const m_ = lab.l - 0.1055613458 * lab.a - 0.0638541728 * lab.b\n const s_ = lab.l - 0.0894841775 * lab.a - 1.291485548 * lab.b\n\n const l = l_ * l_ * l_\n const m = m_ * m_ * m_\n const s = s_ * s_ * s_\n\n return {\n r: 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n g: -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n b: -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n a: lab.alpha,\n }\n}\n\nexport function rgbToOklab(rgb: Rgb): Oklab {\n return linearToOklab(rgbToLinear(rgb))\n}\n\n/**\n * OKLab → sRGB.\n *\n * The result may fall outside the sRGB gamut, in which case channels are simply clipped.\n * Use {@link import('./gamut').gamutMapOklch} when you need a perceptually sensible\n * in-gamut colour rather than a clipped one.\n */\nexport function oklabToRgb(lab: Oklab): Rgb {\n const lin = oklabToLinear(lab)\n return {\n r: clamp(linearToSrgbChannel(lin.r), 0, 1),\n g: clamp(linearToSrgbChannel(lin.g), 0, 1),\n b: clamp(linearToSrgbChannel(lin.b), 0, 1),\n a: lab.alpha,\n }\n}\n\n// ---------------------------------------------------------------------------\n// OKLCH\n// ---------------------------------------------------------------------------\n\nexport function oklabToOklch(lab: Oklab): Oklch {\n const c = Math.hypot(lab.a, lab.b)\n // A near-grey colour has no meaningful hue; report 0 rather than atan2 noise, so that\n // repeated round-trips through this pair of functions are stable.\n const h = c < 1e-7 ? 0 : wrap((Math.atan2(lab.b, lab.a) * 180) / Math.PI, 0, 360)\n return { l: lab.l, c, h, alpha: lab.alpha }\n}\n\nexport function oklchToOklab(lch: Oklch): Oklab {\n const rad = (lch.h * Math.PI) / 180\n return {\n l: lch.l,\n a: Math.cos(rad) * lch.c,\n b: Math.sin(rad) * lch.c,\n alpha: lch.alpha,\n }\n}\n\nexport function rgbToOklch(rgb: Rgb): Oklch {\n return oklabToOklch(rgbToOklab(rgb))\n}\n\nexport function oklchToRgb(lch: Oklch): Rgb {\n return oklabToRgb(oklchToOklab(lch))\n}\n\n// ---------------------------------------------------------------------------\n// HSL / HSV\n// ---------------------------------------------------------------------------\n\nexport function rgbToHsl(rgb: Rgb): Hsl {\n const max = Math.max(rgb.r, rgb.g, rgb.b)\n const min = Math.min(rgb.r, rgb.g, rgb.b)\n const delta = max - min\n const l = (max + min) / 2\n\n let h = 0\n let s = 0\n\n if (delta > 1e-7) {\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min)\n if (max === rgb.r) h = ((rgb.g - rgb.b) / delta + (rgb.g < rgb.b ? 6 : 0)) * 60\n else if (max === rgb.g) h = ((rgb.b - rgb.r) / delta + 2) * 60\n else h = ((rgb.r - rgb.g) / delta + 4) * 60\n }\n\n return { h, s, l, a: rgb.a }\n}\n\nexport function hslToRgb(hsl: Hsl): Rgb {\n const h = wrap(hsl.h, 0, 360) / 360\n const s = clamp(hsl.s, 0, 1)\n const l = clamp(hsl.l, 0, 1)\n\n if (s === 0) return { r: l, g: l, b: l, a: hsl.a }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n\n return {\n r: hueToChannel(p, q, h + 1 / 3),\n g: hueToChannel(p, q, h),\n b: hueToChannel(p, q, h - 1 / 3),\n a: hsl.a,\n }\n}\n\nfunction hueToChannel(p: number, q: number, t: number): number {\n let tt = t\n if (tt < 0) tt += 1\n if (tt > 1) tt -= 1\n if (tt < 1 / 6) return p + (q - p) * 6 * tt\n if (tt < 1 / 2) return q\n if (tt < 2 / 3) return p + (q - p) * (2 / 3 - tt) * 6\n return p\n}\n\nexport function rgbToHsv(rgb: Rgb): Hsv {\n const max = Math.max(rgb.r, rgb.g, rgb.b)\n const min = Math.min(rgb.r, rgb.g, rgb.b)\n const delta = max - min\n\n let h = 0\n if (delta > 1e-7) {\n if (max === rgb.r) h = ((rgb.g - rgb.b) / delta + (rgb.g < rgb.b ? 6 : 0)) * 60\n else if (max === rgb.g) h = ((rgb.b - rgb.r) / delta + 2) * 60\n else h = ((rgb.r - rgb.g) / delta + 4) * 60\n }\n\n return { h, s: max === 0 ? 0 : delta / max, v: max, a: rgb.a }\n}\n\nexport function hsvToRgb(hsv: Hsv): Rgb {\n const h = wrap(hsv.h, 0, 360) / 60\n const s = clamp(hsv.s, 0, 1)\n const v = clamp(hsv.v, 0, 1)\n\n const i = Math.floor(h)\n const f = h - i\n const p = v * (1 - s)\n const q = v * (1 - s * f)\n const t = v * (1 - s * (1 - f))\n\n switch (i % 6) {\n case 0:\n return { r: v, g: t, b: p, a: hsv.a }\n case 1:\n return { r: q, g: v, b: p, a: hsv.a }\n case 2:\n return { r: p, g: v, b: t, a: hsv.a }\n case 3:\n return { r: p, g: q, b: v, a: hsv.a }\n case 4:\n return { r: t, g: p, b: v, a: hsv.a }\n default:\n return { r: v, g: p, b: q, a: hsv.a }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Luminance\n// ---------------------------------------------------------------------------\n\n/**\n * Relative luminance per WCAG 2.x — the Y component of CIEXYZ from linear sRGB.\n * This is the quantity contrast ratios are built from.\n */\nexport function relativeLuminance(rgb: Rgb): number {\n const lin = rgbToLinear(rgb)\n return 0.2126 * lin.r + 0.7152 * lin.g + 0.0722 * lin.b\n}\n","/**\n * The 148 CSS named colours.\n *\n * Stored as a single packed string and expanded lazily into a `Map` on first lookup. This\n * keeps the source readable, minifies to well under 2 KB, and — because the expansion is\n * behind a function — tree-shakes away entirely for consumers who only ever pass hex values.\n *\n * Format: `name hex` pairs separated by spaces, hex without `#`, 3-digit form where possible.\n */\nconst PACKED =\n 'aliceblue f0f8ff antiquewhite faebd7 aqua 0ff aquamarine 7fffd4 azure f0ffff beige f5f5dc ' +\n 'bisque ffe4c4 black 000 blanchedalmond ffebcd blue 00f blueviolet 8a2be2 brown a52a2a ' +\n 'burlywood deb887 cadetblue 5f9ea0 chartreuse 7fff00 chocolate d2691e coral ff7f50 ' +\n 'cornflowerblue 6495ed cornsilk fff8dc crimson dc143c cyan 0ff darkblue 00008b darkcyan 008b8b ' +\n 'darkgoldenrod b8860b darkgray a9a9a9 darkgreen 006400 darkgrey a9a9a9 darkkhaki bdb76b ' +\n 'darkmagenta 8b008b darkolivegreen 556b2f darkorange ff8c00 darkorchid 9932cc darkred 8b0000 ' +\n 'darksalmon e9967a darkseagreen 8fbc8f darkslateblue 483d8b darkslategray 2f4f4f ' +\n 'darkslategrey 2f4f4f darkturquoise 00ced1 darkviolet 9400d3 deeppink ff1493 ' +\n 'deepskyblue 00bfff dimgray 696969 dimgrey 696969 dodgerblue 1e90ff firebrick b22222 ' +\n 'floralwhite fffaf0 forestgreen 228b22 fuchsia f0f gainsboro dcdcdc ghostwhite f8f8ff ' +\n 'gold ffd700 goldenrod daa520 gray 808080 green 008000 greenyellow adff2f grey 808080 ' +\n 'honeydew f0fff0 hotpink ff69b4 indianred cd5c5c indigo 4b0082 ivory fffff0 khaki f0e68c ' +\n 'lavender e6e6fa lavenderblush fff0f5 lawngreen 7cfc00 lemonchiffon fffacd ' +\n 'lightblue add8e6 lightcoral f08080 lightcyan e0ffff lightgoldenrodyellow fafad2 ' +\n 'lightgray d3d3d3 lightgreen 90ee90 lightgrey d3d3d3 lightpink ffb6c1 lightsalmon ffa07a ' +\n 'lightseagreen 20b2aa lightskyblue 87cefa lightslategray 789 lightslategrey 789 ' +\n 'lightsteelblue b0c4de lightyellow ffffe0 lime 0f0 limegreen 32cd32 linen faf0e6 ' +\n 'magenta f0f maroon 800000 mediumaquamarine 66cdaa mediumblue 0000cd mediumorchid ba55d3 ' +\n 'mediumpurple 9370db mediumseagreen 3cb371 mediumslateblue 7b68ee mediumspringgreen 00fa9a ' +\n 'mediumturquoise 48d1cc mediumvioletred c71585 midnightblue 191970 mintcream f5fffa ' +\n 'mistyrose ffe4e1 moccasin ffe4b5 navajowhite ffdead navy 000080 oldlace fdf5e6 olive 808000 ' +\n 'olivedrab 6b8e23 orange ffa500 orangered ff4500 orchid da70d6 palegoldenrod eee8aa ' +\n 'palegreen 98fb98 paleturquoise afeeee palevioletred db7093 papayawhip ffefd5 ' +\n 'peachpuff ffdab9 peru cd853f pink ffc0cb plum dda0dd powderblue b0e0e6 purple 800080 ' +\n 'rebeccapurple 639 red f00 rosybrown bc8f8f royalblue 4169e1 saddlebrown 8b4513 ' +\n 'salmon fa8072 sandybrown f4a460 seagreen 2e8b57 seashell fff5ee sienna a0522d silver c0c0c0 ' +\n 'skyblue 87ceeb slateblue 6a5acd slategray 708090 slategrey 708090 snow fffafa ' +\n 'springgreen 00ff7f steelblue 4682b4 tan d2b48c teal 008080 thistle d8bfd8 tomato ff6347 ' +\n 'turquoise 40e0d0 violet ee82ee wheat f5deb3 white fff whitesmoke f5f5f5 yellow ff0 ' +\n 'yellowgreen 9acd32'\n\nlet lookup: Map<string, string> | null = null\n\n/** Resolve a CSS colour keyword to its hex value, or `undefined` if it isn't one. */\nexport function namedColorToHex(name: string): string | undefined {\n if (lookup === null) {\n lookup = new Map()\n const parts = PACKED.split(' ')\n for (let i = 0; i < parts.length - 1; i += 2) {\n lookup.set(parts[i], `#${parts[i + 1]}`)\n }\n }\n return lookup.get(name.toLowerCase())\n}\n\n/** Every recognised colour keyword. Powers autocomplete in the docs playground. */\nexport function listNamedColors(): string[] {\n namedColorToHex('black')\n return [...(lookup as Map<string, string>).keys()]\n}\n","import { clamp, wrap } from '../math/scalar'\nimport { hslToRgb, hsvToRgb, oklabToRgb, oklchToRgb } from './convert'\nimport { namedColorToHex } from './named'\nimport type { ColorInput, Rgb } from './types'\n\n/**\n * Colour parsing.\n *\n * Accepts every syntax a developer might reasonably paste in — from a design tool, a\n * Tailwind config, a CSS file, or another library's output — and normalises it to {@link Rgb}.\n *\n * Supported:\n * #rgb #rgba #rrggbb #rrggbbaa\n * rgb(r g b / a) rgb(r, g, b, a) with numbers or percentages\n * hsl(h s% l% / a) hsla(...)\n * hsv(h s% v%) (non-standard but widely useful)\n * oklch(l c h / a) oklab(l a b / a)\n * colour keywords, `transparent`, `currentcolor`\n * var(--token) resolved against the document when one is available\n *\n * Parsing is memoised: effects re-resolve their colour props on every options change, and a\n * gradient with 6 stops parsed 60 times a second would otherwise be measurable.\n */\n\nconst TRANSPARENT: Rgb = { r: 0, g: 0, b: 0, a: 0 }\n\nconst cache = new Map<string, Rgb>()\nconst MAX_CACHE = 512\n\nexport class ColorParseError extends Error {\n constructor(public readonly input: string) {\n super(\n `[ansh] Could not parse colour \"${input}\". ` +\n `Supported: hex, rgb(), hsl(), hsv(), oklch(), oklab(), CSS colour keywords, and var(--token).`,\n )\n this.name = 'ColorParseError'\n }\n}\n\n/**\n * Parse any accepted colour into {@link Rgb}.\n *\n * @throws {ColorParseError} on unparseable input. Ansh throws here rather than falling back\n * to black: a silently-black gradient is far harder to debug than a thrown error pointing at\n * the offending string, and colour props are validated at mount, not inside a frame loop.\n */\nexport function parseColor(input: ColorInput): Rgb {\n if (typeof input !== 'string') return fromObject(input)\n\n const key = input\n const cached = cache.get(key)\n if (cached) return cached\n\n const parsed = parseString(input.trim())\n if (!parsed) throw new ColorParseError(input)\n\n if (cache.size >= MAX_CACHE) cache.clear()\n cache.set(key, parsed)\n return parsed\n}\n\n/** Like {@link parseColor} but returns `null` instead of throwing. */\nexport function tryParseColor(input: ColorInput): Rgb | null {\n try {\n return parseColor(input)\n } catch {\n return null\n }\n}\n\n/** Discriminate the object colour forms by their distinctive keys. */\nfunction fromObject(input: Exclude<ColorInput, string>): Rgb {\n if ('r' in input) {\n return {\n r: clamp(input.r, 0, 1),\n g: clamp(input.g, 0, 1),\n b: clamp(input.b, 0, 1),\n a: clamp(input.a ?? 1, 0, 1),\n }\n }\n if ('c' in input) return oklchToRgb({ ...input, alpha: input.alpha ?? 1 })\n if ('s' in input) return hslToRgb({ ...input, a: input.a ?? 1 })\n return oklabToRgb({ ...input, alpha: input.alpha ?? 1 })\n}\n\nfunction parseString(raw: string): Rgb | null {\n if (raw.length === 0) return null\n\n const lower = raw.toLowerCase()\n\n if (lower === 'transparent') return TRANSPARENT\n if (lower === 'currentcolor' || lower === 'inherit') return resolveComputed(raw)\n\n if (raw.startsWith('#')) return parseHex(raw)\n if (lower.startsWith('var(')) return resolveComputed(raw)\n\n const fnMatch = /^([a-z]+)\\((.*)\\)$/is.exec(raw)\n if (fnMatch) {\n const fn = fnMatch[1].toLowerCase()\n const args = splitArgs(fnMatch[2])\n switch (fn) {\n case 'rgb':\n case 'rgba':\n return parseRgbFn(args)\n case 'hsl':\n case 'hsla':\n return parseHslFn(args)\n case 'hsv':\n case 'hsb':\n return parseHsvFn(args)\n case 'oklch':\n return parseOklchFn(args)\n case 'oklab':\n return parseOklabFn(args)\n default:\n // Unknown function — let the browser try (handles lab(), color(), color-mix(), …).\n return resolveComputed(raw)\n }\n }\n\n const named = namedColorToHex(lower)\n if (named) return parseHex(named)\n\n return null\n}\n\n/**\n * Split CSS function arguments on commas *and* whitespace, treating `/` as its own token.\n *\n * Modern CSS colour syntax is space-separated with a slash before alpha\n * (`rgb(2 117 244 / 0.5)`), while the legacy form is comma-separated. Both are common in\n * the wild, so we normalise to a flat token list and let each parser read positionally.\n */\nfunction splitArgs(body: string): string[] {\n return body\n .replace(/\\//g, ' / ')\n .split(/[\\s,]+/)\n .filter((s) => s.length > 0)\n}\n\nfunction parseHex(hex: string): Rgb | null {\n const h = hex.slice(1)\n if (!/^[0-9a-f]+$/i.test(h)) return null\n\n const expand = (c: string) => parseInt(c + c, 16) / 255\n const byte = (s: string) => parseInt(s, 16) / 255\n\n switch (h.length) {\n case 3:\n return { r: expand(h[0]), g: expand(h[1]), b: expand(h[2]), a: 1 }\n case 4:\n return { r: expand(h[0]), g: expand(h[1]), b: expand(h[2]), a: expand(h[3]) }\n case 6:\n return { r: byte(h.slice(0, 2)), g: byte(h.slice(2, 4)), b: byte(h.slice(4, 6)), a: 1 }\n case 8:\n return {\n r: byte(h.slice(0, 2)),\n g: byte(h.slice(2, 4)),\n b: byte(h.slice(4, 6)),\n a: byte(h.slice(6, 8)),\n }\n default:\n return null\n }\n}\n\n/** Read a number that may be a percentage, scaling percentages against `scale`. */\nfunction num(token: string | undefined, scale = 1): number | null {\n if (token === undefined) return null\n if (token === 'none') return 0\n const isPercent = token.endsWith('%')\n const value = Number.parseFloat(isPercent ? token.slice(0, -1) : token)\n if (!Number.isFinite(value)) return null\n return isPercent ? (value / 100) * scale : value\n}\n\n/** Read the trailing `/ alpha` token if present. Defaults to fully opaque. */\nfunction readAlpha(args: string[], fromIndex: number): number {\n const slash = args.indexOf('/', fromIndex)\n const token = slash >= 0 ? args[slash + 1] : args[fromIndex]\n if (token === undefined) return 1\n const parsed = num(token, 1)\n return parsed === null ? 1 : clamp(parsed, 0, 1)\n}\n\nfunction parseRgbFn(args: string[]): Rgb | null {\n // Channels are 0–255 unless written as percentages, in which case they scale to 255.\n const r = num(args[0], 255)\n const g = num(args[1], 255)\n const b = num(args[2], 255)\n if (r === null || g === null || b === null) return null\n return {\n r: clamp(r / 255, 0, 1),\n g: clamp(g / 255, 0, 1),\n b: clamp(b / 255, 0, 1),\n a: readAlpha(args, 3),\n }\n}\n\nfunction parseHslFn(args: string[]): Rgb | null {\n const h = parseHue(args[0])\n const s = num(args[1], 1)\n const l = num(args[2], 1)\n if (h === null || s === null || l === null) return null\n return hslToRgb({ h, s: clamp(s, 0, 1), l: clamp(l, 0, 1), a: readAlpha(args, 3) })\n}\n\nfunction parseHsvFn(args: string[]): Rgb | null {\n const h = parseHue(args[0])\n const s = num(args[1], 1)\n const v = num(args[2], 1)\n if (h === null || s === null || v === null) return null\n return hsvToRgb({ h, s: clamp(s, 0, 1), v: clamp(v, 0, 1), a: readAlpha(args, 3) })\n}\n\nfunction parseOklchFn(args: string[]): Rgb | null {\n // `l` may be written as a percentage; `c` is absolute, where 0.4 is roughly maximum.\n const l = num(args[0], 1)\n const c = num(args[1], 0.4)\n const h = parseHue(args[2])\n if (l === null || c === null || h === null) return null\n return oklchToRgb({ l: clamp(l, 0, 1), c: Math.max(0, c), h, alpha: readAlpha(args, 3) })\n}\n\nfunction parseOklabFn(args: string[]): Rgb | null {\n const l = num(args[0], 1)\n const a = num(args[1], 0.4)\n const b = num(args[2], 0.4)\n if (l === null || a === null || b === null) return null\n return oklabToRgb({ l: clamp(l, 0, 1), a, b, alpha: readAlpha(args, 3) })\n}\n\n/** Parse an angle in deg/grad/rad/turn, normalised to degrees in `[0, 360)`. */\nfunction parseHue(token: string | undefined): number | null {\n if (token === undefined) return null\n const match = /^(-?[\\d.]+)(deg|grad|rad|turn)?$/i.exec(token.trim())\n if (!match) return null\n const value = Number.parseFloat(match[1])\n if (!Number.isFinite(value)) return null\n switch ((match[2] ?? 'deg').toLowerCase()) {\n case 'grad':\n return wrap(value * 0.9, 0, 360)\n case 'rad':\n return wrap((value * 180) / Math.PI, 0, 360)\n case 'turn':\n return wrap(value * 360, 0, 360)\n default:\n return wrap(value, 0, 360)\n }\n}\n\n/**\n * Resolve a colour the parser can't handle itself by asking the browser.\n *\n * Covers `var(--token)`, `currentcolor`, `color-mix()`, `lab()` and anything else CSS gains\n * in future. We set the value on a detached element and read back the computed style — the\n * browser normalises it to `rgb()`/`rgba()`, which we can then parse.\n *\n * Returns `null` during SSR, where there is no document to consult. Callers should keep the\n * original string in that case and let CSS resolve it at paint time; only effects that need\n * numeric colour access (canvas gradients) require a resolved value, and those run client-side.\n */\nexport function resolveComputed(value: string): Rgb | null {\n if (typeof document === 'undefined') return null\n\n const probe = document.createElement('span')\n probe.style.display = 'none'\n // `color` is used rather than a custom property so that `currentcolor` resolves too.\n probe.style.color = ''\n probe.style.color = value\n if (probe.style.color === '') return null\n\n document.body.appendChild(probe)\n const computed = getComputedStyle(probe).color\n document.body.removeChild(probe)\n\n if (!computed) return null\n const parsed = parseString(computed)\n return parsed\n}\n\n/**\n * Resolve a CSS custom property against a specific element's cascade.\n *\n * Needed because `var(--surface)` means different things inside a `.dark` subtree. Effects\n * pass their own host element so themed colours resolve correctly.\n */\nexport function resolveCssVariable(name: string, element?: Element | null): Rgb | null {\n if (typeof document === 'undefined') return null\n const target = element ?? document.documentElement\n const prop = name.startsWith('--') ? name : `--${name}`\n const raw = getComputedStyle(target).getPropertyValue(prop).trim()\n if (!raw) return null\n return tryParseColor(raw)\n}\n\n/** Clear the parse cache. Exposed for tests and for theme switches that change `var()` output. */\nexport function clearColorCache(): void {\n cache.clear()\n}\n"]}
|