Components
Every interface element, built from Volume I and specified to the same standard. Each component is documented as: anatomy · variants · states · sizing · spec · motion · do / don't. If a component isn't here, it doesn't exist yet — propose it, don't improvise it.
Reading a spec
Every component below follows the same skeleton so you can scan it the same way each time.
| Anatomy | The named parts and where padding lives |
| Variants | Distinct purposes — not just colours |
| States | Default · hover · focus · active · disabled · loading · error |
| Sizing | The allowed sizes and their tokens |
| Spec | Padding, radius, type, border — all as tokens |
| Motion | What animates, for how long, on what curve |
Fields & controls
Inputs collect data. Every field has a visible label, a focus state with a green ring, and clear error messaging.
2.2.1 Text input — states
2.2.2 Select, checkbox, radio, toggle
2.2.3 Spec
| input padding | 10px 13px |
| radius | --r-md (9) |
| focus ring | border --p500 + 3px --p-tint glow |
| error | border --danger + help text #FCA5B4 |
| label–field gap | --s1 (7px) |
Status & badges
Aros is a status product. These are its most important components — and the most disciplined. State is always colour + shape + label, never colour alone.
2.3.1 The live dot
Only the healthy dot pulses — the signature heartbeat, meaning "live and observed right now." Degraded, offline, and unknown are static.
2.3.2 Pills, badges, tags
2.3.3 State → colour → glyph
| State | Colour | Dot | Words we use |
|---|---|---|---|
| Healthy | --p500 | pulsing | Operational · Healthy · Live |
| Degraded | --warn | static | Degraded · Read-only · At risk |
| Offline | --danger | static | Offline · Down · Failed |
| Unknown | --slate | static | Pending · Unknown · Stale |
Cards
Cards group related information on a raised surface. They are the primary unit of the dashboard.
Storage workhorse
Compute node
RAM upgrade queued
| surface | --surface on --bg |
| padding | --s5 (20) |
| radius | --r-lg (14) |
| border | 1px --hair |
| hover | border --hair-2 + translateY(2px) · d-quick |
Tables
Tables are how Aros shows the estate. Dense, scannable, monospaced where it counts.
| Resource | Host | Type | Status | Uptime |
|---|---|---|---|---|
| aros-pg-dev-1 | pve1 | VM 231 | Live | 42d 6h |
| aros-pg-dev-2 | pve2 | VM 232 | Live | 42d 6h |
| aros-minio-4 | pve1 | VM 274 | SPOF | 18d 2h |
| header | Plex Mono 10px, +0.12em, UPPER, --slate |
| cell padding | 13px 14px (compact: 9px 12px) |
| row divider | 1px #161d29 |
| row hover | bg rgba(255,255,255,.02) · d-fast |
Feedback
Telling the operator what happened. Severity maps to the semantic palette, every time.
2.7.1 Toast
| alert | Persistent, inline. Tinted bg + 1px border in the semantic colour. |
| toast | Transient confirmation, auto-dismiss ~1.3s, bottom-centre, z-toast. |
| banner | Page-level, system-wide notices (full-width alert at top). |
Overlays
Layers above the page: modals for decisions, popovers for menus, tooltips for labels.
Esc and on scrim click, and returns focus to its trigger. The scrim uses z-modal with a darkened backdrop.Code & terminal
Aros shows commands and output verbatim. Monospace, syntax-tinted, copyable.
patroni: dcs: raft # DCS-agnostic toggle nodes: 3 # one per physical host
#06080C). Never paraphrase a command into prose.Empty · loading · error
The states most products forget. Aros treats them as first-class, because an operator sees them at the worst moments.
Discovery hasn't found anything on this host.
Connection timed out after 30s.
Avatars & progress
2.11.1 Progress & meters
Next: Patterns
Components in isolation are vocabulary. Volume III — Patterns → is grammar: how they compose into screens.