@fest-lib/veela 0.1.20 → 1.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.
Files changed (141) hide show
  1. package/dist/veela.js +4 -33
  2. package/package.json +9 -2
  3. package/src/scss/_layers.scss +5 -34
  4. package/src/scss/basic/{misc/_core-layout.scss → _core-layout.scss} +1 -1
  5. package/src/scss/basic/_layers.scss +1 -0
  6. package/src/scss/basic/{misc/_layout.scss → _layout.scss} +15 -15
  7. package/src/scss/basic/{misc/_normalize.scss → _normalize.scss} +5 -103
  8. package/src/scss/basic/{misc/_states.scss → _states.scss} +2 -2
  9. package/src/scss/{core/misc → basic}/_utilities.scss +4 -4
  10. package/src/scss/basic/design/_keyframes.scss +1 -1
  11. package/src/scss/basic/design/_shapes.scss +1 -1
  12. package/src/scss/basic/index.scss +14 -16
  13. package/src/scss/chrome.scss +2 -0
  14. package/src/scss/core/_color-mod.scss +24 -0
  15. package/src/scss/core/{misc/_color-properties.scss → _color-properties.scss} +1 -1
  16. package/src/scss/core/{misc/_tokens.scss → _tokens.scss} +10 -93
  17. package/src/scss/core/index.scss +13 -1
  18. package/src/scss/index.scss +7 -2
  19. package/src/scss/index.ts +1 -1
  20. package/src/scss/{core/interact → interact}/_viewport.scss +1 -1
  21. package/src/scss/interact/index.scss +18 -0
  22. package/src/scss/theme/_effects.scss +60 -0
  23. package/src/scss/theme/index.scss +8 -0
  24. package/src/scss/{advanced/index.ts → theme/loader.ts} +3 -4
  25. package/src/scss/ui/_bar.scss +268 -0
  26. package/src/scss/ui/_buttons.scss +215 -0
  27. package/src/scss/ui/_chrome-mixins.scss +104 -0
  28. package/src/scss/ui/_color.scss +3 -0
  29. package/src/scss/ui/_colorize.scss +5 -0
  30. package/src/scss/{advanced/layout → ui}/_content.scss +0 -1
  31. package/src/scss/ui/_core-layout.scss +4 -0
  32. package/src/scss/ui/_essentials-options.scss +2 -0
  33. package/src/scss/ui/_essentials.scss +707 -0
  34. package/src/scss/ui/_explorer-content.scss +417 -0
  35. package/src/scss/ui/_explorer.scss +274 -0
  36. package/src/scss/ui/_forms-bare-host-elements.scss +25 -0
  37. package/src/scss/ui/_forms-options.scss +2 -0
  38. package/src/scss/ui/_forms.scss +279 -0
  39. package/src/scss/ui/_forms_misc.scss +201 -0
  40. package/src/scss/ui/_gridbox.scss +298 -0
  41. package/src/scss/ui/_home-host.scss +192 -0
  42. package/src/scss/ui/_index.scss +23 -0
  43. package/src/scss/ui/_launcher-typography.scss +31 -0
  44. package/src/scss/ui/_layers.scss +48 -0
  45. package/src/scss/ui/_layout.scss +3 -0
  46. package/src/scss/ui/_markdown.scss +1634 -0
  47. package/src/scss/ui/_modal.scss +309 -0
  48. package/src/scss/ui/_motion.scss +3 -0
  49. package/src/scss/ui/_native-host-button-chrome.scss +31 -0
  50. package/src/scss/ui/_normalize.scss +5 -0
  51. package/src/scss/ui/_orientation-functions.scss +273 -0
  52. package/src/scss/ui/_orientbox.scss +97 -0
  53. package/src/scss/ui/_scrollbar.scss +257 -0
  54. package/src/scss/ui/_shared-overlays.scss +16 -0
  55. package/src/scss/ui/_shared.scss +4 -0
  56. package/src/scss/ui/_sidebar.scss +478 -0
  57. package/src/scss/ui/_speed-dial.scss +47 -0
  58. package/src/scss/ui/_states.scss +4 -0
  59. package/src/scss/ui/_tables.scss +28 -0
  60. package/src/scss/ui/_tabs.scss +405 -0
  61. package/src/scss/ui/_taskbar.scss +215 -0
  62. package/src/scss/ui/_toolbars.scss +167 -0
  63. package/src/scss/ui/_typography.scss +11 -0
  64. package/src/scss/ui/_utils.scss +8 -0
  65. package/src/scss/ui/_viewport.scss +470 -0
  66. package/src/scss/ui/_window-frame.scss +658 -0
  67. package/src/scss/ui/components/app-menu.scss +817 -0
  68. package/src/scss/ui/components/appearance-desktop.scss +14 -0
  69. package/src/scss/ui/components/appearance-mobile.scss +14 -0
  70. package/src/scss/ui/components/calendar/flyout.scss +194 -0
  71. package/src/scss/ui/components/calendar/index.scss +627 -0
  72. package/src/scss/ui/components/explorer-settings.scss +232 -0
  73. package/src/scss/ui/components/file-manager-content.scss +2 -0
  74. package/src/scss/ui/components/file-manager.scss +2 -0
  75. package/src/scss/ui/components/launcher-icon-mask.scss +34 -0
  76. package/src/scss/ui/components/navbar.scss +133 -0
  77. package/src/scss/ui/components/quick-settings.scss +321 -0
  78. package/src/scss/ui/components/scrollframe.scss +58 -0
  79. package/src/scss/ui/components/slider.scss +188 -0
  80. package/src/scss/ui/components/speed-dial.scss +2288 -0
  81. package/src/scss/ui/components/statusbar.scss +255 -0
  82. package/src/scss/ui/components/task.scss +118 -0
  83. package/src/scss/ui/components/taskbar.scss +514 -0
  84. package/src/scss/ui/components/text.scss +241 -0
  85. package/src/scss/ui/components/window.scss +601 -0
  86. package/src/scss/ui/home-host-apply.scss +10 -0
  87. package/src/scss/ui/index.scss +7 -0
  88. package/src/scss/ui/native-controls.scss +17 -0
  89. package/src/scss/advanced/_index.scss +0 -0
  90. package/src/scss/advanced/animation/_motion.scss +0 -323
  91. package/src/scss/advanced/color/_color.scss +0 -328
  92. package/src/scss/advanced/color/_colorize.scss +0 -325
  93. package/src/scss/advanced/design/_design-tokens.scss +0 -118
  94. package/src/scss/advanced/design/_effects.scss +0 -275
  95. package/src/scss/advanced/design/_shadow.scss +0 -359
  96. package/src/scss/advanced/design/_surfaces.scss +0 -76
  97. package/src/scss/advanced/effects/_animations.scss +0 -124
  98. package/src/scss/advanced/effects/_shadows.scss +0 -50
  99. package/src/scss/advanced/font/_typography.scss +0 -601
  100. package/src/scss/advanced/index.scss +0 -11
  101. package/src/scss/advanced/layout/_index.scss +0 -5
  102. package/src/scss/advanced/layout/_normalize.scss +0 -543
  103. package/src/scss/advanced/layout/_shared-overlays.scss +0 -162
  104. package/src/scss/advanced/md3/_md3.scss +0 -506
  105. package/src/scss/advanced/md3/_utils.scss +0 -114
  106. package/src/scss/advanced/misc/_config.scss +0 -119
  107. package/src/scss/advanced/misc/_initials.scss +0 -298
  108. package/src/scss/advanced/misc/_mixins.scss +0 -179
  109. package/src/scss/advanced/misc/_rendering.scss +0 -82
  110. package/src/scss/advanced/misc/_tokens.scss +0 -74
  111. package/src/scss/advanced/theme/_shared.scss +0 -232
  112. package/src/scss/advanced/theme/_states.scss +0 -332
  113. package/src/scss/advanced/theme/_variants.scss +0 -354
  114. package/src/scss/advanced/tokens/_material-color.scss +0 -120
  115. package/src/scss/advanced/tokens/_variables.scss +0 -171
  116. package/src/scss/basic/misc/_index.scss +0 -18
  117. package/src/scss/basic/misc/_mixins.scss +0 -179
  118. package/src/scss/basic/misc/_queries.scss +0 -34
  119. package/src/scss/basic/misc/_tokens.scss +0 -78
  120. package/src/scss/basic/misc/_veela.scss +0 -12
  121. package/src/scss/core/misc/_index.scss +0 -6
  122. /package/src/scss/basic/{misc/_motion.scss → _motion.scss} +0 -0
  123. /package/src/scss/{advanced/misc → basic}/_queries.scss +0 -0
  124. /package/src/scss/basic/{misc/_shared.scss → _shared.scss} +0 -0
  125. /package/src/scss/core/{misc/_config.scss → _config.scss} +0 -0
  126. /package/src/scss/core/{misc/_functions.scss → _functions.scss} +0 -0
  127. /package/src/scss/core/{misc/_icons.scss → _icons.scss} +0 -0
  128. /package/src/scss/core/{misc/_layout.scss → _layout.scss} +0 -0
  129. /package/src/scss/core/{misc/_mixins.scss → _mixins.scss} +0 -0
  130. /package/src/scss/core/{misc/_properties.scss → _properties.scss} +0 -0
  131. /package/src/scss/core/{misc/_utils.scss → _utils.scss} +0 -0
  132. /package/src/scss/{core/interact → interact}/_draggable.scss +0 -0
  133. /package/src/scss/{core/interact → interact}/_position.scss +0 -0
  134. /package/src/scss/{core/interact → interact}/_ps-anchor.scss +0 -0
  135. /package/src/scss/{core/interact → interact}/_ps-centered.scss +0 -0
  136. /package/src/scss/{core/interact → interact}/_ps-cursor.scss +0 -0
  137. /package/src/scss/{core/interact → interact}/_ps-draggable.scss +0 -0
  138. /package/src/scss/{core/interact → interact}/_ps-mechanic.scss +0 -0
  139. /package/src/scss/{core/interact → interact}/_ps-properties.scss +0 -0
  140. /package/src/scss/{core/interact → interact}/_ps-resizable.scss +0 -0
  141. /package/src/scss/{core/interact → interact}/_resizable.scss +0 -0
@@ -1,275 +0,0 @@
1
- @use "sass:list";
2
- @use "sass:map";
3
- @use "sass:meta";
4
-
5
- @use "./colorize" as colorize;
6
- @use "./motion" as motion;
7
- @use "./shadow" as shadow;
8
- @use "./utils" as utils;
9
-
10
- // =============================================================================
11
- // VISUAL EFFECTS MIXINS (split from layout)
12
- // =============================================================================
13
-
14
- $effect-defaults: (
15
- transition-duration: var(--duration-fast, #{motion.$ui-duration-fast}),
16
- transition-timing: var(--ease-out, #{motion.$ui-ease-standard}),
17
- lift: -2px,
18
- scale: 1,
19
- hover-shadow: var(--shadow-md, #{shadow.$shadow-md}),
20
- glass-surface-opacity: var(--surface-opacity-muted, 0.06),
21
- glass-border-opacity: var(--border-opacity-subtle, 0.14),
22
- glass-blur: default,
23
- shimmer-angle: 112deg,
24
- shimmer-width: 28%,
25
- shimmer-opacity: 0.32,
26
- shimmer-duration: var(--duration-long, #{motion.$ui-duration-standard}),
27
- shimmer-color: color-mix(in oklch, var(--color-primary, #ffffff) 36%, transparent),
28
- shine-duration: var(--duration-normal, #{motion.$ui-duration-standard}),
29
- shine-angle: 95deg,
30
- shine-width: 22%,
31
- shine-opacity: 0.28
32
- );
33
-
34
- $__effects-shimmer-keyframes-declared: false !default;
35
- $shimmer-keyframes-name: veela-shimmer-glide;
36
-
37
- @function _effect-token($token) {
38
- @if map.has-key($effect-defaults, $token) {
39
- @return map.get($effect-defaults, $token);
40
- }
41
-
42
- @error "Unknown visual effect token `#{$token}`.";
43
- }
44
-
45
- @mixin _ensure-shimmer-keyframes($name: $shimmer-keyframes-name) {
46
- @if not $__effects-shimmer-keyframes-declared {
47
- $__effects-shimmer-keyframes-declared: true !global;
48
-
49
- @at-root {
50
- @keyframes #{$name} {
51
- 0% { transform: translate3d(-120%, 0, 0); }
52
- 50% { transform: translate3d(0, 0, 0); }
53
- 100% { transform: translate3d(120%, 0, 0); }
54
- }
55
- }
56
- }
57
- }
58
-
59
- @mixin effect-transition($properties: (transform, box-shadow), $duration: null, $timing: null) {
60
- $prop-list: sass(if(sass(meta.type-of($properties) == "list"): $properties; else: ($properties,)));
61
- $resolved-duration: sass(if(sass($duration == null): _effect-token(transition-duration); else: $duration));
62
- $resolved-timing: sass(if(sass($timing == null): _effect-token(transition-timing); else: $timing));
63
-
64
- @include motion.transition($prop-list, $resolved-duration, $resolved-timing);
65
- }
66
-
67
- @mixin interactive-effect(
68
- $hover-transform: null,
69
- $hover-shadow: null,
70
- $rest-shadow: null,
71
- $properties: (transform, box-shadow),
72
- $duration: null,
73
- $timing: null
74
- ) {
75
- $prop-list: sass(if(sass(meta.type-of($properties) == "list"): $properties; else: ($properties,)));
76
-
77
- @include effect-transition($prop-list, $duration, $timing);
78
-
79
- @if $rest-shadow != null {
80
- box-shadow: $rest-shadow;
81
- }
82
-
83
- @include utils.when-hover {
84
- @if $hover-transform != null {
85
- transform: $hover-transform;
86
- }
87
-
88
- @if $hover-shadow != null {
89
- box-shadow: $hover-shadow;
90
- }
91
- }
92
-
93
- @include utils.when-active {
94
- @if $hover-transform != null {
95
- transform: $hover-transform;
96
- }
97
-
98
- @if $hover-shadow != null {
99
- box-shadow: $hover-shadow;
100
- }
101
- }
102
- }
103
-
104
- @mixin glass-morphism(
105
- $surface-opacity: null,
106
- $border-opacity: null,
107
- $blur: null
108
- ) {
109
- $surface-opacity: sass(if(sass($surface-opacity == null): _effect-token(glass-surface-opacity); else: $surface-opacity));
110
- $border-opacity: sass(if(sass($border-opacity == null): _effect-token(glass-border-opacity); else: $border-opacity));
111
- $blur-value: sass(if(sass($blur == null): _effect-token(glass-blur); else: $blur));
112
-
113
- @include colorize.surface($surface-opacity);
114
- @include colorize.border-color(var(--scrollbar-tint), $border-opacity);
115
-
116
- @if meta.type-of($blur-value) == "string" {
117
- @include colorize.backdrop-blur($blur-value);
118
- } @else {
119
- backdrop-filter: $blur-value;
120
- }
121
-
122
- background-color:
123
- color-mix(
124
- in oklch,
125
- var(--surface-color, var(--md-sys-color-surface, #0f131a)) calc(#{$surface-opacity} * 100%),
126
- transparent
127
- );
128
- }
129
-
130
- @mixin gradient-text($gradient: var(--primary-gradient, linear-gradient(120deg, var(--color-primary, #6b8cff), var(--color-tertiary, #f86ed4)))) {
131
- background-image: $gradient;
132
- background-size: 200% 200%;
133
- background-position: 0% 50%;
134
- background-clip: text;
135
- color: transparent;
136
- -webkit-background-clip: text;
137
- -webkit-text-fill-color: transparent;
138
-
139
- @include effect-transition(background-position);
140
-
141
- @include utils.when-hover {
142
- background-position: 100% 50%;
143
- }
144
-
145
- @include utils.when-active {
146
- background-position: 100% 50%;
147
- }
148
- }
149
-
150
- @mixin hover-lift(
151
- $lift: null,
152
- $shadow: null,
153
- $scale: null,
154
- $rest-shadow: null,
155
- $duration: null,
156
- $timing: null
157
- ) {
158
- $resolved-lift: sass(if(sass($lift == null): _effect-token(lift); else: $lift));
159
- $resolved-shadow: sass(if(sass($shadow == null): _effect-token(hover-shadow); else: $shadow));
160
- $resolved-scale: sass(if(sass($scale == null): _effect-token(scale); else: $scale));
161
-
162
- $hover-transform: translate3d(0, $resolved-lift, 0);
163
-
164
- @if $resolved-scale != 1 {
165
- $hover-transform: #{$hover-transform} scale(#{$resolved-scale});
166
- }
167
-
168
- @include interactive-effect(
169
- $hover-transform: $hover-transform,
170
- $hover-shadow: $resolved-shadow,
171
- $rest-shadow: $rest-shadow,
172
- $properties: (transform, box-shadow),
173
- $duration: $duration,
174
- $timing: $timing
175
- );
176
- }
177
-
178
- @mixin shimmer-effect(
179
- $duration: null,
180
- $angle: null,
181
- $width: null,
182
- $opacity: null,
183
- $color: null
184
- ) {
185
- $resolved-duration: sass(if(sass($duration == null): _effect-token(shimmer-duration); else: $duration));
186
- $resolved-angle: sass(if(sass($angle == null): _effect-token(shimmer-angle); else: $angle));
187
- $resolved-width: sass(if(sass($width == null): _effect-token(shimmer-width); else: $width));
188
- $resolved-opacity: sass(if(sass($opacity == null): _effect-token(shimmer-opacity); else: $opacity));
189
- $resolved-color: sass(if(sass($color == null): _effect-token(shimmer-color); else: $color));
190
-
191
- position: relative;
192
- overflow: hidden;
193
- isolation: isolate;
194
-
195
- @include effect-transition(filter);
196
-
197
- @include _ensure-shimmer-keyframes();
198
-
199
- &::after {
200
- content: "";
201
- position: absolute;
202
- inset: -150%;
203
- background: linear-gradient(
204
- $resolved-angle,
205
- transparent 0%,
206
- color-mix(in oklch, #{$resolved-color} 0%, transparent) calc((100% - #{$resolved-width}) / 2),
207
- #{$resolved-color} 50%,
208
- color-mix(in oklch, #{$resolved-color} 0%, transparent) calc((100% + #{$resolved-width}) / 2),
209
- transparent 100%
210
- );
211
- opacity: $resolved-opacity;
212
- animation: #{$shimmer-keyframes-name} #{$resolved-duration} linear infinite;
213
- pointer-events: none;
214
- mix-blend-mode: screen;
215
- }
216
-
217
- @include motion.reduced-motion {
218
- &::after {
219
- animation-play-state: paused;
220
- opacity: calc(#{$resolved-opacity} * 0.7);
221
- }
222
- }
223
- }
224
-
225
- @mixin button-shine(
226
- $duration: null,
227
- $angle: null,
228
- $width: null,
229
- $opacity: null,
230
- $shadow: null
231
- ) {
232
- $resolved-duration: sass(if(sass($duration == null): _effect-token(shine-duration); else: $duration));
233
- $resolved-angle: sass(if(sass($angle == null): _effect-token(shine-angle); else: $angle));
234
- $resolved-width: sass(if(sass($width == null): _effect-token(shine-width); else: $width));
235
- $resolved-opacity: sass(if(sass($opacity == null): _effect-token(shine-opacity); else: $opacity));
236
- $resolved-shadow: sass(if(sass($shadow == null): _effect-token(hover-shadow); else: $shadow));
237
-
238
- position: relative;
239
- overflow: hidden;
240
- isolation: isolate;
241
-
242
- @include hover-lift(
243
- $shadow: $resolved-shadow,
244
- $rest-shadow: var(--shadow-sm, #{shadow.$shadow-sm})
245
- );
246
-
247
- &::before {
248
- content: "";
249
- position: absolute;
250
- inset-block: -30%;
251
- inset-inline: calc(-1 * #{$resolved-width});
252
- background: linear-gradient(
253
- $resolved-angle,
254
- transparent 0%,
255
- rgb(255 255 255 / 0) calc((100% - #{$resolved-width}) / 2),
256
- rgb(255 255 255 / #{$resolved-opacity}) 50%,
257
- rgb(255 255 255 / 0) calc((100% + #{$resolved-width}) / 2),
258
- transparent 100%
259
- );
260
- transform: translate3d(-120%, 0, 0);
261
- transition: transform #{$resolved-duration} var(--ease-in-out, #{motion.md3-easing(standard)});
262
- pointer-events: none;
263
- mix-blend-mode: soft-light;
264
- }
265
-
266
- @include utils.when-hover {
267
- &::before { transform: translate3d(120%, 0, 0); }
268
- }
269
-
270
- @include motion.reduced-motion {
271
- &::before {
272
- transition-duration: calc(#{$resolved-duration} * 1.5);
273
- }
274
- }
275
- }
@@ -1,359 +0,0 @@
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
- }
@@ -1,76 +0,0 @@
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
- }