maverick-wave 4.21.0 → 4.23.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 (53) hide show
  1. package/.claude/skills/maverick-wave/SKILL.md +9 -7
  2. package/.claude/skills/maverick-wave/references/components.md +85 -0
  3. package/.claude/skills/maverick-wave/references/layout.md +30 -7
  4. package/.claude/skills/maverick-wave/references/theming.md +1 -1
  5. package/.github/workflows/ci.yml +1 -1
  6. package/.prettierignore +2 -0
  7. package/CHANGELOG.md +17 -0
  8. package/CLAUDE.md +7 -4
  9. package/gulpfile.js +4 -4
  10. package/index.html +40 -0
  11. package/maverick-wave.min.css +3 -3
  12. package/package.json +3 -3
  13. package/release.sh +1 -1
  14. package/scripts/verify.js +15 -0
  15. package/src/assets/images/gallery-city.svg +49 -0
  16. package/src/assets/images/gallery-desert.svg +25 -0
  17. package/src/assets/images/gallery-forest.svg +46 -0
  18. package/src/assets/images/gallery-lake.svg +26 -0
  19. package/src/assets/images/gallery-mountain.svg +19 -0
  20. package/src/assets/images/gallery-ocean.svg +26 -0
  21. package/src/assets/images/gallery-oldtown.svg +41 -0
  22. package/src/assets/images/gallery-snow.svg +39 -0
  23. package/src/assets/images/slider-field.svg +124 -0
  24. package/src/assets/images/slider-forest.svg +33 -0
  25. package/src/assets/images/slider-lake.svg +35 -0
  26. package/src/assets/images/slider-mountains.svg +29 -0
  27. package/src/assets/images/slider-trees.svg +41 -0
  28. package/src/assets/images/tile-analytics.svg +22 -0
  29. package/src/assets/images/tile-cloud.svg +19 -0
  30. package/src/assets/images/tile-ecommerce.svg +14 -0
  31. package/src/assets/images/tile-enterprise.svg +22 -0
  32. package/src/assets/images/tile-marketing.svg +16 -0
  33. package/src/assets/media/demo-chime.wav +0 -0
  34. package/src/partials/announcement-container.html +67 -0
  35. package/src/partials/content-slider-container.html +5 -17
  36. package/src/partials/gallery-container.html +8 -8
  37. package/src/partials/home-container.html +11 -20
  38. package/src/partials/media-container.html +27 -0
  39. package/src/partials/prose-container.html +43 -0
  40. package/src/partials/testimonials-container.html +82 -0
  41. package/src/partials/tiles-container.html +5 -20
  42. package/src/scss/base/_base.scss +7 -1
  43. package/src/scss/components/_announcement.scss +84 -0
  44. package/src/scss/components/_index.scss +4 -0
  45. package/src/scss/components/_media.scss +26 -0
  46. package/src/scss/components/_prose.scss +42 -0
  47. package/src/scss/components/_testimonial.scss +58 -0
  48. package/src/scss/layout/_grid.scss +39 -0
  49. package/src/scss/layout/_main.scss +9 -1
  50. package/src/scss/layout/_section.scss +14 -0
  51. package/src/scss/utilities/_index.scss +1 -0
  52. package/src/scss/utilities/_reveal.scss +34 -0
  53. package/src/scss/utilities/_touch-targets.scss +10 -2
@@ -0,0 +1,22 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200" role="img" aria-label="Business intelligence suite">
2
+ <defs>
3
+ <linearGradient id="an-bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#7a5cf0"/>
5
+ <stop offset="1" stop-color="#3d2a9c"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="200" height="200" fill="url(#an-bg)"/>
9
+ <circle cx="40" cy="36" r="52" fill="#ffffff" opacity="0.09"/>
10
+ <g fill="#ffffff" opacity="0.9">
11
+ <rect x="62" y="114" width="20" height="34" rx="4"/>
12
+ <rect x="90" y="96" width="20" height="52" rx="4"/>
13
+ <rect x="118" y="78" width="20" height="70" rx="4"/>
14
+ </g>
15
+ <path d="M72 104 l28 -18 l28 -20" fill="none" stroke="#ffd166" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
16
+ <g fill="#ffd166">
17
+ <circle cx="72" cy="104" r="6"/>
18
+ <circle cx="100" cy="86" r="6"/>
19
+ <circle cx="128" cy="66" r="6"/>
20
+ </g>
21
+ <rect x="58" y="154" width="84" height="6" rx="3" fill="#ffffff" opacity="0.55"/>
22
+ </svg>
@@ -0,0 +1,19 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200" role="img" aria-label="Cloud infrastructure">
2
+ <defs>
3
+ <linearGradient id="cl-bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#2eb6c9"/>
5
+ <stop offset="1" stop-color="#1d6d95"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="200" height="200" fill="url(#cl-bg)"/>
9
+ <circle cx="172" cy="176" r="52" fill="#ffffff" opacity="0.09"/>
10
+ <path d="M70 100 a24 24 0 0 1 46 -11 a18 18 0 0 1 14 30 h-52 a22 22 0 0 1 -8 -19 Z" fill="#ffffff" opacity="0.94"/>
11
+ <g fill="#ffffff" opacity="0.75">
12
+ <rect x="68" y="132" width="64" height="14" rx="4"/>
13
+ <rect x="68" y="152" width="64" height="14" rx="4"/>
14
+ </g>
15
+ <g fill="#1d6d95">
16
+ <circle cx="78" cy="139" r="3.5"/>
17
+ <circle cx="78" cy="159" r="3.5"/>
18
+ </g>
19
+ </svg>
@@ -0,0 +1,14 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200" role="img" aria-label="E-commerce platform">
2
+ <defs>
3
+ <linearGradient id="ec-bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#2f6fed"/>
5
+ <stop offset="1" stop-color="#1b3f9c"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="200" height="200" fill="url(#ec-bg)"/>
9
+ <circle cx="160" cy="40" r="52" fill="#ffffff" opacity="0.09"/>
10
+ <path d="M64 88 h72 l-7 56 a9 9 0 0 1 -9 8 h-40 a9 9 0 0 1 -9 -8 Z" fill="#ffffff" opacity="0.94"/>
11
+ <path d="M84 90 v-10 a16 16 0 0 1 32 0 v10" fill="none" stroke="#ffffff" stroke-width="8" stroke-linecap="round"/>
12
+ <circle cx="88" cy="110" r="6" fill="#2f6fed"/>
13
+ <circle cx="112" cy="110" r="6" fill="#2f6fed"/>
14
+ </svg>
@@ -0,0 +1,22 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200" role="img" aria-label="Enterprise solutions">
2
+ <defs>
3
+ <linearGradient id="en-bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#3fa66f"/>
5
+ <stop offset="1" stop-color="#1c5c46"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="200" height="200" fill="url(#en-bg)"/>
9
+ <circle cx="166" cy="46" r="50" fill="#ffffff" opacity="0.09"/>
10
+ <g fill="#ffffff" opacity="0.92">
11
+ <rect x="58" y="96" width="42" height="52" rx="5"/>
12
+ <rect x="106" y="70" width="42" height="78" rx="5"/>
13
+ </g>
14
+ <g fill="#1c5c46">
15
+ <rect x="67" y="106" width="10" height="10" rx="2.5"/><rect x="82" y="106" width="10" height="10" rx="2.5"/>
16
+ <rect x="67" y="124" width="10" height="10" rx="2.5"/><rect x="82" y="124" width="10" height="10" rx="2.5"/>
17
+ <rect x="115" y="80" width="10" height="10" rx="2.5"/><rect x="130" y="80" width="10" height="10" rx="2.5"/>
18
+ <rect x="115" y="98" width="10" height="10" rx="2.5"/><rect x="130" y="98" width="10" height="10" rx="2.5"/>
19
+ <rect x="115" y="116" width="10" height="10" rx="2.5"/><rect x="130" y="116" width="10" height="10" rx="2.5"/>
20
+ </g>
21
+ <rect x="52" y="152" width="102" height="7" rx="3.5" fill="#ffffff" opacity="0.6"/>
22
+ </svg>
@@ -0,0 +1,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200" role="img" aria-label="Marketing automation">
2
+ <defs>
3
+ <linearGradient id="mk-bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#e8646a"/>
5
+ <stop offset="1" stop-color="#a32f6e"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="200" height="200" fill="url(#mk-bg)"/>
9
+ <circle cx="36" cy="168" r="56" fill="#ffffff" opacity="0.09"/>
10
+ <path d="M66 92 h16 l38 -26 v70 l-38 -26 h-16 a9 9 0 0 1 -9 -9 Z" fill="#ffffff" opacity="0.94"/>
11
+ <path d="M82 110 l5 28 h16 l-5 -28 Z" fill="#ffffff" opacity="0.94"/>
12
+ <g fill="none" stroke="#ffffff" stroke-width="6" stroke-linecap="round" opacity="0.7">
13
+ <path d="M132 90 a20 20 0 0 1 0 24"/>
14
+ <path d="M144 78 a38 38 0 0 1 0 48"/>
15
+ </g>
16
+ </svg>
Binary file
@@ -0,0 +1,67 @@
1
+ <h3 class="mw-section-subtitle">Announcement</h3>
2
+ <p class="mw-text-muted mw-text-measure mw-mb-6">
3
+ The ribbon glued under the fixed header - a discount, a launch note, a
4
+ maintenance window. Shown here with <code>mw-announcement-static</code>, so
5
+ the demos sit in the flow instead of over this page. Without it the ribbon
6
+ fixes itself below the header, stays put while the page scrolls beneath it,
7
+ and reserves the anchor scroll offset via
8
+ <code>--mw-announcement-height</code>. The surface is 75% opaque with a
9
+ backdrop blur - visible wherever content sits behind it, like the first demo
10
+ below.
11
+ </p>
12
+
13
+ <div class="mw-grid-1 mw-gap-6">
14
+ <div>
15
+ <h5 class="mw-text-medium mw-mb-2">
16
+ Default (primary) with highlight pill - over content, showing the 75%
17
+ surface and the blur
18
+ </h5>
19
+ <div
20
+ style="
21
+ background: url('images/slider-mountains.svg') center / cover;
22
+ padding: 1.75rem 1rem;
23
+ "
24
+ >
25
+ <aside class="mw-announcement mw-announcement-static">
26
+ <a class="mw-announcement-content" href="#announcement">
27
+ <span class="mw-announcement-highlight">-20 %</span>
28
+ <span>Summer discount on every plan until 30.09.</span>
29
+ </a>
30
+ </aside>
31
+ </div>
32
+ </div>
33
+
34
+ <div>
35
+ <h5 class="mw-text-medium mw-mb-2">Secondary</h5>
36
+ <aside
37
+ class="mw-announcement mw-announcement-secondary mw-announcement-static"
38
+ >
39
+ <a class="mw-announcement-content" href="#announcement">
40
+ <span class="mw-announcement-highlight">NEW</span>
41
+ <span>Version 5 is out - see what changed.</span>
42
+ </a>
43
+ </aside>
44
+ </div>
45
+
46
+ <div>
47
+ <h5 class="mw-text-medium mw-mb-2">Warning, without a link</h5>
48
+ <aside
49
+ class="mw-announcement mw-announcement-warning mw-announcement-static"
50
+ >
51
+ <div class="mw-announcement-content">
52
+ <span>Maintenance window on Saturday, 02:00 - 04:00 UTC.</span>
53
+ </div>
54
+ </aside>
55
+ </div>
56
+
57
+ <div>
58
+ <h5 class="mw-text-medium mw-mb-2">Danger</h5>
59
+ <aside
60
+ class="mw-announcement mw-announcement-danger mw-announcement-static"
61
+ >
62
+ <div class="mw-announcement-content">
63
+ <span>The legacy API shuts down on 01.12. - migrate now.</span>
64
+ </div>
65
+ </aside>
66
+ </div>
67
+ </div>
@@ -4,7 +4,7 @@
4
4
  <div class="mw-image-slider">
5
5
  <div class="mw-image-slider-base" data-index="0">
6
6
  <img
7
- src="https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800&h=500&fit=crop"
7
+ src="images/slider-mountains.svg"
8
8
  class="mw-image-slider-base-image"
9
9
  alt="Mountain Landscape"
10
10
  />
@@ -12,28 +12,16 @@
12
12
 
13
13
  <div class="mw-image-slider-overlay">
14
14
  <div class="mw-image-slider-overlay-image" data-index="1">
15
- <img
16
- src="https://images.unsplash.com/photo-1439066615861-d1af74d74000?w=800&h=500&fit=crop"
17
- alt="Lake"
18
- />
15
+ <img src="images/slider-lake.svg" alt="Lake" />
19
16
  </div>
20
17
  <div class="mw-image-slider-overlay-image" data-index="2">
21
- <img
22
- src="https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=800&h=500&fit=crop"
23
- alt="Forest"
24
- />
18
+ <img src="images/slider-forest.svg" alt="Forest" />
25
19
  </div>
26
20
  <div class="mw-image-slider-overlay-image" data-index="3">
27
- <img
28
- src="https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=800&h=500&fit=crop"
29
- alt="Field"
30
- />
21
+ <img src="images/slider-field.svg" alt="Field" />
31
22
  </div>
32
23
  <div class="mw-image-slider-overlay-image" data-index="4">
33
- <img
34
- src="https://images.unsplash.com/photo-1441974231531-c6227db76b6e?w=800&h=500&fit=crop"
35
- alt="Trees"
36
- />
24
+ <img src="images/slider-trees.svg" alt="Trees" />
37
25
  </div>
38
26
  </div>
39
27
 
@@ -15,28 +15,28 @@
15
15
  <!-- Track -->
16
16
  <div class="mw-gallery-track">
17
17
  <div class="mw-gallery-slide" data-desc="Beautiful Mountain">
18
- <img src="https://picsum.photos/id/1011/800/400" alt="1" />
18
+ <img src="images/gallery-mountain.svg" alt="Beautiful Mountain" />
19
19
  </div>
20
20
  <div class="mw-gallery-slide" data-desc="Peaceful Lake">
21
- <img src="https://picsum.photos/id/1012/800/400" alt="2" />
21
+ <img src="images/gallery-lake.svg" alt="Peaceful Lake" />
22
22
  </div>
23
23
  <div class="mw-gallery-slide" data-desc="City Vibes">
24
- <img src="https://picsum.photos/id/1015/800/400" alt="3" />
24
+ <img src="images/gallery-city.svg" alt="City Vibes" />
25
25
  </div>
26
26
  <div class="mw-gallery-slide" data-desc="Golden Forest">
27
- <img src="https://picsum.photos/id/1016/800/400" alt="4" />
27
+ <img src="images/gallery-forest.svg" alt="Golden Forest" />
28
28
  </div>
29
29
  <div class="mw-gallery-slide" data-desc="Desert View">
30
- <img src="https://picsum.photos/id/1018/800/400" alt="5" />
30
+ <img src="images/gallery-desert.svg" alt="Desert View" />
31
31
  </div>
32
32
  <div class="mw-gallery-slide" data-desc="Ocean Breeze">
33
- <img src="https://picsum.photos/id/1020/800/400" alt="6" />
33
+ <img src="images/gallery-ocean.svg" alt="Ocean Breeze" />
34
34
  </div>
35
35
  <div class="mw-gallery-slide" data-desc="Old Town">
36
- <img src="https://picsum.photos/id/1021/800/400" alt="7" />
36
+ <img src="images/gallery-oldtown.svg" alt="Old Town" />
37
37
  </div>
38
38
  <div class="mw-gallery-slide" data-desc="Snowy Hills">
39
- <img src="https://picsum.photos/id/1025/800/400" alt="8" />
39
+ <img src="images/gallery-snow.svg" alt="Snowy Hills" />
40
40
  </div>
41
41
  </div>
42
42
 
@@ -7,9 +7,14 @@
7
7
  Build stunning, responsive websites effortlessly with a modern,
8
8
  lightweight CSS framework crafted for speed, style, and flexibility.
9
9
  </p>
10
+ <p>
11
+ Effortless dark mode, mobile-first layouts and accessibility at its
12
+ core. The same foundation carries a portfolio, a corporate site and a
13
+ full e-commerce platform.
14
+ </p>
10
15
  </div>
11
16
 
12
- <div class="mw-d-flex mw-gap-8 mw-justify-center mw-mb-7">
17
+ <div class="mw-d-flex mw-gap-8 mw-justify-center">
13
18
  <button
14
19
  type="button"
15
20
  onclick="location.href = '#get-started'"
@@ -25,24 +30,10 @@
25
30
  Documentation
26
31
  </button>
27
32
  </div>
28
-
29
- <div class="mw-card mw-card-simple mw-text-center">
30
- <h3 class="mw-text-2xl mw-mb-4">Simple. Adaptive. Unstoppable.</h3>
31
- <p class="mw-mb-4">
32
- MaverickWave is a sleek foundation for creators who value elegance
33
- without compromise. Its fluid design philosophy bends and flexes like
34
- the tide - shaping itself perfectly to your vision.
35
- </p>
36
- <p class="mw-mb-4">
37
- Launch stunning portfolios, vibrant corporate sites, and powerful
38
- e-commerce platforms faster than ever. MaverickWave gives you the
39
- ultimate creative freedom without sacrificing performance.
40
- </p>
41
- <p>
42
- Experience the future of styling with effortless dark mode, mobile-first
43
- responsive layouts, and accessibility at its core - because great design
44
- is for everyone.
45
- </p>
46
- </div>
47
33
  </div>
48
34
  </div>
35
+
36
+ <a class="mw-scroll-hint" href="#get-started">
37
+ More
38
+ <i class="fas fa-chevron-down"></i>
39
+ </a>
@@ -0,0 +1,27 @@
1
+ <h3 class="mw-section-subtitle">Media</h3>
2
+ <p class="mw-text-muted mw-text-measure mw-mb-6">
3
+ Self-hosted audio and video. The framework ships no player - the native
4
+ controls are the player, and <code>accent-color</code> already brands them.
5
+ The wrapper makes the element a full-width block; a <code>video</code> also
6
+ gets the surface silhouette and a resting shadow, same markup with a
7
+ <code>&lt;video&gt;</code> element inside.
8
+ </p>
9
+
10
+ <div class="mw-grid-2 mw-gap-6">
11
+ <div>
12
+ <h5 class="mw-text-medium mw-mb-2">Audio with caption</h5>
13
+ <div class="mw-card mw-card-simple">
14
+ <div class="mw-media">
15
+ <audio controls preload="metadata" src="media/demo-chime.wav"></audio>
16
+ <p class="mw-media-caption">A short chime, served from this site.</p>
17
+ </div>
18
+ </div>
19
+ </div>
20
+
21
+ <div>
22
+ <h5 class="mw-text-medium mw-mb-2">Bare, without a card</h5>
23
+ <div class="mw-media">
24
+ <audio controls preload="metadata" src="media/demo-chime.wav"></audio>
25
+ </div>
26
+ </div>
27
+ </div>
@@ -0,0 +1,43 @@
1
+ <h3 class="mw-section-subtitle">Prose</h3>
2
+ <p class="mw-text-muted mw-text-measure mw-mb-6">
3
+ Long-form running text - a legal page, terms, a plain article. One class on
4
+ the container, bare <code>h2</code>/<code>h3</code>/<code>p</code>/<code
5
+ >ul</code
6
+ >
7
+ inside: exactly what a CMS or a JSON-driven page produces. Headings stay
8
+ deliberately small - in a document they structure the reading, they do not
9
+ compete with the page title.
10
+ </p>
11
+
12
+ <div class="mw-card mw-card-simple mw-prose">
13
+ <h2>1. Scope</h2>
14
+ <p>
15
+ These terms apply to every order placed through this site. Deviating
16
+ conditions of the customer do not apply unless expressly confirmed in
17
+ writing.
18
+ </p>
19
+
20
+ <h2>2. Contract</h2>
21
+ <p>
22
+ The presentation of products is not a binding offer. A contract comes into
23
+ existence when the order confirmation arrives, at the latest with the
24
+ delivery of the goods.
25
+ </p>
26
+ <h3>2.1 Cancellation</h3>
27
+ <p>
28
+ Consumers may cancel within fourteen days without giving a reason. The
29
+ period starts on the day the goods arrive. For the cancellation to count,
30
+ one of the following is enough:
31
+ </p>
32
+ <ul>
33
+ <li>an informal e-mail naming the order number</li>
34
+ <li>the returned goods with a short note</li>
35
+ <li>the cancellation form from the appendix</li>
36
+ </ul>
37
+
38
+ <h2>3. Prices</h2>
39
+ <p>
40
+ All prices are final prices and include the statutory value-added tax.
41
+ Shipping costs are shown separately before the order is placed.
42
+ </p>
43
+ </div>
@@ -0,0 +1,82 @@
1
+ <h3 class="mw-section-subtitle">Testimonials</h3>
2
+ <p class="mw-text-muted mw-text-measure mw-mb-6">
3
+ A quote card with its source - a <code>figure</code>, because quote and
4
+ attribution belong together. One voice may stand above the grid as
5
+ <code>mw-testimonial-featured</code>; the rest flow in
6
+ <code>mw-columns-3</code>, the masonry layout for cards of unequal height. The
7
+ cards below also carry <code>mw-reveal</code> - scroll them into view to see
8
+ the entrance.
9
+ </p>
10
+
11
+ <figure class="mw-testimonial mw-testimonial-featured mw-mb-6">
12
+ <blockquote>
13
+ We rebuilt our whole customer portal on this in three weeks. The team never
14
+ argued about spacing or shadows again - the framework had already decided,
15
+ and it had decided well.
16
+ </blockquote>
17
+ <figcaption class="mw-testimonial-source">
18
+ Maren K.
19
+ <span class="mw-testimonial-detail">&middot; Head of Engineering</span>
20
+ </figcaption>
21
+ </figure>
22
+
23
+ <div class="mw-columns-3">
24
+ <figure class="mw-testimonial mw-reveal">
25
+ <blockquote>
26
+ The dark theme just worked. We flipped one class and every component
27
+ followed.
28
+ </blockquote>
29
+ <figcaption class="mw-testimonial-source">
30
+ Jonas R.
31
+ <span class="mw-testimonial-detail">&middot; Frontend Developer</span>
32
+ </figcaption>
33
+ </figure>
34
+
35
+ <figure class="mw-testimonial mw-reveal">
36
+ <blockquote>
37
+ I came for the grid and stayed for the corner accents. Our app finally
38
+ looks like one product instead of five teams.
39
+ </blockquote>
40
+ <figcaption class="mw-testimonial-source">
41
+ Priya S.
42
+ <span class="mw-testimonial-detail">&middot; Product Designer</span>
43
+ </figcaption>
44
+ </figure>
45
+
46
+ <figure class="mw-testimonial mw-reveal">
47
+ <blockquote>Small CSS, no build step, readable class names.</blockquote>
48
+ <figcaption class="mw-testimonial-source">
49
+ Tom W. <span class="mw-testimonial-detail">&middot; Freelancer</span>
50
+ </figcaption>
51
+ </figure>
52
+
53
+ <figure class="mw-testimonial mw-reveal">
54
+ <blockquote>
55
+ The form controls line up with the buttons out of the box. That alone
56
+ saved us a week of pixel pushing across three breakpoints - and the touch
57
+ targets grow on their own on mobile.
58
+ </blockquote>
59
+ <figcaption class="mw-testimonial-source">
60
+ Aylin D. <span class="mw-testimonial-detail">&middot; Agency Lead</span>
61
+ </figcaption>
62
+ </figure>
63
+
64
+ <figure class="mw-testimonial mw-reveal">
65
+ <blockquote>
66
+ Swapped one primary color, the whole palette followed.
67
+ </blockquote>
68
+ <figcaption class="mw-testimonial-source">
69
+ Ben L. <span class="mw-testimonial-detail">&middot; Indie Hacker</span>
70
+ </figcaption>
71
+ </figure>
72
+
73
+ <figure class="mw-testimonial mw-reveal">
74
+ <blockquote>
75
+ Our legal pages, our landing page and our admin tables all speak the same
76
+ language now.
77
+ </blockquote>
78
+ <figcaption class="mw-testimonial-source">
79
+ Carla M. <span class="mw-testimonial-detail">&middot; CTO</span>
80
+ </figcaption>
81
+ </figure>
82
+ </div>
@@ -69,10 +69,7 @@
69
69
  <div class="mw-tiles mw-tiles-2col">
70
70
  <div class="mw-tile">
71
71
  <div class="mw-tile-img">
72
- <img
73
- src="https://picsum.photos/80/80?random=1"
74
- alt="E-commerce platform"
75
- />
72
+ <img src="images/tile-ecommerce.svg" alt="E-commerce platform" />
76
73
  </div>
77
74
  <h3 class="mw-tile-header">E-commerce Platform</h3>
78
75
  <div class="mw-tile-body">
@@ -84,10 +81,7 @@
84
81
 
85
82
  <div class="mw-tile">
86
83
  <div class="mw-tile-img">
87
- <img
88
- src="https://picsum.photos/80/80?random=2"
89
- alt="Marketing automation"
90
- />
84
+ <img src="images/tile-marketing.svg" alt="Marketing automation" />
91
85
  </div>
92
86
  <h3 class="mw-tile-header">Marketing Automation</h3>
93
87
  <div class="mw-tile-body">
@@ -181,10 +175,7 @@
181
175
  <div class="mw-tiles">
182
176
  <div class="mw-tile mw-tile-lg">
183
177
  <div class="mw-tile-img">
184
- <img
185
- src="https://picsum.photos/80/80?random=3"
186
- alt="Cloud infrastructure"
187
- />
178
+ <img src="images/tile-cloud.svg" alt="Cloud infrastructure" />
188
179
  </div>
189
180
  <h2 class="mw-tile-header">Cloud Infrastructure</h2>
190
181
  <div class="mw-tile-body">
@@ -201,10 +192,7 @@
201
192
 
202
193
  <div class="mw-tile mw-tile-lg">
203
194
  <div class="mw-tile-img">
204
- <img
205
- src="https://picsum.photos/100/100?random=8"
206
- alt="Business intelligence"
207
- />
195
+ <img src="images/tile-analytics.svg" alt="Business intelligence" />
208
196
  </div>
209
197
  <h2 class="mw-tile-header">Business Intelligence Suite</h2>
210
198
  <div class="mw-tile-body">
@@ -222,10 +210,7 @@
222
210
 
223
211
  <div class="mw-tile mw-tile-lg">
224
212
  <div class="mw-tile-img">
225
- <img
226
- src="https://picsum.photos/100/100?random=9"
227
- alt="Enterprise solutions"
228
- />
213
+ <img src="images/tile-enterprise.svg" alt="Enterprise solutions" />
229
214
  </div>
230
215
  <h2 class="mw-tile-header">Enterprise Solutions</h2>
231
216
  <div class="mw-tile-body">
@@ -99,6 +99,12 @@ $_active-prefix: 'dark';
99
99
  // header height
100
100
  --mw-header-height: #{$header-height};
101
101
 
102
+ // Height the announcement ribbon reserves - the anchor scroll offset is
103
+ // calculated from it, so a project with a taller ribbon raises this token
104
+ // rather than fighting the offset. Below `sm` the component itself steps it
105
+ // up for the wrapped line.
106
+ --mw-announcement-height: 2.7rem;
107
+
102
108
  // Layout knobs. A good default is not enough here: what reads as generous on
103
109
  // a landing page costs visible content in an application with a sticky
104
110
  // header. Same framework, two different right answers.
@@ -123,7 +129,7 @@ $_active-prefix: 'dark';
123
129
  1200px,
124
130
  calc(100% - 2 * var(--mw-container-gutter))
125
131
  );
126
- --mw-section-padding-block: #{spacing('7')};
132
+ --mw-section-padding-block: #{spacing('10')};
127
133
  --mw-section-title-gap: #{spacing('7')};
128
134
  --mw-scroll-hint-offset: #{spacing('9')};
129
135
  --mw-scroll-hint-inline: var(--mw-container-gutter);
@@ -0,0 +1,84 @@
1
+ @use '../abstracts' as *;
2
+
3
+ // The ribbon under the fixed header - a discount, a launch note, a maintenance
4
+ // window. One per page, and always a single line of content with an optional
5
+ // highlight pill in front of it.
6
+ .mw-announcement {
7
+ position: fixed;
8
+ top: var(--mw-header-height);
9
+ right: 0;
10
+ left: 0;
11
+ z-index: z-index('header') - 10;
12
+ background: color-mix(in srgb, var(--mw-primary-color) 75%, transparent);
13
+ backdrop-filter: blur(7px);
14
+ color: var(--mw-primary-accent-text-color);
15
+ box-shadow: var(--mw-elevation-2);
16
+ }
17
+
18
+ // The one row inside - usually a link to the thing announced.
19
+ .mw-announcement-content {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ gap: spacing('4');
24
+ min-height: var(--mw-announcement-height);
25
+ padding: spacing('1') spacing('4');
26
+ font-size: font-size('sm');
27
+ text-align: center;
28
+ color: inherit;
29
+ text-decoration: none;
30
+
31
+ &:hover,
32
+ &:focus-visible {
33
+ background: color-mix(in srgb, #000 10%, transparent);
34
+ }
35
+
36
+ @include focus-ring-inset;
37
+ @include tappable;
38
+ }
39
+
40
+ // The highlight pill - the "-20 %", the "NEW". Darkened glass rather than a
41
+ // color of its own, so it works on every variant without a token per pair.
42
+ .mw-announcement-highlight {
43
+ flex-shrink: 0;
44
+ padding: spacing('1') spacing('3');
45
+ border-radius: 999px;
46
+ background: color-mix(in srgb, #000 18%, transparent);
47
+ font-weight: font-weight('bold');
48
+ }
49
+
50
+ // The ribbon in the document flow instead of glued under the header - for a
51
+ // notice inside a page, or a demo of the component itself. Static, it scrolls
52
+ // with the content and shifts no anchor offset below.
53
+ .mw-announcement-static {
54
+ position: static;
55
+ }
56
+
57
+ // Anchors scrolled to under the fixed chrome would land under the ribbon too -
58
+ // the same reason the reset reserves the header height. Scoped with :has, so a
59
+ // page without a ribbon keeps the plain offset - and a static ribbon does not
60
+ // count, it scrolls with the content.
61
+ html:has(.mw-announcement:not(.mw-announcement-static)) {
62
+ scroll-padding-top: calc(
63
+ var(--mw-header-height) + var(--mw-announcement-height)
64
+ );
65
+ }
66
+
67
+ // On a phone the line wraps and the ribbon grows - the height token follows,
68
+ // so the scroll offset above stays honest. Here and not in base, so cherry-
69
+ // picking the component brings the whole behaviour along.
70
+ @include media-down('sm') {
71
+ :root {
72
+ --mw-announcement-height: 3.4rem;
73
+ }
74
+ }
75
+
76
+ // Color variants
77
+ $_mw-announcement-colors: (secondary, success, warning, danger, info);
78
+
79
+ @each $name in $_mw-announcement-colors {
80
+ .mw-announcement-#{$name} {
81
+ background: color-mix(in srgb, var(--mw-#{$name}-color) 75%, transparent);
82
+ color: var(--mw-#{$name}-accent-text-color);
83
+ }
84
+ }
@@ -1,5 +1,6 @@
1
1
  @forward 'accordions';
2
2
  @forward 'alerts';
3
+ @forward 'announcement';
3
4
  @forward 'avatars';
4
5
  @forward 'badge';
5
6
  @forward 'blog-post';
@@ -21,12 +22,14 @@
21
22
  @forward 'links';
22
23
  @forward 'lists';
23
24
  @forward 'localhost-indicator';
25
+ @forward 'media';
24
26
  @forward 'meta-info';
25
27
  @forward 'modals';
26
28
  @forward 'pagination';
27
29
  @forward 'panels';
28
30
  @forward 'pricing';
29
31
  @forward 'progress';
32
+ @forward 'prose';
30
33
  @forward 'ratings';
31
34
  @forward 'segmented';
32
35
  @forward 'skeleton';
@@ -36,6 +39,7 @@
36
39
  @forward 'tabs';
37
40
  @forward 'tags';
38
41
  @forward 'techstack-bucket';
42
+ @forward 'testimonial';
39
43
  @forward 'theme-toggle';
40
44
  @forward 'tiles';
41
45
  @forward 'timelines';