maverick-wave 5.25.0 → 5.27.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 (81) hide show
  1. package/.claude/skills/mw-maverick-wave/SKILL.md +9 -1
  2. package/.claude/skills/mw-maverick-wave/references/components.md +13 -6
  3. package/.claude/skills/mw-maverick-wave/references/layout.md +18 -12
  4. package/.claude/skills/mw-maverick-wave/references/theming.md +15 -10
  5. package/CHANGELOG.md +12 -0
  6. package/README.md +2 -2
  7. package/maverick-wave.min.css +8 -6
  8. package/package.json +2 -2
  9. package/scripts/verify.js +10 -1
  10. package/src/partials/accordions-container.html +1 -1
  11. package/src/partials/alerts-container.html +1 -1
  12. package/src/partials/announcement-container.html +1 -1
  13. package/src/partials/avatars-container.html +1 -1
  14. package/src/partials/badges-container.html +1 -1
  15. package/src/partials/blog-posts-container.html +2 -2
  16. package/src/partials/breadcrumbs-container.html +1 -1
  17. package/src/partials/button-bar-container.html +1 -1
  18. package/src/partials/buttons-container.html +1 -1
  19. package/src/partials/calendar-container.html +1 -1
  20. package/src/partials/cards-container.html +1 -1
  21. package/src/partials/code-container.html +1 -1
  22. package/src/partials/colors-container.html +3 -3
  23. package/src/partials/coming-soon-container.html +1 -1
  24. package/src/partials/contact-container.html +1 -1
  25. package/src/partials/divider-container.html +1 -1
  26. package/src/partials/dropdown-container.html +1 -1
  27. package/src/partials/empty-state-container.html +1 -1
  28. package/src/partials/form-container.html +1 -1
  29. package/src/partials/form-elements-container.html +1 -1
  30. package/src/partials/form-field-container.html +1 -1
  31. package/src/partials/gallery-container.html +1 -1
  32. package/src/partials/grid-container.html +1 -1
  33. package/src/partials/header-utilities-container.html +2 -2
  34. package/src/partials/html-lists-container.html +1 -1
  35. package/src/partials/info-container.html +1 -1
  36. package/src/partials/input-group-container.html +1 -1
  37. package/src/partials/item-lists-container.html +1 -1
  38. package/src/partials/kanban-container.html +2 -2
  39. package/src/partials/kbd-container.html +1 -1
  40. package/src/partials/leader-row-container.html +2 -2
  41. package/src/partials/login-container.html +2 -2
  42. package/src/partials/lunch-menu-container.html +2 -2
  43. package/src/partials/media-container.html +1 -1
  44. package/src/partials/meta-info-container.html +1 -1
  45. package/src/partials/modals-container.html +1 -1
  46. package/src/partials/page-header-container.html +1 -1
  47. package/src/partials/pagination-container.html +2 -2
  48. package/src/partials/palette-container.html +2 -2
  49. package/src/partials/panels-container.html +2 -2
  50. package/src/partials/parallax-container.html +1 -1
  51. package/src/partials/pricing-container.html +2 -2
  52. package/src/partials/progress-container.html +1 -1
  53. package/src/partials/prose-container.html +1 -1
  54. package/src/partials/ratings-container.html +1 -1
  55. package/src/partials/section-head-container.html +6 -3
  56. package/src/partials/segmented-container.html +1 -1
  57. package/src/partials/skeleton-container.html +1 -1
  58. package/src/partials/spinners-container.html +1 -1
  59. package/src/partials/stepper-container.html +1 -1
  60. package/src/partials/tables-container.html +1 -1
  61. package/src/partials/tabs-container.html +1 -1
  62. package/src/partials/tags-container.html +1 -1
  63. package/src/partials/testimonials-container.html +1 -1
  64. package/src/partials/tiles-container.html +39 -39
  65. package/src/partials/typography-container.html +1 -1
  66. package/src/partials/utilities-container.html +1 -1
  67. package/src/scss/base/_base.scss +37 -11
  68. package/src/scss/base/_reset.scss +7 -1
  69. package/src/scss/components/_announcement.scss +1 -3
  70. package/src/scss/components/_blog-post.scss +5 -4
  71. package/src/scss/components/_cards.scss +2 -2
  72. package/src/scss/components/_contact.scss +5 -3
  73. package/src/scss/components/_localhost-indicator.scss +2 -2
  74. package/src/scss/components/_panels.scss +18 -52
  75. package/src/scss/components/_tabs.scss +2 -2
  76. package/src/scss/components/_tiles.scss +43 -49
  77. package/src/scss/layout/_grid.scss +22 -0
  78. package/src/scss/layout/_header.scss +0 -11
  79. package/src/scss/layout/_home.scss +2 -2
  80. package/src/scss/layout/_section.scss +45 -13
  81. package/src/scss/utilities/_touch-targets.scss +4 -0
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "maverick-wave",
3
- "version": "5.25.0",
3
+ "version": "5.27.0",
4
4
  "config": {
5
- "version_short": "5.25"
5
+ "version_short": "5.27"
6
6
  },
7
7
  "description": "A lightweight, modern CSS framework for building responsive websites with elegance and speed.",
8
8
  "main": "src/js/main.js",
package/scripts/verify.js CHANGED
@@ -109,6 +109,10 @@ for (const t of [...tokensDefined].sort()) {
109
109
 
110
110
  const classesInCss = new Set(all(css, /\.(mw-[a-z0-9-]+)/g));
111
111
 
112
+ // Keyframes carry the same prefix and get named in the docs, but they are not
113
+ // classes - and one the docs name without the CSS having it still has to fail.
114
+ const keyframesInCss = new Set(all(css, /@keyframes\s+(mw-[a-z0-9-]+)/g));
115
+
112
116
  // Classes the JS adds at runtime, or queries as a hook, count as legitimate
113
117
  // targets - including selector strings like '.mw-foo' and '[class~="mw-foo"]'
114
118
  const classesInJs = new Set(all(js, /\.?(mw-[a-z0-9-]+)/g));
@@ -130,7 +134,12 @@ for (const c of all(docs, /[`."'\s](mw-[a-z0-9-]+)/g)) {
130
134
  }
131
135
 
132
136
  for (const [c, where] of [...classesInMarkup].sort()) {
133
- if (classesInCss.has(c) || classesInJs.has(c) || CLASS_ALLOWLIST.has(c)) {
137
+ if (
138
+ classesInCss.has(c) ||
139
+ classesInJs.has(c) ||
140
+ keyframesInCss.has(c) ||
141
+ CLASS_ALLOWLIST.has(c)
142
+ ) {
134
143
  continue;
135
144
  }
136
145
  errors.push(`class used in ${where} but not generated by the CSS: .${c}`);
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Accordions</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  Only as much content open as anyone needs at once. The header is the control
4
4
  and the panel follows it in the DOM, which is what lets the whole thing run
5
5
  off two state classes and no wrapper element.
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Alerts System</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  A message that belongs to the page it sits on. The colour carries the severity
4
4
  and the left rule repeats it, so the meaning survives where the tint does not.
5
5
  The same markup inside a <code>mw-toast-stack</code> becomes a toast.
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Announcement</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  The ribbon glued under the fixed header - a discount, a launch note, a
4
4
  maintenance window. Shown here with <code>mw-announcement-static</code>, so
5
5
  the demos sit in the flow instead of over this page. Without it the ribbon
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Avatars</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  A picture or a pair of initials, in five sizes. The colour variants sit on the
4
4
  border, so they still read over a photo; on an initials avatar they fill the
5
5
  circle as well. Inside a group the overlap follows the avatar size.
@@ -1,6 +1,6 @@
1
1
  <h3 class="mw-section-subtitle">Badges</h3>
2
2
 
3
- <p class="mw-text-muted mw-mb-6 mw-text-measure">
3
+ <p class="mw-text-muted mw-text-measure">
4
4
  A badge is not a tag. A tag names something and sits in a row of its own kind;
5
5
  a badge carries a count or a status and usually sits <em>on</em> something -
6
6
  the number on a bell, the dot on an avatar. That is why it fills its colour
@@ -1,11 +1,11 @@
1
1
  <h3 class="mw-section-subtitle">Blog Posts</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  A long-form article rather than a card: title, meta line, body and the way
4
4
  back out. The gradient rule down the left edge is what makes it read as a page
5
5
  instead of a panel.
6
6
  </p>
7
7
 
8
- <div class="mw-blog-post mw-mt-9">
8
+ <div class="mw-blog-post">
9
9
  <h2 class="mw-blog-post-title">
10
10
  Just a dummy blog post (markdown generated)
11
11
  </h2>
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Breadcrumbs</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  Modern skewed navigation breadcrumbs with overlapping design.
4
4
  </p>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Button Bars</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  A framed row of actions. Below 576px it stacks and every button takes the full
4
4
  width. The colour variants style whatever is inside them, so a bar of five
5
5
  buttons needs one class rather than five.
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Buttons</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  Three emphasis levels: primary fills, outline draws a line, ghost does neither
4
4
  until you point at it. Every variant dips a pixel when pressed - on touch that
5
5
  press is the only feedback there is.
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Calendar</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  Month, compact and week share every class - a week is seven cells instead of
4
4
  forty-two, <code>mw-calendar-compact</code> drops the dots and a third of the
5
5
  height. The status dots come in as
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Cards</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  The framework's main container: a surface, padding, an optional image, a
4
4
  header and a footer. The add-ons - badge, ribbon, title icon - all take their
5
5
  colour from one <code>mw-card-addon-*</code> class on the card itself.
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Code</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  Inline code gets a surface of its own so it reads as a quoted thing; blocks
4
4
  get a filename bar and a terminal variant. The syntax colours are a fixed pair
5
5
  of themes rather than brand tokens - code is easier to read in the colours an
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- the hex code string is getting updated via javascript! -->
4
4
 
5
- <p class="mw-text-muted mw-text-measure mw-mb-6">
5
+ <p class="mw-text-muted mw-text-measure">
6
6
  These thirteen are the only colors you ever set. Everything else - hover
7
7
  tones, translucent backgrounds, borders, muted text, the card and footer
8
8
  surfaces, the ink variant the dark theme needs - is derived from them at
@@ -152,7 +152,7 @@
152
152
 
153
153
  <h3 class="mw-section-subtitle">Fill or Ink</h3>
154
154
 
155
- <p class="mw-text-muted mw-mb-6">
155
+ <p class="mw-text-muted">
156
156
  Every brand and status colour comes in two tokens.
157
157
  <code>--mw-primary-color</code> is the exact colour, for anything it
158
158
  <strong>fills</strong> - buttons, badges, bars - with
@@ -193,7 +193,7 @@
193
193
 
194
194
  <h3 class="mw-section-subtitle">Label Ink Per Colour</h3>
195
195
 
196
- <p class="mw-text-muted mw-mb-6">
196
+ <p class="mw-text-muted">
197
197
  <code>--mw-accent-text-color</code> is the label on every solid coloured
198
198
  surface, and one value for all six only holds while the whole palette sits on
199
199
  the same side of the lightness scale. A neon green primary next to a deep blue
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Coming Soon Banner</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  A placeholder for a section that is not built yet. Loud on purpose: the whole
4
4
  point is that nobody ships it by accident.
5
5
  </p>
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Contact</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
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>&lt;address&gt;</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 mw-mb-6">
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-mb-6 mw-text-measure">
3
+ <p class="mw-text-muted mw-text-measure">
4
4
  Built on <code>&lt;details&gt;</code> and <code>&lt;summary&gt;</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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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.
@@ -1,6 +1,6 @@
1
1
  <h3 class="mw-section-subtitle">Grid System</h3>
2
2
 
3
- <p class="mw-text-muted mw-mb-4">
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 mw-mb-6">
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 class="mw-mt-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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.
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Item Lists</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
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 mw-mb-6">
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 mw-mt-8">Default Board</h4>
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-mb-6 mw-text-measure">
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>&lt;kbd&gt;</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 mw-mb-6">
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 mw-mb-6">
7
+ <p class="mw-text-muted mw-text-measure">
8
8
  Label and value is what <code>&lt;dl&gt;</code> is for, and since HTML 5.2 a
9
9
  <code>&lt;div&gt;</code> may group a <code>&lt;dt&gt;</code> and its
10
10
  <code>&lt;dd&gt;</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 mw-my-0">
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-my-8">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
2
+ <p class="mw-text-muted">
3
3
  A <code>&lt;dialog&gt;</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 mw-mb-6">
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 mw-mb-6">
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-my-6" id="weekPagination">
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="2rem">Compact</option>
453
+ <option value="var(--mw-section-padding-compact)">Compact</option>
454
454
  <option value="" selected>Default</option>
455
- <option value="5.5rem">Airy</option>
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 mw-mb-6">
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-my-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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>&lt;s&gt;</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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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 mw-mb-6">
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.
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Testimonials</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
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