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.
Files changed (90) hide show
  1. package/.claude/skills/mw-maverick-wave/SKILL.md +32 -5
  2. package/.claude/skills/mw-maverick-wave/references/components.md +4 -0
  3. package/.claude/skills/mw-maverick-wave/references/javascript.md +44 -8
  4. package/.claude/skills/mw-maverick-wave/references/layout.md +39 -11
  5. package/.claude/skills/mw-maverick-wave/references/theming.md +34 -10
  6. package/CHANGELOG.md +20 -0
  7. package/CLAUDE.md +4 -0
  8. package/README.md +4 -2
  9. package/index.html +13 -0
  10. package/maverick-wave.min.css +7 -5
  11. package/maverick-wave.min.js +1 -1
  12. package/package.json +2 -2
  13. package/src/js/main.js +149 -57
  14. package/src/partials/accordions-container.html +1 -1
  15. package/src/partials/alerts-container.html +1 -1
  16. package/src/partials/announcement-container.html +1 -1
  17. package/src/partials/avatars-container.html +1 -1
  18. package/src/partials/badges-container.html +1 -1
  19. package/src/partials/blog-posts-container.html +2 -2
  20. package/src/partials/breadcrumbs-container.html +1 -1
  21. package/src/partials/button-bar-container.html +1 -1
  22. package/src/partials/buttons-container.html +1 -1
  23. package/src/partials/calendar-container.html +1 -1
  24. package/src/partials/cards-container.html +1 -1
  25. package/src/partials/code-container.html +1 -1
  26. package/src/partials/colors-container.html +3 -3
  27. package/src/partials/coming-soon-container.html +1 -1
  28. package/src/partials/contact-container.html +1 -1
  29. package/src/partials/divider-container.html +1 -1
  30. package/src/partials/dropdown-container.html +1 -1
  31. package/src/partials/empty-state-container.html +1 -1
  32. package/src/partials/form-container.html +1 -1
  33. package/src/partials/form-elements-container.html +1 -1
  34. package/src/partials/form-field-container.html +1 -1
  35. package/src/partials/gallery-container.html +1 -1
  36. package/src/partials/get-started-container.html +5 -10
  37. package/src/partials/grid-container.html +1 -1
  38. package/src/partials/header-utilities-container.html +2 -2
  39. package/src/partials/html-lists-container.html +1 -1
  40. package/src/partials/info-container.html +1 -1
  41. package/src/partials/input-group-container.html +2 -4
  42. package/src/partials/item-lists-container.html +1 -1
  43. package/src/partials/kanban-container.html +2 -2
  44. package/src/partials/kbd-container.html +1 -1
  45. package/src/partials/leader-row-container.html +2 -2
  46. package/src/partials/login-container.html +2 -2
  47. package/src/partials/lunch-menu-container.html +2 -2
  48. package/src/partials/media-container.html +1 -1
  49. package/src/partials/meta-info-container.html +1 -1
  50. package/src/partials/modals-container.html +1 -1
  51. package/src/partials/page-header-container.html +1 -1
  52. package/src/partials/pagination-container.html +2 -2
  53. package/src/partials/palette-container.html +2 -2
  54. package/src/partials/panels-container.html +2 -2
  55. package/src/partials/parallax-container.html +1 -1
  56. package/src/partials/pricing-container.html +2 -2
  57. package/src/partials/progress-container.html +1 -1
  58. package/src/partials/prose-container.html +1 -1
  59. package/src/partials/ratings-container.html +1 -1
  60. package/src/partials/section-head-container.html +6 -3
  61. package/src/partials/segmented-container.html +1 -1
  62. package/src/partials/skeleton-container.html +1 -1
  63. package/src/partials/spinners-container.html +1 -1
  64. package/src/partials/stepper-container.html +1 -1
  65. package/src/partials/tables-container.html +1 -1
  66. package/src/partials/tabs-container.html +1 -1
  67. package/src/partials/tags-container.html +1 -7
  68. package/src/partials/testimonials-container.html +1 -1
  69. package/src/partials/tiles-container.html +1 -1
  70. package/src/partials/typography-container.html +1 -1
  71. package/src/partials/utilities-container.html +1 -1
  72. package/src/scss/base/_base.scss +21 -5
  73. package/src/scss/components/_blog-post.scss +15 -10
  74. package/src/scss/components/_button-bar.scss +10 -6
  75. package/src/scss/components/_code.scss +23 -34
  76. package/src/scss/components/_info.scss +8 -1
  77. package/src/scss/components/_kanban.scss +6 -6
  78. package/src/scss/components/_meta-info.scss +7 -6
  79. package/src/scss/components/_tables.scss +6 -4
  80. package/src/scss/components/_tiles.scss +20 -30
  81. package/src/scss/layout/_grid.scss +28 -0
  82. package/src/scss/layout/_header.scss +16 -9
  83. package/src/scss/layout/_home.scss +21 -2
  84. package/src/scss/layout/_main.scss +7 -7
  85. package/src/scss/layout/_page-header.scss +4 -4
  86. package/src/scss/layout/_section.scss +33 -10
  87. package/src/scss/main-lean.scss +16 -0
  88. package/src/scss/utilities/_index.scss +1 -0
  89. package/src/scss/utilities/_print.scss +107 -0
  90. 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 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.
@@ -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
- <button
416
- type="button"
417
- onclick="
418
- window.open(
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
- </button>
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 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.
@@ -131,9 +131,7 @@
131
131
  <button
132
132
  type="button"
133
133
  class="mw-btn mw-btn-outline"
134
- onclick="
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 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.
@@ -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 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
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Tiles</h3>
2
- <p class="mw-text-muted mw-text-measure mw-mb-6">
2
+ <p class="mw-text-muted mw-text-measure">
3
3
  Here you can create clickable tiles with header, information and a possible
4
4
  image.
5
5
  </p>
@@ -1,5 +1,5 @@
1
1
  <h3 class="mw-section-subtitle">Typography</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 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 mw-mb-6">
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
@@ -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 third regime beside the stepped default and the two flat presets:
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
- // Point `--mw-section-padding-block` at it to switch a page over - a choice
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
- --mw-section-head-gap: #{spacing('10')};
165
- --mw-section-head-pad: #{spacing('6')};
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
- align-items: center;
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-down('sm') {
108
- flex-direction: column;
109
- gap: spacing('2');
110
- margin-top: spacing('5');
111
- align-items: start;
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-down('sm') {
269
- flex-direction: column;
270
- gap: spacing('2');
273
+ @include media-up('sm') {
274
+ flex-direction: row;
275
+ gap: normal;
271
276
  }
272
277
 
273
278
  &-button {