maverick-wave 4.28.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/.claude/settings.local.json +29 -1
  2. package/.claude/skills/mw-maverick-wave/SKILL.md +39 -24
  3. package/.claude/skills/mw-maverick-wave/examples/angular-services.md +16 -4
  4. package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +13 -4
  5. package/.claude/skills/mw-maverick-wave/references/components.md +42 -5
  6. package/.claude/skills/mw-maverick-wave/references/forms.md +14 -2
  7. package/.claude/skills/mw-maverick-wave/references/javascript.md +17 -4
  8. package/.claude/skills/mw-maverick-wave/references/layout.md +53 -19
  9. package/.claude/skills/mw-maverick-wave/references/theming.md +38 -1
  10. package/.impeccable/config.local.json +5 -0
  11. package/.impeccable/hook.cache.json +75 -0
  12. package/CHANGELOG.md +17 -0
  13. package/CLAUDE.md +5 -5
  14. package/README.md +48 -4
  15. package/index.html +19 -38
  16. package/maverick-wave.min.css +14 -12
  17. package/maverick-wave.min.js +1 -1
  18. package/package.json +2 -2
  19. package/scripts/verify.js +27 -2
  20. package/src/js/main.js +223 -83
  21. package/src/partials/accordions-container.html +6 -10
  22. package/src/partials/alerts-container.html +6 -6
  23. package/src/partials/announcement-container.html +5 -5
  24. package/src/partials/avatars-container.html +85 -17
  25. package/src/partials/badges-container.html +6 -6
  26. package/src/partials/blog-posts-container.html +11 -12
  27. package/src/partials/buttons-container.html +3 -3
  28. package/src/partials/cards-container.html +26 -9
  29. package/src/partials/code-container.html +5 -5
  30. package/src/partials/content-slider-container.html +5 -4
  31. package/src/partials/divider-container.html +7 -7
  32. package/src/partials/dropdown-container.html +2 -2
  33. package/src/partials/empty-state-container.html +5 -5
  34. package/src/partials/footer-container.html +21 -18
  35. package/src/partials/form-elements-container.html +14 -14
  36. package/src/partials/gallery-container.html +16 -8
  37. package/src/partials/get-started-container.html +4 -8
  38. package/src/partials/header-container.html +18 -7
  39. package/src/partials/home-container.html +10 -20
  40. package/src/partials/input-group-container.html +11 -2
  41. package/src/partials/kbd-container.html +1 -1
  42. package/src/partials/login-container.html +5 -1
  43. package/src/partials/media-container.html +2 -2
  44. package/src/partials/modals-container.html +22 -32
  45. package/src/partials/pricing-container.html +9 -9
  46. package/src/partials/skeleton-container.html +6 -6
  47. package/src/partials/stepper-container.html +2 -2
  48. package/src/partials/tables-container.html +12 -12
  49. package/src/partials/tabs-container.html +17 -27
  50. package/src/partials/tags-container.html +23 -17
  51. package/src/partials/techstack-bucket-container.html +13 -0
  52. package/src/partials/tiles-container.html +26 -9
  53. package/src/partials/typography-container.html +7 -6
  54. package/src/partials/utilities-container.html +35 -15
  55. package/src/scss/_layers.scss +10 -0
  56. package/src/scss/abstracts/_index.scss +6 -0
  57. package/src/scss/abstracts/_mixins.scss +61 -153
  58. package/src/scss/abstracts/_variables.scss +123 -319
  59. package/src/scss/base/_base.scss +170 -190
  60. package/src/scss/base/_reset.scss +106 -104
  61. package/src/scss/base/_typography.scss +153 -151
  62. package/src/scss/components/_accordions.scss +97 -97
  63. package/src/scss/components/_alerts.scss +71 -70
  64. package/src/scss/components/_announcement.scss +71 -70
  65. package/src/scss/components/_avatars.scss +130 -142
  66. package/src/scss/components/_badge.scss +131 -132
  67. package/src/scss/components/_blog-post.scss +223 -220
  68. package/src/scss/components/_breadcrumbs.scss +93 -92
  69. package/src/scss/components/_button-bar.scss +102 -110
  70. package/src/scss/components/_buttons.scss +319 -324
  71. package/src/scss/components/_calendar.scss +251 -252
  72. package/src/scss/components/_cards.scss +359 -386
  73. package/src/scss/components/_code.scss +190 -194
  74. package/src/scss/components/_coming-soon.scss +77 -75
  75. package/src/scss/components/_content-slider.scss +90 -89
  76. package/src/scss/components/_divider.scss +55 -53
  77. package/src/scss/components/_dropdown.scss +179 -185
  78. package/src/scss/components/_empty-state.scss +57 -57
  79. package/src/scss/components/_flag.scss +294 -278
  80. package/src/scss/components/_gallery.scss +131 -133
  81. package/src/scss/components/_info.scss +151 -167
  82. package/src/scss/components/_kanban.scss +332 -341
  83. package/src/scss/components/_kbd.scss +40 -38
  84. package/src/scss/components/_lang-switch.scss +89 -97
  85. package/src/scss/components/_links.scss +21 -28
  86. package/src/scss/components/_lists.scss +510 -514
  87. package/src/scss/components/_localhost-indicator.scss +26 -24
  88. package/src/scss/components/_media.scss +22 -20
  89. package/src/scss/components/_meta-info.scss +35 -33
  90. package/src/scss/components/_modals.scss +277 -186
  91. package/src/scss/components/_pagination.scss +81 -87
  92. package/src/scss/components/_panels.scss +99 -97
  93. package/src/scss/components/_pricing.scss +183 -241
  94. package/src/scss/components/_progress.scss +122 -89
  95. package/src/scss/components/_prose.scss +35 -33
  96. package/src/scss/components/_ratings.scss +40 -38
  97. package/src/scss/components/_segmented.scss +82 -84
  98. package/src/scss/components/_skeleton.scss +66 -72
  99. package/src/scss/components/_spinners.scss +155 -159
  100. package/src/scss/components/_stepper.scss +116 -116
  101. package/src/scss/components/_tables.scss +155 -148
  102. package/src/scss/components/_tabs.scss +232 -141
  103. package/src/scss/components/_tags.scss +109 -107
  104. package/src/scss/components/_techstack-bucket.scss +123 -122
  105. package/src/scss/components/_testimonial.scss +72 -70
  106. package/src/scss/components/_theme-toggle.scss +53 -51
  107. package/src/scss/components/_tiles.scss +174 -174
  108. package/src/scss/components/_timelines.scss +282 -280
  109. package/src/scss/components/_toasts.scss +66 -72
  110. package/src/scss/form-elements/_checkbox.scss +117 -132
  111. package/src/scss/form-elements/_form.scss +149 -115
  112. package/src/scss/form-elements/_input-group.scss +99 -103
  113. package/src/scss/form-elements/_input.scss +74 -74
  114. package/src/scss/form-elements/_login.scss +48 -48
  115. package/src/scss/form-elements/_prefilled.scss +53 -51
  116. package/src/scss/form-elements/_radio.scss +95 -107
  117. package/src/scss/form-elements/_select.scss +42 -42
  118. package/src/scss/form-elements/_slider.scss +117 -132
  119. package/src/scss/form-elements/_textarea.scss +68 -54
  120. package/src/scss/form-elements/_toggle.scss +127 -140
  121. package/src/scss/layout/_footer.scss +172 -171
  122. package/src/scss/layout/_grid.scss +268 -302
  123. package/src/scss/layout/_header.scss +426 -427
  124. package/src/scss/layout/_home.scss +28 -27
  125. package/src/scss/layout/_main.scss +275 -238
  126. package/src/scss/layout/_page-header.scss +38 -36
  127. package/src/scss/layout/_section.scss +150 -124
  128. package/src/scss/main.scss +1 -1
  129. package/src/scss/utilities/_accessibility.scss +46 -45
  130. package/src/scss/utilities/_aspect.scss +22 -20
  131. package/src/scss/utilities/_corner.scss +23 -5
  132. package/src/scss/utilities/_display.scss +76 -70
  133. package/src/scss/utilities/_elevation.scss +13 -11
  134. package/src/scss/utilities/_flex.scss +83 -85
  135. package/src/scss/utilities/_reveal.scss +40 -63
  136. package/src/scss/utilities/_spacing.scss +63 -64
  137. package/src/scss/utilities/_text.scss +139 -141
  138. package/src/scss/utilities/_touch-targets.scss +130 -147
@@ -0,0 +1,75 @@
1
+ {
2
+ "version": 1,
3
+ "sessions": {
4
+ "5682ec58-6688-479f-994f-990ff918c05d": {
5
+ "updatedAt": 1789084033412,
6
+ "files": {
7
+ "/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/layout/_header.scss": {
8
+ "editCount": 3,
9
+ "findings": [],
10
+ "stopBaseline": { "version": 1, "engine": "0.1.5", "counts": {} },
11
+ "cleanAcked": true
12
+ },
13
+ "/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/form-elements/_slider.scss": {
14
+ "editCount": 1,
15
+ "findings": [],
16
+ "stopBaseline": { "version": 1, "engine": "0.1.5", "counts": {} },
17
+ "cleanAcked": true
18
+ },
19
+ "/Users/m1well/Dev/workspace/css/maverick-wave/src/js/main.js": {
20
+ "editCount": 7,
21
+ "findings": []
22
+ },
23
+ "/Users/m1well/Dev/workspace/css/maverick-wave/index.html": {
24
+ "editCount": 2,
25
+ "findings": [
26
+ "low-contrast:0:3.3:1 (need 4.5:1) — text #7d85a5 on #313746",
27
+ "pulsing-dot:0:.mw-spinner-dots>div — 16x16px dot with infinite \"mw-bounce\" animation",
28
+ "dark-glow:0:Colored box-shadow glow (#d1bb21) on dark page"
29
+ ]
30
+ },
31
+ "/Users/m1well/Dev/workspace/css/maverick-wave/src/partials/typography-container.html": {
32
+ "editCount": 2,
33
+ "findings": [],
34
+ "cleanAcked": true
35
+ },
36
+ "/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/base/_base.scss": {
37
+ "editCount": 2,
38
+ "findings": [],
39
+ "stopBaseline": { "version": 1, "engine": "0.1.5", "counts": {} },
40
+ "cleanAcked": true
41
+ },
42
+ "/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/layout/_section.scss": {
43
+ "editCount": 7,
44
+ "findings": [],
45
+ "cleanAcked": true
46
+ },
47
+ "/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/form-elements/_form.scss": {
48
+ "editCount": 1,
49
+ "findings": [],
50
+ "stopBaseline": { "version": 1, "engine": "0.1.5", "counts": {} },
51
+ "cleanAcked": true
52
+ },
53
+ "/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/components/_alerts.scss": {
54
+ "editCount": 1,
55
+ "findings": ["side-tab:83"],
56
+ "stopBaseline": {
57
+ "version": 1,
58
+ "engine": "0.1.5",
59
+ "counts": {
60
+ "62d926b4b80efa38e6fbf0fe65f45cf171d9b8a80be0b2ee47ac4cbb6c9498d0": 1
61
+ }
62
+ },
63
+ "cleanAcked": true
64
+ },
65
+ "/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/layout/_main.scss": {
66
+ "editCount": 1,
67
+ "findings": [],
68
+ "stopBaseline": { "version": 1, "engine": "0.1.5", "counts": {} },
69
+ "cleanAcked": true
70
+ }
71
+ },
72
+ "footerShown": true
73
+ }
74
+ }
75
+ }
package/CHANGELOG.md CHANGED
@@ -6,6 +6,23 @@ 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
+ ## [5.1.0] - 2026-09-11
10
+
11
+ ### Fixed
12
+
13
+ - progress animation
14
+
15
+ ## [5.0.0] - 2026-09-11
16
+
17
+ ### Added
18
+
19
+ - layers
20
+
21
+ ### Changed
22
+
23
+ - tried out some skills and updated some stuff
24
+ - refactored complete code
25
+
9
26
  ## [4.28.0] - 2026-09-08
10
27
 
11
28
  ### Added
package/CLAUDE.md CHANGED
@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
4
4
 
5
5
  ## Project Overview
6
6
 
7
- MaverickWave is a lightweight, modern CSS framework providing a grid system, 25+ UI components, utility classes, and light/dark mode support. The repo also contains the showcase/documentation website bundled into the distribution.
7
+ MaverickWave is a lightweight, modern CSS framework providing a grid system, 48 UI components, utility classes, and light/dark mode support. The repo also contains the showcase/documentation website bundled into the distribution.
8
8
 
9
9
  ## Commands
10
10
 
@@ -30,19 +30,19 @@ There are no test or lint scripts.
30
30
 
31
31
  - `abstracts/` - CSS custom properties, mixins, SCSS functions (color variant generation)
32
32
  - `base/` - Reset, element defaults, typography
33
- - `components/` - Self-contained component styles (25+ files, one per component)
33
+ - `components/` - Self-contained component styles (48 files, one per component)
34
34
  - `form-elements/` - Form input/select/checkbox-specific styles
35
35
  - `layout/` - Grid, container, header/footer, section
36
36
  - `utilities/` - Spacing, flex, display utility classes
37
37
  - `main.scss` - Entry point using `@use`/`@forward` (not `@import`)
38
38
 
39
- **JavaScript** (`src/js/main.js`) - Single file. All components auto-initialize on `DOMContentLoaded`. Includes: gallery slider, theme toggle (persisted to localStorage), accordion, mobile nav, progress bar (IntersectionObserver), scroll spy, tabs, alerts/toasts, modals, range inputs.
39
+ **JavaScript** (`src/js/main.js`) - Single file. All components auto-initialize on `DOMContentLoaded`. Includes: gallery and image sliders, theme toggle (persisted to localStorage, transitions suppressed during the flip), accordion, mobile nav, progress bar (IntersectionObserver), scroll spy, tabs (which also get their ARIA and arrow-key handling here), alerts/toasts, modals, range inputs, dropdowns, language switcher, checkbox lists, kanban board, calendar.
40
40
 
41
- **HTML showcase** (`index.html` + `src/partials/`) - The top-level `index.html` uses `@@include()` syntax to pull in 40+ partials from `src/partials/`. These compile into `dist/index.html`.
41
+ **HTML showcase** (`index.html` + `src/partials/`) - The top-level `index.html` uses `@@include()` syntax to pull in 60 partials from `src/partials/`. These compile into `dist/index.html`.
42
42
 
43
43
  ## Naming Conventions
44
44
 
45
- - **CSS classes**: `mw-` prefix for all framework classes (`.mw-button`, `.mw-card`, `.mw-modal`)
45
+ - **CSS classes**: `mw-` prefix for all framework classes (`.mw-btn`, `.mw-card`, `.mw-modal`)
46
46
  - **State classes**: `.mw-active`, `.mw-selected`
47
47
  - **CSS custom properties**: `--mw-` prefix (`--mw-primary-color`, `--mw-font-family-base`)
48
48
  - **Theme control**: `--mw-internal-theme-mode` CSS var controls whether theme is switchable/fixed-light/fixed-dark; body class `mw-theme-light` toggles light mode
package/README.md CHANGED
@@ -6,7 +6,7 @@ While AI tools helped kickstart the development of some components and provided
6
6
 
7
7
  - Consistent implementation of custom variables throughout the system
8
8
  - Proper integration between components and logical SCSS structure
9
- - Optimized specificity and selector hierarchy
9
+ - Cascade layers throughout, so a project overrides any `mw-` class with a plain selector
10
10
  - Reliable responsive behavior across devices
11
11
  - Built-in dark mode support and accessibility considerations
12
12
 
@@ -25,6 +25,8 @@ The result is a framework that balances utility with simplicity, offering develo
25
25
  - Easy Customization via CSS Custom Properties
26
26
  - Built-in Light & Dark Mode with optional theme switching
27
27
  - SCSS Source Files for advanced customization (Dart Sass, `@use`/`@forward`)
28
+ - Modals as `<div>` or as `<dialog>` - the latter brings the focus trap, Escape and the inert background from the platform
29
+ - Native form validation is styled through `:user-invalid`, alongside the class-driven error states for reactive forms
28
30
  - Minimal JavaScript footprint (single vanilla JS file, no dependencies)
29
31
 
30
32
  ## Installation & Usage
@@ -40,12 +42,12 @@ The result is a framework that balances utility with simplicity, offering develo
40
42
  <title>My MaverickWave Project</title>
41
43
  <link
42
44
  rel="stylesheet"
43
- href="https://cdn.jsdelivr.net/npm/maverick-wave@4.28.0/maverick-wave.min.css"
45
+ href="https://cdn.jsdelivr.net/npm/maverick-wave@5.0.0/maverick-wave.min.css"
44
46
  />
45
47
  </head>
46
48
  <body>
47
49
  <!-- Your content here -->
48
- <script src="https://cdn.jsdelivr.net/npm/maverick-wave@4.28.0/maverick-wave.min.js"></script>
50
+ <script src="https://cdn.jsdelivr.net/npm/maverick-wave@5.0.0/maverick-wave.min.js"></script>
49
51
  </body>
50
52
  </html>
51
53
  ```
@@ -307,6 +309,42 @@ card - keep that ordering if you retune the card, or the footer stops looking
307
309
  like a footer. The rule between the surfaces keeps its own fixed factor: it runs
308
310
  against the card, or it disappears into what it separates.
309
311
 
312
+ ### Overriding
313
+
314
+ Everything the framework emits sits in cascade layers:
315
+
316
+ ```css
317
+ @layer mw.reset, mw.base, mw.forms, mw.components, mw.layout, mw.utilities;
318
+ ```
319
+
320
+ An unlayered rule beats every layer no matter how specific it is, so a project
321
+ overrides a component with a single class selector - no `!important`, no
322
+ `.mw-card.mw-card`:
323
+
324
+ ```css
325
+ .mw-card {
326
+ border-radius: 12px;
327
+ }
328
+ ```
329
+
330
+ `!important` is not the stronger version of that, it is the weaker one: for
331
+ important declarations the layer order reverses and unlayered comes last, so an
332
+ important rule in `mw.base` beats an important one of yours even behind an ID
333
+ selector. A project coming from before 5.0 can drop the `!important`s it carried
334
+ for these overrides - the plain rule already wins.
335
+
336
+ That cuts both ways: third-party CSS loaded unlayered also beats the framework,
337
+ which is how an icon font ends up winning over `mw-tags-icon`. Load it into a
338
+ layer of its own:
339
+
340
+ ```html
341
+ <style>
342
+ @layer vendor, mw;
343
+ @import url('https://cdn.example.com/font-awesome.css') layer(vendor);
344
+ </style>
345
+ <link rel="stylesheet" href="maverick-wave.min.css" />
346
+ ```
347
+
310
348
  ### SCSS Source
311
349
 
312
350
  For full control, clone the repository and integrate `src/scss/main.scss` into your Sass build (Dart Sass required). MaverickWave uses modern `@use`/`@forward` syntax. Pass your overrides through `with`:
@@ -394,8 +432,14 @@ above):
394
432
  > contract. Theme switching, for example, is a single class on `<body>`:
395
433
 
396
434
  ```typescript
397
- // theme.service.ts
435
+ // theme.service.ts - mw-theme-switching suppresses the transitions the flip
436
+ // would otherwise start on every element at once
437
+ const root = document.documentElement;
438
+
439
+ root.classList.add('mw-theme-switching');
398
440
  document.body.classList.toggle('mw-theme-light', isLight);
441
+ void root.offsetHeight;
442
+ root.classList.remove('mw-theme-switching');
399
443
  ```
400
444
 
401
445
  The `mw-field` wrapper groups label, control, hint and error. Bind the error
package/index.html CHANGED
@@ -11,10 +11,16 @@
11
11
  content="telephone=no,email=no,address=no,date=no"
12
12
  />
13
13
  <title>MaverickWave</title>
14
- <link
15
- rel="stylesheet"
16
- href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"
17
- />
14
+ <!-- Third-party CSS goes into a layer of its own, declared ahead of the
15
+ framework's. Unlayered CSS beats every layer, so a plain <link> here
16
+ would let Font Awesome's `.fas { display }` win over `.mw-tags-icon`.
17
+ Any project that loads a vendor stylesheet next to MaverickWave wants
18
+ these two lines. -->
19
+ <style>
20
+ @layer vendor, mw;
21
+ @import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css')
22
+ layer(vendor);
23
+ </style>
18
24
  <link rel="stylesheet" href="maverick-wave.min.css" />
19
25
  <!-- Favicons -->
20
26
  <link rel="icon" type="image/svg+xml" href="favicon/favicon.svg" />
@@ -40,18 +46,10 @@
40
46
  position: relative;
41
47
  }
42
48
 
49
+ /* A version number is digits, so it gets the mono stack - the rest of
50
+ the pill is mw-hero-badge */
43
51
  .version-corner {
44
- position: absolute;
45
- top: -24px;
46
- right: 13%;
47
- background: var(--mw-primary-color);
48
- color: var(--mw-primary-accent-text-color);
49
- font-size: 1.1rem;
50
- padding: 0.3rem 0.7rem;
51
- border-radius: 0.4rem;
52
- font-weight: 600;
53
- box-shadow: 3px 7px 10px var(--mw-shadow);
54
- transform: rotate(7deg);
52
+ font-family: var(--mw-font-family-mono);
55
53
  }
56
54
 
57
55
  .color-card {
@@ -80,11 +78,6 @@
80
78
 
81
79
  /* Medium screens */
82
80
  @media (max-width: 992px) {
83
- .version-corner {
84
- right: 7%;
85
- font-size: 1rem;
86
- }
87
-
88
81
  /* Two calendars side by side squeeze their cells below md, so they
89
82
  stack one breakpoint earlier than mw-grid-2 would on its own */
90
83
  .calendar-demos {
@@ -94,15 +87,6 @@
94
87
 
95
88
  /* Small screens */
96
89
  @media (max-width: 576px) {
97
- /* The h1 drops to 2.2rem down here, so the sticker has to move up with
98
- it or it lands on the word instead of next to it */
99
- .version-corner {
100
- top: -32px;
101
- right: 4%;
102
- font-size: 0.9rem;
103
- padding: 0.25rem 0.55rem;
104
- }
105
-
106
90
  .color-swatch {
107
91
  margin: 0 auto 7px auto;
108
92
  width: 92%;
@@ -115,6 +99,8 @@
115
99
  </head>
116
100
 
117
101
  <body>
102
+ <a class="mw-skip-link" href="#main">Skip to content</a>
103
+
118
104
  <!-- Header -->
119
105
  <header class="mw-header mw-localhost-indicator-activated">
120
106
  <div class="mw-container">
@@ -122,7 +108,7 @@
122
108
  </div>
123
109
  </header>
124
110
 
125
- <main class="mw-main">
111
+ <main class="mw-main" id="main">
126
112
  <!-- Home section -->
127
113
  <section id="home" class="mw-section">
128
114
  <div class="mw-container">
@@ -612,14 +598,9 @@
612
598
  apply(cycleSwitch.querySelector('.mw-active'));
613
599
  });
614
600
 
615
- // for the modals
616
- function openModal(modalId) {
617
- document.getElementById(modalId).classList.add('mw-modal-open');
618
- }
619
-
620
- function closeModal(modalId) {
621
- document.getElementById(modalId).classList.remove('mw-modal-open');
622
- }
601
+ // for the modals - the framework handles both shapes, div and <dialog>
602
+ const openModal = window.mwOpenModal;
603
+ const closeModal = window.mwCloseModal;
623
604
  </script>
624
605
  </body>
625
606
  </html>