maverick-wave 4.28.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +29 -1
- package/.claude/skills/mw-maverick-wave/SKILL.md +39 -24
- package/.claude/skills/mw-maverick-wave/examples/angular-services.md +16 -4
- package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +13 -4
- package/.claude/skills/mw-maverick-wave/references/components.md +42 -5
- package/.claude/skills/mw-maverick-wave/references/forms.md +14 -2
- package/.claude/skills/mw-maverick-wave/references/javascript.md +17 -4
- package/.claude/skills/mw-maverick-wave/references/layout.md +53 -19
- package/.claude/skills/mw-maverick-wave/references/theming.md +38 -1
- package/.impeccable/config.local.json +5 -0
- package/.impeccable/hook.cache.json +1 -0
- package/CHANGELOG.md +11 -0
- package/CLAUDE.md +5 -5
- package/README.md +48 -4
- package/index.html +19 -38
- package/maverick-wave.min.css +14 -12
- package/maverick-wave.min.js +1 -1
- package/package.json +2 -2
- package/scripts/verify.js +27 -2
- package/src/js/main.js +223 -83
- package/src/partials/accordions-container.html +6 -10
- package/src/partials/alerts-container.html +6 -6
- package/src/partials/announcement-container.html +5 -5
- package/src/partials/avatars-container.html +85 -17
- package/src/partials/badges-container.html +6 -6
- package/src/partials/blog-posts-container.html +11 -12
- package/src/partials/buttons-container.html +3 -3
- package/src/partials/cards-container.html +26 -9
- package/src/partials/code-container.html +5 -5
- package/src/partials/content-slider-container.html +5 -4
- package/src/partials/divider-container.html +7 -7
- package/src/partials/dropdown-container.html +2 -2
- package/src/partials/empty-state-container.html +5 -5
- package/src/partials/footer-container.html +21 -18
- package/src/partials/form-elements-container.html +14 -14
- package/src/partials/gallery-container.html +16 -8
- package/src/partials/get-started-container.html +4 -8
- package/src/partials/header-container.html +18 -7
- package/src/partials/home-container.html +10 -20
- package/src/partials/input-group-container.html +11 -2
- package/src/partials/kbd-container.html +1 -1
- package/src/partials/login-container.html +5 -1
- package/src/partials/media-container.html +2 -2
- package/src/partials/modals-container.html +22 -32
- package/src/partials/pricing-container.html +9 -9
- package/src/partials/skeleton-container.html +6 -6
- package/src/partials/stepper-container.html +2 -2
- package/src/partials/tables-container.html +12 -12
- package/src/partials/tabs-container.html +17 -27
- package/src/partials/tags-container.html +23 -17
- package/src/partials/techstack-bucket-container.html +13 -0
- package/src/partials/tiles-container.html +26 -9
- package/src/partials/typography-container.html +7 -6
- package/src/partials/utilities-container.html +35 -15
- package/src/scss/_layers.scss +10 -0
- package/src/scss/abstracts/_index.scss +6 -0
- package/src/scss/abstracts/_mixins.scss +61 -153
- package/src/scss/abstracts/_variables.scss +123 -319
- package/src/scss/base/_base.scss +170 -190
- package/src/scss/base/_reset.scss +106 -104
- package/src/scss/base/_typography.scss +153 -151
- package/src/scss/components/_accordions.scss +97 -97
- package/src/scss/components/_alerts.scss +71 -70
- package/src/scss/components/_announcement.scss +71 -70
- package/src/scss/components/_avatars.scss +130 -142
- package/src/scss/components/_badge.scss +131 -132
- package/src/scss/components/_blog-post.scss +223 -220
- package/src/scss/components/_breadcrumbs.scss +93 -92
- package/src/scss/components/_button-bar.scss +102 -110
- package/src/scss/components/_buttons.scss +319 -324
- package/src/scss/components/_calendar.scss +251 -252
- package/src/scss/components/_cards.scss +359 -386
- package/src/scss/components/_code.scss +190 -194
- package/src/scss/components/_coming-soon.scss +77 -75
- package/src/scss/components/_content-slider.scss +90 -89
- package/src/scss/components/_divider.scss +55 -53
- package/src/scss/components/_dropdown.scss +179 -185
- package/src/scss/components/_empty-state.scss +57 -57
- package/src/scss/components/_flag.scss +294 -278
- package/src/scss/components/_gallery.scss +131 -133
- package/src/scss/components/_info.scss +151 -167
- package/src/scss/components/_kanban.scss +332 -341
- package/src/scss/components/_kbd.scss +40 -38
- package/src/scss/components/_lang-switch.scss +89 -97
- package/src/scss/components/_links.scss +21 -28
- package/src/scss/components/_lists.scss +510 -514
- package/src/scss/components/_localhost-indicator.scss +26 -24
- package/src/scss/components/_media.scss +22 -20
- package/src/scss/components/_meta-info.scss +35 -33
- package/src/scss/components/_modals.scss +277 -186
- package/src/scss/components/_pagination.scss +81 -87
- package/src/scss/components/_panels.scss +99 -97
- package/src/scss/components/_pricing.scss +183 -241
- package/src/scss/components/_progress.scss +112 -89
- package/src/scss/components/_prose.scss +35 -33
- package/src/scss/components/_ratings.scss +40 -38
- package/src/scss/components/_segmented.scss +82 -84
- package/src/scss/components/_skeleton.scss +66 -72
- package/src/scss/components/_spinners.scss +155 -159
- package/src/scss/components/_stepper.scss +116 -116
- package/src/scss/components/_tables.scss +155 -148
- package/src/scss/components/_tabs.scss +232 -141
- package/src/scss/components/_tags.scss +109 -107
- package/src/scss/components/_techstack-bucket.scss +123 -122
- package/src/scss/components/_testimonial.scss +72 -70
- package/src/scss/components/_theme-toggle.scss +53 -51
- package/src/scss/components/_tiles.scss +174 -174
- package/src/scss/components/_timelines.scss +282 -280
- package/src/scss/components/_toasts.scss +66 -72
- package/src/scss/form-elements/_checkbox.scss +117 -132
- package/src/scss/form-elements/_form.scss +149 -115
- package/src/scss/form-elements/_input-group.scss +99 -103
- package/src/scss/form-elements/_input.scss +74 -74
- package/src/scss/form-elements/_login.scss +48 -48
- package/src/scss/form-elements/_prefilled.scss +53 -51
- package/src/scss/form-elements/_radio.scss +95 -107
- package/src/scss/form-elements/_select.scss +42 -42
- package/src/scss/form-elements/_slider.scss +117 -132
- package/src/scss/form-elements/_textarea.scss +68 -54
- package/src/scss/form-elements/_toggle.scss +127 -140
- package/src/scss/layout/_footer.scss +172 -171
- package/src/scss/layout/_grid.scss +268 -302
- package/src/scss/layout/_header.scss +426 -427
- package/src/scss/layout/_home.scss +28 -27
- package/src/scss/layout/_main.scss +275 -238
- package/src/scss/layout/_page-header.scss +38 -36
- package/src/scss/layout/_section.scss +150 -124
- package/src/scss/main.scss +1 -1
- package/src/scss/utilities/_accessibility.scss +46 -45
- package/src/scss/utilities/_aspect.scss +22 -20
- package/src/scss/utilities/_corner.scss +23 -5
- package/src/scss/utilities/_display.scss +76 -70
- package/src/scss/utilities/_elevation.scss +13 -11
- package/src/scss/utilities/_flex.scss +83 -85
- package/src/scss/utilities/_reveal.scss +40 -63
- package/src/scss/utilities/_spacing.scss +63 -64
- package/src/scss/utilities/_text.scss +139 -141
- package/src/scss/utilities/_touch-targets.scss +130 -147
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,17 @@ 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.0.0] - 2026-09-10
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- layers
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- tried out some skills and updated some stuff
|
|
18
|
+
- refactored complete code
|
|
19
|
+
|
|
9
20
|
## [4.28.0] - 2026-09-08
|
|
10
21
|
|
|
11
22
|
### 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,
|
|
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 (
|
|
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
|
|
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
|
|
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-
|
|
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
|
-
-
|
|
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@
|
|
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@
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
617
|
-
|
|
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>
|