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