Skip to main content

Interactive State Color Theory

UI elements exist in discrete states, each requiring distinct visual feedback. Flow Colors provide a systematic way to derive these states from Core Colors.
┌──────────────────────────────────────────────────────────────────────────────────┐
│                       INTERACTIVE STATE MACHINE                                  │
├──────────────────────────────────────────────────────────────────────────────────┤
│                                                                                  │
│   ┌─────────┐     mouse enter     ┌─────────┐     mouse down    ┌──────────┐     │
│   │ DEFAULT │ ─────────────────-> │  HOVER  │ ─────────────────>│  ACTIVE  │     │
│   │  STATE  │ <─────────────────  │  STATE  │ <─────────────────│  STATE   │     │
│   └─────────┘     mouse leave     └─────────┘     mouse up      └──────────┘     │
│        │                               │                              │          │
│        │                               │                              │          │
│        │         click                 │                              │          │
│        │        ┌──────────────────────┴──────────────────────────────┘          │
│        │        │                                                                │
│        │        v                                                                │
│        │   ┌─────────┐                                                           │
│        │   │ SELECTED│  (toggle state)                                           │
│        │   │  STATE  │                                                           │
│        │   └─────────┘                                                           │
│        │        │                                                                │
│        │        │ (can still have hover/active when selected)                    │
│        │        │                                                                │
│        │        v                                                                │
│        │   ┌─────────────┐                                                       │
│        └──>│  DISABLED   │  (blocks all other states)                            │
│            │    STATE    │                                                       │
│            └─────────────┘                                                       │
│                                                                                  │
└──────────────────────────────────────────────────────────────────────────────────┘

Color Intensity Progression

Each state modifies the base color in a predictable way.
┌─────────────────────────────────────────────────────────────────────────────────┐
│  STATE COLOR INTENSITY PROGRESSION                                              │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                 │
│   Default ────-> Hover ────-> Active ────-> Selected ────-> Disabled            │
│     │               │             │               │                │            │
│     v               v             v               v                v            │
│   ########      ..######..    ##########      ++++####        ........          │
│   Base          +15% white    +20% black      +20% tint       60% gray          │
│   100%          Lighter       Darker          Tinted          Desaturated       │
│                                                                                 │
│   STATE          MODIFIER          COLOR SPACE      AMOUNT                      │
│   ─────          ────────          ───────────      ──────                      │
│   Default        None              OKLCH            100%                        │
│   Hover          + white           OKLCH            15% (10% for warning)       │
│   Active         + black           OKLAB            20%                         │
│   Disabled       + gray            OKLAB            60%                         │
│   Muted          + transparent     OKLAB            80%                         │
│                                                                                 │
└─────────────────────────────────────────────────────────────────────────────────┘

Hover State: Lightening

Hover states use OKLCH to preserve hue while increasing lightness.
┌─────────────────────────────────────────────────────────────────────────────────┐
│  HOVER STATE COLOR DERIVATION                                                   │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                 │
│   WHY OKLCH FOR HOVER?                                                          │
│   ====================                                                          │
│                                                                                 │
│   1. HUE PRESERVATION: OKLCH mixing with white preserves hue angle              │
│   2. PREDICTABLE LIGHTENING: L value increases proportionally                   │
│   3. NO CHROMA SHIFT: Maintains saturation while lightening                     │
│                                                                                 │
│   VISUAL EXAMPLE:                                                               │
│                                                                                 │
│   DEFAULT (55% Lightness)              HOVER (~63% Lightness)                   │
│   ########################             ....################....                 │
│   Stable color                         Lightened, hue intact                    │
│                                                                                 │
│   The blue stays blue - just brighter!                                          │
│                                                                                 │
└─────────────────────────────────────────────────────────────────────────────────┘

Warning Exception

Warning uses 10% instead of 15% white.
┌─────────────────────────────────────────────────────────────────────────────────┐
│  WARNING HOVER EXCEPTION                                                        │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                 │
│   Normal Colors:    DEFAULT  +15% white ->  HOVER                               │
│   Warning Color:    DEFAULT  +10% white ->  HOVER                               │
│                                                                                 │
│   Why? Warning already has higher lightness (65% vs 55%)                        │
│   Adding 15% white would wash it out                                            │
│                                                                                 │
│   Primary (55% L):   ########  -->  ..######..  (15% works)                     │
│   Warning (65% L):   ########  -->  ..######..  (10% needed)                    │
│                                                                                 │
└─────────────────────────────────────────────────────────────────────────────────┘

Active State: Darkening

Active states (mouse down, pressed) use OKLAB for perceptually uniform darkening.
┌─────────────────────────────────────────────────────────────────────────────────┐
│  ACTIVE STATE DERIVATION                                                        │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                 │
│   WHY OKLAB FOR ACTIVE?                                                         │
│   =====================                                                         │
│                                                                                 │
│   1. PERCEPTUAL DARKENING: OKLAB provides uniform perceived darkness            │
│   2. NO HUE ROTATION: Mixing with black in OKLAB preserves hue better           │
│   3. PREDICTABLE CONTRAST: Linear relationship with added darkness              │
│                                                                                 │
│   STATE PROGRESSION:                                                            │
│                                                                                 │
│   HOVER          DEFAULT         ACTIVE                                         │
│   ....####....   ############   ################                                │
│   (lighter)      (base)          (darker)                                       │
│   ~63% L         55% L           ~44% L                                         │
│                                                                                 │
│   ^ +15% white   baseline        v +20% black                                   │
│                                                                                 │
└─────────────────────────────────────────────────────────────────────────────────┘

Disabled State: Desaturation

Disabled states communicate non-interactivity through reduced chroma.
┌─────────────────────────────────────────────────────────────────────────────────┐
│  DISABLED STATE DERIVATION                                                      │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                 │
│   WHY OKLAB WITH GRAY?                                                          │
│   ====================                                                          │
│                                                                                 │
│   1. PERCEPTUAL DESATURATION: Mixing with gray reduces chroma uniformly         │
│   2. HUE HINT PRESERVED: Original color is still slightly visible               │
│   3. UNIVERSAL SIGNAL: Gray = inactive in UI convention                         │
│                                                                                 │
│   EXAMPLE:                                                                      │
│                                                                                 │
│   ENABLED                           DISABLED                                    │
│   ########################          ........................                    │
│   100% chroma                       40% chroma (60% gray)                       │
│   Full saturation                   Desaturated                                 │
│   Interactive                       Non-interactive                             │
│                                                                                 │
│   cursor: pointer                   cursor: not-allowed                         │
│                                                                                 │
└─────────────────────────────────────────────────────────────────────────────────┘

Theme-Specific State Inversions

Light and dark themes handle hover differently!
┌─────────────────────────────────────────────────────────────────────────────────┐
│  THEME-SPECIFIC STATE COLORS                                                    │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                 │
│   DARK THEME:                                                                   │
│   ===========                                                                   │
│                                                                                 │
│   DEFAULT         HOVER                                                         │
│   ############    ..############..                                              │
│   Base            LIGHTER (more visible)                                        │
│                                                                                 │
│   LIGHT THEME:                                                                  │
│   ============                                                                  │
│                                                                                 │
│   DEFAULT         HOVER                                                         │
│   ############    ##############..                                              │
│   Base            DARKER (more contrast)                                        │
│                                                                                 │
│   WHY THE INVERSION?                                                            │
│   ==================                                                            │
│                                                                                 │
│   Dark theme:  lighter = more visible = better feedback                         │
│   Light theme: darker = more contrast = better feedback                         │
│                                                                                 │
│   The goal is always "MORE VISIBLE ON HOVER"                                    │
│                                                                                 │
└─────────────────────────────────────────────────────────────────────────────────┘

Color Space Selection Rules

┌─────────────────────────────────────────────────────────────────────────────────┐
│  STATE COLOR SPACE SELECTION RULES                                              │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                 │
│   USE OKLCH FOR:                                                                │
│   ===============                                                               │
│                                                                                 │
│   * Hover states with white (hue preservation)                                  │
│   * Any adjustment where HUE must be preserved exactly                          │
│   * Lightness adjustments on identity colors                                    │
│                                                                                 │
│   ┌───────────────────────────┐                                                 │
│   │ Hover = OKLCH             │                                                 │
│   │ "Keep the color identity" │                                                 │
│   └───────────────────────────┘                                                 │
│                                                                                 │
│   USE OKLAB FOR:                                                                │
│   ===============                                                               │
│                                                                                 │
│   * Active states with black (uniform darkening)                                │
│   * Disabled states with gray (uniform desaturation)                            │
│   * Transparency mixing                                                         │
│   * Any blending operation between two colors                                   │
│                                                                                 │
│   ┌───────────────────────────┐                                                 │
│   │ Everything else = OKLAB   │                                                 │
│   │ "Blend smoothly"          │                                                 │
│   └───────────────────────────┘                                                 │
│                                                                                 │
│   MNEMONIC: "OKLCH for Identity, OKLAB for Blending"                            │
│                                                                                 │
└─────────────────────────────────────────────────────────────────────────────────┘

Summary: State Pattern Reference

┌─────────────────────────────────────────────────────────────────────────────────┐
│  STATE TRANSITION SUMMARY                                                       │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                 │
│   STATE       MODIFIER         SPACE    AMOUNT       VISUAL                     │
│   ───────     ────────         ─────    ──────       ──────────────────────     │
│   Default     None             OKLCH    100%         ################           │
│   Hover       + white          OKLCH    15%*         ....############....       │
│   Active      + black          OKLAB    20%          ##################         │
│   Disabled    + gray           OKLAB    60%          ................           │
│   Muted       + transparent    OKLAB    80%          ....####............       │
│                                                                                 │
│   * Warning uses 10% white (already light)                                      │
│                                                                                 │
└─────────────────────────────────────────────────────────────────────────────────┘

Muted Variants

Learn about muted background colors and semantic backgrounds