Skip to content

Color System

Color space: OKLCh

All color tokens are authored in OKLCh (Oklab Lightness, Chroma, Hue). This perceptually uniform color space ensures consistent lightness and contrast across palettes.

Each color token stores dual values:

FormatUsage
oklch(L C H)Web (CSS) — native browser support
#RRGGBB (hex)Figma, Flutter — no OKLCh support

Parity between oklch and hex is enforced by deltaE CIEDE2000 tests (max deviation < 1.0).

Three-layer taxonomy

1. Primitives

Raw color palettes. Never used directly in UI code.

  • color.green.50color.green.900 (10 stops)
  • color.lime.50color.lime.900
  • color.neutral.50color.neutral.900
  • Status palettes: red, amber, orange, blue, purple
  • Brand-specific: slate, teal (GetPlants)

2. Semantic

Functional aliases that map to primitives. These are what UI code references.

TokenVerdantaGetPlants
color.surfacewhitewhite
color.text-primaryneutral.600slate.900
color.action-primarygreen.600slate.800
color.status-successlime.600teal.700

3. Component

Tokens scoped to specific components. Reference semantic tokens.

  • button.primary.bgcolor.action-primary
  • card.bordercolor.border-default
  • input.border-focuscolor.action-primary

Multi-brand: overrides

GetPlants overrides only the semantic and component layers. Primitives are shared.

Override file: src/brands/getplants.json

Brand tokens are applied via CSS [data-brand="getplants"] selector, which overrides :root values at runtime. No build-time duplication.

Figma integration

Tokens are pushed to Figma Variables API as hex values with namespaced paths:

  • primitive/color/green/600
  • semantic/color/action/primary
  • component/button/primary/bg

Two modes in a single “Design Tokens” collection: verdanta and getplants.