maverick-wave 3.3.0 → 3.3.2

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 (77) hide show
  1. package/.claude/skills/maverick-wave/SKILL.md +208 -0
  2. package/.claude/skills/maverick-wave/examples/angular-form.md +275 -0
  3. package/.claude/skills/maverick-wave/examples/angular-list-page.md +304 -0
  4. package/.claude/skills/maverick-wave/examples/angular-services.md +348 -0
  5. package/.claude/skills/maverick-wave/examples/static-landing-page.md +362 -0
  6. package/.claude/skills/maverick-wave/references/components.md +812 -0
  7. package/.claude/skills/maverick-wave/references/forms.md +289 -0
  8. package/.claude/skills/maverick-wave/references/javascript.md +70 -0
  9. package/.claude/skills/maverick-wave/references/layout.md +300 -0
  10. package/.claude/skills/maverick-wave/references/theming.md +192 -0
  11. package/.github/workflows/ci.yml +41 -0
  12. package/CHANGELOG.md +13 -0
  13. package/README.md +115 -21
  14. package/index.html +15 -9
  15. package/maverick-wave.min.css +1 -1
  16. package/maverick-wave.min.js +1 -1
  17. package/package.json +3 -1
  18. package/scripts/verify.js +137 -0
  19. package/src/js/main.js +39 -11
  20. package/src/partials/accordions-container.html +22 -27
  21. package/src/partials/alerts-container.html +26 -0
  22. package/src/partials/avatars-container.html +22 -0
  23. package/src/partials/buttons-container.html +11 -15
  24. package/src/partials/cards-container.html +8 -8
  25. package/src/partials/colors-container.html +33 -20
  26. package/src/partials/documentation-container.html +3 -0
  27. package/src/partials/form-field-container.html +16 -12
  28. package/src/partials/get-started-container.html +93 -35
  29. package/src/partials/header-utilities-container.html +64 -6
  30. package/src/partials/input-group-container.html +5 -3
  31. package/src/partials/page-header-container.html +78 -0
  32. package/src/partials/tables-container.html +130 -0
  33. package/src/partials/tabs-container.html +20 -16
  34. package/src/partials/tags-container.html +55 -1
  35. package/src/scss/abstracts/_index.scss +4 -1
  36. package/src/scss/abstracts/_variables.scss +128 -106
  37. package/src/scss/base/_base.scss +32 -136
  38. package/src/scss/base/_reset.scss +1 -1
  39. package/src/scss/base/_typography.scss +0 -92
  40. package/src/scss/components/_accordions.scss +3 -3
  41. package/src/scss/components/_avatars.scss +28 -1
  42. package/src/scss/components/_blog-post.scss +1 -1
  43. package/src/scss/components/_button-bar.scss +6 -6
  44. package/src/scss/components/_buttons.scss +33 -10
  45. package/src/scss/components/_cards.scss +7 -7
  46. package/src/scss/components/_coming-soon.scss +4 -4
  47. package/src/scss/components/_gallery.scss +2 -2
  48. package/src/scss/components/_index.scss +1 -0
  49. package/src/scss/components/_info.scss +20 -3
  50. package/src/scss/components/_lists.scss +11 -10
  51. package/src/scss/components/_modals.scss +14 -7
  52. package/src/scss/components/_pagination.scss +3 -3
  53. package/src/scss/components/_panels.scss +4 -4
  54. package/src/scss/components/_progress.scss +1 -1
  55. package/src/scss/components/_ratings.scss +1 -1
  56. package/src/scss/components/_spinners.scss +2 -2
  57. package/src/scss/components/_stepper.scss +3 -2
  58. package/src/scss/components/_tables.scss +42 -1
  59. package/src/scss/components/_tabs.scss +5 -5
  60. package/src/scss/components/_tags.scss +43 -27
  61. package/src/scss/components/_tiles.scss +3 -3
  62. package/src/scss/components/_timelines.scss +2 -2
  63. package/src/scss/components/_toasts.scss +92 -0
  64. package/src/scss/form-elements/_form.scss +11 -3
  65. package/src/scss/form-elements/_input.scss +24 -0
  66. package/src/scss/form-elements/_toggle.scss +1 -1
  67. package/src/scss/layout/_footer.scss +4 -4
  68. package/src/scss/layout/_header.scss +219 -59
  69. package/src/scss/layout/_index.scss +1 -0
  70. package/src/scss/layout/_main.scss +1 -1
  71. package/src/scss/layout/_page-header.scss +48 -0
  72. package/src/scss/layout/_section.scss +15 -14
  73. package/src/scss/main.scss +4 -0
  74. package/src/scss/utilities/_flex.scss +4 -0
  75. package/src/scss/utilities/_index.scss +1 -0
  76. package/src/scss/utilities/_text.scss +105 -0
  77. package/.claude/commands/mw.md +0 -595
@@ -132,6 +132,9 @@
132
132
  <a href="#data-display">Data & Display</a>
133
133
  </li>
134
134
  <ul class="mw-list mw-list-link">
135
+ <li>
136
+ <a href="#page-header">Page Header</a>
137
+ </li>
135
138
  <li>
136
139
  <a href="#meta-info">Meta Info</a>
137
140
  </li>
@@ -72,25 +72,29 @@
72
72
  </div>
73
73
  </div>
74
74
 
75
- <!-- RIGHT: Angular validation simulation + readonly -->
75
+ <!-- RIGHT: error, single-control error, readonly, disabled -->
76
76
  <div>
77
77
  <h3 class="mw-card-title mw-mb-4">Validation & Readonly States</h3>
78
78
  <div class="mw-card mw-card-simple">
79
79
  <p class="mw-text-muted mw-text-sm mw-mb-4">
80
- Angular adds <code>.ng-invalid.ng-touched</code> and
81
- <code>.ng-valid.ng-touched.ng-dirty</code>
82
- automatically. The styles below are applied by the framework.
80
+ The error look is not automatic: bind
81
+ <code>mw-field-has-error</code> to the control state (in Angular
82
+ <code>[class.mw-field-has-error]="c.invalid &amp;&amp; c.touched"</code
83
+ >). A control without a field wrapper &mdash; also a
84
+ <code>mw-checkbox-group</code>, <code>mw-radio-group</code> or
85
+ <code>mw-slider-container</code> &mdash; takes
86
+ <code>mw-form-element-error</code> instead.
83
87
  </p>
84
88
 
85
- <!-- Simulated ng-invalid ng-touched -->
86
- <div class="mw-field mw-mb-4">
89
+ <!-- Field wrapper in error state -->
90
+ <div class="mw-field mw-field-has-error mw-mb-4">
87
91
  <label class="mw-field-label mw-required" for="ff-username"
88
92
  >Username (invalid &amp; touched)</label
89
93
  >
90
94
  <input
91
95
  id="ff-username"
92
96
  type="text"
93
- class="mw-input ng-invalid ng-touched"
97
+ class="mw-input"
94
98
  value=""
95
99
  placeholder="Required"
96
100
  />
@@ -99,18 +103,18 @@
99
103
  </span>
100
104
  </div>
101
105
 
102
- <!-- Simulated ng-valid ng-touched ng-dirty -->
106
+ <!-- Single control without a wrapper -->
103
107
  <div class="mw-field mw-mb-4">
104
108
  <label class="mw-field-label mw-required" for="ff-password"
105
- >Password (valid &amp; dirty)</label
109
+ >Password (single control error)</label
106
110
  >
107
111
  <input
108
112
  id="ff-password"
109
113
  type="password"
110
- class="mw-input ng-valid ng-touched ng-dirty"
111
- value="secret123"
114
+ class="mw-input mw-form-element-error"
115
+ value="123"
112
116
  />
113
- <span class="mw-field-hint">Looks good!</span>
117
+ <span class="mw-field-hint">At least 8 characters.</span>
114
118
  </div>
115
119
 
116
120
  <!-- Readonly -->
@@ -97,8 +97,10 @@
97
97
  </p>
98
98
  <p>
99
99
  MaverickWave uses <code>@use</code> / <code>@forward</code> (modern
100
- Sass module syntax). Override Sass variables <em>before</em> importing
101
- the framework.
100
+ Sass module syntax). Pass your overrides through
101
+ <code>@use ... with (...)</code> &mdash; a plain assignment before the
102
+ <code>@use</code> has no effect, because the root colors are declared
103
+ with <code>!default</code>.
102
104
  </p>
103
105
 
104
106
  <h5 class="mw-mt-4">Theme Mode</h5>
@@ -120,26 +122,58 @@
120
122
  <h5 class="mw-mt-4">Example — your main SCSS file</h5>
121
123
  <pre class="mw-code-block"><code>// styles.scss
122
124
 
123
- // 1. Theme mode (optional, default is 'switchable')
124
- $mw-theme-mode: 'switchable';
125
+ @use 'path/to/maverick-wave/src/scss/main' with (
126
+ // Theme mode (optional, default is 'switchable')
127
+ $mw-theme-mode: 'switchable',
125
128
 
126
- // 2. Override base color variables
127
- $primary-color: #e94560;
128
- $secondary-color: #f39c12;
129
+ // Root colors everything else is derived from them at runtime
130
+ $primary-color: #e94560,
131
+ $secondary-color: #f39c12,
132
+ $dark-background: #1f1f2e,
133
+ $light-background: #f8f9fa,
134
+ $dark-text-color: #ffffff,
135
+ $light-text-color: #1c1c1c
136
+ );
129
137
 
130
- // 3. Override background / text colors
131
- $dark-background: #1f1f2e;
132
- $light-background: #f8f9fa;
133
- $dark-text-color: #ffffff;
134
- $light-text-color: #1c1c1c;
135
-
136
- // 4. Import the framework (adjust path as needed)
137
- @use 'path/to/maverick-wave/src/scss/main';
138
-
139
- // 5. Your additional styles
138
+ // Your additional styles
140
139
  body {
141
140
  // custom overrides
142
141
  }</code></pre>
142
+
143
+ <h5 class="mw-mt-4">Importing Only What You Need</h5>
144
+ <p>
145
+ Every layer forwards one module per file and no
146
+ <code>@extend</code> crosses a file boundary, so components can be
147
+ imported individually. Applications usually have no use for the
148
+ marketing components (<code>blog-post</code>, <code>gallery</code>,
149
+ <code>content-slider</code>, <code>techstack-bucket</code>,
150
+ <code>tiles</code>, <code>coming-soon</code>, <code>ratings</code>,
151
+ <code>home</code>).
152
+ </p>
153
+ <pre
154
+ class="mw-code-block"
155
+ ><code>// styles.scss — the configuration has to come first
156
+ @use 'maverick-wave/src/scss/abstracts/variables' with (
157
+ $primary-color: #0f766e
158
+ );
159
+
160
+ @use 'maverick-wave/src/scss/base'; // required — carries the :root tokens
161
+ @use 'maverick-wave/src/scss/layout/grid';
162
+ @use 'maverick-wave/src/scss/layout/page-header';
163
+ @use 'maverick-wave/src/scss/components/buttons';
164
+ @use 'maverick-wave/src/scss/components/cards';
165
+ @use 'maverick-wave/src/scss/components/modals';
166
+ @use 'maverick-wave/src/scss/components/tables';
167
+ @use 'maverick-wave/src/scss/components/tags';
168
+ @use 'maverick-wave/src/scss/form-elements';
169
+ @use 'maverick-wave/src/scss/utilities';</code></pre>
170
+ <p class="mw-text-warning">
171
+ <i class="fas fa-exclamation-triangle mw-mr-1"></i>
172
+ Without <code>base</code> every component renders without colors — it
173
+ carries the <code>:root</code> custom properties. A subset like the
174
+ one above compiles to roughly 98 kB raw / 15 kB gzipped, against 147
175
+ kB / 22.5 kB for the full build.
176
+ </p>
143
177
  </div>
144
178
  </div>
145
179
 
@@ -156,10 +190,18 @@ body {
156
190
  "styles": [
157
191
  "src/assets/maverick-wave.min.css",
158
192
  "src/styles.scss"
159
- ],
160
- "scripts": [
161
- "src/assets/maverick-wave.min.js"
162
193
  ]</code></pre>
194
+ <p class="mw-text-warning">
195
+ <i class="fas fa-exclamation-triangle mw-mr-1"></i>
196
+ <strong>No <code>"scripts"</code> entry for the JS file.</strong>
197
+ <code>maverick-wave.min.js</code> wires everything up once on
198
+ <code>DOMContentLoaded</code> and writes straight into the DOM &mdash;
199
+ in a SPA everything rendered afterwards stays uninitialized, and the
200
+ class toggles happen behind change detection. Rebuild the behaviors in
201
+ components; the state classes (<code>active</code>, <code>open</code>,
202
+ <code>mw-modal-open</code>, <code>mw-selected</code>) are the whole
203
+ contract.
204
+ </p>
163
205
  <p>
164
206
  Alternatively, use the CDN link directly in
165
207
  <code>src/index.html</code>:
@@ -167,23 +209,35 @@ body {
167
209
  <pre class="mw-code-block"><code>&lt;link rel="stylesheet"
168
210
  href="https://cdn.jsdelivr.net/npm/maverick-wave@{{VERSION}}/maverick-wave.min.css"&gt;</code></pre>
169
211
  <p>
170
- For SCSS integration, copy the <code>src/scss/</code> source into your
171
- project and import it from <code>src/styles.scss</code>:
212
+ For SCSS integration, use the npm package (or a local copy of
213
+ <code>src/scss/</code>) from <code>src/styles.scss</code>:
172
214
  </p>
173
215
  <pre class="mw-code-block"><code>// src/styles.scss
174
- $primary-color: #3f51b5;
175
- $mw-theme-mode: 'switchable';
176
-
177
- @use 'maverick-wave/src/scss/main';</code></pre>
216
+ @use 'maverick-wave/src/scss/main' with (
217
+ $primary-color: #3f51b5,
218
+ $mw-theme-mode: 'switchable'
219
+ );</code></pre>
178
220
  <h5 class="mw-mt-4">Theme switching</h5>
179
- <pre class="mw-code-block"><code>// app.component.ts
180
- toggleTheme() {
181
- document.body.classList.toggle('mw-theme-light');
221
+ <p>
222
+ Light mode is one class on <code>&lt;body&gt;</code>. Keep it in a
223
+ service so the choice survives navigation:
224
+ </p>
225
+ <pre class="mw-code-block"><code>// theme.service.ts
226
+ readonly light = signal(localStorage.getItem('mw-theme') === 'light');
227
+
228
+ constructor() {
229
+ effect(() =&gt; {
230
+ const light = this.light();
231
+ document.body.classList.toggle('mw-theme-light', light);
232
+ localStorage.setItem('mw-theme', light ? 'light' : 'dark');
233
+ });
182
234
  }</code></pre>
183
235
  <h5 class="mw-mt-4">Reactive Forms</h5>
184
236
  <p>
185
- MaverickWave automatically styles Angular form state classes. Use the
186
- <code>mw-field</code> wrapper pattern:
237
+ The <code>mw-field</code> wrapper groups label, control, hint and
238
+ error. Bind the error state yourself &mdash; the framework does not
239
+ style Angular's <code>ng-invalid</code> / <code>ng-touched</code>
240
+ classes:
187
241
  </p>
188
242
  <pre
189
243
  class="mw-code-block"
@@ -206,10 +260,14 @@ toggleTheme() {
206
260
  use the CDN link in <code>index.html</code>:
207
261
  </p>
208
262
  <pre class="mw-code-block"><code>// main.jsx / index.js
209
- import './assets/maverick-wave.min.css';
210
-
211
- // If you need the JS functionality (accordion, tabs, etc.)
212
- import './assets/maverick-wave.min.js';</code></pre>
263
+ import './assets/maverick-wave.min.css';</code></pre>
264
+ <p class="mw-text-warning">
265
+ <i class="fas fa-exclamation-triangle mw-mr-1"></i>
266
+ Do not import <code>maverick-wave.min.js</code> in a SPA &mdash; it
267
+ binds once on <code>DOMContentLoaded</code> and never sees anything
268
+ rendered later. Accordion, tabs, modal and theme toggle are class
269
+ toggles; bind them with <code>className</code> from state.
270
+ </p>
213
271
  <p>Example usage in a React component:</p>
214
272
  <pre class="mw-code-block"><code>function App() {
215
273
  return (
@@ -11,8 +11,8 @@
11
11
  <div
12
12
  class="mw-d-flex mw-justify-between mw-items-center mw-p-3"
13
13
  style="
14
- background: rgb(12, 17, 30);
15
- border-bottom: 1px solid var(--mw-primary-color-hover);
14
+ background: var(--mw-header-background);
15
+ border-bottom: 1px solid var(--mw-header-border);
16
16
  "
17
17
  >
18
18
  <div class="mw-d-flex mw-items-center">
@@ -20,7 +20,7 @@
20
20
  style="
21
21
  font-weight: bold;
22
22
  font-size: 1.2rem;
23
- color: var(--mw-header-burgerbutton-color);
23
+ color: var(--mw-header-text-color);
24
24
  "
25
25
  >
26
26
  Your Logo
@@ -54,8 +54,8 @@
54
54
  <div
55
55
  class="mw-d-flex mw-justify-between mw-items-center mw-p-3"
56
56
  style="
57
- background: rgb(12, 17, 30);
58
- border-bottom: 1px solid var(--mw-primary-color-hover);
57
+ background: var(--mw-header-background);
58
+ border-bottom: 1px solid var(--mw-header-border);
59
59
  "
60
60
  >
61
61
  <div class="mw-localhost-indicator-pulse"></div>
@@ -64,7 +64,7 @@
64
64
  style="
65
65
  font-weight: bold;
66
66
  font-size: 1.2rem;
67
- color: var(--mw-header-burgerbutton-color);
67
+ color: var(--mw-header-text-color);
68
68
  "
69
69
  >
70
70
  Your Logo
@@ -78,3 +78,61 @@
78
78
  </div>
79
79
  </div>
80
80
  </div>
81
+
82
+ <div class="mw-mt-6">
83
+ <h3 class="mw-mb-2">Profile Button (on a fake header here)</h3>
84
+ <p class="mw-text-muted">
85
+ Shows who is signed in: an avatar with initials plus the name. Below
86
+ <code>md</code> the name steps aside and only the round avatar remains, so
87
+ it keeps the same height as the login and burger buttons. Works outside a
88
+ header too &mdash; in a panel header or a toolbar.
89
+ </p>
90
+ <!-- Fake header -->
91
+ <div class="mw-mb-4" style="position: relative; overflow: hidden">
92
+ <div
93
+ class="mw-d-flex mw-justify-between mw-items-center mw-p-3"
94
+ style="
95
+ background: var(--mw-header-background);
96
+ border-bottom: 1px solid var(--mw-header-border);
97
+ "
98
+ >
99
+ <div class="mw-d-flex mw-items-center">
100
+ <div
101
+ style="
102
+ font-weight: bold;
103
+ font-size: 1.2rem;
104
+ color: var(--mw-header-text-color);
105
+ "
106
+ >
107
+ Your Logo
108
+ </div>
109
+ </div>
110
+ <div class="mw-d-flex mw-items-center mw-gap-4">
111
+ <a style="color: var(--mw-header-navbar-list-color)"> Home </a>
112
+ <a style="color: var(--mw-header-navbar-list-color)"> About </a>
113
+ <button class="mw-profile-btn" type="button">
114
+ <span class="mw-avatar mw-avatar-initials mw-avatar-xs">MW</span>
115
+ <span class="mw-profile-btn-name">Michael</span>
116
+ </button>
117
+ </div>
118
+ </div>
119
+ </div>
120
+
121
+ <p class="mw-text-muted mw-text-sm">
122
+ Without initials it also takes an icon:
123
+ </p>
124
+ <div class="mw-mb-4" style="position: relative; overflow: hidden">
125
+ <div
126
+ class="mw-d-flex mw-justify-end mw-items-center mw-p-3"
127
+ style="
128
+ background: var(--mw-header-background);
129
+ border-bottom: 1px solid var(--mw-header-border);
130
+ "
131
+ >
132
+ <button class="mw-profile-btn" type="button">
133
+ <i class="fas fa-user-circle"></i>
134
+ <span class="mw-profile-btn-name">Michael</span>
135
+ </button>
136
+ </div>
137
+ </div>
138
+ </div>
@@ -44,9 +44,11 @@
44
44
  ></span>
45
45
  <input
46
46
  id="ig-price"
47
- type="number"
48
- class="mw-input"
49
- placeholder="0.00"
47
+ type="text"
48
+ inputmode="decimal"
49
+ class="mw-input mw-input-numeric"
50
+ placeholder="0,00"
51
+ value="1.204,50"
50
52
  />
51
53
  <span class="mw-input-group-suffix">EUR</span>
52
54
  </div>
@@ -0,0 +1,78 @@
1
+ <h3 class="mw-section-subtitle">Page Header</h3>
2
+
3
+ <p class="mw-text-muted mw-mb-6">
4
+ The start of a content page: title and subtitle on the left, actions on the
5
+ right, wrapping when it gets tight. The counterpart to
6
+ <code>mw-section-title</code>, which is centered and decorated and belongs on
7
+ a landing page.
8
+ </p>
9
+
10
+ <div class="mw-grid-1">
11
+ <div class="mw-card mw-card-simple mw-mb-6">
12
+ <h4 class="mw-mb-4">With Actions</h4>
13
+ <header class="mw-page-header">
14
+ <div>
15
+ <h2>Blog Posts</h2>
16
+ <p>14 entries &middot; 3 drafts</p>
17
+ </div>
18
+ <div class="mw-page-header-actions">
19
+ <button type="button" class="mw-btn mw-btn-outline mw-btn-sm">
20
+ <i class="fas fa-filter"></i>
21
+ Filter
22
+ </button>
23
+ <button type="button" class="mw-btn mw-btn-primary mw-btn-sm">
24
+ <i class="fas fa-plus"></i>
25
+ New Post
26
+ </button>
27
+ </div>
28
+ </header>
29
+ <p class="mw-text-muted">Page content follows here.</p>
30
+ </div>
31
+
32
+ <div class="mw-card mw-card-simple mw-mb-6">
33
+ <h4 class="mw-mb-4">Combined with Meta Info</h4>
34
+ <p class="mw-text-muted mw-text-sm mw-mb-3">
35
+ The counters fit naturally underneath the title instead of a subtitle
36
+ line.
37
+ </p>
38
+ <header class="mw-page-header">
39
+ <div>
40
+ <h2>Blog Posts</h2>
41
+ <div class="mw-meta-header">
42
+ <div class="mw-meta-item">
43
+ <i class="fas fa-list"></i>
44
+ <span>Amount: 14</span>
45
+ </div>
46
+ <div class="mw-meta-item">
47
+ <i class="fas fa-pen"></i>
48
+ <span>Drafts: 3</span>
49
+ </div>
50
+ <div class="mw-meta-item">
51
+ <i class="fas fa-eye"></i>
52
+ <span>Published: 11</span>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ <div class="mw-page-header-actions">
57
+ <button type="button" class="mw-btn mw-btn-primary mw-btn-sm">
58
+ <i class="fas fa-plus"></i>
59
+ New Post
60
+ </button>
61
+ </div>
62
+ </header>
63
+ </div>
64
+
65
+ <div class="mw-card mw-card-simple">
66
+ <h4 class="mw-mb-4">Without a Separator</h4>
67
+ <p class="mw-text-muted mw-text-sm mw-mb-3">
68
+ <code>mw-page-header-plain</code> drops the bottom rule for pages that
69
+ bring their own.
70
+ </p>
71
+ <header class="mw-page-header mw-page-header-plain">
72
+ <div>
73
+ <h2>Settings</h2>
74
+ <p>Manage your account</p>
75
+ </div>
76
+ </header>
77
+ </div>
78
+ </div>
@@ -15,6 +15,8 @@
15
15
  <th>Name</th>
16
16
  <th>Position</th>
17
17
  <th>Location</th>
18
+ <th>Status</th>
19
+ <th class="mw-text-numeric">Budget</th>
18
20
  </tr>
19
21
  </thead>
20
22
  <tbody>
@@ -23,21 +25,35 @@
23
25
  <td>John Doe</td>
24
26
  <td>Developer</td>
25
27
  <td>New York</td>
28
+ <td><span class="mw-tag mw-tag-success">Active</span></td>
29
+ <td class="mw-text-numeric">1,204.50</td>
26
30
  </tr>
27
31
  <tr>
28
32
  <td>2</td>
29
33
  <td>Jane Smith</td>
30
34
  <td>Designer</td>
31
35
  <td>London</td>
36
+ <td><span class="mw-tag mw-tag-warning">Pending</span></td>
37
+ <td class="mw-text-numeric">87.00</td>
32
38
  </tr>
33
39
  <tr>
34
40
  <td>3</td>
35
41
  <td>Bob Johnson</td>
36
42
  <td>Manager</td>
37
43
  <td>Berlin</td>
44
+ <td><span class="mw-tag mw-tag-muted">Draft</span></td>
45
+ <td class="mw-text-numeric">15,930.25</td>
38
46
  </tr>
39
47
  </tbody>
40
48
  </table>
49
+ <p class="mw-text-muted mw-mt-3">
50
+ The <strong>Budget</strong> column uses
51
+ <strong>mw-text-numeric</strong> &ndash; right-aligned with tabular,
52
+ lining digits. The alignment comes from the right edge, so it works the
53
+ same for <code>1,204.50</code> and <code>1.204,50</code>; only the number
54
+ of decimal places has to be consistent per column. For the input side
55
+ there is <strong>mw-input-numeric</strong>.
56
+ </p>
41
57
  </div>
42
58
 
43
59
  <div class="mw-card mw-card-simple mw-mb-6">
@@ -78,6 +94,120 @@
78
94
  </table>
79
95
  </div>
80
96
 
97
+ <div class="mw-card mw-card-simple mw-mb-6">
98
+ <h4 class="mw-mb-2">Subtle Header &amp; Sticky Header</h4>
99
+ <p class="mw-text-muted">
100
+ <code>mw-table-subtle</code> keeps the header quiet - a full primary bar
101
+ across every column shouts louder than the data it labels.
102
+ <code>mw-table-sticky-head</code> keeps it visible while the body scrolls;
103
+ it needs a scroll container with a height limit, which
104
+ <code>mw-table-responsive-scroll</code> provides. Scroll inside the table
105
+ to see it. Its height comes from
106
+ <code>--mw-table-scroll-height</code> (400px, 260px below <code>sm</code>)
107
+ &mdash; override it per table with
108
+ <code>style="--mw-table-scroll-height: 250px"</code>.
109
+ </p>
110
+
111
+ <div class="mw-table-responsive-scroll">
112
+ <table class="mw-table mw-table-subtle mw-table-sticky-head">
113
+ <thead>
114
+ <tr>
115
+ <th>#</th>
116
+ <th>Name</th>
117
+ <th>Position</th>
118
+ <th class="mw-text-numeric">Budget</th>
119
+ </tr>
120
+ </thead>
121
+ <tbody>
122
+ <tr>
123
+ <td>1</td>
124
+ <td>John Doe</td>
125
+ <td>Developer</td>
126
+ <td class="mw-text-numeric">12,400</td>
127
+ </tr>
128
+ <tr>
129
+ <td>2</td>
130
+ <td>Jane Smith</td>
131
+ <td>Designer</td>
132
+ <td class="mw-text-numeric">9,800</td>
133
+ </tr>
134
+ <tr>
135
+ <td>3</td>
136
+ <td>Bob Johnson</td>
137
+ <td>Manager</td>
138
+ <td class="mw-text-numeric">21,050</td>
139
+ </tr>
140
+ <tr>
141
+ <td>4</td>
142
+ <td>Alice Brown</td>
143
+ <td>Developer</td>
144
+ <td class="mw-text-numeric">11,300</td>
145
+ </tr>
146
+ <tr>
147
+ <td>5</td>
148
+ <td>Charlie Davis</td>
149
+ <td>Analyst</td>
150
+ <td class="mw-text-numeric">7,600</td>
151
+ </tr>
152
+ <tr>
153
+ <td>6</td>
154
+ <td>Emma Wilson</td>
155
+ <td>Designer</td>
156
+ <td class="mw-text-numeric">10,150</td>
157
+ </tr>
158
+ <tr>
159
+ <td>7</td>
160
+ <td>Frank Miller</td>
161
+ <td>Developer</td>
162
+ <td class="mw-text-numeric">13,900</td>
163
+ </tr>
164
+ <tr>
165
+ <td>8</td>
166
+ <td>Grace Lee</td>
167
+ <td>Manager</td>
168
+ <td class="mw-text-numeric">19,700</td>
169
+ </tr>
170
+ <tr>
171
+ <td>9</td>
172
+ <td>Henry Clark</td>
173
+ <td>Analyst</td>
174
+ <td class="mw-text-numeric">8,250</td>
175
+ </tr>
176
+ <tr>
177
+ <td>10</td>
178
+ <td>Ivy Turner</td>
179
+ <td>Developer</td>
180
+ <td class="mw-text-numeric">14,600</td>
181
+ </tr>
182
+ <tr>
183
+ <td>11</td>
184
+ <td>Jack Morris</td>
185
+ <td>Designer</td>
186
+ <td class="mw-text-numeric">9,400</td>
187
+ </tr>
188
+ <tr>
189
+ <td>12</td>
190
+ <td>Karen Hall</td>
191
+ <td>Manager</td>
192
+ <td class="mw-text-numeric">22,800</td>
193
+ </tr>
194
+ <tr>
195
+ <td>13</td>
196
+ <td>Liam Scott</td>
197
+ <td>Developer</td>
198
+ <td class="mw-text-numeric">12,950</td>
199
+ </tr>
200
+ <tr>
201
+ <td>14</td>
202
+ <td>Mia Adams</td>
203
+ <td>Analyst</td>
204
+ <td class="mw-text-numeric">7,900</td>
205
+ </tr>
206
+ </tbody>
207
+ </table>
208
+ </div>
209
+ </div>
210
+
81
211
  <div class="mw-card mw-card-simple">
82
212
  <h4 class="mw-mb-2">Responsive Table</h4>
83
213
  <p class="mw-text-muted">
@@ -127,9 +127,10 @@ href="path/maverick-wave.min.css"&gt;</code></pre>
127
127
  <li><code>'dark'</code>: Compiles only dark theme styles.</li>
128
128
  <li><code>'light'</code>: Compiles only light theme styles.</li>
129
129
  </ul>
130
- <pre class="mw-code-block"><code>// Your main.scss
131
- $mw-theme-mode: 'switchable'; // Or 'dark', 'light'
132
- @import 'path/to/maverick-wave/scss/maverick-wave';</code></pre>
130
+ <pre class="mw-code-block"><code>// Your styles.scss
131
+ @use 'path/to/maverick-wave/src/scss/main' with (
132
+ $mw-theme-mode: 'switchable' // Or 'dark', 'light'
133
+ );</code></pre>
133
134
  <p class="mw-text-warning mw-mt-2">
134
135
  <i class="fas fa-exclamation-triangle mw-mr-1"></i>
135
136
  Note: The main header/navigation currently retains its default dark
@@ -165,26 +166,29 @@ $mw-theme-mode: 'switchable'; // Or 'dark', 'light'
165
166
 
166
167
  <h5 class="mw-mt-4 mw-mb-2">Method 2: SCSS Variable Overrides</h5>
167
168
  <p>
168
- Requires a Sass build process. Define overrides in your main SCSS file
169
- <em>before</em> importing MaverickWave:
169
+ Requires a Sass build process. Pass the overrides through
170
+ <code>@use ... with (...)</code>:
170
171
  </p>
171
- <pre class="mw-code-block"><code>// your-main.scss
172
- $primary-color: #e94560;
173
- $font-family: 'Your Custom Font', sans-serif;
174
- // ... other overrides ...
175
-
176
- @import 'path/to/maverick-wave/scss/maverick-wave';</code></pre>
172
+ <pre class="mw-code-block"><code>// your-styles.scss
173
+ @use 'path/to/maverick-wave/src/scss/main' with (
174
+ $primary-color: #e94560,
175
+ $secondary-color: #f39c12
176
+ // ... other root colors ...
177
+ );</code></pre>
177
178
  <p>
178
- This method allows framework-internal calculations (like derived alert
179
- backgrounds) to use your custom base colors.
179
+ Both methods end up at the same place: the derived tones (hover
180
+ colors, translucent backgrounds, borders) are calculated at runtime
181
+ with <code>color-mix()</code>, so a single root color is enough.
180
182
  </p>
181
183
 
182
184
  <h5 class="mw-mt-4 mw-mb-2">Adding Custom Fonts</h5>
183
185
  <p>
184
186
  Remember to load custom fonts using <code>@font-face</code> rules in
185
- your CSS/SCSS before applying them via the
186
- <code>--mw-font-family-base</code> or
187
- <code>$font-family</code> variable.
187
+ your CSS/SCSS before assigning them to
188
+ <code>--mw-font-family-base</code> (and
189
+ <code>--mw-font-family-heading</code> /
190
+ <code>--mw-font-family-mono</code>). The framework bundles no font and
191
+ falls back to a system stack.
188
192
  </p>
189
193
  <p class="mw-mt-4">
190
194
  <button