AM ← Back to portfolio Product Designer · Design Systems
Horse Keeper

Design System & Color Tokens

The color foundation behind the Horse Keeper iOS app: a three-tier token library built in Figma Variables and synced to code, so a single source of truth drives both design and the shipped product.

41Color tokens
3Tiers
1Source of truth
View the live, interactive library ↗
The approach

One palette, three layers of intent

Flat hex values don't scale. The moment a brand color shifts or a theme is added, every screen has to be hunted down by hand. Horse Keeper's tokens are structured so meaning lives in one place and everything downstream inherits it.

01 · Primitive

Raw values

The literal hex palette: teal, brown, neutral, ink, and support hues. Named by ramp position, never used directly in UI.

02 · Semantic

Meaning

Roles like brand/primary or text/muted that alias to primitives. This is the layer designers actually reach for.

03 · Component

Application

Button, card, and navigation tokens that reference semantics, so components stay consistent and never touch raw hex.

Tier 01 · Primitive · 14 tokens

The raw palette

teal
teal / 50
#E6F2F1
teal / 600
#2F6F6B
teal / 700
#255B58
brown
brown / 500
#8E7F6A
brown / accent
#8B4A2B
neutral
neutral / 0
#FFFFFF
neutral / 50
#F7F4EF
neutral / surface
#EDE7DF
neutral / border
#E3DBD2
ink
ink / 400
#9A9887
ink / 600
#6F655D
ink / 900
#2F2A26
support
support / blue
#4A99C2
support / orange
#E0662C
Tier 02 · Semantic · 16 tokens

Meaning, mapped to primitives

Each semantic token is an alias. Change a primitive once and every role pointing at it updates across design and code.

brand
primary→ teal/600
primaryPressed→ teal/700
primarySubtle→ teal/50
secondary→ brown/500
accent→ brown/accent
background
app→ neutral/50
surface→ neutral/surface
card→ neutral/0
text
primary→ ink/900
secondary→ ink/600
muted→ ink/400
inverse→ neutral/0
border
subtle→ neutral/border
status
success→ teal/600
warning→ support/orange
info→ support/blue
Tier 03 · Component · 11 tokens

Applied to components

The outermost layer references semantics, never raw hex, so buttons, cards, and navigation stay in lockstep with the system.

button
primaryBackground→ brand/primary
primaryText→ text/inverse
primaryPressed→ brand/primaryPressed
secondaryBackground→ background/card
secondaryText→ text/primary
secondaryBorder→ border/subtle
card
background→ background/card
border→ border/subtle
navigation
background→ background/app
tabActive→ brand/primary
tabInactive→ text/muted

Why it matters: because every component token traces back through a semantic role to a single primitive, rebranding or theming Horse Keeper is a handful of edits at the primitive tier, not a screen-by-screen rework. The library is authored in Figma Variables and exported to code, keeping design and the shipped iOS app on one source of truth.