@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,359 @@
1
+ @use "utils" as _;
2
+
3
+ @use "sass:map";
4
+ @use "sass:string";
5
+
6
+ //
7
+ // Elevation levels
8
+ $md3-elevation-levels: (
9
+ 0: (),
10
+ 1: (
11
+ 0 1px 2px color-mix(in oklab, var(--md-shadow, #000) 18%, transparent),
12
+ 0 1px 3px 1px color-mix(in oklab, var(--md-shadow, #000) 14%, transparent),
13
+ ),
14
+ 2: (
15
+ 0 1px 2px color-mix(in oklab, var(--md-shadow, #000) 20%, transparent),
16
+ 0 2px 6px 2px color-mix(in oklab, var(--md-shadow, #000) 16%, transparent),
17
+ ),
18
+ 3: (
19
+ 0 2px 3px color-mix(in oklab, var(--md-shadow, #000) 22%, transparent),
20
+ 0 4px 8px 3px color-mix(in oklab, var(--md-shadow, #000) 18%, transparent),
21
+ ),
22
+ 4: (
23
+ 0 3px 4px color-mix(in oklab, var(--md-shadow, #000) 24%, transparent),
24
+ 0 6px 12px 4px color-mix(in oklab, var(--md-shadow, #000) 18%, transparent),
25
+ ),
26
+ 5: (
27
+ 0 5px 5px color-mix(in oklab, var(--md-shadow, #000) 26%, transparent),
28
+ 0 8px 16px 6px color-mix(in oklab, var(--md-shadow, #000) 22%, transparent),
29
+ ),
30
+ );
31
+
32
+ //
33
+ // Shadow to string function
34
+ @function _shadow-to-string($layers) {
35
+ $result: "";
36
+
37
+ @each $layer in $layers {
38
+ $result: sass(if(sass($result == ""): "#{$layer}"; else: "#{$result}, #{$layer}"));
39
+ }
40
+
41
+ @return sass(if(sass($result == ""): none; else: string.unquote($result)));
42
+ }
43
+
44
+ //
45
+ // Elevation function
46
+ @function md3-elevation($level: 0) {
47
+ @if not map.has-key($md3-elevation-levels, $level) {
48
+ @error "Unknown elevation level `#{$level}`. Available: #{map.keys($md3-elevation-levels)}";
49
+ }
50
+
51
+ $layers: map.get($md3-elevation-levels, $level);
52
+ @return _shadow-to-string($layers);
53
+ }
54
+
55
+ //
56
+ // Shadow registries & defaults
57
+ $md3-shadow-aliases: (
58
+ xs: (level: 0),
59
+ sm: (level: 1),
60
+ md: (level: 2),
61
+ lg: (level: 3),
62
+ xl: (level: 4),
63
+ "2xl": (level: 5),
64
+ ) !default;
65
+
66
+ $md3-shadow-static-props: (
67
+ inset: inset 0 1px 0 color-mix(
68
+ in oklab,
69
+ var(
70
+ --md-shadow,
71
+ var(--current, var(--color-on-surface, var(--md-on-surface, #1c1b1f)))
72
+ ) 12%,
73
+ transparent
74
+ ),
75
+ inset-strong: inset 0 2px 6px color-mix(in oklab, var(--md-shadow, #000) 18%, transparent),
76
+ ) !default;
77
+
78
+ $md3-shadow-glow-map: (
79
+ primary: 0 0 0 1px color-mix(in oklch, #{md3-color(primary)} 24%, transparent),
80
+ secondary: 0 0 0 1px color-mix(in oklch, #{md3-color(secondary)} 24%, transparent),
81
+ accent: 0 0 0 1px color-mix(in oklch, #{md3-color(tertiary)} 28%, transparent),
82
+ ) !default;
83
+
84
+ $dynamic-shadow-defaults: (
85
+ parallax-ref: 600px,
86
+ parallax-k: 0.01,
87
+ az-base: 225deg,
88
+ az-span: 12deg,
89
+ alt-base: 55deg,
90
+ alt-span: 6deg,
91
+ soft-ang: 18deg,
92
+ umbra-density: 0.32,
93
+ penumbra-density: 0.18,
94
+ z-offset: 2,
95
+ elevation-scale: 2,
96
+ important: false,
97
+ ) !default;
98
+
99
+ //
100
+ // Shadow helpers
101
+ @function _shadow-remove-prefix($value, $prefix) {
102
+ $normalized-value: string.to-lower-case(string.unquote("#{$value}"));
103
+ $normalized-prefix: string.to-lower-case($prefix);
104
+ $prefix-length: string.length($normalized-prefix);
105
+
106
+ @if $prefix-length > 0 and string.slice($normalized-value, 1, $prefix-length) == $normalized-prefix {
107
+ @return string.slice($normalized-value, $prefix-length + 1);
108
+ }
109
+
110
+ @return $normalized-value;
111
+ }
112
+
113
+ @function _shadow-token-key($token) {
114
+ $key: string.to-lower-case(string.unquote("#{$token}"));
115
+ $key: _shadow-remove-prefix($key, "--");
116
+ $key: _shadow-remove-prefix($key, "shadow-");
117
+ @return $key;
118
+ }
119
+
120
+ @function md3-shadow-fallback($token, $default: null) {
121
+ $key: _shadow-token-key($token);
122
+
123
+ @if map.has-key($md3-shadow-aliases, $key) {
124
+ $entry: map.get($md3-shadow-aliases, $key);
125
+
126
+ @if map.has-key($entry, fallback) {
127
+ $fallback: map.get($entry, fallback);
128
+
129
+ @if $fallback != null {
130
+ @return $fallback;
131
+ }
132
+ }
133
+
134
+ @if map.has-key($entry, level) {
135
+ @return md3-elevation(map.get($entry, level));
136
+ }
137
+
138
+ @if map.has-key($entry, value) {
139
+ @return map.get($entry, value);
140
+ }
141
+ }
142
+
143
+ @if map.has-key($md3-shadow-static-props, $key) {
144
+ @return map.get($md3-shadow-static-props, $key);
145
+ }
146
+
147
+ $glow-key: _shadow-remove-prefix($key, "glow-");
148
+
149
+ @if $glow-key != $key and map.has-key($md3-shadow-glow-map, $glow-key) {
150
+ @return map.get($md3-shadow-glow-map, $glow-key);
151
+ }
152
+
153
+ @if map.has-key($md3-shadow-glow-map, $key) {
154
+ @return map.get($md3-shadow-glow-map, $key);
155
+ }
156
+
157
+ @if type-of($token) == number {
158
+ @return md3-elevation($token);
159
+ }
160
+
161
+ @if $default != null {
162
+ @return $default;
163
+ }
164
+
165
+ @return null;
166
+ }
167
+
168
+ @function md3-shadow($token, $fallback: null) {
169
+ $key: _shadow-token-key($token);
170
+
171
+ @if map.has-key($md3-shadow-aliases, $key) {
172
+ $entry: map.get($md3-shadow-aliases, $key);
173
+
174
+ @if map.has-key($entry, value) and map.get($entry, value) != null {
175
+ @return map.get($entry, value);
176
+ }
177
+
178
+ @if map.has-key($entry, level) {
179
+ @return md3-elevation(map.get($entry, level));
180
+ }
181
+ }
182
+
183
+ @if map.has-key($md3-shadow-static-props, $key) {
184
+ @return map.get($md3-shadow-static-props, $key);
185
+ }
186
+
187
+ $glow-key: _shadow-remove-prefix($key, "glow-");
188
+
189
+ @if $glow-key != $key and map.has-key($md3-shadow-glow-map, $glow-key) {
190
+ @return map.get($md3-shadow-glow-map, $glow-key);
191
+ }
192
+
193
+ @if map.has-key($md3-shadow-glow-map, $key) {
194
+ @return map.get($md3-shadow-glow-map, $key);
195
+ }
196
+
197
+ @if type-of($token) == number {
198
+ @return md3-elevation($token);
199
+ }
200
+
201
+ @if $fallback != null {
202
+ @return $fallback;
203
+ }
204
+
205
+ @error "Unknown shadow token `#{$token}`. Available aliases: #{map.keys($md3-shadow-aliases)}; statics: #{map.keys($md3-shadow-static-props)}; glows: #{map.keys($md3-shadow-glow-map)}";
206
+ }
207
+
208
+ @function md3-shadow-var($token, $fallback: null) {
209
+ $key: _shadow-token-key($token);
210
+ $fallback-value: sass(if(sass($fallback == null): md3-shadow-fallback($token); else: $fallback));
211
+
212
+ @if $fallback-value == null {
213
+ $fallback-value: md3-shadow($token);
214
+ }
215
+
216
+ @return string.unquote("var(--shadow-#{$key}, #{$fallback-value})");
217
+ }
218
+
219
+ @function _shadow-config($overrides) {
220
+ $overrides-map: sass(if(sass(type-of($overrides) == "map"): $overrides; else: ()));
221
+ @return map.merge($dynamic-shadow-defaults, $overrides-map);
222
+ }
223
+
224
+ @function _shadow-config-var($config, $name) {
225
+ $value: map.get($config, $name);
226
+
227
+ @if $value == null {
228
+ @return string.unquote("var(--#{$name})");
229
+ }
230
+
231
+ @return string.unquote("var(--#{$name}, #{$value})");
232
+ }
233
+
234
+ //
235
+ // Export elevation vars mixin
236
+ @mixin md3-export-elevation-vars(
237
+ $aliases: $md3-shadow-aliases,
238
+ $static-props: $md3-shadow-static-props,
239
+ $glows: $md3-shadow-glow-map
240
+ ) {
241
+ @each $level, $layers in $md3-elevation-levels {
242
+ --md-elevation-#{$level}: #{_shadow-to-string($layers)};
243
+ }
244
+
245
+ @each $alias, $entry in $aliases {
246
+ $value: null;
247
+
248
+ @if map.has-key($entry, value) {
249
+ $value: map.get($entry, value);
250
+ }
251
+
252
+ @if $value == null and map.has-key($entry, level) {
253
+ $fallback: md3-shadow-fallback($alias);
254
+ $value: string.unquote("var(--md-elevation-#{map.get($entry, level)}, #{$fallback})");
255
+ }
256
+
257
+ @if $value != null {
258
+ --shadow-#{$alias}: #{$value};
259
+ }
260
+ }
261
+
262
+ @each $name, $value in $static-props {
263
+ --shadow-#{$name}: #{$value};
264
+ }
265
+
266
+ @if $glows != null {
267
+ @each $name, $value in $glows {
268
+ --shadow-glow-#{$name}: #{$value};
269
+ }
270
+ }
271
+ }
272
+
273
+ //
274
+ // Shadow application mixins
275
+ @mixin md3-shadow-apply($token, $property: box-shadow, $important: false) {
276
+ $value: md3-shadow-var($token);
277
+
278
+ #{$property}: #{$value}#{sass(if(sass($important): " !important"; else: ""))};
279
+ }
280
+
281
+ @mixin md3-shadow-layer($token) {
282
+ @include md3-shadow-apply($token);
283
+ }
284
+
285
+ //
286
+ // Shadow variables
287
+ $shadow-xs: md3-shadow(xs);
288
+ $shadow-sm: md3-shadow(sm);
289
+ $shadow-md: md3-shadow(md);
290
+ $shadow-lg: md3-shadow(lg);
291
+ $shadow-xl: md3-shadow(xl);
292
+ $shadow-2xl: md3-shadow("2xl");
293
+
294
+ //
295
+ // Shadow glow variables
296
+ $shadow-glow-primary: md3-shadow(glow-primary);
297
+ $shadow-glow-secondary: md3-shadow(glow-secondary);
298
+ $shadow-glow-accent: md3-shadow(glow-accent);
299
+
300
+ //
301
+ // UI shadow variables
302
+ $ui-shadow-soft: md3-shadow(md) !default;
303
+ $ui-shadow-elevated: md3-shadow(lg) !default;
304
+
305
+ //
306
+ // Dynamic drop-shadow mixin
307
+ @mixin dynamic-shadow-drop($overrides: ()) {
308
+ $config: _shadow-config($overrides);
309
+
310
+ $parallax-ref: _shadow-config-var($config, parallax-ref);
311
+ $parallax-k: _shadow-config-var($config, parallax-k);
312
+ $az-base: _shadow-config-var($config, az-base);
313
+ $az-span: _shadow-config-var($config, az-span);
314
+ $alt-base: _shadow-config-var($config, alt-base);
315
+ $alt-span: _shadow-config-var($config, alt-span);
316
+ $soft-ang: _shadow-config-var($config, soft-ang);
317
+ $umbra-density: _shadow-config-var($config, umbra-density);
318
+ $penumbra-density: _shadow-config-var($config, penumbra-density);
319
+ $z-offset: map.get($config, z-offset);
320
+ $elevation-scale: map.get($config, elevation-scale);
321
+ $important-flag: map.get($config, important);
322
+
323
+ --relate-x: calc(var(--drag-x, 0) + var(--shift-x, 0) - (100cqi / 2));
324
+ --relate-y: calc(var(--drag-y, 0) + var(--shift-y, 0) - (100cqb / 2));
325
+
326
+ --relNX: calc(clamp(-1, (var(--relate-x, 0) / #{$parallax-ref}), 1));
327
+ --relNY: calc(clamp(-1, (var(--relate-y, 0) / #{$parallax-ref}), 1));
328
+
329
+ --light-az: calc(#{$az-base} + var(--relNX) * #{$az-span});
330
+ --light-alt: calc(#{$alt-base} + var(--relNY) * #{$alt-span});
331
+
332
+ --elev: calc((var(--z-index, 0) + #{$z-offset}) * #{$elevation-scale});
333
+
334
+ --cotA: calc(1 / max(0.001, tan(var(--light-alt))));
335
+ --L: calc(abs(var(--elev)) * var(--cotA));
336
+
337
+ --dx: calc(cos(var(--light-az)) * var(--L) * sign(var(--elev)));
338
+ --dy: calc(sin(var(--light-az)) * var(--L) * sign(var(--elev)));
339
+
340
+ --sx: calc((var(--dx) + var(--relate-x) * #{$parallax-k}) * 1px);
341
+ --sy: calc((var(--dy) + var(--relate-y) * #{$parallax-k}) * 1px);
342
+
343
+ --blurC: calc(max(0.5, abs(var(--elev)) * tan(#{$soft-ang})));
344
+ --blurU: calc(var(--blurC) * 1.6);
345
+ --blurP: calc(var(--blurC) * 2.8);
346
+
347
+ --spreadC: calc(abs(var(--elev)) * 0.04);
348
+ --spreadU: calc(abs(var(--elev)) * 0.10);
349
+ --spreadP: calc(var(--spreadU) * 1.2);
350
+
351
+ --alphaC: calc(clamp(0.08, (#{$umbra-density} * 0.9) / (1 + abs(var(--elev)) * 0.30), 0.40));
352
+ --alphaU: calc(clamp(0.06, #{$umbra-density} / sqrt(1 + abs(var(--elev)) * 0.15), 0.35));
353
+ --alphaP: calc(clamp(0.04, #{$penumbra-density} / sqrt(1 + abs(var(--elev)) * 0.08), 0.25));
354
+
355
+ filter:
356
+ drop-shadow(calc(var(--sx) * 0.15) calc(var(--sy) * 0.15) calc(var(--blurC) * 1px) #{"rgb(0 0 0 / var(--alphaC))"})
357
+ drop-shadow(var(--sx) var(--sy) calc(var(--blurU) * 1px) #{"rgb(0 0 0 / var(--alphaU))"})
358
+ drop-shadow(var(--sx) var(--sy) calc(var(--blurP) * 1px) #{"rgb(0 0 0 / var(--alphaP))"})#{sass(if(sass($important-flag): " !important"; else: ""))};
359
+ }
@@ -0,0 +1,76 @@
1
+ @use "./layout" as layout;
2
+ @use "./colorize" as colorize;
3
+
4
+ //
5
+ @mixin card-base() {
6
+ display: grid;
7
+ gap: var(--card-gap);
8
+ padding: var(--card-padding);
9
+ border-radius: var(--card-radius);
10
+ transition: var(--transition-colors), var(--transition-transform);
11
+ }
12
+
13
+ //
14
+ @mixin surface-base() {
15
+ display: grid;
16
+ gap: var(--surface-gap);
17
+ padding: var(--surface-padding);
18
+ border-radius: var(--surface-radius);
19
+ border: var(--surface-border);
20
+ }
21
+
22
+ //
23
+ @mixin panel-base {
24
+ display: grid;
25
+ gap: var(--gap-md);
26
+ padding: var(--padding-xl);
27
+ border-radius: var(--radius-lg);
28
+ border: 1px solid;
29
+ }
30
+
31
+ //
32
+ @mixin panel-header {
33
+ background-color: var(--panel-background);
34
+ color: var(--panel-text-color);
35
+ padding: var(--panel-padding);
36
+ border-radius: var(--panel-radius);
37
+ border: var(--panel-border);
38
+ }
39
+
40
+ //
41
+ @mixin accordion-base {
42
+ border-radius: var(--accordion-radius);
43
+ overflow: hidden;
44
+ transition: var(--accordion-transition);
45
+
46
+ &[open] {
47
+ --color-shade: var(--accordion-open-color-shade);
48
+ border: var(--accordion-open-border);
49
+ }
50
+ }
51
+
52
+ //
53
+ @mixin empty-state {
54
+ padding: var(--empty-state-padding);
55
+ border-radius: var(--empty-state-radius);
56
+ border: var(--empty-state-border);
57
+ text-align: center;
58
+ min-block-size: var(--empty-state-min-block-size);
59
+
60
+ @include layout.grid-center;
61
+ }
62
+
63
+ //
64
+ @mixin nav-item {
65
+ padding: var(--nav-padding);
66
+ border-radius: var(--nav-radius);
67
+ text-decoration: none;
68
+ gap: var(--nav-gap);
69
+
70
+ @include layout.flex-between;
71
+
72
+ ui-icon {
73
+ --icon-size: var(--icon-size-md);
74
+ --icon-color: currentColor;
75
+ }
76
+ }
@@ -0,0 +1,124 @@
1
+ @layer ux-animation {
2
+
3
+ // Keyframe definitions
4
+ @keyframes fade-in {
5
+ from {
6
+ opacity: 0;
7
+ }
8
+
9
+ to {
10
+ opacity: 1;
11
+ }
12
+ }
13
+
14
+ @keyframes slide-up {
15
+ from {
16
+ opacity: 0;
17
+ transform: translateY(1rem);
18
+ }
19
+
20
+ to {
21
+ opacity: 1;
22
+ transform: translateY(0);
23
+ }
24
+ }
25
+
26
+ @keyframes scale-in {
27
+ from {
28
+ opacity: 0;
29
+ transform: scale(0.95);
30
+ }
31
+
32
+ to {
33
+ opacity: 1;
34
+ transform: scale(1);
35
+ }
36
+ }
37
+
38
+
39
+ @keyframes validationPulse {
40
+ 0% {
41
+ transform: scale(1);
42
+ }
43
+ 50% {
44
+ transform: scale(1.01);
45
+ }
46
+ 100% {
47
+ transform: scale(1);
48
+ }
49
+ }
50
+
51
+ /* animations */
52
+ @keyframes lift {
53
+ from { --elev: 6; }
54
+ to { --elev: 32; }
55
+ }
56
+
57
+ /* */
58
+ @keyframes daylight {
59
+ 0% { --light-az: 210deg; --light-alt: 30deg; }
60
+ 50% { --light-az: 270deg; --light-alt: 70deg; }
61
+ 100% { --light-az: 330deg; --light-alt: 30deg; }
62
+ }
63
+
64
+ // Keyframe definitions
65
+ @keyframes fade-in {
66
+ from {
67
+ opacity: 0;
68
+ }
69
+
70
+ to {
71
+ opacity: 1;
72
+ }
73
+ }
74
+
75
+ @keyframes slide-up {
76
+ from {
77
+ opacity: 0;
78
+ transform: translateY(1rem);
79
+ }
80
+
81
+ to {
82
+ opacity: 1;
83
+ transform: translateY(0);
84
+ }
85
+ }
86
+
87
+ @keyframes scale-in {
88
+ from {
89
+ opacity: 0;
90
+ transform: scale(0.95);
91
+ }
92
+
93
+ to {
94
+ opacity: 1;
95
+ transform: scale(1);
96
+ }
97
+ }
98
+
99
+
100
+ @keyframes validationPulse {
101
+ 0% {
102
+ transform: scale(1);
103
+ }
104
+ 50% {
105
+ transform: scale(1.01);
106
+ }
107
+ 100% {
108
+ transform: scale(1);
109
+ }
110
+ }
111
+
112
+ /* animations */
113
+ @keyframes lift {
114
+ from { --elev: 6; }
115
+ to { --elev: 32; }
116
+ }
117
+
118
+ /* */
119
+ @keyframes daylight {
120
+ 0% { --light-az: 210deg; --light-alt: 30deg; }
121
+ 50% { --light-az: 270deg; --light-alt: 70deg; }
122
+ 100% { --light-az: 330deg; --light-alt: 30deg; }
123
+ }
124
+ }
@@ -0,0 +1,50 @@
1
+ /* подключайте этот блок к любому «поднятому» элементу */
2
+ .elev, ui-window-frame, .shadow-wrap, .ui-frame {
3
+ filter: drop-shadow(0px 0px calc(max(0.125 + var(--z-index, 0) * 0.125, 0) * 1rem) #00000040);
4
+ }
5
+
6
+ /* scene */
7
+ .scene, :root {
8
+ /* куда «смотрит» свет: -x,-y, +z — пример «сверху-слева» */
9
+ --lx: -0.01;
10
+ --ly: -0.01;
11
+ --lz: 8;
12
+
13
+ /* базовые углы из вектора */
14
+ --az-base: calc(atan2(var(--ly), var(--lx)));
15
+ --alt-base: calc(atan2(var(--lz), hypot(var(--lx), var(--ly))));
16
+
17
+ /* азимут и высота из вектора */
18
+ --light-az: calc(atan2(var(--ly), var(--lx))); /* направление в плоскости XY */
19
+ --light-alt: calc(atan2(var(--lz), hypot(var(--lx), var(--ly))));
20
+
21
+ /* угловой размер источника (мягкость) */
22
+ --soft-ang: 12deg;
23
+
24
+ /* плотности для разных слоёв тени */
25
+ --umbra-density: 0.32; /* основная тень */
26
+ --penumbra-density: 0.18; /* полутень */
27
+ }
28
+
29
+ /* animations */
30
+ .pulsing { animation: lift 1.6s ease-in-out infinite alternate; }
31
+ .scene.sun-move { animation: daylight 8s linear infinite; }
32
+
33
+ /*
34
+ .elev-drop {
35
+ --elev: 12px;
36
+ --cotA: calc(1 / max(0.001, tan(var(--light-alt))));
37
+ --L: calc(abs(var(--elev)) * var(--cotA));
38
+ --dx: calc(cos(var(--light-az)) * var(--L) * sign(var(--elev)));
39
+ --dy: calc(sin(var(--light-az)) * var(--L) * sign(var(--elev)));
40
+
41
+ --b1: calc(max(0.5px, abs(var(--elev)) * tan(var(--soft-ang)) * 0.8));
42
+ --b2: calc(var(--b1) * 2.0);
43
+ --b3: calc(var(--b1) * 3.2);
44
+
45
+ filter:
46
+ drop-shadow(calc(var(--dx) * 0.15) calc(var(--dy) * 0.15) var(--b1) rgb(0 0 0 / 0.20))
47
+ drop-shadow(var(--dx) var(--dy) var(--b2) rgb(0 0 0 / 0.12))
48
+ drop-shadow(var(--dx) var(--dy) var(--b3) rgb(0 0 0 / 0.07));
49
+ }
50
+ */