maverick-wave 4.27.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 +42 -25
- 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 +90 -5
- package/.claude/skills/mw-maverick-wave/references/forms.md +14 -2
- package/.claude/skills/mw-maverick-wave/references/javascript.md +18 -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 +17 -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 +266 -75
- 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/header-utilities-container.html +192 -5
- 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 +325 -0
- package/src/scss/components/_gallery.scss +131 -133
- package/src/scss/components/_index.scss +2 -0
- 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 +108 -0
- 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
|
@@ -78,6 +78,7 @@ Safari 16.4+, Firefox 128+. The same range is declared as `browserslist` in
|
|
|
78
78
|
| `--mw-kanban-background`, `--mw-kanban-lane-border`, `--mw-kanban-column-min-height` | Per-board surface, lane border and lane floor (120px, 90px on `mw-kanban-compact`) |
|
|
79
79
|
| `--mw-container-gutter`, `--mw-container-width` | Page gutter of `mw-container` (fluid `clamp(1rem, 4.2vw + 0.5rem, 4rem)`, never below the safe-area inset) and the width derived from it (`min(1200px, 100% - 2 * gutter)`) |
|
|
80
80
|
| `--mw-section-padding-block` | Top/bottom rhythm of `mw-section` (3.3rem, stepping down to 2.5rem below `md` and 1.75rem below `sm`) |
|
|
81
|
+
| `--mw-section-nav-height` | Height the sticky `mw-section-nav` reserves (3.7rem). Add it to `--mw-header-height` for the `scroll-margin-top` of anything the strip can cover |
|
|
81
82
|
| `--mw-calendar-dot` | Colour of a single calendar dot - set it per dot or per cell; the `mw-calendar-dot-*` classes are presets for it |
|
|
82
83
|
| `--mw-scroll-hint-cover` | Colour the scroll hint on a tab bar fades into. Preset to the page, re-pointed to the card background inside `mw-card`, `mw-panel`, `mw-modal`, `mw-tile`, `mw-calendar` |
|
|
83
84
|
| `--mw-elevation-1` … `-5` | Every shadow in the framework. Two layers per level - contact plus ambient. Never write a `box-shadow` by hand: a hand-rolled one is the wrong colour in one of the two themes |
|
|
@@ -171,9 +172,20 @@ Two rules that prevent most colour bugs:
|
|
|
171
172
|
- Persisting the choice, the toggle UI and the initial class are the
|
|
172
173
|
application's job in a SPA (`examples/angular-services.md`). The shipped JS
|
|
173
174
|
does it for static pages using `localStorage` under the key `mw-theme`.
|
|
175
|
+
- **Suppress transitions while the class flips.** Colour changes on nearly every
|
|
176
|
+
element at once, and the shared `--mw-transition` turns that into thousands of
|
|
177
|
+
concurrent animations - on a documentation-sized page it is seconds of blocked
|
|
178
|
+
style and layout. `mw-theme-switching` on `<html>` kills them for the flip; the
|
|
179
|
+
forced reflow between the two class changes is what commits the new colours
|
|
180
|
+
before transitions come back.
|
|
174
181
|
|
|
175
182
|
```ts
|
|
183
|
+
const root = document.documentElement;
|
|
184
|
+
|
|
185
|
+
root.classList.add('mw-theme-switching');
|
|
176
186
|
document.body.classList.toggle('mw-theme-light', isLight);
|
|
187
|
+
void root.offsetHeight; // commit the new colours with transitions off
|
|
188
|
+
root.classList.remove('mw-theme-switching');
|
|
177
189
|
```
|
|
178
190
|
|
|
179
191
|
## SCSS configuration
|
|
@@ -262,6 +274,29 @@ they are all `var()` references anyway:
|
|
|
262
274
|
}
|
|
263
275
|
```
|
|
264
276
|
|
|
277
|
+
## Overriding a component
|
|
278
|
+
|
|
279
|
+
Tokens cover colour and rhythm; for anything else write a normal rule. The
|
|
280
|
+
framework emits everything inside
|
|
281
|
+
`@layer mw.reset, mw.base, mw.forms, mw.components, mw.layout, mw.utilities`,
|
|
282
|
+
and an unlayered rule beats every layer regardless of weight:
|
|
283
|
+
|
|
284
|
+
```css
|
|
285
|
+
/* wins over .mw-card, no !important and no doubled selector */
|
|
286
|
+
.mw-card {
|
|
287
|
+
border-radius: 12px;
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
The same rule cuts the other way: third-party CSS loaded unlayered also beats
|
|
292
|
+
the framework, which is what makes an icon font quietly win over `mw-tags-icon`.
|
|
293
|
+
Give it a layer of its own:
|
|
294
|
+
|
|
295
|
+
```css
|
|
296
|
+
@layer vendor, mw;
|
|
297
|
+
@import url('font-awesome.css') layer(vendor);
|
|
298
|
+
```
|
|
299
|
+
|
|
265
300
|
## Importing only what you need
|
|
266
301
|
|
|
267
302
|
The full stylesheet is ~200 kB raw / ~31 kB gzipped. Marketing components
|
|
@@ -272,7 +307,9 @@ Angular bundle budgets notice.
|
|
|
272
307
|
Every layer forwards one module per file, and no `@extend` crosses a file
|
|
273
308
|
boundary, so partial imports are safe. **The one thing you must not drop is
|
|
274
309
|
`base`** - it carries the `:root` tokens; without it every component renders
|
|
275
|
-
colourless.
|
|
310
|
+
colourless. The cascade layer order comes along on its own: every module loads
|
|
311
|
+
`abstracts`, which declares it, so a hand-picked subset orders itself the same
|
|
312
|
+
way the full build does.
|
|
276
313
|
|
|
277
314
|
```scss
|
|
278
315
|
// styles.scss - configure first, then pick
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":1,"sessions":{"5682ec58-6688-479f-994f-990ff918c05d":{"updatedAt":1789084033412,"files":{"/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/layout/_header.scss":{"editCount":3,"findings":[],"stopBaseline":{"version":1,"engine":"0.1.5","counts":{}},"cleanAcked":true},"/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/form-elements/_slider.scss":{"editCount":1,"findings":[],"stopBaseline":{"version":1,"engine":"0.1.5","counts":{}},"cleanAcked":true},"/Users/m1well/Dev/workspace/css/maverick-wave/src/js/main.js":{"editCount":7,"findings":[]},"/Users/m1well/Dev/workspace/css/maverick-wave/index.html":{"editCount":2,"findings":["low-contrast:0:3.3:1 (need 4.5:1) — text #7d85a5 on #313746","pulsing-dot:0:.mw-spinner-dots>div — 16x16px dot with infinite \"mw-bounce\" animation","dark-glow:0:Colored box-shadow glow (#d1bb21) on dark page"]},"/Users/m1well/Dev/workspace/css/maverick-wave/src/partials/typography-container.html":{"editCount":2,"findings":[],"cleanAcked":true},"/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/base/_base.scss":{"editCount":2,"findings":[],"stopBaseline":{"version":1,"engine":"0.1.5","counts":{}},"cleanAcked":true},"/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/layout/_section.scss":{"editCount":7,"findings":[],"cleanAcked":true},"/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/form-elements/_form.scss":{"editCount":1,"findings":[],"stopBaseline":{"version":1,"engine":"0.1.5","counts":{}},"cleanAcked":true},"/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/components/_alerts.scss":{"editCount":1,"findings":["side-tab:83"],"stopBaseline":{"version":1,"engine":"0.1.5","counts":{"62d926b4b80efa38e6fbf0fe65f45cf171d9b8a80be0b2ee47ac4cbb6c9498d0":1}},"cleanAcked":true},"/Users/m1well/Dev/workspace/css/maverick-wave/src/scss/layout/_main.scss":{"editCount":1,"findings":[],"stopBaseline":{"version":1,"engine":"0.1.5","counts":{}},"cleanAcked":true}},"footerShown":true}}}
|
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.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
|
+
|
|
20
|
+
## [4.28.0] - 2026-09-08
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- language switcher in header
|
|
25
|
+
|
|
9
26
|
## [4.27.0] - 2026-09-07
|
|
10
27
|
|
|
11
28
|
### Fixed
|
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>
|