@glinui/tokens 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +381 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +193 -0
- package/package.json +33 -0
- package/theme.css +290 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
export type ThemeMode = "light" | "dark";
|
|
2
|
+
export declare const colorTokens: {
|
|
3
|
+
readonly light: {
|
|
4
|
+
readonly background: "oklch(0.985 0.002 240)";
|
|
5
|
+
readonly foreground: "oklch(0.23 0.01 248)";
|
|
6
|
+
readonly surface: "oklch(0.997 0.002 245)";
|
|
7
|
+
readonly border: "oklch(0.89 0.01 246)";
|
|
8
|
+
readonly accent: "oklch(0.20 0.005 250)";
|
|
9
|
+
readonly accentForeground: "oklch(0.98 0.003 250)";
|
|
10
|
+
};
|
|
11
|
+
readonly dark: {
|
|
12
|
+
readonly background: "oklch(0.18 0.01 250)";
|
|
13
|
+
readonly foreground: "oklch(0.95 0.01 247)";
|
|
14
|
+
readonly surface: "oklch(0.23 0.01 250)";
|
|
15
|
+
readonly border: "oklch(0.34 0.01 250)";
|
|
16
|
+
readonly accent: "oklch(0.92 0.005 250)";
|
|
17
|
+
readonly accentForeground: "oklch(0.15 0.005 250)";
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Glass tokens — Apple Liquid Glass spec (WWDC 2025).
|
|
22
|
+
*
|
|
23
|
+
* Key principles:
|
|
24
|
+
* - saturate(180%) always paired with blur
|
|
25
|
+
* - Higher surface opacity than old glassmorphism (Apple Beta 3+)
|
|
26
|
+
* - Dark mode significantly MORE opaque than light mode
|
|
27
|
+
* - Top border brighter than sides (light refraction edge)
|
|
28
|
+
* - 4.5:1 contrast ratio for text on glass (WCAG AA)
|
|
29
|
+
*/
|
|
30
|
+
export declare const glassTokens: {
|
|
31
|
+
readonly blur: {
|
|
32
|
+
readonly sm: "8px";
|
|
33
|
+
readonly md: "16px";
|
|
34
|
+
readonly lg: "24px";
|
|
35
|
+
readonly xl: "40px";
|
|
36
|
+
};
|
|
37
|
+
readonly saturate: {
|
|
38
|
+
readonly default: "180%";
|
|
39
|
+
readonly subtle: "130%";
|
|
40
|
+
};
|
|
41
|
+
readonly surface: {
|
|
42
|
+
readonly light: "rgba(255, 255, 255, 0.18)";
|
|
43
|
+
readonly dark: "rgba(0, 0, 0, 0.40)";
|
|
44
|
+
};
|
|
45
|
+
readonly border: {
|
|
46
|
+
readonly light: "rgba(255, 255, 255, 0.20)";
|
|
47
|
+
readonly dark: "rgba(255, 255, 255, 0.10)";
|
|
48
|
+
};
|
|
49
|
+
readonly borderStrong: {
|
|
50
|
+
readonly light: "rgba(255, 255, 255, 0.35)";
|
|
51
|
+
readonly dark: "rgba(255, 255, 255, 0.18)";
|
|
52
|
+
};
|
|
53
|
+
readonly refractionTop: {
|
|
54
|
+
readonly light: "rgba(255, 255, 255, 0.40)";
|
|
55
|
+
readonly dark: "rgba(255, 255, 255, 0.15)";
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
export declare const radiusTokens: {
|
|
59
|
+
readonly sm: "0.5rem";
|
|
60
|
+
readonly md: "0.75rem";
|
|
61
|
+
readonly lg: "1rem";
|
|
62
|
+
readonly xl: "1.25rem";
|
|
63
|
+
readonly "2xl": "1.75rem";
|
|
64
|
+
};
|
|
65
|
+
export declare const spacingTokens: {
|
|
66
|
+
readonly xs: "0.25rem";
|
|
67
|
+
readonly sm: "0.5rem";
|
|
68
|
+
readonly md: "0.75rem";
|
|
69
|
+
readonly lg: "1rem";
|
|
70
|
+
readonly xl: "1.5rem";
|
|
71
|
+
readonly "2xl": "2rem";
|
|
72
|
+
};
|
|
73
|
+
export declare const shadowTokens: {
|
|
74
|
+
readonly "glass-sm": "0 2px 8px rgba(0, 0, 0, 0.08)";
|
|
75
|
+
readonly "glass-md": "0 8px 24px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.08)";
|
|
76
|
+
readonly "glass-lg": "0 16px 48px rgba(0, 0, 0, 0.16), 0 4px 8px rgba(0, 0, 0, 0.08)";
|
|
77
|
+
readonly "glass-inset": "inset 0 1px 0 rgba(255, 255, 255, 0.12), inset 0 -1px 0 rgba(0, 0, 0, 0.05)";
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Composed glass elevation levels.
|
|
81
|
+
* Each bundles blur + surface opacity + shadow.
|
|
82
|
+
* CSS classes also apply saturate(180%) and refraction top border.
|
|
83
|
+
*/
|
|
84
|
+
export declare const glassLevelTokens: {
|
|
85
|
+
readonly "glass-1": {
|
|
86
|
+
readonly blur: "8px";
|
|
87
|
+
readonly opacity: {
|
|
88
|
+
readonly light: "0.08";
|
|
89
|
+
readonly dark: "0.20";
|
|
90
|
+
};
|
|
91
|
+
readonly shadow: "glass-sm";
|
|
92
|
+
};
|
|
93
|
+
readonly "glass-2": {
|
|
94
|
+
readonly blur: "12px";
|
|
95
|
+
readonly opacity: {
|
|
96
|
+
readonly light: "0.12";
|
|
97
|
+
readonly dark: "0.30";
|
|
98
|
+
};
|
|
99
|
+
readonly shadow: "glass-sm";
|
|
100
|
+
};
|
|
101
|
+
readonly "glass-3": {
|
|
102
|
+
readonly blur: "16px";
|
|
103
|
+
readonly opacity: {
|
|
104
|
+
readonly light: "0.18";
|
|
105
|
+
readonly dark: "0.40";
|
|
106
|
+
};
|
|
107
|
+
readonly shadow: "glass-md";
|
|
108
|
+
};
|
|
109
|
+
readonly "glass-4": {
|
|
110
|
+
readonly blur: "24px";
|
|
111
|
+
readonly opacity: {
|
|
112
|
+
readonly light: "0.25";
|
|
113
|
+
readonly dark: "0.55";
|
|
114
|
+
};
|
|
115
|
+
readonly shadow: "glass-lg";
|
|
116
|
+
};
|
|
117
|
+
readonly "glass-5": {
|
|
118
|
+
readonly blur: "40px";
|
|
119
|
+
readonly opacity: {
|
|
120
|
+
readonly light: "0.35";
|
|
121
|
+
readonly dark: "0.70";
|
|
122
|
+
};
|
|
123
|
+
readonly shadow: "glass-lg";
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
export declare const glassOpacityScaleTokens: {
|
|
127
|
+
readonly light: {
|
|
128
|
+
readonly 1: "0.06";
|
|
129
|
+
readonly 2: "0.08";
|
|
130
|
+
readonly 3: "0.10";
|
|
131
|
+
readonly 4: "0.12";
|
|
132
|
+
readonly 5: "0.16";
|
|
133
|
+
readonly 6: "0.18";
|
|
134
|
+
readonly 7: "0.22";
|
|
135
|
+
readonly 8: "0.25";
|
|
136
|
+
readonly 9: "0.30";
|
|
137
|
+
readonly 10: "0.35";
|
|
138
|
+
};
|
|
139
|
+
readonly dark: {
|
|
140
|
+
readonly 1: "0.16";
|
|
141
|
+
readonly 2: "0.20";
|
|
142
|
+
readonly 3: "0.25";
|
|
143
|
+
readonly 4: "0.30";
|
|
144
|
+
readonly 5: "0.35";
|
|
145
|
+
readonly 6: "0.40";
|
|
146
|
+
readonly 7: "0.48";
|
|
147
|
+
readonly 8: "0.55";
|
|
148
|
+
readonly 9: "0.62";
|
|
149
|
+
readonly 10: "0.70";
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
export declare const glassPerformanceTokens: {
|
|
153
|
+
readonly gpuHint: {
|
|
154
|
+
readonly transform: "translateZ(0)";
|
|
155
|
+
readonly backfaceVisibility: "hidden";
|
|
156
|
+
readonly willChange: "transform, opacity";
|
|
157
|
+
};
|
|
158
|
+
readonly heavySurface: {
|
|
159
|
+
readonly transform: "translateZ(0)";
|
|
160
|
+
readonly backfaceVisibility: "hidden";
|
|
161
|
+
readonly willChange: "backdrop-filter, transform, opacity";
|
|
162
|
+
readonly contain: "paint";
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
export declare const glassLuminanceTokens: {
|
|
166
|
+
readonly neutral: {
|
|
167
|
+
readonly surfaceMultiplier: 1;
|
|
168
|
+
readonly borderMultiplier: 1;
|
|
169
|
+
readonly refractionMultiplier: 1;
|
|
170
|
+
readonly saturateMultiplier: 1;
|
|
171
|
+
};
|
|
172
|
+
readonly bright: {
|
|
173
|
+
readonly surfaceMultiplier: 1.16;
|
|
174
|
+
readonly borderMultiplier: 1.08;
|
|
175
|
+
readonly refractionMultiplier: 1.14;
|
|
176
|
+
readonly saturateMultiplier: 1.04;
|
|
177
|
+
};
|
|
178
|
+
readonly dim: {
|
|
179
|
+
readonly surfaceMultiplier: 0.9;
|
|
180
|
+
readonly borderMultiplier: 1.15;
|
|
181
|
+
readonly refractionMultiplier: 1.22;
|
|
182
|
+
readonly saturateMultiplier: 0.96;
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
export declare const motionTokens: {
|
|
186
|
+
readonly duration: {
|
|
187
|
+
readonly fast: "150ms";
|
|
188
|
+
readonly normal: "250ms";
|
|
189
|
+
readonly slow: "400ms";
|
|
190
|
+
readonly spring: "500ms";
|
|
191
|
+
};
|
|
192
|
+
readonly easing: {
|
|
193
|
+
readonly standard: "cubic-bezier(0.2, 0.0, 0.0, 1.0)";
|
|
194
|
+
readonly spring: "cubic-bezier(0.34, 1.56, 0.64, 1)";
|
|
195
|
+
readonly glass: "cubic-bezier(0.4, 0.0, 0.2, 1.0)";
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
export declare const tokenContract: {
|
|
199
|
+
readonly colorTokens: {
|
|
200
|
+
readonly light: {
|
|
201
|
+
readonly background: "oklch(0.985 0.002 240)";
|
|
202
|
+
readonly foreground: "oklch(0.23 0.01 248)";
|
|
203
|
+
readonly surface: "oklch(0.997 0.002 245)";
|
|
204
|
+
readonly border: "oklch(0.89 0.01 246)";
|
|
205
|
+
readonly accent: "oklch(0.20 0.005 250)";
|
|
206
|
+
readonly accentForeground: "oklch(0.98 0.003 250)";
|
|
207
|
+
};
|
|
208
|
+
readonly dark: {
|
|
209
|
+
readonly background: "oklch(0.18 0.01 250)";
|
|
210
|
+
readonly foreground: "oklch(0.95 0.01 247)";
|
|
211
|
+
readonly surface: "oklch(0.23 0.01 250)";
|
|
212
|
+
readonly border: "oklch(0.34 0.01 250)";
|
|
213
|
+
readonly accent: "oklch(0.92 0.005 250)";
|
|
214
|
+
readonly accentForeground: "oklch(0.15 0.005 250)";
|
|
215
|
+
};
|
|
216
|
+
};
|
|
217
|
+
readonly glassTokens: {
|
|
218
|
+
readonly blur: {
|
|
219
|
+
readonly sm: "8px";
|
|
220
|
+
readonly md: "16px";
|
|
221
|
+
readonly lg: "24px";
|
|
222
|
+
readonly xl: "40px";
|
|
223
|
+
};
|
|
224
|
+
readonly saturate: {
|
|
225
|
+
readonly default: "180%";
|
|
226
|
+
readonly subtle: "130%";
|
|
227
|
+
};
|
|
228
|
+
readonly surface: {
|
|
229
|
+
readonly light: "rgba(255, 255, 255, 0.18)";
|
|
230
|
+
readonly dark: "rgba(0, 0, 0, 0.40)";
|
|
231
|
+
};
|
|
232
|
+
readonly border: {
|
|
233
|
+
readonly light: "rgba(255, 255, 255, 0.20)";
|
|
234
|
+
readonly dark: "rgba(255, 255, 255, 0.10)";
|
|
235
|
+
};
|
|
236
|
+
readonly borderStrong: {
|
|
237
|
+
readonly light: "rgba(255, 255, 255, 0.35)";
|
|
238
|
+
readonly dark: "rgba(255, 255, 255, 0.18)";
|
|
239
|
+
};
|
|
240
|
+
readonly refractionTop: {
|
|
241
|
+
readonly light: "rgba(255, 255, 255, 0.40)";
|
|
242
|
+
readonly dark: "rgba(255, 255, 255, 0.15)";
|
|
243
|
+
};
|
|
244
|
+
};
|
|
245
|
+
readonly glassLevelTokens: {
|
|
246
|
+
readonly "glass-1": {
|
|
247
|
+
readonly blur: "8px";
|
|
248
|
+
readonly opacity: {
|
|
249
|
+
readonly light: "0.08";
|
|
250
|
+
readonly dark: "0.20";
|
|
251
|
+
};
|
|
252
|
+
readonly shadow: "glass-sm";
|
|
253
|
+
};
|
|
254
|
+
readonly "glass-2": {
|
|
255
|
+
readonly blur: "12px";
|
|
256
|
+
readonly opacity: {
|
|
257
|
+
readonly light: "0.12";
|
|
258
|
+
readonly dark: "0.30";
|
|
259
|
+
};
|
|
260
|
+
readonly shadow: "glass-sm";
|
|
261
|
+
};
|
|
262
|
+
readonly "glass-3": {
|
|
263
|
+
readonly blur: "16px";
|
|
264
|
+
readonly opacity: {
|
|
265
|
+
readonly light: "0.18";
|
|
266
|
+
readonly dark: "0.40";
|
|
267
|
+
};
|
|
268
|
+
readonly shadow: "glass-md";
|
|
269
|
+
};
|
|
270
|
+
readonly "glass-4": {
|
|
271
|
+
readonly blur: "24px";
|
|
272
|
+
readonly opacity: {
|
|
273
|
+
readonly light: "0.25";
|
|
274
|
+
readonly dark: "0.55";
|
|
275
|
+
};
|
|
276
|
+
readonly shadow: "glass-lg";
|
|
277
|
+
};
|
|
278
|
+
readonly "glass-5": {
|
|
279
|
+
readonly blur: "40px";
|
|
280
|
+
readonly opacity: {
|
|
281
|
+
readonly light: "0.35";
|
|
282
|
+
readonly dark: "0.70";
|
|
283
|
+
};
|
|
284
|
+
readonly shadow: "glass-lg";
|
|
285
|
+
};
|
|
286
|
+
};
|
|
287
|
+
readonly glassOpacityScaleTokens: {
|
|
288
|
+
readonly light: {
|
|
289
|
+
readonly 1: "0.06";
|
|
290
|
+
readonly 2: "0.08";
|
|
291
|
+
readonly 3: "0.10";
|
|
292
|
+
readonly 4: "0.12";
|
|
293
|
+
readonly 5: "0.16";
|
|
294
|
+
readonly 6: "0.18";
|
|
295
|
+
readonly 7: "0.22";
|
|
296
|
+
readonly 8: "0.25";
|
|
297
|
+
readonly 9: "0.30";
|
|
298
|
+
readonly 10: "0.35";
|
|
299
|
+
};
|
|
300
|
+
readonly dark: {
|
|
301
|
+
readonly 1: "0.16";
|
|
302
|
+
readonly 2: "0.20";
|
|
303
|
+
readonly 3: "0.25";
|
|
304
|
+
readonly 4: "0.30";
|
|
305
|
+
readonly 5: "0.35";
|
|
306
|
+
readonly 6: "0.40";
|
|
307
|
+
readonly 7: "0.48";
|
|
308
|
+
readonly 8: "0.55";
|
|
309
|
+
readonly 9: "0.62";
|
|
310
|
+
readonly 10: "0.70";
|
|
311
|
+
};
|
|
312
|
+
};
|
|
313
|
+
readonly glassPerformanceTokens: {
|
|
314
|
+
readonly gpuHint: {
|
|
315
|
+
readonly transform: "translateZ(0)";
|
|
316
|
+
readonly backfaceVisibility: "hidden";
|
|
317
|
+
readonly willChange: "transform, opacity";
|
|
318
|
+
};
|
|
319
|
+
readonly heavySurface: {
|
|
320
|
+
readonly transform: "translateZ(0)";
|
|
321
|
+
readonly backfaceVisibility: "hidden";
|
|
322
|
+
readonly willChange: "backdrop-filter, transform, opacity";
|
|
323
|
+
readonly contain: "paint";
|
|
324
|
+
};
|
|
325
|
+
};
|
|
326
|
+
readonly glassLuminanceTokens: {
|
|
327
|
+
readonly neutral: {
|
|
328
|
+
readonly surfaceMultiplier: 1;
|
|
329
|
+
readonly borderMultiplier: 1;
|
|
330
|
+
readonly refractionMultiplier: 1;
|
|
331
|
+
readonly saturateMultiplier: 1;
|
|
332
|
+
};
|
|
333
|
+
readonly bright: {
|
|
334
|
+
readonly surfaceMultiplier: 1.16;
|
|
335
|
+
readonly borderMultiplier: 1.08;
|
|
336
|
+
readonly refractionMultiplier: 1.14;
|
|
337
|
+
readonly saturateMultiplier: 1.04;
|
|
338
|
+
};
|
|
339
|
+
readonly dim: {
|
|
340
|
+
readonly surfaceMultiplier: 0.9;
|
|
341
|
+
readonly borderMultiplier: 1.15;
|
|
342
|
+
readonly refractionMultiplier: 1.22;
|
|
343
|
+
readonly saturateMultiplier: 0.96;
|
|
344
|
+
};
|
|
345
|
+
};
|
|
346
|
+
readonly radiusTokens: {
|
|
347
|
+
readonly sm: "0.5rem";
|
|
348
|
+
readonly md: "0.75rem";
|
|
349
|
+
readonly lg: "1rem";
|
|
350
|
+
readonly xl: "1.25rem";
|
|
351
|
+
readonly "2xl": "1.75rem";
|
|
352
|
+
};
|
|
353
|
+
readonly spacingTokens: {
|
|
354
|
+
readonly xs: "0.25rem";
|
|
355
|
+
readonly sm: "0.5rem";
|
|
356
|
+
readonly md: "0.75rem";
|
|
357
|
+
readonly lg: "1rem";
|
|
358
|
+
readonly xl: "1.5rem";
|
|
359
|
+
readonly "2xl": "2rem";
|
|
360
|
+
};
|
|
361
|
+
readonly shadowTokens: {
|
|
362
|
+
readonly "glass-sm": "0 2px 8px rgba(0, 0, 0, 0.08)";
|
|
363
|
+
readonly "glass-md": "0 8px 24px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.08)";
|
|
364
|
+
readonly "glass-lg": "0 16px 48px rgba(0, 0, 0, 0.16), 0 4px 8px rgba(0, 0, 0, 0.08)";
|
|
365
|
+
readonly "glass-inset": "inset 0 1px 0 rgba(255, 255, 255, 0.12), inset 0 -1px 0 rgba(0, 0, 0, 0.05)";
|
|
366
|
+
};
|
|
367
|
+
readonly motionTokens: {
|
|
368
|
+
readonly duration: {
|
|
369
|
+
readonly fast: "150ms";
|
|
370
|
+
readonly normal: "250ms";
|
|
371
|
+
readonly slow: "400ms";
|
|
372
|
+
readonly spring: "500ms";
|
|
373
|
+
};
|
|
374
|
+
readonly easing: {
|
|
375
|
+
readonly standard: "cubic-bezier(0.2, 0.0, 0.0, 1.0)";
|
|
376
|
+
readonly spring: "cubic-bezier(0.34, 1.56, 0.64, 1)";
|
|
377
|
+
readonly glass: "cubic-bezier(0.4, 0.0, 0.2, 1.0)";
|
|
378
|
+
};
|
|
379
|
+
};
|
|
380
|
+
};
|
|
381
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;AAExC,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;CAiBd,CAAA;AAEV;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Bd,CAAA;AAEV,eAAO,MAAM,YAAY;;;;;;CAMf,CAAA;AAEV,eAAO,MAAM,aAAa;;;;;;;CAOhB,CAAA;AAEV,eAAO,MAAM,YAAY;;;;;CAQf,CAAA;AAEV;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BnB,CAAA;AAEV,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;CAyB1B,CAAA;AAEV,eAAO,MAAM,sBAAsB;;;;;;;;;;;;CAYzB,CAAA;AAEV,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;CAmBvB,CAAA;AAEV,eAAO,MAAM,YAAY;;;;;;;;;;;;CAYf,CAAA;AAEV,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWhB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
export const colorTokens = {
|
|
2
|
+
light: {
|
|
3
|
+
background: "oklch(0.985 0.002 240)",
|
|
4
|
+
foreground: "oklch(0.23 0.01 248)",
|
|
5
|
+
surface: "oklch(0.997 0.002 245)",
|
|
6
|
+
border: "oklch(0.89 0.01 246)",
|
|
7
|
+
accent: "oklch(0.20 0.005 250)",
|
|
8
|
+
accentForeground: "oklch(0.98 0.003 250)"
|
|
9
|
+
},
|
|
10
|
+
dark: {
|
|
11
|
+
background: "oklch(0.18 0.01 250)",
|
|
12
|
+
foreground: "oklch(0.95 0.01 247)",
|
|
13
|
+
surface: "oklch(0.23 0.01 250)",
|
|
14
|
+
border: "oklch(0.34 0.01 250)",
|
|
15
|
+
accent: "oklch(0.92 0.005 250)",
|
|
16
|
+
accentForeground: "oklch(0.15 0.005 250)"
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Glass tokens — Apple Liquid Glass spec (WWDC 2025).
|
|
21
|
+
*
|
|
22
|
+
* Key principles:
|
|
23
|
+
* - saturate(180%) always paired with blur
|
|
24
|
+
* - Higher surface opacity than old glassmorphism (Apple Beta 3+)
|
|
25
|
+
* - Dark mode significantly MORE opaque than light mode
|
|
26
|
+
* - Top border brighter than sides (light refraction edge)
|
|
27
|
+
* - 4.5:1 contrast ratio for text on glass (WCAG AA)
|
|
28
|
+
*/
|
|
29
|
+
export const glassTokens = {
|
|
30
|
+
blur: {
|
|
31
|
+
sm: "8px",
|
|
32
|
+
md: "16px",
|
|
33
|
+
lg: "24px",
|
|
34
|
+
xl: "40px"
|
|
35
|
+
},
|
|
36
|
+
saturate: {
|
|
37
|
+
default: "180%",
|
|
38
|
+
subtle: "130%"
|
|
39
|
+
},
|
|
40
|
+
surface: {
|
|
41
|
+
light: "rgba(255, 255, 255, 0.18)",
|
|
42
|
+
dark: "rgba(0, 0, 0, 0.40)"
|
|
43
|
+
},
|
|
44
|
+
border: {
|
|
45
|
+
light: "rgba(255, 255, 255, 0.20)",
|
|
46
|
+
dark: "rgba(255, 255, 255, 0.10)"
|
|
47
|
+
},
|
|
48
|
+
borderStrong: {
|
|
49
|
+
light: "rgba(255, 255, 255, 0.35)",
|
|
50
|
+
dark: "rgba(255, 255, 255, 0.18)"
|
|
51
|
+
},
|
|
52
|
+
refractionTop: {
|
|
53
|
+
light: "rgba(255, 255, 255, 0.40)",
|
|
54
|
+
dark: "rgba(255, 255, 255, 0.15)"
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
export const radiusTokens = {
|
|
58
|
+
sm: "0.5rem",
|
|
59
|
+
md: "0.75rem",
|
|
60
|
+
lg: "1rem",
|
|
61
|
+
xl: "1.25rem",
|
|
62
|
+
"2xl": "1.75rem"
|
|
63
|
+
};
|
|
64
|
+
export const spacingTokens = {
|
|
65
|
+
xs: "0.25rem",
|
|
66
|
+
sm: "0.5rem",
|
|
67
|
+
md: "0.75rem",
|
|
68
|
+
lg: "1rem",
|
|
69
|
+
xl: "1.5rem",
|
|
70
|
+
"2xl": "2rem"
|
|
71
|
+
};
|
|
72
|
+
export const shadowTokens = {
|
|
73
|
+
"glass-sm": "0 2px 8px rgba(0, 0, 0, 0.08)",
|
|
74
|
+
"glass-md": "0 8px 24px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.08)",
|
|
75
|
+
"glass-lg": "0 16px 48px rgba(0, 0, 0, 0.16), 0 4px 8px rgba(0, 0, 0, 0.08)",
|
|
76
|
+
"glass-inset": "inset 0 1px 0 rgba(255, 255, 255, 0.12), inset 0 -1px 0 rgba(0, 0, 0, 0.05)"
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Composed glass elevation levels.
|
|
80
|
+
* Each bundles blur + surface opacity + shadow.
|
|
81
|
+
* CSS classes also apply saturate(180%) and refraction top border.
|
|
82
|
+
*/
|
|
83
|
+
export const glassLevelTokens = {
|
|
84
|
+
"glass-1": {
|
|
85
|
+
blur: "8px",
|
|
86
|
+
opacity: { light: "0.08", dark: "0.20" },
|
|
87
|
+
shadow: "glass-sm"
|
|
88
|
+
},
|
|
89
|
+
"glass-2": {
|
|
90
|
+
blur: "12px",
|
|
91
|
+
opacity: { light: "0.12", dark: "0.30" },
|
|
92
|
+
shadow: "glass-sm"
|
|
93
|
+
},
|
|
94
|
+
"glass-3": {
|
|
95
|
+
blur: "16px",
|
|
96
|
+
opacity: { light: "0.18", dark: "0.40" },
|
|
97
|
+
shadow: "glass-md"
|
|
98
|
+
},
|
|
99
|
+
"glass-4": {
|
|
100
|
+
blur: "24px",
|
|
101
|
+
opacity: { light: "0.25", dark: "0.55" },
|
|
102
|
+
shadow: "glass-lg"
|
|
103
|
+
},
|
|
104
|
+
"glass-5": {
|
|
105
|
+
blur: "40px",
|
|
106
|
+
opacity: { light: "0.35", dark: "0.70" },
|
|
107
|
+
shadow: "glass-lg"
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
export const glassOpacityScaleTokens = {
|
|
111
|
+
light: {
|
|
112
|
+
1: "0.06",
|
|
113
|
+
2: "0.08",
|
|
114
|
+
3: "0.10",
|
|
115
|
+
4: "0.12",
|
|
116
|
+
5: "0.16",
|
|
117
|
+
6: "0.18",
|
|
118
|
+
7: "0.22",
|
|
119
|
+
8: "0.25",
|
|
120
|
+
9: "0.30",
|
|
121
|
+
10: "0.35"
|
|
122
|
+
},
|
|
123
|
+
dark: {
|
|
124
|
+
1: "0.16",
|
|
125
|
+
2: "0.20",
|
|
126
|
+
3: "0.25",
|
|
127
|
+
4: "0.30",
|
|
128
|
+
5: "0.35",
|
|
129
|
+
6: "0.40",
|
|
130
|
+
7: "0.48",
|
|
131
|
+
8: "0.55",
|
|
132
|
+
9: "0.62",
|
|
133
|
+
10: "0.70"
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
export const glassPerformanceTokens = {
|
|
137
|
+
gpuHint: {
|
|
138
|
+
transform: "translateZ(0)",
|
|
139
|
+
backfaceVisibility: "hidden",
|
|
140
|
+
willChange: "transform, opacity"
|
|
141
|
+
},
|
|
142
|
+
heavySurface: {
|
|
143
|
+
transform: "translateZ(0)",
|
|
144
|
+
backfaceVisibility: "hidden",
|
|
145
|
+
willChange: "backdrop-filter, transform, opacity",
|
|
146
|
+
contain: "paint"
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
export const glassLuminanceTokens = {
|
|
150
|
+
neutral: {
|
|
151
|
+
surfaceMultiplier: 1,
|
|
152
|
+
borderMultiplier: 1,
|
|
153
|
+
refractionMultiplier: 1,
|
|
154
|
+
saturateMultiplier: 1
|
|
155
|
+
},
|
|
156
|
+
bright: {
|
|
157
|
+
surfaceMultiplier: 1.16,
|
|
158
|
+
borderMultiplier: 1.08,
|
|
159
|
+
refractionMultiplier: 1.14,
|
|
160
|
+
saturateMultiplier: 1.04
|
|
161
|
+
},
|
|
162
|
+
dim: {
|
|
163
|
+
surfaceMultiplier: 0.9,
|
|
164
|
+
borderMultiplier: 1.15,
|
|
165
|
+
refractionMultiplier: 1.22,
|
|
166
|
+
saturateMultiplier: 0.96
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
export const motionTokens = {
|
|
170
|
+
duration: {
|
|
171
|
+
fast: "150ms",
|
|
172
|
+
normal: "250ms",
|
|
173
|
+
slow: "400ms",
|
|
174
|
+
spring: "500ms"
|
|
175
|
+
},
|
|
176
|
+
easing: {
|
|
177
|
+
standard: "cubic-bezier(0.2, 0.0, 0.0, 1.0)",
|
|
178
|
+
spring: "cubic-bezier(0.34, 1.56, 0.64, 1)",
|
|
179
|
+
glass: "cubic-bezier(0.4, 0.0, 0.2, 1.0)"
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
export const tokenContract = {
|
|
183
|
+
colorTokens,
|
|
184
|
+
glassTokens,
|
|
185
|
+
glassLevelTokens,
|
|
186
|
+
glassOpacityScaleTokens,
|
|
187
|
+
glassPerformanceTokens,
|
|
188
|
+
glassLuminanceTokens,
|
|
189
|
+
radiusTokens,
|
|
190
|
+
spacingTokens,
|
|
191
|
+
shadowTokens,
|
|
192
|
+
motionTokens
|
|
193
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@glinui/tokens",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./theme.css": "./theme.css"
|
|
13
|
+
},
|
|
14
|
+
"files": ["dist", "theme.css"],
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/GLINCKER/glinui",
|
|
19
|
+
"directory": "packages/tokens"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://glinui.com",
|
|
22
|
+
"bugs": "https://github.com/GLINCKER/glinui/issues",
|
|
23
|
+
"keywords": ["glinui", "glassmorphism", "liquid-glass", "react", "tailwindcss", "ui", "design-system"],
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc -p tsconfig.json",
|
|
29
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
30
|
+
"lint": "echo 'lint: @glinui/tokens (todo)'",
|
|
31
|
+
"test": "echo 'test: @glinui/tokens (todo)'"
|
|
32
|
+
}
|
|
33
|
+
}
|
package/theme.css
ADDED
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glin UI — Glass Design Tokens (Apple Liquid Glass spec)
|
|
3
|
+
*
|
|
4
|
+
* Key principles:
|
|
5
|
+
* - saturate(180%) always paired with blur in backdrop-filter
|
|
6
|
+
* - Higher surface opacity than old glassmorphism (Apple Beta 3+)
|
|
7
|
+
* - Dark mode significantly MORE opaque for readability
|
|
8
|
+
* - Top border brighter than sides (light refraction edge)
|
|
9
|
+
* - 4.5:1 contrast ratio for text on glass (WCAG AA)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
:root {
|
|
13
|
+
/* ── Semantic colour ─────────────────────────────── */
|
|
14
|
+
--color-background: oklch(0.985 0.002 240);
|
|
15
|
+
--color-foreground: oklch(0.23 0.01 248);
|
|
16
|
+
--color-surface: oklch(0.997 0.002 245);
|
|
17
|
+
--color-border: oklch(0.89 0.01 246);
|
|
18
|
+
--color-accent: oklch(0.63 0.19 254);
|
|
19
|
+
--color-accent-foreground: oklch(0.99 0.003 240);
|
|
20
|
+
|
|
21
|
+
/* ── Glass primitives ────────────────────────────── */
|
|
22
|
+
--glass-blur-sm: 8px;
|
|
23
|
+
--glass-blur-md: 16px;
|
|
24
|
+
--glass-blur-lg: 24px;
|
|
25
|
+
--glass-blur-xl: 40px;
|
|
26
|
+
|
|
27
|
+
--glass-adapt-surface-multiplier: 1;
|
|
28
|
+
--glass-adapt-border-multiplier: 1;
|
|
29
|
+
--glass-adapt-refraction-multiplier: 1;
|
|
30
|
+
--glass-adapt-saturate-multiplier: 1;
|
|
31
|
+
|
|
32
|
+
--glass-base-rgb: 255 255 255;
|
|
33
|
+
--glass-saturate-base: 180%;
|
|
34
|
+
--glass-saturate-subtle-base: 130%;
|
|
35
|
+
--glass-saturate: calc(var(--glass-saturate-base) * var(--glass-adapt-saturate-multiplier));
|
|
36
|
+
--glass-saturate-subtle: calc(var(--glass-saturate-subtle-base) * var(--glass-adapt-saturate-multiplier));
|
|
37
|
+
|
|
38
|
+
--glass-border-alpha: 0.20;
|
|
39
|
+
--glass-border-strong-alpha: 0.35;
|
|
40
|
+
--glass-refraction-top-alpha: 0.40;
|
|
41
|
+
--glass-surface: rgb(var(--glass-base-rgb) / calc(0.18 * var(--glass-adapt-surface-multiplier)));
|
|
42
|
+
--glass-border: rgb(255 255 255 / calc(var(--glass-border-alpha) * var(--glass-adapt-border-multiplier)));
|
|
43
|
+
--glass-border-strong: rgb(255 255 255 / calc(var(--glass-border-strong-alpha) * var(--glass-adapt-border-multiplier)));
|
|
44
|
+
--glass-refraction-top: rgb(255 255 255 / calc(var(--glass-refraction-top-alpha) * var(--glass-adapt-refraction-multiplier)));
|
|
45
|
+
|
|
46
|
+
/* ── Glass opacity scale (crystal -> frosted) ───── */
|
|
47
|
+
--glass-opacity-1: 0.06;
|
|
48
|
+
--glass-opacity-2: 0.08;
|
|
49
|
+
--glass-opacity-3: 0.10;
|
|
50
|
+
--glass-opacity-4: 0.12;
|
|
51
|
+
--glass-opacity-5: 0.16;
|
|
52
|
+
--glass-opacity-6: 0.18;
|
|
53
|
+
--glass-opacity-7: 0.22;
|
|
54
|
+
--glass-opacity-8: 0.25;
|
|
55
|
+
--glass-opacity-9: 0.30;
|
|
56
|
+
--glass-opacity-10: 0.35;
|
|
57
|
+
|
|
58
|
+
/* ── Glass performance hints ─────────────────────── */
|
|
59
|
+
--glass-gpu-transform: translateZ(0);
|
|
60
|
+
--glass-gpu-backface-visibility: hidden;
|
|
61
|
+
--glass-gpu-will-change: transform, opacity;
|
|
62
|
+
--glass-heavy-will-change: backdrop-filter, transform, opacity;
|
|
63
|
+
--glass-heavy-contain: paint;
|
|
64
|
+
|
|
65
|
+
/* ── Glass levels (blur + surface + shadow) ──────── */
|
|
66
|
+
--glass-1-blur: 8px;
|
|
67
|
+
--glass-1-opacity: var(--glass-opacity-2);
|
|
68
|
+
--glass-1-surface: rgb(var(--glass-base-rgb) / calc(var(--glass-1-opacity) * var(--glass-adapt-surface-multiplier)));
|
|
69
|
+
--glass-1-shadow: var(--shadow-glass-sm);
|
|
70
|
+
|
|
71
|
+
--glass-2-blur: 12px;
|
|
72
|
+
--glass-2-opacity: var(--glass-opacity-4);
|
|
73
|
+
--glass-2-surface: rgb(var(--glass-base-rgb) / calc(var(--glass-2-opacity) * var(--glass-adapt-surface-multiplier)));
|
|
74
|
+
--glass-2-shadow: var(--shadow-glass-sm);
|
|
75
|
+
|
|
76
|
+
--glass-3-blur: 16px;
|
|
77
|
+
--glass-3-opacity: var(--glass-opacity-6);
|
|
78
|
+
--glass-3-surface: rgb(var(--glass-base-rgb) / calc(var(--glass-3-opacity) * var(--glass-adapt-surface-multiplier)));
|
|
79
|
+
--glass-3-shadow: var(--shadow-glass-md);
|
|
80
|
+
|
|
81
|
+
--glass-4-blur: 24px;
|
|
82
|
+
--glass-4-opacity: var(--glass-opacity-8);
|
|
83
|
+
--glass-4-surface: rgb(var(--glass-base-rgb) / calc(var(--glass-4-opacity) * var(--glass-adapt-surface-multiplier)));
|
|
84
|
+
--glass-4-shadow: var(--shadow-glass-lg);
|
|
85
|
+
|
|
86
|
+
--glass-5-blur: 40px;
|
|
87
|
+
--glass-5-opacity: var(--glass-opacity-10);
|
|
88
|
+
--glass-5-surface: rgb(var(--glass-base-rgb) / calc(var(--glass-5-opacity) * var(--glass-adapt-surface-multiplier)));
|
|
89
|
+
--glass-5-shadow: var(--shadow-glass-lg);
|
|
90
|
+
|
|
91
|
+
/* ── Radius ──────────────────────────────────────── */
|
|
92
|
+
--radius-sm: 0.5rem;
|
|
93
|
+
--radius-md: 0.75rem;
|
|
94
|
+
--radius-lg: 1rem;
|
|
95
|
+
--radius-xl: 1.25rem;
|
|
96
|
+
--radius-2xl: 1.75rem;
|
|
97
|
+
|
|
98
|
+
/* ── Spacing ─────────────────────────────────────── */
|
|
99
|
+
--space-xs: 0.25rem;
|
|
100
|
+
--space-sm: 0.5rem;
|
|
101
|
+
--space-md: 0.75rem;
|
|
102
|
+
--space-lg: 1rem;
|
|
103
|
+
--space-xl: 1.5rem;
|
|
104
|
+
--space-2xl: 2rem;
|
|
105
|
+
|
|
106
|
+
/* ── Shadows ─────────────────────────────────────── */
|
|
107
|
+
--shadow-glass-sm: 0 2px 8px rgba(0, 0, 0, 0.08);
|
|
108
|
+
--shadow-glass-md: 0 8px 24px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.08);
|
|
109
|
+
--shadow-glass-lg: 0 16px 48px rgba(0, 0, 0, 0.16), 0 4px 8px rgba(0, 0, 0, 0.08);
|
|
110
|
+
--shadow-glass-inset: inset 0 1px 0 rgba(255, 255, 255, 0.12), inset 0 -1px 0 rgba(0, 0, 0, 0.05);
|
|
111
|
+
|
|
112
|
+
/* ── Motion ──────────────────────────────────────── */
|
|
113
|
+
--motion-fast: 150ms;
|
|
114
|
+
--motion-normal: 250ms;
|
|
115
|
+
--motion-slow: 400ms;
|
|
116
|
+
--motion-spring: 500ms;
|
|
117
|
+
--easing-standard: cubic-bezier(0.2, 0.0, 0.0, 1.0);
|
|
118
|
+
--easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
119
|
+
--easing-glass: cubic-bezier(0.4, 0.0, 0.2, 1.0);
|
|
120
|
+
|
|
121
|
+
color-scheme: light;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.dark {
|
|
125
|
+
--color-background: oklch(0.18 0.01 250);
|
|
126
|
+
--color-foreground: oklch(0.95 0.01 247);
|
|
127
|
+
--color-surface: oklch(0.23 0.01 250);
|
|
128
|
+
--color-border: oklch(0.34 0.01 250);
|
|
129
|
+
--color-accent: oklch(0.74 0.19 252);
|
|
130
|
+
--color-accent-foreground: oklch(0.15 0.01 252);
|
|
131
|
+
|
|
132
|
+
--glass-base-rgb: 0 0 0;
|
|
133
|
+
--glass-border-alpha: 0.10;
|
|
134
|
+
--glass-border-strong-alpha: 0.18;
|
|
135
|
+
--glass-refraction-top-alpha: 0.15;
|
|
136
|
+
--glass-surface: rgb(var(--glass-base-rgb) / calc(0.40 * var(--glass-adapt-surface-multiplier)));
|
|
137
|
+
|
|
138
|
+
--glass-opacity-1: 0.16;
|
|
139
|
+
--glass-opacity-2: 0.20;
|
|
140
|
+
--glass-opacity-3: 0.25;
|
|
141
|
+
--glass-opacity-4: 0.30;
|
|
142
|
+
--glass-opacity-5: 0.35;
|
|
143
|
+
--glass-opacity-6: 0.40;
|
|
144
|
+
--glass-opacity-7: 0.48;
|
|
145
|
+
--glass-opacity-8: 0.55;
|
|
146
|
+
--glass-opacity-9: 0.62;
|
|
147
|
+
--glass-opacity-10: 0.70;
|
|
148
|
+
|
|
149
|
+
--glass-1-opacity: var(--glass-opacity-2);
|
|
150
|
+
--glass-1-surface: rgb(var(--glass-base-rgb) / calc(var(--glass-1-opacity) * var(--glass-adapt-surface-multiplier)));
|
|
151
|
+
|
|
152
|
+
--glass-2-opacity: var(--glass-opacity-4);
|
|
153
|
+
--glass-2-surface: rgb(var(--glass-base-rgb) / calc(var(--glass-2-opacity) * var(--glass-adapt-surface-multiplier)));
|
|
154
|
+
|
|
155
|
+
--glass-3-opacity: var(--glass-opacity-6);
|
|
156
|
+
--glass-3-surface: rgb(var(--glass-base-rgb) / calc(var(--glass-3-opacity) * var(--glass-adapt-surface-multiplier)));
|
|
157
|
+
|
|
158
|
+
--glass-4-opacity: var(--glass-opacity-8);
|
|
159
|
+
--glass-4-surface: rgb(var(--glass-base-rgb) / calc(var(--glass-4-opacity) * var(--glass-adapt-surface-multiplier)));
|
|
160
|
+
|
|
161
|
+
--glass-5-opacity: var(--glass-opacity-10);
|
|
162
|
+
--glass-5-surface: rgb(var(--glass-base-rgb) / calc(var(--glass-5-opacity) * var(--glass-adapt-surface-multiplier)));
|
|
163
|
+
|
|
164
|
+
color-scheme: dark;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* ── Glass utility classes ─────────────────────────── */
|
|
168
|
+
.glass-surface,
|
|
169
|
+
.glass-1,
|
|
170
|
+
.glass-2,
|
|
171
|
+
.glass-3,
|
|
172
|
+
.glass-4,
|
|
173
|
+
.glass-5 {
|
|
174
|
+
border: 1px solid var(--glass-border);
|
|
175
|
+
border-top-color: var(--glass-refraction-top);
|
|
176
|
+
background-clip: padding-box;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.glass-surface,
|
|
180
|
+
.glass-3 {
|
|
181
|
+
background: var(--glass-3-surface);
|
|
182
|
+
backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-3-blur));
|
|
183
|
+
-webkit-backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-3-blur));
|
|
184
|
+
box-shadow: var(--glass-3-shadow);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.glass-1 {
|
|
188
|
+
background: var(--glass-1-surface);
|
|
189
|
+
backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-1-blur));
|
|
190
|
+
-webkit-backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-1-blur));
|
|
191
|
+
box-shadow: var(--glass-1-shadow);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.glass-2 {
|
|
195
|
+
background: var(--glass-2-surface);
|
|
196
|
+
backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-2-blur));
|
|
197
|
+
-webkit-backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-2-blur));
|
|
198
|
+
box-shadow: var(--glass-2-shadow);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.glass-4 {
|
|
202
|
+
background: var(--glass-4-surface);
|
|
203
|
+
backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-4-blur));
|
|
204
|
+
-webkit-backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-4-blur));
|
|
205
|
+
box-shadow: var(--glass-4-shadow);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.glass-5 {
|
|
209
|
+
background: var(--glass-5-surface);
|
|
210
|
+
backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-5-blur));
|
|
211
|
+
-webkit-backdrop-filter: saturate(var(--glass-saturate)) blur(var(--glass-5-blur));
|
|
212
|
+
box-shadow: var(--glass-5-shadow);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.glass-gpu-hint {
|
|
216
|
+
transform: var(--glass-gpu-transform);
|
|
217
|
+
backface-visibility: var(--glass-gpu-backface-visibility);
|
|
218
|
+
will-change: var(--glass-gpu-will-change);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.glass-heavy {
|
|
222
|
+
transform: var(--glass-gpu-transform);
|
|
223
|
+
backface-visibility: var(--glass-gpu-backface-visibility);
|
|
224
|
+
will-change: var(--glass-heavy-will-change);
|
|
225
|
+
contain: var(--glass-heavy-contain);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* ── Background luminance adaptation ──────────────── */
|
|
229
|
+
.glass-adapt-neutral,
|
|
230
|
+
[data-glass-luminance="neutral"] {
|
|
231
|
+
--glass-adapt-surface-multiplier: 1;
|
|
232
|
+
--glass-adapt-border-multiplier: 1;
|
|
233
|
+
--glass-adapt-refraction-multiplier: 1;
|
|
234
|
+
--glass-adapt-saturate-multiplier: 1;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.glass-adapt-bright,
|
|
238
|
+
[data-glass-luminance="bright"] {
|
|
239
|
+
--glass-adapt-surface-multiplier: 1.16;
|
|
240
|
+
--glass-adapt-border-multiplier: 1.08;
|
|
241
|
+
--glass-adapt-refraction-multiplier: 1.14;
|
|
242
|
+
--glass-adapt-saturate-multiplier: 1.04;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.glass-adapt-dim,
|
|
246
|
+
[data-glass-luminance="dim"] {
|
|
247
|
+
--glass-adapt-surface-multiplier: 0.9;
|
|
248
|
+
--glass-adapt-border-multiplier: 1.15;
|
|
249
|
+
--glass-adapt-refraction-multiplier: 1.22;
|
|
250
|
+
--glass-adapt-saturate-multiplier: 0.96;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/* ── Reduced transparency ──────────────────────────── */
|
|
254
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
255
|
+
:root {
|
|
256
|
+
--glass-1-surface: rgba(255, 255, 255, 0.92);
|
|
257
|
+
--glass-2-surface: rgba(255, 255, 255, 0.94);
|
|
258
|
+
--glass-3-surface: rgba(255, 255, 255, 0.95);
|
|
259
|
+
--glass-4-surface: rgba(255, 255, 255, 0.96);
|
|
260
|
+
--glass-5-surface: rgba(255, 255, 255, 0.98);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.dark {
|
|
264
|
+
--glass-1-surface: rgba(0, 0, 0, 0.88);
|
|
265
|
+
--glass-2-surface: rgba(0, 0, 0, 0.90);
|
|
266
|
+
--glass-3-surface: rgba(0, 0, 0, 0.92);
|
|
267
|
+
--glass-4-surface: rgba(0, 0, 0, 0.94);
|
|
268
|
+
--glass-5-surface: rgba(0, 0, 0, 0.96);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.glass-surface,
|
|
272
|
+
.glass-1,
|
|
273
|
+
.glass-2,
|
|
274
|
+
.glass-3,
|
|
275
|
+
.glass-4,
|
|
276
|
+
.glass-5 {
|
|
277
|
+
backdrop-filter: none;
|
|
278
|
+
-webkit-backdrop-filter: none;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* ── Reduced motion ────────────────────────────────── */
|
|
283
|
+
@media (prefers-reduced-motion: reduce) {
|
|
284
|
+
:root {
|
|
285
|
+
--motion-fast: 1ms;
|
|
286
|
+
--motion-normal: 1ms;
|
|
287
|
+
--motion-slow: 1ms;
|
|
288
|
+
--motion-spring: 1ms;
|
|
289
|
+
}
|
|
290
|
+
}
|