maverick-wave 3.10.0 → 4.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 (60) hide show
  1. package/.claude/skills/maverick-wave/SKILL.md +62 -30
  2. package/.claude/skills/maverick-wave/examples/angular-form.md +1 -1
  3. package/.claude/skills/maverick-wave/examples/angular-services.md +15 -8
  4. package/.claude/skills/maverick-wave/examples/static-landing-page.md +4 -4
  5. package/.claude/skills/maverick-wave/references/components.md +416 -27
  6. package/.claude/skills/maverick-wave/references/forms.md +8 -4
  7. package/.claude/skills/maverick-wave/references/javascript.md +32 -18
  8. package/.claude/skills/maverick-wave/references/layout.md +48 -3
  9. package/.claude/skills/maverick-wave/references/theming.md +34 -24
  10. package/CHANGELOG.md +56 -0
  11. package/index.html +25 -0
  12. package/maverick-wave.min.css +2 -2
  13. package/maverick-wave.min.js +1 -1
  14. package/package.json +2 -2
  15. package/src/js/main.js +314 -20
  16. package/src/partials/accordions-container.html +2 -2
  17. package/src/partials/button-bar-container.html +4 -2
  18. package/src/partials/buttons-container.html +35 -0
  19. package/src/partials/calendar-container.html +205 -0
  20. package/src/partials/cards-container.html +43 -0
  21. package/src/partials/documentation-container.html +3 -0
  22. package/src/partials/form-container.html +1 -1
  23. package/src/partials/get-started-container.html +2 -2
  24. package/src/partials/kanban-container.html +680 -715
  25. package/src/partials/modals-container.html +5 -5
  26. package/src/partials/pagination-container.html +50 -13
  27. package/src/partials/segmented-container.html +66 -0
  28. package/src/partials/tables-container.html +96 -24
  29. package/src/partials/tabs-container.html +16 -6
  30. package/src/partials/tags-container.html +15 -0
  31. package/src/partials/timelines-container.html +2 -2
  32. package/src/partials/utilities-container.html +81 -0
  33. package/src/scss/abstracts/_mixins.scss +34 -0
  34. package/src/scss/abstracts/_variables.scss +6 -2
  35. package/src/scss/base/_base.scss +21 -0
  36. package/src/scss/components/_accordions.scss +2 -0
  37. package/src/scss/components/_alerts.scss +5 -19
  38. package/src/scss/components/_button-bar.scss +6 -0
  39. package/src/scss/components/_buttons.scss +67 -0
  40. package/src/scss/components/_calendar.scss +290 -0
  41. package/src/scss/components/_content-slider.scss +1 -0
  42. package/src/scss/components/_index.scss +2 -0
  43. package/src/scss/components/_kanban.scss +2 -6
  44. package/src/scss/components/_modals.scss +15 -4
  45. package/src/scss/components/_pagination.scss +68 -64
  46. package/src/scss/components/_segmented.scss +85 -0
  47. package/src/scss/components/_tables.scss +16 -0
  48. package/src/scss/components/_tabs.scss +15 -0
  49. package/src/scss/components/_tags.scss +16 -0
  50. package/src/scss/components/_theme-toggle.scss +2 -0
  51. package/src/scss/components/_timelines.scss +3 -0
  52. package/src/scss/form-elements/_form.scss +13 -7
  53. package/src/scss/layout/_header.scss +3 -0
  54. package/src/scss/layout/_main.scss +5 -1
  55. package/src/scss/layout/_section.scss +1 -1
  56. package/src/scss/utilities/_accessibility.scss +14 -0
  57. package/src/scss/utilities/_flex.scss +17 -0
  58. package/src/scss/utilities/_index.scss +2 -0
  59. package/src/scss/utilities/_text.scss +17 -5
  60. package/src/scss/utilities/_touch-targets.scss +54 -0
@@ -67,7 +67,7 @@
67
67
  </div>
68
68
  <div class="mw-modal-body">
69
69
  <p class="mw-text-muted">
70
- Max-width <strong>550px</strong>. The default size — fits most use
70
+ Max-width <strong>520px</strong>. The default size — fits most use
71
71
  cases.
72
72
  </p>
73
73
  </div>
@@ -100,7 +100,7 @@
100
100
  </div>
101
101
  <div class="mw-modal-body">
102
102
  <p class="mw-text-muted">
103
- Max-width <strong>680px</strong>. More room for richer content or forms.
103
+ Max-width <strong>720px</strong>. More room for richer content or forms.
104
104
  </p>
105
105
  </div>
106
106
  <div class="mw-modal-footer">
@@ -126,7 +126,7 @@
126
126
  </div>
127
127
  <div class="mw-modal-body">
128
128
  <p class="mw-text-muted">
129
- Max-width <strong>900px</strong>. Use for detail views, data tables, or
129
+ Max-width <strong>960px</strong>. Use for detail views, data tables, or
130
130
  complex layouts.
131
131
  </p>
132
132
  </div>
@@ -237,9 +237,9 @@
237
237
  <p class="mw-text-center">
238
238
  <strong>Are you sure you want to delete this item?</strong>
239
239
  </p>
240
- <p class="mw-text-center mw-text-muted">This action cannot be undone.</p>
241
240
  </div>
242
241
  <div class="mw-modal-footer">
242
+ <p class="mw-actions-note">This action cannot be undone.</p>
243
243
  <button
244
244
  onclick="closeModal('modal-confirm')"
245
245
  class="mw-btn mw-btn-outline"
@@ -248,7 +248,7 @@
248
248
  </button>
249
249
  <button
250
250
  onclick="closeModal('modal-confirm')"
251
- class="mw-btn mw-btn-secondary"
251
+ class="mw-btn mw-btn-danger"
252
252
  >
253
253
  Delete
254
254
  </button>
@@ -1,27 +1,64 @@
1
1
  <h3 class="mw-section-subtitle">Simple Pagination</h3>
2
2
  <p class="mw-text-muted">
3
- This is without functionality here - but you can easily use it with vanilla JS
4
- or frameworks like Angular etc.
3
+ The same frame as a calendar - an arrow on each side of the title, content
4
+ below - but the body is yours. Not a page-number list; the paging itself is
5
+ your job, <code>mw-pagination-loading</code> dims the body while the next page
6
+ is on its way.
5
7
  </p>
6
8
 
7
- <div class="mw-pagination" id="weekPagination">
9
+ <div class="mw-pagination mw-my-6" id="weekPagination">
8
10
  <div class="mw-pagination-header">
9
- <button class="mw-pagination-nav" id="prevBtn" onclick="navigateWeek(-1)">
10
- <i class="fas fa-arrow-left"></i>
11
+ <button
12
+ type="button"
13
+ class="mw-btn mw-btn-outline mw-btn-sm mw-pagination-nav"
14
+ data-pagination-nav="-1"
15
+ aria-label="Previous week"
16
+ >
17
+ <i class="fas fa-chevron-left"></i>
11
18
  </button>
12
19
 
13
- <h3 class="mw-pagination-title" id="weekTitle">Week 10</h3>
20
+ <div class="mw-pagination-title" aria-live="polite">Week 10</div>
14
21
 
15
- <button class="mw-pagination-nav" id="nextBtn" onclick="navigateWeek(1)">
16
- <i class="fas fa-arrow-right"></i>
22
+ <button
23
+ type="button"
24
+ class="mw-btn mw-btn-outline mw-btn-sm mw-pagination-nav"
25
+ data-pagination-nav="1"
26
+ aria-label="Next week"
27
+ >
28
+ <i class="fas fa-chevron-right"></i>
17
29
  </button>
18
30
  </div>
19
31
 
20
- <div class="mw-pagination-content" id="weekContent">
21
- <h4>Week 10 Content</h4>
22
- <p>
23
- This is the content for week 10. You can put any content here - text,
24
- forms, images, etc.
32
+ <div class="mw-pagination-content">
33
+ <h4 class="mw-mb-2">Week 10 Content</h4>
34
+ <p class="mw-text-muted">
35
+ Put anything in here - text, a form, a table, a chart. The frame only
36
+ gives it a title and two arrows.
25
37
  </p>
26
38
  </div>
27
39
  </div>
40
+
41
+ <script>
42
+ // Showcase only: the framework ships no pagination JS, this just proves the
43
+ // two arrows are ordinary buttons
44
+ (function () {
45
+ const pager = document.getElementById('weekPagination');
46
+ if (!pager) return;
47
+
48
+ const title = pager.querySelector('.mw-pagination-title');
49
+ const heading = pager.querySelector('.mw-pagination-content h4');
50
+ let week = 10;
51
+
52
+ pager.addEventListener('click', (event) => {
53
+ const nav = event.target.closest('[data-pagination-nav]');
54
+ if (!nav) return;
55
+
56
+ week = Math.min(
57
+ 52,
58
+ Math.max(1, week + Number(nav.dataset.paginationNav))
59
+ );
60
+ title.textContent = 'Week ' + week;
61
+ heading.textContent = 'Week ' + week + ' Content';
62
+ });
63
+ })();
64
+ </script>
@@ -0,0 +1,66 @@
1
+ <h3 class="mw-section-subtitle">Segmented Control</h3>
2
+
3
+ <p class="mw-text-muted mw-mb-6">
4
+ Two or three positions of <em>one</em> switch - income or expense, offer or
5
+ quote. Deliberately not a <strong>mw-button-bar</strong>: that one stacks
6
+ below 576px and gives every button 96% width, which is right for a row of
7
+ independent actions and wrong here. Stacked, two positions of a switch look
8
+ like two buttons you could press both of. A segmented control stays horizontal
9
+ at every width and splits the row into equal shares.
10
+ </p>
11
+
12
+ <div class="mw-grid-2-lg">
13
+ <div>
14
+ <h3 class="mw-mb-4">Two Positions</h3>
15
+ <div class="mw-card mw-card-simple">
16
+ <label class="mw-field-label mw-d-block mw-mb-2">Booking type</label>
17
+ <div class="mw-segmented mw-mb-6">
18
+ <button type="button" class="mw-segmented-item mw-active">
19
+ <i class="fas fa-arrow-down"></i>
20
+ Income
21
+ </button>
22
+ <button type="button" class="mw-segmented-item">
23
+ <i class="fas fa-arrow-up"></i>
24
+ Expense
25
+ </button>
26
+ </div>
27
+
28
+ <label class="mw-field-label mw-d-block mw-mb-2">Document</label>
29
+ <div class="mw-segmented">
30
+ <button type="button" class="mw-segmented-item">Offer</button>
31
+ <button type="button" class="mw-segmented-item mw-active">Quote</button>
32
+ </div>
33
+ </div>
34
+ </div>
35
+
36
+ <div>
37
+ <h3 class="mw-mb-4">Three Positions & Variants</h3>
38
+ <div class="mw-card mw-card-simple">
39
+ <label class="mw-field-label mw-d-block mw-mb-2">Period</label>
40
+ <div class="mw-segmented mw-mb-6">
41
+ <button type="button" class="mw-segmented-item">Day</button>
42
+ <button type="button" class="mw-segmented-item mw-active">Week</button>
43
+ <button type="button" class="mw-segmented-item">Month</button>
44
+ </div>
45
+
46
+ <label class="mw-field-label mw-d-block mw-mb-2">
47
+ Secondary tone &ndash; <code>mw-segmented-secondary</code>
48
+ </label>
49
+ <div class="mw-segmented mw-segmented-secondary mw-mb-6">
50
+ <button type="button" class="mw-segmented-item mw-active">List</button>
51
+ <button type="button" class="mw-segmented-item">Grid</button>
52
+ </div>
53
+
54
+ <label class="mw-field-label mw-d-block mw-mb-2">
55
+ Inline &ndash; <code>mw-segmented-auto</code>
56
+ </label>
57
+ <div class="mw-segmented mw-segmented-auto">
58
+ <button type="button" class="mw-segmented-item mw-active">All</button>
59
+ <button type="button" class="mw-segmented-item">Open</button>
60
+ <button type="button" class="mw-segmented-item" disabled>
61
+ Archived
62
+ </button>
63
+ </div>
64
+ </div>
65
+ </div>
66
+ </div>
@@ -15,7 +15,7 @@
15
15
  <th>Name</th>
16
16
  <th>Position</th>
17
17
  <th>Location</th>
18
- <th class="mw-text-numeric">Budget</th>
18
+ <th class="mw-text-currency">Budget</th>
19
19
  </tr>
20
20
  </thead>
21
21
  <tbody>
@@ -24,31 +24,33 @@
24
24
  <td>John Doe</td>
25
25
  <td>Developer</td>
26
26
  <td>New York</td>
27
- <td class="mw-text-numeric">1,204.50</td>
27
+ <td class="mw-text-currency">1,204.50</td>
28
28
  </tr>
29
29
  <tr>
30
30
  <td>2</td>
31
31
  <td>Jane Smith</td>
32
32
  <td>Designer</td>
33
33
  <td>London</td>
34
- <td class="mw-text-numeric">87.00</td>
34
+ <td class="mw-text-currency">87.00</td>
35
35
  </tr>
36
36
  <tr>
37
37
  <td>3</td>
38
38
  <td>Bob Johnson</td>
39
39
  <td>Manager</td>
40
40
  <td>Berlin</td>
41
- <td class="mw-text-numeric">15,930.25</td>
41
+ <td class="mw-text-currency">15,930.25</td>
42
42
  </tr>
43
43
  </tbody>
44
44
  </table>
45
45
  <p class="mw-text-muted mw-mt-3">
46
46
  The <strong>Budget</strong> column uses
47
- <strong>mw-text-numeric</strong> &ndash; right-aligned with tabular,
48
- lining digits. The alignment comes from the right edge, so it works the
49
- same for <code>1,204.50</code> and <code>1.204,50</code>; only the number
50
- of decimal places has to be consistent per column. For the input side
51
- there is <strong>mw-input-numeric</strong>.
47
+ <strong>mw-text-currency</strong> &ndash; right-aligned with tabular,
48
+ lining digits and no wrapping mid-number. The alignment comes from the
49
+ right edge, so it works the same for <code>1,204.50</code> and
50
+ <code>1.204,50</code>; only the number of decimal places has to be
51
+ consistent per column. If you only want the fixed-width digits without the
52
+ alignment, use <strong>mw-text-numeric</strong>. For the input side there
53
+ is <strong>mw-input-numeric</strong>.
52
54
  </p>
53
55
  </div>
54
56
 
@@ -111,7 +113,7 @@
111
113
  <th>#</th>
112
114
  <th>Name</th>
113
115
  <th>Position</th>
114
- <th class="mw-text-numeric">Budget</th>
116
+ <th class="mw-text-currency">Budget</th>
115
117
  </tr>
116
118
  </thead>
117
119
  <tbody>
@@ -119,91 +121,161 @@
119
121
  <td>1</td>
120
122
  <td>John Doe</td>
121
123
  <td>Developer</td>
122
- <td class="mw-text-numeric">12,400</td>
124
+ <td class="mw-text-currency">12,400</td>
123
125
  </tr>
124
126
  <tr>
125
127
  <td>2</td>
126
128
  <td>Jane Smith</td>
127
129
  <td>Designer</td>
128
- <td class="mw-text-numeric">9,800</td>
130
+ <td class="mw-text-currency">9,800</td>
129
131
  </tr>
130
132
  <tr>
131
133
  <td>3</td>
132
134
  <td>Bob Johnson</td>
133
135
  <td>Manager</td>
134
- <td class="mw-text-numeric">21,050</td>
136
+ <td class="mw-text-currency">21,050</td>
135
137
  </tr>
136
138
  <tr>
137
139
  <td>4</td>
138
140
  <td>Alice Brown</td>
139
141
  <td>Developer</td>
140
- <td class="mw-text-numeric">11,300</td>
142
+ <td class="mw-text-currency">11,300</td>
141
143
  </tr>
142
144
  <tr>
143
145
  <td>5</td>
144
146
  <td>Charlie Davis</td>
145
147
  <td>Analyst</td>
146
- <td class="mw-text-numeric">7,600</td>
148
+ <td class="mw-text-currency">7,600</td>
147
149
  </tr>
148
150
  <tr>
149
151
  <td>6</td>
150
152
  <td>Emma Wilson</td>
151
153
  <td>Designer</td>
152
- <td class="mw-text-numeric">10,150</td>
154
+ <td class="mw-text-currency">10,150</td>
153
155
  </tr>
154
156
  <tr>
155
157
  <td>7</td>
156
158
  <td>Frank Miller</td>
157
159
  <td>Developer</td>
158
- <td class="mw-text-numeric">13,900</td>
160
+ <td class="mw-text-currency">13,900</td>
159
161
  </tr>
160
162
  <tr>
161
163
  <td>8</td>
162
164
  <td>Grace Lee</td>
163
165
  <td>Manager</td>
164
- <td class="mw-text-numeric">19,700</td>
166
+ <td class="mw-text-currency">19,700</td>
165
167
  </tr>
166
168
  <tr>
167
169
  <td>9</td>
168
170
  <td>Henry Clark</td>
169
171
  <td>Analyst</td>
170
- <td class="mw-text-numeric">8,250</td>
172
+ <td class="mw-text-currency">8,250</td>
171
173
  </tr>
172
174
  <tr>
173
175
  <td>10</td>
174
176
  <td>Ivy Turner</td>
175
177
  <td>Developer</td>
176
- <td class="mw-text-numeric">14,600</td>
178
+ <td class="mw-text-currency">14,600</td>
177
179
  </tr>
178
180
  <tr>
179
181
  <td>11</td>
180
182
  <td>Jack Morris</td>
181
183
  <td>Designer</td>
182
- <td class="mw-text-numeric">9,400</td>
184
+ <td class="mw-text-currency">9,400</td>
183
185
  </tr>
184
186
  <tr>
185
187
  <td>12</td>
186
188
  <td>Karen Hall</td>
187
189
  <td>Manager</td>
188
- <td class="mw-text-numeric">22,800</td>
190
+ <td class="mw-text-currency">22,800</td>
189
191
  </tr>
190
192
  <tr>
191
193
  <td>13</td>
192
194
  <td>Liam Scott</td>
193
195
  <td>Developer</td>
194
- <td class="mw-text-numeric">12,950</td>
196
+ <td class="mw-text-currency">12,950</td>
195
197
  </tr>
196
198
  <tr>
197
199
  <td>14</td>
198
200
  <td>Mia Adams</td>
199
201
  <td>Analyst</td>
200
- <td class="mw-text-numeric">7,900</td>
202
+ <td class="mw-text-currency">7,900</td>
201
203
  </tr>
202
204
  </tbody>
203
205
  </table>
204
206
  </div>
205
207
  </div>
206
208
 
209
+ <div class="mw-card mw-card-simple mw-mb-6">
210
+ <h4 class="mw-mb-2">Scroll Hint</h4>
211
+ <p class="mw-text-muted mw-mb-4">
212
+ <strong>mw-table-responsive-hint</strong> fades the right edge, so it is
213
+ visible that more columns are hiding behind it. The wrapper below is
214
+ capped at 520px to force the overflow; normally the viewport does that.
215
+ </p>
216
+
217
+ <div
218
+ class="mw-table-responsive mw-table-responsive-hint"
219
+ style="max-width: 520px"
220
+ >
221
+ <table class="mw-table mw-table-compact">
222
+ <thead>
223
+ <tr>
224
+ <th>Invoice</th>
225
+ <th>Customer</th>
226
+ <th>Issued</th>
227
+ <th>Due</th>
228
+ <th>Status</th>
229
+ <th class="mw-text-currency">Net</th>
230
+ <th class="mw-text-currency">VAT</th>
231
+ <th class="mw-text-currency">Total</th>
232
+ </tr>
233
+ </thead>
234
+ <tbody>
235
+ <tr>
236
+ <td>2026-0042</td>
237
+ <td>Fischer GmbH</td>
238
+ <td>19.08.2026</td>
239
+ <td>19.09.2026</td>
240
+ <td><span class="mw-tag mw-tag-warning">Open</span></td>
241
+ <td class="mw-text-currency">1,012.18</td>
242
+ <td class="mw-text-currency">192.32</td>
243
+ <td class="mw-text-currency">1,204.50</td>
244
+ </tr>
245
+ <tr>
246
+ <td>2026-0041</td>
247
+ <td>Wagner AG</td>
248
+ <td>12.08.2026</td>
249
+ <td>12.09.2026</td>
250
+ <td><span class="mw-tag mw-tag-success">Paid</span></td>
251
+ <td class="mw-text-currency">73.11</td>
252
+ <td class="mw-text-currency">13.89</td>
253
+ <td class="mw-text-currency">87.00</td>
254
+ </tr>
255
+ <tr>
256
+ <td>2026-0040</td>
257
+ <td>Schmidt &amp; Partner</td>
258
+ <td>02.08.2026</td>
259
+ <td>02.09.2026</td>
260
+ <td><span class="mw-tag mw-tag-neutral">XRechnung</span></td>
261
+ <td class="mw-text-currency">13,386.76</td>
262
+ <td class="mw-text-currency">2,543.49</td>
263
+ <td class="mw-text-currency">15,930.25</td>
264
+ </tr>
265
+ </tbody>
266
+ </table>
267
+ </div>
268
+
269
+ <p class="mw-text-muted mw-mt-3">
270
+ Opt-in, unlike the automatic hint on a tab bar, and by a different
271
+ mechanism: a table paints its own opaque surface, so the gradient trick
272
+ used there would sit behind the rows and never show. A mask sits in front
273
+ and does show - but a mask has no <code>local</code> attachment, so it
274
+ cannot fade away once the last column is reached. Put the class on the
275
+ tables you know overflow, leave it off the ones that fit.
276
+ </p>
277
+ </div>
278
+
207
279
  <div class="mw-card mw-card-simple">
208
280
  <h4 class="mw-mb-2">Responsive Table</h4>
209
281
  <p class="mw-text-muted">
@@ -1,15 +1,23 @@
1
1
  <h3 class="mw-section-subtitle">Tabs</h3>
2
+ <p class="mw-text-muted mw-mb-6">
3
+ A tab bar scrolls sideways when it runs out of room, and now it says so: a
4
+ shadow appears on whichever side still has tabs behind it, and disappears once
5
+ that end is reached. Four gradients, no scroll listener. The fade colour comes
6
+ from <code>--mw-scroll-hint-cover</code> and follows the surface - inside a
7
+ card it fades into the card, on the page into the page. Seven tabs on a phone
8
+ used to mean the seventh was simply never found.
9
+ </p>
2
10
 
3
11
  <h3 class="mw-mb-4">Default Tabs</h3>
4
12
  <div class="mw-tabs mw-mb-6">
5
13
  <div class="mw-tabs-nav">
6
- <div class="mw-tabs-nav-item active" data-tab="tab1">Features</div>
14
+ <div class="mw-tabs-nav-item mw-active" data-tab="tab1">Features</div>
7
15
  <div class="mw-tabs-nav-item" data-tab="tab2">Specifications</div>
8
16
  <div class="mw-tabs-nav-item" data-tab="tab3">Reviews</div>
9
17
  <div class="mw-tabs-nav-item" data-tab="tab4">Support</div>
10
18
  </div>
11
19
  <div class="mw-tabs-content">
12
- <div class="mw-tabs-panel active" id="tab1">
20
+ <div class="mw-tabs-panel mw-active" id="tab1">
13
21
  <div class="mw-card mw-card-simple">
14
22
  <h4>Key Features</h4>
15
23
  <p>
@@ -81,13 +89,15 @@
81
89
  <h3 class="mw-mb-4">Vertical Tabs</h3>
82
90
  <div class="mw-tabs mw-tabs-vertical mw-mb-6">
83
91
  <div class="mw-tabs-nav">
84
- <div class="mw-tabs-nav-item active" data-tab="vtab1">Getting Started</div>
92
+ <div class="mw-tabs-nav-item mw-active" data-tab="vtab1">
93
+ Getting Started
94
+ </div>
85
95
  <div class="mw-tabs-nav-item" data-tab="vtab2">Configuration</div>
86
96
  <div class="mw-tabs-nav-item" data-tab="vtab3">Customization</div>
87
97
  <div class="mw-tabs-nav-item" data-tab="vtab4">Best Practices</div>
88
98
  </div>
89
99
  <div class="mw-tabs-content">
90
- <div class="mw-tabs-panel active" id="vtab1">
100
+ <div class="mw-tabs-panel mw-active" id="vtab1">
91
101
  <div class="mw-card mw-card-simple">
92
102
  <h4>Getting Started Guide</h4>
93
103
  <p>Begin by creating a new project folder:</p>
@@ -221,13 +231,13 @@ href="path/maverick-wave.min.css"&gt;</code></pre>
221
231
  <h3 class="mw-mb-4">Pills Style Tabs</h3>
222
232
  <div class="mw-tabs mw-tabs-pills">
223
233
  <div class="mw-tabs-nav">
224
- <div class="mw-tabs-nav-item active" data-tab="ptab1">Dashboard</div>
234
+ <div class="mw-tabs-nav-item mw-active" data-tab="ptab1">Dashboard</div>
225
235
  <div class="mw-tabs-nav-item" data-tab="ptab2">Profile</div>
226
236
  <div class="mw-tabs-nav-item" data-tab="ptab3">Messages</div>
227
237
  <div class="mw-tabs-nav-item" data-tab="ptab4">Settings</div>
228
238
  </div>
229
239
  <div class="mw-tabs-content">
230
- <div class="mw-tabs-panel active" id="ptab1">
240
+ <div class="mw-tabs-panel mw-active" id="ptab1">
231
241
  <div class="mw-card mw-card-simple">
232
242
  <h4>Dashboard Overview</h4>
233
243
  <p>
@@ -210,6 +210,21 @@
210
210
  <span class="mw-tag mw-tag-warning">Open</span>
211
211
  <span class="mw-tag mw-tag-danger">Cancelled</span>
212
212
  <span class="mw-tag mw-tag-muted">Draft</span>
213
+ <span class="mw-tag mw-tag-neutral">XRechnung</span>
214
+ </div>
215
+
216
+ <h5 class="mw-text-medium mw-mb-2">Neutral vs. Muted</h5>
217
+ <p class="mw-text-muted mw-text-sm mw-mb-3">
218
+ <strong>mw-tag-neutral</strong> is a plain identifier - a customer
219
+ number, a document type. <strong>mw-tag-muted</strong> means the label
220
+ steps back. On an invoice the difference carries real meaning:
221
+ &ldquo;XRechnung&rdquo; is a property, &ldquo;no e-invoice&rdquo; is a
222
+ shortcoming.
223
+ </p>
224
+ <div class="mw-d-flex mw-flex-wrap mw-gap-2 mw-mb-4">
225
+ <span class="mw-tag mw-tag-neutral">Customer 4711</span>
226
+ <span class="mw-tag mw-tag-neutral">XRechnung</span>
227
+ <span class="mw-tag mw-tag-muted">No e-invoice</span>
213
228
  </div>
214
229
 
215
230
  <h5 class="mw-text-medium mw-mb-2">Large</h5>
@@ -5,7 +5,7 @@
5
5
  You can use every card within the timeline content wrapper.
6
6
  </p>
7
7
  <div class="mw-timeline-big mw-my-6">
8
- <div class="mw-timeline-big-step active">
8
+ <div class="mw-timeline-big-step mw-active">
9
9
  <div class="mw-timeline-big-date-container">
10
10
  <div class="mw-timeline-big-date-main">01/2023 – Present</div>
11
11
  </div>
@@ -135,7 +135,7 @@
135
135
  </p>
136
136
 
137
137
  <div class="mw-timeline-simple mw-my-5">
138
- <div class="mw-timeline-simple-step active">
138
+ <div class="mw-timeline-simple-step mw-active">
139
139
  <div class="mw-timeline-simple-date">2023-11-10</div>
140
140
  <div class="mw-timeline-simple-content">
141
141
  <div class="mw-card mw-card-simple">
@@ -116,6 +116,87 @@
116
116
  </div>
117
117
  </div>
118
118
 
119
+ <h3 class="mw-mb-4 mw-mt-6">Split Rows</h3>
120
+ <p class="mw-text-muted">
121
+ The most common row in any interface: what it is on the left, the value or the
122
+ action on the right. <code>mw-row-split</code> wraps, so on a narrow screen
123
+ the right half drops below instead of squashing the left one.
124
+ <code>mw-row-split-center</code> switches from baseline to center alignment,
125
+ for a row that mixes text with a button or an icon.
126
+ </p>
127
+ <div class="mw-grid-2-lg">
128
+ <div class="mw-card mw-card-simple">
129
+ <div class="mw-row-split mw-mb-4">
130
+ <strong>Invoice 2026-0042</strong>
131
+ <span class="mw-text-currency">1,204.50</span>
132
+ </div>
133
+ <div class="mw-row-split mw-mb-4">
134
+ <span class="mw-text-muted">Due date</span>
135
+ <span>19.09.2026</span>
136
+ </div>
137
+ <div class="mw-row-split">
138
+ <span class="mw-text-muted">Status</span>
139
+ <span class="mw-tag mw-tag-neutral">XRechnung</span>
140
+ </div>
141
+ </div>
142
+
143
+ <div class="mw-card mw-card-simple">
144
+ <div class="mw-row-split mw-row-split-center mw-mb-4">
145
+ <h4>Team members</h4>
146
+ <button type="button" class="mw-btn mw-btn-sm mw-btn-primary">
147
+ <i class="fas fa-plus"></i>
148
+ Add
149
+ </button>
150
+ </div>
151
+ <div class="mw-row-split mw-row-split-center">
152
+ <span><i class="fas fa-user mw-mr-2"></i>Alex Fischer</span>
153
+ <button
154
+ type="button"
155
+ class="mw-btn-mini mw-btn-mini-danger"
156
+ aria-label="Remove Alex Fischer"
157
+ >
158
+ <i class="fas fa-times"></i>
159
+ </button>
160
+ </div>
161
+ </div>
162
+ </div>
163
+
164
+ <h3 class="mw-mb-4 mw-mt-6">Numbers</h3>
165
+ <p class="mw-text-muted">
166
+ <code>mw-text-numeric</code> gives fixed-width digits and nothing else - for a
167
+ clock, a counter or an ID that must not jitter while it changes.
168
+ <code>mw-text-currency</code> adds right alignment and prevents wrapping
169
+ mid-number, which is what a money column in a table wants.
170
+ </p>
171
+ <div class="mw-card mw-card-simple">
172
+ <div class="mw-row-split mw-mb-4">
173
+ <span>Elapsed <code>mw-text-numeric</code></span>
174
+ <span class="mw-text-numeric">00:11:38</span>
175
+ </div>
176
+ <div class="mw-row-split">
177
+ <span>Total <code>mw-text-currency</code></span>
178
+ <span class="mw-text-currency">15,930.25</span>
179
+ </div>
180
+ </div>
181
+
182
+ <h3 class="mw-mb-4 mw-mt-6">Screen Reader Only</h3>
183
+ <p class="mw-text-muted">
184
+ <code>mw-sr-only</code> hides text visually but keeps it in the accessibility
185
+ tree - the label an icon-only button still owes its user.
186
+ <code>display: none</code> would not do: it drops the element out of that tree
187
+ as well. The two buttons below look identical; only one of them says what it
188
+ does.
189
+ </p>
190
+ <div class="mw-card mw-card-simple">
191
+ <div class="mw-d-flex mw-items-center mw-gap-4">
192
+ <button type="button" class="mw-btn mw-btn-outline mw-btn-sm">
193
+ <i class="fas fa-trash"></i>
194
+ <span class="mw-sr-only">Delete invoice 2026-0042</span>
195
+ </button>
196
+ <code>&lt;span class="mw-sr-only"&gt;Delete invoice&lt;/span&gt;</code>
197
+ </div>
198
+ </div>
199
+
119
200
  <h3 class="mw-mb-4 mw-mt-6">Tooltips</h3>
120
201
  <p class="mw-text-muted">
121
202
  Put <code>data-tooltip="..."</code> on any element - pure CSS, no script
@@ -43,3 +43,37 @@
43
43
  @content;
44
44
  }
45
45
  }
46
+
47
+ // Scroll hint for a horizontally scrollable strip - a tab bar, a wide table.
48
+ //
49
+ // Four gradient layers in two pairs. The cover pair is attached to the content
50
+ // (`local`) and therefore scrolls out of the way once that edge is reached;
51
+ // the shadow pair stays on the frame (`scroll`). Net effect: a shadow shows
52
+ // only on the side that still has something hidden behind it. No JavaScript,
53
+ // no scroll listener.
54
+ //
55
+ // The cover has to match whatever the strip sits on, which is why it reads a
56
+ // token: preset to the page, re-pointed inside cards, panels and modals.
57
+ @mixin scroll-hint {
58
+ background-image:
59
+ linear-gradient(
60
+ to right,
61
+ var(--mw-scroll-hint-cover, var(--mw-page-background)) 20%,
62
+ transparent
63
+ ),
64
+ linear-gradient(
65
+ to left,
66
+ var(--mw-scroll-hint-cover, var(--mw-page-background)) 20%,
67
+ transparent
68
+ ),
69
+ linear-gradient(to right, var(--mw-shadow), transparent),
70
+ linear-gradient(to left, var(--mw-shadow), transparent);
71
+ background-position: left, right, left, right;
72
+ background-repeat: no-repeat;
73
+ background-size:
74
+ 2.5rem 100%,
75
+ 2.5rem 100%,
76
+ 0.9rem 100%,
77
+ 0.9rem 100%;
78
+ background-attachment: local, local, scroll, scroll;
79
+ }