SPROUT · DESIGN SYSTEM v3
ACCEPTED · ADR-0008

The personality layer

Phase 2 brings the brand's living character onto the product — as an additive layer over v1/v2, not a rewrite. v1 remains the source of truth for the instrument; v3 adds a mood↔band map, the mark as a drop-in component, and a voice-string pool. Per the boundary, it layers on, never recolors.

additive over v1 / v2 tokens still from sprout-tokens.css ADR-0004 contract holds

Same instrument. New layer.

additive, not a restyle

The v1 instrument card is untouched — same layout, same mono numbers, same band color. The layer only adds Sprout beside the data, on a hero surface where character belongs.

v1 INSTRUMENT · UNCHANGED
s3 GPIO 36 · soil_moisture
1,352 raw
Moist · well watered
spread20 range1,316–1,356 slope+1.35/h
v3 HERO · v1 CARD + SPROUT BESIDE IT
<sprout-mark>
“I'm thriving. My last drink was two days ago.”
1,352 raw
Moist · well watered
The raw count, the band, and its color are identical on both sides — the layer adds the mark and one first-person line, both reading the same band. Nothing in the instrument was recolored.

What v3 adds

four additive files · zero v1 edits
mood-band-map.json
The bridge
The 1:1 band→mood mapping — the single source of truth. Data reads it to know which mood a reading is in.
sprout-mark.js
The mark, as a component
A drop-in custom element: <sprout-mark band="moist">. Framework-agnostic, reduced-motion aware.
voice-strings.json
The words
First-person lines keyed by mood and by surface (fault, empty, onboarding…). Pick one; never invent a number.
sprout-motion.css
The motion
Sway / breathe / droop / bob keyframes for hand-rolled marks — for surfaces not using the component.

One component, seven bands

mood follows the band

Each state is the same mark, posed and colored by the band it reads — never by the index. (Live, working states are in sprout-mark-demo.html.)

Soaked
Refreshed
Thriving
Content
Thirsty
Parched
Faint

Refined soil mode

the one v1 token delta

v1's dark mode leaned warm and olive — it read muddy and dank. v3 refines the dark neutrals only to a cooler, deeper green-charcoal. The brand greens and every status/band color stay put. This is the single place v3 changes a v1 value, so it's a deliberate reconciliation, not a silent overwrite.

v1 SOIL MODE · warm / olive
s3 GPIO 36 · soil_moisture
1,352 raw
Moist · well watered
range1,316–1,356slope+1.35/h
recessed well · data integrity
v3 SOIL MODE · cool green-charcoal
s3 GPIO 36 · soil_moisture
1,352 raw
Moist · well watered
range1,316–1,356slope+1.35/h
recessed well · data integrity
--bg
surf-2
surface
border
--bg
surf-2
surface
border

For the lanes

how to consume · refined soil mode
Data lane
Read mood-band-map.json to turn a band into a mood; drop <sprout-mark> onto the hero / empty / loading surfaces; pull copy from voice-strings.json. Keep the dense readouts mark-free.
Firmware lane
No code change. The mood map keys off the existing seven-level enum — when A2 reconciles the boundaries, only the band column moves; the moods stay put.
ACCEPTED
Accepted — 2026-06-24. The personality layer and the v1 soil-mode token refinement were reviewed and approved, and ratified as ADR-0008. The refined dark neutrals are folded into sprout-tokens.css; the ADR-0004 token contract holds throughout.