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.
- package/.claude/settings.local.json +29 -1
- package/.claude/skills/mw-maverick-wave/SKILL.md +39 -24
- package/.claude/skills/mw-maverick-wave/examples/angular-services.md +16 -4
- package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +13 -4
- package/.claude/skills/mw-maverick-wave/references/components.md +42 -5
- package/.claude/skills/mw-maverick-wave/references/forms.md +14 -2
- package/.claude/skills/mw-maverick-wave/references/javascript.md +17 -4
- package/.claude/skills/mw-maverick-wave/references/layout.md +53 -19
- package/.claude/skills/mw-maverick-wave/references/theming.md +38 -1
- package/.impeccable/config.local.json +5 -0
- package/.impeccable/hook.cache.json +1 -0
- package/CHANGELOG.md +11 -0
- package/CLAUDE.md +5 -5
- package/README.md +48 -4
- package/index.html +19 -38
- package/maverick-wave.min.css +14 -12
- package/maverick-wave.min.js +1 -1
- package/package.json +2 -2
- package/scripts/verify.js +27 -2
- package/src/js/main.js +223 -83
- package/src/partials/accordions-container.html +6 -10
- package/src/partials/alerts-container.html +6 -6
- package/src/partials/announcement-container.html +5 -5
- package/src/partials/avatars-container.html +85 -17
- package/src/partials/badges-container.html +6 -6
- package/src/partials/blog-posts-container.html +11 -12
- package/src/partials/buttons-container.html +3 -3
- package/src/partials/cards-container.html +26 -9
- package/src/partials/code-container.html +5 -5
- package/src/partials/content-slider-container.html +5 -4
- package/src/partials/divider-container.html +7 -7
- package/src/partials/dropdown-container.html +2 -2
- package/src/partials/empty-state-container.html +5 -5
- package/src/partials/footer-container.html +21 -18
- package/src/partials/form-elements-container.html +14 -14
- package/src/partials/gallery-container.html +16 -8
- package/src/partials/get-started-container.html +4 -8
- package/src/partials/header-container.html +18 -7
- package/src/partials/home-container.html +10 -20
- package/src/partials/input-group-container.html +11 -2
- package/src/partials/kbd-container.html +1 -1
- package/src/partials/login-container.html +5 -1
- package/src/partials/media-container.html +2 -2
- package/src/partials/modals-container.html +22 -32
- package/src/partials/pricing-container.html +9 -9
- package/src/partials/skeleton-container.html +6 -6
- package/src/partials/stepper-container.html +2 -2
- package/src/partials/tables-container.html +12 -12
- package/src/partials/tabs-container.html +17 -27
- package/src/partials/tags-container.html +23 -17
- package/src/partials/techstack-bucket-container.html +13 -0
- package/src/partials/tiles-container.html +26 -9
- package/src/partials/typography-container.html +7 -6
- package/src/partials/utilities-container.html +35 -15
- package/src/scss/_layers.scss +10 -0
- package/src/scss/abstracts/_index.scss +6 -0
- package/src/scss/abstracts/_mixins.scss +61 -153
- package/src/scss/abstracts/_variables.scss +123 -319
- package/src/scss/base/_base.scss +170 -190
- package/src/scss/base/_reset.scss +106 -104
- package/src/scss/base/_typography.scss +153 -151
- package/src/scss/components/_accordions.scss +97 -97
- package/src/scss/components/_alerts.scss +71 -70
- package/src/scss/components/_announcement.scss +71 -70
- package/src/scss/components/_avatars.scss +130 -142
- package/src/scss/components/_badge.scss +131 -132
- package/src/scss/components/_blog-post.scss +223 -220
- package/src/scss/components/_breadcrumbs.scss +93 -92
- package/src/scss/components/_button-bar.scss +102 -110
- package/src/scss/components/_buttons.scss +319 -324
- package/src/scss/components/_calendar.scss +251 -252
- package/src/scss/components/_cards.scss +359 -386
- package/src/scss/components/_code.scss +190 -194
- package/src/scss/components/_coming-soon.scss +77 -75
- package/src/scss/components/_content-slider.scss +90 -89
- package/src/scss/components/_divider.scss +55 -53
- package/src/scss/components/_dropdown.scss +179 -185
- package/src/scss/components/_empty-state.scss +57 -57
- package/src/scss/components/_flag.scss +294 -278
- package/src/scss/components/_gallery.scss +131 -133
- package/src/scss/components/_info.scss +151 -167
- package/src/scss/components/_kanban.scss +332 -341
- package/src/scss/components/_kbd.scss +40 -38
- package/src/scss/components/_lang-switch.scss +89 -97
- package/src/scss/components/_links.scss +21 -28
- package/src/scss/components/_lists.scss +510 -514
- package/src/scss/components/_localhost-indicator.scss +26 -24
- package/src/scss/components/_media.scss +22 -20
- package/src/scss/components/_meta-info.scss +35 -33
- package/src/scss/components/_modals.scss +277 -186
- package/src/scss/components/_pagination.scss +81 -87
- package/src/scss/components/_panels.scss +99 -97
- package/src/scss/components/_pricing.scss +183 -241
- package/src/scss/components/_progress.scss +112 -89
- package/src/scss/components/_prose.scss +35 -33
- package/src/scss/components/_ratings.scss +40 -38
- package/src/scss/components/_segmented.scss +82 -84
- package/src/scss/components/_skeleton.scss +66 -72
- package/src/scss/components/_spinners.scss +155 -159
- package/src/scss/components/_stepper.scss +116 -116
- package/src/scss/components/_tables.scss +155 -148
- package/src/scss/components/_tabs.scss +232 -141
- package/src/scss/components/_tags.scss +109 -107
- package/src/scss/components/_techstack-bucket.scss +123 -122
- package/src/scss/components/_testimonial.scss +72 -70
- package/src/scss/components/_theme-toggle.scss +53 -51
- package/src/scss/components/_tiles.scss +174 -174
- package/src/scss/components/_timelines.scss +282 -280
- package/src/scss/components/_toasts.scss +66 -72
- package/src/scss/form-elements/_checkbox.scss +117 -132
- package/src/scss/form-elements/_form.scss +149 -115
- package/src/scss/form-elements/_input-group.scss +99 -103
- package/src/scss/form-elements/_input.scss +74 -74
- package/src/scss/form-elements/_login.scss +48 -48
- package/src/scss/form-elements/_prefilled.scss +53 -51
- package/src/scss/form-elements/_radio.scss +95 -107
- package/src/scss/form-elements/_select.scss +42 -42
- package/src/scss/form-elements/_slider.scss +117 -132
- package/src/scss/form-elements/_textarea.scss +68 -54
- package/src/scss/form-elements/_toggle.scss +127 -140
- package/src/scss/layout/_footer.scss +172 -171
- package/src/scss/layout/_grid.scss +268 -302
- package/src/scss/layout/_header.scss +426 -427
- package/src/scss/layout/_home.scss +28 -27
- package/src/scss/layout/_main.scss +275 -238
- package/src/scss/layout/_page-header.scss +38 -36
- package/src/scss/layout/_section.scss +150 -124
- package/src/scss/main.scss +1 -1
- package/src/scss/utilities/_accessibility.scss +46 -45
- package/src/scss/utilities/_aspect.scss +22 -20
- package/src/scss/utilities/_corner.scss +23 -5
- package/src/scss/utilities/_display.scss +76 -70
- package/src/scss/utilities/_elevation.scss +13 -11
- package/src/scss/utilities/_flex.scss +83 -85
- package/src/scss/utilities/_reveal.scss +40 -63
- package/src/scss/utilities/_spacing.scss +63 -64
- package/src/scss/utilities/_text.scss +139 -141
- package/src/scss/utilities/_touch-targets.scss +130 -147
|
@@ -1,181 +1,272 @@
|
|
|
1
1
|
@use '../abstracts' as *;
|
|
2
2
|
|
|
3
|
-
.
|
|
4
|
-
|
|
5
|
-
flex-direction: column;
|
|
6
|
-
width: 100%;
|
|
7
|
-
|
|
8
|
-
&-nav {
|
|
3
|
+
@layer mw.components {
|
|
4
|
+
.mw-tabs {
|
|
9
5
|
display: flex;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
51
|
+
&:hover {
|
|
52
|
+
color: var(--mw-primary-text-color);
|
|
53
|
+
}
|
|
57
54
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
71
|
-
|
|
82
|
+
.mw-tabs-nav-item.mw-active,
|
|
83
|
+
.mw-tabs-nav-item.active {
|
|
84
|
+
border-bottom-color: transparent;
|
|
85
|
+
}
|
|
72
86
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
flex-direction: row;
|
|
108
|
+
&-panel {
|
|
109
|
+
display: none;
|
|
85
110
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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:
|
|
104
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
129
|
-
border-
|
|
130
|
-
border-
|
|
131
|
-
|
|
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
|
-
|
|
134
|
-
|
|
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
|
-
|
|
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
|
-
|
|
142
|
-
|
|
218
|
+
.mw-tabs-content {
|
|
219
|
+
flex: 1;
|
|
143
220
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
221
|
+
@include media-down('sm') {
|
|
222
|
+
width: 100%;
|
|
223
|
+
margin-top: spacing('3');
|
|
224
|
+
}
|
|
147
225
|
}
|
|
148
226
|
}
|
|
149
|
-
}
|
|
150
227
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
40
|
+
// Tag item - inside a `.mw-tags` container
|
|
41
|
+
.mw-tags-item {
|
|
42
|
+
@extend %mw-tag-base;
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
|
|
55
|
+
// Remove button - pure CSS
|
|
56
|
+
.mw-tags-remove {
|
|
57
|
+
flex-shrink: 0;
|
|
58
|
+
margin-left: spacing('3');
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
i,
|
|
61
|
+
fa-icon,
|
|
62
|
+
svg {
|
|
63
|
+
font-size: 0.7rem !important;
|
|
64
|
+
}
|
|
63
65
|
}
|
|
64
|
-
}
|
|
65
66
|
|
|
66
|
-
.mw-tags-icon {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
80
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
124
|
-
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
.mw-tags-remove {
|
|
128
|
+
width: 22px;
|
|
129
|
+
height: 22px;
|
|
129
130
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
i,
|
|
132
|
+
fa-icon,
|
|
133
|
+
svg {
|
|
134
|
+
font-size: 0.9rem !important;
|
|
135
|
+
}
|
|
134
136
|
}
|
|
135
137
|
}
|
|
136
138
|
}
|