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.
- package/.claude/skills/mw-maverick-wave/SKILL.md +9 -1
- package/.claude/skills/mw-maverick-wave/references/components.md +13 -6
- package/.claude/skills/mw-maverick-wave/references/layout.md +2 -2
- package/.claude/skills/mw-maverick-wave/references/theming.md +2 -1
- package/CHANGELOG.md +13 -0
- package/README.md +2 -2
- package/maverick-wave.min.css +7 -7
- package/maverick-wave.min.js +1 -1
- package/package.json +2 -2
- package/scripts/verify.js +10 -1
- package/src/js/main.js +8 -8
- package/src/partials/tiles-container.html +38 -38
- package/src/scss/abstracts/_variables.scss +6 -0
- package/src/scss/base/_base.scss +17 -7
- package/src/scss/base/_reset.scss +7 -1
- package/src/scss/components/_announcement.scss +1 -3
- package/src/scss/components/_blog-post.scss +5 -4
- package/src/scss/components/_cards.scss +2 -2
- package/src/scss/components/_contact.scss +5 -3
- package/src/scss/components/_hero-badge.scss +48 -0
- package/src/scss/components/_index.scss +2 -0
- package/src/scss/components/_leader-row.scss +24 -18
- package/src/scss/components/_localhost-indicator.scss +2 -2
- package/src/scss/components/_panels.scss +18 -52
- package/src/scss/components/_tabs.scss +2 -2
- package/src/scss/components/_tiles.scss +43 -49
- package/src/scss/components/_tooltip.scss +193 -0
- package/src/scss/layout/_footer.scss +46 -84
- package/src/scss/layout/_grid.scss +67 -42
- package/src/scss/layout/_header-reveal.scss +1 -1
- package/src/scss/layout/_header.scss +49 -77
- package/src/scss/layout/_home.scss +7 -4
- package/src/scss/layout/_main.scss +100 -337
- package/src/scss/layout/_parallax.scss +1 -1
- 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
|
|
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('
|
|
28
|
-
margin-bottom: spacing('
|
|
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('
|
|
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
|
-
//
|
|
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('
|
|
133
|
-
width:
|
|
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('
|
|
159
|
+
font-size: font-size('xs');
|
|
142
160
|
padding-top: spacing('4');
|
|
143
|
-
margin: spacing('
|
|
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('
|
|
174
|
+
font-size: font-size('2xs');
|
|
152
175
|
padding-top: spacing('0');
|
|
153
176
|
margin: spacing('1') auto;
|
|
154
|
-
}
|
|
155
177
|
|
|
156
|
-
|
|
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
|
-
$
|
|
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
|
|
117
|
+
@include single-column;
|
|
115
118
|
@include _stretch-children;
|
|
116
119
|
}
|
|
117
120
|
|
|
118
|
-
@each $count, $steps in $
|
|
121
|
+
@each $count, $steps in $column-steps {
|
|
119
122
|
.mw-grid-#{$count} {
|
|
120
123
|
@extend %grid-base;
|
|
121
|
-
@include
|
|
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
|
|
153
|
+
@include columns(12);
|
|
129
154
|
|
|
130
155
|
@include media-down('md') {
|
|
131
|
-
@include
|
|
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
|
|
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
|
|
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
|
|
223
|
+
@include columns(12);
|
|
199
224
|
|
|
200
225
|
@include media-down('md') {
|
|
201
|
-
@include
|
|
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
|
|
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
|
|
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:
|
|
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 $
|
|
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.
|
|
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')
|
|
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:
|
|
80
|
-
width:
|
|
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:
|
|
112
|
-
width:
|
|
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
|
-
|
|
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
|
-
|
|
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')
|
|
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')
|
|
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
|
-
|
|
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')
|
|
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)
|
|
463
|
-
opacity: 1
|
|
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
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
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
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
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:
|
|
540
|
-
width:
|
|
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
|
-
|
|
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('
|
|
21
|
+
padding-block: spacing('9');
|
|
19
22
|
}
|
|
20
23
|
|
|
21
24
|
&-fade {
|
|
22
25
|
@extend .mw-home-content;
|
|
23
|
-
animation:
|
|
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
|
|
53
|
+
@keyframes mw-home-fade {
|
|
51
54
|
from {
|
|
52
55
|
opacity: 0;
|
|
53
56
|
transform: translateX(-8px) translateY(-23px);
|