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,148 +1,182 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
- .mw-form {
4
- display: flex;
5
- flex-direction: column;
6
- gap: spacing('4');
7
- width: 100%;
8
-
9
- &-inline {
10
- flex-direction: row;
11
- align-items: center;
12
- gap: spacing('4');
13
- }
14
-
15
- &-group {
3
+ @layer mw.components {
4
+ .mw-form {
16
5
  display: flex;
17
6
  flex-direction: column;
18
- padding: spacing('4');
19
- gap: spacing('2');
20
- border-radius: radius('sm');
21
- border: 2px solid var(--mw-border);
22
-
23
- // Explicit hook for the heading, mirrors mw-modal-title
24
- &-title {
25
- font-size: font-size('md');
26
- font-weight: font-weight('bold');
27
- color: var(--mw-text-color);
28
- line-height: 1.2;
29
- margin: spacing('0') spacing('0') spacing('1') spacing('0');
30
- }
31
- }
7
+ gap: spacing('4');
8
+ width: 100%;
32
9
 
33
- label {
34
- font-size: font-size('base');
35
- span {
36
- margin-bottom: spacing('1');
10
+ &-inline {
11
+ flex-direction: row;
12
+ align-items: center;
13
+ gap: spacing('4');
37
14
  }
38
- }
39
15
 
40
- &-actions {
41
- display: flex;
42
- flex-wrap: wrap;
43
- gap: spacing('3');
44
- margin-top: spacing('5');
45
- justify-content: flex-end;
46
- position: relative;
47
- text-align: right;
48
-
49
- // The note above the buttons is `.mw-actions-note` (see _buttons.scss), so
50
- // it looks the same in a form, a modal, a panel and a card. Only its
51
- // alignment is the form's business, because a form row can be re-aligned.
52
-
53
- // full-width stacked
54
- &-full-width {
16
+ &-group {
17
+ display: flex;
55
18
  flex-direction: column;
19
+ padding: spacing('4');
20
+ gap: spacing('2');
21
+ border-radius: radius('sm');
22
+ border: 2px solid var(--mw-border);
23
+
24
+ &-title {
25
+ font-size: font-size('md');
26
+ font-weight: font-weight('bold');
27
+ color: var(--mw-text-color);
28
+ line-height: 1.2;
29
+ margin: spacing('0') spacing('0') spacing('1') spacing('0');
30
+ }
31
+ }
56
32
 
57
- &:has(.mw-actions-note),
58
- &:has(.mw-form-actions-hint) {
59
- flex-wrap: nowrap;
33
+ label {
34
+ font-size: font-size('base');
35
+ span {
36
+ margin-bottom: spacing('1');
60
37
  }
38
+ }
61
39
 
62
- .mw-actions-note,
63
- .mw-form-actions-hint {
64
- flex: 0 0 auto;
65
- text-align: left;
40
+ &-actions {
41
+ display: flex;
42
+ flex-wrap: wrap;
43
+ gap: spacing('3');
44
+ margin-top: spacing('5');
45
+ justify-content: flex-end;
46
+ position: relative;
47
+ text-align: right;
48
+
49
+ // The note above the buttons is `.mw-actions-note` (see _buttons.scss), so
50
+ // it looks the same in a form, a modal, a panel and a card. Only its
51
+ // alignment is the form's business, because a form row can be re-aligned.
52
+
53
+ &-full-width {
54
+ flex-direction: column;
55
+
56
+ &:has(.mw-actions-note),
57
+ &:has(.mw-form-actions-hint) {
58
+ flex-wrap: nowrap;
59
+ }
60
+
61
+ .mw-actions-note,
62
+ .mw-form-actions-hint {
63
+ flex: 0 0 auto;
64
+ text-align: left;
65
+ }
66
+
67
+ > * {
68
+ width: 100%;
69
+ }
66
70
  }
67
71
 
68
- > * {
69
- width: 100%;
72
+ &-center {
73
+ justify-content: center;
74
+ text-align: center;
75
+
76
+ .mw-actions-note,
77
+ .mw-form-actions-hint {
78
+ text-align: center;
79
+ }
70
80
  }
71
- }
72
81
 
73
- &-center {
74
- justify-content: center;
75
- text-align: center;
82
+ &-left {
83
+ justify-content: flex-start;
84
+ text-align: left;
76
85
 
77
- .mw-actions-note,
78
- .mw-form-actions-hint {
79
- text-align: center;
86
+ .mw-actions-note,
87
+ .mw-form-actions-hint {
88
+ text-align: left;
89
+ }
80
90
  }
81
91
  }
82
92
 
83
- &-left {
84
- justify-content: flex-start;
85
- text-align: left;
93
+ &-element-error {
94
+ border: 3px solid var(--mw-danger-color);
86
95
 
87
- .mw-actions-note,
88
- .mw-form-actions-hint {
89
- text-align: left;
96
+ // A field brings its own padding, a checkbox or radio group is a bare flex
97
+ // container - without this its rows sit flush against the 3px border
98
+ &.mw-checkbox-group,
99
+ &.mw-radio-group {
100
+ padding: spacing('4');
101
+ border-radius: radius('sm');
90
102
  }
91
103
  }
92
104
  }
93
105
 
94
- &-element-error {
95
- border: 3px solid var(--mw-danger-color);
96
- }
97
- }
106
+ // ===== Form Field - label + input + hint + error as a unit =====
107
+ // Designed e.g. for Angular reactive forms pattern:
108
+ // <div class="mw-field">
109
+ // <label class="mw-field-label mw-required">Email</label>
110
+ // <input class="mw-input" formControlName="email">
111
+ // <span class="mw-field-hint">We'll never share your email</span>
112
+ // <span class="mw-field-error">Please enter a valid email</span>
113
+ // </div>
114
+ .mw-field {
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: spacing('2');
98
118
 
99
- // ===== Form Field - label + input + hint + error as a unit =====
100
- // Designed e.g. for Angular reactive forms pattern:
101
- // <div class="mw-field">
102
- // <label class="mw-field-label mw-required">Email</label>
103
- // <input class="mw-input" formControlName="email">
104
- // <span class="mw-field-hint">We'll never share your email</span>
105
- // <span class="mw-field-error">Please enter a valid email</span>
106
- // </div>
107
- .mw-field {
108
- display: flex;
109
- flex-direction: column;
110
- gap: spacing('2');
111
-
112
- &-label {
113
- font-size: font-size('base');
114
- font-weight: font-weight('medium');
115
- color: var(--mw-text-color);
116
- }
119
+ &-label {
120
+ font-size: font-size('base');
121
+ font-weight: font-weight('medium');
122
+ color: var(--mw-text-color);
123
+ }
117
124
 
118
- // Required field asterisk - add class mw-required or attribute data-required
119
- &-label.mw-required::after,
120
- &-label[data-required='true']::after {
121
- content: ' *';
122
- color: var(--mw-danger-text-color);
123
- font-weight: font-weight('bold');
124
- }
125
+ // Required field asterisk. The two explicit spellings stay for a label that
126
+ // is not next to its control - an Angular form where the validator lives in
127
+ // the component and the input carries no `required` attribute at all.
128
+ //
129
+ // The third selector is for the markup that does say so: a label directly in
130
+ // front of a required control gets the asterisk without anyone having to
131
+ // remember the class, and it cannot drift out of step with the validation,
132
+ // because it *is* the validation.
133
+ &-label.mw-required::after,
134
+ &-label[data-required='true']::after,
135
+ &-label:has(
136
+ + .mw-input:required,
137
+ + .mw-select:required,
138
+ + .mw-textarea:required
139
+ )::after {
140
+ content: ' *';
141
+ color: var(--mw-danger-text-color);
142
+ font-weight: font-weight('bold');
143
+ }
144
+
145
+ &-hint {
146
+ font-size: font-size('xs');
147
+ color: var(--mw-text-muted-color);
148
+ }
125
149
 
126
- &-hint {
127
- font-size: font-size('xs');
128
- color: var(--mw-text-muted-color);
150
+ &-error {
151
+ font-size: font-size('xs');
152
+ color: var(--mw-danger-text-color);
153
+ display: flex;
154
+ align-items: center;
155
+ gap: spacing('1');
156
+ }
157
+
158
+ &.mw-field-has-error {
159
+ .mw-input,
160
+ .mw-select,
161
+ .mw-textarea {
162
+ border-color: var(--mw-danger-color);
163
+ @include focus-halo('danger-text-color');
164
+ }
165
+ }
129
166
  }
130
167
 
131
- &-error {
132
- font-size: font-size('xs');
133
- color: var(--mw-danger-text-color);
134
- display: flex;
135
- align-items: center;
136
- gap: spacing('1');
168
+ // The same look from the browser's own validation, so nothing has to toggle
169
+ // mw-field-has-error. `:user-invalid` and never `:invalid`, which is true from
170
+ // page load and would mark an empty required field before anyone typed.
171
+ // The class stays authoritative for a validator that lives in the application.
172
+ .mw-input:user-invalid,
173
+ .mw-select:user-invalid,
174
+ .mw-textarea:user-invalid {
175
+ border-color: var(--mw-danger-color);
176
+ @include focus-halo('danger-text-color');
137
177
  }
138
178
 
139
- // When the field itself is in error state
140
- &.mw-field-has-error {
141
- .mw-input,
142
- .mw-select,
143
- .mw-textarea {
144
- border-color: var(--mw-danger-color);
145
- @include focus-halo('danger-text-color');
146
- }
179
+ .mw-field:has(> :user-invalid) > .mw-field-hint {
180
+ color: var(--mw-danger-text-color);
147
181
  }
148
182
  }
@@ -1,132 +1,128 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
- // Input with prefix and/or suffix (icon, text, button)
4
- .mw-input-group {
5
- display: flex;
6
- align-items: stretch;
7
- width: 100%;
8
-
9
- // Shared styles for prefix and suffix
10
- .mw-input-group-prefix,
11
- .mw-input-group-suffix {
3
+ @layer mw.components {
4
+ .mw-input-group {
12
5
  display: flex;
13
- align-items: center;
14
- justify-content: center;
15
- padding: spacing('2') spacing('3');
16
- background: var(--mw-gray-background);
17
- border: 2px solid var(--mw-border);
18
- color: var(--mw-text-muted-color);
19
- font-size: font-size('xs');
20
- white-space: nowrap;
21
- flex-shrink: 0;
22
- transition: var(--mw-transition);
23
- line-height: 1;
24
- cursor: default;
25
- }
26
-
27
- .mw-input-group-prefix {
28
- border-right: none;
29
- border-radius: radius('sm') 0 0 radius('sm');
30
- }
31
-
32
- .mw-input-group-suffix {
33
- border-left: none;
34
- border-radius: 0 radius('sm') radius('sm') 0;
35
- }
6
+ align-items: stretch;
7
+ width: 100%;
36
8
 
37
- // The input loses its outer rounded corners
38
- .mw-input {
39
- flex: 1;
40
- min-width: 0;
41
- border-radius: 0;
9
+ .mw-input-group-prefix,
10
+ .mw-input-group-suffix {
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ padding: spacing('2') spacing('3');
15
+ background: var(--mw-gray-background);
16
+ border: 2px solid var(--mw-border);
17
+ color: var(--mw-text-muted-color);
18
+ font-size: font-size('xs');
19
+ white-space: nowrap;
20
+ flex-shrink: 0;
21
+ transition: var(--mw-transition);
22
+ line-height: 1;
23
+ cursor: default;
24
+ }
42
25
 
43
- &:first-child {
26
+ .mw-input-group-prefix {
27
+ border-right: none;
44
28
  border-radius: radius('sm') 0 0 radius('sm');
45
29
  }
46
30
 
47
- &:last-child {
31
+ .mw-input-group-suffix {
32
+ border-left: none;
48
33
  border-radius: 0 radius('sm') radius('sm') 0;
49
34
  }
50
35
 
51
- // When input is focused, also highlight adjacent prefix/suffix
52
- &:focus + .mw-input-group-suffix,
53
- &:focus-within ~ .mw-input-group-suffix {
54
- border-color: var(--mw-primary-color);
55
- }
56
- }
57
-
58
- // Highlight prefix/suffix when inner input is focused
59
- &:focus-within {
60
- .mw-input-group-prefix,
61
- .mw-input-group-suffix {
62
- border-color: var(--mw-primary-color);
63
- }
64
- }
36
+ .mw-input {
37
+ flex: 1;
38
+ min-width: 0;
39
+ border-radius: 0;
65
40
 
66
- // The field inside gives its halo up - three boxes each drawing their own
67
- // ring around themselves is not a focused control, it is three focused
68
- // controls - and the group draws one around the whole thing instead. Without
69
- // this the group was the one field on the page whose focus was a border
70
- // colour and nothing else.
71
- .mw-input:focus {
72
- box-shadow: none;
73
- }
41
+ &:first-child {
42
+ border-radius: radius('sm') 0 0 radius('sm');
43
+ }
74
44
 
75
- &:focus-within {
76
- border-radius: radius('sm');
77
- @include focus-halo;
78
- }
45
+ &:last-child {
46
+ border-radius: 0 radius('sm') radius('sm') 0;
47
+ }
79
48
 
80
- // Button as suffix/prefix (e.g. search button, copy button)
81
- .mw-btn {
82
- border-radius: 0;
83
- border: 2px solid var(--mw-border);
84
- flex-shrink: 0;
49
+ &:focus + .mw-input-group-suffix,
50
+ &:focus-within ~ .mw-input-group-suffix {
51
+ border-color: var(--mw-primary-color);
52
+ }
53
+ }
85
54
 
86
- &:first-child {
87
- border-right: none;
88
- border-radius: radius('sm') 0 0 radius('sm');
55
+ &:focus-within {
56
+ .mw-input-group-prefix,
57
+ .mw-input-group-suffix {
58
+ border-color: var(--mw-primary-color);
59
+ }
89
60
  }
90
61
 
91
- &:last-child {
92
- border-left: none;
93
- border-radius: 0 radius('sm') radius('sm') 0;
62
+ // The field inside gives its halo up - three boxes each drawing their own
63
+ // ring around themselves is not a focused control, it is three focused
64
+ // controls - and the group draws one around the whole thing instead. Without
65
+ // this the group was the one field on the page whose focus was a border
66
+ // colour and nothing else.
67
+ .mw-input:focus {
68
+ box-shadow: none;
94
69
  }
95
- }
96
70
 
97
- // Size variants - put on the group, and they reach the field too. They used
98
- // to style only the prefix and suffix, so `mw-input-group-sm` around a plain
99
- // `mw-input` gave a small frame around a full-size field and the modifier
100
- // looked broken unless you also knew to write `mw-input-sm` inside it.
101
- &-sm {
102
- .mw-input-group-prefix,
103
- .mw-input-group-suffix {
104
- padding: spacing('1') spacing('2');
105
- font-size: font-size('xs');
71
+ &:focus-within {
72
+ border-radius: radius('sm');
73
+ @include focus-halo;
106
74
  }
107
75
 
108
- .mw-input,
109
76
  .mw-btn {
110
- min-height: var(--mw-control-height-sm);
111
- font-size: var(--mw-control-font-sm);
112
- padding-block: spacing('1');
77
+ border-radius: 0;
78
+ border: 2px solid var(--mw-border);
79
+ flex-shrink: 0;
80
+
81
+ &:first-child {
82
+ border-right: none;
83
+ border-radius: radius('sm') 0 0 radius('sm');
84
+ }
85
+
86
+ &:last-child {
87
+ border-left: none;
88
+ border-radius: 0 radius('sm') radius('sm') 0;
89
+ }
113
90
  }
114
- }
115
91
 
116
- &-lg {
117
- .mw-input-group-prefix,
118
- .mw-input-group-suffix {
119
- padding: spacing('3') spacing('4');
120
- font-size: font-size('sm');
92
+ // Size variants - put on the group, and they reach the field too. They used
93
+ // to style only the prefix and suffix, so `mw-input-group-sm` around a plain
94
+ // `mw-input` gave a small frame around a full-size field and the modifier
95
+ // looked broken unless you also knew to write `mw-input-sm` inside it.
96
+ &-sm {
97
+ .mw-input-group-prefix,
98
+ .mw-input-group-suffix {
99
+ padding: spacing('1') spacing('2');
100
+ font-size: font-size('xs');
101
+ }
102
+
103
+ .mw-input,
104
+ .mw-btn {
105
+ min-height: var(--mw-control-height-sm);
106
+ font-size: var(--mw-control-font-sm);
107
+ padding-block: spacing('1');
108
+ }
121
109
  }
122
110
 
123
- .mw-input,
124
- .mw-btn {
125
- min-height: var(--mw-control-height-lg);
126
- font-size: var(--mw-control-font-lg);
127
- // A step under the minimum, or the padding wins and the group grows past
128
- // the size step it was asked for - same trap as on the standalone field
129
- padding-block: spacing('2');
111
+ &-lg {
112
+ .mw-input-group-prefix,
113
+ .mw-input-group-suffix {
114
+ padding: spacing('3') spacing('4');
115
+ font-size: font-size('sm');
116
+ }
117
+
118
+ .mw-input,
119
+ .mw-btn {
120
+ min-height: var(--mw-control-height-lg);
121
+ font-size: var(--mw-control-font-lg);
122
+ // A step under the minimum, or the padding wins and the group grows past
123
+ // the size step it was asked for - same trap as on the standalone field
124
+ padding-block: spacing('2');
125
+ }
130
126
  }
131
127
  }
132
128
  }