maverick-wave 5.4.0 → 5.6.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/skills/mw-maverick-wave/SKILL.md +13 -10
- package/.claude/skills/mw-maverick-wave/examples/angular-services.md +91 -0
- package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +5 -4
- package/.claude/skills/mw-maverick-wave/references/components.md +3 -0
- package/.claude/skills/mw-maverick-wave/references/javascript.md +19 -2
- package/.claude/skills/mw-maverick-wave/references/layout.md +20 -14
- package/.claude/skills/mw-maverick-wave/references/theming.md +44 -0
- package/CHANGELOG.md +17 -0
- package/CLAUDE.md +1 -1
- package/README.md +27 -4
- package/index.html +448 -0
- package/maverick-wave.min.css +5 -5
- package/maverick-wave.min.js +1 -1
- package/package.json +2 -2
- package/scripts/verify.js +4 -7
- package/src/js/main.js +157 -2
- package/src/partials/documentation-container.html +4 -0
- package/src/partials/footer-container.html +3 -0
- package/src/partials/history-container.html +67 -0
- package/src/partials/palette-container.html +325 -0
- package/src/partials/utilities-container.html +41 -0
- package/src/scss/abstracts/_functions.scss +11 -2
- package/src/scss/abstracts/_mixins.scss +36 -8
- package/src/scss/abstracts/_variables.scss +4 -4
- package/src/scss/base/_base.scss +3 -0
- package/src/scss/base/_reset.scss +4 -1
- package/src/scss/components/_accordions.scss +31 -7
- package/src/scss/components/_avatars.scss +4 -1
- package/src/scss/components/_blog-post.scss +2 -2
- package/src/scss/components/_cards.scss +13 -22
- package/src/scss/components/_coming-soon.scss +1 -1
- package/src/scss/components/_info.scss +2 -2
- package/src/scss/components/_lists.scss +1 -1
- package/src/scss/components/_panels.scss +1 -1
- package/src/scss/components/_pricing.scss +1 -1
- package/src/scss/components/_techstack-bucket.scss +1 -1
- package/src/scss/components/_tiles.scss +1 -1
- package/src/scss/components/_toasts.scss +1 -1
- package/src/scss/form-elements/_slider.scss +5 -23
- package/src/scss/layout/_footer.scss +1 -1
- package/src/scss/layout/_header-reveal.scss +33 -0
- package/src/scss/layout/_header.scss +9 -1
- package/src/scss/layout/_parallax.scss +20 -0
- package/src/scss/utilities/_index.scss +1 -0
- package/src/scss/utilities/_reveal.scss +22 -0
- package/src/scss/utilities/_variants.scss +90 -0
- package/.impeccable/config.local.json +0 -5
- package/.impeccable/hook.cache.json +0 -75
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
box-shadow: var(--mw-elevation-3);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
@include hover {
|
|
27
|
+
@include hover-move {
|
|
28
28
|
transform: translateY(-2px);
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
box-shadow: none;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
@include hover {
|
|
77
|
+
@include hover-move {
|
|
78
78
|
transform: none;
|
|
79
79
|
}
|
|
80
80
|
|
|
@@ -156,7 +156,7 @@
|
|
|
156
156
|
gap: spacing('2');
|
|
157
157
|
padding: spacing('6') spacing('5');
|
|
158
158
|
// The card's own radius minus its border - the band sits inside it
|
|
159
|
-
border-radius: (radius('sm') - 1px) (radius('xl') - 1px) 0 0;
|
|
159
|
+
border-radius: calc(#{radius('sm')} - 1px) calc(#{radius('xl')} - 1px) 0 0;
|
|
160
160
|
background: var(--mw-card-addon-color, var(--mw-primary-color));
|
|
161
161
|
color: var(
|
|
162
162
|
--mw-card-addon-text-color,
|
|
@@ -38,10 +38,14 @@
|
|
|
38
38
|
transform: scale(1.1);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
// Same fill and ring as the webkit thumb above - Firefox paints its own
|
|
42
|
+
// grey thumb unless `background` is set, so leaving it out is not the same
|
|
43
|
+
// declaration set, it is a different slider.
|
|
41
44
|
&::-moz-range-thumb {
|
|
42
45
|
width: spacing('5');
|
|
43
46
|
height: spacing('5');
|
|
44
|
-
|
|
47
|
+
background: var(--fill);
|
|
48
|
+
border: 2px solid var(--mw-border);
|
|
45
49
|
border-radius: radius('full');
|
|
46
50
|
transition:
|
|
47
51
|
transform var(--mw-duration-fast) var(--mw-ease-out),
|
|
@@ -55,20 +59,6 @@
|
|
|
55
59
|
background: transparent;
|
|
56
60
|
}
|
|
57
61
|
|
|
58
|
-
// IE
|
|
59
|
-
&::-ms-fill-lower {
|
|
60
|
-
background: var(--fill);
|
|
61
|
-
}
|
|
62
|
-
&::-ms-fill-upper {
|
|
63
|
-
background: var(--track);
|
|
64
|
-
}
|
|
65
|
-
&::-ms-thumb {
|
|
66
|
-
width: spacing('5');
|
|
67
|
-
height: spacing('5');
|
|
68
|
-
border: 2px solid var(--fill);
|
|
69
|
-
border-radius: radius('full');
|
|
70
|
-
}
|
|
71
|
-
|
|
72
62
|
&-sm {
|
|
73
63
|
height: 6px;
|
|
74
64
|
&::-webkit-slider-thumb {
|
|
@@ -79,10 +69,6 @@
|
|
|
79
69
|
width: spacing('4');
|
|
80
70
|
height: spacing('4');
|
|
81
71
|
}
|
|
82
|
-
&::-ms-thumb {
|
|
83
|
-
width: spacing('4');
|
|
84
|
-
height: spacing('4');
|
|
85
|
-
}
|
|
86
72
|
}
|
|
87
73
|
&-lg {
|
|
88
74
|
height: 16px;
|
|
@@ -95,10 +81,6 @@
|
|
|
95
81
|
width: spacing('6');
|
|
96
82
|
height: spacing('6');
|
|
97
83
|
}
|
|
98
|
-
&::-ms-thumb {
|
|
99
|
-
width: spacing('6');
|
|
100
|
-
height: spacing('6');
|
|
101
|
-
}
|
|
102
84
|
}
|
|
103
85
|
&:disabled {
|
|
104
86
|
opacity: 0.3;
|
|
@@ -63,6 +63,39 @@
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
// Firefox ships no scroll timelines, so there the script toggles these
|
|
67
|
+
// classes instead (main.js) - the same two positions, triggered instead of
|
|
68
|
+
// scrubbed. State and transition are separate because the script sets the
|
|
69
|
+
// state a frame earlier: together they would send the bar sliding away in
|
|
70
|
+
// front of the reader instead of having it gone already.
|
|
71
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
72
|
+
.mw-header-reveal.mw-header-away {
|
|
73
|
+
top: calc(-1 * var(--mw-header-reveal-offset));
|
|
74
|
+
opacity: 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.mw-header-driven {
|
|
78
|
+
// The shared list plus `top`, which is not in it - writing only `top`
|
|
79
|
+
// here would drop the header's own colour and shadow transitions.
|
|
80
|
+
transition:
|
|
81
|
+
var(--mw-transition),
|
|
82
|
+
top var(--mw-duration-slow) var(--mw-ease-out);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.mw-announcement.mw-announcement-away {
|
|
86
|
+
transform: translateY(
|
|
87
|
+
calc(-1 * (var(--mw-header-height) + var(--mw-announcement-height)))
|
|
88
|
+
);
|
|
89
|
+
opacity: 0;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.mw-announcement-driven {
|
|
93
|
+
transition:
|
|
94
|
+
transform var(--mw-duration-slow) var(--mw-ease-out),
|
|
95
|
+
opacity var(--mw-duration-slow) var(--mw-ease-out);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
66
99
|
// `top` and not a transform: the off-canvas drawer inside the bar is
|
|
67
100
|
// position: fixed, and a transform on the header would make it the drawer's
|
|
68
101
|
// containing block - at every value, the resting one included.
|
|
@@ -82,7 +82,12 @@
|
|
|
82
82
|
|
|
83
83
|
&:hover:not(:disabled) {
|
|
84
84
|
background: var(--mw-primary-color-hover);
|
|
85
|
-
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@include hover-move {
|
|
88
|
+
&:not(:disabled) {
|
|
89
|
+
transform: translateY(-1px);
|
|
90
|
+
}
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
@include focus-ring;
|
|
@@ -117,6 +122,9 @@
|
|
|
117
122
|
|
|
118
123
|
&:hover {
|
|
119
124
|
background: var(--mw-primary-color-hover);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@include hover-move {
|
|
120
128
|
transform: translateY(-1px);
|
|
121
129
|
}
|
|
122
130
|
|
|
@@ -146,6 +146,26 @@
|
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
+
// Firefox ships no scroll timelines, so there the script writes the progress
|
|
150
|
+
// and the travel is worked out here (main.js). Keeping the transform in CSS
|
|
151
|
+
// is what lets every depth variant above - and an inline
|
|
152
|
+
// `--mw-parallax-depth` - go on working untouched.
|
|
153
|
+
//
|
|
154
|
+
// 0 puts the layer at +depth and 1 at -depth, the two ends of the keyframes
|
|
155
|
+
// below. Declared and not only used, so the frame before the script has
|
|
156
|
+
// written anything sits at rest instead of nowhere.
|
|
157
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
158
|
+
.mw-parallax-driven {
|
|
159
|
+
--mw-parallax-progress: 0.5;
|
|
160
|
+
|
|
161
|
+
transform: translate3d(
|
|
162
|
+
0,
|
|
163
|
+
calc(var(--mw-parallax-depth) * (1 - 2 * var(--mw-parallax-progress))),
|
|
164
|
+
0
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
149
169
|
@keyframes mw-parallax {
|
|
150
170
|
from {
|
|
151
171
|
transform: translate3d(0, var(--mw-parallax-depth), 0);
|
|
@@ -36,6 +36,28 @@
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
// Firefox ships no scroll timelines at all, so there the script drives the
|
|
40
|
+
// same movement (main.js): `mw-reveal-hidden` while the element waits below
|
|
41
|
+
// the fold, `mw-reveal-run` once it enters. Both classes are added by the
|
|
42
|
+
// script and never by the markup - a page without JS keeps everything
|
|
43
|
+
// visible, which is what the guard above is for.
|
|
44
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
45
|
+
.mw-reveal-hidden {
|
|
46
|
+
opacity: 0;
|
|
47
|
+
transform: translateY(40px);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.mw-reveal-run {
|
|
51
|
+
// `backwards` for the reason above - a forwards fill would pin the
|
|
52
|
+
// transform and cost the card its hover lift. The delay comes inline,
|
|
53
|
+
// from the element's column.
|
|
54
|
+
animation-name: mw-reveal;
|
|
55
|
+
animation-duration: var(--mw-duration-slower);
|
|
56
|
+
animation-timing-function: var(--mw-ease-out);
|
|
57
|
+
animation-fill-mode: backwards;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
39
61
|
@keyframes mw-reveal {
|
|
40
62
|
from {
|
|
41
63
|
opacity: 0;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
@use '../abstracts' as *;
|
|
2
|
+
|
|
3
|
+
@layer mw.utilities {
|
|
4
|
+
// Site-wide looks, switched with one class on <html>. Two more live elsewhere,
|
|
5
|
+
// because they have to reach every caller of a mixin: .mw-corners-even in
|
|
6
|
+
// surface(), .mw-hover-static in hover-move().
|
|
7
|
+
|
|
8
|
+
// One brand colour instead of two. Every secondary tone is derived from
|
|
9
|
+
// --mw-secondary-color with color-mix() and oklch(from ...), so the two lines
|
|
10
|
+
// below carry through to hovers, tints, borders and both themes' ink.
|
|
11
|
+
:root.mw-accent-single {
|
|
12
|
+
--mw-secondary-color: var(--mw-primary-color);
|
|
13
|
+
--mw-secondary-accent-text-color: var(--mw-primary-accent-text-color);
|
|
14
|
+
|
|
15
|
+
// Or the two solid buttons would be the same button. Outline keeps the
|
|
16
|
+
// emphasis order the markup asked for: primary fills, secondary draws a line.
|
|
17
|
+
.mw-btn-secondary {
|
|
18
|
+
background: transparent;
|
|
19
|
+
border-color: var(--mw-primary-text-color);
|
|
20
|
+
color: var(--mw-primary-text-color);
|
|
21
|
+
|
|
22
|
+
&:hover:not(:disabled) {
|
|
23
|
+
background: var(--mw-primary-color);
|
|
24
|
+
border-color: var(--mw-primary-color);
|
|
25
|
+
color: var(--mw-primary-accent-text-color);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// 1 to 3 are surfaces lying on the page and go; 4 and 5 are the dropdown and
|
|
31
|
+
// the modal, which genuinely float above content and keep their shadow - in a
|
|
32
|
+
// flat page they are the only two things that should cast one.
|
|
33
|
+
//
|
|
34
|
+
// The second selector is not optional: elevation is a theme alias, and the
|
|
35
|
+
// light theme re-declares it on <body>. A value written on :root alone is
|
|
36
|
+
// shadowed for the whole body subtree, so the switch would do nothing at all
|
|
37
|
+
// in light mode. Any variant that retunes a theme-bound token needs both.
|
|
38
|
+
:root.mw-shadows-flat,
|
|
39
|
+
:root.mw-shadows-flat .mw-theme-light {
|
|
40
|
+
--mw-elevation-1: none;
|
|
41
|
+
--mw-elevation-2: none;
|
|
42
|
+
--mw-elevation-3: none;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// The diagonal hatch behind an alternating section, dropped. Written on the
|
|
46
|
+
// section and not as a token on :root: --mw-page-background is a theme alias
|
|
47
|
+
// that only becomes the light one further down the tree, so a copy taken up
|
|
48
|
+
// here hands the section the *other* theme's colour - the hatch turns dark
|
|
49
|
+
// instead of vanishing.
|
|
50
|
+
:root.mw-sections-plain .mw-section-alternate {
|
|
51
|
+
background: var(--mw-page-background);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Buttons only. Input groups build their radius corner by corner, so a pill
|
|
55
|
+
// there is its own piece of geometry rather than one more override.
|
|
56
|
+
:root.mw-btn-pill .mw-btn {
|
|
57
|
+
border-radius: 999px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Photos drained of colour until pointed at - the palette then comes only from
|
|
61
|
+
// the brand tones. Avatars stay out: a greyed-out face reads as disabled, and
|
|
62
|
+
// so does mw-media, which is the audio player and holds no picture at all.
|
|
63
|
+
:root.mw-media-mono {
|
|
64
|
+
.mw-card-img img,
|
|
65
|
+
.mw-card-img-contain img,
|
|
66
|
+
.mw-tile-img img,
|
|
67
|
+
.mw-gallery img,
|
|
68
|
+
.mw-image-slider img,
|
|
69
|
+
img.mw-blog-post-featured-image {
|
|
70
|
+
filter: grayscale(1);
|
|
71
|
+
transition: filter var(--mw-duration-zoom) var(--mw-ease-out);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// The blog image carries the class itself rather than sitting in a wrapper,
|
|
75
|
+
// so it is the one that has to answer for its own hover
|
|
76
|
+
:is(.mw-card, .mw-tile, .mw-gallery, .mw-image-slider):hover img,
|
|
77
|
+
img.mw-blog-post-featured-image:hover {
|
|
78
|
+
filter: none;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
:root.mw-headings-caps {
|
|
83
|
+
h1,
|
|
84
|
+
h2,
|
|
85
|
+
h3 {
|
|
86
|
+
text-transform: uppercase;
|
|
87
|
+
letter-spacing: 0.045em;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -1,75 +0,0 @@
|
|
|
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
|
-
}
|