maverick-wave 5.24.0 → 5.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/mw-maverick-wave/SKILL.md +32 -5
- package/.claude/skills/mw-maverick-wave/references/components.md +4 -0
- package/.claude/skills/mw-maverick-wave/references/javascript.md +44 -8
- package/.claude/skills/mw-maverick-wave/references/layout.md +39 -11
- package/.claude/skills/mw-maverick-wave/references/theming.md +34 -10
- package/CHANGELOG.md +20 -0
- package/CLAUDE.md +4 -0
- package/README.md +4 -2
- package/index.html +13 -0
- package/maverick-wave.min.css +7 -5
- package/maverick-wave.min.js +1 -1
- package/package.json +2 -2
- package/src/js/main.js +149 -57
- package/src/partials/accordions-container.html +1 -1
- package/src/partials/alerts-container.html +1 -1
- package/src/partials/announcement-container.html +1 -1
- package/src/partials/avatars-container.html +1 -1
- package/src/partials/badges-container.html +1 -1
- package/src/partials/blog-posts-container.html +2 -2
- package/src/partials/breadcrumbs-container.html +1 -1
- package/src/partials/button-bar-container.html +1 -1
- package/src/partials/buttons-container.html +1 -1
- package/src/partials/calendar-container.html +1 -1
- package/src/partials/cards-container.html +1 -1
- package/src/partials/code-container.html +1 -1
- package/src/partials/colors-container.html +3 -3
- package/src/partials/coming-soon-container.html +1 -1
- package/src/partials/contact-container.html +1 -1
- package/src/partials/divider-container.html +1 -1
- package/src/partials/dropdown-container.html +1 -1
- package/src/partials/empty-state-container.html +1 -1
- package/src/partials/form-container.html +1 -1
- package/src/partials/form-elements-container.html +1 -1
- package/src/partials/form-field-container.html +1 -1
- package/src/partials/gallery-container.html +1 -1
- package/src/partials/get-started-container.html +5 -10
- package/src/partials/grid-container.html +1 -1
- package/src/partials/header-utilities-container.html +2 -2
- package/src/partials/html-lists-container.html +1 -1
- package/src/partials/info-container.html +1 -1
- package/src/partials/input-group-container.html +2 -4
- package/src/partials/item-lists-container.html +1 -1
- package/src/partials/kanban-container.html +2 -2
- package/src/partials/kbd-container.html +1 -1
- package/src/partials/leader-row-container.html +2 -2
- package/src/partials/login-container.html +2 -2
- package/src/partials/lunch-menu-container.html +2 -2
- package/src/partials/media-container.html +1 -1
- package/src/partials/meta-info-container.html +1 -1
- package/src/partials/modals-container.html +1 -1
- package/src/partials/page-header-container.html +1 -1
- package/src/partials/pagination-container.html +2 -2
- package/src/partials/palette-container.html +2 -2
- package/src/partials/panels-container.html +2 -2
- package/src/partials/parallax-container.html +1 -1
- package/src/partials/pricing-container.html +2 -2
- package/src/partials/progress-container.html +1 -1
- package/src/partials/prose-container.html +1 -1
- package/src/partials/ratings-container.html +1 -1
- package/src/partials/section-head-container.html +6 -3
- package/src/partials/segmented-container.html +1 -1
- package/src/partials/skeleton-container.html +1 -1
- package/src/partials/spinners-container.html +1 -1
- package/src/partials/stepper-container.html +1 -1
- package/src/partials/tables-container.html +1 -1
- package/src/partials/tabs-container.html +1 -1
- package/src/partials/tags-container.html +1 -7
- package/src/partials/testimonials-container.html +1 -1
- package/src/partials/tiles-container.html +1 -1
- package/src/partials/typography-container.html +1 -1
- package/src/partials/utilities-container.html +1 -1
- package/src/scss/base/_base.scss +21 -5
- package/src/scss/components/_blog-post.scss +15 -10
- package/src/scss/components/_button-bar.scss +10 -6
- package/src/scss/components/_code.scss +23 -34
- package/src/scss/components/_info.scss +8 -1
- package/src/scss/components/_kanban.scss +6 -6
- package/src/scss/components/_meta-info.scss +7 -6
- package/src/scss/components/_tables.scss +6 -4
- package/src/scss/components/_tiles.scss +20 -30
- package/src/scss/layout/_grid.scss +28 -0
- package/src/scss/layout/_header.scss +16 -9
- package/src/scss/layout/_home.scss +21 -2
- package/src/scss/layout/_main.scss +7 -7
- package/src/scss/layout/_page-header.scss +4 -4
- package/src/scss/layout/_section.scss +33 -10
- package/src/scss/main-lean.scss +16 -0
- package/src/scss/utilities/_index.scss +1 -0
- package/src/scss/utilities/_print.scss +107 -0
- package/src/scss/utilities/_touch-targets.scss +4 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Contact</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
The practical block at the end of a site - when we are open, how to reach us.
|
|
4
4
|
Only the second half is a component: <code>mw-contact</code> is an
|
|
5
5
|
<code><address></code> with its italics undone and a label column that
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Divider</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A rule between two things - horizontal or vertical, solid or dashed, in a
|
|
4
4
|
brand colour, or with a label sitting in the middle of it.
|
|
5
5
|
</p>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Dropdown</h3>
|
|
2
2
|
|
|
3
|
-
<p class="mw-text-muted mw-
|
|
3
|
+
<p class="mw-text-muted mw-text-measure">
|
|
4
4
|
Built on <code><details></code> and <code><summary></code> rather
|
|
5
5
|
than a <code>div</code> and a click handler. That buys the whole keyboard
|
|
6
6
|
contract for free: the trigger is focusable, Enter and Space toggle it, the
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Empty State</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
What a list shows when it holds nothing. An icon, a line saying what is
|
|
4
4
|
missing and, ideally, the action that fills it. The parts are
|
|
5
5
|
<code>-icon</code>, <code>-title</code> and <code>-desc</code>.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Form</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
The layout around the fields: a flex column with a single gap, so no field
|
|
4
4
|
needs a margin of its own. <code>mw-form</code> carries no padding, which is
|
|
5
5
|
what lets it sit straight inside a modal body or a panel.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Form Elements</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Every control the framework styles. They stay light in both themes on purpose,
|
|
4
4
|
and they share one height per size step - a field, a select and the button
|
|
5
5
|
beside them line up by construction.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Form Field Pattern</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Label, field, hint and error as one unit, so the spacing between them is not
|
|
4
4
|
re-invented per form. Written with Angular reactive forms in mind; the markup
|
|
5
5
|
is plain HTML.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Image Gallery</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A slider for photos: swipe, arrows, dots and a caption read off the slide
|
|
4
4
|
itself. The dots are real buttons, so the fourth picture is reachable without
|
|
5
5
|
a mouse.
|
|
@@ -412,17 +412,12 @@ import './assets/maverick-wave.min.css';</code></pre>
|
|
|
412
412
|
<a href="#documentation" class="mw-btn mw-btn-primary">
|
|
413
413
|
Explore Documentation
|
|
414
414
|
</a>
|
|
415
|
-
<
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
'https://github.com/m1well/maverick-wave',
|
|
420
|
-
'_blank',
|
|
421
|
-
'noopener'
|
|
422
|
-
)
|
|
423
|
-
"
|
|
415
|
+
<a
|
|
416
|
+
href="https://github.com/m1well/maverick-wave"
|
|
417
|
+
target="_blank"
|
|
418
|
+
rel="noopener noreferrer"
|
|
424
419
|
class="mw-btn mw-btn-outline"
|
|
425
420
|
>
|
|
426
421
|
<i class="fab fa-github"></i> GitHub Repository
|
|
427
|
-
</
|
|
422
|
+
</a>
|
|
428
423
|
</div>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Grid System</h3>
|
|
2
2
|
|
|
3
|
-
<p class="mw-text-muted
|
|
3
|
+
<p class="mw-text-muted">
|
|
4
4
|
MaverickWave CSS framework provides a simple grid system that adapts to
|
|
5
5
|
different screen sizes, making responsive layouts simple to implement. It also
|
|
6
6
|
has an advanced grid system with custom column spans. Perfect for complex
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Header Utilities</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
The controls that live in the bar itself rather than on the page: the theme
|
|
4
4
|
switch, the language switcher and the login button. All of them are real
|
|
5
5
|
buttons, so they are reachable by keyboard - the theme switch in particular is
|
|
6
6
|
the first thing someone with a light-sensitivity need goes looking for.
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
|
-
<div
|
|
9
|
+
<div>
|
|
10
10
|
<h3 class="mw-mb-2">Color Switcher (on a fake header here)</h3>
|
|
11
11
|
<p class="mw-text-muted">
|
|
12
12
|
This one is not clickable - the real switcher sits in the header at the top
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">HTML Lists</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
The plain <code>ul</code> and <code>ol</code> the framework styles, for prose.
|
|
4
4
|
Anything meant to be used rather than read - selectable rows, menus - belongs
|
|
5
5
|
in the item lists instead.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Info Badges & Counters</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A small solid marker for a status, a label or a count, down to a mini form
|
|
4
4
|
that fits inside a table cell. A tag names something; this one flags it.
|
|
5
5
|
</p>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Input Group</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A field with something welded to its edge - a unit, an icon, a button. Put the
|
|
4
4
|
size modifier on the group and it reaches the field inside, and the whole
|
|
5
5
|
group takes one focus ring rather than three.
|
|
@@ -131,9 +131,7 @@
|
|
|
131
131
|
<button
|
|
132
132
|
type="button"
|
|
133
133
|
class="mw-btn mw-btn-outline"
|
|
134
|
-
|
|
135
|
-
navigator.clipboard?.writeText('https://maverick-wave.m1well.com')
|
|
136
|
-
"
|
|
134
|
+
data-mw-copy=""
|
|
137
135
|
aria-label="Copy link"
|
|
138
136
|
>
|
|
139
137
|
<i class="fas fa-copy"></i>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Item Lists</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Rows that are meant to be used, not just read: selectable, clickable, with a
|
|
4
4
|
sliding accent or a checkbox. For a plain bulleted list use the HTML lists
|
|
5
5
|
above.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Kanban</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A board is a <code>mw-kanban</code> with one <code>mw-kanban-column</code> per
|
|
4
4
|
status, a ticket a plain <code>mw-card</code> with
|
|
5
5
|
<code>mw-kanban-card</code> on top. The priority is the regular
|
|
6
6
|
<code>mw-card-ribbon</code> and brings its colour along on its own.
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
|
-
<h4 class="mw-mb-2
|
|
9
|
+
<h4 class="mw-mb-2">Default Board</h4>
|
|
10
10
|
<div
|
|
11
11
|
class="mw-kanban"
|
|
12
12
|
data-kanban-prefix="MW"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Keyboard Keys</h3>
|
|
2
2
|
|
|
3
|
-
<p class="mw-text-muted mw-
|
|
3
|
+
<p class="mw-text-muted mw-text-measure">
|
|
4
4
|
Anything that tells someone which key to press should look like the key.
|
|
5
5
|
<code><kbd></code> is styled directly, so a shortcut in prose needs no
|
|
6
6
|
class at all; <code>mw-kbd</code> is there for a <code>span</code> when the
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Leader row</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A label, its value, and a dotted line connecting the two - the row a menu, a
|
|
4
4
|
table of contents and an invoice all draw. The line is generated by the row
|
|
5
5
|
itself, so the markup is two spans.
|
|
6
6
|
</p>
|
|
7
|
-
<p class="mw-text-muted mw-text-measure
|
|
7
|
+
<p class="mw-text-muted mw-text-measure">
|
|
8
8
|
Label and value is what <code><dl></code> is for, and since HTML 5.2 a
|
|
9
9
|
<code><div></code> may group a <code><dt></code> and its
|
|
10
10
|
<code><dd></code> inside one - so the semantic version costs no extra
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Login</h3>
|
|
2
2
|
|
|
3
|
-
<p class="mw-text-muted
|
|
3
|
+
<p class="mw-text-muted">
|
|
4
4
|
Click "Login" to simulate a failure and see the red border. It will
|
|
5
5
|
automatically clear after 4 seconds.
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
8
|
<div class="mw-mb-4">
|
|
9
|
-
<div class="mw-login mw-
|
|
9
|
+
<div class="mw-login mw-mb-8">
|
|
10
10
|
<div class="mw-login-logo">
|
|
11
11
|
<img
|
|
12
12
|
src="https://m1well.com/images/header_logo.svg"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Lunch menu</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Nothing below is a lunch-menu component. It is <code>mw-card</code>,
|
|
4
4
|
<code>mw-price</code>, <code>mw-date-stamp</code> and two grid classes - a
|
|
5
5
|
weekly menu is a composition, not a widget. One day per row: five columns
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
every row the height of the tallest, so a day with a second line of
|
|
9
9
|
description does not make its card taller than the rest of the week.
|
|
10
10
|
</p>
|
|
11
|
-
<p class="mw-text-muted mw-text-measure
|
|
11
|
+
<p class="mw-text-muted mw-text-measure">
|
|
12
12
|
<code>mw-date-stamp</code> answers to the card, not the viewport. On a narrow
|
|
13
13
|
card it is a muted line above the title; once the card is wide enough that a
|
|
14
14
|
single column would leave its right half empty - as every card in a stacked
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Media</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Self-hosted audio and video. The framework ships no player - the native
|
|
4
4
|
controls are the player, and <code>accent-color</code> already brands them.
|
|
5
5
|
The wrapper makes the element a full-width block; a <code>video</code> also
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Meta Info</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
The line of small facts that sits with a heading - author, date, reading time,
|
|
4
4
|
status. One wrapping row, with the separators drawn by CSS rather than typed
|
|
5
5
|
into the markup.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Simple Modals</h3>
|
|
2
|
-
<p class="mw-text-muted
|
|
2
|
+
<p class="mw-text-muted">
|
|
3
3
|
A <code><dialog></code> carrying the same <code>mw-modal</code> classes.
|
|
4
4
|
Escape, the focus trap, the inert page behind it and the body scroll lock come
|
|
5
5
|
from the element - only opening it needs a line of script. The older
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Page Header</h3>
|
|
2
2
|
|
|
3
|
-
<p class="mw-text-muted
|
|
3
|
+
<p class="mw-text-muted">
|
|
4
4
|
The start of a content page: title and subtitle on the left, actions on the
|
|
5
5
|
right, wrapping when it gets tight. The counterpart to
|
|
6
6
|
<code>mw-section-head</code>, which opens a section of a landing page rather
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Simple Pagination</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
The same frame as a calendar - an arrow on each side of the title, content
|
|
4
4
|
below - but the body is yours. Not a page-number list; the paging itself is
|
|
5
5
|
your job, <code>mw-pagination-loading</code> dims the body while the next page
|
|
6
6
|
is on its way.
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
|
-
<div class="mw-pagination mw-
|
|
9
|
+
<div class="mw-pagination mw-mb-6" id="weekPagination">
|
|
10
10
|
<div class="mw-pagination-header">
|
|
11
11
|
<button
|
|
12
12
|
type="button"
|
|
@@ -450,9 +450,9 @@
|
|
|
450
450
|
class="mw-select mw-select-sm"
|
|
451
451
|
data-variant-prop="--mw-section-padding-block"
|
|
452
452
|
>
|
|
453
|
-
<option value="
|
|
453
|
+
<option value="var(--mw-section-padding-compact)">Compact</option>
|
|
454
454
|
<option value="" selected>Default</option>
|
|
455
|
-
<option value="
|
|
455
|
+
<option value="var(--mw-section-padding-airy)">Airy</option>
|
|
456
456
|
<option value="var(--mw-section-padding-fluid)">
|
|
457
457
|
Fluid - grows with the screen
|
|
458
458
|
</option>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Panels</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A card whose header and footer are part of the frame rather than the content.
|
|
4
4
|
The body scrolls on its own, which is what the max-height variants are for.
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
|
-
<div class="mw-grid-1 mw-
|
|
7
|
+
<div class="mw-grid-1 mw-mb-6">
|
|
8
8
|
<div class="mw-panel">
|
|
9
9
|
<h4 class="mw-panel-header">Default Panel</h4>
|
|
10
10
|
<div class="mw-panel-body">
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Parallax</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Two ways to play a picture against the scroll, both on the browser's scroll
|
|
4
4
|
timeline - no listener, and no
|
|
5
5
|
<code>background-attachment: fixed</code>, which iOS ignores. The image lives
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Pricing</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Two pieces that are usually needed together: <code>mw-price</code>, the figure
|
|
4
4
|
on its own, and <code>mw-offer</code>, the card it is sold from. The price is
|
|
5
5
|
one baseline row - what it cost before, what it costs now, the unit, a
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<code>--mw-price-size</code>, so <code>mw-price-sm</code> and
|
|
8
8
|
<code>mw-price-lg</code> move the whole row at once.
|
|
9
9
|
</p>
|
|
10
|
-
<p class="mw-text-muted mw-text-measure
|
|
10
|
+
<p class="mw-text-muted mw-text-measure">
|
|
11
11
|
A struck-through price is a visual convention that a screen reader does not
|
|
12
12
|
pass on - <code><s></code> is announced by almost none of them. Where an
|
|
13
13
|
old and a new price stand next to each other, name them with
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Progress Bars</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A bar with an optional label and scale. The fill runs up from zero when it
|
|
4
4
|
scrolls into view, so the number gets read rather than just seen.
|
|
5
5
|
</p>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Prose</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Long-form running text - a legal page, terms, a plain article. One class on
|
|
4
4
|
the container, bare <code>h2</code>/<code>h3</code>/<code>p</code>/<code
|
|
5
5
|
>ul</code
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Ratings</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Change the <code>data-rating</code> attribute (0-5) to see how many thumbs-up
|
|
4
4
|
light up. You can also determine the icon flexibly.
|
|
5
5
|
</p>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Section Head</h3>
|
|
2
2
|
|
|
3
|
-
<p class="mw-text-muted
|
|
3
|
+
<p class="mw-text-muted">
|
|
4
4
|
The opening of a section: a hairline rule, a mark sitting on its left end, the
|
|
5
5
|
title, and the line that says what follows. Everything starts at one edge -
|
|
6
6
|
centred body copy moves its own left edge with every line break, so the eye
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<h2 class="mw-section-head-title">About me</h2>
|
|
38
38
|
<p class="mw-section-head-intro">
|
|
39
39
|
A section head without a lead works the same way - the next one below
|
|
40
|
-
shows it.
|
|
40
|
+
shows it, and takes a smaller gap to the content for it.
|
|
41
41
|
</p>
|
|
42
42
|
</div>
|
|
43
43
|
|
|
@@ -55,7 +55,10 @@
|
|
|
55
55
|
<code>-success</code>, <code>-warning</code>, <code>-danger</code> and
|
|
56
56
|
<code>-info</code>. Its length is
|
|
57
57
|
<code>--mw-section-head-mark-width</code> (80px), the gap to the content
|
|
58
|
-
below <code>--mw-section-head-gap</code>.
|
|
58
|
+
below <code>--mw-section-head-gap</code>. That gap and the space above the
|
|
59
|
+
title are multiples of <code>--mw-section-head-step</code>, which follows
|
|
60
|
+
<code>--mw-section-padding-block</code> - so the section spacing picker in
|
|
61
|
+
the palette panel moves the heads along with the page.
|
|
59
62
|
</p>
|
|
60
63
|
<div class="mw-card mw-card-simple">
|
|
61
64
|
<div class="mw-section-head mw-section-head-secondary">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Segmented Control</h3>
|
|
2
2
|
|
|
3
|
-
<p class="mw-text-muted
|
|
3
|
+
<p class="mw-text-muted">
|
|
4
4
|
Two or three positions of <em>one</em> switch - income or expense, offer or
|
|
5
5
|
quote. Deliberately not a <strong>mw-button-bar</strong>: that one stacks
|
|
6
6
|
below 576px and gives every button 96% width, which is right for a row of
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Skeleton Loader</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
The shape of the content before the content arrives. Match it to what is
|
|
4
4
|
actually loading - a skeleton in the wrong shape is worse than a spinner,
|
|
5
5
|
because the page then moves twice.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Loading Spinners</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Three shapes for the same job. Each one needs its shape class:
|
|
4
4
|
<code>mw-spinner-primary</code> on its own renders nothing at all.
|
|
5
5
|
</p>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Stepper</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A process with a known number of steps and a current one. Horizontal where
|
|
4
4
|
there is width for it, vertical where the labels need the room.
|
|
5
5
|
</p>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Tables</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
Rows for data that has columns. On a phone a wide table either scrolls inside
|
|
4
4
|
its own frame or turns each row into a card -
|
|
5
5
|
<code>mw-table-responsive</code> for the first,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Tabs</h3>
|
|
2
|
-
<p class="mw-text-muted
|
|
2
|
+
<p class="mw-text-muted">
|
|
3
3
|
A tab bar scrolls sideways when it runs out of room, and now it says so: a
|
|
4
4
|
shadow appears on whichever side still has tabs behind it, and disappears once
|
|
5
5
|
that end is reached. Four gradients, no scroll listener. The fade colour comes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Tags</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A label with a soft surface that names something - a topic, a state, a
|
|
4
4
|
category - and sits in a row of its own kind. For a count or a status marker
|
|
5
5
|
reach for a badge instead.
|
|
@@ -98,7 +98,6 @@
|
|
|
98
98
|
type="button"
|
|
99
99
|
class="mw-btn-mini mw-btn-mini-danger mw-tags-remove"
|
|
100
100
|
aria-label="Remove filter: active"
|
|
101
|
-
onclick="this.closest('.mw-tags-item').remove()"
|
|
102
101
|
>
|
|
103
102
|
<i class="fas fa-times"></i>
|
|
104
103
|
</button>
|
|
@@ -141,7 +140,6 @@
|
|
|
141
140
|
type="button"
|
|
142
141
|
class="mw-btn-mini mw-btn-mini-danger mw-tags-remove"
|
|
143
142
|
aria-label="Remove React"
|
|
144
|
-
onclick="this.closest('.mw-tags-item').remove()"
|
|
145
143
|
>
|
|
146
144
|
<i class="fas fa-times"></i>
|
|
147
145
|
</button>
|
|
@@ -152,7 +150,6 @@
|
|
|
152
150
|
type="button"
|
|
153
151
|
class="mw-btn-mini mw-btn-mini-danger mw-tags-remove"
|
|
154
152
|
aria-label="Remove Vue.js"
|
|
155
|
-
onclick="this.closest('.mw-tags-item').remove()"
|
|
156
153
|
>
|
|
157
154
|
<i class="fas fa-times"></i>
|
|
158
155
|
</button>
|
|
@@ -167,7 +164,6 @@
|
|
|
167
164
|
type="button"
|
|
168
165
|
class="mw-btn-mini mw-btn-mini-danger mw-tags-remove"
|
|
169
166
|
aria-label="Remove Online"
|
|
170
|
-
onclick="this.closest('.mw-tags-item').remove()"
|
|
171
167
|
>
|
|
172
168
|
<i class="fas fa-times"></i>
|
|
173
169
|
</button>
|
|
@@ -178,7 +174,6 @@
|
|
|
178
174
|
type="button"
|
|
179
175
|
class="mw-btn-mini mw-btn-mini-danger mw-tags-remove"
|
|
180
176
|
aria-label="Remove Available"
|
|
181
|
-
onclick="this.closest('.mw-tags-item').remove()"
|
|
182
177
|
>
|
|
183
178
|
<i class="fas fa-times"></i>
|
|
184
179
|
</button>
|
|
@@ -193,7 +188,6 @@
|
|
|
193
188
|
type="button"
|
|
194
189
|
class="mw-btn-mini mw-btn-mini-danger mw-tags-remove"
|
|
195
190
|
aria-label="Remove Filter: Architecture"
|
|
196
|
-
onclick="this.closest('.mw-tags-item').remove()"
|
|
197
191
|
>
|
|
198
192
|
<i class="fas fa-times"></i>
|
|
199
193
|
</button>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Testimonials</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
A quote card with its source - a <code>figure</code>, because quote and
|
|
4
4
|
attribution belong together. One voice may stand above the grid as
|
|
5
5
|
<code>mw-testimonial-featured</code>; the rest flow in
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Typography</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
The heading scale, the body text and everything the framework sets on bare
|
|
4
4
|
elements. Headings carry <code>text-wrap: balance</code> and a touch of
|
|
5
5
|
negative tracking, paragraphs <code>text-wrap: pretty</code>.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h3 class="mw-section-subtitle">Utilities</h3>
|
|
2
|
-
<p class="mw-text-muted mw-text-measure
|
|
2
|
+
<p class="mw-text-muted mw-text-measure">
|
|
3
3
|
The classes that do exactly one thing: spacing, flex, display, text,
|
|
4
4
|
elevation, aspect ratio. Worth checking before writing a rule of your own -
|
|
5
5
|
most one-off styles in an application turn out to be a utility that already
|
package/src/scss/base/_base.scss
CHANGED
|
@@ -152,17 +152,33 @@
|
|
|
152
152
|
calc(100% - 2 * var(--mw-container-gutter))
|
|
153
153
|
);
|
|
154
154
|
--mw-section-padding-block: #{spacing('10')};
|
|
155
|
-
// The
|
|
155
|
+
// The two presets, as tokens rather than the values themselves: a preset is
|
|
156
|
+
// picked by pointing `--mw-section-padding-block` at one, and that lands
|
|
157
|
+
// inline on the element, where a media query cannot reach it. Named here,
|
|
158
|
+
// the phone steps below apply to a preset as much as to the default - a
|
|
159
|
+
// compact page stays the tightest of the three at every width.
|
|
160
|
+
--mw-section-padding-compact: #{spacing('8')};
|
|
161
|
+
--mw-section-padding-airy: #{spacing('12')};
|
|
162
|
+
// The third regime beside the stepped default and the two stepped presets:
|
|
156
163
|
// spacing that grows with the screen. It starts at the value a phone already
|
|
157
164
|
// gets below `sm` and reaches the airy preset at `xl`, so a desktop pushes
|
|
158
165
|
// less content past per wheel notch while the phone carries none of that air.
|
|
159
|
-
//
|
|
160
|
-
// like the presets are, not the default.
|
|
166
|
+
// Needs no steps of its own - the ramp is the steps.
|
|
161
167
|
--mw-section-padding-fluid: #{fluid(spacing('7'), spacing('12'), $to: 'xl')};
|
|
162
168
|
// The section head: the gap it leaves to the content below, the space
|
|
163
169
|
// between its rule and the title, and the mark sitting on that rule.
|
|
164
|
-
|
|
165
|
-
|
|
170
|
+
//
|
|
171
|
+
// One step, and every measure in a head is a multiple of it. It follows the
|
|
172
|
+
// section rhythm, so the spacing switch moves the heads with it and the
|
|
173
|
+
// fluid preset needs no ramp of its own - at a fraction of the swing,
|
|
174
|
+
// because a head is a boundary inside the page and would otherwise grow
|
|
175
|
+
// past the section it opens. The multipliers land on today's values at the
|
|
176
|
+
// default rhythm.
|
|
177
|
+
--mw-section-head-step: calc(
|
|
178
|
+
#{spacing('4')} + var(--mw-section-padding-block) * 0.18
|
|
179
|
+
);
|
|
180
|
+
--mw-section-head-gap: calc(var(--mw-section-head-step) * 1.86);
|
|
181
|
+
--mw-section-head-pad: var(--mw-section-head-step);
|
|
166
182
|
--mw-section-head-mark-width: 80px;
|
|
167
183
|
--mw-section-head-mark-color: var(--mw-primary-color);
|
|
168
184
|
--mw-scroll-hint-offset: #{spacing('9')};
|
|
@@ -98,17 +98,20 @@
|
|
|
98
98
|
&-meta {
|
|
99
99
|
display: flex;
|
|
100
100
|
flex-wrap: wrap;
|
|
101
|
-
|
|
101
|
+
flex-direction: column;
|
|
102
|
+
align-items: start;
|
|
103
|
+
gap: spacing('2');
|
|
104
|
+
margin-top: spacing('5');
|
|
102
105
|
margin-bottom: spacing('6');
|
|
103
106
|
font-size: font-size('sm');
|
|
104
107
|
color: var(--mw-text-muted-color);
|
|
105
|
-
row-gap: spacing('1');
|
|
106
108
|
|
|
107
|
-
@include media-
|
|
108
|
-
flex-direction:
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
@include media-up('sm') {
|
|
110
|
+
flex-direction: row;
|
|
111
|
+
align-items: center;
|
|
112
|
+
column-gap: normal;
|
|
113
|
+
row-gap: spacing('1');
|
|
114
|
+
margin-top: spacing('0');
|
|
112
115
|
}
|
|
113
116
|
|
|
114
117
|
&-item {
|
|
@@ -262,12 +265,14 @@
|
|
|
262
265
|
padding-top: spacing('4');
|
|
263
266
|
border-top: 1px solid var(--mw-secondary-text-color);
|
|
264
267
|
display: flex;
|
|
268
|
+
flex-direction: column;
|
|
269
|
+
gap: spacing('2');
|
|
265
270
|
justify-content: space-between;
|
|
266
271
|
align-items: center;
|
|
267
272
|
|
|
268
|
-
@include media-
|
|
269
|
-
flex-direction:
|
|
270
|
-
gap:
|
|
273
|
+
@include media-up('sm') {
|
|
274
|
+
flex-direction: row;
|
|
275
|
+
gap: normal;
|
|
271
276
|
}
|
|
272
277
|
|
|
273
278
|
&-button {
|