@fest-lib/veela 0.1.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.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +533 -0
  3. package/dist/veela.js +878 -0
  4. package/package.json +83 -0
  5. package/src/scss/_layers.scss +16 -0
  6. package/src/scss/advanced/_index.scss +0 -0
  7. package/src/scss/advanced/animation/_motion.scss +317 -0
  8. package/src/scss/advanced/color/_color.scss +328 -0
  9. package/src/scss/advanced/color/_colorize.scss +325 -0
  10. package/src/scss/advanced/design/_design-tokens.scss +118 -0
  11. package/src/scss/advanced/design/_effects.scss +275 -0
  12. package/src/scss/advanced/design/_shadow.scss +359 -0
  13. package/src/scss/advanced/design/_surfaces.scss +76 -0
  14. package/src/scss/advanced/effects/_animations.scss +124 -0
  15. package/src/scss/advanced/effects/_shadows.scss +50 -0
  16. package/src/scss/advanced/font/_typography.scss +600 -0
  17. package/src/scss/advanced/index.scss +11 -0
  18. package/src/scss/advanced/index.ts +35 -0
  19. package/src/scss/advanced/layout/_content.scss +170 -0
  20. package/src/scss/advanced/layout/_index.scss +5 -0
  21. package/src/scss/advanced/layout/_normalize.scss +541 -0
  22. package/src/scss/advanced/layout/_shared-overlays.scss +162 -0
  23. package/src/scss/advanced/md3/_md3.scss +596 -0
  24. package/src/scss/advanced/md3/_utils.scss +114 -0
  25. package/src/scss/advanced/misc/_config.scss +119 -0
  26. package/src/scss/advanced/misc/_initials.scss +298 -0
  27. package/src/scss/advanced/misc/_mixins.scss +179 -0
  28. package/src/scss/advanced/misc/_queries.scss +34 -0
  29. package/src/scss/advanced/misc/_rendering.scss +82 -0
  30. package/src/scss/advanced/misc/_tokens.scss +74 -0
  31. package/src/scss/advanced/theme/_shared.scss +232 -0
  32. package/src/scss/advanced/theme/_states.scss +332 -0
  33. package/src/scss/advanced/theme/_variants.scss +354 -0
  34. package/src/scss/advanced/tokens/_material-color.scss +120 -0
  35. package/src/scss/advanced/tokens/_variables.scss +171 -0
  36. package/src/scss/basic/_layers.scss +0 -0
  37. package/src/scss/basic/design/_index.scss +3 -0
  38. package/src/scss/basic/design/_keyframes.scss +163 -0
  39. package/src/scss/basic/design/_shapes.scss +266 -0
  40. package/src/scss/basic/design/_wavy-runtime.scss +50 -0
  41. package/src/scss/basic/index.scss +19 -0
  42. package/src/scss/basic/index.ts +29 -0
  43. package/src/scss/basic/misc/_core-layout.scss +272 -0
  44. package/src/scss/basic/misc/_index.scss +18 -0
  45. package/src/scss/basic/misc/_layout.scss +1040 -0
  46. package/src/scss/basic/misc/_mixins.scss +179 -0
  47. package/src/scss/basic/misc/_motion.scss +28 -0
  48. package/src/scss/basic/misc/_normalize.scss +765 -0
  49. package/src/scss/basic/misc/_queries.scss +34 -0
  50. package/src/scss/basic/misc/_shared.scss +232 -0
  51. package/src/scss/basic/misc/_states.scss +135 -0
  52. package/src/scss/basic/misc/_tokens.scss +78 -0
  53. package/src/scss/basic/misc/_veela.scss +12 -0
  54. package/src/scss/core/index.scss +1 -0
  55. package/src/scss/core/interact/_draggable.scss +32 -0
  56. package/src/scss/core/interact/_position.scss +45 -0
  57. package/src/scss/core/interact/_ps-anchor.scss +28 -0
  58. package/src/scss/core/interact/_ps-centered.scss +28 -0
  59. package/src/scss/core/interact/_ps-cursor.scss +18 -0
  60. package/src/scss/core/interact/_ps-draggable.scss +25 -0
  61. package/src/scss/core/interact/_ps-mechanic.scss +0 -0
  62. package/src/scss/core/interact/_ps-properties.scss +54 -0
  63. package/src/scss/core/interact/_ps-resizable.scss +61 -0
  64. package/src/scss/core/interact/_resizable.scss +69 -0
  65. package/src/scss/core/interact/_viewport.scss +469 -0
  66. package/src/scss/core/misc/_color-properties.scss +64 -0
  67. package/src/scss/core/misc/_config.scss +110 -0
  68. package/src/scss/core/misc/_functions.scss +530 -0
  69. package/src/scss/core/misc/_icons.scss +109 -0
  70. package/src/scss/core/misc/_index.scss +6 -0
  71. package/src/scss/core/misc/_layout.scss +49 -0
  72. package/src/scss/core/misc/_mixins.scss +744 -0
  73. package/src/scss/core/misc/_properties.scss +245 -0
  74. package/src/scss/core/misc/_tokens.scss +947 -0
  75. package/src/scss/core/misc/_utilities.scss +941 -0
  76. package/src/scss/core/misc/_utils.scss +17 -0
  77. package/src/scss/index.scss +18 -0
  78. package/src/scss/index.ts +105 -0
@@ -0,0 +1,596 @@
1
+ @use "sass:map";
2
+ @use "sass:list";
3
+ @use "sass:math";
4
+ @use "sass:meta";
5
+ @use "sass:string";
6
+
7
+ @use "utils" as _;
8
+ @use "shadow" as _shadow;
9
+
10
+ //
11
+ // Space function
12
+ @function md3-space($token) {
13
+ @return _.md3-fetch($md3-space-scale, $token, "space token");
14
+ }
15
+
16
+ //
17
+ // Radius function
18
+ @function md3-radius($token) {
19
+ @if map.has-key($md3-radius-scale, $token) {
20
+ @return map.get($md3-radius-scale, $token);
21
+ }
22
+
23
+ @if map.has-key($md3-radius-aliases, $token) {
24
+ $alias: map.get($md3-radius-aliases, $token);
25
+ @return map.get($md3-radius-scale, $alias);
26
+ }
27
+
28
+ @return _.md3-fetch($md3-radius-scale, $token, "radius token");
29
+ }
30
+
31
+ //
32
+ // Gap function
33
+ @function md3-gap($token) { @return md3-space($token); }
34
+
35
+ //
36
+ // Export gap vars mixin
37
+ @mixin md3-export-gap-vars() {
38
+ @each $token, $value in $md3-space-scale {
39
+ --gap-#{$token}: #{$value};
40
+ }
41
+ }
42
+
43
+ //
44
+ // Padding function
45
+ @function md3-padding($token) { @return md3-space($token); }
46
+
47
+ //
48
+ // Export padding vars mixin
49
+ @mixin md3-export-padding-vars() {
50
+ @each $token, $value in $md3-space-scale {
51
+ --padding-#{$token}: #{$value};
52
+ }
53
+ }
54
+
55
+ //
56
+ // Radius function
57
+ @function md3-shape($token) {
58
+ @if map.has-key($md3-shape-scale, $token) {
59
+ @return map.get($md3-shape-scale, $token);
60
+ }
61
+
62
+ @if map.has-key($md3-shape-aliases, $token) {
63
+ $alias: map.get($md3-shape-aliases, $token);
64
+ @return map.get($md3-shape-scale, $alias);
65
+ }
66
+
67
+ @error "Unknown MD3 shape token `#{$token}`. Available: #{map.keys($md3-shape-scale)}";
68
+ }
69
+
70
+ //
71
+ // State function
72
+ @function md3-opacity-state($state) {
73
+ @return _.md3-fetch($md3-state-opacity, $state, "state token");
74
+ }
75
+
76
+ //
77
+ // Icon size function
78
+ @function md3-icon-size($token: md) {
79
+ @return _.md3-fetch($md3-icon-sizes, $token, "icon size");
80
+ }
81
+
82
+ //
83
+ // Avatar size function
84
+ @function md3-avatar-size($token: md) {
85
+ @return _.md3-fetch($md3-avatar-sizes, $token, "avatar size");
86
+ }
87
+
88
+ //
89
+ // Export layout vars mixin
90
+ @mixin md3-export-density-vars() {
91
+ @each $token, $value in $md3-space-scale {
92
+ --space-#{$token}: #{$value};
93
+ --gap-#{$token}: #{$value};
94
+ --padding-#{$token}: #{$value};
95
+ }
96
+
97
+ @each $token, $value in $md3-shape-scale {
98
+ --radius-#{$token}: #{$value};
99
+ }
100
+ }
101
+
102
+
103
+
104
+ @mixin md3-export-scale-vars() {
105
+ --u: 1rem;
106
+ --pxu: 1px;
107
+ --cqi: 1cqi;
108
+ --cqb: 1cqb;
109
+
110
+ --size-scale: 1;
111
+ --font-scale: 1;
112
+
113
+ --container-max-width: min(100%, 110rem);
114
+ --container-padding: clamp(1rem, 3vw, 2rem);
115
+
116
+ @each $name, $value in $md3-breakpoints {
117
+ --breakpoint-#{$name}: #{$value};
118
+ }
119
+
120
+ @container (inline-size < $md3-container-compact-max) {
121
+ --size-scale: 0.92;
122
+ --font-scale: 0.96;
123
+ }
124
+
125
+ @container ($md3-container-compact-max <= inline-size < $md3-container-cozy-max) {
126
+ --size-scale: 1;
127
+ --font-scale: 1;
128
+ }
129
+
130
+ @container (inline-size >= $md3-container-cozy-max) {
131
+ --size-scale: 1.05;
132
+ --font-scale: 1.04;
133
+ }
134
+
135
+ --sidebar-width: min(clamp(16.25rem, 28vw, 22.5rem), 100cqi);
136
+ --sidebar-width-collapsed: min(clamp(10rem, 20vw, 12.5rem), 100cqi);
137
+ --sidebar-width-mobile: min(clamp(17.5rem, 35vw, 20rem), 100cqi);
138
+ --sidebar-width-mobile-small: min(clamp(18.75rem, 40vw, 21.25rem), 100cqi);
139
+
140
+ @media (max-inline-size: #{map.get($md3-breakpoints, md)}) {
141
+ --sidebar-width: var(--sidebar-width-mobile);
142
+ }
143
+
144
+ @media (max-inline-size: #{map.get($md3-breakpoints, sm)}) {
145
+ --sidebar-width: var(--sidebar-width-mobile-small);
146
+ }
147
+ }
148
+
149
+
150
+
151
+
152
+ //
153
+ // Export layout vars mixin
154
+ @mixin md3-export-layout-vars() {
155
+ // Spacing tokens
156
+ @each $token, $value in $md3-space-scale {
157
+ --space-#{$token}-base: #{$value};
158
+ --space-#{$token}: var(--space-#{$token}-base);
159
+ --gap-#{$token}: var(--space-#{$token});
160
+ --padding-#{$token}: var(--space-#{$token});
161
+ }
162
+
163
+
164
+ //
165
+ @each $alias, $token in $md3-radius-aliases {
166
+ --radius-#{$alias}: var(--radius-#{$token}, #{md3-radius($token)});
167
+ }
168
+
169
+ // Radius tokens
170
+ @each $token, $value in $md3-radius-scale {
171
+ --radius-#{$token}: #{$value};
172
+ }
173
+
174
+ --radius-full: #{md3-radius(full)};
175
+
176
+
177
+ //
178
+ @each $alias, $token in $md3-shape-aliases {
179
+ --shape-#{$alias}: var(--shape-#{$token}, #{md3-shape($token)});
180
+ }
181
+
182
+ // Shape tokens
183
+ @each $token, $value in $md3-shape-scale {
184
+ --shape-#{$token}: #{$value};
185
+ }
186
+
187
+
188
+
189
+ // Icon & avatar sizes
190
+ --icon-size-xs: #{md3-icon-size(xs)};
191
+ --icon-size-sm: #{md3-icon-size(sm)};
192
+ --icon-size-md: #{md3-icon-size(md)};
193
+ --icon-size-lg: #{md3-icon-size(lg)};
194
+ --icon-size-xl: #{md3-icon-size(xl)};
195
+ --icon-size-2xl: #{md3-icon-size(2xl)};
196
+
197
+ --avatar-size-sm: #{md3-avatar-size(sm)};
198
+ --avatar-size: #{md3-avatar-size(md)};
199
+ --avatar-size-lg: #{md3-avatar-size(lg)};
200
+
201
+ // Typography scale
202
+ --text-xs: clamp(calc(0.7rem * var(--font-scale)), 0.3cqi + 0.6rem, calc(0.75rem * var(--font-scale)));
203
+ --text-sm: clamp(calc(0.75rem * var(--font-scale)), 0.4cqi + 0.65rem, calc(0.85rem * var(--font-scale)));
204
+ --text-base: clamp(calc(0.8rem * var(--font-scale)), 0.5cqi + 0.7rem, calc(0.95rem * var(--font-scale)));
205
+ --text-lg: clamp(calc(0.9rem * var(--font-scale)), 0.6cqi + 0.8rem, calc(1.1rem * var(--font-scale)));
206
+ --text-xl: clamp(calc(1rem * var(--font-scale)), 0.8cqi + 0.9rem, calc(1.3rem * var(--font-scale)));
207
+
208
+ // Motion tokens
209
+ --transition-fast: 140ms ease;
210
+ --transition-normal: 160ms ease;
211
+ --transition-slow: 200ms ease;
212
+
213
+ --text-opacity-disabled: #{md3-state(disabled)};
214
+ }
215
+
216
+
217
+ //
218
+ // Spacing variables
219
+ $spacing-xs: #{md3-space(xs)};
220
+ $spacing-sm: #{md3-space(sm)};
221
+ $spacing-md: #{md3-space(md)};
222
+ $spacing-lg: #{md3-space(lg)};
223
+ $spacing-xl: #{md3-space(xl)};
224
+ $spacing-2xl: #{md3-space(2xl)};
225
+ $spacing-3xl: #{md3-space(3xl)};
226
+ $spacing-4xl: #{md3-space(4xl)};
227
+
228
+ //
229
+ // Border radius variables
230
+ $border-radius-sm: #{md3-radius(sm)};
231
+ $border-radius-md: #{md3-radius(md)};
232
+ $border-radius-lg: #{md3-radius(lg)};
233
+ $border-radius-xl: #{md3-radius(xl)};
234
+ $border-radius-2xl: #{md3-radius(2xl)};
235
+ $border-radius-3xl: #{md3-radius(3xl)};
236
+ $border-radius-4xl: #{md3-radius(4xl)};
237
+ $border-radius-full: #{md3-radius(full)};
238
+
239
+ //
240
+ // Z-index variables
241
+ $z-dropdown: 1000;
242
+ $z-sticky: 1020;
243
+ $z-fixed: 1030;
244
+ $z-modal-backdrop: 1040;
245
+ $z-modal: 1050;
246
+ $z-popover: 1060;
247
+ $z-tooltip: 1070;
248
+
249
+ //
250
+ // Breakpoint variables
251
+ $breakpoint-sm: map.get($md3-breakpoints, sm);
252
+ $breakpoint-md: map.get($md3-breakpoints, md);
253
+ $breakpoint-lg: map.get($md3-breakpoints, lg);
254
+ $breakpoint-xl: map.get($md3-breakpoints, xl);
255
+ $breakpoint-2xl: map.get($md3-breakpoints, 2xl);
256
+
257
+ //
258
+ // Container max width
259
+ $container-max-width: min(100%, 110rem);
260
+
261
+ //
262
+ // Backdrop blur variables
263
+ $backdrop-blur-sm: blur(6px);
264
+ $backdrop-blur-md: blur(12px);
265
+ $backdrop-blur-lg: blur(18px);
266
+
267
+ //
268
+ // UI radius variables
269
+ $ui-radius-sm: #{md3-radius(sm)} !default;
270
+ $ui-radius-md: #{md3-radius(md)} !default;
271
+ $ui-radius-lg: #{md3-radius(lg)} !default;
272
+ $ui-radius-xl: #{md3-radius(xl)} !default;
273
+ $ui-radius-2xl: #{md3-radius(2xl)} !default;
274
+ $ui-radius-3xl: #{md3-radius(3xl)} !default;
275
+ $ui-radius-4xl: #{md3-radius(4xl)} !default;
276
+ $ui-radius-full: #{md3-radius(full)} !default;
277
+ $ui-border-width: 1px !default;
278
+
279
+ //
280
+ // UI spacing variables
281
+ $ui-spacing-2xs: #{md3-space(2xs)} !default;
282
+ $ui-spacing-xs: #{md3-space(xs)} !default;
283
+ $ui-spacing-sm: #{md3-space(sm)} !default;
284
+ $ui-spacing-md: #{md3-space(md)} !default;
285
+ $ui-spacing-lg: #{md3-space(lg)} !default;
286
+ $ui-spacing-xl: #{md3-space(xl)} !default;
287
+ $ui-spacing-2xl: #{md3-space(2xl)} !default;
288
+ $ui-spacing-3xl: #{md3-space(3xl)} !default;
289
+ $ui-spacing-4xl: #{md3-space(4xl)} !default;
290
+
291
+ //
292
+ // UI titlebar height
293
+ $ui-titlebar-height: 32px !default;
294
+ $ui-font-title-size: #{md3-type("title-small", size)} !default;
295
+ $ui-font-subtitle-size: #{md3-type("label-large", size)} !default;
296
+
297
+ //
298
+ // Mobile width
299
+ $mobile-width: 9in;
300
+
301
+ //
302
+ // Is touch
303
+ $is-touch: "screen and (hover: none) and (pointer: coarse)";
304
+ $is-not-wide: "(width < #{$mobile-width})";
305
+ $is-desktop: "(width >= #{$mobile-width})";
306
+ $is-deskinset-block-start: "(((hover: hover) or (pointer: fine)) and ((width >= #{$mobile-width}) or (orientation: landscape)))";
307
+ $is-mobile: "not #{$is-desktop}";
308
+ $is-windowed: "@container u2-windowed #{$is-not-wide}";
309
+
310
+
311
+ //
312
+ // Space function
313
+ @function md3-space($token) {
314
+ @return _.md3-fetch($md3-space-scale, $token, "space token");
315
+ }
316
+
317
+ //
318
+ // Radius function
319
+ @function md3-radius($token) {
320
+ @if map.has-key($md3-radius-scale, $token) {
321
+ @return map.get($md3-radius-scale, $token);
322
+ }
323
+
324
+ @if map.has-key($md3-radius-aliases, $token) {
325
+ $alias: map.get($md3-radius-aliases, $token);
326
+ @return map.get($md3-radius-scale, $alias);
327
+ }
328
+
329
+ @return _.md3-fetch($md3-radius-scale, $token, "radius token");
330
+ }
331
+
332
+ //
333
+ // Gap function
334
+ @function md3-gap($token) { @return md3-space($token); }
335
+
336
+ //
337
+ // Export gap vars mixin
338
+ @mixin md3-export-gap-vars() {
339
+ @each $token, $value in $md3-space-scale {
340
+ --gap-#{$token}: #{$value};
341
+ }
342
+ }
343
+
344
+ //
345
+ // Padding function
346
+ @function md3-padding($token) { @return md3-space($token); }
347
+
348
+ //
349
+ // Export padding vars mixin
350
+ @mixin md3-export-padding-vars() {
351
+ @each $token, $value in $md3-space-scale {
352
+ --padding-#{$token}: #{$value};
353
+ }
354
+ }
355
+
356
+ //
357
+ // Radius function
358
+ @function md3-shape($token) {
359
+ @if map.has-key($md3-shape-scale, $token) {
360
+ @return map.get($md3-shape-scale, $token);
361
+ }
362
+
363
+ @if map.has-key($md3-shape-aliases, $token) {
364
+ $alias: map.get($md3-shape-aliases, $token);
365
+ @return map.get($md3-shape-scale, $alias);
366
+ }
367
+
368
+ @error "Unknown MD3 shape token `#{$token}`. Available: #{map.keys($md3-shape-scale)}";
369
+ }
370
+
371
+ //
372
+ // State function
373
+ @function md3-opacity-state($state) {
374
+ @return _.md3-fetch($md3-state-opacity, $state, "state token");
375
+ }
376
+
377
+ //
378
+ // Icon size function
379
+ @function md3-icon-size($token: md) {
380
+ @return _.md3-fetch($md3-icon-sizes, $token, "icon size");
381
+ }
382
+
383
+ //
384
+ // Avatar size function
385
+ @function md3-avatar-size($token: md) {
386
+ @return _.md3-fetch($md3-avatar-sizes, $token, "avatar size");
387
+ }
388
+
389
+ //
390
+ // Export layout vars mixin
391
+ @mixin md3-export-density-vars() {
392
+ @each $token, $value in $md3-space-scale {
393
+ --space-#{$token}: #{$value};
394
+ --gap-#{$token}: #{$value};
395
+ --padding-#{$token}: #{$value};
396
+ }
397
+
398
+ @each $token, $value in $md3-shape-scale {
399
+ --radius-#{$token}: #{$value};
400
+ }
401
+ }
402
+
403
+
404
+
405
+ @mixin md3-export-scale-vars() {
406
+ --u: 1rem;
407
+ --pxu: 1px;
408
+ --cqi: 1cqi;
409
+ --cqb: 1cqb;
410
+
411
+ --size-scale: 1;
412
+ --font-scale: 1;
413
+
414
+ --container-max-width: min(100%, 110rem);
415
+ --container-padding: clamp(1rem, 3vw, 2rem);
416
+
417
+ @each $name, $value in $md3-breakpoints {
418
+ --breakpoint-#{$name}: #{$value};
419
+ }
420
+
421
+ @container (inline-size < $md3-container-compact-max) {
422
+ --size-scale: 0.92;
423
+ --font-scale: 0.96;
424
+ }
425
+
426
+ @container ($md3-container-compact-max <= inline-size < $md3-container-cozy-max) {
427
+ --size-scale: 1;
428
+ --font-scale: 1;
429
+ }
430
+
431
+ @container (inline-size >= $md3-container-cozy-max) {
432
+ --size-scale: 1.05;
433
+ --font-scale: 1.04;
434
+ }
435
+
436
+ --sidebar-width: min(clamp(16.25rem, 28vw, 22.5rem), 100cqi);
437
+ --sidebar-width-collapsed: min(clamp(10rem, 20vw, 12.5rem), 100cqi);
438
+ --sidebar-width-mobile: min(clamp(17.5rem, 35vw, 20rem), 100cqi);
439
+ --sidebar-width-mobile-small: min(clamp(18.75rem, 40vw, 21.25rem), 100cqi);
440
+
441
+ @media (max-inline-size: #{map.get($md3-breakpoints, md)}) {
442
+ --sidebar-width: var(--sidebar-width-mobile);
443
+ }
444
+
445
+ @media (max-inline-size: #{map.get($md3-breakpoints, sm)}) {
446
+ --sidebar-width: var(--sidebar-width-mobile-small);
447
+ }
448
+ }
449
+
450
+
451
+
452
+
453
+ //
454
+ // Export layout vars mixin
455
+ @mixin md3-export-layout-vars() {
456
+ // Spacing tokens
457
+ @each $token, $value in $md3-space-scale {
458
+ --space-#{$token}-base: #{$value};
459
+ --space-#{$token}: var(--space-#{$token}-base);
460
+ --gap-#{$token}: var(--space-#{$token});
461
+ --padding-#{$token}: var(--space-#{$token});
462
+ }
463
+
464
+
465
+ //
466
+ @each $alias, $token in $md3-radius-aliases {
467
+ --radius-#{$alias}: var(--radius-#{$token}, #{md3-radius($token)});
468
+ }
469
+
470
+ // Radius tokens
471
+ @each $token, $value in $md3-radius-scale {
472
+ --radius-#{$token}: #{$value};
473
+ }
474
+
475
+ --radius-full: #{md3-radius(full)};
476
+
477
+
478
+ //
479
+ @each $alias, $token in $md3-shape-aliases {
480
+ --shape-#{$alias}: var(--shape-#{$token}, #{md3-shape($token)});
481
+ }
482
+
483
+ // Shape tokens
484
+ @each $token, $value in $md3-shape-scale {
485
+ --shape-#{$token}: #{$value};
486
+ }
487
+
488
+
489
+
490
+ // Icon & avatar sizes
491
+ --icon-size-xs: #{md3-icon-size(xs)};
492
+ --icon-size-sm: #{md3-icon-size(sm)};
493
+ --icon-size-md: #{md3-icon-size(md)};
494
+ --icon-size-lg: #{md3-icon-size(lg)};
495
+ --icon-size-xl: #{md3-icon-size(xl)};
496
+ --icon-size-2xl: #{md3-icon-size(2xl)};
497
+
498
+ --avatar-size-sm: #{md3-avatar-size(sm)};
499
+ --avatar-size: #{md3-avatar-size(md)};
500
+ --avatar-size-lg: #{md3-avatar-size(lg)};
501
+
502
+ // Typography scale
503
+ --text-xs: clamp(calc(0.7rem * var(--font-scale)), 0.3cqi + 0.6rem, calc(0.75rem * var(--font-scale)));
504
+ --text-sm: clamp(calc(0.75rem * var(--font-scale)), 0.4cqi + 0.65rem, calc(0.85rem * var(--font-scale)));
505
+ --text-base: clamp(calc(0.8rem * var(--font-scale)), 0.5cqi + 0.7rem, calc(0.95rem * var(--font-scale)));
506
+ --text-lg: clamp(calc(0.9rem * var(--font-scale)), 0.6cqi + 0.8rem, calc(1.1rem * var(--font-scale)));
507
+ --text-xl: clamp(calc(1rem * var(--font-scale)), 0.8cqi + 0.9rem, calc(1.3rem * var(--font-scale)));
508
+
509
+ // Motion tokens
510
+ --transition-fast: 140ms ease;
511
+ --transition-normal: 160ms ease;
512
+ --transition-slow: 200ms ease;
513
+
514
+ --text-opacity-disabled: #{md3-state(disabled)};
515
+ }
516
+
517
+
518
+ //
519
+ // Spacing variables
520
+ $spacing-xs: #{md3-space(xs)};
521
+ $spacing-sm: #{md3-space(sm)};
522
+ $spacing-md: #{md3-space(md)};
523
+ $spacing-lg: #{md3-space(lg)};
524
+ $spacing-xl: #{md3-space(xl)};
525
+ $spacing-2xl: #{md3-space(2xl)};
526
+ $spacing-3xl: #{md3-space(3xl)};
527
+ $spacing-4xl: #{md3-space(4xl)};
528
+
529
+ //
530
+ // Border radius variables
531
+ $border-radius-sm: #{md3-radius(sm)};
532
+ $border-radius-md: #{md3-radius(md)};
533
+ $border-radius-lg: #{md3-radius(lg)};
534
+ $border-radius-xl: #{md3-radius(xl)};
535
+ $border-radius-2xl: #{md3-radius(2xl)};
536
+ $border-radius-3xl: #{md3-radius(3xl)};
537
+ $border-radius-4xl: #{md3-radius(4xl)};
538
+ $border-radius-full: #{md3-radius(full)};
539
+
540
+ //
541
+ // Z-index variables
542
+ $z-dropdown: 1000;
543
+ $z-sticky: 1020;
544
+ $z-fixed: 1030;
545
+ $z-modal-backdrop: 1040;
546
+ $z-modal: 1050;
547
+ $z-popover: 1060;
548
+ $z-tooltip: 1070;
549
+
550
+ //
551
+ // Breakpoint variables
552
+ $breakpoint-sm: map.get($md3-breakpoints, sm);
553
+ $breakpoint-md: map.get($md3-breakpoints, md);
554
+ $breakpoint-lg: map.get($md3-breakpoints, lg);
555
+ $breakpoint-xl: map.get($md3-breakpoints, xl);
556
+ $breakpoint-2xl: map.get($md3-breakpoints, 2xl);
557
+
558
+ //
559
+ // Container max width
560
+ $container-max-width: min(100%, 110rem);
561
+
562
+ //
563
+ // Backdrop blur variables
564
+ $backdrop-blur-sm: blur(6px);
565
+ $backdrop-blur-md: blur(12px);
566
+ $backdrop-blur-lg: blur(18px);
567
+
568
+ //
569
+ // UI radius variables
570
+ $ui-radius-sm: #{md3-radius(sm)} !default;
571
+ $ui-radius-md: #{md3-radius(md)} !default;
572
+ $ui-radius-lg: #{md3-radius(lg)} !default;
573
+ $ui-radius-xl: #{md3-radius(xl)} !default;
574
+ $ui-radius-2xl: #{md3-radius(2xl)} !default;
575
+ $ui-radius-3xl: #{md3-radius(3xl)} !default;
576
+ $ui-radius-4xl: #{md3-radius(4xl)} !default;
577
+ $ui-radius-full: #{md3-radius(full)} !default;
578
+ $ui-border-width: 1px !default;
579
+
580
+ //
581
+ // UI spacing variables
582
+ $ui-spacing-2xs: #{md3-space(2xs)} !default;
583
+ $ui-spacing-xs: #{md3-space(xs)} !default;
584
+ $ui-spacing-sm: #{md3-space(sm)} !default;
585
+ $ui-spacing-md: #{md3-space(md)} !default;
586
+ $ui-spacing-lg: #{md3-space(lg)} !default;
587
+ $ui-spacing-xl: #{md3-space(xl)} !default;
588
+ $ui-spacing-2xl: #{md3-space(2xl)} !default;
589
+ $ui-spacing-3xl: #{md3-space(3xl)} !default;
590
+ $ui-spacing-4xl: #{md3-space(4xl)} !default;
591
+
592
+ //
593
+ // UI titlebar height
594
+ $ui-titlebar-height: 32px !default;
595
+ $ui-font-title-size: #{md3-type("title-small", size)} !default;
596
+ $ui-font-subtitle-size: #{md3-type("label-large", size)} !default;
@@ -0,0 +1,114 @@
1
+ @use "sass:list";
2
+ @use "sass:map";
3
+ @use "sass:math";
4
+ @use "sass:meta";
5
+ @use "sass:string";
6
+
7
+ //
8
+ @function option-or($options, $key, $fallback) {
9
+ $value: map.get($options, $key);
10
+ @return if(sass($value == null): $fallback; else: $value);
11
+ }
12
+
13
+ //
14
+ // Fetch function
15
+ @function md3-fetch($source, $token, $label: "token") {
16
+ @if map.has-key($source, $token) {
17
+ @return map.get($source, $token);
18
+ }
19
+
20
+ @error "Unknown #{$label} `#{$token}`. Available: #{map.keys($source)}";
21
+ }
22
+
23
+ //
24
+ @mixin when-hover($selector: "&") {
25
+ @media (hover: hover) and (pointer: fine) { #{$selector}:hover { @content; } }
26
+ @media (hover: none) and (pointer: coarse) { #{$selector}:active { @content; } }
27
+ }
28
+
29
+ //
30
+ @mixin when-active($selector: "&") {
31
+ @media (hover: hover) and (pointer: fine) { #{$selector}:active { @content; } }
32
+ }
33
+
34
+ //
35
+ @mixin when-focus($selector: "&") {
36
+ @media (hover: hover) and (pointer: fine) { #{$selector}:focus-visible { @content; } }
37
+ @media (hover: none) and (pointer: coarse) { #{$selector}:focus { @content; } }
38
+ }
39
+
40
+ //
41
+ @mixin when-focus-visible($selector: "&") {
42
+ @media (hover: hover) and (pointer: fine) { #{$selector}:focus-visible { @content; } }
43
+ @media (hover: none) and (pointer: coarse) { #{$selector}:focus-visible { @content; } }
44
+ }
45
+
46
+ //
47
+ @mixin when-disabled($selector: "&") {
48
+ @media (hover: hover) and (pointer: fine) { #{$selector}:disabled, #{$selector}[aria-disabled="true"] { @content; } }
49
+ @media (hover: none) and (pointer: coarse) { #{$selector}:disabled, #{$selector}[aria-disabled="true"] { @content; } }
50
+ }
51
+
52
+ //
53
+ @mixin when-selected($selector: "&") {
54
+ @media (hover: hover) and (pointer: fine) { #{$selector}::selection, #{$selector}:checked, #{$selector}[aria-selected="true"] { @content; } }
55
+ @media (hover: none) and (pointer: coarse) { #{$selector}::selection, #{$selector}:checked, #{$selector}[aria-selected="true"] { @content; } }
56
+ }
57
+
58
+ //
59
+ @mixin when-autofill($selector: "&") {
60
+ #{$selector}:-webkit-autofill { @content; }
61
+ #{$selector}:autofill { @content; }
62
+ #{$selector}:auto-fill { @content; }
63
+ }
64
+
65
+ // State layer mixin
66
+ @mixin md3-state-layer($role: primary, $state: hover, $selector: "&::after") {
67
+ $opacity: md3-opacity-state($state);
68
+ $role-var: md3-var($role);
69
+ $weight: calc(100% * #{$opacity});//math.percentage($opacity);
70
+
71
+ @if $selector == "&::after" or $selector == "&::before" {
72
+ position: relative;
73
+ overflow: hidden;
74
+ }
75
+
76
+ #{$selector} {
77
+ content: "";
78
+ position: absolute;
79
+ inset: 0;
80
+ background-color: color-mix(in oklch, var(#{$role-var}) #{$weight}, transparent);
81
+ opacity: 0;
82
+ pointer-events: none;
83
+ transition: opacity var(--duration-fast) var(--ease-out);
84
+ }
85
+
86
+ @include when-hover {
87
+ #{$selector} { opacity: $opacity; }
88
+ }
89
+
90
+ @include when-active {
91
+ #{$selector} { opacity: $opacity; }
92
+ }
93
+
94
+ @include when-focus {
95
+ #{$selector} { opacity: $opacity; }
96
+ }
97
+
98
+ @include when-focus-visible {
99
+ #{$selector} { opacity: $opacity; }
100
+ }
101
+
102
+ @include when-disabled {
103
+ #{$selector} { opacity: $opacity; }
104
+ }
105
+
106
+ @include when-selected {
107
+ #{$selector} { opacity: $opacity; }
108
+ }
109
+ }
110
+
111
+ @mixin hover($selector: "&") {
112
+ @include when-hover { #{$selector}:hover { @content; } }
113
+ @include when-active { #{$selector}:active { @content; } }
114
+ }