maverick-wave 4.28.0 → 5.0.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 (138) hide show
  1. package/.claude/settings.local.json +29 -1
  2. package/.claude/skills/mw-maverick-wave/SKILL.md +39 -24
  3. package/.claude/skills/mw-maverick-wave/examples/angular-services.md +16 -4
  4. package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +13 -4
  5. package/.claude/skills/mw-maverick-wave/references/components.md +42 -5
  6. package/.claude/skills/mw-maverick-wave/references/forms.md +14 -2
  7. package/.claude/skills/mw-maverick-wave/references/javascript.md +17 -4
  8. package/.claude/skills/mw-maverick-wave/references/layout.md +53 -19
  9. package/.claude/skills/mw-maverick-wave/references/theming.md +38 -1
  10. package/.impeccable/config.local.json +5 -0
  11. package/.impeccable/hook.cache.json +1 -0
  12. package/CHANGELOG.md +11 -0
  13. package/CLAUDE.md +5 -5
  14. package/README.md +48 -4
  15. package/index.html +19 -38
  16. package/maverick-wave.min.css +14 -12
  17. package/maverick-wave.min.js +1 -1
  18. package/package.json +2 -2
  19. package/scripts/verify.js +27 -2
  20. package/src/js/main.js +223 -83
  21. package/src/partials/accordions-container.html +6 -10
  22. package/src/partials/alerts-container.html +6 -6
  23. package/src/partials/announcement-container.html +5 -5
  24. package/src/partials/avatars-container.html +85 -17
  25. package/src/partials/badges-container.html +6 -6
  26. package/src/partials/blog-posts-container.html +11 -12
  27. package/src/partials/buttons-container.html +3 -3
  28. package/src/partials/cards-container.html +26 -9
  29. package/src/partials/code-container.html +5 -5
  30. package/src/partials/content-slider-container.html +5 -4
  31. package/src/partials/divider-container.html +7 -7
  32. package/src/partials/dropdown-container.html +2 -2
  33. package/src/partials/empty-state-container.html +5 -5
  34. package/src/partials/footer-container.html +21 -18
  35. package/src/partials/form-elements-container.html +14 -14
  36. package/src/partials/gallery-container.html +16 -8
  37. package/src/partials/get-started-container.html +4 -8
  38. package/src/partials/header-container.html +18 -7
  39. package/src/partials/home-container.html +10 -20
  40. package/src/partials/input-group-container.html +11 -2
  41. package/src/partials/kbd-container.html +1 -1
  42. package/src/partials/login-container.html +5 -1
  43. package/src/partials/media-container.html +2 -2
  44. package/src/partials/modals-container.html +22 -32
  45. package/src/partials/pricing-container.html +9 -9
  46. package/src/partials/skeleton-container.html +6 -6
  47. package/src/partials/stepper-container.html +2 -2
  48. package/src/partials/tables-container.html +12 -12
  49. package/src/partials/tabs-container.html +17 -27
  50. package/src/partials/tags-container.html +23 -17
  51. package/src/partials/techstack-bucket-container.html +13 -0
  52. package/src/partials/tiles-container.html +26 -9
  53. package/src/partials/typography-container.html +7 -6
  54. package/src/partials/utilities-container.html +35 -15
  55. package/src/scss/_layers.scss +10 -0
  56. package/src/scss/abstracts/_index.scss +6 -0
  57. package/src/scss/abstracts/_mixins.scss +61 -153
  58. package/src/scss/abstracts/_variables.scss +123 -319
  59. package/src/scss/base/_base.scss +170 -190
  60. package/src/scss/base/_reset.scss +106 -104
  61. package/src/scss/base/_typography.scss +153 -151
  62. package/src/scss/components/_accordions.scss +97 -97
  63. package/src/scss/components/_alerts.scss +71 -70
  64. package/src/scss/components/_announcement.scss +71 -70
  65. package/src/scss/components/_avatars.scss +130 -142
  66. package/src/scss/components/_badge.scss +131 -132
  67. package/src/scss/components/_blog-post.scss +223 -220
  68. package/src/scss/components/_breadcrumbs.scss +93 -92
  69. package/src/scss/components/_button-bar.scss +102 -110
  70. package/src/scss/components/_buttons.scss +319 -324
  71. package/src/scss/components/_calendar.scss +251 -252
  72. package/src/scss/components/_cards.scss +359 -386
  73. package/src/scss/components/_code.scss +190 -194
  74. package/src/scss/components/_coming-soon.scss +77 -75
  75. package/src/scss/components/_content-slider.scss +90 -89
  76. package/src/scss/components/_divider.scss +55 -53
  77. package/src/scss/components/_dropdown.scss +179 -185
  78. package/src/scss/components/_empty-state.scss +57 -57
  79. package/src/scss/components/_flag.scss +294 -278
  80. package/src/scss/components/_gallery.scss +131 -133
  81. package/src/scss/components/_info.scss +151 -167
  82. package/src/scss/components/_kanban.scss +332 -341
  83. package/src/scss/components/_kbd.scss +40 -38
  84. package/src/scss/components/_lang-switch.scss +89 -97
  85. package/src/scss/components/_links.scss +21 -28
  86. package/src/scss/components/_lists.scss +510 -514
  87. package/src/scss/components/_localhost-indicator.scss +26 -24
  88. package/src/scss/components/_media.scss +22 -20
  89. package/src/scss/components/_meta-info.scss +35 -33
  90. package/src/scss/components/_modals.scss +277 -186
  91. package/src/scss/components/_pagination.scss +81 -87
  92. package/src/scss/components/_panels.scss +99 -97
  93. package/src/scss/components/_pricing.scss +183 -241
  94. package/src/scss/components/_progress.scss +112 -89
  95. package/src/scss/components/_prose.scss +35 -33
  96. package/src/scss/components/_ratings.scss +40 -38
  97. package/src/scss/components/_segmented.scss +82 -84
  98. package/src/scss/components/_skeleton.scss +66 -72
  99. package/src/scss/components/_spinners.scss +155 -159
  100. package/src/scss/components/_stepper.scss +116 -116
  101. package/src/scss/components/_tables.scss +155 -148
  102. package/src/scss/components/_tabs.scss +232 -141
  103. package/src/scss/components/_tags.scss +109 -107
  104. package/src/scss/components/_techstack-bucket.scss +123 -122
  105. package/src/scss/components/_testimonial.scss +72 -70
  106. package/src/scss/components/_theme-toggle.scss +53 -51
  107. package/src/scss/components/_tiles.scss +174 -174
  108. package/src/scss/components/_timelines.scss +282 -280
  109. package/src/scss/components/_toasts.scss +66 -72
  110. package/src/scss/form-elements/_checkbox.scss +117 -132
  111. package/src/scss/form-elements/_form.scss +149 -115
  112. package/src/scss/form-elements/_input-group.scss +99 -103
  113. package/src/scss/form-elements/_input.scss +74 -74
  114. package/src/scss/form-elements/_login.scss +48 -48
  115. package/src/scss/form-elements/_prefilled.scss +53 -51
  116. package/src/scss/form-elements/_radio.scss +95 -107
  117. package/src/scss/form-elements/_select.scss +42 -42
  118. package/src/scss/form-elements/_slider.scss +117 -132
  119. package/src/scss/form-elements/_textarea.scss +68 -54
  120. package/src/scss/form-elements/_toggle.scss +127 -140
  121. package/src/scss/layout/_footer.scss +172 -171
  122. package/src/scss/layout/_grid.scss +268 -302
  123. package/src/scss/layout/_header.scss +426 -427
  124. package/src/scss/layout/_home.scss +28 -27
  125. package/src/scss/layout/_main.scss +275 -238
  126. package/src/scss/layout/_page-header.scss +38 -36
  127. package/src/scss/layout/_section.scss +150 -124
  128. package/src/scss/main.scss +1 -1
  129. package/src/scss/utilities/_accessibility.scss +46 -45
  130. package/src/scss/utilities/_aspect.scss +22 -20
  131. package/src/scss/utilities/_corner.scss +23 -5
  132. package/src/scss/utilities/_display.scss +76 -70
  133. package/src/scss/utilities/_elevation.scss +13 -11
  134. package/src/scss/utilities/_flex.scss +83 -85
  135. package/src/scss/utilities/_reveal.scss +40 -63
  136. package/src/scss/utilities/_spacing.scss +63 -64
  137. package/src/scss/utilities/_text.scss +139 -141
  138. package/src/scss/utilities/_touch-targets.scss +130 -147
@@ -1,43 +1,45 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
- // Keyboard key
4
- kbd,
5
- .mw-kbd {
6
- display: inline-flex;
7
- align-items: center;
8
- justify-content: center;
9
- min-width: 1.6em;
10
- padding: 0.15em 0.45em;
11
- border: 1px solid var(--mw-border);
12
- border-bottom-width: 3px;
13
- border-radius: radius('xs');
14
- background: var(--mw-surface-muted);
15
- color: var(--mw-text-color);
16
- font-family: var(--mw-font-family-mono);
17
- font-size: 0.85em;
18
- line-height: 1.4;
19
- font-weight: font-weight('medium');
20
- white-space: nowrap;
21
- vertical-align: middle;
22
- position: relative;
23
- top: -1px;
24
- }
3
+ @layer mw.components {
4
+ // Keyboard key
5
+ kbd,
6
+ .mw-kbd {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ min-width: 1.6em;
11
+ padding: 0.15em 0.45em;
12
+ border: 1px solid var(--mw-border);
13
+ border-bottom-width: 3px;
14
+ border-radius: radius('xs');
15
+ background: var(--mw-surface-muted);
16
+ color: var(--mw-text-color);
17
+ font-family: var(--mw-font-family-mono);
18
+ font-size: 0.85em;
19
+ line-height: 1.4;
20
+ font-weight: font-weight('medium');
21
+ white-space: nowrap;
22
+ vertical-align: middle;
23
+ position: relative;
24
+ top: -1px;
25
+ }
25
26
 
26
- // A combination - Ctrl + Shift + P - as one unit, so the pluses between the
27
- // keys are spaced and do not wrap away from what they join
28
- .mw-kbd-group {
29
- display: inline-flex;
30
- align-items: center;
31
- gap: spacing('1');
32
- white-space: nowrap;
33
- color: var(--mw-text-muted-color);
34
- font-size: font-size('sm');
35
- }
27
+ // A combination - Ctrl + Shift + P - as one unit, so the pluses between the
28
+ // keys are spaced and do not wrap away from what they join
29
+ .mw-kbd-group {
30
+ display: inline-flex;
31
+ align-items: center;
32
+ gap: spacing('1');
33
+ white-space: nowrap;
34
+ color: var(--mw-text-muted-color);
35
+ font-size: font-size('sm');
36
+ }
36
37
 
37
- // A key shown mid-press, for a hint that demonstrates rather than lists
38
- .mw-kbd-pressed {
39
- border-bottom-width: 1px;
40
- top: 1px;
41
- background: var(--mw-primary-background);
42
- border-color: var(--mw-primary-color);
38
+ // A key shown mid-press, for a hint that demonstrates rather than lists
39
+ .mw-kbd-pressed {
40
+ border-bottom-width: 1px;
41
+ top: 1px;
42
+ background: var(--mw-primary-background);
43
+ border-color: var(--mw-primary-color);
44
+ }
43
45
  }
@@ -1,116 +1,108 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
- // ---------------------------------------------------------------------------
4
- // Language switcher
5
- //
6
- // A `.mw-dropdown` underneath, so the keyboard contract, Escape, click-outside
7
- // and the open state in the DOM are all inherited rather than rebuilt. What
8
- // this file adds is the trigger - deliberately not a button shape: no fill, no
9
- // border until it is touched, so the bar reads as logo, links, and then two
10
- // quiet controls rather than a row of competing buttons.
11
- //
12
- // The two-letter code, not the flag, is what says which language is on. A flag
13
- // is a country and never a language - which one stands for English, and which
14
- // for the German a Swiss or Austrian visitor reads? The code carries the
15
- // meaning and the flag is the thing the eye finds first.
16
- // ---------------------------------------------------------------------------
3
+ @layer mw.components {
4
+ // A .mw-dropdown underneath, so the keyboard contract is inherited rather than
5
+ // rebuilt. This adds the trigger, deliberately not a button shape - the bar
6
+ // reads as logo, links and two quiet controls, not a row of buttons.
7
+ //
8
+ // The two-letter code says which language is on, not the flag: a flag is a
9
+ // country, and neither English nor the German a Swiss visitor reads has one.
17
10
 
18
- .mw-lang-switch {
19
- > summary {
20
- display: inline-flex;
21
- align-items: center;
22
- gap: spacing('3');
23
- height: 36px;
24
- padding: spacing('0') spacing('3');
25
- border: 1px solid transparent;
26
- border-radius: radius('2xl');
27
- background: transparent;
28
- color: var(--mw-text-color);
29
- transition: var(--mw-transition);
30
- @include tappable;
31
- @include focus-ring;
32
- }
11
+ .mw-lang-switch {
12
+ > summary {
13
+ display: inline-flex;
14
+ align-items: center;
15
+ gap: spacing('3');
16
+ height: 36px;
17
+ padding: spacing('0') spacing('3');
18
+ border: 1px solid transparent;
19
+ border-radius: radius('2xl');
20
+ background: transparent;
21
+ color: var(--mw-text-color);
22
+ transition: var(--mw-transition);
23
+ @include tappable;
24
+ @include focus-ring;
25
+ }
33
26
 
34
- // Open looks the same as hovered - the menu below is what says it is open
35
- > summary:hover,
36
- &[open] > summary {
37
- background: var(--mw-surface-muted);
38
- border-color: var(--mw-border);
27
+ // Open looks the same as hovered - the menu below is what says it is open
28
+ > summary:hover,
29
+ &[open] > summary {
30
+ background: var(--mw-surface-muted);
31
+ border-color: var(--mw-border);
32
+ }
39
33
  }
40
- }
41
34
 
42
- // The code carries the state, so it is the one part that gets full ink
43
- .mw-lang-switch-code {
44
- font-size: font-size('xs');
45
- font-weight: font-weight('bold');
46
- letter-spacing: 0.08em;
47
- text-transform: uppercase;
48
- line-height: 1;
49
- }
35
+ // The code carries the state, so it is the one part that gets full ink
36
+ .mw-lang-switch-code {
37
+ font-size: font-size('xs');
38
+ font-weight: font-weight('bold');
39
+ letter-spacing: 0.08em;
40
+ text-transform: uppercase;
41
+ line-height: 1;
42
+ }
50
43
 
51
- .mw-lang-switch .mw-dropdown-caret {
52
- font-size: font-size('3xs');
53
- opacity: 0.6;
54
- }
44
+ .mw-lang-switch .mw-dropdown-caret {
45
+ font-size: font-size('3xs');
46
+ opacity: 0.6;
47
+ }
55
48
 
56
- // A language list is short and its labels are one word - the 200px default
57
- // menu leaves half of it empty. The one place it must not be narrowed is under
58
- // a thumb, where the dropdown widens every menu on purpose.
59
- .mw-lang-switch .mw-dropdown-menu {
60
- min-width: 170px;
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;
61
54
 
62
- @media (pointer: coarse), (max-width: #{breakpoint('sm')}) {
63
- min-width: max(100%, 240px);
55
+ @media (pointer: coarse), (max-width: #{breakpoint('sm')}) {
56
+ min-width: max(100%, 240px);
57
+ }
64
58
  }
65
- }
66
59
 
67
- .mw-lang-switch-name {
68
- flex: 1;
69
- min-width: 0;
70
- white-space: nowrap;
71
- overflow: hidden;
72
- text-overflow: ellipsis;
73
- }
74
-
75
- // The tick is the only mark of the current choice inside the menu - it has to
76
- // stay out of the muted icon column the dropdown gives every other icon.
77
- // Kept in the layout while hidden, so the labels do not shift by a tick's width
78
- // when the choice moves to another row.
79
- .mw-lang-switch .mw-dropdown-item .mw-lang-switch-check {
80
- margin-left: auto;
81
- color: var(--mw-primary-text-color);
82
- visibility: hidden;
83
- }
60
+ .mw-lang-switch-name {
61
+ flex: 1;
62
+ min-width: 0;
63
+ @include truncate;
64
+ }
84
65
 
85
- .mw-lang-switch .mw-dropdown-item.mw-active .mw-lang-switch-check,
86
- .mw-lang-switch .mw-dropdown-item.active .mw-lang-switch-check {
87
- visibility: visible;
88
- }
66
+ // The tick is the only mark of the current choice inside the menu - it has to
67
+ // stay out of the muted icon column the dropdown gives every other icon.
68
+ // Kept in the layout while hidden, so the labels do not shift by a tick's width
69
+ // when the choice moves to another row.
70
+ .mw-lang-switch .mw-dropdown-item .mw-lang-switch-check {
71
+ margin-left: auto;
72
+ color: var(--mw-primary-text-color);
73
+ visibility: hidden;
74
+ }
89
75
 
90
- // In the bar the control sits on the header's own dark surface, which stays
91
- // dark in the light theme too - so it cannot use the page's text and surface
92
- // tokens the way it does anywhere else. The modifier is for the same surface
93
- // reached another way: a project that builds its own bar instead of using
94
- // `.mw-header`, or a dark footer.
95
- .mw-header .mw-lang-switch,
96
- .mw-lang-switch-inverted {
97
- > summary {
98
- color: var(--mw-header-text-color);
76
+ .mw-lang-switch .mw-dropdown-item.mw-active .mw-lang-switch-check,
77
+ .mw-lang-switch .mw-dropdown-item.active .mw-lang-switch-check {
78
+ visibility: visible;
99
79
  }
100
80
 
101
- > summary:hover,
102
- &[open] > summary {
103
- background: var(--mw-header-border);
104
- border-color: var(--mw-header-border);
81
+ // In the bar the control sits on the header's own dark surface, which stays
82
+ // dark in the light theme too - so it cannot use the page's text and surface
83
+ // tokens the way it does anywhere else. The modifier is for the same surface
84
+ // reached another way: a project that builds its own bar instead of using
85
+ // `.mw-header`, or a dark footer.
86
+ .mw-header .mw-lang-switch,
87
+ .mw-lang-switch-inverted {
88
+ > summary {
89
+ color: var(--mw-header-text-color);
90
+ }
91
+
92
+ > summary:hover,
93
+ &[open] > summary {
94
+ background: var(--mw-header-border);
95
+ border-color: var(--mw-header-border);
96
+ }
105
97
  }
106
- }
107
98
 
108
- // 36px is a comfortable target for a mouse and a miss for a finger. The caret
109
- // stays - without it the control reads as a label rather than as something to
110
- // press.
111
- @include media-down('sm') {
112
- .mw-lang-switch > summary {
113
- height: 40px;
114
- gap: spacing('2');
99
+ // 36px is a comfortable target for a mouse and a miss for a finger. The caret
100
+ // stays - without it the control reads as a label rather than as something to
101
+ // press.
102
+ @include media-down('sm') {
103
+ .mw-lang-switch > summary {
104
+ height: 40px;
105
+ gap: spacing('2');
106
+ }
115
107
  }
116
108
  }
@@ -1,35 +1,28 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
- // A link inside a sentence. Same look as `mw-btn-link`, but none of the button:
4
- // no `inline-flex`, no control height. That difference is the whole point -
5
- // `mw-btn` lifts its line to 2.25rem, which is barely visible in a heading and
6
- // glaring in a footer disclaimer, where the line around it is half that.
7
- //
8
- // So: `mw-link` in running text, `mw-btn mw-btn-link` where the link really is
9
- // one of several buttons and has to line up with them.
10
- //
11
- // `font` and the focus ring are spelled out because this also has to work on a
12
- // `<button>` - a "show more" in the middle of a paragraph is a button, and the
13
- // reset hands it the family but not the size. The shorthand carries the line
14
- // height along, which is what makes the button box come out exactly as tall as
15
- // the line it sits in. It stays one unbreakable box either way, since no
16
- // browser lets a `<button>` wrap - use an `<a>` where the label is long enough
17
- // to need it.
18
- .mw-link,
19
- .mw-link-muted {
20
- font: inherit;
3
+ @layer mw.components {
4
+ // mw-link in running text, mw-btn mw-btn-link where it is one of several
5
+ // buttons: mw-btn lifts its line to 2.25rem, which is glaring in a disclaimer.
6
+ //
7
+ // `font` and the focus ring are spelled out because this also has to work on a
8
+ // <button>, which the reset hands the family but not the size. A button never
9
+ // wraps, so use an <a> where the label is long enough to need it.
10
+ .mw-link,
11
+ .mw-link-muted {
12
+ font: inherit;
21
13
 
22
- @include link-look;
23
- @include focus-ring;
24
- }
25
-
26
- .mw-link {
27
- color: var(--mw-primary-text-color);
28
- }
14
+ @include link-look;
15
+ @include focus-ring;
16
+ }
29
17
 
30
- .mw-link-muted {
31
- color: var(--mw-text-muted-color);
32
- &:hover {
18
+ .mw-link {
33
19
  color: var(--mw-primary-text-color);
34
20
  }
21
+
22
+ .mw-link-muted {
23
+ color: var(--mw-text-muted-color);
24
+ &:hover {
25
+ color: var(--mw-primary-text-color);
26
+ }
27
+ }
35
28
  }