Open DS

Color

Five questions every design system answers about color. These are Brand expressive’s answers, and each one points back to the reasons that chose it.

View all 41 color tokens ↓

The reasons this scheme answers from

  • R1BrandBold, loud
  • R2Tasks and flowsBrowse and explore, rarely
  • R3OutcomesEngagement, looking off-brand

Question 1

Which color roles does it need?

  • Surface, text, action and status
  • Those and brand accents (chosen)

Why Brand expressive picks it: Brand accents are part of the message.

becauseR1

surface
text
border
action
status
category
disabled

Question 2

How many emphasis levels do actions need?

  • Two
  • Three (chosen)
  • Four

Why Brand expressive picks it: Primary, secondary, ghost.

becauseR2

taupe light8
pink light3
black light1
blue light3
green light2
amber light2
red light2

Question 3

How is the palette defined?

  • Neutrals and one brand ramp (chosen)
  • Shared neutrals, a ramp per brand

Why Brand expressive picks it: Warm neutrals and one vivid ramp.

becauseR1

  • Neutrals and one brand ramp
  • from color.taupe.light
  • from color.pink.light
  • from color.black.light
  • from color.blue.light
  • from color.green.light
  • from color.amber.light
  • from color.red.light

Decisions point at primitives, so the rule lives in one place.

Question 4

How saturated is the palette?

  • Muted
  • Balanced
  • Vivid (chosen)

Why Brand expressive picks it: Vivid color is the brand.

becauseR1

  • surface
    canvas
    → color.taupe.light.50· dark → color.taupe.dark.0
    default
    → color.taupe.light.0· dark → color.taupe.dark.50
    raised
    → color.taupe.light.0· dark → color.taupe.dark.100
    sunken
    → color.taupe.light.100· dark → color.taupe.dark.100
    selected
    → color.pink.light.100· dark → color.pink.dark.100
    inverse
    → color.taupe.light.900· dark → color.taupe.dark.900
    scrim
    → color.black.light.scrim· dark → color.black.dark.scrim
  • text
    primary
    → color.taupe.light.900· dark → color.taupe.dark.900
    secondary
    → color.taupe.light.700· dark → color.taupe.dark.500
    muted
    → color.taupe.light.600· dark → color.taupe.dark.400
    inverse
    → color.taupe.light.0· dark → color.taupe.dark.50
    on-action
    → color.taupe.light.0· dark → color.taupe.dark.0
    link
    → color.pink.light.700· dark → color.pink.dark.700
  • border
    default
    → color.taupe.light.200· dark → color.taupe.dark.100
    strong
    → color.taupe.light.500· dark → color.taupe.dark.300
    focus
    → color.pink.light.600· dark → color.pink.dark.700
  • action
    primary.@
    → color.pink.light.600· dark → color.pink.dark.700
    primary.hover
    → color.pink.light.700· dark → color.pink.dark.800
    secondary.@
    → color.taupe.light.0· dark → color.taupe.dark.50
    secondary.hover
    → color.taupe.light.100· dark → color.taupe.dark.100
  • status
    info.@
    → color.blue.light.700· dark → color.blue.dark.700
    info.subtle
    → color.blue.light.100· dark → color.blue.dark.100
    success.@
    → color.green.light.700· dark → color.green.dark.700
    success.subtle
    → color.green.light.100· dark → color.green.dark.100
    warning.@
    → color.amber.light.700· dark → color.amber.dark.700
    warning.subtle
    → color.amber.light.100· dark → color.amber.dark.100
    danger.@
    → color.red.light.700· dark → color.red.dark.700
    danger.subtle
    → color.red.light.100· dark → color.red.dark.100
  • category
    1.@
    → color.pink.light.600· dark → color.pink.dark.700
    1.subtle
    → color.pink.light.100· dark → color.pink.dark.100
    2.@
    → color.blue.light.600· dark → color.blue.dark.700
    2.subtle
    → color.blue.light.100· dark → color.blue.dark.100
    3.@
    → color.green.light.700· dark → color.green.dark.700
    3.subtle
    → color.green.light.100· dark → color.green.dark.100
    4.@
    → color.amber.light.700· dark → color.amber.dark.700
    4.subtle
    → color.amber.light.100· dark → color.amber.dark.100
    5.@
    → color.taupe.light.500· dark → color.taupe.dark.700
    5.subtle
    → color.taupe.light.100· dark → color.taupe.dark.100
  • disabled
    text
    → color.taupe.light.500· dark → color.taupe.dark.500
    surface
    → color.taupe.light.100· dark → color.taupe.dark.100
    border
    → color.taupe.light.200· dark → color.taupe.dark.200

Question 5

Where does color carry meaning first?

  • Status in tables
  • Links and actions
  • Brand moments (chosen)

Why Brand expressive picks it: Color makes the launch moment.

becauseR3

  • button · 13 keys
  • input · 8 keys
  • control · 3 keys
  • badge · 10 keys
  • card · 2 keys
  • table · 3 keys
  • tabs · 3 keys
  • overlay · 4 keys

When to use

  • A selected row or itemUse: color.surface.selected (brand tint). Not: Grey. Selection carries the brand.
  • An error messageUse: color.status.danger and a short sentence. Not: The brand magenta. Errors must not look like the brand.
  • A linkUse: color.text.link, underlined. Not: Color only. Underline keeps links clear on vivid color.
  • A statusUse: Badge pill with a word. Not: Color alone. A word keeps meaning on vivid backgrounds.
  • The action that completes the taskUse: Button primary, large, one per section. Not: Two primaries. One loud call to action per section.
  • An alternative or cancelUse: Button ghost. Not: A second primary. The alternative must not compete.
  • Delete or removeUse: Button secondary, then confirm. Not: Button primary. Confirm before destroying data.

All color tokens

41 tokens · each decision and the primitive it points to

  • color.taupe.light · 8color.taupe.light.50#FFF8F3color.taupe.light.0#FFFFFFcolor.taupe.light.100#FCEFE6color.taupe.light.900#1F1411color.taupe.light.700#4D3A33color.taupe.light.600#6B544Acolor.taupe.light.200#F2DCCFcolor.taupe.light.500#8A6F63
  • color.pink.light · 3color.pink.light.100#FDE4F0color.pink.light.700#A8165Fcolor.pink.light.600#D61F7A
  • color.black.light · 1color.black.light.scrim#0000008C
  • color.blue.light · 3color.blue.light.700#083C93color.blue.light.100#E1ECFFcolor.blue.light.600#0B4FC0
  • color.green.light · 2color.green.light.700#1F7A3Acolor.green.light.100#E3F4EA
  • color.amber.light · 2color.amber.light.700#8A5600color.amber.light.100#FFF3D6
  • color.red.light · 2color.red.light.700#C42B2Bcolor.red.light.100#FDE7E7
  • Decisions · 41color.surface.canvas{color.taupe.light.50}color.surface.default{color.taupe.light.0}color.surface.raised{color.taupe.light.0}color.surface.sunken{color.taupe.light.100}color.surface.selected{color.pink.light.100}color.surface.inverse{color.taupe.light.900}color.surface.scrim{color.black.light.scrim}color.text.primary{color.taupe.light.900}color.text.secondary{color.taupe.light.700}color.text.muted{color.taupe.light.600}color.text.inverse{color.taupe.light.0}color.text.on-action{color.taupe.light.0}color.text.link{color.pink.light.700}color.border.default{color.taupe.light.200}color.border.strong{color.taupe.light.500}color.border.focus{color.pink.light.600}color.action.primary.@{color.pink.light.600}color.action.primary.hover{color.pink.light.700}color.action.secondary.@{color.taupe.light.0}color.action.secondary.hover{color.taupe.light.100}color.status.info.@{color.blue.light.700}color.status.info.subtle{color.blue.light.100}color.status.success.@{color.green.light.700}color.status.success.subtle{color.green.light.100}color.status.warning.@{color.amber.light.700}color.status.warning.subtle{color.amber.light.100}color.status.danger.@{color.red.light.700}color.status.danger.subtle{color.red.light.100}color.category.1.@{color.pink.light.600}color.category.1.subtle{color.pink.light.100}color.category.2.@{color.blue.light.600}color.category.2.subtle{color.blue.light.100}color.category.3.@{color.green.light.700}color.category.3.subtle{color.green.light.100}color.category.4.@{color.amber.light.700}color.category.4.subtle{color.amber.light.100}color.category.5.@{color.taupe.light.500}color.category.5.subtle{color.taupe.light.100}color.disabled.text{color.taupe.light.500}color.disabled.surface{color.taupe.light.100}color.disabled.border{color.taupe.light.200}

Decisions reference primitives, so changing one primitive updates every decision and component that uses it.

Color in Brand expressive: vivid. Vivid color is the brand. Color makes the launch moment.