mote.css 0.6.1 → 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 +113 -1
- package/README.md +13 -5
- package/mote.components.css +73 -4
- package/mote.css +44 -8
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,117 @@ 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.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
|
+
|
|
70
|
+
## [0.7.0] - 2026-10-21
|
|
71
|
+
|
|
72
|
+
### Changed
|
|
73
|
+
|
|
74
|
+
- **Badges are gated** (same as buttons): a plain `.mote-badge` is always
|
|
75
|
+
accent-tinted; a status class on the badge itself provides the tint —
|
|
76
|
+
never inherited from context. Closes the "tag chips silently re-tint
|
|
77
|
+
inside themed cards" surprise from four evaluation rounds.
|
|
78
|
+
Two-tier principle: **content surfaces follow context; content markers
|
|
79
|
+
and actions declare their own status.**
|
|
80
|
+
|
|
81
|
+
### Fixed
|
|
82
|
+
|
|
83
|
+
- `.mote-table-scroll` sticky-header borders: Chromium paints collapsed
|
|
84
|
+
borders at the original flow position, not with the sticky cell —
|
|
85
|
+
switched to `border-collapse: separate; border-spacing: 0` inside the
|
|
86
|
+
wrapper.
|
|
87
|
+
- `.mote-table-scroll` clips rows in print: `max-height: none;
|
|
88
|
+
overflow: visible` added to the `@media print` block.
|
|
89
|
+
- Bare `<pre>` without `<code>` now gets the mono stack and 0.875rem size.
|
|
90
|
+
- `.mote-btn` now reads `var(--mote-control-pad, …)` instead of hardcoded
|
|
91
|
+
`0.5rem 1.1rem` — density overrides reach all buttons uniformly.
|
|
92
|
+
- Form controls (input/select/textarea) now read the same density tokens
|
|
93
|
+
as buttons: `var(--mote-control-pad, …) var(--mote-control-pad-inline, …)`.
|
|
94
|
+
- `.mote-stack` now stretches `progress` and `meter` alongside fields.
|
|
95
|
+
- `.mote-doc > aside` resets to `position: static` under 50rem (was
|
|
96
|
+
staying sticky while the nav went static — clipped scroll region on mobile).
|
|
97
|
+
- `.mote-table-scroll` max-height tokenized: `var(--mote-table-max, 60vh)`.
|
|
98
|
+
- Badge links get a hover state: `filter: brightness(0.92)`.
|
|
99
|
+
- Docs: theme-toggle snippet now 3-state (auto→light→dark) matching the
|
|
100
|
+
working demo; Patterns error-page uses `.mote-hero`; docs' own header
|
|
101
|
+
uses `.mote-row`/`.mote-push` instead of inline styles.
|
|
102
|
+
|
|
103
|
+
### Added
|
|
104
|
+
|
|
105
|
+
- `.mote-hero`: vertically centers content in the remaining viewport
|
|
106
|
+
height — for error pages, login screens, empty states. Uses
|
|
107
|
+
`--mote-hero-offset` (default 12rem) to account for header/footer.
|
|
108
|
+
- `.mote-card-media`: flush-top cover images for cards — negative margins,
|
|
109
|
+
clipped overflow, radius matched to the card, all in one class. Replaces
|
|
110
|
+
the 5-line page recipe that broke card corners.
|
|
111
|
+
- `.mote-brand`: quiet wordmark link for site headers — `font-weight: 700`,
|
|
112
|
+
fg color, no underline.
|
|
113
|
+
- `.mote-num`: right-aligned tabular figures for data table columns.
|
|
114
|
+
|
|
115
|
+
### Changed (evaluation)
|
|
116
|
+
|
|
117
|
+
- Fourth ten-app evaluation completed against v0.6.1; all round-3 fixes
|
|
118
|
+
verified holding. Round-4 findings addressed in this minor release.
|
|
9
119
|
|
|
10
120
|
### Fixed
|
|
11
121
|
|
|
@@ -376,6 +486,8 @@ Components:
|
|
|
376
486
|
- Element gallery demo page (`demo.html`).
|
|
377
487
|
|
|
378
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
|
|
490
|
+
[0.7.0]: https://gitlab.com/abmach/mote/compare/v0.6.1...v0.7.0
|
|
379
491
|
[0.6.1]: https://gitlab.com/abmach/mote/compare/v0.6.0...v0.6.1
|
|
380
492
|
[0.6.0]: https://gitlab.com/abmach/mote/compare/v0.5.1...v0.6.0
|
|
381
493
|
[0.5.1]: https://gitlab.com/abmach/mote/compare/v0.5.0...v0.5.1
|
package/README.md
CHANGED
|
@@ -151,23 +151,31 @@ mote is class-optional by design — elements are styled from tags alone; these
|
|
|
151
151
|
| Semantic buttons (gated) | `class="mote-success"` etc. on the button itself — themed sections never recolor actions |
|
|
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
|
+
| 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` |
|
|
156
|
+
| Card cover media | `.mote-card-media` — flush-top cover images with matched radius |
|
|
157
|
+
| Brand/wordmark | `.mote-brand` — quiet non-nav link for site headers |
|
|
154
158
|
| Media objects | `.mote-media` — avatar/icon beside body (flex, last child grows) |
|
|
155
159
|
| Display text | `.mote-display` — opt-in hero/error-code scale via `--mote-display` |
|
|
156
160
|
| Content rows | `.mote-row` + `.mote-push` — flex row, right-align helper |
|
|
157
161
|
| Stacked forms | `.mote-stack` — opt-in full-width fields, checkboxes stay 1em |
|
|
158
162
|
| Scrollable tables | `.mote-table-scroll` — sticky `thead`, no page scroll, no margin jump |
|
|
163
|
+
| Numeric columns | `.mote-num` — right-aligned tabular figures |
|
|
159
164
|
| Sparse grids | `.mote-grid-sparse` — auto-fit variant, collapses empty tracks |
|
|
160
165
|
| Pagination | `nav[aria-label="pagination"]` — semantic, no class |
|
|
161
166
|
| Table of contents | `nav[aria-label="toc"]` — semantic, no class |
|
|
162
|
-
| Footer baseline | `body > footer` — semantic top-border + padding |
|
|
163
|
-
| 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 |
|
|
164
170
|
| Print helpers | `.mote-no-print` / `.mote-print-only` |
|
|
165
171
|
| Theme-switch guard | `.mote-theme-switch` — prevents Chromium stale-color bug on `data-theme` flips |
|
|
166
172
|
| Status inheritance control | `.mote-default` (force accent) · `.mote-reset` (clear inherited status) |
|
|
173
|
+
| Hero offset | `--mote-hero-offset` (default 12rem) — space for header/footer in `.mote-hero` |
|
|
174
|
+
| Table max height | `--mote-table-max` (default 60vh) — `.mote-table-scroll` panel cap |
|
|
167
175
|
| Breadcrumbs | `nav[aria-label="breadcrumb"]` — semantic, no class |
|
|
168
176
|
| Card grids | `.mote-grid` — auto-fill columns from the container, no breakpoints |
|
|
169
|
-
| Cards | `.mote-card` |
|
|
170
|
-
| Badges | `.mote-badge`
|
|
177
|
+
| Cards | `.mote-card` — normalizes content: alignment reads start even inside centered regions |
|
|
178
|
+
| Badges | `.mote-badge` — gated: status from the badge's own class, never inherited |
|
|
171
179
|
| Avatars | `.mote-avatar` |
|
|
172
180
|
| Skeleton / spinner | `.mote-skeleton`, `.mote-spinner` |
|
|
173
181
|
| Tooltips | `[popover].mote-tooltip` + `popovertarget` button |
|
|
@@ -189,7 +197,7 @@ animations become instant, on older engines.
|
|
|
189
197
|
|
|
190
198
|
## Demo
|
|
191
199
|
|
|
192
|
-
Open [`docs/index.html`](docs/index.html) for the full live documentation, or [`demo.html`](demo.html) for a quick gallery of every styled element.
|
|
200
|
+
Open [`docs/index.html`](docs/index.html) for the full live documentation, or [`docs/demo.html`](docs/demo.html) for a quick gallery of every styled element.
|
|
193
201
|
|
|
194
202
|
## License
|
|
195
203
|
|
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
|
*
|
|
@@ -40,6 +58,10 @@
|
|
|
40
58
|
* <span class="mote-badge mote-success">success</span>
|
|
41
59
|
* ------------------------------------------------------------------------- */
|
|
42
60
|
|
|
61
|
+
/* Badges are content markers, not surfaces — they declare their own
|
|
62
|
+
status, never inherit it from context (same gating as buttons).
|
|
63
|
+
A plain .mote-badge is always accent-tinted; a status class on the
|
|
64
|
+
badge itself provides the tint. */
|
|
43
65
|
.mote-badge {
|
|
44
66
|
display: inline-block;
|
|
45
67
|
padding: 0.1rem 0.6rem;
|
|
@@ -47,8 +69,13 @@
|
|
|
47
69
|
font-size: 0.8em;
|
|
48
70
|
font-weight: 500;
|
|
49
71
|
line-height: 1.4;
|
|
50
|
-
background: var(--mote-
|
|
51
|
-
color: var(--mote-
|
|
72
|
+
background: var(--mote-accent-soft);
|
|
73
|
+
color: var(--mote-accent-deep);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.mote-badge:where(.mote-success, .mote-warning, .mote-error, .mote-info, .mote-muted) {
|
|
77
|
+
background: var(--mote-status-soft);
|
|
78
|
+
color: var(--mote-status);
|
|
52
79
|
}
|
|
53
80
|
|
|
54
81
|
/* Badges as links (tag chips, version pills): kill the underline */
|
|
@@ -56,6 +83,10 @@ a:where(.mote-badge) {
|
|
|
56
83
|
text-decoration: none;
|
|
57
84
|
}
|
|
58
85
|
|
|
86
|
+
a:where(.mote-badge):hover {
|
|
87
|
+
filter: brightness(0.92);
|
|
88
|
+
}
|
|
89
|
+
|
|
59
90
|
/* ---------------------------------------------------------------------------
|
|
60
91
|
* 3. Avatars
|
|
61
92
|
* ------------------------------------------------------------------------- */
|
|
@@ -245,15 +276,36 @@ nav[aria-label="toc"] a:hover {
|
|
|
245
276
|
color: var(--mote-accent-deep);
|
|
246
277
|
}
|
|
247
278
|
|
|
279
|
+
/* Flush-top cover media for cards: negative margins derived from the
|
|
280
|
+
card's own padding, clipped overflow, radius matched to the card. */
|
|
281
|
+
.mote-card-media {
|
|
282
|
+
margin: -1.25rem -1.5rem 1rem;
|
|
283
|
+
overflow: clip;
|
|
284
|
+
border-radius: calc(var(--mote-radius-lg) - var(--mote-border-width))
|
|
285
|
+
calc(var(--mote-radius-lg) - var(--mote-border-width)) 0 0;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.mote-card-media img,
|
|
289
|
+
.mote-card-media video {
|
|
290
|
+
display: block;
|
|
291
|
+
width: 100%;
|
|
292
|
+
max-width: none;
|
|
293
|
+
border-radius: inherit;
|
|
294
|
+
}
|
|
295
|
+
|
|
248
296
|
/* Scrollable table wrapper: sticky thead, no page scroll, no margin jump */
|
|
249
297
|
.mote-table-scroll {
|
|
250
298
|
overflow-x: auto;
|
|
251
|
-
max-height: 60vh;
|
|
299
|
+
max-height: var(--mote-table-max, 60vh);
|
|
252
300
|
overflow-y: auto;
|
|
253
301
|
}
|
|
254
302
|
|
|
303
|
+
/* Chromium paints collapsed borders at the original flow position,
|
|
304
|
+
not with the sticky cell — separate borders belong to the cell. */
|
|
255
305
|
.mote-table-scroll table {
|
|
256
306
|
margin-block: 0;
|
|
307
|
+
border-collapse: separate;
|
|
308
|
+
border-spacing: 0;
|
|
257
309
|
}
|
|
258
310
|
|
|
259
311
|
.mote-table-scroll thead th {
|
|
@@ -269,6 +321,17 @@ nav[aria-label="toc"] a:hover {
|
|
|
269
321
|
border-block-start: var(--mote-border-width) solid var(--mote-border);
|
|
270
322
|
}
|
|
271
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
|
+
|
|
272
335
|
/* ---------------------------------------------------------------------------
|
|
273
336
|
* 8. Popover surfaces — tooltips, menus, toasts
|
|
274
337
|
*
|
|
@@ -623,6 +686,12 @@ nav[aria-label="toc"] :is(h2, h3) {
|
|
|
623
686
|
grid-row: auto;
|
|
624
687
|
}
|
|
625
688
|
|
|
689
|
+
.mote-doc > aside {
|
|
690
|
+
position: static;
|
|
691
|
+
max-height: none;
|
|
692
|
+
overflow: visible;
|
|
693
|
+
}
|
|
694
|
+
|
|
626
695
|
.mote-doc > nav {
|
|
627
696
|
position: static;
|
|
628
697
|
max-height: none;
|
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:
|
|
@@ -335,6 +335,8 @@ kbd {
|
|
|
335
335
|
pre {
|
|
336
336
|
padding: 1rem 1.2rem;
|
|
337
337
|
overflow-x: auto;
|
|
338
|
+
font-family: var(--mote-font-mono);
|
|
339
|
+
font-size: 0.875rem;
|
|
338
340
|
border-radius: var(--mote-radius);
|
|
339
341
|
background: var(--mote-surface);
|
|
340
342
|
border: var(--mote-border-width) solid var(--mote-border);
|
|
@@ -404,6 +406,11 @@ label {
|
|
|
404
406
|
font-weight: 500;
|
|
405
407
|
}
|
|
406
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
|
+
|
|
407
414
|
fieldset {
|
|
408
415
|
padding: 1rem 1.2rem;
|
|
409
416
|
border: var(--mote-border-width) solid var(--mote-border);
|
|
@@ -415,7 +422,7 @@ legend { padding-inline: 0.4rem; font-weight: 600; }
|
|
|
415
422
|
input, select, textarea {
|
|
416
423
|
font: inherit;
|
|
417
424
|
color: inherit;
|
|
418
|
-
padding: 0.5rem 0.75rem;
|
|
425
|
+
padding: var(--mote-control-pad, 0.5rem) var(--mote-control-pad-inline, 0.75rem);
|
|
419
426
|
background: var(--mote-surface);
|
|
420
427
|
border: var(--mote-border-width) solid var(--mote-border);
|
|
421
428
|
border-radius: var(--mote-radius-sm);
|
|
@@ -471,7 +478,7 @@ select[multiple] {
|
|
|
471
478
|
}
|
|
472
479
|
|
|
473
480
|
[type="file"] {
|
|
474
|
-
padding: 0.
|
|
481
|
+
padding: var(--mote-control-pad, 0.5rem) var(--mote-control-pad-inline, 0.75rem);
|
|
475
482
|
background: none;
|
|
476
483
|
border-style: dashed;
|
|
477
484
|
}
|
|
@@ -666,9 +673,20 @@ progress, meter {
|
|
|
666
673
|
|
|
667
674
|
.mote-push { margin-inline-start: auto; }
|
|
668
675
|
|
|
676
|
+
/* Hero: vertically center content in the remaining viewport height.
|
|
677
|
+
For error pages, login screens, empty states. */
|
|
678
|
+
.mote-hero {
|
|
679
|
+
min-height: calc(100svh - var(--mote-hero-offset, 12rem));
|
|
680
|
+
display: flex;
|
|
681
|
+
flex-direction: column;
|
|
682
|
+
justify-content: center;
|
|
683
|
+
align-items: center;
|
|
684
|
+
text-align: center;
|
|
685
|
+
}
|
|
686
|
+
|
|
669
687
|
/* Stacked forms: stretch fields, keep checkboxes/radios compact.
|
|
670
688
|
An opt-in alternative to the page-global width: 100% recipe. */
|
|
671
|
-
.mote-stack :is(input, select, textarea) {
|
|
689
|
+
.mote-stack :is(input, select, textarea, progress, meter) {
|
|
672
690
|
width: 100%;
|
|
673
691
|
}
|
|
674
692
|
|
|
@@ -688,7 +706,7 @@ progress, meter {
|
|
|
688
706
|
font: inherit;
|
|
689
707
|
font-weight: 500;
|
|
690
708
|
color: var(--mote-on-accent);
|
|
691
|
-
padding: 0.5rem 1.1rem;
|
|
709
|
+
padding: var(--mote-control-pad, 0.5rem) var(--mote-control-pad-inline, 1.1rem);
|
|
692
710
|
background: var(--mote-accent);
|
|
693
711
|
border: var(--mote-border-width) solid transparent;
|
|
694
712
|
border-radius: var(--mote-radius-sm);
|
|
@@ -735,7 +753,21 @@ progress, meter {
|
|
|
735
753
|
}
|
|
736
754
|
|
|
737
755
|
/* Visually hidden, screen-reader available */
|
|
738
|
-
|
|
756
|
+
/* Brand/wordmark: quiet non-nav link for site headers */
|
|
757
|
+
.mote-brand {
|
|
758
|
+
font-weight: 700;
|
|
759
|
+
color: var(--mote-fg);
|
|
760
|
+
text-decoration: none;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
/* Numeric table column: right-align tabular figures */
|
|
764
|
+
.mote-num {
|
|
765
|
+
text-align: end;
|
|
766
|
+
font-variant-numeric: tabular-nums;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
.mote-sr-only,
|
|
770
|
+
.mote-skip-link {
|
|
739
771
|
position: absolute;
|
|
740
772
|
width: 1px;
|
|
741
773
|
height: 1px;
|
|
@@ -747,8 +779,11 @@ progress, meter {
|
|
|
747
779
|
border: 0;
|
|
748
780
|
}
|
|
749
781
|
|
|
750
|
-
/* Skip link: sr-only until focused, then a fixed pill
|
|
751
|
-
.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 {
|
|
752
787
|
position: fixed;
|
|
753
788
|
top: 1rem;
|
|
754
789
|
left: 1rem;
|
|
@@ -874,6 +909,7 @@ progress, meter {
|
|
|
874
909
|
/* Opt-in print helpers */
|
|
875
910
|
.mote-no-print { display: none !important; }
|
|
876
911
|
.mote-print-only { display: block; }
|
|
912
|
+
.mote-table-scroll { max-height: none; overflow: visible; }
|
|
877
913
|
}
|
|
878
914
|
|
|
879
915
|
@media not print {
|