maverick-wave 5.30.0 → 5.32.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 (147) hide show
  1. package/README.md +2 -2
  2. package/maverick-wave.min.css +2 -2
  3. package/package.json +8 -2
  4. package/src/scss/abstracts/_variables.scss +2 -0
  5. package/src/scss/components/_modals.scss +23 -9
  6. package/src/scss/components/_testimonial.scss +2 -0
  7. package/src/scss/layout/_home.scss +46 -0
  8. package/src/scss/layout/_main.scss +20 -0
  9. package/src/scss/layout/_parallax.scss +2 -2
  10. package/src/scss/main-lean.scss +8 -3
  11. package/.claude/settings.local.json +0 -43
  12. package/.claude/skills/mw-maverick-wave/SKILL.md +0 -532
  13. package/.claude/skills/mw-maverick-wave/examples/angular-form.md +0 -279
  14. package/.claude/skills/mw-maverick-wave/examples/angular-list-page.md +0 -309
  15. package/.claude/skills/mw-maverick-wave/examples/angular-services.md +0 -538
  16. package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +0 -530
  17. package/.claude/skills/mw-maverick-wave/references/components.md +0 -2170
  18. package/.claude/skills/mw-maverick-wave/references/forms.md +0 -358
  19. package/.claude/skills/mw-maverick-wave/references/javascript.md +0 -164
  20. package/.claude/skills/mw-maverick-wave/references/layout.md +0 -764
  21. package/.claude/skills/mw-maverick-wave/references/theming.md +0 -530
  22. package/.github/workflows/ci.yml +0 -41
  23. package/.idea/codeStyles/Project.xml +0 -59
  24. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  25. package/.idea/maverick-wave.iml +0 -12
  26. package/.idea/modules.xml +0 -8
  27. package/.idea/prettier.xml +0 -6
  28. package/.idea/vcs.xml +0 -6
  29. package/.prettierignore +0 -8
  30. package/.prettierrc.json +0 -7
  31. package/CHANGELOG.md +0 -956
  32. package/CLAUDE.md +0 -60
  33. package/gulpfile.js +0 -167
  34. package/index.html +0 -1730
  35. package/release.sh +0 -31
  36. package/scripts/verify.js +0 -252
  37. package/src/assets/favicon/apple-touch-icon.png +0 -0
  38. package/src/assets/favicon/favicon-96x96.png +0 -0
  39. package/src/assets/favicon/favicon.svg +0 -1
  40. package/src/assets/favicon/site.webmanifest +0 -37
  41. package/src/assets/favicon/web-app-manifest-192x192.png +0 -0
  42. package/src/assets/favicon/web-app-manifest-512x512.png +0 -0
  43. package/src/assets/favicon.ico +0 -0
  44. package/src/assets/header-logo.svg +0 -24
  45. package/src/assets/images/gallery-city.svg +0 -49
  46. package/src/assets/images/gallery-desert.svg +0 -25
  47. package/src/assets/images/gallery-forest.svg +0 -46
  48. package/src/assets/images/gallery-lake.svg +0 -26
  49. package/src/assets/images/gallery-mountain.svg +0 -19
  50. package/src/assets/images/gallery-ocean.svg +0 -26
  51. package/src/assets/images/gallery-oldtown.svg +0 -41
  52. package/src/assets/images/gallery-snow.svg +0 -39
  53. package/src/assets/images/photo-balloon.svg +0 -35
  54. package/src/assets/images/photo-forest-path.svg +0 -31
  55. package/src/assets/images/photo-lighthouse.svg +0 -42
  56. package/src/assets/images/photo-palm.svg +0 -27
  57. package/src/assets/images/photo-peak.svg +0 -27
  58. package/src/assets/images/photo-tower.svg +0 -34
  59. package/src/assets/images/photo-waterfall.svg +0 -32
  60. package/src/assets/images/slider-field.svg +0 -124
  61. package/src/assets/images/slider-forest.svg +0 -33
  62. package/src/assets/images/slider-lake.svg +0 -35
  63. package/src/assets/images/slider-mountains.svg +0 -29
  64. package/src/assets/images/slider-trees.svg +0 -41
  65. package/src/assets/images/story-aurora.svg +0 -36
  66. package/src/assets/images/story-beach.svg +0 -34
  67. package/src/assets/images/story-stars.svg +0 -35
  68. package/src/assets/images/tile-analytics.svg +0 -22
  69. package/src/assets/images/tile-cloud.svg +0 -19
  70. package/src/assets/images/tile-ecommerce.svg +0 -14
  71. package/src/assets/images/tile-enterprise.svg +0 -22
  72. package/src/assets/images/tile-marketing.svg +0 -16
  73. package/src/assets/media/demo-chime.wav +0 -0
  74. package/src/assets/media/story-sunrise.jpg +0 -0
  75. package/src/assets/media/story-sunrise.mp4 +0 -0
  76. package/src/partials/accordions-container.html +0 -179
  77. package/src/partials/alerts-container.html +0 -151
  78. package/src/partials/announcement-container.html +0 -67
  79. package/src/partials/avatars-container.html +0 -229
  80. package/src/partials/badges-container.html +0 -114
  81. package/src/partials/blog-posts-container.html +0 -158
  82. package/src/partials/breadcrumbs-container.html +0 -126
  83. package/src/partials/button-bar-container.html +0 -175
  84. package/src/partials/buttons-container.html +0 -272
  85. package/src/partials/calendar-container.html +0 -203
  86. package/src/partials/cards-container.html +0 -727
  87. package/src/partials/code-container.html +0 -194
  88. package/src/partials/colors-container.html +0 -263
  89. package/src/partials/coming-soon-container.html +0 -10
  90. package/src/partials/contact-container.html +0 -85
  91. package/src/partials/content-slider-container.html +0 -36
  92. package/src/partials/divider-container.html +0 -70
  93. package/src/partials/documentation-container.html +0 -204
  94. package/src/partials/dropdown-container.html +0 -119
  95. package/src/partials/empty-state-container.html +0 -79
  96. package/src/partials/feed-container.html +0 -506
  97. package/src/partials/footer-container.html +0 -113
  98. package/src/partials/form-container.html +0 -262
  99. package/src/partials/form-elements-container.html +0 -616
  100. package/src/partials/form-field-container.html +0 -166
  101. package/src/partials/gallery-container.html +0 -62
  102. package/src/partials/get-started-container.html +0 -423
  103. package/src/partials/grid-container.html +0 -191
  104. package/src/partials/header-container.html +0 -69
  105. package/src/partials/header-utilities-container.html +0 -331
  106. package/src/partials/highlights-container.html +0 -71
  107. package/src/partials/history-container.html +0 -67
  108. package/src/partials/home-container.html +0 -31
  109. package/src/partials/html-lists-container.html +0 -63
  110. package/src/partials/info-container.html +0 -104
  111. package/src/partials/input-group-container.html +0 -299
  112. package/src/partials/item-lists-container.html +0 -368
  113. package/src/partials/kanban-container.html +0 -459
  114. package/src/partials/kbd-container.html +0 -63
  115. package/src/partials/leader-row-container.html +0 -139
  116. package/src/partials/login-container.html +0 -65
  117. package/src/partials/lunch-menu-container.html +0 -341
  118. package/src/partials/media-container.html +0 -27
  119. package/src/partials/meta-info-container.html +0 -21
  120. package/src/partials/modals-container.html +0 -199
  121. package/src/partials/mosaic-container.html +0 -173
  122. package/src/partials/page-header-container.html +0 -78
  123. package/src/partials/pagination-container.html +0 -64
  124. package/src/partials/palette-container.html +0 -480
  125. package/src/partials/panels-container.html +0 -126
  126. package/src/partials/parallax-container.html +0 -147
  127. package/src/partials/portrait-gallery-container.html +0 -175
  128. package/src/partials/preview-container.html +0 -136
  129. package/src/partials/pricing-container.html +0 -523
  130. package/src/partials/progress-container.html +0 -230
  131. package/src/partials/prose-container.html +0 -43
  132. package/src/partials/ratings-container.html +0 -104
  133. package/src/partials/section-head-container.html +0 -77
  134. package/src/partials/segmented-container.html +0 -66
  135. package/src/partials/skeleton-container.html +0 -87
  136. package/src/partials/spinners-container.html +0 -96
  137. package/src/partials/stepper-container.html +0 -111
  138. package/src/partials/stories-container.html +0 -182
  139. package/src/partials/tables-container.html +0 -309
  140. package/src/partials/tabs-container.html +0 -290
  141. package/src/partials/tags-container.html +0 -242
  142. package/src/partials/techstack-bucket-container.html +0 -187
  143. package/src/partials/testimonials-container.html +0 -88
  144. package/src/partials/tiles-container.html +0 -247
  145. package/src/partials/timelines-container.html +0 -196
  146. package/src/partials/typography-container.html +0 -74
  147. package/src/partials/utilities-container.html +0 -553
@@ -1,166 +0,0 @@
1
- <h3 class="mw-section-subtitle">Form Field Pattern</h3>
2
- <p class="mw-text-muted mw-text-measure">
3
- Label, field, hint and error as one unit, so the spacing between them is not
4
- re-invented per form. Written with Angular reactive forms in mind; the markup
5
- is plain HTML.
6
- </p>
7
-
8
- <div class="mw-grid-2 mw-gap-6">
9
- <!-- LEFT: mw-field wrapper -->
10
- <div>
11
- <h3 class="mw-card-title mw-mb-4">Field Wrapper (mw-field)</h3>
12
- <div class="mw-card mw-card-simple">
13
- <p class="mw-text-muted mw-text-sm mw-mb-4">
14
- The <code>mw-field</code> wrapper groups label, input, hint, and error
15
- message as a single unit - the recommended pattern for Angular reactive
16
- forms.
17
- </p>
18
-
19
- <!-- Normal field with hint -->
20
- <div class="mw-field mw-mb-4">
21
- <label class="mw-field-label mw-required" for="ff-email"
22
- >Email address</label
23
- >
24
- <input
25
- id="ff-email"
26
- type="email"
27
- class="mw-input"
28
- placeholder="user@example.com"
29
- />
30
- <span class="mw-field-hint"
31
- >We'll never share your email with anyone.</span
32
- >
33
- </div>
34
-
35
- <!-- Field in error state -->
36
- <div class="mw-field mw-field-has-error mw-mb-4">
37
- <label class="mw-field-label mw-required" for="ff-email-err"
38
- >Email address</label
39
- >
40
- <input
41
- id="ff-email-err"
42
- type="email"
43
- class="mw-input"
44
- value="not-an-email"
45
- />
46
- <span class="mw-field-error">
47
- <i class="fas fa-exclamation-circle"></i>
48
- Please enter a valid email address.
49
- </span>
50
- </div>
51
-
52
- <!-- Select field with hint -->
53
- <div class="mw-field mw-mb-4">
54
- <label class="mw-field-label" for="ff-country">Country</label>
55
- <select id="ff-country" class="mw-select">
56
- <option value="" disabled selected>Select a country</option>
57
- <option>Germany</option>
58
- <option>Austria</option>
59
- <option>Switzerland</option>
60
- </select>
61
- <span class="mw-field-hint"
62
- >Your billing country for tax purposes.</span
63
- >
64
- </div>
65
-
66
- <!-- Textarea with character hint -->
67
- <div class="mw-field">
68
- <label class="mw-field-label mw-required" for="ff-bio">Bio</label>
69
- <textarea
70
- id="ff-bio"
71
- class="mw-textarea"
72
- rows="3"
73
- placeholder="Tell us about yourself..."
74
- ></textarea>
75
- <span class="mw-field-hint">Maximum 500 characters.</span>
76
- </div>
77
- </div>
78
- </div>
79
-
80
- <!-- RIGHT: error, single-control error, readonly, disabled -->
81
- <div>
82
- <h3 class="mw-card-title mw-mb-4">Validation & Readonly States</h3>
83
- <div class="mw-card mw-card-simple">
84
- <p class="mw-text-muted mw-text-sm mw-mb-4">
85
- The error look is not automatic: bind
86
- <code>mw-field-has-error</code> to the control state (in Angular
87
- <code>[class.mw-field-has-error]="c.invalid &amp;&amp; c.touched"</code
88
- >). A control without a field wrapper - also a
89
- <code>mw-checkbox-group</code>, <code>mw-radio-group</code> or
90
- <code>mw-slider-container</code> - takes
91
- <code>mw-form-element-error</code> instead.
92
- </p>
93
-
94
- <!-- Field wrapper in error state -->
95
- <div class="mw-field mw-field-has-error mw-mb-4">
96
- <label class="mw-field-label mw-required" for="ff-username"
97
- >Username (invalid &amp; touched)</label
98
- >
99
- <input
100
- id="ff-username"
101
- type="text"
102
- class="mw-input"
103
- value=""
104
- placeholder="Required"
105
- />
106
- <span class="mw-field-error">
107
- <i class="fas fa-exclamation-circle"></i> Username is required.
108
- </span>
109
- </div>
110
-
111
- <!-- Single control without a wrapper -->
112
- <div class="mw-field mw-mb-4">
113
- <label class="mw-field-label mw-required" for="ff-password"
114
- >Password (single control error)</label
115
- >
116
- <input
117
- id="ff-password"
118
- type="password"
119
- class="mw-input mw-form-element-error"
120
- value="123"
121
- />
122
- <span class="mw-field-hint">At least 8 characters.</span>
123
- </div>
124
-
125
- <!-- Readonly -->
126
- <div class="mw-field mw-mb-4">
127
- <label class="mw-field-label" for="ff-account-id"
128
- >Account ID (readonly)</label
129
- >
130
- <input
131
- id="ff-account-id"
132
- type="text"
133
- class="mw-input"
134
- readonly
135
- value="USR-00042"
136
- />
137
- <span class="mw-field-hint">This value cannot be changed.</span>
138
- </div>
139
-
140
- <!-- Disabled -->
141
- <div class="mw-field mw-mb-4">
142
- <label class="mw-field-label" for="ff-plan">Plan (disabled)</label>
143
- <select id="ff-plan" class="mw-select" disabled>
144
- <option>Enterprise</option>
145
- </select>
146
- <span class="mw-field-hint">Contact support to change your plan.</span>
147
- </div>
148
-
149
- <!-- Prefilled -->
150
- <div class="mw-field">
151
- <label class="mw-field-label" for="ff-company">Company</label>
152
- <input
153
- id="ff-company"
154
- type="text"
155
- class="mw-input mw-prefilled"
156
- value="ACME GmbH"
157
- aria-describedby="ff-company-hint"
158
- />
159
- <span class="mw-field-hint" id="ff-company-hint"
160
- >Prefilled from your account - marked with
161
- <code>mw-prefilled</code>.</span
162
- >
163
- </div>
164
- </div>
165
- </div>
166
- </div>
@@ -1,62 +0,0 @@
1
- <h3 class="mw-section-subtitle">Image Gallery</h3>
2
- <p class="mw-text-muted mw-text-measure">
3
- A slider for photos: swipe, arrows, dots and a caption read off the slide
4
- itself. The dots are real buttons, so the fourth picture is reachable without
5
- a mouse.
6
- </p>
7
-
8
- <div class="mw-gallery-container">
9
- <div class="mw-gallery">
10
- <!-- Prev button -->
11
- <button type="button" class="mw-gallery-navi mw-gallery-navi-prev">
12
- &#10094;
13
- </button>
14
-
15
- <!-- Track -->
16
- <div class="mw-gallery-track">
17
- <div class="mw-gallery-slide" data-desc="Beautiful Mountain">
18
- <img
19
- src="images/gallery-mountain.svg"
20
- alt="Beautiful Mountain"
21
- loading="lazy"
22
- />
23
- </div>
24
- <div class="mw-gallery-slide" data-desc="Peaceful Lake">
25
- <img src="images/gallery-lake.svg" alt="Peaceful Lake" loading="lazy" />
26
- </div>
27
- <div class="mw-gallery-slide" data-desc="City Vibes">
28
- <img src="images/gallery-city.svg" alt="City Vibes" loading="lazy" />
29
- </div>
30
- <div class="mw-gallery-slide" data-desc="Golden Forest">
31
- <img
32
- src="images/gallery-forest.svg"
33
- alt="Golden Forest"
34
- loading="lazy"
35
- />
36
- </div>
37
- <div class="mw-gallery-slide" data-desc="Desert View">
38
- <img src="images/gallery-desert.svg" alt="Desert View" loading="lazy" />
39
- </div>
40
- <div class="mw-gallery-slide" data-desc="Ocean Breeze">
41
- <img src="images/gallery-ocean.svg" alt="Ocean Breeze" loading="lazy" />
42
- </div>
43
- <div class="mw-gallery-slide" data-desc="Old Town">
44
- <img src="images/gallery-oldtown.svg" alt="Old Town" loading="lazy" />
45
- </div>
46
- <div class="mw-gallery-slide" data-desc="Snowy Hills">
47
- <img src="images/gallery-snow.svg" alt="Snowy Hills" loading="lazy" />
48
- </div>
49
- </div>
50
-
51
- <!-- Next button -->
52
- <button type="button" class="mw-gallery-navi mw-gallery-navi-next">
53
- &#10095;
54
- </button>
55
- </div>
56
-
57
- <!-- Description below slider -->
58
- <div class="mw-gallery-desc">Beautiful Mountain</div>
59
-
60
- <!-- Dots -->
61
- <div class="mw-gallery-dots"></div>
62
- </div>
@@ -1,423 +0,0 @@
1
- <h3>Installation</h3>
2
- <p>
3
- Add MaverickWave CSS framework to your project using one of these methods:
4
- </p>
5
-
6
- <h4 class="mw-mt-4">Option 1: CDN</h4>
7
- <pre
8
- class="mw-code-block"
9
- ><code>&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/maverick-wave@{{VERSION}}/maverick-wave.min.css"&gt;
10
- &lt;script src="https://cdn.jsdelivr.net/npm/maverick-wave@{{VERSION}}/maverick-wave.min.js"&gt;&lt;/script&gt;</code></pre>
11
-
12
- <h4 class="mw-mt-4">Option 2: Direct Download</h4>
13
- <div class="mw-d-flex mw-gap-4">
14
- <a href="maverick-wave.min.css" download class="mw-btn mw-btn-primary">
15
- Download CSS
16
- </a>
17
- <a href="maverick-wave.min.js" download class="mw-btn mw-btn-outline">
18
- Download JS
19
- </a>
20
- </div>
21
-
22
- <h3 class="mw-mt-6">Integration Options</h3>
23
-
24
- <div class="mw-tabs mw-mb-6">
25
- <div class="mw-tabs-nav">
26
- <button
27
- type="button"
28
- class="mw-tabs-nav-item mw-active"
29
- data-tab="html-css"
30
- >
31
- HTML/CSS
32
- </button>
33
- <button type="button" class="mw-tabs-nav-item" data-tab="scss">
34
- SCSS Projects
35
- </button>
36
- <button type="button" class="mw-tabs-nav-item" data-tab="angular">
37
- Angular
38
- </button>
39
- <button type="button" class="mw-tabs-nav-item" data-tab="react">
40
- React
41
- </button>
42
- </div>
43
-
44
- <div class="mw-tabs-content">
45
- <!-- HTML/CSS Tab -->
46
- <div class="mw-tabs-panel mw-active" id="html-css">
47
- <div class="mw-card mw-card-simple">
48
- <h4>Using Pre-compiled CSS (CDN or Download)</h4>
49
- <p>
50
- This is the simplest method if you don't need SCSS customization. Link
51
- the compiled <code>maverick-wave.min.css</code> and
52
- <code>maverick-wave.min.js</code> files in your HTML head and before
53
- the closing body tag, respectively.
54
- </p>
55
- <pre class="mw-code-block"><code>&lt;!DOCTYPE html&gt;
56
- &lt;html lang="en"&gt;
57
- &lt;head&gt;
58
- &lt;meta charset="UTF-8"&gt;
59
- &lt;!-- viewport-fit=cover is what makes env(safe-area-inset-*) resolve on a notched phone --&gt;
60
- &lt;meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"&gt;
61
- &lt;title&gt;My MaverickWave Project&lt;/title&gt;
62
- &lt;!-- Framework CSS --&gt;
63
- &lt;link rel="stylesheet" href="path/to/maverick-wave.min.css"&gt;
64
-
65
- &lt;!-- Your Custom Styles (load AFTER framework) --&gt;
66
- &lt;link rel="stylesheet" href="your-custom-styles.css"&gt;
67
- &lt;/head&gt;
68
- &lt;body&gt;
69
- &lt;!-- Your content --&gt;
70
-
71
- &lt;!-- Framework JS --&gt;
72
- &lt;script src="path/to/maverick-wave.min.js"&gt;&lt;/script&gt;
73
- &lt;/body&gt;
74
- &lt;/html&gt;</code></pre>
75
-
76
- <h5 class="mw-mt-4">Customizing via CSS Variables</h5>
77
- <p>
78
- Even without SCSS, you can customize colors and fonts by overriding
79
- the CSS custom properties. Create your own CSS file and load it
80
- <strong>after</strong> the MaverickWave CSS.
81
- </p>
82
- <pre class="mw-code-block"><code>/* your-custom-styles.css */
83
- :root {
84
- /* Brand colors */
85
- --mw-primary-color: #0f766e;
86
- --mw-secondary-color: #b45309;
87
-
88
- /* Text on every solid colored surface. The one token that cannot be
89
- derived: a light brand color needs a dark label, a dark one a light
90
- label - set it opposite your primary. */
91
- --mw-accent-text-color: #f2fafa;
92
-
93
- /* Per color override of that label, for a palette that does not sit on
94
- one side of the lightness scale - a neon primary needs a dark label
95
- while the rest of the palette keeps the light one. Same token for
96
- secondary, success, warning, danger and info. */
97
- --mw-primary-accent-text-color: #0b0f0a;
98
-
99
- /* Page backgrounds. Card, footer and border are derived from them, so
100
- these two are usually all you set. */
101
- --mw-dark-page-background: #172127;
102
- --mw-light-page-background: #f2f6f7;
103
-
104
- /* Font */
105
- --mw-font-family-base: 'Your Custom Font', sans-serif;
106
- }</code></pre>
107
- </div>
108
- </div>
109
-
110
- <!-- SCSS Tab -->
111
- <div class="mw-tabs-panel" id="scss">
112
- <div class="mw-card mw-card-simple">
113
- <h4>Using SCSS Source Files</h4>
114
- <p>
115
- For full customization, clone the repository and integrate the SCSS
116
- source directly into your project's Sass build (Dart Sass required).
117
- The entry point is <code>src/scss/main.scss</code>.
118
- </p>
119
- <p>
120
- MaverickWave uses <code>@use</code> / <code>@forward</code> (modern
121
- Sass module syntax). Pass your overrides through
122
- <code>@use ... with (...)</code> - a plain assignment before the
123
- <code>@use</code> has no effect, because the root colors are declared
124
- with <code>!default</code>.
125
- </p>
126
-
127
- <h5 class="mw-mt-4">Theme Mode</h5>
128
- <p>Set <code>$mw-theme-mode</code> to control theme behavior:</p>
129
- <ul>
130
- <li>
131
- <code>'switchable'</code> (default) - dark base, toggleable to light
132
- via <code>.mw-theme-light</code> on <code>&lt;body&gt;</code>
133
- </li>
134
- <li><code>'dark'</code> - compile dark theme only</li>
135
- <li><code>'light'</code> - compile light theme only</li>
136
- </ul>
137
- <p class="mw-text-warning">
138
- <i class="fas fa-exclamation-triangle mw-mr-1"></i>
139
- <strong>Note:</strong> The main header and navigation always use the
140
- dark appearance regardless of theme mode.
141
- </p>
142
-
143
- <h5 class="mw-mt-4">Example - your main SCSS file</h5>
144
- <pre class="mw-code-block"><code>// styles.scss
145
-
146
- @use 'path/to/maverick-wave/src/scss/main' with (
147
- // Theme mode (optional, default is 'switchable')
148
- $mw-theme-mode: 'switchable',
149
-
150
- // Root colors - everything else is derived from them at runtime
151
- $primary-color: #0f766e,
152
- $secondary-color: #b45309,
153
- $accent-text-color: #f2fafa,
154
- $dark-background: #172127,
155
- $light-background: #f2f6f7,
156
- $dark-text-color: #e8eef0,
157
- $light-text-color: #172127,
158
-
159
- // How far card and footer sit from the page background. Below 1 steps
160
- // toward black, above 1 toward white - 0.85 means the card sits at 85%
161
- // of the page's lightness.
162
- $card-surface-dark: 0.85,
163
- $card-surface-light: 1.05,
164
- $footer-surface-dark: 0.75,
165
- $footer-surface-light: 0.95
166
- );
167
-
168
- // Your additional styles
169
- body {
170
- // custom overrides
171
- }</code></pre>
172
-
173
- <h5 class="mw-mt-4">Importing Only What You Need</h5>
174
- <p>
175
- Every layer forwards one module per file and no
176
- <code>@extend</code> crosses a file boundary, so components can be
177
- imported individually. Applications usually have no use for the
178
- marketing components (<code>blog-post</code>, <code>gallery</code>,
179
- <code>content-slider</code>, <code>techstack-bucket</code>,
180
- <code>tiles</code>, <code>coming-soon</code>, <code>ratings</code>,
181
- <code>home</code>).
182
- </p>
183
- <pre
184
- class="mw-code-block"
185
- ><code>// styles.scss - the configuration has to come first
186
- @use 'maverick-wave/src/scss/abstracts/variables' with (
187
- $primary-color: #0f766e
188
- );
189
-
190
- @use 'maverick-wave/src/scss/base'; // required - carries the :root tokens
191
- @use 'maverick-wave/src/scss/layout/grid';
192
- @use 'maverick-wave/src/scss/layout/page-header';
193
- @use 'maverick-wave/src/scss/components/buttons';
194
- @use 'maverick-wave/src/scss/components/cards';
195
- @use 'maverick-wave/src/scss/components/modals';
196
- @use 'maverick-wave/src/scss/components/tables';
197
- @use 'maverick-wave/src/scss/components/tags';
198
- @use 'maverick-wave/src/scss/form-elements';
199
- @use 'maverick-wave/src/scss/utilities';</code></pre>
200
- <p class="mw-text-warning">
201
- <i class="fas fa-exclamation-triangle mw-mr-1"></i>
202
- Without <code>base</code> every component renders without colors - it
203
- carries the <code>:root</code> custom properties. A subset like the
204
- one above compiles to roughly 113 kB raw / 17 kB gzipped, against 281
205
- kB / 40 kB for the full build.
206
- </p>
207
-
208
- <h5 class="mw-mt-4">Mixins and Functions</h5>
209
- <p>
210
- <code>abstracts</code> brings these into your own rules. They exist on
211
- the SCSS path only - the compiled CSS carries none of them.
212
- </p>
213
- <ul class="mw-list">
214
- <li>
215
- <code>fluid($min, $max, $from: 'xs', $to: 'md')</code> - a clamp
216
- between two sizes. Each end is a key of <code>$font-sizes</code> or
217
- a plain rem/px length, so a hero that does not sit on the scale
218
- still gets one. The rem term is the point: a vw-only clamp ignores
219
- the reader's font size. The default range stops at <code>md</code>,
220
- a headline passes <code>$to: 'xl'</code>.
221
- </li>
222
- <li>
223
- <code>media-up($bp)</code> / <code>media-down($bp)</code> - the
224
- <code>$breakpoints</code> map as a query.
225
- </li>
226
- <li>
227
- <code>touch-context($bp: 'md')</code> - coarse pointer
228
- <em>or</em> narrow viewport, the condition every target-size rule in
229
- the framework hangs under.
230
- </li>
231
- <li>
232
- <code>touch-floor($size: 2.75rem)</code> - that condition plus a
233
- <code>min-height</code>. Not for a link inside a sentence: WCAG
234
- 2.5.8 exempts those, and a <code>min-height</code> there pushes the
235
- lines of the paragraph apart.
236
- </li>
237
- <li>
238
- <code>hit-area($grow: 6px)</code> - grows the hit area through
239
- <code>::after</code> without touching the silhouette, for a control
240
- whose size is the design. Neighbours need a gap of at least twice
241
- <code>$grow</code>, or two hit areas overlap.
242
- </li>
243
- </ul>
244
- <pre
245
- class="mw-code-block"
246
- ><code>@use 'maverick-wave/src/scss/abstracts' as *;
247
-
248
- .hero h1 {
249
- font-size: fluid(1.95rem, 4.2rem, $to: 'xl');
250
- }
251
-
252
- .my-close-button {
253
- @include touch-floor;
254
- }</code></pre>
255
- </div>
256
- </div>
257
-
258
- <!-- Angular Tab -->
259
- <div class="mw-tabs-panel" id="angular">
260
- <div class="mw-card mw-card-simple">
261
- <h4>Angular Integration</h4>
262
- <p>
263
- Download the compiled files and place them in your Angular project
264
- (e.g. <code>src/assets/</code>), then reference them in
265
- <code>angular.json</code>:
266
- </p>
267
- <pre class="mw-code-block"><code>// angular.json
268
- "styles": [
269
- "src/assets/maverick-wave.min.css",
270
- "src/styles.scss"
271
- ]</code></pre>
272
- <p class="mw-text-warning">
273
- <i class="fas fa-exclamation-triangle mw-mr-1"></i>
274
- <strong>No <code>"scripts"</code> entry for the JS file.</strong>
275
- <code>maverick-wave.min.js</code> wires everything up once on
276
- <code>DOMContentLoaded</code> and writes straight into the DOM - in a
277
- SPA everything rendered afterwards stays uninitialized, and the class
278
- toggles happen behind change detection. Rebuild the behaviors in
279
- components; the state classes (<code>mw-active</code>,
280
- <code>open</code>, <code>mw-selected</code>) are the whole contract. A
281
- modal is the exception - write it as a
282
- <code>&lt;dialog class="mw-modal"&gt;</code> and the element brings
283
- Escape, the focus trap and the scroll lock with it.
284
- </p>
285
- <p>
286
- Alternatively, use the CDN link directly in
287
- <code>src/index.html</code>:
288
- </p>
289
- <pre class="mw-code-block"><code>&lt;link rel="stylesheet"
290
- href="https://cdn.jsdelivr.net/npm/maverick-wave@{{VERSION}}/maverick-wave.min.css"&gt;</code></pre>
291
- <p>
292
- For SCSS integration, use the npm package (or a local copy of
293
- <code>src/scss/</code>) from <code>src/styles.scss</code>:
294
- </p>
295
- <pre class="mw-code-block"><code>// src/styles.scss
296
- @use 'maverick-wave/src/scss/main' with (
297
- $primary-color: #3f51b5,
298
- $mw-theme-mode: 'switchable'
299
- );</code></pre>
300
- <h5 class="mw-mt-4">Theme switching</h5>
301
- <p>
302
- Light mode is one class on <code>&lt;body&gt;</code>. Keep it in a
303
- service so the choice survives navigation:
304
- </p>
305
- <pre class="mw-code-block"><code>// theme.service.ts
306
- readonly light = signal(localStorage.getItem('mw-theme') === 'light');
307
-
308
- constructor() {
309
- effect(() =&gt; {
310
- const light = this.light();
311
- document.body.classList.toggle('mw-theme-light', light);
312
- localStorage.setItem('mw-theme', light ? 'light' : 'dark');
313
- });
314
- }</code></pre>
315
- <h5 class="mw-mt-4">Reactive Forms</h5>
316
- <p>
317
- The <code>mw-field</code> wrapper groups label, control, hint and
318
- error. Bind the error state yourself - the framework does not style
319
- Angular's <code>ng-invalid</code> / <code>ng-touched</code>
320
- classes:
321
- </p>
322
- <pre
323
- class="mw-code-block"
324
- ><code>&lt;div class="mw-field" [class.mw-field-has-error]="email.invalid && email.touched"&gt;
325
- &lt;label class="mw-field-label mw-required" for="email"&gt;Email&lt;/label&gt;
326
- &lt;input id="email" type="email" class="mw-input" formControlName="email" /&gt;
327
- &lt;span class="mw-field-error" *ngIf="email.invalid && email.touched"&gt;
328
- &lt;i class="fas fa-exclamation-circle"&gt;&lt;/i&gt; Please enter a valid email.
329
- &lt;/span&gt;
330
- &lt;/div&gt;</code></pre>
331
- </div>
332
- </div>
333
-
334
- <!-- React Tab -->
335
- <div class="mw-tabs-panel" id="react">
336
- <div class="mw-card mw-card-simple">
337
- <h4>React Integration</h4>
338
- <p>
339
- Download the compiled CSS file and import it in your entry point, or
340
- use the CDN link in <code>index.html</code>:
341
- </p>
342
- <pre class="mw-code-block"><code>// main.jsx / index.js
343
- import './assets/maverick-wave.min.css';</code></pre>
344
- <p class="mw-text-warning">
345
- <i class="fas fa-exclamation-triangle mw-mr-1"></i>
346
- Do not import <code>maverick-wave.min.js</code> in a SPA - it binds
347
- once on <code>DOMContentLoaded</code> and never sees anything rendered
348
- later. Accordion, tabs, modal and theme toggle are class toggles; bind
349
- them with <code>className</code> from state.
350
- </p>
351
- <p>Example usage in a React component:</p>
352
- <pre class="mw-code-block"><code>function App() {
353
- return (
354
- &lt;div className="mw-container"&gt;
355
- &lt;h1 className="mw-text-primary"&gt;Hello, MaverickWave!&lt;/h1&gt;
356
- &lt;button className="mw-btn mw-btn-primary"&gt;Get Started&lt;/button&gt;
357
- &lt;/div&gt;
358
- );
359
- }</code></pre>
360
- <p>
361
- For SCSS integration with Vite, copy the source and import from your
362
- main stylesheet:
363
- </p>
364
- <pre class="mw-code-block"><code>/* src/index.css or src/App.scss */
365
- @use './maverick-wave/src/scss/main';</code></pre>
366
- </div>
367
- </div>
368
- </div>
369
- </div>
370
-
371
- <h3 class="mw-mt-6">Adding Custom Fonts</h3>
372
- <p>
373
- To use custom fonts with MaverickWave, load the font files using
374
- <code>@font-face</code> and then override the CSS font variable.
375
- </p>
376
- <div class="mw-card mw-card-simple">
377
- <h4 class="mw-mb-2">1. Load the Font</h4>
378
- <pre class="mw-code-block"><code>/* your-custom-styles.css */
379
- @font-face {
380
- font-family: 'Your Custom Font';
381
- src: url('/path/to/font.woff2') format('woff2'),
382
- url('/path/to/font.woff') format('woff');
383
- font-weight: 400;
384
- font-style: normal;
385
- font-display: swap;
386
- }
387
-
388
- @font-face {
389
- font-family: 'Your Custom Font';
390
- src: url('/path/to/font-bold.woff2') format('woff2'),
391
- url('/path/to/font-bold.woff') format('woff');
392
- font-weight: 700;
393
- font-style: normal;
394
- font-display: swap;
395
- }
396
- </code></pre>
397
-
398
- <h4 class="mw-mt-4 mw-mb-2">2. Apply the Font</h4>
399
- <p>
400
- <strong>CSS Variable Method:</strong>
401
- </p>
402
- <pre
403
- class="mw-code-block"
404
- ><code>/* your-custom-styles.css - load AFTER maverick-wave.min.css */
405
- :root {
406
- --mw-font-family-base: 'Your Custom Font', system-ui, sans-serif;
407
- --mw-font-family-heading: 'Your Custom Font', system-ui, sans-serif;
408
- }</code></pre>
409
- </div>
410
-
411
- <div class="mw-d-flex mw-flex-wrap mw-gap-4 mw-justify-center mw-mt-6">
412
- <a href="#documentation" class="mw-btn mw-btn-primary">
413
- Explore Documentation
414
- </a>
415
- <a
416
- href="https://github.com/m1well/maverick-wave"
417
- target="_blank"
418
- rel="noopener noreferrer"
419
- class="mw-btn mw-btn-outline"
420
- >
421
- <i class="fab fa-github"></i> GitHub Repository
422
- </a>
423
- </div>