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.
Files changed (48) hide show
  1. package/.claude/skills/mw-maverick-wave/SKILL.md +13 -10
  2. package/.claude/skills/mw-maverick-wave/examples/angular-services.md +91 -0
  3. package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +5 -4
  4. package/.claude/skills/mw-maverick-wave/references/components.md +3 -0
  5. package/.claude/skills/mw-maverick-wave/references/javascript.md +19 -2
  6. package/.claude/skills/mw-maverick-wave/references/layout.md +20 -14
  7. package/.claude/skills/mw-maverick-wave/references/theming.md +44 -0
  8. package/CHANGELOG.md +17 -0
  9. package/CLAUDE.md +1 -1
  10. package/README.md +27 -4
  11. package/index.html +448 -0
  12. package/maverick-wave.min.css +5 -5
  13. package/maverick-wave.min.js +1 -1
  14. package/package.json +2 -2
  15. package/scripts/verify.js +4 -7
  16. package/src/js/main.js +157 -2
  17. package/src/partials/documentation-container.html +4 -0
  18. package/src/partials/footer-container.html +3 -0
  19. package/src/partials/history-container.html +67 -0
  20. package/src/partials/palette-container.html +325 -0
  21. package/src/partials/utilities-container.html +41 -0
  22. package/src/scss/abstracts/_functions.scss +11 -2
  23. package/src/scss/abstracts/_mixins.scss +36 -8
  24. package/src/scss/abstracts/_variables.scss +4 -4
  25. package/src/scss/base/_base.scss +3 -0
  26. package/src/scss/base/_reset.scss +4 -1
  27. package/src/scss/components/_accordions.scss +31 -7
  28. package/src/scss/components/_avatars.scss +4 -1
  29. package/src/scss/components/_blog-post.scss +2 -2
  30. package/src/scss/components/_cards.scss +13 -22
  31. package/src/scss/components/_coming-soon.scss +1 -1
  32. package/src/scss/components/_info.scss +2 -2
  33. package/src/scss/components/_lists.scss +1 -1
  34. package/src/scss/components/_panels.scss +1 -1
  35. package/src/scss/components/_pricing.scss +1 -1
  36. package/src/scss/components/_techstack-bucket.scss +1 -1
  37. package/src/scss/components/_tiles.scss +1 -1
  38. package/src/scss/components/_toasts.scss +1 -1
  39. package/src/scss/form-elements/_slider.scss +5 -23
  40. package/src/scss/layout/_footer.scss +1 -1
  41. package/src/scss/layout/_header-reveal.scss +33 -0
  42. package/src/scss/layout/_header.scss +9 -1
  43. package/src/scss/layout/_parallax.scss +20 -0
  44. package/src/scss/utilities/_index.scss +1 -0
  45. package/src/scss/utilities/_reveal.scss +22 -0
  46. package/src/scss/utilities/_variants.scss +90 -0
  47. package/.impeccable/config.local.json +0 -5
  48. 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
 
@@ -239,7 +239,7 @@
239
239
  }
240
240
  }
241
241
 
242
- @include hover {
242
+ @include hover-move {
243
243
  transform: translateX(8px);
244
244
  }
245
245
  }
@@ -18,7 +18,7 @@
18
18
  justify-content: space-between;
19
19
  align-items: center;
20
20
  margin: spacing('0');
21
- border-radius: (radius('sm') - 2px) (radius('xl') - 2px) 0 0;
21
+ border-radius: calc(#{radius('sm')} - 2px) calc(#{radius('xl')} - 2px) 0 0;
22
22
  }
23
23
 
24
24
  &-body {
@@ -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,
@@ -33,7 +33,7 @@
33
33
  font-size: font-size('xs');
34
34
  }
35
35
 
36
- @include hover {
36
+ @include hover-move {
37
37
  transform: translateY(-2px);
38
38
  }
39
39
 
@@ -81,7 +81,7 @@
81
81
  --mw-corner-accent: var(--mw-corner-accent-hover);
82
82
  }
83
83
 
84
- @include hover {
84
+ @include hover-move {
85
85
  transform: translateY(-2px);
86
86
  }
87
87
 
@@ -9,7 +9,7 @@
9
9
  flex-direction: column;
10
10
  gap: spacing('3');
11
11
  width: min(380px, calc(100vw - #{2 * spacing('5')}));
12
- max-height: calc(100vh - #{2 * spacing('5')});
12
+ max-height: calc(100dvh - #{2 * spacing('5')});
13
13
  overflow-y: auto;
14
14
  pointer-events: none;
15
15
 
@@ -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
- border: 2px solid var(--fill);
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;
@@ -115,7 +115,7 @@
115
115
  border-color: var(--mw-primary-color);
116
116
  }
117
117
 
118
- @include hover {
118
+ @include hover-move {
119
119
  transform: translateY(-2px);
120
120
  }
121
121
 
@@ -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
- transform: translateY(-1px);
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);
@@ -8,3 +8,4 @@
8
8
  @forward 'spacing';
9
9
  @forward 'text';
10
10
  @forward 'touch-targets';
11
+ @forward 'variants';
@@ -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,5 +0,0 @@
1
- {
2
- "hook": {
3
- "consent": "accepted"
4
- }
5
- }
@@ -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
- }