maverick-wave 5.26.0 → 5.28.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.
Files changed (35) hide show
  1. package/.claude/skills/mw-maverick-wave/SKILL.md +9 -1
  2. package/.claude/skills/mw-maverick-wave/references/components.md +13 -6
  3. package/.claude/skills/mw-maverick-wave/references/layout.md +2 -2
  4. package/.claude/skills/mw-maverick-wave/references/theming.md +2 -1
  5. package/CHANGELOG.md +13 -0
  6. package/README.md +2 -2
  7. package/maverick-wave.min.css +7 -7
  8. package/maverick-wave.min.js +1 -1
  9. package/package.json +2 -2
  10. package/scripts/verify.js +10 -1
  11. package/src/js/main.js +8 -8
  12. package/src/partials/tiles-container.html +38 -38
  13. package/src/scss/abstracts/_variables.scss +6 -0
  14. package/src/scss/base/_base.scss +17 -7
  15. package/src/scss/base/_reset.scss +7 -1
  16. package/src/scss/components/_announcement.scss +1 -3
  17. package/src/scss/components/_blog-post.scss +5 -4
  18. package/src/scss/components/_cards.scss +2 -2
  19. package/src/scss/components/_contact.scss +5 -3
  20. package/src/scss/components/_hero-badge.scss +48 -0
  21. package/src/scss/components/_index.scss +2 -0
  22. package/src/scss/components/_leader-row.scss +24 -18
  23. package/src/scss/components/_localhost-indicator.scss +2 -2
  24. package/src/scss/components/_panels.scss +18 -52
  25. package/src/scss/components/_tabs.scss +2 -2
  26. package/src/scss/components/_tiles.scss +43 -49
  27. package/src/scss/components/_tooltip.scss +193 -0
  28. package/src/scss/layout/_footer.scss +46 -84
  29. package/src/scss/layout/_grid.scss +67 -42
  30. package/src/scss/layout/_header-reveal.scss +1 -1
  31. package/src/scss/layout/_header.scss +49 -77
  32. package/src/scss/layout/_home.scss +7 -4
  33. package/src/scss/layout/_main.scss +100 -337
  34. package/src/scss/layout/_parallax.scss +1 -1
  35. package/src/scss/layout/_section.scss +37 -21
@@ -1,5 +1,6 @@
1
1
  @use 'sass:map';
2
2
  @use '../abstracts' as *;
3
+ @use 'grid';
3
4
 
4
5
  @layer mw.layout {
5
6
  .mw-footer {
@@ -7,31 +8,34 @@
7
8
  padding: spacing('7') spacing('0');
8
9
  border-top: 1px solid var(--mw-border-accent);
9
10
 
11
+ // The same ramp .mw-grid-4 rides, read from the one place it is written
10
12
  &-top {
11
13
  display: grid;
12
- grid-template-columns: 1fr;
13
14
  gap: spacing('6');
14
15
  margin-bottom: spacing('6');
15
16
 
16
- @include media-up('sm') {
17
- grid-template-columns: repeat(2, 1fr);
18
- }
19
-
20
- @include media-up('lg') {
21
- grid-template-columns: repeat(4, 1fr);
22
- }
17
+ @include grid.column-grid(map.get(grid.$column-steps, 4));
23
18
  }
24
19
 
25
20
  &-column {
26
21
  h3 {
27
- font-size: font-size('lg');
28
- margin-bottom: spacing('4');
22
+ font-size: font-size('md');
23
+ margin-bottom: spacing('3');
29
24
  color: var(--mw-primary-text-color);
25
+
26
+ @include media-up('sm') {
27
+ font-size: font-size('lg');
28
+ margin-bottom: spacing('4');
29
+ }
30
30
  }
31
31
 
32
32
  p {
33
33
  color: var(--mw-text-muted-color);
34
- margin-bottom: spacing('3');
34
+ margin-bottom: spacing('2');
35
+
36
+ @include media-up('sm') {
37
+ margin-bottom: spacing('3');
38
+ }
35
39
  }
36
40
 
37
41
  ul {
@@ -48,7 +52,8 @@
48
52
  text-decoration: none;
49
53
  padding-bottom: 2px;
50
54
 
51
- // subtle default underline via box‐shadow
55
+ // Always drawn, unlike the navbar's: a footer link sits in a list of
56
+ // them and needs to read as a link without being pointed at first
52
57
  &::after {
53
58
  content: '';
54
59
  position: absolute;
@@ -88,11 +93,6 @@
88
93
  row-gap: spacing('3');
89
94
  margin: spacing('6') auto;
90
95
 
91
- &.mod-wrap {
92
- width: 330px;
93
- max-width: 100%;
94
- }
95
-
96
96
  a {
97
97
  position: relative;
98
98
  display: flex;
@@ -124,98 +124,60 @@
124
124
  transition-duration: var(--mw-duration-instant);
125
125
  }
126
126
  }
127
+
128
+ @include media-up('md') {
129
+ column-gap: spacing('8');
130
+ row-gap: spacing('4');
131
+
132
+ a {
133
+ width: 48px;
134
+ height: 48px;
135
+ font-size: font-size('xl');
136
+ }
137
+ }
127
138
  }
128
139
 
129
140
  .mw-disclaimer {
130
141
  text-align: center;
131
142
  color: var(--mw-text-muted-color);
132
- font-size: font-size('sm');
133
- width: min(85%, 700px);
143
+ font-size: font-size('xs');
144
+ width: 100%;
134
145
  margin: spacing('0') auto spacing('3') auto;
135
146
  line-height: 1.4;
147
+
148
+ // A 15% inset inside a container that already keeps a gutter only narrows
149
+ // the line to no purpose - so it waits until there is a line to narrow
150
+ @include media-up('sm') {
151
+ width: min(85%, 700px);
152
+ font-size: font-size('sm');
153
+ }
136
154
  }
137
155
 
138
156
  .mw-copyright {
139
157
  text-align: center;
140
158
  color: var(--mw-text-muted-color);
141
- font-size: font-size('sm');
159
+ font-size: font-size('xs');
142
160
  padding-top: spacing('4');
143
- margin: spacing('7') auto spacing('1') auto;
161
+ margin: spacing('5') auto spacing('1') auto;
144
162
  width: 100%;
145
163
  border-top: 1px solid var(--mw-border-accent);
164
+
165
+ @include media-up('sm') {
166
+ font-size: font-size('sm');
167
+ margin-top: spacing('7');
168
+ }
146
169
  }
147
170
 
148
171
  .mw-last-updated {
149
172
  text-align: center;
150
173
  color: var(--mw-text-muted-color);
151
- font-size: font-size('xs');
174
+ font-size: font-size('2xs');
152
175
  padding-top: spacing('0');
153
176
  margin: spacing('1') auto;
154
- }
155
177
 
156
- @include media-up('md') {
157
- .mw-social-links {
158
- column-gap: spacing('8');
159
- row-gap: spacing('4');
160
-
161
- &.mod-wrap {
162
- width: 420px;
163
- }
164
-
165
- a {
166
- width: 48px;
167
- height: 48px;
168
- font-size: font-size('xl');
169
- }
170
- }
171
- }
172
-
173
- @include media-up('lg') {
174
- .mw-social-links {
175
- &.mod-wrap {
176
- width: 510px;
177
- }
178
- }
179
- }
180
-
181
- @include media-down('sm') {
182
- &-column {
183
- h3 {
184
- font-size: font-size('md');
185
- margin-bottom: spacing('3');
186
- }
187
-
188
- p {
189
- margin-bottom: spacing('2');
190
- }
191
- }
192
-
193
- .mw-social-links {
194
- gap: spacing('3');
195
-
196
- &.mod-wrap {
197
- column-gap: spacing('6');
198
- row-gap: spacing('3');
199
- max-width: 100%;
200
- padding: spacing('0') spacing('4');
201
- }
202
- }
203
-
204
- // A second 15% inset inside a container that already keeps a gutter only
205
- // narrows the line to no purpose
206
- .mw-disclaimer {
207
- width: 100%;
208
- font-size: font-size('xs');
209
- }
210
-
211
- .mw-copyright {
212
- margin-top: spacing('5');
178
+ @include media-up('sm') {
213
179
  font-size: font-size('xs');
214
180
  }
215
-
216
- .mw-last-updated {
217
- font-size: font-size('2xs');
218
- }
219
181
  }
220
182
  }
221
183
  }
@@ -10,7 +10,7 @@
10
10
  // Outside the layer blocks below, because both read it - the columns are emitted
11
11
  // in `mw.layout`, the reveal cycle in `mw.utilities`, and a Sass variable declared
12
12
  // inside an `@layer` block is local to it.
13
- $_column-steps: (
13
+ $column-steps: (
14
14
  2: (
15
15
  ('sm', 2, null),
16
16
  ),
@@ -55,6 +55,37 @@ $_column-steps-lg: (
55
55
  // same reason as the steps above: both read it.
56
56
  $_grid-from: ('sm', 'md', 'lg', 'xl');
57
57
 
58
+ @mixin columns($count) {
59
+ grid-template-columns: repeat($count, minmax(0, 1fr));
60
+ }
61
+
62
+ @mixin single-column {
63
+ grid-template-columns: minmax(0, 1fr);
64
+ }
65
+
66
+ // Outside the layer block, because a Sass mixin declared inside one is local to
67
+ // it - and the footer builds its own columns from the same ramp.
68
+ //
69
+ // $base-gap is for the -lg ramp, whose placeholder carries the desktop gap and
70
+ // has to come back down to the default air on a phone
71
+ @mixin column-grid($steps, $base-gap: null) {
72
+ @include single-column;
73
+ @if $base-gap {
74
+ gap: spacing($base-gap);
75
+ }
76
+
77
+ @each $breakpoint, $cols, $gap in $steps {
78
+ @include media-up($breakpoint) {
79
+ @if $cols {
80
+ @include columns($cols);
81
+ }
82
+ @if $gap {
83
+ gap: spacing($gap);
84
+ }
85
+ }
86
+ }
87
+ }
88
+
58
89
  @layer mw.layout {
59
90
  %grid-base {
60
91
  display: grid;
@@ -66,34 +97,6 @@ $_grid-from: ('sm', 'md', 'lg', 'xl');
66
97
  gap: spacing('9');
67
98
  }
68
99
 
69
- @mixin _columns($count) {
70
- grid-template-columns: repeat($count, minmax(0, 1fr));
71
- }
72
-
73
- @mixin _single-column {
74
- grid-template-columns: minmax(0, 1fr);
75
- }
76
-
77
- // $base-gap is for the -lg ramp, whose placeholder carries the desktop gap and
78
- // has to come back down to the default air on a phone
79
- @mixin _column-grid($steps, $base-gap: null) {
80
- @include _single-column;
81
- @if $base-gap {
82
- gap: spacing($base-gap);
83
- }
84
-
85
- @each $breakpoint, $cols, $gap in $steps {
86
- @include media-up($breakpoint) {
87
- @if $cols {
88
- @include _columns($cols);
89
- }
90
- @if $gap {
91
- gap: spacing($gap);
92
- }
93
- }
94
- }
95
- }
96
-
97
100
  // The child reset a full-width single column needs: a card that carries its own
98
101
  // max-width would otherwise sit narrow in a column built to hold it.
99
102
  @mixin _stretch-children {
@@ -111,24 +114,46 @@ $_grid-from: ('sm', 'md', 'lg', 'xl');
111
114
 
112
115
  .mw-grid-1 {
113
116
  @extend %grid-base;
114
- @include _single-column;
117
+ @include single-column;
115
118
  @include _stretch-children;
116
119
  }
117
120
 
118
- @each $count, $steps in $_column-steps {
121
+ @each $count, $steps in $column-steps {
119
122
  .mw-grid-#{$count} {
120
123
  @extend %grid-base;
121
- @include _column-grid($steps);
124
+ @include column-grid($steps);
122
125
  }
123
126
  }
124
127
 
128
+ // The container half of the tile component. Here and not in `_tiles.scss`,
129
+ // because it is one of the ramps above and a component file cannot reach them.
130
+ //
131
+ // The guard is what makes a modifier replace the bare ramp rather than layer
132
+ // on it: both step at the same breakpoints, so which one holds a given width
133
+ // would otherwise come down to media query order.
134
+ .mw-tiles {
135
+ @extend %grid-base;
136
+ }
137
+
138
+ .mw-tiles:not(.mw-tiles-2col):not(.mw-tiles-4col) {
139
+ @include column-grid(map.get($column-steps, 3));
140
+ }
141
+
142
+ .mw-tiles-2col {
143
+ @include column-grid(map.get($column-steps, 2));
144
+ }
145
+
146
+ .mw-tiles-4col {
147
+ @include column-grid(map.get($column-steps, 4));
148
+ }
149
+
125
150
  .mw-grid-flex {
126
151
  @extend %grid-base;
127
152
 
128
- @include _columns(12);
153
+ @include columns(12);
129
154
 
130
155
  @include media-down('md') {
131
- @include _single-column;
156
+ @include single-column;
132
157
 
133
158
  > * {
134
159
  grid-column: 1 / -1 !important;
@@ -175,7 +200,7 @@ $_grid-from: ('sm', 'md', 'lg', 'xl');
175
200
 
176
201
  .mw-grid-1-lg {
177
202
  @extend %grid-base-lg;
178
- @include _single-column;
203
+ @include single-column;
179
204
  @include _stretch-children;
180
205
  }
181
206
 
@@ -184,7 +209,7 @@ $_grid-from: ('sm', 'md', 'lg', 'xl');
184
209
  @extend %grid-base-lg;
185
210
  // A phone gets the same air between cards whichever ramp is used; the -lg
186
211
  // in the name is about the desktop end of it.
187
- @include _column-grid($steps, '6');
212
+ @include column-grid($steps, '6');
188
213
  }
189
214
  }
190
215
 
@@ -195,10 +220,10 @@ $_grid-from: ('sm', 'md', 'lg', 'xl');
195
220
 
196
221
  .mw-grid-flex-lg {
197
222
  @extend %grid-base-lg;
198
- @include _columns(12);
223
+ @include columns(12);
199
224
 
200
225
  @include media-down('md') {
201
- @include _single-column;
226
+ @include single-column;
202
227
  gap: spacing('5');
203
228
  > * {
204
229
  grid-column: 1 / -1 !important;
@@ -263,7 +288,7 @@ $_grid-from: ('sm', 'md', 'lg', 'xl');
263
288
  );
264
289
 
265
290
  @mixin _stack($justify, $child-width) {
266
- @include _single-column;
291
+ @include single-column;
267
292
  justify-items: $justify;
268
293
 
269
294
  > * {
@@ -302,7 +327,7 @@ $_grid-from: ('sm', 'md', 'lg', 'xl');
302
327
  @each $breakpoint in $_grid-from {
303
328
  .mw-grid-from-#{$breakpoint} {
304
329
  @include media-down($breakpoint) {
305
- @include _single-column;
330
+ @include single-column;
306
331
  }
307
332
  }
308
333
  }
@@ -312,7 +337,7 @@ $_grid-from: ('sm', 'md', 'lg', 'xl');
312
337
  // grid has to hand it over: written next to the card it would sit in
313
338
  // `mw.components` and lose to every gap above, no matter how specific.
314
339
  [class*='mw-grid-']:has(> .mw-card-feature) {
315
- row-gap: 48px;
340
+ row-gap: spacing('10');
316
341
  }
317
342
  }
318
343
 
@@ -356,7 +381,7 @@ $_grid-from: ('sm', 'md', 'lg', 'xl');
356
381
  }
357
382
  }
358
383
 
359
- @each $count, $steps in $_column-steps {
384
+ @each $count, $steps in $column-steps {
360
385
  .mw-grid-#{$count} {
361
386
  @include _reveal-ramp($steps);
362
387
  }
@@ -88,7 +88,7 @@ $float-edge: (0 0 0 1px rgb(255 255 255 / 0.22), 0 4px 14px rgb(0 0 0 / 0.4));
88
88
  // The panel hangs off the bar, so the bar has to be in place - and the burger,
89
89
  // which is the X while the panel is out, has to stay on its own position.
90
90
  //
91
- // A class the script sets, not `:has(.mw-navbar.open)`: the burger is the
91
+ // A class the script sets, not `:has(.mw-navbar.mw-active)`: the burger is the
92
92
  // control that closes the panel and cannot wait for a selector re-match, which
93
93
  // is where WebKit's invalidation has been unreliable.
94
94
  //
@@ -1,5 +1,8 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
+ // Shared by the three controls in .mw-header-actions
4
+ $_control-size: 40px;
5
+
3
6
  @layer mw.layout {
4
7
  .mw-header {
5
8
  position: fixed;
@@ -36,7 +39,7 @@
36
39
  .mw-logo {
37
40
  display: flex;
38
41
  align-items: center;
39
- z-index: z-index('header') + 5;
42
+ z-index: z-index('header-logo');
40
43
  position: relative;
41
44
  flex-shrink: 1;
42
45
  min-width: 0;
@@ -49,6 +52,7 @@
49
52
  }
50
53
 
51
54
  img {
55
+ // The header height is derived from this - see $mw-header-height
52
56
  height: 42px;
53
57
  width: auto;
54
58
  max-width: 100%;
@@ -76,10 +80,13 @@
76
80
  display: flex;
77
81
  align-items: center;
78
82
  justify-content: center;
79
- height: 40px;
80
- width: 50px;
83
+ height: $_control-size;
84
+ width: $_control-size;
81
85
  flex-shrink: 0;
82
86
 
87
+ @include tappable;
88
+ @include touch-floor;
89
+
83
90
  &:hover:not(:disabled) {
84
91
  background: var(--mw-primary-color-hover);
85
92
  }
@@ -108,19 +115,20 @@
108
115
  outline: none;
109
116
  border-radius: radius('md');
110
117
  transition: var(--mw-transition);
111
- height: 40px;
112
- width: 50px;
118
+ height: $_control-size;
119
+ width: $_control-size;
113
120
  display: none;
114
121
  position: relative;
115
122
  flex-shrink: 0;
116
123
 
117
124
  // iOS
118
- -webkit-tap-highlight-color: transparent;
119
125
  -webkit-touch-callout: none;
120
126
  user-select: none;
121
- touch-action: manipulation;
122
127
 
123
- &:hover {
128
+ @include tappable;
129
+ @include touch-floor;
130
+
131
+ &:hover:not(:disabled) {
124
132
  background: var(--mw-primary-color-hover);
125
133
  }
126
134
 
@@ -134,9 +142,11 @@
134
142
 
135
143
  @include focus-ring;
136
144
 
137
- &.open {
145
+ // `.open` is what a consumer toggling the panel by hand was told to set,
146
+ // so it keeps working - drop it at the next major
147
+ &:is(.mw-active, .open) {
138
148
  background: var(--mw-secondary-color);
139
- z-index: z-index('header') + 10;
149
+ z-index: z-index('header-burger');
140
150
 
141
151
  // The surface under the burger switches to secondary, so its ink has to
142
152
  // switch with it. Set on the button, so the bar and both pseudo-elements
@@ -145,7 +155,7 @@
145
155
  --mw-header-burgerbutton-open-color
146
156
  );
147
157
 
148
- &:hover {
158
+ &:hover:not(:disabled) {
149
159
  background: var(--mw-secondary-color-hover);
150
160
  }
151
161
 
@@ -229,7 +239,7 @@
229
239
  box-shadow:
230
240
  0 6px 12px var(--mw-shadow-near),
231
241
  0 18px 40px var(--mw-shadow-far);
232
- z-index: z-index('header') + 3;
242
+ z-index: z-index('header-panel');
233
243
 
234
244
  // Rolled out from under the bar rather than slid in. A slide needs a place
235
245
  // to start, and the only direction with room is straight up through the
@@ -342,7 +352,7 @@
342
352
  }
343
353
  }
344
354
 
345
- &.open {
355
+ &:is(.mw-active, .open) {
346
356
  clip-path: inset(0 0 0 0);
347
357
  visibility: visible;
348
358
 
@@ -384,7 +394,7 @@
384
394
  inset: 0;
385
395
  background: var(--mw-overlay-background);
386
396
  backdrop-filter: blur(2px);
387
- z-index: z-index('header') - 1;
397
+ z-index: z-index('header-scrim');
388
398
  animation: mw-navbar-scrim-in var(--mw-duration-base) var(--mw-ease-out);
389
399
  }
390
400
  }
@@ -402,6 +412,14 @@
402
412
  }
403
413
  }
404
414
 
415
+ // How long the row survives before it becomes a panel: three links fit where
416
+ // six do not, so the page states the count and the modifier carries the ramp.
417
+ $_navbar-sizes: (
418
+ '': 'md',
419
+ '.mw-navbar-medium': 'lg',
420
+ '.mw-navbar-large': 'xl',
421
+ );
422
+
405
423
  .mw-navbar {
406
424
  display: flex;
407
425
 
@@ -459,76 +477,27 @@
459
477
  &:hover::after,
460
478
  &.mw-active::after,
461
479
  &.active::after {
462
- transform: scaleX(1) !important;
463
- opacity: 1 !important;
464
- }
465
- }
466
-
467
- // Auto-responsive behavior based on nav item count
468
- // Default behavior (1-3 items): collapse at md
469
- @include media-down('md') {
470
- @include navbar-top-sheet;
471
- }
472
-
473
- // Medium (4-5 items): collapse at lg
474
- &.mw-navbar-medium {
475
- @include media-down('lg') {
476
- @include navbar-top-sheet;
477
- }
478
- }
479
-
480
- // Large (6+ items): collapse at xl
481
- &.mw-navbar-large {
482
- @include media-down('xl') {
483
- @include navbar-top-sheet;
484
- }
485
- }
486
- }
487
-
488
- .mw-navbar {
489
- // Default (1-3 items): show burger at md
490
- @include media-down('md') {
491
- ~ .mw-menu-btn {
492
- display: flex;
493
- align-items: center;
494
- justify-content: center;
480
+ transform: scaleX(1);
481
+ opacity: 1;
495
482
  }
496
483
  }
497
484
 
498
- &.mw-navbar-medium {
499
- // 4-5 items: show burger at lg
500
- @include media-down('lg') {
501
- ~ .mw-menu-btn {
502
- display: flex;
503
- align-items: center;
504
- justify-content: center;
505
- }
506
- }
507
- }
485
+ // Panel and burger arrive together, so they step at one breakpoint each
486
+ @each $modifier, $breakpoint in $_navbar-sizes {
487
+ &#{$modifier} {
488
+ @include media-down($breakpoint) {
489
+ @include navbar-top-sheet;
508
490
 
509
- &.mw-navbar-large {
510
- // 6+ items: show burger at xl
511
- @include media-down('xl') {
512
- ~ .mw-menu-btn {
513
- display: flex;
514
- align-items: center;
515
- justify-content: center;
491
+ ~ .mw-menu-btn {
492
+ display: flex;
493
+ align-items: center;
494
+ justify-content: center;
495
+ }
516
496
  }
517
497
  }
518
498
  }
519
499
  }
520
500
 
521
- @keyframes fadeIn {
522
- from {
523
- opacity: 0;
524
- transform: translateY(-10px);
525
- }
526
- to {
527
- opacity: 1;
528
- transform: translateY(0);
529
- }
530
- }
531
-
532
501
  // Profile button - a round avatar until there is room for the signed-in name
533
502
  // beside it
534
503
  .mw-profile-btn {
@@ -536,8 +505,8 @@
536
505
  align-items: center;
537
506
  justify-content: center;
538
507
  gap: spacing('3');
539
- height: 40px;
540
- width: 40px;
508
+ height: $_control-size;
509
+ width: $_control-size;
541
510
  padding: spacing('0');
542
511
  background: transparent;
543
512
  border: 1px solid var(--mw-header-border);
@@ -548,6 +517,9 @@
548
517
  flex-shrink: 0;
549
518
  max-width: 220px;
550
519
 
520
+ @include tappable;
521
+ @include touch-floor;
522
+
551
523
  // The avatar brings spacing of its own that would break the pill shape
552
524
  .mw-avatar {
553
525
  margin: spacing('0');
@@ -13,14 +13,17 @@
13
13
  margin-inline: auto;
14
14
 
15
15
  &-content {
16
- padding: spacing('9') spacing('0');
16
+ // The hero is 100dvh tall either way, so the phone - which has the least
17
+ // of it to give away - gets the smaller band, not the larger one
18
+ padding-block: spacing('6');
19
+
17
20
  @include media-up('sm') {
18
- padding-block: spacing('6');
21
+ padding-block: spacing('9');
19
22
  }
20
23
 
21
24
  &-fade {
22
25
  @extend .mw-home-content;
23
- animation: fadeIn var(--mw-duration-slower) var(--mw-ease-out);
26
+ animation: mw-home-fade var(--mw-duration-slower) var(--mw-ease-out);
24
27
  }
25
28
  }
26
29
 
@@ -47,7 +50,7 @@
47
50
  }
48
51
  }
49
52
 
50
- @keyframes fadeIn {
53
+ @keyframes mw-home-fade {
51
54
  from {
52
55
  opacity: 0;
53
56
  transform: translateX(-8px) translateY(-23px);