@nudeui/color 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # Nude Color
2
+
@@ -0,0 +1,10 @@
1
+ :where(&) {
2
+ --color-yellow: oklch(84% 0.17 85);
3
+ --color-green: oklch(65% 0.19 130);
4
+ --color-cyan: oklch(70% 0.155 205);
5
+ --color-blue: oklch(57% 0.256 257);
6
+ --color-indigo: oklch(48% 0.3 277);
7
+ --color-pink: oklch(60% 0.28 353);
8
+ --color-red: oklch(55% 0.24 20);
9
+ --color-gray: oklch(50% 0.03 270);
10
+ }
package/dist/index.css ADDED
@@ -0,0 +1,3 @@
1
+ @import url("colors.css");
2
+ @import url("tints.css");
3
+ @import url("text.css");
package/dist/text.css ADDED
@@ -0,0 +1,15 @@
1
+ :where(&) {
2
+ --l-threshold: 0.7;
3
+ --tint-text: calc(
4
+ max(0, sign(max(0, sign(sign(l - var(--l-threshold)))))) * var(--l-40, l) +
5
+ max(0, sign((1 - max(0, sign(sign(l - var(--l-threshold))))))) * var(--l-100, l)
6
+ )
7
+ calc(
8
+ max(0, sign(max(0, sign(sign(l - var(--l-threshold)))))) * var(--c-40, c) +
9
+ max(0, sign((1 - max(0, sign(sign(l - var(--l-threshold))))))) * var(--c-100, c)
10
+ )
11
+ calc(
12
+ max(0, sign(max(0, sign(sign(l - var(--l-threshold)))))) * var(--h-40, h) +
13
+ max(0, sign((1 - max(0, sign(sign(l - var(--l-threshold))))))) * var(--h-100, h)
14
+ );
15
+ }
package/dist/tints.css ADDED
@@ -0,0 +1,361 @@
1
+ :where(&) {
2
+ /* Lightnesses for each tint */
3
+
4
+ --l-0: 0;
5
+ --l-5: 0.09;
6
+ --l-10: 0.14;
7
+ --l-15: 0.18;
8
+ --l-20: 0.23;
9
+ --l-25: 0.28;
10
+ --l-30: 0.33;
11
+ --l-35: 0.38;
12
+ --l-40: 0.42;
13
+ --l-45: 0.47;
14
+ --l-50: 0.52;
15
+ --l-55: 0.58;
16
+ --l-60: 0.63;
17
+ --l-65: 0.69;
18
+ --l-70: 0.74;
19
+ --l-75: 0.79;
20
+ --l-80: 0.84;
21
+ --l-85: 0.87;
22
+ --l-90: 0.93;
23
+ --l-95: 0.97;
24
+ --l-100: 1;
25
+
26
+ /* Chromas for each tint */
27
+ --c-100: 0;
28
+ --c-5: calc(
29
+ c *
30
+ (
31
+ 1 -
32
+ max(
33
+ 0,
34
+ pow(clamp(0, (var(--l-5) - l) / (1 - l), 1), 2),
35
+ pow(clamp(0, (var(--l-5) - l) / (0 - l), 1), 1.2)
36
+ )
37
+ )
38
+ );
39
+ --c-10: calc(
40
+ c *
41
+ (
42
+ 1 -
43
+ max(
44
+ 0,
45
+ pow(clamp(0, (var(--l-10) - l) / (1 - l), 1), 2),
46
+ pow(clamp(0, (var(--l-10) - l) / (0 - l), 1), 1.2)
47
+ )
48
+ )
49
+ );
50
+ --c-15: calc(
51
+ c *
52
+ (
53
+ 1 -
54
+ max(
55
+ 0,
56
+ pow(clamp(0, (var(--l-15) - l) / (1 - l), 1), 2),
57
+ pow(clamp(0, (var(--l-15) - l) / (0 - l), 1), 1.2)
58
+ )
59
+ )
60
+ );
61
+ --c-20: calc(
62
+ c *
63
+ (
64
+ 1 -
65
+ max(
66
+ 0,
67
+ pow(clamp(0, (var(--l-20) - l) / (1 - l), 1), 2),
68
+ pow(clamp(0, (var(--l-20) - l) / (0 - l), 1), 1.2)
69
+ )
70
+ )
71
+ );
72
+ --c-25: calc(
73
+ c *
74
+ (
75
+ 1 -
76
+ max(
77
+ 0,
78
+ pow(clamp(0, (var(--l-25) - l) / (1 - l), 1), 2),
79
+ pow(clamp(0, (var(--l-25) - l) / (0 - l), 1), 1.2)
80
+ )
81
+ )
82
+ );
83
+ --c-30: calc(
84
+ c *
85
+ (
86
+ 1 -
87
+ max(
88
+ 0,
89
+ pow(clamp(0, (var(--l-30) - l) / (1 - l), 1), 2),
90
+ pow(clamp(0, (var(--l-30) - l) / (0 - l), 1), 1.2)
91
+ )
92
+ )
93
+ );
94
+ --c-35: calc(
95
+ c *
96
+ (
97
+ 1 -
98
+ max(
99
+ 0,
100
+ pow(clamp(0, (var(--l-35) - l) / (1 - l), 1), 2),
101
+ pow(clamp(0, (var(--l-35) - l) / (0 - l), 1), 1.2)
102
+ )
103
+ )
104
+ );
105
+ --c-40: calc(
106
+ c *
107
+ (
108
+ 1 -
109
+ max(
110
+ 0,
111
+ pow(clamp(0, (var(--l-40) - l) / (1 - l), 1), 2),
112
+ pow(clamp(0, (var(--l-40) - l) / (0 - l), 1), 1.2)
113
+ )
114
+ )
115
+ );
116
+ --c-45: calc(
117
+ c *
118
+ (
119
+ 1 -
120
+ max(
121
+ 0,
122
+ pow(clamp(0, (var(--l-45) - l) / (1 - l), 1), 2),
123
+ pow(clamp(0, (var(--l-45) - l) / (0 - l), 1), 1.2)
124
+ )
125
+ )
126
+ );
127
+ --c-50: calc(
128
+ c *
129
+ (
130
+ 1 -
131
+ max(
132
+ 0,
133
+ pow(clamp(0, (var(--l-50) - l) / (1 - l), 1), 2),
134
+ pow(clamp(0, (var(--l-50) - l) / (0 - l), 1), 1.2)
135
+ )
136
+ )
137
+ );
138
+ --c-55: calc(
139
+ c *
140
+ (
141
+ 1 -
142
+ max(
143
+ 0,
144
+ pow(clamp(0, (var(--l-55) - l) / (1 - l), 1), 2),
145
+ pow(clamp(0, (var(--l-55) - l) / (0 - l), 1), 1.2)
146
+ )
147
+ )
148
+ );
149
+ --c-60: calc(
150
+ c *
151
+ (
152
+ 1 -
153
+ max(
154
+ 0,
155
+ pow(clamp(0, (var(--l-60) - l) / (1 - l), 1), 2),
156
+ pow(clamp(0, (var(--l-60) - l) / (0 - l), 1), 1.2)
157
+ )
158
+ )
159
+ );
160
+ --c-65: calc(
161
+ c *
162
+ (
163
+ 1 -
164
+ max(
165
+ 0,
166
+ pow(clamp(0, (var(--l-65) - l) / (1 - l), 1), 2),
167
+ pow(clamp(0, (var(--l-65) - l) / (0 - l), 1), 1.2)
168
+ )
169
+ )
170
+ );
171
+ --c-70: calc(
172
+ c *
173
+ (
174
+ 1 -
175
+ max(
176
+ 0,
177
+ pow(clamp(0, (var(--l-70) - l) / (1 - l), 1), 2),
178
+ pow(clamp(0, (var(--l-70) - l) / (0 - l), 1), 1.2)
179
+ )
180
+ )
181
+ );
182
+ --c-75: calc(
183
+ c *
184
+ (
185
+ 1 -
186
+ max(
187
+ 0,
188
+ pow(clamp(0, (var(--l-75) - l) / (1 - l), 1), 2),
189
+ pow(clamp(0, (var(--l-75) - l) / (0 - l), 1), 1.2)
190
+ )
191
+ )
192
+ );
193
+ --c-80: calc(
194
+ c *
195
+ (
196
+ 1 -
197
+ max(
198
+ 0,
199
+ pow(clamp(0, (var(--l-80) - l) / (1 - l), 1), 2),
200
+ pow(clamp(0, (var(--l-80) - l) / (0 - l), 1), 1.2)
201
+ )
202
+ )
203
+ );
204
+ --c-85: calc(
205
+ c *
206
+ (
207
+ 1 -
208
+ max(
209
+ 0,
210
+ pow(clamp(0, (var(--l-85) - l) / (1 - l), 1), 2),
211
+ pow(clamp(0, (var(--l-85) - l) / (0 - l), 1), 1.2)
212
+ )
213
+ )
214
+ );
215
+ --c-90: calc(
216
+ c *
217
+ (
218
+ 1 -
219
+ max(
220
+ 0,
221
+ pow(clamp(0, (var(--l-90) - l) / (1 - l), 1), 2),
222
+ pow(clamp(0, (var(--l-90) - l) / (0 - l), 1), 1.2)
223
+ )
224
+ )
225
+ );
226
+ --c-95: calc(
227
+ c *
228
+ (
229
+ 1 -
230
+ max(
231
+ 0,
232
+ pow(clamp(0, (var(--l-95) - l) / (1 - l), 1), 2),
233
+ pow(clamp(0, (var(--l-95) - l) / (0 - l), 1), 1.2)
234
+ )
235
+ )
236
+ );
237
+ --c-0: 0;
238
+
239
+ /* Hues for each tint: near each key hue, shift toward its dark/light directions, scaled by how far the tint moves from the source toward black/white */
240
+ --h-5: calc(
241
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
242
+ pow(clamp(0, (var(--l-5) - l) / (0 - l), 1), 0.4) + 11 *
243
+ pow(clamp(0, (var(--l-5) - l) / (1 - l), 1), 0.4)
244
+ );
245
+ --h-10: calc(
246
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
247
+ pow(clamp(0, (var(--l-10) - l) / (0 - l), 1), 0.4) + 11 *
248
+ pow(clamp(0, (var(--l-10) - l) / (1 - l), 1), 0.4)
249
+ );
250
+ --h-15: calc(
251
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
252
+ pow(clamp(0, (var(--l-15) - l) / (0 - l), 1), 0.4) + 11 *
253
+ pow(clamp(0, (var(--l-15) - l) / (1 - l), 1), 0.4)
254
+ );
255
+ --h-20: calc(
256
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
257
+ pow(clamp(0, (var(--l-20) - l) / (0 - l), 1), 0.4) + 11 *
258
+ pow(clamp(0, (var(--l-20) - l) / (1 - l), 1), 0.4)
259
+ );
260
+ --h-25: calc(
261
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
262
+ pow(clamp(0, (var(--l-25) - l) / (0 - l), 1), 0.4) + 11 *
263
+ pow(clamp(0, (var(--l-25) - l) / (1 - l), 1), 0.4)
264
+ );
265
+ --h-30: calc(
266
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
267
+ pow(clamp(0, (var(--l-30) - l) / (0 - l), 1), 0.4) + 11 *
268
+ pow(clamp(0, (var(--l-30) - l) / (1 - l), 1), 0.4)
269
+ );
270
+ --h-35: calc(
271
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
272
+ pow(clamp(0, (var(--l-35) - l) / (0 - l), 1), 0.4) + 11 *
273
+ pow(clamp(0, (var(--l-35) - l) / (1 - l), 1), 0.4)
274
+ );
275
+ --h-40: calc(
276
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
277
+ pow(clamp(0, (var(--l-40) - l) / (0 - l), 1), 0.4) + 11 *
278
+ pow(clamp(0, (var(--l-40) - l) / (1 - l), 1), 0.4)
279
+ );
280
+ --h-45: calc(
281
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
282
+ pow(clamp(0, (var(--l-45) - l) / (0 - l), 1), 0.4) + 11 *
283
+ pow(clamp(0, (var(--l-45) - l) / (1 - l), 1), 0.4)
284
+ );
285
+ --h-50: calc(
286
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
287
+ pow(clamp(0, (var(--l-50) - l) / (0 - l), 1), 0.4) + 11 *
288
+ pow(clamp(0, (var(--l-50) - l) / (1 - l), 1), 0.4)
289
+ );
290
+ --h-55: calc(
291
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
292
+ pow(clamp(0, (var(--l-55) - l) / (0 - l), 1), 0.4) + 11 *
293
+ pow(clamp(0, (var(--l-55) - l) / (1 - l), 1), 0.4)
294
+ );
295
+ --h-60: calc(
296
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
297
+ pow(clamp(0, (var(--l-60) - l) / (0 - l), 1), 0.4) + 11 *
298
+ pow(clamp(0, (var(--l-60) - l) / (1 - l), 1), 0.4)
299
+ );
300
+ --h-65: calc(
301
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
302
+ pow(clamp(0, (var(--l-65) - l) / (0 - l), 1), 0.4) + 11 *
303
+ pow(clamp(0, (var(--l-65) - l) / (1 - l), 1), 0.4)
304
+ );
305
+ --h-70: calc(
306
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
307
+ pow(clamp(0, (var(--l-70) - l) / (0 - l), 1), 0.4) + 11 *
308
+ pow(clamp(0, (var(--l-70) - l) / (1 - l), 1), 0.4)
309
+ );
310
+ --h-75: calc(
311
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
312
+ pow(clamp(0, (var(--l-75) - l) / (0 - l), 1), 0.4) + 11 *
313
+ pow(clamp(0, (var(--l-75) - l) / (1 - l), 1), 0.4)
314
+ );
315
+ --h-80: calc(
316
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
317
+ pow(clamp(0, (var(--l-80) - l) / (0 - l), 1), 0.4) + 11 *
318
+ pow(clamp(0, (var(--l-80) - l) / (1 - l), 1), 0.4)
319
+ );
320
+ --h-85: calc(
321
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
322
+ pow(clamp(0, (var(--l-85) - l) / (0 - l), 1), 0.4) + 11 *
323
+ pow(clamp(0, (var(--l-85) - l) / (1 - l), 1), 0.4)
324
+ );
325
+ --h-90: calc(
326
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
327
+ pow(clamp(0, (var(--l-90) - l) / (0 - l), 1), 0.4) + 11 *
328
+ pow(clamp(0, (var(--l-90) - l) / (1 - l), 1), 0.4)
329
+ );
330
+ --h-95: calc(
331
+ h + clamp(0, 1 - pow(abs(h - 84) / 27, 1.5), 1) * -43 *
332
+ pow(clamp(0, (var(--l-95) - l) / (0 - l), 1), 0.4) + 11 *
333
+ pow(clamp(0, (var(--l-95) - l) / (1 - l), 1), 0.4)
334
+ );
335
+
336
+ /* Tints */
337
+ --tint-core: l c h;
338
+ --tint-100: 1 0 h;
339
+ --tint-0: var(--l-0, l) var(--c-0, c) var(--h-0, h);
340
+ --tint-5: var(--l-5, l) var(--c-5, c) var(--h-5, h);
341
+ --tint-10: var(--l-10, l) var(--c-10, c) var(--h-10, h);
342
+ --tint-15: var(--l-15, l) var(--c-15, c) var(--h-15, h);
343
+ --tint-20: var(--l-20, l) var(--c-20, c) var(--h-20, h);
344
+ --tint-25: var(--l-25, l) var(--c-25, c) var(--h-25, h);
345
+ --tint-30: var(--l-30, l) var(--c-30, c) var(--h-30, h);
346
+ --tint-35: var(--l-35, l) var(--c-35, c) var(--h-35, h);
347
+ --tint-40: var(--l-40, l) var(--c-40, c) var(--h-40, h);
348
+ --tint-45: var(--l-45, l) var(--c-45, c) var(--h-45, h);
349
+ --tint-50: var(--l-50, l) var(--c-50, c) var(--h-50, h);
350
+ --tint-55: var(--l-55, l) var(--c-55, c) var(--h-55, h);
351
+ --tint-60: var(--l-60, l) var(--c-60, c) var(--h-60, h);
352
+ --tint-65: var(--l-65, l) var(--c-65, c) var(--h-65, h);
353
+ --tint-70: var(--l-70, l) var(--c-70, c) var(--h-70, h);
354
+ --tint-75: var(--l-75, l) var(--c-75, c) var(--h-75, h);
355
+ --tint-80: var(--l-80, l) var(--c-80, c) var(--h-80, h);
356
+ --tint-85: var(--l-85, l) var(--c-85, c) var(--h-85, h);
357
+ --tint-90: var(--l-90, l) var(--c-90, c) var(--h-90, h);
358
+ --tint-95: var(--l-95, l) var(--c-95, c) var(--h-95, h);
359
+ --tint-100: var(--l-100, l) var(--c-100, c) var(--h-100, h);
360
+ --tint-0: 0 0 h;
361
+ }
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@nudeui/color",
3
+ "version": "0.0.1",
4
+ "description": "Description",
5
+ "keywords": [
6
+ "color",
7
+ "design-systems",
8
+ "css",
9
+ "ui",
10
+ "design-tokens",
11
+ "tints"
12
+ ],
13
+ "homepage": "https://github.com/nudeui/color/#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/nudeui/color/issues"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/nudeui/color.git"
20
+ },
21
+ "files": [
22
+ "src",
23
+ "dist"
24
+ ],
25
+ "license": "MIT",
26
+ "author": "Lea Verou",
27
+ "type": "module",
28
+ "exports": {
29
+ ".": {
30
+ "import": "./src/index.js",
31
+ "style": "./dist/index.css"
32
+ },
33
+ "./*": {
34
+ "style": "./dist/*.css"
35
+ },
36
+ "./src/*": "./src/*.css.js",
37
+ "./dist/*": "./dist/*"
38
+ },
39
+ "scripts": {
40
+ "build": "airdry",
41
+ "dev": "airdry --watch",
42
+ "prepack": "npm run build",
43
+ "release": "npm whoami >/dev/null 2>&1 || npm login && release-it",
44
+ "test": "npx htest test"
45
+ },
46
+ "devDependencies": {
47
+ "airdry": "file:../airdry",
48
+ "htest.dev": "latest",
49
+ "prettier": "~3.5.3",
50
+ "prettier-plugin-brace-style": "latest",
51
+ "prettier-plugin-merge": "latest",
52
+ "prettier-plugin-space-before-function-paren": "latest",
53
+ "release-it": "latest"
54
+ }
55
+ }
@@ -0,0 +1,9 @@
1
+ import css from "airdry/css";
2
+
3
+ export default {
4
+ template: content => css`
5
+ :where(&) {
6
+ ${content}
7
+ }
8
+ `,
9
+ };
@@ -0,0 +1,8 @@
1
+ import { css, mapKeys } from "airdry/css";
2
+ import { L, levels, colors } from "./index.js";
3
+
4
+ export default css`
5
+ :where(&) {
6
+ ${mapKeys(colors, name => "--color-" + name)}
7
+ }
8
+ `;
package/src/index.css ADDED
@@ -0,0 +1,3 @@
1
+ @import url("colors.css");
2
+ @import url("tints.css");
3
+ @import url("text.css");
package/src/index.js ADDED
@@ -0,0 +1,39 @@
1
+ export const L = {
2
+ 100: 1,
3
+ 95: 0.97,
4
+ 90: 0.93,
5
+ 85: 0.87,
6
+ 80: 0.84,
7
+ 75: 0.79,
8
+ 70: 0.74,
9
+ 65: 0.69,
10
+ 60: 0.63,
11
+ 55: 0.58,
12
+ 50: 0.52,
13
+ 45: 0.47,
14
+ 40: 0.42,
15
+ 35: 0.38,
16
+ 30: 0.33,
17
+ 25: 0.28,
18
+ 20: 0.23,
19
+ 15: 0.18,
20
+ 10: 0.14,
21
+ 5: 0.09,
22
+ 0: 0,
23
+ };
24
+
25
+ export const levels = Object.keys(L).map(Number);
26
+ export const levelsChromatic = levels.filter(level => level !== 0 && level !== 100);
27
+
28
+ export const colors = {
29
+ yellow: "oklch(84% 0.17 85)",
30
+ green: "oklch(65% 0.19 130)",
31
+ cyan: "oklch(70% 0.155 205)",
32
+ blue: "oklch(57% 0.256 257)",
33
+ indigo: "oklch(48% 0.3 277)",
34
+ pink: "oklch(60% 0.28 353)",
35
+ red: "oklch(55% 0.24 20)",
36
+ gray: "oklch(50% 0.03 270)",
37
+ };
38
+
39
+ export const hues = Object.keys(colors);
@@ -0,0 +1,9 @@
1
+ import { css, gt, ife } from "airdry/css";
2
+ import { tint_if } from "./util.js";
3
+
4
+ export default css`
5
+ :where(&) {
6
+ --l-threshold: 0.7;
7
+ --tint-text: ${tint_if(gt("l", "var(--l-threshold)"), 40, 100)};
8
+ }
9
+ `;
@@ -0,0 +1,69 @@
1
+ import { css, progress, pow, vars, ref, max, or, ife, ifs, sop, map } from "airdry/css";
2
+ import { L, levels, levelsChromatic } from "./index.js";
3
+
4
+ // Curvature factors for chroma
5
+ export const chroma = {
6
+ exp: { lighter: 2, darker: 1.2 },
7
+ };
8
+
9
+ export const hue = {
10
+ shifts: {
11
+ yellows: {
12
+ band: { center: 84, extent: 27, exp: 1.5 },
13
+ darker: { max: -43, exp: 0.4 },
14
+ lighter: { max: 11, exp: 0.4 },
15
+ },
16
+ },
17
+ };
18
+
19
+ // For nicer references
20
+ const [l, c, h] = "lch".split("");
21
+ const varll = LL => `var(--l-${LL})`;
22
+
23
+ const progress_dark = LL => progress(varll(LL), l, 0);
24
+ const progress_light = LL => progress(varll(LL), l, 1);
25
+ const pow_light_dark = (LL, expL, expD) =>
26
+ or(pow(progress_light(LL), expL), pow(progress_dark(LL), expD));
27
+
28
+ export default css`
29
+ :where(&) {
30
+ /* Lightnesses for each tint */
31
+ ${levels.map(
32
+ LL => `
33
+ --l-${LL}: ${L[LL]};
34
+ `,
35
+ )}
36
+
37
+ /* Chromas for each tint */
38
+ --c-100: 0;
39
+ ${levelsChromatic.map(
40
+ LL =>
41
+ `--c-${LL}: calc(c * (1 - ${or(pow(progress_light(LL), chroma.exp.lighter), pow(progress_dark(LL), chroma.exp.darker))}));`,
42
+ )}
43
+ --c-0: 0;
44
+
45
+ /* Hues for each tint: near each key hue, shift toward its dark/light directions, scaled by how far the tint moves from the source toward black/white */
46
+ ${levelsChromatic.map(
47
+ LL => `--h-${LL}: calc(h + ${Object.values(hue.shifts).map(({
48
+ band,
49
+ darker,
50
+ lighter,
51
+ }) => {
52
+ return `clamp(0, 1 - pow(abs(h - ${band.center}) / ${band.extent}, ${band.exp}), 1)
53
+ * ${sop(
54
+ darker.max,
55
+ pow(progress_dark(LL), darker.exp),
56
+ lighter.max,
57
+ pow(progress_light(LL), lighter.exp),
58
+ )}`;
59
+ })});
60
+ `,
61
+ )}
62
+
63
+ /* Tints */
64
+ --tint-core: l c h;
65
+ --tint-100: 1 0 h;
66
+ ${levels.map(LL => `--tint-${LL}: var(--l-${LL}, l) var(--c-${LL}, c) var(--h-${LL}, h);`)}
67
+ --tint-0: 0 0 h;
68
+ }
69
+ `;
package/src/util.js ADDED
@@ -0,0 +1,21 @@
1
+ import { round, clamp, progress, calc, ife, sop } from "airdry/css";
2
+
3
+ export function snapToScale (x, points, { strat = "" } = {}) {
4
+ const terms = points.flatMap((b, i) => {
5
+ if (i === 0) {
6
+ return b;
7
+ }
8
+ const a = points[i - 1];
9
+ return [`${b} - ${a}`, round(strat, progress(x, a, b))];
10
+ });
11
+
12
+ return sop(terms);
13
+ }
14
+
15
+ export function tint_if (condition, tint_true, tint_false) {
16
+ return [..."lch"]
17
+ .map(c =>
18
+ ife(condition, `var(--${c}-${tint_true}, ${c})`, `var(--${c}-${tint_false}, ${c})`))
19
+ .map(c => calc(c))
20
+ .join(" ");
21
+ }