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.
- package/README.md +2 -2
- package/maverick-wave.min.css +2 -2
- package/package.json +8 -2
- package/src/scss/abstracts/_variables.scss +2 -0
- package/src/scss/components/_modals.scss +23 -9
- package/src/scss/components/_testimonial.scss +2 -0
- package/src/scss/layout/_home.scss +46 -0
- package/src/scss/layout/_main.scss +20 -0
- package/src/scss/layout/_parallax.scss +2 -2
- package/src/scss/main-lean.scss +8 -3
- package/.claude/settings.local.json +0 -43
- package/.claude/skills/mw-maverick-wave/SKILL.md +0 -532
- package/.claude/skills/mw-maverick-wave/examples/angular-form.md +0 -279
- package/.claude/skills/mw-maverick-wave/examples/angular-list-page.md +0 -309
- package/.claude/skills/mw-maverick-wave/examples/angular-services.md +0 -538
- package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +0 -530
- package/.claude/skills/mw-maverick-wave/references/components.md +0 -2170
- package/.claude/skills/mw-maverick-wave/references/forms.md +0 -358
- package/.claude/skills/mw-maverick-wave/references/javascript.md +0 -164
- package/.claude/skills/mw-maverick-wave/references/layout.md +0 -764
- package/.claude/skills/mw-maverick-wave/references/theming.md +0 -530
- package/.github/workflows/ci.yml +0 -41
- package/.idea/codeStyles/Project.xml +0 -59
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/maverick-wave.iml +0 -12
- package/.idea/modules.xml +0 -8
- package/.idea/prettier.xml +0 -6
- package/.idea/vcs.xml +0 -6
- package/.prettierignore +0 -8
- package/.prettierrc.json +0 -7
- package/CHANGELOG.md +0 -956
- package/CLAUDE.md +0 -60
- package/gulpfile.js +0 -167
- package/index.html +0 -1730
- package/release.sh +0 -31
- package/scripts/verify.js +0 -252
- package/src/assets/favicon/apple-touch-icon.png +0 -0
- package/src/assets/favicon/favicon-96x96.png +0 -0
- package/src/assets/favicon/favicon.svg +0 -1
- package/src/assets/favicon/site.webmanifest +0 -37
- package/src/assets/favicon/web-app-manifest-192x192.png +0 -0
- package/src/assets/favicon/web-app-manifest-512x512.png +0 -0
- package/src/assets/favicon.ico +0 -0
- package/src/assets/header-logo.svg +0 -24
- package/src/assets/images/gallery-city.svg +0 -49
- package/src/assets/images/gallery-desert.svg +0 -25
- package/src/assets/images/gallery-forest.svg +0 -46
- package/src/assets/images/gallery-lake.svg +0 -26
- package/src/assets/images/gallery-mountain.svg +0 -19
- package/src/assets/images/gallery-ocean.svg +0 -26
- package/src/assets/images/gallery-oldtown.svg +0 -41
- package/src/assets/images/gallery-snow.svg +0 -39
- package/src/assets/images/photo-balloon.svg +0 -35
- package/src/assets/images/photo-forest-path.svg +0 -31
- package/src/assets/images/photo-lighthouse.svg +0 -42
- package/src/assets/images/photo-palm.svg +0 -27
- package/src/assets/images/photo-peak.svg +0 -27
- package/src/assets/images/photo-tower.svg +0 -34
- package/src/assets/images/photo-waterfall.svg +0 -32
- package/src/assets/images/slider-field.svg +0 -124
- package/src/assets/images/slider-forest.svg +0 -33
- package/src/assets/images/slider-lake.svg +0 -35
- package/src/assets/images/slider-mountains.svg +0 -29
- package/src/assets/images/slider-trees.svg +0 -41
- package/src/assets/images/story-aurora.svg +0 -36
- package/src/assets/images/story-beach.svg +0 -34
- package/src/assets/images/story-stars.svg +0 -35
- package/src/assets/images/tile-analytics.svg +0 -22
- package/src/assets/images/tile-cloud.svg +0 -19
- package/src/assets/images/tile-ecommerce.svg +0 -14
- package/src/assets/images/tile-enterprise.svg +0 -22
- package/src/assets/images/tile-marketing.svg +0 -16
- package/src/assets/media/demo-chime.wav +0 -0
- package/src/assets/media/story-sunrise.jpg +0 -0
- package/src/assets/media/story-sunrise.mp4 +0 -0
- package/src/partials/accordions-container.html +0 -179
- package/src/partials/alerts-container.html +0 -151
- package/src/partials/announcement-container.html +0 -67
- package/src/partials/avatars-container.html +0 -229
- package/src/partials/badges-container.html +0 -114
- package/src/partials/blog-posts-container.html +0 -158
- package/src/partials/breadcrumbs-container.html +0 -126
- package/src/partials/button-bar-container.html +0 -175
- package/src/partials/buttons-container.html +0 -272
- package/src/partials/calendar-container.html +0 -203
- package/src/partials/cards-container.html +0 -727
- package/src/partials/code-container.html +0 -194
- package/src/partials/colors-container.html +0 -263
- package/src/partials/coming-soon-container.html +0 -10
- package/src/partials/contact-container.html +0 -85
- package/src/partials/content-slider-container.html +0 -36
- package/src/partials/divider-container.html +0 -70
- package/src/partials/documentation-container.html +0 -204
- package/src/partials/dropdown-container.html +0 -119
- package/src/partials/empty-state-container.html +0 -79
- package/src/partials/feed-container.html +0 -506
- package/src/partials/footer-container.html +0 -113
- package/src/partials/form-container.html +0 -262
- package/src/partials/form-elements-container.html +0 -616
- package/src/partials/form-field-container.html +0 -166
- package/src/partials/gallery-container.html +0 -62
- package/src/partials/get-started-container.html +0 -423
- package/src/partials/grid-container.html +0 -191
- package/src/partials/header-container.html +0 -69
- package/src/partials/header-utilities-container.html +0 -331
- package/src/partials/highlights-container.html +0 -71
- package/src/partials/history-container.html +0 -67
- package/src/partials/home-container.html +0 -31
- package/src/partials/html-lists-container.html +0 -63
- package/src/partials/info-container.html +0 -104
- package/src/partials/input-group-container.html +0 -299
- package/src/partials/item-lists-container.html +0 -368
- package/src/partials/kanban-container.html +0 -459
- package/src/partials/kbd-container.html +0 -63
- package/src/partials/leader-row-container.html +0 -139
- package/src/partials/login-container.html +0 -65
- package/src/partials/lunch-menu-container.html +0 -341
- package/src/partials/media-container.html +0 -27
- package/src/partials/meta-info-container.html +0 -21
- package/src/partials/modals-container.html +0 -199
- package/src/partials/mosaic-container.html +0 -173
- package/src/partials/page-header-container.html +0 -78
- package/src/partials/pagination-container.html +0 -64
- package/src/partials/palette-container.html +0 -480
- package/src/partials/panels-container.html +0 -126
- package/src/partials/parallax-container.html +0 -147
- package/src/partials/portrait-gallery-container.html +0 -175
- package/src/partials/preview-container.html +0 -136
- package/src/partials/pricing-container.html +0 -523
- package/src/partials/progress-container.html +0 -230
- package/src/partials/prose-container.html +0 -43
- package/src/partials/ratings-container.html +0 -104
- package/src/partials/section-head-container.html +0 -77
- package/src/partials/segmented-container.html +0 -66
- package/src/partials/skeleton-container.html +0 -87
- package/src/partials/spinners-container.html +0 -96
- package/src/partials/stepper-container.html +0 -111
- package/src/partials/stories-container.html +0 -182
- package/src/partials/tables-container.html +0 -309
- package/src/partials/tabs-container.html +0 -290
- package/src/partials/tags-container.html +0 -242
- package/src/partials/techstack-bucket-container.html +0 -187
- package/src/partials/testimonials-container.html +0 -88
- package/src/partials/tiles-container.html +0 -247
- package/src/partials/timelines-container.html +0 -196
- package/src/partials/typography-container.html +0 -74
- 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 && 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 & 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
|
-
❮
|
|
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
|
-
❯
|
|
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><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/maverick-wave@{{VERSION}}/maverick-wave.min.css">
|
|
10
|
-
<script src="https://cdn.jsdelivr.net/npm/maverick-wave@{{VERSION}}/maverick-wave.min.js"></script></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><!DOCTYPE html>
|
|
56
|
-
<html lang="en">
|
|
57
|
-
<head>
|
|
58
|
-
<meta charset="UTF-8">
|
|
59
|
-
<!-- viewport-fit=cover is what makes env(safe-area-inset-*) resolve on a notched phone -->
|
|
60
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
|
61
|
-
<title>My MaverickWave Project</title>
|
|
62
|
-
<!-- Framework CSS -->
|
|
63
|
-
<link rel="stylesheet" href="path/to/maverick-wave.min.css">
|
|
64
|
-
|
|
65
|
-
<!-- Your Custom Styles (load AFTER framework) -->
|
|
66
|
-
<link rel="stylesheet" href="your-custom-styles.css">
|
|
67
|
-
</head>
|
|
68
|
-
<body>
|
|
69
|
-
<!-- Your content -->
|
|
70
|
-
|
|
71
|
-
<!-- Framework JS -->
|
|
72
|
-
<script src="path/to/maverick-wave.min.js"></script>
|
|
73
|
-
</body>
|
|
74
|
-
</html></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><body></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><dialog class="mw-modal"></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><link rel="stylesheet"
|
|
290
|
-
href="https://cdn.jsdelivr.net/npm/maverick-wave@{{VERSION}}/maverick-wave.min.css"></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><body></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(() => {
|
|
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><div class="mw-field" [class.mw-field-has-error]="email.invalid && email.touched">
|
|
325
|
-
<label class="mw-field-label mw-required" for="email">Email</label>
|
|
326
|
-
<input id="email" type="email" class="mw-input" formControlName="email" />
|
|
327
|
-
<span class="mw-field-error" *ngIf="email.invalid && email.touched">
|
|
328
|
-
<i class="fas fa-exclamation-circle"></i> Please enter a valid email.
|
|
329
|
-
</span>
|
|
330
|
-
</div></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
|
-
<div className="mw-container">
|
|
355
|
-
<h1 className="mw-text-primary">Hello, MaverickWave!</h1>
|
|
356
|
-
<button className="mw-btn mw-btn-primary">Get Started</button>
|
|
357
|
-
</div>
|
|
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>
|