maverick-wave 3.1.0 → 3.1.3

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 (62) hide show
  1. package/.claude/commands/mw.md +51 -34
  2. package/CHANGELOG.md +6 -0
  3. package/index.html +54 -52
  4. package/maverick-wave.min.css +1 -1
  5. package/package.json +1 -1
  6. package/src/partials/divider-container.html +48 -34
  7. package/src/partials/form-elements-container.html +0 -82
  8. package/src/partials/home-container.html +1 -1
  9. package/src/partials/item-lists-container.html +38 -38
  10. package/src/partials/modals-container.html +176 -54
  11. package/src/partials/panels-container.html +10 -35
  12. package/src/scss/abstracts/_variables.scss +19 -17
  13. package/src/scss/base/_reset.scss +15 -10
  14. package/src/scss/base/_typography.scss +13 -1
  15. package/src/scss/components/_accordions.scss +1 -1
  16. package/src/scss/components/_alerts.scss +2 -4
  17. package/src/scss/components/_avatars.scss +1 -1
  18. package/src/scss/components/_blog-post.scss +5 -5
  19. package/src/scss/components/_breadcrumbs.scss +2 -2
  20. package/src/scss/components/_buttons.scss +2 -2
  21. package/src/scss/components/_cards.scss +12 -16
  22. package/src/scss/components/_coming-soon.scss +4 -4
  23. package/src/scss/components/_content-slider.scss +2 -4
  24. package/src/scss/components/_divider.scss +4 -1
  25. package/src/scss/components/_empty-state.scss +9 -9
  26. package/src/scss/components/_gallery.scss +14 -13
  27. package/src/scss/components/_info.scss +6 -6
  28. package/src/scss/components/_lists.scss +29 -26
  29. package/src/scss/components/_meta-info.scss +1 -1
  30. package/src/scss/components/_modals.scss +4 -6
  31. package/src/scss/components/_pagination.scss +3 -2
  32. package/src/scss/components/_panels.scss +13 -7
  33. package/src/scss/components/_progress.scss +5 -4
  34. package/src/scss/components/_ratings.scss +2 -2
  35. package/src/scss/components/_skeleton.scss +6 -6
  36. package/src/scss/components/_spinners.scss +8 -8
  37. package/src/scss/components/_stepper.scss +6 -5
  38. package/src/scss/components/_tables.scss +4 -2
  39. package/src/scss/components/_tabs.scss +7 -6
  40. package/src/scss/components/_tags.scss +10 -3
  41. package/src/scss/components/_techstack-bucket.scss +12 -11
  42. package/src/scss/components/_theme-toggle.scss +4 -3
  43. package/src/scss/components/_tiles.scss +5 -5
  44. package/src/scss/components/_timelines.scss +130 -133
  45. package/src/scss/form-elements/_checkbox.scss +12 -27
  46. package/src/scss/form-elements/_form.scss +2 -2
  47. package/src/scss/form-elements/_input-group.scss +2 -2
  48. package/src/scss/form-elements/_input.scss +1 -5
  49. package/src/scss/form-elements/_login.scss +1 -1
  50. package/src/scss/form-elements/_radio.scss +4 -14
  51. package/src/scss/form-elements/_select.scss +3 -8
  52. package/src/scss/form-elements/_slider.scss +1 -18
  53. package/src/scss/form-elements/_textarea.scss +2 -7
  54. package/src/scss/form-elements/_toggle.scss +6 -6
  55. package/src/scss/layout/_footer.scss +8 -7
  56. package/src/scss/layout/_grid.scss +1 -3
  57. package/src/scss/layout/_header.scss +53 -141
  58. package/src/scss/layout/_home.scss +2 -2
  59. package/src/scss/layout/_section.scss +36 -2
  60. package/src/scss/utilities/_display.scss +4 -0
  61. package/src/scss/utilities/_flex.scss +8 -0
  62. package/src/scss/utilities/_spacing.scss +7 -5
@@ -68,10 +68,12 @@ Use the `mw-field` wrapper to group label + control + hint/error:
68
68
  <label class="mw-field-label mw-required" for="email">Email</label>
69
69
  <input id="email" type="email" class="mw-input" formControlName="email" />
70
70
  <span class="mw-field-hint">Used for account notifications.</span>
71
- <span class="mw-field-error" *ngIf="email.invalid && email.touched">
71
+ @if (email.invalid && email.touched) {
72
+ <span class="mw-field-error">
72
73
  <i class="fas fa-exclamation-circle"></i>
73
74
  Please enter a valid email address.
74
75
  </span>
76
+ }
75
77
  </div>
76
78
  ```
77
79
 
@@ -85,7 +87,6 @@ Use the `mw-field` wrapper to group label + control + hint/error:
85
87
  <input type="text" class="mw-input" />
86
88
  <input type="text" class="mw-input mw-input-sm" />
87
89
  <input type="text" class="mw-input mw-input-lg" />
88
- <input type="text" class="mw-input mw-input-xl" />
89
90
  ```
90
91
 
91
92
  ### Input Group (prefix / suffix / button)
@@ -166,13 +167,18 @@ Use the `mw-field` wrapper to group label + control + hint/error:
166
167
  <option value="" disabled selected>Choose...</option>
167
168
  <option value="a">Option A</option>
168
169
  </select>
170
+
171
+ <!-- Sizes: mw-select-sm / mw-select-lg -->
169
172
  ```
170
173
 
171
174
  ### Textarea
172
175
 
173
176
  ```html
174
177
  <textarea class="mw-textarea" rows="4" placeholder="..."></textarea>
175
- <textarea class="mw-textarea mw-textarea-resizable-vertical"></textarea>
178
+ <textarea class="mw-textarea mw-textarea-sm"></textarea>
179
+ <textarea class="mw-textarea mw-textarea-lg"></textarea>
180
+
181
+ <!-- Resize variants: mw-textarea-resizable / mw-textarea-resizable-vertical / mw-textarea-resizable-horizontal -->
176
182
  ```
177
183
 
178
184
  ### Checkbox
@@ -185,7 +191,8 @@ Use the `mw-field` wrapper to group label + control + hint/error:
185
191
  </label>
186
192
 
187
193
  <!-- Color variants: mw-checkbox-primary / secondary / success / warning / danger / info -->
188
- <!-- Size variants: mw-checkbox-sm / mw-checkbox-lg / mw-checkbox-xl -->
194
+ <!-- Size variants: mw-checkbox-sm / mw-checkbox-lg -->
195
+ <!-- Disabled: add class mw-checkbox-disabled + disabled attr on input -->
189
196
  ```
190
197
 
191
198
  ### Radio
@@ -198,7 +205,8 @@ Use the `mw-field` wrapper to group label + control + hint/error:
198
205
  </label>
199
206
 
200
207
  <!-- Color variants: mw-radio-primary / secondary / success / warning / danger / info -->
201
- <!-- Size variants: mw-radio-sm / mw-radio-lg / mw-radio-xl -->
208
+ <!-- Size variants: mw-radio-sm / mw-radio-lg -->
209
+ <!-- Disabled: add class mw-radio-disabled + disabled attr on input -->
202
210
  ```
203
211
 
204
212
  ### Toggle Switch
@@ -222,9 +230,11 @@ Use the `mw-field` wrapper to group label + control + hint/error:
222
230
  <label class="mw-field-label mw-required" for="name">Full Name</label>
223
231
  <input id="name" type="text" class="mw-input" formControlName="name" />
224
232
  <span class="mw-field-hint">As it appears on your ID.</span>
225
- <span class="mw-field-error" *ngIf="name.invalid && name.touched">
233
+ @if (name.invalid && name.touched) {
234
+ <span class="mw-field-error">
226
235
  <i class="fas fa-exclamation-circle"></i> Name is required.
227
236
  </span>
237
+ }
228
238
  </div>
229
239
  ```
230
240
 
@@ -274,8 +284,8 @@ Use the `mw-field` wrapper to group label + control + hint/error:
274
284
  <div class="mw-grid-4 mw-gap-4">...</div>
275
285
  <!-- 4-col grid -->
276
286
 
277
- <!-- Spacing: mw-mt-4, mw-mb-6, mw-mx-3, mw-my-2, mw-p-4, mw-px-6, mw-py-2 -->
278
- <!-- Gap values: 19 -->
287
+ <!-- Spacing keys: -6 to 13 (e.g. mw-mt-4, mw-mb-6, mw-mx-3, mw-p-4, mw-px-6) -->
288
+ <!-- Gap keys: 013 (negative values are invalid for gap and not generated) -->
279
289
  ```
280
290
 
281
291
  ---
@@ -312,12 +322,14 @@ Use the `mw-field` wrapper to group label + control + hint/error:
312
322
  <div class="mw-alert mw-alert-danger">Error message.</div>
313
323
 
314
324
  <!-- Closable (handle dismiss in component) -->
315
- <div class="mw-alert mw-alert-primary" *ngIf="showAlert">
325
+ @if (showAlert) {
326
+ <div class="mw-alert mw-alert-primary">
316
327
  Message
317
328
  <button class="mw-btn mw-btn-link" (click)="showAlert = false">
318
329
  <i class="fas fa-times"></i>
319
330
  </button>
320
331
  </div>
332
+ }
321
333
  ```
322
334
 
323
335
  ---
@@ -334,12 +346,14 @@ Use the `mw-field` wrapper to group label + control + hint/error:
334
346
  </tr>
335
347
  </thead>
336
348
  <tbody>
337
- <tr *ngFor="let item of items">
349
+ @for (item of items; track item.id) {
350
+ <tr>
338
351
  <td>{{ item.name }}</td>
339
352
  <td>
340
353
  <span class="mw-tag mw-tag-success">Active</span>
341
354
  </td>
342
355
  </tr>
356
+ }
343
357
  </tbody>
344
358
  </table>
345
359
  </div>
@@ -396,9 +410,11 @@ Use the `mw-field` wrapper to group label + control + hint/error:
396
410
  <div class="mw-spinner mw-spinner-sm mw-spinner-secondary"></div>
397
411
 
398
412
  <!-- With overlay (e.g., on async operations) -->
399
- <div class="mw-spinner-overlay" *ngIf="isLoading">
413
+ @if (isLoading) {
414
+ <div class="mw-spinner-overlay">
400
415
  <div class="mw-spinner mw-spinner-primary"></div>
401
416
  </div>
417
+ }
402
418
  ```
403
419
 
404
420
  ---
@@ -407,14 +423,17 @@ Use the `mw-field` wrapper to group label + control + hint/error:
407
423
 
408
424
  ```html
409
425
  <!-- Show while data is loading -->
410
- <div class="mw-skeleton-card" *ngIf="isLoading">
426
+ @if (isLoading) {
427
+ <div class="mw-skeleton-card">
411
428
  <span class="mw-skeleton mw-skeleton-title"></span>
412
429
  <span class="mw-skeleton mw-skeleton-text"></span>
413
430
  <span class="mw-skeleton mw-skeleton-text"></span>
414
431
  </div>
432
+ }
415
433
 
416
434
  <!-- Avatar + text placeholder -->
417
- <div class="mw-skeleton-card" *ngIf="isLoading">
435
+ @if (isLoading) {
436
+ <div class="mw-skeleton-card">
418
437
  <div class="mw-skeleton-row">
419
438
  <span class="mw-skeleton mw-skeleton-circle"></span>
420
439
  <div class="mw-skeleton-body">
@@ -423,6 +442,7 @@ Use the `mw-field` wrapper to group label + control + hint/error:
423
442
  </div>
424
443
  </div>
425
444
  </div>
445
+ }
426
446
  ```
427
447
 
428
448
  ---
@@ -505,6 +525,8 @@ Use the `mw-field` wrapper to group label + control + hint/error:
505
525
 
506
526
  ```typescript
507
527
  // component.ts
528
+ private fb = inject(FormBuilder);
529
+
508
530
  form = this.fb.group({
509
531
  email: ['', [Validators.required, Validators.email]],
510
532
  name: ['', Validators.required],
@@ -526,19 +548,16 @@ get email() { return this.form.get('email')!; }
526
548
  <span class="mw-input-group-prefix"><i class="fas fa-envelope"></i></span>
527
549
  <input id="email" type="email" class="mw-input" formControlName="email" />
528
550
  </div>
529
- <span
530
- class="mw-field-error"
531
- *ngIf="email.errors?.['required'] && email.touched"
532
- >
551
+ @if (email.errors?.['required'] && email.touched) {
552
+ <span class="mw-field-error">
533
553
  <i class="fas fa-exclamation-circle"></i> Email is required.
534
554
  </span>
535
- <span
536
- class="mw-field-error"
537
- *ngIf="email.errors?.['email'] && email.touched"
538
- >
555
+ } @if (email.errors?.['email'] && email.touched) {
556
+ <span class="mw-field-error">
539
557
  <i class="fas fa-exclamation-circle"></i> Please enter a valid email
540
558
  address.
541
559
  </span>
560
+ }
542
561
  </div>
543
562
 
544
563
  <div class="mw-field">
@@ -564,17 +583,15 @@ get email() { return this.form.get('email')!; }
564
583
  ### Loading state pattern
565
584
 
566
585
  ```html
567
- <!-- Use skeleton while loading, then show real content -->
568
- <ng-container *ngIf="!isLoading; else loadingTpl">
569
- <div class="mw-card mw-card-simple">
570
- <!-- real content -->
571
- </div>
572
- </ng-container>
573
- <ng-template #loadingTpl>
574
- <div class="mw-skeleton-card">
575
- <span class="mw-skeleton mw-skeleton-title"></span>
576
- <span class="mw-skeleton mw-skeleton-text"></span>
577
- <span class="mw-skeleton mw-skeleton-text"></span>
578
- </div>
579
- </ng-template>
586
+ @if (!isLoading) {
587
+ <div class="mw-card mw-card-simple">
588
+ <!-- real content -->
589
+ </div>
590
+ } @else {
591
+ <div class="mw-skeleton-card">
592
+ <span class="mw-skeleton mw-skeleton-title"></span>
593
+ <span class="mw-skeleton mw-skeleton-text"></span>
594
+ <span class="mw-skeleton mw-skeleton-text"></span>
595
+ </div>
596
+ }
580
597
  ```
package/CHANGELOG.md CHANGED
@@ -6,6 +6,12 @@ Patch releases are only for test purposes - here I only document major and minor
6
6
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
7
7
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
 
9
+ ## [3.2.0] - 2026-04-11
10
+
11
+ ### Changed
12
+
13
+ - complete rework of spacing
14
+
9
15
  ## [3.1.0] - 2026-04-04
10
16
 
11
17
  ### Changed
package/index.html CHANGED
@@ -154,14 +154,16 @@
154
154
  <section id="foundations">
155
155
  <div class="mw-container">
156
156
  <h2 class="mw-section-title">Foundations</h2>
157
- <div class="mw-button-bar mw-button-bar-primary">
158
- <a href="#typography" class="mw-btn">Typography</a>
159
- <a href="#colors" class="mw-btn">Main Colors</a>
160
- <a href="#utilities" class="mw-btn">Utilities</a>
161
- <a href="#header-utilities" class="mw-btn">Header Utilities</a>
162
- <a href="#coming-soon" class="mw-btn">Coming Soon Banner</a>
163
- <a href="#divider" class="mw-btn">Divider</a>
164
- </div>
157
+ <nav class="mw-section-nav">
158
+ <a href="#typography" class="mw-section-btn">Typography</a>
159
+ <a href="#colors" class="mw-section-btn">Main Colors</a>
160
+ <a href="#utilities" class="mw-section-btn">Utilities</a>
161
+ <a href="#header-utilities" class="mw-section-btn"
162
+ >Header Utilities</a
163
+ >
164
+ <a href="#coming-soon" class="mw-section-btn">Coming Soon Banner</a>
165
+ <a href="#divider" class="mw-section-btn">Divider</a>
166
+ </nav>
165
167
 
166
168
  <!-- Typography container -->
167
169
  <div id="typography">
@@ -199,19 +201,19 @@
199
201
  <section id="layout" class="mw-section-alternate">
200
202
  <div class="mw-container">
201
203
  <h2 class="mw-section-title">Layout</h2>
202
- <div class="mw-button-bar mw-button-bar-primary">
203
- <a href="#grid" class="mw-btn">Grid System</a>
204
- <a href="#cards" class="mw-btn">Cards</a>
205
- <a href="#panels" class="mw-btn">Panels</a>
206
- <a href="#tabs" class="mw-btn">Tabs</a>
207
- <a href="#accordions" class="mw-btn">Accordions</a>
208
- <a href="#tiles" class="mw-btn">Tiles</a>
209
- <a href="#breadcrumbs" class="mw-btn">Breadcrumbs</a>
210
- <a href="#modals" class="mw-btn">Modals</a>
211
- <a href="#html-lists" class="mw-btn">HTML Lists</a>
212
- <a href="#item-lists" class="mw-btn">Item Lists</a>
213
- <a href="#stepper" class="mw-btn">Stepper</a>
214
- </div>
204
+ <nav class="mw-section-nav">
205
+ <a href="#grid" class="mw-section-btn">Grid System</a>
206
+ <a href="#cards" class="mw-section-btn">Cards</a>
207
+ <a href="#panels" class="mw-section-btn">Panels</a>
208
+ <a href="#tabs" class="mw-section-btn">Tabs</a>
209
+ <a href="#accordions" class="mw-section-btn">Accordions</a>
210
+ <a href="#tiles" class="mw-section-btn">Tiles</a>
211
+ <a href="#breadcrumbs" class="mw-section-btn">Breadcrumbs</a>
212
+ <a href="#modals" class="mw-section-btn">Modals</a>
213
+ <a href="#html-lists" class="mw-section-btn">HTML Lists</a>
214
+ <a href="#item-lists" class="mw-section-btn">Item Lists</a>
215
+ <a href="#stepper" class="mw-section-btn">Stepper</a>
216
+ </nav>
215
217
 
216
218
  <!-- Grid container -->
217
219
  <div id="grid">@@include('./src/partials/grid-container.html')</div>
@@ -266,20 +268,20 @@
266
268
  <section id="components">
267
269
  <div class="mw-container">
268
270
  <h2 class="mw-section-title">Components</h2>
269
- <div class="mw-button-bar mw-button-bar-primary">
270
- <a href="#buttons" class="mw-btn">Buttons</a>
271
- <a href="#button-bar" class="mw-btn">Button Bar</a>
272
- <a href="#progress" class="mw-btn">Progress Bars</a>
273
- <a href="#spinners" class="mw-btn">Loading Spinners</a>
274
- <a href="#avatars" class="mw-btn">Avatars</a>
275
- <a href="#tags" class="mw-btn">Tags</a>
276
- <a href="#ratings" class="mw-btn">Ratings</a>
277
- <a href="#info" class="mw-btn">Info</a>
278
- <a href="#alerts" class="mw-btn">Alerts</a>
279
- <a href="#code" class="mw-btn">Code</a>
280
- <a href="#skeleton" class="mw-btn">Skeleton</a>
281
- <a href="#empty-state" class="mw-btn">Empty State</a>
282
- </div>
271
+ <nav class="mw-section-nav">
272
+ <a href="#buttons" class="mw-section-btn">Buttons</a>
273
+ <a href="#button-bar" class="mw-section-btn">Button Bar</a>
274
+ <a href="#progress" class="mw-section-btn">Progress Bars</a>
275
+ <a href="#spinners" class="mw-section-btn">Loading Spinners</a>
276
+ <a href="#avatars" class="mw-section-btn">Avatars</a>
277
+ <a href="#tags" class="mw-section-btn">Tags</a>
278
+ <a href="#ratings" class="mw-section-btn">Ratings</a>
279
+ <a href="#info" class="mw-section-btn">Info</a>
280
+ <a href="#alerts" class="mw-section-btn">Alerts</a>
281
+ <a href="#code" class="mw-section-btn">Code</a>
282
+ <a href="#skeleton" class="mw-section-btn">Skeleton</a>
283
+ <a href="#empty-state" class="mw-section-btn">Empty State</a>
284
+ </nav>
283
285
 
284
286
  <!-- Buttons container -->
285
287
  <div id="buttons">
@@ -341,13 +343,13 @@
341
343
  <section id="forms" class="mw-section-alternate">
342
344
  <div class="mw-container">
343
345
  <h2 class="mw-section-title">Forms</h2>
344
- <div class="mw-button-bar mw-button-bar-primary">
345
- <a href="#form-elements" class="mw-btn">Form Elements</a>
346
- <a href="#input-group" class="mw-btn">Input Group</a>
347
- <a href="#form-field" class="mw-btn">Field Pattern</a>
348
- <a href="#form" class="mw-btn">Form</a>
349
- <a href="#login" class="mw-btn">Login</a>
350
- </div>
346
+ <nav class="mw-section-nav">
347
+ <a href="#form-elements" class="mw-section-btn">Form Elements</a>
348
+ <a href="#input-group" class="mw-section-btn">Input Group</a>
349
+ <a href="#form-field" class="mw-section-btn">Field Pattern</a>
350
+ <a href="#form" class="mw-section-btn">Form</a>
351
+ <a href="#login" class="mw-section-btn">Login</a>
352
+ </nav>
351
353
 
352
354
  <!-- Form elements container -->
353
355
  <div id="form-elements">
@@ -376,18 +378,18 @@
376
378
  <section id="data-display">
377
379
  <div class="mw-container">
378
380
  <h2 class="mw-section-title">Data & Display</h2>
379
- <div class="mw-button-bar mw-button-bar-primary">
380
- <a href="#meta-info" class="mw-btn">Meta Info</a>
381
- <a href="#tables" class="mw-btn">Tables</a>
382
- <a href="#pagination" class="mw-btn">Pagination</a>
383
- <a href="#timelines" class="mw-btn">Timelines</a>
384
- <a href="#gallery" class="mw-btn">Image Gallery</a>
385
- <a href="#techstack-bucket" class="mw-btn"
381
+ <nav class="mw-section-nav">
382
+ <a href="#meta-info" class="mw-section-btn">Meta Info</a>
383
+ <a href="#tables" class="mw-section-btn">Tables</a>
384
+ <a href="#pagination" class="mw-section-btn">Pagination</a>
385
+ <a href="#timelines" class="mw-section-btn">Timelines</a>
386
+ <a href="#gallery" class="mw-section-btn">Image Gallery</a>
387
+ <a href="#techstack-bucket" class="mw-section-btn"
386
388
  >Technology Stack Bucket</a
387
389
  >
388
- <a href="#content-slider" class="mw-btn">Content Slider</a>
389
- <a href="#blog-posts" class="mw-btn">Blog Posts</a>
390
- </div>
390
+ <a href="#content-slider" class="mw-section-btn">Content Slider</a>
391
+ <a href="#blog-posts" class="mw-section-btn">Blog Posts</a>
392
+ </nav>
391
393
 
392
394
  <!-- Meta Info container -->
393
395
  <div id="meta-info">