maverick-wave 5.22.0 → 5.23.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.
@@ -232,6 +232,8 @@ none of them survive into the compiled CSS. Full list in `references/theming.md`
232
232
  end a key of `$font-sizes` or a plain rem/px length. The rem term is the
233
233
  point: a vw-only clamp ignores the reader's font size and stops responding to
234
234
  zoom. A headline passes `$to: 'xl'`.
235
+ - `fluid-container($min, $max, $from, $to)` - the same ramp in `cqi` against the
236
+ container. Use it instead of `fluid()` inside a `@container` block.
235
237
  - `media-up($bp)` / `media-down($bp)` - the breakpoint map as a query.
236
238
  - `touch-context($bp: 'md')` - coarse pointer _or_ narrow viewport, the condition
237
239
  every target-size rule in the framework hangs under.
@@ -255,10 +257,13 @@ Everything below is documented in `references/components.md` unless marked other
255
257
  **Containers** `mw-card` (+ `simple`, `lg`, `xl`, `stack`, badge, ribbon,
256
258
  feature frame) ·
257
259
  `mw-panel` · `mw-tile` · `mw-accordion` · `mw-tabs` · `mw-modal` ·
258
- `mw-item-list` family · `mw-offer` (+ `-head`, `-name`)
260
+ `mw-item-list` family · `mw-offer` (+ `-head`, `-name`) ·
261
+ `mw-leader-row` (+ `-label`, `-value`, `-top`, `-dashed`, `-solid`) ·
262
+ `mw-date-stamp` (+ `-day`, `-date`, `-body`, `-today`) ·
263
+ `mw-contact` (+ `-row`, `-label`)
259
264
 
260
265
  **Pricing** `mw-price` (+ `-amount`, `-fraction`, `-currency`, `-original`,
261
- `-period`, `-word`, `-note`, `sm`/`lg`, `inline`, `center`, `plain`)
266
+ `-period`, `-word`, `-note`, `xs`/`sm`/`lg`, `inline`, `center`, `plain`)
262
267
 
263
268
  **Data & status** `mw-table` (+ `subtle`, `sticky-head`, `cards`, `compact`,
264
269
  `hover`, responsive wrappers) · `mw-kanban` (+ `plain`, `compact`) ·
@@ -290,8 +295,10 @@ feature frame) ·
290
295
  `mw-input-group` · `mw-prefilled` · `mw-form` / `mw-form-group` /
291
296
  `mw-form-actions` · `mw-login`
292
297
 
293
- **Layout** (`references/layout.md`) `mw-main` · `mw-container` · `mw-content` ·
294
- `mw-section` (+ `mw-section-intro`) · `mw-page-header` · `mw-grid-*` ·
298
+ **Layout** (`references/layout.md`) `mw-main` · `mw-container` (+ `-narrow`) ·
299
+ `mw-content` ·
300
+ `mw-section` (+ `mw-section-intro`) · `mw-page-header` · `mw-grid-*`
301
+ (+ `mw-grid-even`) ·
295
302
  `mw-columns-2/3` · `mw-row-split` · `mw-hero` (+ `mw-scroll-hint`, `-end`) ·
296
303
  `mw-parallax` (+ `-media`, `-content`, `-dimmed`, `-sticky`, `-rise`,
297
304
  `-slow`, `-pattern`) · `mw-footer`
@@ -336,9 +336,9 @@ tag:
336
336
  ```
337
337
 
338
338
  - Everything in the row is sized in `em` off `--mw-price-size`, so
339
- `mw-price-sm` (1.5rem) and `mw-price-lg` (3rem) move the whole row at once -
340
- cents, unit and struck original included. Set the token yourself for any other
341
- size.
339
+ `mw-price-xs` (1.3rem), `mw-price-sm` (1.5rem) and `mw-price-lg` (3rem) move
340
+ the whole row at once - cents, unit and struck original included. Set the
341
+ token yourself for any other size.
342
342
  - `mw-price-original` is muted **and** struck, and it takes its own line
343
343
  **above** the new price. Muted alone reads as a footnote; the line is what
344
344
  says this is no longer the price. The rule is drawn explicitly, because the
@@ -351,8 +351,8 @@ tag:
351
351
  baseline, not raised to the cap height - raised cents are a discounter's idiom
352
352
  and make a service price read cheaper than it is.
353
353
  - `mw-price-currency` and `mw-price-period` stop shrinking at 0.8rem, and
354
- `mw-price-original` at 0.9rem. Below `mw-price-sm` the `em` chain would put
355
- them under 12px, and that is the size most offer cards run at.
354
+ `mw-price-original` at 0.9rem. At `mw-price-xs` the `em` chain would put them
355
+ under 10px, which is where the floor earns its keep.
356
356
  - `mw-price-word` for "On request" or "Free" - bold, so it holds the same slot in
357
357
  a row of cards, but set well below a figure. Its line box is scaled back up to
358
358
  the amount's, so a word and a number in neighbouring cards land on one line.
@@ -361,12 +361,12 @@ tag:
361
361
  - A `mw-tag` or `mw-badge` placed directly in the row is centred against the
362
362
  digits rather than hung off their baseline.
363
363
 
364
- | Class | What it does |
365
- | ----------------- | ---------------------------------------------- |
366
- | `mw-price-sm/lg` | Retunes `--mw-price-size`, everything follows |
367
- | `mw-price-inline` | Old price in front of the new one, on one line |
368
- | `mw-price-center` | Centres the row |
369
- | `mw-price-plain` | Body colour instead of the brand |
364
+ | Class | What it does |
365
+ | ------------------- | ---------------------------------------------- |
366
+ | `mw-price-xs/sm/lg` | Retunes `--mw-price-size`, everything follows |
367
+ | `mw-price-inline` | Old price in front of the new one, on one line |
368
+ | `mw-price-center` | Centres the row |
369
+ | `mw-price-plain` | Body colour instead of the brand |
370
370
 
371
371
  A struck-through price is a visual convention a screen reader does not pass on -
372
372
  `<s>` is announced by almost none of them. Wherever an old and a new price stand
@@ -1473,6 +1473,81 @@ deprecated). Any card fits into the content wrapper.
1473
1473
  across it. Nothing to switch on. It is skipped on `mw-avatar-initials`, on
1474
1474
  touch, under `prefers-reduced-motion` and under `mw-hover-static`.
1475
1475
 
1476
+ ## Date stamp
1477
+
1478
+ The date on a dated card - an event, a changelog entry, a day on a menu. It
1479
+ answers to the **card**, not the viewport: narrow, it is a muted line above the
1480
+ title; once the card is wide enough that a single column would leave its right
1481
+ half empty, the same markup becomes a column on the left.
1482
+
1483
+ ```html
1484
+ <article class="mw-card mw-offer">
1485
+ <div class="mw-card-body">
1486
+ <p class="mw-date-stamp mw-date-stamp-today">
1487
+ <span class="mw-date-stamp-day">Fri</span>
1488
+ <span class="mw-date-stamp-date">18.09.</span>
1489
+ </p>
1490
+ <div class="mw-date-stamp-body">
1491
+ <h4 class="mw-text-base mw-text-bold mw-mb-2">Baked fish fillet</h4>
1492
+ <p class="mw-text-sm mw-text-muted mw-mb-0">In beer batter.</p>
1493
+ </div>
1494
+ <p class="mw-price mw-price-xs">
1495
+ <span class="mw-price-amount">11.90</span>
1496
+ <span class="mw-price-currency">Euro</span>
1497
+ </p>
1498
+ </div>
1499
+ </article>
1500
+ ```
1501
+
1502
+ - `mw-date-stamp-body` wraps everything that is not the stamp or the price. It
1503
+ is `display: contents` on a narrow card, so the body still sees the title and
1504
+ the price as its own children - which is what `mw-offer` selects on. On a wide
1505
+ card it becomes the middle column.
1506
+ - The price is a **sibling** of the wrapper, not inside it. Give the card one
1507
+ and it gets a third column at the right edge; leave it out and the card is two
1508
+ columns. With more than one dish per card, put the price on a
1509
+ `mw-leader-row` with the dish instead - an empty third track would still
1510
+ charge the card a gap.
1511
+ - Write the day as `Fri`, not `FRI` - the uppercase is `text-transform`, so a
1512
+ screen reader still reads a word rather than three letters.
1513
+ - Day column width, day font size, the column gap and the card's block padding
1514
+ all ramp with the **card**, from 420px to 900px wide, via
1515
+ `fluid-container()`. A narrow card in a wide window gets narrow-card sizing -
1516
+ which is the point of putting the switch in a container query at all.
1517
+ - `mw-date-stamp-today` drops the muting for a **fill**: on a wide card it spans
1518
+ the full card height, rounded to the card's own left corners and cut square
1519
+ against the content. A text colour would compete with the price, which is
1520
+ already the brand colour.
1521
+ - Cards in a stack want `mw-grid-even` next to `mw-grid-1`, or the card with the
1522
+ longer description ends up taller than the rest of the week.
1523
+
1524
+ ## Contact
1525
+
1526
+ How to reach someone - postal address, phone, mail. It belongs on an
1527
+ `<address>`, and undoing that element's italics is most of what the component
1528
+ does; the rest is a label column wide enough that the values line up.
1529
+
1530
+ ```html
1531
+ <address class="mw-contact">
1532
+ <p class="mw-text-bold">Gasthaus Lamm</p>
1533
+ <p>Marktplatz 3<br />72622 Musterhausen</p>
1534
+ <p class="mw-contact-row">
1535
+ <span class="mw-contact-label">Phone</span>
1536
+ <a class="mw-link" href="tel:+497123456789">07123 456789</a>
1537
+ </p>
1538
+ </address>
1539
+ ```
1540
+
1541
+ - `<address>` is for the contact details of its nearest `<article>` or of the
1542
+ page - not for any postal address that happens to be on it.
1543
+ - The label column is 5rem and fixed. An auto column is as wide as its own word,
1544
+ so "Phone" and "Email" would start their values in different places.
1545
+ - Wrap phone and mail in `tel:` and `mailto:` links and mark them `mw-link` -
1546
+ in a block of plain lines an unstyled link reads as text.
1547
+ - Opening hours are **not** part of this. A day, its times and a line between
1548
+ them is a `mw-leader-row` in a `<dl>`, one row per day, and a note for the
1549
+ rest.
1550
+
1476
1551
  ## Item lists
1477
1552
 
1478
1553
  Layout containers for arbitrary children - the children need no classes.
@@ -1533,6 +1608,43 @@ rest, see `references/forms.md`) work here too. Row height is a list concern -
1533
1608
  use the list's own `-compact` / `-large` modifiers rather than
1534
1609
  `mw-checkbox-sm` / `-lg`, which sit on the wrong element to reach the box.
1535
1610
 
1611
+ ## Leader row
1612
+
1613
+ A label on the left, its value on the right, a dotted line bridging the gap -
1614
+ the row a menu, a table of contents and an invoice all draw. The markup is two
1615
+ spans; the line is the row's own `::before`, so it stays out of the
1616
+ accessibility tree and no filler element needs `aria-hidden`.
1617
+
1618
+ ```html
1619
+ <p class="mw-leader-row mw-leader-row-top">
1620
+ <span class="mw-leader-row-label mw-text-bold">Roast pork with dumpling</span>
1621
+ <span class="mw-leader-row-value mw-text-bold mw-text-primary">17.50</span>
1622
+ </p>
1623
+ ```
1624
+
1625
+ - Label and value is what `<dl>` is for, and since HTML 5.2 a `<div>` may group
1626
+ a `<dt>` and its `<dd>` inside one - so the semantic version costs no extra
1627
+ element over the `<p>`. Put `mw-leader-row` on that `<div>`. Use it where the
1628
+ pair **is** the content; where every row also carries a description, a `<p>`
1629
+ stays simpler.
1630
+ - `mw-leader-row-top` keeps the value beside the **first** line of a wrapping
1631
+ label instead of the last. On a menu that is where the price belongs - next to
1632
+ the dish, not somewhere down in its description.
1633
+ - A second `mw-leader-row-value` needs no extra class. Both sit after the
1634
+ leader, with a mark in the leader's colour between them - "11.30 - 14.00 |
1635
+ 17.00 - 23.00". Without it the pair reads as one long range.
1636
+ - Values are set in tabular figures and never break, so a column of them lines
1637
+ up. The label wraps between its words and stops at its longest one; past that
1638
+ the whole row wraps, with the values dropping under the label. Nothing shrinks
1639
+ to one letter per line.
1640
+ - Keep `mw-price` out of a leader row: it sets its own baseline and the leader
1641
+ would no longer meet it. Plain text in the value span, or the price in a
1642
+ column of its own.
1643
+
1644
+ `mw-leader-row-dashed` and `mw-leader-row-solid` swap the line style; a single
1645
+ row retunes with `--mw-leader-row-color`, `--mw-leader-row-style` and
1646
+ `--mw-leader-row-width`.
1647
+
1536
1648
  ## HTML lists
1537
1649
 
1538
1650
  `mw-list` is the base (spacing for `li`), combined with one of:
@@ -35,6 +35,11 @@
35
35
  desktop; stepping the gutter at a breakpoint instead would make the container
36
36
  jump backwards at the step. Both values are tokens,
37
37
  `--mw-container-gutter` and `--mw-container-width`.
38
+ - `mw-container-narrow` sits **inside** a `mw-container` and gives the content
39
+ 80% of it, back to 90% below `lg` and the full width below `md`. For a column
40
+ of full-width cards, where a 1200px line leaves more empty card than content.
41
+ It centers itself; put nothing else in it that has to line up with the
42
+ headings outside.
38
43
  - `mw-content` (`flex: 1` + top padding) is the alternative to `mw-section` when
39
44
  a page has one single content area. `mw-content-centered` centers it
40
45
  vertically over the full viewport - login pages, error pages.
@@ -459,6 +464,11 @@ way.
459
464
  | `mw-grid-flex` | 12 columns + `mw-col-span-1` … `mw-col-span-12` | single column below `md` |
460
465
  | `mw-grid` | no template, just grid + gap | - |
461
466
 
467
+ `mw-grid-even` is a modifier, not a grid - add it to one of the above and every
468
+ row becomes as tall as the tallest instead of as tall as its own contents. For a
469
+ column of cards that should end on one line even when one of them carries an
470
+ extra sentence.
471
+
462
472
  Every one of them has a `-lg` twin with a wider gap (2.5rem instead of 1.35rem):
463
473
  `mw-grid-2-lg`, `mw-grid-3-lg`, `mw-grid-4-lg`, `mw-grid-5-lg`, `mw-grid-1-lg`,
464
474
  `mw-grid-auto-lg`, `mw-grid-flex-lg`, `mw-grid-lg`.
@@ -389,6 +389,11 @@ Functions read the maps: `spacing('4')`, `font-size('lg')`,
389
389
  responding to zoom. The default range ends at `md` because that is where the
390
390
  stepped heading sizes it replaces reached their largest value - a headline
391
391
  that should keep growing passes `$to: 'xl'`.
392
+ - `fluid-container($min, $max, $from, $to)` - the same ramp measured against the
393
+ container instead of the viewport, so the slope lands in `cqi`. For anything
394
+ inside a `@container` block: sizing there off `vw` hands a 440px card in a
395
+ 1400px window the measurements a 900px card was drawn for. The endpoints are
396
+ container widths, not breakpoint names, because a container has none.
392
397
  - `media-up($bp)` / `media-down($bp)` - the `$breakpoints` map as range syntax,
393
398
  `width >= bp` and `width < bp`, so the two never overlap at the breakpoint.
394
399
  - `touch-context($bp: 'md')` - coarse pointer _or_ narrow viewport. Every
package/CHANGELOG.md CHANGED
@@ -6,6 +6,14 @@ Patch releases are only for test purposes - here I only document major and minor
6
6
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
7
7
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
 
9
+ ## [5.23.0] - 2026-09-20
10
+
11
+ ### Added
12
+
13
+ - leader-row
14
+ - lunch menu with 2 variants
15
+ - contact cards
16
+
9
17
  ## [5.22.0] - 2026-09-19
10
18
 
11
19
  ### Fixed
package/README.md CHANGED
@@ -45,12 +45,12 @@ The result is a framework that balances utility with simplicity, offering develo
45
45
  <title>My MaverickWave Project</title>
46
46
  <link
47
47
  rel="stylesheet"
48
- href="https://cdn.jsdelivr.net/npm/maverick-wave@5.22.0/maverick-wave.min.css"
48
+ href="https://cdn.jsdelivr.net/npm/maverick-wave@5.23.0/maverick-wave.min.css"
49
49
  />
50
50
  </head>
51
51
  <body>
52
52
  <!-- Your content here -->
53
- <script src="https://cdn.jsdelivr.net/npm/maverick-wave@5.22.0/maverick-wave.min.js"></script>
53
+ <script src="https://cdn.jsdelivr.net/npm/maverick-wave@5.23.0/maverick-wave.min.js"></script>
54
54
  </body>
55
55
  </html>
56
56
  ```
package/index.html CHANGED
@@ -659,6 +659,7 @@
659
659
  <a href="#modals" class="mw-section-btn">Modals</a>
660
660
  <a href="#html-lists" class="mw-section-btn">HTML Lists</a>
661
661
  <a href="#item-lists" class="mw-section-btn">Item Lists</a>
662
+ <a href="#leader-row" class="mw-section-btn">Leader Row</a>
662
663
  <a href="#stepper" class="mw-section-btn">Stepper</a>
663
664
  <a href="#parallax" class="mw-section-btn">Parallax</a>
664
665
  </nav>
@@ -705,6 +706,11 @@
705
706
  @@include('./src/partials/item-lists-container.html')
706
707
  </div>
707
708
 
709
+ <!-- Leader Row container -->
710
+ <div id="leader-row">
711
+ @@include('./src/partials/leader-row-container.html')
712
+ </div>
713
+
708
714
  <!-- Stepper container -->
709
715
  <div id="stepper">
710
716
  @@include('./src/partials/stepper-container.html')
@@ -899,6 +905,8 @@
899
905
  <a href="#tables" class="mw-section-btn">Tables</a>
900
906
  <a href="#kanban" class="mw-section-btn">Kanban</a>
901
907
  <a href="#calendar" class="mw-section-btn">Calendar</a>
908
+ <a href="#lunch-menu" class="mw-section-btn">Lunch Menu</a>
909
+ <a href="#contact" class="mw-section-btn">Contact</a>
902
910
  <a href="#pagination" class="mw-section-btn">Pagination</a>
903
911
  <a href="#timelines" class="mw-section-btn">Timelines</a>
904
912
  <a href="#gallery" class="mw-section-btn">Image Gallery</a>
@@ -937,6 +945,16 @@
937
945
  @@include('./src/partials/calendar-container.html')
938
946
  </div>
939
947
 
948
+ <!-- Lunch Menu container -->
949
+ <div id="lunch-menu">
950
+ @@include('./src/partials/lunch-menu-container.html')
951
+ </div>
952
+
953
+ <!-- Contact container -->
954
+ <div id="contact">
955
+ @@include('./src/partials/contact-container.html')
956
+ </div>
957
+
940
958
  <!-- Pagination container -->
941
959
  <div id="pagination">
942
960
  @@include('./src/partials/pagination-container.html')