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,181 +1,272 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
- .mw-tabs {
4
- display: flex;
5
- flex-direction: column;
6
- width: 100%;
7
-
8
- &-nav {
3
+ @layer mw.components {
4
+ .mw-tabs {
9
5
  display: flex;
10
- border-bottom: 1px solid var(--mw-border-accent);
11
- margin-bottom: spacing('3');
12
- overflow-x: auto;
13
-
14
- // Seven tabs, three of them visible, and nothing saying so - whoever is
15
- // looking for the seventh never finds the page. The hint appears only on
16
- // the side that still has tabs behind it.
17
- @include scroll-hint;
18
-
19
- @include media-down('sm') {
20
- flex-wrap: nowrap;
21
- -webkit-overflow-scrolling: touch;
22
- &::-webkit-scrollbar {
23
- display: none;
6
+ flex-direction: column;
7
+ width: 100%;
8
+
9
+ &-nav {
10
+ display: flex;
11
+ position: relative;
12
+ border-bottom: 1px solid var(--mw-border-accent);
13
+ margin-bottom: spacing('3');
14
+ overflow-x: auto;
15
+
16
+ // Seven tabs, three of them visible, and nothing saying so - whoever is
17
+ // looking for the seventh never finds the page. The hint appears only on
18
+ // the side that still has tabs behind it.
19
+ @include scroll-hint;
20
+
21
+ @include media-down('sm') {
22
+ flex-wrap: nowrap;
23
+ -webkit-overflow-scrolling: touch;
24
+ &::-webkit-scrollbar {
25
+ display: none;
26
+ }
24
27
  }
25
28
  }
26
- }
27
29
 
28
- // Written for a <button>. A tab is the primary navigation of the view it
29
- // sits in, and as a <div> it is not focusable, not reachable by keyboard and
30
- // announces nothing - the one control on the page a keyboard user cannot get
31
- // to. The declarations below clear what comes with a <button>; on a <div>
32
- // they change nothing, so old markup keeps working.
33
- &-nav-item {
34
- appearance: none;
35
- background: none;
36
- border: none;
37
- font: inherit;
38
- padding: spacing('3') spacing('4');
39
- cursor: pointer;
40
- font-weight: font-weight('medium');
41
- color: var(--mw-text-muted-color);
42
- border-bottom: 2px solid transparent;
43
- transition: var(--mw-transition);
44
- white-space: nowrap;
45
- @include tappable;
46
- // Inset: a ring outside the item is clipped by the strip's own scroll
47
- @include focus-ring-inset;
48
-
49
- &:hover {
50
- color: var(--mw-primary-text-color);
51
- }
30
+ // Written for a <button>. A tab is the primary navigation of the view it
31
+ // sits in, and as a <div> it is not focusable, not reachable by keyboard and
32
+ // announces nothing - the one control on the page a keyboard user cannot get
33
+ // to. The declarations below clear what comes with a <button>; on a <div>
34
+ // they change nothing, so old markup keeps working.
35
+ &-nav-item {
36
+ appearance: none;
37
+ background: none;
38
+ border: none;
39
+ font: inherit;
40
+ padding: spacing('3') spacing('4');
41
+ cursor: pointer;
42
+ font-weight: font-weight('medium');
43
+ color: var(--mw-text-muted-color);
44
+ border-bottom: 2px solid transparent;
45
+ transition: var(--mw-transition);
46
+ white-space: nowrap;
47
+ @include tappable;
48
+ // Inset: a ring outside the item is clipped by the strip's own scroll
49
+ @include focus-ring-inset;
52
50
 
53
- &:active {
54
- color: var(--mw-primary-text-color);
55
- transition-duration: var(--mw-duration-instant);
56
- }
51
+ &:hover {
52
+ color: var(--mw-primary-text-color);
53
+ }
57
54
 
58
- &.mw-active,
59
- &.active {
60
- color: var(--mw-primary-text-color);
61
- border-bottom-color: var(--mw-primary-text-color);
55
+ &:active {
56
+ color: var(--mw-primary-text-color);
57
+ transition-duration: var(--mw-duration-instant);
58
+ }
59
+
60
+ @include active() {
61
+ color: var(--mw-primary-text-color);
62
+ border-bottom-color: var(--mw-primary-text-color);
63
+ }
62
64
  }
63
- }
64
65
 
65
- &-content {
66
- flex: 1;
67
- margin-top: spacing('1');
68
- }
66
+ // The active tab is marked by a bar that travels to it rather than appearing
67
+ // under it. Only once the script has measured the strip - the attribute is
68
+ // its signal - so without JavaScript the border above stays the marker and
69
+ // nothing is missing.
70
+ //
71
+ // A 1px bar scaled to width, not a bar whose width is set: scaleX runs on the
72
+ // compositor, `width` relayouts the strip on every frame of the slide.
73
+ &-nav[data-mw-tabs-marker] {
74
+ // Declared with a zero length so the four are real tokens with a resting
75
+ // value rather than four names the stylesheet only ever reads. The script
76
+ // sets them on the element, which outranks this either way.
77
+ --mw-tabs-marker-x: 0;
78
+ --mw-tabs-marker-w: 0;
79
+ --mw-tabs-marker-y: 0;
80
+ --mw-tabs-marker-h: 0;
69
81
 
70
- &-panel {
71
- display: none;
82
+ .mw-tabs-nav-item.mw-active,
83
+ .mw-tabs-nav-item.active {
84
+ border-bottom-color: transparent;
85
+ }
72
86
 
73
- &.mw-active,
74
- &.active {
75
- display: block;
76
- // 1.1s to reveal a tab panel means a second of blank space after every
77
- // click. A panel switch is a state change, not an entrance.
78
- animation: fadeIn var(--mw-duration-base) var(--mw-ease-out);
87
+ &::after {
88
+ content: '';
89
+ position: absolute;
90
+ left: 0;
91
+ bottom: 0;
92
+ width: 1px;
93
+ height: 2px;
94
+ background: var(--mw-primary-text-color);
95
+ transform-origin: left center;
96
+ transform: translateX(var(--mw-tabs-marker-x))
97
+ scaleX(var(--mw-tabs-marker-w));
98
+ transition: transform var(--mw-duration-base) var(--mw-ease-out);
99
+ pointer-events: none;
100
+ }
101
+ }
102
+
103
+ &-content {
104
+ flex: 1;
105
+ margin-top: spacing('1');
79
106
  }
80
- }
81
107
 
82
- // Vertical tabs variant
83
- &-vertical {
84
- flex-direction: row;
108
+ &-panel {
109
+ display: none;
85
110
 
86
- @include media-down('sm') {
87
- flex-direction: column;
88
- display: block;
111
+ @include active() {
112
+ display: block;
113
+ // 1.1s to reveal a tab panel means a second of blank space after every
114
+ // click. A panel switch is a state change, not an entrance.
115
+ animation: fadeIn var(--mw-duration-base) var(--mw-ease-out);
116
+ }
89
117
  }
90
118
 
91
- .mw-tabs-nav {
92
- flex-direction: column;
93
- border-bottom: none;
94
- border-right: 1px solid var(--mw-border-accent);
95
- margin-bottom: spacing('0');
96
- margin-right: spacing('3');
97
- min-width: 160px;
98
- max-width: 200px;
99
- // Stacked, so nothing scrolls sideways and the hint would be a lie
100
- background-image: none;
119
+ // Vertical tabs variant
120
+ &-vertical {
121
+ flex-direction: row;
101
122
 
102
123
  @include media-down('sm') {
103
- flex-direction: row;
104
- border-right: none;
105
- border-bottom: 1px solid var(--mw-border-accent);
106
- margin-right: spacing('0');
107
- margin-bottom: spacing('4');
108
- width: 100%;
109
- max-width: 100%;
110
- min-width: 100%;
111
- overflow-x: auto;
112
- display: flex;
113
-
114
- // Horizontal again down here, so it comes back
115
- @include scroll-hint;
124
+ flex-direction: column;
125
+ display: block;
116
126
  }
117
- }
118
127
 
119
- .mw-tabs-nav-item {
120
- border-bottom: none;
121
- border-right: 2px solid transparent;
128
+ .mw-tabs-nav {
129
+ flex-direction: column;
130
+ border-bottom: none;
131
+ border-right: 1px solid var(--mw-border-accent);
132
+ margin-bottom: spacing('0');
133
+ margin-right: spacing('3');
134
+ min-width: 160px;
135
+ max-width: 200px;
136
+ // Stacked, so nothing scrolls sideways and the hint would be a lie
137
+ background-image: none;
122
138
 
123
- &.mw-active,
124
- &.active {
125
- border-right-color: var(--mw-primary-text-color);
139
+ @include media-down('sm') {
140
+ flex-direction: row;
141
+ border-right: none;
142
+ border-bottom: 1px solid var(--mw-border-accent);
143
+ margin-right: spacing('0');
144
+ margin-bottom: spacing('4');
145
+ width: 100%;
146
+ max-width: 100%;
147
+ min-width: 100%;
148
+ overflow-x: auto;
149
+ display: flex;
150
+
151
+ // Horizontal again down here, so it comes back
152
+ @include scroll-hint;
153
+ }
126
154
  }
127
155
 
128
- @include media-down('sm') {
129
- border-right: none;
130
- border-bottom: 2px solid transparent;
131
- flex-shrink: 0;
156
+ .mw-tabs-nav-item {
157
+ border-bottom: none;
158
+ border-right: 2px solid transparent;
159
+
160
+ @include active() {
161
+ border-right-color: var(--mw-primary-text-color);
162
+ }
132
163
 
133
- &.mw-active,
134
- &.active {
164
+ @include media-down('sm') {
165
+ border-right: none;
166
+ border-bottom: 2px solid transparent;
167
+ flex-shrink: 0;
168
+
169
+ @include active() {
170
+ border-right-color: transparent;
171
+ border-bottom-color: var(--mw-primary-text-color);
172
+ }
173
+ }
174
+ }
175
+
176
+ // The bar stands the other way up here, so it travels down the column
177
+ // instead of across. The script measures both axes and leaves the choice
178
+ // to CSS, which is what lets the strip flip back to horizontal below 'sm'
179
+ // without the script knowing that a breakpoint exists.
180
+ .mw-tabs-nav[data-mw-tabs-marker] {
181
+ .mw-tabs-nav-item.mw-active,
182
+ .mw-tabs-nav-item.active {
135
183
  border-right-color: transparent;
136
- border-bottom-color: var(--mw-primary-text-color);
184
+ }
185
+
186
+ &::after {
187
+ left: auto;
188
+ right: -1px;
189
+ top: 0;
190
+ bottom: auto;
191
+ width: 2px;
192
+ height: 1px;
193
+ transform-origin: center top;
194
+ transform: translateY(var(--mw-tabs-marker-y))
195
+ scaleY(var(--mw-tabs-marker-h));
196
+ }
197
+
198
+ @include media-down('sm') {
199
+ .mw-tabs-nav-item.mw-active,
200
+ .mw-tabs-nav-item.active {
201
+ border-bottom-color: transparent;
202
+ }
203
+
204
+ &::after {
205
+ left: 0;
206
+ right: auto;
207
+ top: auto;
208
+ bottom: 0;
209
+ width: 1px;
210
+ height: 2px;
211
+ transform-origin: left center;
212
+ transform: translateX(var(--mw-tabs-marker-x))
213
+ scaleX(var(--mw-tabs-marker-w));
214
+ }
137
215
  }
138
216
  }
139
- }
140
217
 
141
- .mw-tabs-content {
142
- flex: 1;
218
+ .mw-tabs-content {
219
+ flex: 1;
143
220
 
144
- @include media-down('sm') {
145
- width: 100%;
146
- margin-top: spacing('3');
221
+ @include media-down('sm') {
222
+ width: 100%;
223
+ margin-top: spacing('3');
224
+ }
147
225
  }
148
226
  }
149
- }
150
227
 
151
- // Pills variant
152
- &-pills {
153
- .mw-tabs-nav {
154
- border-bottom: none;
155
- gap: spacing('3');
156
- }
228
+ // Pills variant
229
+ &-pills {
230
+ .mw-tabs-nav {
231
+ border-bottom: none;
232
+ gap: spacing('3');
233
+ }
234
+
235
+ // A pill is its own marker: the bar has nothing to do here, and the border
236
+ // it clears elsewhere is a full outline on a pill rather than a marker, so
237
+ // the bottom edge has to come back with it.
238
+ .mw-tabs-nav[data-mw-tabs-marker] {
239
+ &::after {
240
+ display: none;
241
+ }
157
242
 
158
- .mw-tabs-nav-item {
159
- border-radius: radius('xl');
160
- padding: spacing('4') spacing('5');
161
- line-height: 1.2;
162
- border: 1px solid var(--mw-border-accent);
163
- background: var(--mw-card-background);
164
-
165
- &.mw-active,
166
- &.active {
167
- background: var(--mw-primary-color);
168
- color: var(--mw-primary-accent-text-color);
243
+ .mw-tabs-nav-item.mw-active,
244
+ .mw-tabs-nav-item.active {
245
+ border-bottom-color: var(--mw-border-accent);
246
+ }
247
+ }
248
+
249
+ .mw-tabs-nav-item {
250
+ border-radius: radius('xl');
251
+ padding: spacing('4') spacing('5');
252
+ line-height: 1.2;
253
+ border: 1px solid var(--mw-border-accent);
254
+ background: var(--mw-card-background);
255
+
256
+ @include active() {
257
+ background: var(--mw-primary-color);
258
+ color: var(--mw-primary-accent-text-color);
259
+ }
169
260
  }
170
261
  }
171
262
  }
172
- }
173
263
 
174
- @keyframes fadeIn {
175
- from {
176
- opacity: 0;
177
- }
178
- to {
179
- opacity: 1;
264
+ @keyframes fadeIn {
265
+ from {
266
+ opacity: 0;
267
+ }
268
+ to {
269
+ opacity: 1;
270
+ }
180
271
  }
181
272
  }
@@ -1,136 +1,138 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
- // Colour variants
4
- $_mw-tag-colors: (
5
- 'primary': '',
6
- 'secondary': '',
7
- 'success': 'info-',
8
- 'warning': 'info-',
9
- 'danger': 'info-',
10
- 'info': 'info-',
11
- );
12
-
13
- // Container for tag *lists* - carries the colour for all its items
14
- .mw-tags {
15
- display: flex;
16
- flex-wrap: wrap;
17
- gap: spacing('2');
18
- }
3
+ @layer mw.components {
4
+ // Colour variants
5
+ $_mw-tag-colors: (
6
+ 'primary': '',
7
+ 'secondary': '',
8
+ 'success': 'info-',
9
+ 'warning': 'info-',
10
+ 'danger': 'info-',
11
+ 'info': 'info-',
12
+ );
13
+
14
+ // Container for tag *lists* - carries the colour for all its items
15
+ .mw-tags {
16
+ display: flex;
17
+ flex-wrap: wrap;
18
+ gap: spacing('2');
19
+ }
19
20
 
20
- // Visual base, shared by the list item and the standalone tag
21
- %mw-tag-base {
22
- display: inline-flex;
23
- align-items: center;
24
- background: var(--mw-primary-background);
25
- color: var(--mw-text-color);
26
- font-weight: font-weight('medium');
27
- padding: spacing('1') spacing('3');
28
- border-radius: radius('xl');
29
- font-size: font-size('xs');
30
- border: 1px solid var(--mw-border);
31
- transition: var(--mw-transition-fast);
32
- user-select: none;
33
-
34
- &:hover {
35
- background: var(--mw-primary-background-hover);
21
+ // Visual base, shared by the list item and the standalone tag
22
+ %mw-tag-base {
23
+ display: inline-flex;
24
+ align-items: center;
25
+ background: var(--mw-primary-background);
26
+ color: var(--mw-text-color);
27
+ font-weight: font-weight('medium');
28
+ padding: spacing('1') spacing('3');
29
+ border-radius: radius('xl');
30
+ font-size: font-size('xs');
31
+ border: 1px solid var(--mw-border);
32
+ transition: var(--mw-transition-fast);
33
+ user-select: none;
34
+
35
+ &:hover {
36
+ background: var(--mw-primary-background-hover);
37
+ }
36
38
  }
37
- }
38
39
 
39
- // Tag item - inside a `.mw-tags` container
40
- .mw-tags-item {
41
- @extend %mw-tag-base;
40
+ // Tag item - inside a `.mw-tags` container
41
+ .mw-tags-item {
42
+ @extend %mw-tag-base;
42
43
 
43
- // Removable tag styling
44
- &.mw-tags-removable {
45
- padding-right: spacing('1');
44
+ // Removable tag styling
45
+ &.mw-tags-removable {
46
+ padding-right: spacing('1');
47
+ }
46
48
  }
47
- }
48
49
 
49
- // Standalone tag - carries its colour directly, no container needed
50
- .mw-tag {
51
- @extend %mw-tag-base;
52
- }
50
+ // Standalone tag - carries its colour directly, no container needed
51
+ .mw-tag {
52
+ @extend %mw-tag-base;
53
+ }
53
54
 
54
- // Remove button - pure CSS
55
- .mw-tags-remove {
56
- flex-shrink: 0;
57
- margin-left: spacing('3');
55
+ // Remove button - pure CSS
56
+ .mw-tags-remove {
57
+ flex-shrink: 0;
58
+ margin-left: spacing('3');
58
59
 
59
- i,
60
- fa-icon,
61
- svg {
62
- font-size: 0.7rem !important;
60
+ i,
61
+ fa-icon,
62
+ svg {
63
+ font-size: 0.7rem !important;
64
+ }
63
65
  }
64
- }
65
66
 
66
- .mw-tags-icon {
67
- display: inline-flex;
68
- margin-right: spacing('2');
69
- font-size: 0.9rem;
70
- }
67
+ .mw-tags-icon {
68
+ display: inline-flex;
69
+ margin-right: spacing('2');
70
+ font-size: 0.9rem;
71
+ }
71
72
 
72
- // Color variants - generated for the list form and the standalone form
73
- @each $name, $infix in $_mw-tag-colors {
74
- .mw-tags-#{$name} .mw-tags-item,
75
- .mw-tag-#{$name} {
76
- background-color: var(--mw-#{$name}-#{$infix}background);
77
- border-color: var(--mw-#{$name}-color);
73
+ // Color variants - generated for the list form and the standalone form
74
+ @each $name, $infix in $_mw-tag-colors {
75
+ .mw-tags-#{$name} .mw-tags-item,
76
+ .mw-tag-#{$name} {
77
+ background-color: var(--mw-#{$name}-#{$infix}background);
78
+ border-color: var(--mw-#{$name}-color);
78
79
 
79
- &:hover {
80
- background: var(--mw-#{$name}-#{$infix}background-hover);
80
+ &:hover {
81
+ background: var(--mw-#{$name}-#{$infix}background-hover);
82
+ }
81
83
  }
82
84
  }
83
- }
84
-
85
- // Neutral variant for "draft" / "done" states.
86
- .mw-tags-muted .mw-tags-item,
87
- .mw-tag-muted {
88
- background-color: var(--mw-gray-background);
89
- border-color: var(--mw-border);
90
- color: var(--mw-text-muted-color);
91
85
 
92
- &:hover {
86
+ // Neutral variant for "draft" / "done" states.
87
+ .mw-tags-muted .mw-tags-item,
88
+ .mw-tag-muted {
93
89
  background-color: var(--mw-gray-background);
94
- border-color: var(--mw-text-muted-color);
95
- color: var(--mw-text-color);
90
+ border-color: var(--mw-border);
91
+ color: var(--mw-text-muted-color);
92
+
93
+ &:hover {
94
+ background-color: var(--mw-gray-background);
95
+ border-color: var(--mw-text-muted-color);
96
+ color: var(--mw-text-color);
97
+ }
96
98
  }
97
- }
98
99
 
99
- // Neutral variant for plain identifiers - a customer number, a document type,
100
- // a price on a category. `muted` means "steps back", this one means "no
101
- // judgement attached": on an invoice card "XRechnung" is a property, while
102
- // "no e-invoice" is a shortcoming, and the two must not look alike.
103
- .mw-tags-neutral .mw-tags-item,
104
- .mw-tag-neutral {
105
- background-color: var(--mw-surface-muted);
106
- border-color: var(--mw-border);
107
- color: var(--mw-text-color);
108
-
109
- &:hover {
100
+ // Neutral variant for plain identifiers - a customer number, a document type,
101
+ // a price on a category. `muted` means "steps back", this one means "no
102
+ // judgement attached": on an invoice card "XRechnung" is a property, while
103
+ // "no e-invoice" is a shortcoming, and the two must not look alike.
104
+ .mw-tags-neutral .mw-tags-item,
105
+ .mw-tag-neutral {
110
106
  background-color: var(--mw-surface-muted);
111
- border-color: var(--mw-border-accent);
107
+ border-color: var(--mw-border);
108
+ color: var(--mw-text-color);
109
+
110
+ &:hover {
111
+ background-color: var(--mw-surface-muted);
112
+ border-color: var(--mw-border-accent);
113
+ }
112
114
  }
113
- }
114
115
 
115
- // Size variants
116
- // a little more air between the items instead of inside them
117
- .mw-tags-lg {
118
- gap: spacing('3');
119
- }
116
+ // Size variants
117
+ // a little more air between the items instead of inside them
118
+ .mw-tags-lg {
119
+ gap: spacing('3');
120
+ }
120
121
 
121
- .mw-tags-lg .mw-tags-item,
122
- .mw-tag-lg {
123
- font-size: font-size('sm');
124
- padding: spacing('2') spacing('3');
122
+ .mw-tags-lg .mw-tags-item,
123
+ .mw-tag-lg {
124
+ font-size: font-size('sm');
125
+ padding: spacing('2') spacing('3');
125
126
 
126
- .mw-tags-remove {
127
- width: 22px;
128
- height: 22px;
127
+ .mw-tags-remove {
128
+ width: 22px;
129
+ height: 22px;
129
130
 
130
- i,
131
- fa-icon,
132
- svg {
133
- font-size: 0.9rem !important;
131
+ i,
132
+ fa-icon,
133
+ svg {
134
+ font-size: 0.9rem !important;
135
+ }
134
136
  }
135
137
  }
136
138
  }