maverick-wave 5.29.0 → 5.31.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 (144) hide show
  1. package/README.md +2 -2
  2. package/maverick-wave.min.css +2 -2
  3. package/package.json +8 -2
  4. package/src/scss/components/_avatars.scss +35 -3
  5. package/src/scss/components/_dropdown.scss +24 -1
  6. package/src/scss/components/_lang-switch.scss +4 -8
  7. package/src/scss/components/_modals.scss +33 -5
  8. package/.claude/settings.local.json +0 -43
  9. package/.claude/skills/mw-maverick-wave/SKILL.md +0 -532
  10. package/.claude/skills/mw-maverick-wave/examples/angular-form.md +0 -279
  11. package/.claude/skills/mw-maverick-wave/examples/angular-list-page.md +0 -309
  12. package/.claude/skills/mw-maverick-wave/examples/angular-services.md +0 -538
  13. package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +0 -530
  14. package/.claude/skills/mw-maverick-wave/references/components.md +0 -2169
  15. package/.claude/skills/mw-maverick-wave/references/forms.md +0 -358
  16. package/.claude/skills/mw-maverick-wave/references/javascript.md +0 -164
  17. package/.claude/skills/mw-maverick-wave/references/layout.md +0 -764
  18. package/.claude/skills/mw-maverick-wave/references/theming.md +0 -528
  19. package/.github/workflows/ci.yml +0 -41
  20. package/.idea/codeStyles/Project.xml +0 -59
  21. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  22. package/.idea/maverick-wave.iml +0 -12
  23. package/.idea/modules.xml +0 -8
  24. package/.idea/prettier.xml +0 -6
  25. package/.idea/vcs.xml +0 -6
  26. package/.prettierignore +0 -8
  27. package/.prettierrc.json +0 -7
  28. package/CHANGELOG.md +0 -950
  29. package/CLAUDE.md +0 -60
  30. package/gulpfile.js +0 -167
  31. package/index.html +0 -1730
  32. package/release.sh +0 -31
  33. package/scripts/verify.js +0 -252
  34. package/src/assets/favicon/apple-touch-icon.png +0 -0
  35. package/src/assets/favicon/favicon-96x96.png +0 -0
  36. package/src/assets/favicon/favicon.svg +0 -1
  37. package/src/assets/favicon/site.webmanifest +0 -37
  38. package/src/assets/favicon/web-app-manifest-192x192.png +0 -0
  39. package/src/assets/favicon/web-app-manifest-512x512.png +0 -0
  40. package/src/assets/favicon.ico +0 -0
  41. package/src/assets/header-logo.svg +0 -24
  42. package/src/assets/images/gallery-city.svg +0 -49
  43. package/src/assets/images/gallery-desert.svg +0 -25
  44. package/src/assets/images/gallery-forest.svg +0 -46
  45. package/src/assets/images/gallery-lake.svg +0 -26
  46. package/src/assets/images/gallery-mountain.svg +0 -19
  47. package/src/assets/images/gallery-ocean.svg +0 -26
  48. package/src/assets/images/gallery-oldtown.svg +0 -41
  49. package/src/assets/images/gallery-snow.svg +0 -39
  50. package/src/assets/images/photo-balloon.svg +0 -35
  51. package/src/assets/images/photo-forest-path.svg +0 -31
  52. package/src/assets/images/photo-lighthouse.svg +0 -42
  53. package/src/assets/images/photo-palm.svg +0 -27
  54. package/src/assets/images/photo-peak.svg +0 -27
  55. package/src/assets/images/photo-tower.svg +0 -34
  56. package/src/assets/images/photo-waterfall.svg +0 -32
  57. package/src/assets/images/slider-field.svg +0 -124
  58. package/src/assets/images/slider-forest.svg +0 -33
  59. package/src/assets/images/slider-lake.svg +0 -35
  60. package/src/assets/images/slider-mountains.svg +0 -29
  61. package/src/assets/images/slider-trees.svg +0 -41
  62. package/src/assets/images/story-aurora.svg +0 -36
  63. package/src/assets/images/story-beach.svg +0 -34
  64. package/src/assets/images/story-stars.svg +0 -35
  65. package/src/assets/images/tile-analytics.svg +0 -22
  66. package/src/assets/images/tile-cloud.svg +0 -19
  67. package/src/assets/images/tile-ecommerce.svg +0 -14
  68. package/src/assets/images/tile-enterprise.svg +0 -22
  69. package/src/assets/images/tile-marketing.svg +0 -16
  70. package/src/assets/media/demo-chime.wav +0 -0
  71. package/src/assets/media/story-sunrise.jpg +0 -0
  72. package/src/assets/media/story-sunrise.mp4 +0 -0
  73. package/src/partials/accordions-container.html +0 -179
  74. package/src/partials/alerts-container.html +0 -151
  75. package/src/partials/announcement-container.html +0 -67
  76. package/src/partials/avatars-container.html +0 -229
  77. package/src/partials/badges-container.html +0 -114
  78. package/src/partials/blog-posts-container.html +0 -158
  79. package/src/partials/breadcrumbs-container.html +0 -126
  80. package/src/partials/button-bar-container.html +0 -175
  81. package/src/partials/buttons-container.html +0 -272
  82. package/src/partials/calendar-container.html +0 -203
  83. package/src/partials/cards-container.html +0 -727
  84. package/src/partials/code-container.html +0 -194
  85. package/src/partials/colors-container.html +0 -263
  86. package/src/partials/coming-soon-container.html +0 -10
  87. package/src/partials/contact-container.html +0 -85
  88. package/src/partials/content-slider-container.html +0 -36
  89. package/src/partials/divider-container.html +0 -70
  90. package/src/partials/documentation-container.html +0 -204
  91. package/src/partials/dropdown-container.html +0 -119
  92. package/src/partials/empty-state-container.html +0 -79
  93. package/src/partials/feed-container.html +0 -506
  94. package/src/partials/footer-container.html +0 -113
  95. package/src/partials/form-container.html +0 -262
  96. package/src/partials/form-elements-container.html +0 -616
  97. package/src/partials/form-field-container.html +0 -166
  98. package/src/partials/gallery-container.html +0 -62
  99. package/src/partials/get-started-container.html +0 -423
  100. package/src/partials/grid-container.html +0 -191
  101. package/src/partials/header-container.html +0 -69
  102. package/src/partials/header-utilities-container.html +0 -331
  103. package/src/partials/highlights-container.html +0 -71
  104. package/src/partials/history-container.html +0 -67
  105. package/src/partials/home-container.html +0 -31
  106. package/src/partials/html-lists-container.html +0 -63
  107. package/src/partials/info-container.html +0 -104
  108. package/src/partials/input-group-container.html +0 -299
  109. package/src/partials/item-lists-container.html +0 -368
  110. package/src/partials/kanban-container.html +0 -459
  111. package/src/partials/kbd-container.html +0 -63
  112. package/src/partials/leader-row-container.html +0 -139
  113. package/src/partials/login-container.html +0 -65
  114. package/src/partials/lunch-menu-container.html +0 -341
  115. package/src/partials/media-container.html +0 -27
  116. package/src/partials/meta-info-container.html +0 -21
  117. package/src/partials/modals-container.html +0 -199
  118. package/src/partials/mosaic-container.html +0 -173
  119. package/src/partials/page-header-container.html +0 -78
  120. package/src/partials/pagination-container.html +0 -64
  121. package/src/partials/palette-container.html +0 -480
  122. package/src/partials/panels-container.html +0 -126
  123. package/src/partials/parallax-container.html +0 -147
  124. package/src/partials/portrait-gallery-container.html +0 -175
  125. package/src/partials/preview-container.html +0 -136
  126. package/src/partials/pricing-container.html +0 -523
  127. package/src/partials/progress-container.html +0 -230
  128. package/src/partials/prose-container.html +0 -43
  129. package/src/partials/ratings-container.html +0 -104
  130. package/src/partials/section-head-container.html +0 -77
  131. package/src/partials/segmented-container.html +0 -66
  132. package/src/partials/skeleton-container.html +0 -87
  133. package/src/partials/spinners-container.html +0 -96
  134. package/src/partials/stepper-container.html +0 -111
  135. package/src/partials/stories-container.html +0 -182
  136. package/src/partials/tables-container.html +0 -309
  137. package/src/partials/tabs-container.html +0 -290
  138. package/src/partials/tags-container.html +0 -242
  139. package/src/partials/techstack-bucket-container.html +0 -187
  140. package/src/partials/testimonials-container.html +0 -88
  141. package/src/partials/tiles-container.html +0 -247
  142. package/src/partials/timelines-container.html +0 -196
  143. package/src/partials/typography-container.html +0 -74
  144. package/src/partials/utilities-container.html +0 -553
package/package.json CHANGED
@@ -1,12 +1,18 @@
1
1
  {
2
2
  "name": "maverick-wave",
3
- "version": "5.29.0",
3
+ "version": "5.31.0",
4
4
  "config": {
5
- "version_short": "5.29"
5
+ "version_short": "5.31"
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",
9
9
  "style": "src/scss/main.scss",
10
+ "files": [
11
+ "maverick-wave.min.css",
12
+ "maverick-wave.min.js",
13
+ "src/scss",
14
+ "src/js"
15
+ ],
10
16
  "scripts": {
11
17
  "clean": "gulp clean",
12
18
  "format": "prettier --check \"**/*.{scss,js,json,html,md}\"",
@@ -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
+ // A block, not the flex column of the div version and not a grid: iOS
178
+ // WebKit takes the intrinsic height of a scrolling flex or grid item in a
179
+ // top-layer dialog as zero. A dialog shorter than its cap then shows its
180
+ // header and footer and nothing between - a grid only hides it until the
181
+ // content outgrows the cap. Desktop browsers and Playwright's WebKit do not
182
+ // show it, so only a real iPhone can confirm a change here.
183
+ display: block;
176
184
  opacity: 1;
177
185
  transform: scale(1) translateY(0);
178
186
 
@@ -184,6 +192,19 @@
184
192
  }
185
193
  }
186
194
 
195
+ // With no row to scroll in, the body gets a cap of its own: the dialog's,
196
+ // less the room its header and footer take (61px each on a phone sheet)
197
+ .mw-modal-body {
198
+ max-height: calc(var(--mw-modal-max-height) - 8rem);
199
+ // Without it an absolute child - screen reader text, a tooltip - anchors to
200
+ // the dialog, escapes the body's scroll and makes the whole dialog scroll
201
+ position: relative;
202
+ }
203
+
204
+ &:not(:has(> .mw-modal-footer)) .mw-modal-body {
205
+ max-height: calc(var(--mw-modal-max-height) - 4rem);
206
+ }
207
+
187
208
  &::backdrop {
188
209
  background: var(--mw-overlay-background);
189
210
  backdrop-filter: blur(3px);
@@ -230,6 +251,13 @@
230
251
  }
231
252
  }
232
253
 
254
+ // Neither shape locks the page scroll behind it - the <dialog> only makes the
255
+ // page inert, which still lets a finger or a wheel move it
256
+ :root:has(dialog.mw-modal[open], .mw-modal-overlay.mw-modal-open) {
257
+ overflow: hidden;
258
+ scrollbar-gutter: stable; // Or the page shifts by the hidden scrollbar
259
+ }
260
+
233
261
  // Modal sections
234
262
  .mw-modal-header {
235
263
  padding: spacing('3') spacing('5');
@@ -1,43 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(grep -rn '$_mw\\\\|$_size\\\\|$_border' src/scss '--include=*.scss')",
5
- "Bash(npm run:*)",
6
- "Bash(node:*)",
7
- "Bash(git ls-tree:*)",
8
- "Bash(git ls-remote:*)",
9
- "Bash(npm outdated:*)",
10
- "Bash(npm update:*)",
11
- "Bash(npm audit:*)",
12
- "Bash(npx prettier *)"
13
- ]
14
- },
15
- "hooks": {
16
- "PostToolUse": [
17
- {
18
- "matcher": "Edit|Write",
19
- "hooks": [
20
- {
21
- "type": "command",
22
- "command": "[ ! -f '/Users/m1well/.claude/skills/impeccable/scripts/impeccable' ] || '/Users/m1well/.claude/skills/impeccable/scripts/impeccable' hook",
23
- "timeout": 5,
24
- "statusMessage": "Checking UI changes"
25
- }
26
- ]
27
- }
28
- ],
29
- "Stop": [
30
- {
31
- "hooks": [
32
- {
33
- "type": "command",
34
- "command": "[ ! -f '/Users/m1well/.claude/skills/impeccable/scripts/impeccable' ] || '/Users/m1well/.claude/skills/impeccable/scripts/impeccable' hook",
35
- "timeout": 30,
36
- "statusMessage": "Design deep pass"
37
- }
38
- ]
39
- }
40
- ]
41
- },
42
- "description": "Impeccable design detector: immediate-tier checks after Edit/Write on UI files, full-rule deep pass on Stop."
43
- }