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

50#E6F0F3
100#CCE2E8
200#99C4D1
300#66A7BA
400#338AA3
Brand
500#005E77
600#004F64
700#003F50
800#00303D
900#002029

Aqua — accent

50#E7FCFC
100#C4F8F8
200#8CF1F1
300#4EE8E8
Brand
400#14DBDB
500#10C4C4
600#0FA3A3
700#0C8181
800#0A6666

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.

AIcolor.ai.gradient
from · violet#8B5CF6
via · indigo#6366F1
to · aqua#14DBDB
✦ Ask the coach✦ AI suggestion✦ Generated by AI

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.

0#FFFFFF
50#F7F8F9
100#F1F3F4
150#E8EBED
200#DDE1E4
300#C7CDD1
400#A7AFB5
500#7C868D
600#5B656C
700#414A50
800#2A3136
900#1A1F22
950#0F1316
1000#000000

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.

Text
primary#1A1F22
secondary#5B656C
tertiary#7C868D
disabled#A7AFB5
inverse#FFFFFF
link#005E77
brand#005E77
Background
primary#FFFFFF
secondary#F7F8F9
tertiary#F1F3F4
Surface
primary#FFFFFF
secondary#F7F8F9
raised#FFFFFF
glassrgba(255, 255, 255, 0.72)
Border
subtle#E8EBED
default#DDE1E4
strong#C7CDD1
focus#14DBDB
Brand
primary#005E77
primaryHover#004F64
primaryPressed#003F50
onPrimary#FFFFFF
tint#E6F0F3
tintPressed#CCE2E8
onTint#004F64
accent#14DBDB
accentPressed#10C4C4
onAccent#1A1F22
accentTint#E7FCFC
accentBorder#C4F8F8
Feedback
successFg#1E8E4E
successSolid#34C759
successBg#E8F8EC
successBorder#B6E7C4
warningFg#9A6400
warningSolid#FF9F0A
warningBg#FFF4E5
warningBorder#FBE0AD
errorFg#C42B22
errorSolid#FF3B30
errorBg#FFEBEA
errorBorder#F6C2BE
infoFg#004F64
infoSolid#005E77
infoBg#E6F0F3
infoBorder#CCE2E8

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.
Do
A neutral screen with one teal primary button; fields, text, and borders all neutral. The eye lands on the one action immediately.
Don't
Teal headers, teal cards, teal labels, and two teal buttons at once — nothing stands out, so the user has to hunt for the next step.

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.

Contrast is a hard requirement

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.

TokenLightDark
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.glassrgba(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.gradientlinear-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.overlayrgba(15, 19, 22, 0.45)rgba(0, 0, 0, 0.6)
color.pressedOverlayrgba(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.

TokenValue
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