maverick-wave 5.29.0 → 5.30.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/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "maverick-wave",
3
- "version": "5.29.0",
3
+ "version": "5.30.0",
4
4
  "config": {
5
- "version_short": "5.29"
5
+ "version_short": "5.30"
6
6
  },
7
7
  "description": "A lightweight, modern CSS framework for building responsive websites with elegance and speed.",
8
8
  "main": "src/js/main.js",
@@ -5,8 +5,8 @@
5
5
  circle as well. Inside a group the overlap follows the avatar size.
6
6
  <code>mw-avatar-landscape</code> (3:2) and
7
7
  <code>mw-avatar-portrait</code> (9:16, 2:3 on <code>-lg</code>) are for a
8
- photo that is not square - meant for the two large sizes. A landscape avatar
9
- is as tall as the round one.
8
+ photo that is not square - meant for the two large sizes. Both run larger than
9
+ the round step, and a landscape avatar shrinks to fit a narrow column.
10
10
  </p>
11
11
 
12
12
  <div class="mw-grid-2">
@@ -182,11 +182,11 @@
182
182
  </div>
183
183
  </div>
184
184
 
185
- <div class="mw-grid-2 mw-mt-6">
185
+ <div class="mw-grid-2 mw-grid-from-lg mw-mt-6">
186
186
  <div>
187
187
  <h3 class="mw-mb-4">Landscape</h3>
188
188
  <div class="mw-card mw-card-simple">
189
- <div class="mw-grid-stack-center">
189
+ <div class="mw-d-flex mw-flex-column mw-items-center mw-gap-6">
190
190
  <div class="mw-avatar mw-avatar-lg mw-avatar-landscape">
191
191
  <img
192
192
  src="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?auto=format&fit=crop&crop=faces&w=720&h=480&q=80"
@@ -58,7 +58,7 @@
58
58
 
59
59
  @include hover-move {
60
60
  img {
61
- transform: scale(1.12);
61
+ transform: scale(1.06);
62
62
  }
63
63
 
64
64
  // Transition only here, so the sweep resets instantly instead of travelling back
@@ -218,14 +218,46 @@
218
218
  aspect-ratio: 9 / 16;
219
219
  }
220
220
 
221
+ // Width-driven, so max-width can shrink it to a narrow column at 3:2
222
+ &-lg.mw-avatar-landscape,
223
+ &-xl.mw-avatar-landscape {
224
+ height: auto;
225
+ max-width: 100%;
226
+ }
227
+
228
+ // Over the round step - a photo shows more of the person than a face
229
+ &-lg.mw-avatar-landscape {
230
+ width: 228px;
231
+
232
+ @include media-up('sm') {
233
+ width: 273px;
234
+ }
235
+ }
236
+
237
+ &-xl.mw-avatar-landscape {
238
+ width: 285px;
239
+
240
+ @include media-up('sm') {
241
+ width: 399px;
242
+ }
243
+ }
244
+
245
+ &-xl.mw-avatar-portrait {
246
+ width: 172px;
247
+
248
+ @include media-up('sm') {
249
+ width: 242px;
250
+ }
251
+ }
252
+
221
253
  // 9:16 this small reads as a sliver - wider at the same height instead
222
254
  &-lg.mw-avatar-portrait {
223
255
  width: auto;
224
- height: calc(120px * 16 / 9);
256
+ height: calc(138px * 16 / 9);
225
257
  aspect-ratio: 2 / 3;
226
258
 
227
259
  @include media-up('sm') {
228
- height: calc(144px * 16 / 9);
260
+ height: calc(166px * 16 / 9);
229
261
  }
230
262
  }
231
263
  }
@@ -43,7 +43,7 @@
43
43
  top: calc(100% + #{spacing('2')});
44
44
  left: 0;
45
45
  z-index: z-index('menu');
46
- min-width: 200px;
46
+ min-width: var(--mw-dropdown-min-width, 200px);
47
47
  // Never wider than the screen it opens on, whatever the longest item says
48
48
  max-width: min(320px, calc(100vw - 2 * var(--mw-container-gutter)));
49
49
  padding: spacing('2');
@@ -252,6 +252,21 @@
252
252
  .mw-dropdown-up .mw-dropdown-menu {
253
253
  position-area: block-start span-inline-end;
254
254
  }
255
+
256
+ // In the bar a menu hangs off the bar's lower edge, not the trigger's - the
257
+ // trigger sits mid-bar, and a menu a few pixels under it starts inside it.
258
+ // Only a sideways flip is left, a menu above the bar would be off screen.
259
+ .mw-header-actions .mw-dropdown-menu {
260
+ position-area: none;
261
+ position-try-fallbacks: flip-inline;
262
+ top: var(--mw-header-height);
263
+ left: anchor(left);
264
+ }
265
+
266
+ .mw-header-actions .mw-dropdown-end .mw-dropdown-menu {
267
+ left: auto;
268
+ right: anchor(right);
269
+ }
255
270
  }
256
271
 
257
272
  // A menu opened by a thumb needs rows a thumb can hit, and the room to show
@@ -260,6 +275,14 @@
260
275
  @include touch-context('sm') {
261
276
  .mw-dropdown-menu {
262
277
  min-width: max(100%, 240px);
278
+
279
+ // A fixed menu's 100% is its containing block - the viewport, or a whole
280
+ // bar with a backdrop filter - which slid a header menu under the logo.
281
+ // The plain 240px is for a Safari that anchors but cannot measure yet.
282
+ @supports (anchor-scope: all) and (position-area: block-end) {
283
+ min-width: 240px;
284
+ min-width: max(anchor-size(width), 240px);
285
+ }
263
286
  }
264
287
 
265
288
  .mw-dropdown-item {
@@ -47,14 +47,10 @@
47
47
  }
48
48
 
49
49
  // A language list is short and its labels are one word - the 200px default
50
- // menu leaves half of it empty. The one place it must not be narrowed is under
51
- // a thumb, where the dropdown widens every menu on purpose.
52
- .mw-lang-switch .mw-dropdown-menu {
53
- min-width: 170px;
54
-
55
- @include touch-context('sm') {
56
- min-width: max(100%, 240px);
57
- }
50
+ // menu leaves half of it empty. Through the dropdown's property, so under a
51
+ // thumb the dropdown's own widening still wins.
52
+ .mw-lang-switch {
53
+ --mw-dropdown-min-width: 170px;
58
54
  }
59
55
 
60
56
  .mw-lang-switch-name {
@@ -42,9 +42,10 @@
42
42
  background: var(--mw-card-background);
43
43
  @include surface(0);
44
44
  box-shadow: var(--mw-elevation-5);
45
+ --mw-modal-max-height: 85dvh;
45
46
  max-width: 520px;
46
47
  width: 100%;
47
- max-height: 85dvh;
48
+ max-height: var(--mw-modal-max-height);
48
49
  display: flex;
49
50
  flex-direction: column;
50
51
  z-index: z-index('modal');
@@ -61,15 +62,15 @@
61
62
  // two read as the same modal rendered twice.
62
63
  &.mw-modal-sm {
63
64
  max-width: 370px;
64
- max-height: 80dvh;
65
+ --mw-modal-max-height: 80dvh;
65
66
  }
66
67
  &.mw-modal-lg {
67
68
  max-width: 720px;
68
- max-height: 90dvh;
69
+ --mw-modal-max-height: 90dvh;
69
70
  }
70
71
  &.mw-modal-xl {
71
72
  max-width: 960px;
72
- max-height: 92dvh;
73
+ --mw-modal-max-height: 92dvh;
73
74
  }
74
75
  }
75
76
 
@@ -85,7 +86,7 @@
85
86
  .mw-modal.mw-modal-lg,
86
87
  .mw-modal.mw-modal-xl {
87
88
  max-width: 100%;
88
- max-height: 92dvh;
89
+ --mw-modal-max-height: 92dvh;
89
90
  border-radius: radius('xl') radius('xl') radius('none') radius('none');
90
91
  padding-bottom: env(safe-area-inset-bottom, 0px);
91
92
  // Straight up from the bottom edge - a sheet does not scale in
@@ -173,6 +174,13 @@
173
174
  display var(--mw-duration-base) allow-discrete;
174
175
 
175
176
  &[open] {
177
+ // Not the flex column of the div version: iOS WebKit squeezes a scrolling
178
+ // flex item inside a top-layer dialog to a sliver, so the header shows and
179
+ // the body is gone. Desktop browsers and Playwright's WebKit do not show it.
180
+ // The 1fr row takes what max-height leaves, so the body scrolls in it.
181
+ display: grid;
182
+ grid-template-rows: auto minmax(0, 1fr) auto;
183
+ grid-template-columns: minmax(0, 1fr);
176
184
  opacity: 1;
177
185
  transform: scale(1) translateY(0);
178
186
 
@@ -184,6 +192,12 @@
184
192
  }
185
193
  }
186
194
 
195
+ // Without it an absolute child - screen reader text, a tooltip - anchors to
196
+ // the dialog, escapes the body's scroll and makes the whole dialog scroll
197
+ .mw-modal-body {
198
+ position: relative;
199
+ }
200
+
187
201
  &::backdrop {
188
202
  background: var(--mw-overlay-background);
189
203
  backdrop-filter: blur(3px);