Color
Color in DayTwo is neutral by default. Brand color is a signal, not decoration — teal marks the one action that matters and the element in focus, nothing else. Used sparingly, color tells a first-time user where to look. Used everywhere, it tells them nothing.
Brand
Teal — primary action
Aqua — accent
The one rule — don't abuse brand color. Brand color is reserved for exactly two jobs: the primary action (CTA) and the one focal or active element the user should notice. Everything else is neutral — surfaces, text, borders, secondary actions, and even the focus ring on a field (that's a neutral grey, not brand). Spend it like it's scarce: aim for roughly one brand-coloured thing per screen. The moment a second teal element competes, neither reads as "the one to tap."
Teal #005E77 carries the primary action and white text on it. Aqua #14DBDB is a sparing accent (and the primary fill on dark backgrounds); aqua is never a white-text fill — too bright to read against.
Why. A first-time, low-literacy user scans for the brightest, most saturated thing and assumes that's what to tap. Keep the screen neutral and spend brand colour on exactly one action, and that instinct becomes correct behaviour — no trainer required.
AI
DayTwo's intelligence gets its own color — a violet → indigo → aqua gradient. Violet appears nowhere else in the system, so the instant a user sees it they know the coach is involved. And because the gradient resolves into our own aqua, it reads as DayTwo's AI, not a generic purple.
Use it for anything AI-driven — the coach mark, an AI-generated suggestion, an "Ask" entry point, a "Generated by AI" label. Reach for color.ai.gradient on a fill (an avatar, a pill, a hero band); use the solid color.ai.fg for inline AI text or a single glyph where a gradient is impractical, and color.ai.tint for a soft AI-flavored surface.
This is a third signal, separate from brand: teal still means "the one action," and violet means "this came from the AI." Keep them apart — don't tint a primary button with the AI gradient, and don't use violet for anything that isn't intelligence. Like brand color, spend it sparingly; if every card glows violet, none of them reads as special.
Neutrals
Most of every screen is neutral. The ramp is faintly teal-tinted so surfaces feel part of the brand without shouting.
Semantic colors
Components never reference the palette above directly — they use these role-based tokens, which resolve per theme. One change re-themes the whole system, and light/dark stay in agreement.
Showing the light theme. Toggle the theme in the header to see the other set — components read these role names, never the raw hex.
Where brand color is allowed
- The primary CTA — the single most important action on a screen, as a teal button fill. One per screen.
- The focal / active element — a selected tab, the chosen row in a menu, the "you are here" state. The one thing the user should notice.
- Links — an inline link may be teal, since it's an action.
Everything else is neutral — surfaces, text, labels, borders, and secondary actions.
Where it doesn't belong
- ❌ More than one action per screen — two "primary" colors means no primary.
- ❌ Surfaces, headers, or large areas — coloring big regions drowns the signal and slows scanning.
- ❌ Body text and labels — neutral; brand color on plain text is just noise.
- ❌ Focus rings on fields — an active input shows a neutral grey ring, not a brand one. Brand marks focal points, not every interactive state.
- ❌ As a white-text fill in aqua — fails contrast.
What user problem this solves
A first-time shop owner scans for the brightest, most saturated thing and assumes that's what to tap. If color is everywhere, that instinct fails and they hesitate. Keeping the screen neutral and spending brand color on exactly one action turns that instinct into correct behaviour — no trainer required.
Text on a colored fill must stay readable in low light and direct sun. That's why teal (not aqua) carries white text, and why we check text/background pairs rather than trusting that a color "looks fine" on a bright office monitor.
Token reference
Semantic tokens
What components actually use. Each resolves per theme — change a value here and every screen follows.
| Token | Light | Dark |
|---|---|---|
color.text.primary | #1A1F22 | #F7F8F9 |
color.text.secondary | #5B656C | #C7CDD1 |
color.text.tertiary | #7C868D | #A7AFB5 |
color.text.disabled | #A7AFB5 | #5B656C |
color.text.inverse | #FFFFFF | #0F1316 |
color.text.link | #005E77 | #4EE8E8 |
color.text.brand | #005E77 | #14DBDB |
color.background.primary | #FFFFFF | #0F1316 |
color.background.secondary | #F7F8F9 | #1A1F22 |
color.background.tertiary | #F1F3F4 | #2A3136 |
color.surface.primary | #FFFFFF | #1A1F22 |
color.surface.secondary | #F7F8F9 | #2A3136 |
color.surface.raised | #FFFFFF | #2A3136 |
color.surface.glass | rgba(255, 255, 255, 0.72) | rgba(26, 31, 34, 0.72) |
color.border.subtle | #E8EBED | #2A3136 |
color.border.default | #DDE1E4 | #414A50 |
color.border.strong | #C7CDD1 | #5B656C |
color.border.focus | #14DBDB | #14DBDB |
color.brand.primary | #005E77 | #14DBDB |
color.brand.primaryHover | #004F64 | #4EE8E8 |
color.brand.primaryPressed | #003F50 | #10C4C4 |
color.brand.onPrimary | #FFFFFF | #0F1316 |
color.brand.tint | #E6F0F3 | #002029 |
color.brand.tintPressed | #CCE2E8 | #00303D |
color.brand.onTint | #004F64 | #4EE8E8 |
color.brand.accent | #14DBDB | #14DBDB |
color.brand.accentPressed | #10C4C4 | #10C4C4 |
color.brand.onAccent | #1A1F22 | #0F1316 |
color.brand.accentTint | #E7FCFC | #002029 |
color.brand.accentBorder | #C4F8F8 | #00303D |
color.ai.gradient | linear-gradient(135deg, #8B5CF6 0%, #6366F1 52%, #14DBDB 100%) | linear-gradient(135deg, #8B5CF6 0%, #6366F1 52%, #14DBDB 100%) |
color.ai.from | #8B5CF6 | #8B5CF6 |
color.ai.via | #6366F1 | #6366F1 |
color.ai.to | #14DBDB | #14DBDB |
color.ai.fg | #7C3AED | #9B74FF |
color.ai.tint | #F5F1FF | #241544 |
color.ai.onTint | #6D28D9 | #D7C7FF |
color.ai.onGradient | #FFFFFF | #FFFFFF |
color.feedback.successFg | #1E8E4E | #5BD98A |
color.feedback.successSolid | #34C759 | #34C759 |
color.feedback.successBg | #E8F8EC | #10231A |
color.feedback.successBorder | #B6E7C4 | #1E4533 |
color.feedback.warningFg | #9A6400 | #FFC163 |
color.feedback.warningSolid | #FF9F0A | #FF9F0A |
color.feedback.warningBg | #FFF4E5 | #2A1F0A |
color.feedback.warningBorder | #FBE0AD | #4A3A15 |
color.feedback.errorFg | #C42B22 | #FF8A82 |
color.feedback.errorSolid | #FF3B30 | #FF3B30 |
color.feedback.errorBg | #FFEBEA | #2A1312 |
color.feedback.errorBorder | #F6C2BE | #4A201E |
color.feedback.infoFg | #004F64 | #4EE8E8 |
color.feedback.infoSolid | #005E77 | #14DBDB |
color.feedback.infoBg | #E6F0F3 | #002029 |
color.feedback.infoBorder | #CCE2E8 | #00303D |
color.overlay | rgba(15, 19, 22, 0.45) | rgba(0, 0, 0, 0.6) |
color.pressedOverlay | rgba(15, 19, 22, 0.06) | rgba(255, 255, 255, 0.08) |
Palette (primitives)
The raw ramps the semantic tokens are built from. Never reference these directly in a component.
| Token | Value |
|---|---|
palette.neutral.0 | #FFFFFF |
palette.neutral.50 | #F7F8F9 |
palette.neutral.100 | #F1F3F4 |
palette.neutral.150 | #E8EBED |
palette.neutral.200 | #DDE1E4 |
palette.neutral.300 | #C7CDD1 |
palette.neutral.400 | #A7AFB5 |
palette.neutral.500 | #7C868D |
palette.neutral.600 | #5B656C |
palette.neutral.700 | #414A50 |
palette.neutral.800 | #2A3136 |
palette.neutral.900 | #1A1F22 |
palette.neutral.950 | #0F1316 |
palette.neutral.1000 | #000000 |
palette.teal.50 | #E6F0F3 |
palette.teal.100 | #CCE2E8 |
palette.teal.200 | #99C4D1 |
palette.teal.300 | #66A7BA |
palette.teal.400 | #338AA3 |
palette.teal.500 | #005E77 |
palette.teal.600 | #004F64 |
palette.teal.700 | #003F50 |
palette.teal.800 | #00303D |
palette.teal.900 | #002029 |
palette.aqua.50 | #E7FCFC |
palette.aqua.100 | #C4F8F8 |
palette.aqua.200 | #8CF1F1 |
palette.aqua.300 | #4EE8E8 |
palette.aqua.400 | #14DBDB |
palette.aqua.500 | #10C4C4 |
palette.aqua.600 | #0FA3A3 |
palette.aqua.700 | #0C8181 |
palette.aqua.800 | #0A6666 |
palette.violet.50 | #F5F1FF |
palette.violet.100 | #EBE3FF |
palette.violet.200 | #D7C7FF |
palette.violet.300 | #BBA1FF |
palette.violet.400 | #9B74FF |
palette.violet.500 | #8B5CF6 |
palette.violet.600 | #7C3AED |
palette.violet.700 | #6D28D9 |
palette.violet.800 | #5B21B6 |
palette.violet.900 | #4A1D8F |
palette.indigo.500 | #6366F1 |
palette.green.fg | #1E8E4E |
palette.green.solid | #34C759 |
palette.green.bg | #E8F8EC |
palette.green.border | #B6E7C4 |
palette.amber.fg | #9A6400 |
palette.amber.solid | #FF9F0A |
palette.amber.bg | #FFF4E5 |
palette.amber.border | #FBE0AD |
palette.red.fg | #C42B22 |
palette.red.solid | #FF3B30 |
palette.red.bg | #FFEBEA |
palette.red.border | #F6C2BE |