Open DS

Theming

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

View all 53 theming tokens ↓

The reasons this scheme answers from

  • R1Business and productServes the public, one
  • R2People and work contextEveryone, including people with disabilities, AAA

Question 1

What can a theme change?

  • Mode only (chosen)
  • Mode and brand
  • Mode and contrast

Why Accessible first picks it: One brand, so only the mode changes.

becauseR1

radius{radius.6} · {radius.4} · {radius.8}
type{font.family.atkinson-hyperlegible} · {font.family.atkinson-hyperlegible} · {font.family.atkinson-hyperlegible} · {font.family.atkinson-hyperlegible} · {font.family.atkinson-hyperlegible} · {font.family.atkinson-hyperlegible} · {font.family.atkinson-hyperlegible}
color{color.gray.light.50} · {color.gray.light.0} · {color.gray.light.0} · {color.gray.light.100} · {color.blue.light.100} · {color.gray.light.900} · {color.black.light.scrim} · {color.gray.light.900} · {color.gray.light.700} · {color.gray.light.500} · {color.gray.light.0} · {color.gray.light.0} · {color.blue.light.700} · {color.gray.light.200} · {color.gray.light.500} · {color.blue.light.600} · {color.blue.light.600} · {color.blue.light.700} · {color.gray.light.0} · {color.gray.light.100} · {color.teal.light.700} · {color.teal.light.100} · {color.green.light.700} · {color.green.light.100} · {color.amber.light.700} · {color.amber.light.100} · {color.red.light.700} · {color.red.light.100} · {color.blue.light.600} · {color.blue.light.100} · {color.teal.light.600} · {color.teal.light.100} · {color.green.light.700} · {color.green.light.100} · {color.amber.light.700} · {color.amber.light.100} · {color.gray.light.500} · {color.gray.light.100} · {color.gray.light.500} · {color.gray.light.100} · {color.gray.light.200}
elevation{shadow.none} · {shadow.none}

Question 2

How many themes ship?

  • Two (chosen)
  • Several

Why Accessible first picks it: Light and dark.

becauseQ4

radius3
font family1
gray light7
blue light3
black light1
teal light3
green light2
amber light2
red light2
shadow1

Question 3

How are brands handled?

  • One brand (chosen)
  • Brands as modes

Why Accessible first picks it: One service, one brand.

becauseR1

  • One brand
  • from radius
  • from font.family
  • from color.gray.light
  • from color.blue.light
  • from color.black.light
  • from color.teal.light
  • from color.green.light
  • from color.amber.light
  • from color.red.light
  • from shadow

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

Question 4

Which modes ship?

  • Light and dark (chosen)
  • Light, dark and high contrast

Why Accessible first picks it: Light and dark ship as standard; both hold AAA text.

becauseR2

  • radius
    control
    → radius.6
    badge
    → radius.4
    container
    → radius.8
  • type
    display.font-family
    → font.family.atkinson-hyperlegible
    title.font-family
    → font.family.atkinson-hyperlegible
    heading.font-family
    → font.family.atkinson-hyperlegible
    body.font-family
    → font.family.atkinson-hyperlegible
    label.font-family
    → font.family.atkinson-hyperlegible
    caption.font-family
    → font.family.atkinson-hyperlegible
    data.font-family
    → font.family.atkinson-hyperlegible
  • color
    surface.canvas
    → color.gray.light.50
    surface.default
    → color.gray.light.0
    surface.raised
    → color.gray.light.0
    surface.sunken
    → color.gray.light.100
    surface.selected
    → color.blue.light.100
    surface.inverse
    → color.gray.light.900
    surface.scrim
    → color.black.light.scrim
    text.primary
    → color.gray.light.900
    text.secondary
    → color.gray.light.700
    text.muted
    → color.gray.light.500
    text.inverse
    → color.gray.light.0
    text.on-action
    → color.gray.light.0
    text.link
    → color.blue.light.700
    border.default
    → color.gray.light.200
    border.strong
    → color.gray.light.500
    border.focus
    → color.blue.light.600
    action.primary.@
    → color.blue.light.600
    action.primary.hover
    → color.blue.light.700
    action.secondary.@
    → color.gray.light.0
    action.secondary.hover
    → color.gray.light.100
    status.info.@
    → color.teal.light.700
    status.info.subtle
    → color.teal.light.100
    status.success.@
    → color.green.light.700
    status.success.subtle
    → color.green.light.100
    status.warning.@
    → color.amber.light.700
    status.warning.subtle
    → color.amber.light.100
    status.danger.@
    → color.red.light.700
    status.danger.subtle
    → color.red.light.100
    category.1.@
    → color.blue.light.600
    category.1.subtle
    → color.blue.light.100
    category.2.@
    → color.teal.light.600
    category.2.subtle
    → color.teal.light.100
    category.3.@
    → color.green.light.700
    category.3.subtle
    → color.green.light.100
    category.4.@
    → color.amber.light.700
    category.4.subtle
    → color.amber.light.100
    category.5.@
    → color.gray.light.500
    category.5.subtle
    → color.gray.light.100
    disabled.text
    → color.gray.light.500
    disabled.surface
    → color.gray.light.100
    disabled.border
    → color.gray.light.200
  • elevation
    card
    → shadow.none
    overlay
    → shadow.none

Question 5

What changes when the theme changes?

  • Colors only (chosen)
  • Colors, type and shape

Why Accessible first picks it: Only colors change.

becauseQ1

  • button
  • card
  • overlay

When to use

  • Someone switches to darkUse: The dark semantic mode, or high contrast. Not: One mode only. People pick the mode they can read.

All theming tokens

53 tokens · each decision and the primitive it points to

  • radius · 3radius.60.375rem · 6pxradius.40.25rem · 4pxradius.80.5rem · 8px
  • font.family · 1font.family.atkinson-hyperlegible"Atkinson Hyperlegible", Verdana, sans-serif
  • color.gray.light · 7color.gray.light.50#F7F7F7color.gray.light.0#FFFFFFcolor.gray.light.100#EDEDEDcolor.gray.light.900#141414color.gray.light.700#333333color.gray.light.500#595959color.gray.light.200#D6D6D6
  • color.blue.light · 3color.blue.light.100#E1ECFFcolor.blue.light.700#083C93color.blue.light.600#0B4FC0
  • color.black.light · 1color.black.light.scrim#0000008C
  • color.teal.light · 3color.teal.light.700#0B5B55color.teal.light.100#E0F2F1color.teal.light.600#0F766E
  • 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
  • shadow · 1shadow.none0px 0px 0px 0px #00000000
  • Decisions · 53theme.radius.control{radius.6}theme.radius.badge{radius.4}theme.radius.container{radius.8}theme.type.display.font-family{font.family.atkinson-hyperlegible}theme.type.title.font-family{font.family.atkinson-hyperlegible}theme.type.heading.font-family{font.family.atkinson-hyperlegible}theme.type.body.font-family{font.family.atkinson-hyperlegible}theme.type.label.font-family{font.family.atkinson-hyperlegible}theme.type.caption.font-family{font.family.atkinson-hyperlegible}theme.type.data.font-family{font.family.atkinson-hyperlegible}theme.color.surface.canvas{color.gray.light.50}theme.color.surface.default{color.gray.light.0}theme.color.surface.raised{color.gray.light.0}theme.color.surface.sunken{color.gray.light.100}theme.color.surface.selected{color.blue.light.100}theme.color.surface.inverse{color.gray.light.900}theme.color.surface.scrim{color.black.light.scrim}theme.color.text.primary{color.gray.light.900}theme.color.text.secondary{color.gray.light.700}theme.color.text.muted{color.gray.light.500}theme.color.text.inverse{color.gray.light.0}theme.color.text.on-action{color.gray.light.0}theme.color.text.link{color.blue.light.700}theme.color.border.default{color.gray.light.200}theme.color.border.strong{color.gray.light.500}theme.color.border.focus{color.blue.light.600}theme.color.action.primary.@{color.blue.light.600}theme.color.action.primary.hover{color.blue.light.700}theme.color.action.secondary.@{color.gray.light.0}theme.color.action.secondary.hover{color.gray.light.100}theme.color.status.info.@{color.teal.light.700}theme.color.status.info.subtle{color.teal.light.100}theme.color.status.success.@{color.green.light.700}theme.color.status.success.subtle{color.green.light.100}theme.color.status.warning.@{color.amber.light.700}theme.color.status.warning.subtle{color.amber.light.100}theme.color.status.danger.@{color.red.light.700}theme.color.status.danger.subtle{color.red.light.100}theme.color.category.1.@{color.blue.light.600}theme.color.category.1.subtle{color.blue.light.100}theme.color.category.2.@{color.teal.light.600}theme.color.category.2.subtle{color.teal.light.100}theme.color.category.3.@{color.green.light.700}theme.color.category.3.subtle{color.green.light.100}theme.color.category.4.@{color.amber.light.700}theme.color.category.4.subtle{color.amber.light.100}theme.color.category.5.@{color.gray.light.500}theme.color.category.5.subtle{color.gray.light.100}theme.color.disabled.text{color.gray.light.500}theme.color.disabled.surface{color.gray.light.100}theme.color.disabled.border{color.gray.light.200}theme.elevation.card{shadow.none}theme.elevation.overlay{shadow.none}

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

Theming in Accessible first: light and dark. Light and dark ship as standard; both hold AAA text. Only colors change.