Atoms
The smallest interactive parts — buttons, badges, inputs, toggles, avatars. Sized for an older, big-screen audience: 44px minimum targets, AA contrast, visible focus.
Badges & tags
Status shorthand — skill state, tier, catalog flags.
Badges
New Mastered In progress Locked Free Neutral Outline
HTML
<span class="sg-badge sg-badge--brand">New</span>
<span class="sg-badge sg-badge--success">Mastered</span>
<span class="sg-badge sg-badge--outline">Outline</span> Web
<span class="sg-badge sg-badge--success">Flutter (planned)
StoaBadge(tone: .success)Semantic tone tokens (success / warning / danger / info / brand).
Inputs
Label + control + help/error, at a comfortable target height.
Fields
We email the new-card prep each season.
At least 8 characters.
HTML
<div class="sg-field">
<label class="sg-label">Email</label>
<input class="sg-input" type="email" />
<span class="sg-help">…</span>
</div> Web
<input class="sg-input"> · sg-input--errorFlutter (planned)
StoaField(label:…, error:…)An InputDecorationTheme derived from the shared border/danger/radius tokens.
Toggles & avatars
Switches, avatars, and the segmented mode picker.
Controls
SR SS RR
HTML
<label class="sg-switch"><input type="checkbox" checked><span></span></label>
<span class="sg-avatar">SS</span>
<span class="sg-segmented" role="group">…</span> Web
<label class="sg-switch"> · sg-avatar · sg-segmentedFlutter (planned)
StoaSwitch · StoaAvatar · StoaSegmentedSwitch uses ease-spring; avatar fills with the brand gradient + textOnBrand.