mote.css 0.7.0 → 0.8.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/CHANGELOG.md +63 -0
- package/README.md +5 -3
- package/mote.components.css +30 -1
- package/mote.css +14 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,68 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.8.0] - 2026-10-22
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `.mote-band`: full-bleed tinted section — CTA bands, section dividers,
|
|
13
|
+
announcement strips. Opaque `color-mix()` (unlike `--mote-accent-soft`,
|
|
14
|
+
which is transparent and can vanish over dark backgrounds). Reads
|
|
15
|
+
`--mote-status`, so bands are content surfaces under the two-tier
|
|
16
|
+
principle.
|
|
17
|
+
- `.mote-skip-link`: sr-only until keyboard focus, then a fixed pill.
|
|
18
|
+
Split from `.mote-sr-only`, which is now pure hiding — using sr-only to
|
|
19
|
+
hide toggle radios made them pop a skip-link pill on focus.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- `.mote-card` normalizes `text-align: start` — form labels inside a card
|
|
24
|
+
read normally even when the card sits in a centered `.mote-hero`
|
|
25
|
+
(cards already zeroed first/last-child margins; this finishes the job).
|
|
26
|
+
- Page footer navs (`body > footer nav ul`) render as quiet wrapped rows —
|
|
27
|
+
no bullets — matching the header's semantic treatment. No class needed.
|
|
28
|
+
- File inputs use the density tokens (`--mote-control-pad`), so their
|
|
29
|
+
height matches sibling fields in a stack (was 41px vs 44px).
|
|
30
|
+
- Labels wrapping checkboxes/radios get `cursor: pointer` — the label is
|
|
31
|
+
the click target. Scoped via `label:has()`; text-input labels untouched.
|
|
32
|
+
|
|
33
|
+
### Fixed (docs — the bulk of this release, from a ten-agent build round)
|
|
34
|
+
|
|
35
|
+
- **Tokens reference**: new section listing every `--mote-*` knob — palette,
|
|
36
|
+
type/shape/motion, layout/density — including the actual
|
|
37
|
+
`--mote-accent-soft` definition (9% *transparent* mix) and a pointer to
|
|
38
|
+
`.mote-band` for opaque tints. Nav pill added.
|
|
39
|
+
- **Simple-page header snippet now shows the real composition**
|
|
40
|
+
(`.mote-container.mote-row` + `.mote-brand` + `.mote-push` inside the
|
|
41
|
+
header) — the old "no classes at all" snippet left the brand flush at
|
|
42
|
+
the viewport edge.
|
|
43
|
+
- **Notes and callouts** section: `.mote-note` (shipped since 0.3.0, never
|
|
44
|
+
documented as a concept) framed alongside the `blockquote` + status
|
|
45
|
+
quote treatment. Cross-linked from Blockquote and the consumer map.
|
|
46
|
+
- `.mote-num` documented (replaces the DIY `.num` page recipe);
|
|
47
|
+
`--mote-table-max` documented next to `.mote-table-scroll` (with the
|
|
48
|
+
sticky-engages-on-scroll note); `.mote-hero` + `--mote-hero-offset`
|
|
49
|
+
documented in Layout under "Hero and bands" — all previously findable
|
|
50
|
+
only by grepping the stylesheet.
|
|
51
|
+
- `.mote-card-media` documented (replaces the DIY `.card-media` recipe and
|
|
52
|
+
the false "cards don't ship this" claim); live band, hero and card-media
|
|
53
|
+
examples added.
|
|
54
|
+
- `--mote-rail-top`: docs now say it auto-derives from the sticky header —
|
|
55
|
+
set it only for wrapped shells (`.mote-header`).
|
|
56
|
+
- File-input treatment, badge context-scaling, and label-cursor behavior
|
|
57
|
+
documented.
|
|
58
|
+
- Seven new pattern recipes: login page, marketing hero (+ CTA band),
|
|
59
|
+
stat row, CSS-only billing toggle (with the sr-only-is-not-hiding
|
|
60
|
+
warning), display pull-quote, row hover, feedback row.
|
|
61
|
+
- Docs page gets a `.mote-skip-link` (dogfooding the new class).
|
|
62
|
+
|
|
63
|
+
### Evaluation
|
|
64
|
+
|
|
65
|
+
- Fifth round: ten agents each built a real page (pricing, blog, login,
|
|
66
|
+
404, settings, dashboard, KB, landing, release notes, contact) against
|
|
67
|
+
v0.7.0 and reported DX honestly. 10/10 would-use-again, zero rendering
|
|
68
|
+
failures; every change above traces to that round.
|
|
69
|
+
|
|
8
70
|
## [0.7.0] - 2026-10-21
|
|
9
71
|
|
|
10
72
|
### Changed
|
|
@@ -424,6 +486,7 @@ Components:
|
|
|
424
486
|
- Element gallery demo page (`demo.html`).
|
|
425
487
|
|
|
426
488
|
[0.3.0]: https://gitlab.com/abmach/mote/compare/v0.2.1...v0.3.0
|
|
489
|
+
[0.8.0]: https://gitlab.com/abmach/mote/compare/v0.7.0...v0.8.0
|
|
427
490
|
[0.7.0]: https://gitlab.com/abmach/mote/compare/v0.6.1...v0.7.0
|
|
428
491
|
[0.6.1]: https://gitlab.com/abmach/mote/compare/v0.6.0...v0.6.1
|
|
429
492
|
[0.6.0]: https://gitlab.com/abmach/mote/compare/v0.5.1...v0.6.0
|
package/README.md
CHANGED
|
@@ -152,6 +152,7 @@ mote is class-optional by design — elements are styled from tags alone; these
|
|
|
152
152
|
| Ghost buttons | `.mote-ghost` — transparent fill; status tints from the button's own class (gated like solids) |
|
|
153
153
|
| Solid button on any element | `.mote-btn` — the full solid recipe for anchors, spans; status classes gated |
|
|
154
154
|
| Hero centering | `.mote-hero` — vertically centers content for error/login/empty-state pages |
|
|
155
|
+
| CTA bands | `.mote-band` — full-bleed tinted section; opaque in both themes, reads `--mote-status` |
|
|
155
156
|
| Card cover media | `.mote-card-media` — flush-top cover images with matched radius |
|
|
156
157
|
| Brand/wordmark | `.mote-brand` — quiet non-nav link for site headers |
|
|
157
158
|
| Media objects | `.mote-media` — avatar/icon beside body (flex, last child grows) |
|
|
@@ -163,8 +164,9 @@ mote is class-optional by design — elements are styled from tags alone; these
|
|
|
163
164
|
| Sparse grids | `.mote-grid-sparse` — auto-fit variant, collapses empty tracks |
|
|
164
165
|
| Pagination | `nav[aria-label="pagination"]` — semantic, no class |
|
|
165
166
|
| Table of contents | `nav[aria-label="toc"]` — semantic, no class |
|
|
166
|
-
| Footer baseline | `body > footer` — semantic top-border + padding |
|
|
167
|
-
| Screen-reader helper | `.mote-sr-only`
|
|
167
|
+
| Footer baseline | `body > footer` — semantic top-border + padding; its `nav` renders as a quiet wrapped row |
|
|
168
|
+
| Screen-reader helper | `.mote-sr-only` — pure hiding, never appears |
|
|
169
|
+
| Skip link | `.mote-skip-link` — sr-only until keyboard focus, then a fixed pill |
|
|
168
170
|
| Print helpers | `.mote-no-print` / `.mote-print-only` |
|
|
169
171
|
| Theme-switch guard | `.mote-theme-switch` — prevents Chromium stale-color bug on `data-theme` flips |
|
|
170
172
|
| Status inheritance control | `.mote-default` (force accent) · `.mote-reset` (clear inherited status) |
|
|
@@ -172,7 +174,7 @@ mote is class-optional by design — elements are styled from tags alone; these
|
|
|
172
174
|
| Table max height | `--mote-table-max` (default 60vh) — `.mote-table-scroll` panel cap |
|
|
173
175
|
| Breadcrumbs | `nav[aria-label="breadcrumb"]` — semantic, no class |
|
|
174
176
|
| Card grids | `.mote-grid` — auto-fill columns from the container, no breakpoints |
|
|
175
|
-
| Cards | `.mote-card` |
|
|
177
|
+
| Cards | `.mote-card` — normalizes content: alignment reads start even inside centered regions |
|
|
176
178
|
| Badges | `.mote-badge` — gated: status from the badge's own class, never inherited |
|
|
177
179
|
| Avatars | `.mote-avatar` |
|
|
178
180
|
| Skeleton / spinner | `.mote-skeleton`, `.mote-spinner` |
|
package/mote.components.css
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* mote.components.css — opt-in components for mote.css.
|
|
3
|
-
* v0.
|
|
3
|
+
* v0.8.0 · MIT
|
|
4
4
|
* https://gitlab.com/abmach/mote · mirror: https://github.com/abmach/mote
|
|
5
5
|
*
|
|
6
6
|
* Requires mote.css loaded first (provides the --mote-* tokens).
|
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
border-radius: var(--mote-radius-lg);
|
|
24
24
|
background: color-mix(in oklab, var(--mote-surface) 55%, var(--mote-bg));
|
|
25
25
|
box-shadow: var(--mote-shadow-sm);
|
|
26
|
+
/* Cards normalize their content: alignment reads normally even when the
|
|
27
|
+
card sits inside a centered region (.mote-hero, centered sections). */
|
|
28
|
+
text-align: start;
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
:where(.mote-card) > :first-child {
|
|
@@ -33,6 +36,21 @@
|
|
|
33
36
|
margin-block-end: 0;
|
|
34
37
|
}
|
|
35
38
|
|
|
39
|
+
/* Band: a full-bleed tinted section — CTA bands, section dividers,
|
|
40
|
+
announcement strips. An opaque mix (unlike --mote-accent-soft, which is
|
|
41
|
+
transparent and can vanish over dark backgrounds), so it reads as a
|
|
42
|
+
deliberate section in both palettes. Content surfaces follow context:
|
|
43
|
+
a status class on an ancestor tints the band.
|
|
44
|
+
|
|
45
|
+
<section class="mote-band">
|
|
46
|
+
<div class="mote-container">…</div>
|
|
47
|
+
</section>
|
|
48
|
+
*/
|
|
49
|
+
.mote-band {
|
|
50
|
+
padding-block: 4rem;
|
|
51
|
+
background: color-mix(in oklab, var(--mote-status, var(--mote-accent)) 12%, var(--mote-bg));
|
|
52
|
+
}
|
|
53
|
+
|
|
36
54
|
/* ---------------------------------------------------------------------------
|
|
37
55
|
* 2. Badges — .mote-badge + a status class from mote.css (optional)
|
|
38
56
|
*
|
|
@@ -303,6 +321,17 @@ nav[aria-label="toc"] a:hover {
|
|
|
303
321
|
border-block-start: var(--mote-border-width) solid var(--mote-border);
|
|
304
322
|
}
|
|
305
323
|
|
|
324
|
+
/* The page footer's nav is a quiet wrapped row — not pills like the
|
|
325
|
+
header. The landmark styles itself; no class needed. */
|
|
326
|
+
:where(body > footer, .mote-footer) nav ul {
|
|
327
|
+
display: flex;
|
|
328
|
+
flex-wrap: wrap;
|
|
329
|
+
gap: 0.35rem 1.25rem;
|
|
330
|
+
list-style: none;
|
|
331
|
+
margin: 0;
|
|
332
|
+
padding: 0;
|
|
333
|
+
}
|
|
334
|
+
|
|
306
335
|
/* ---------------------------------------------------------------------------
|
|
307
336
|
* 8. Popover surfaces — tooltips, menus, toasts
|
|
308
337
|
*
|
package/mote.css
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* mote.css — a mote of styling for plain HTML.
|
|
3
|
-
* v0.
|
|
3
|
+
* v0.8.0 · MIT
|
|
4
4
|
* https://gitlab.com/abmach/mote · mirror: https://github.com/abmach/mote
|
|
5
5
|
*
|
|
6
6
|
* The smallest thing that can carry style:
|
|
@@ -406,6 +406,11 @@ label {
|
|
|
406
406
|
font-weight: 500;
|
|
407
407
|
}
|
|
408
408
|
|
|
409
|
+
/* A label that wraps a checkbox or radio is the click target itself */
|
|
410
|
+
:where(label:has(:is([type="checkbox"], [type="radio"]))) {
|
|
411
|
+
cursor: pointer;
|
|
412
|
+
}
|
|
413
|
+
|
|
409
414
|
fieldset {
|
|
410
415
|
padding: 1rem 1.2rem;
|
|
411
416
|
border: var(--mote-border-width) solid var(--mote-border);
|
|
@@ -473,7 +478,7 @@ select[multiple] {
|
|
|
473
478
|
}
|
|
474
479
|
|
|
475
480
|
[type="file"] {
|
|
476
|
-
padding: 0.
|
|
481
|
+
padding: var(--mote-control-pad, 0.5rem) var(--mote-control-pad-inline, 0.75rem);
|
|
477
482
|
background: none;
|
|
478
483
|
border-style: dashed;
|
|
479
484
|
}
|
|
@@ -761,7 +766,8 @@ progress, meter {
|
|
|
761
766
|
font-variant-numeric: tabular-nums;
|
|
762
767
|
}
|
|
763
768
|
|
|
764
|
-
.mote-sr-only
|
|
769
|
+
.mote-sr-only,
|
|
770
|
+
.mote-skip-link {
|
|
765
771
|
position: absolute;
|
|
766
772
|
width: 1px;
|
|
767
773
|
height: 1px;
|
|
@@ -773,8 +779,11 @@ progress, meter {
|
|
|
773
779
|
border: 0;
|
|
774
780
|
}
|
|
775
781
|
|
|
776
|
-
/* Skip link: sr-only until focused, then a fixed pill
|
|
777
|
-
.mote-
|
|
782
|
+
/* Skip link: sr-only until focused, then a fixed pill.
|
|
783
|
+
Use .mote-skip-link for the accessibility skip link;
|
|
784
|
+
use plain .mote-sr-only to hide things that must never
|
|
785
|
+
appear (radios driving CSS toggles, visually hidden labels). */
|
|
786
|
+
.mote-skip-link:focus-visible {
|
|
778
787
|
position: fixed;
|
|
779
788
|
top: 1rem;
|
|
780
789
|
left: 1rem;
|