Color Scales & UI Palettes: The Practical Guide
A color scale is a run of ordered steps — conventionally numbered 50 to 900 — generated from one seed color, so that an entire palette derives from a handful of decisions instead of dozens of hand-picked values. The scale is to color what a type scale is to font sizes: a small system that answers most questions before they’re asked. This hub collects our guides on building and using them; the quickest orientation is to open a full ramp and see the anatomy.
One color in, a system out
The working method behind every guide here: you choose one brand color, and the machinery does the rest — ten steps placed on a lightness curve, saturation shaped so the middle glows and the ends stay usable, a neutral scale tinted faintly toward the brand hue, and functional colors for success, warning, error and info. What used to be forty hand-picked hex values becomes a handful of seeds and a set of rules you can inspect.
Stop Hand-Picking Colors makes the case for working this way, and Generating a Full Palette from One Brand Color walks the derivation end to end. The two rules doing most of the work each have a guide of their own: Lightness Curves on why even-looking steps can’t be numerically linear, and Chroma Profiles on where saturation should peak and why it must taper toward both ends. Building a Neutral Scale covers the faint brand tint that keeps grays from going dead. This is also the method Scale Composer implements — there the palette sits beside typography and grid, all three derived from one shared scale.
The steps are the vocabulary
The 50–900 numbering isn’t decoration — it’s what makes color discussable. “Use brand-100 for the tint and brand-700 for the text” is an instruction two people can execute identically. The guides below cover what the numbers mean, how many steps a scale needs, and why the difference between neighboring steps has to stay visible — a scale whose steps can’t be told apart is a vocabulary with synonyms nobody asked for.
Why Color Steps Are Named 50–900 traces the convention and the room its gaps deliberately leave, and Naming Color Tokens settles the brand-600 vs blue-600 question — the naming choice that decides how painful a future rebrand will be. The vocabulary earns its keep in interaction states too: Hover and Pressed States shows why “one step along the scale” produces better state colors than mixing black or white into the base.
Roles, not colors
The final layer is semantic: buttons, borders, backgrounds and text don’t reference raw steps — they reference roles that point at steps, with contrast requirements checked where the roles meet. That’s what makes a palette maintainable: retune the seed and every role follows, because nothing downstream ever hard-coded a hex value. Primary, Secondary, Accent covers the role layer for brand colors, Success, Warning, Error, Info covers feedback colors, and Text on Colored Buttons handles the pairing every product ships: picking the on-color. The color model that makes all of this computable has its own series in the OKLCH guide, and the same role thinking runs through design tokens; the thresholds the role pairs are checked against live in the contrast hub.
Guides in this hub
- Building a Neutral Scale That Isn't Dead Gray
A neutral color scale is the UI's workhorse: backgrounds, borders, disabled states, text. Ten gray steps mapped to jobs, with contrast notes and dark mode.
- Chroma Profiles: Where Saturation Should Peak
Color ramp saturation needs a plan, not a constant: where chroma should peak, bell vs front profiles compared, and the floor that keeps ramp ends on-brand.
- Deriving Supporting Colors from a Primary (Color Harmony)
How a color harmony generator derives supporting colors from one primary: why classical complements vibrate in UI, and why practical offsets flank them.
- From Figma Color Styles to Real Tokens
From Figma color styles to tokens: what styles and variables each solve, how primitive and semantic collections layer, and dark mode as a mode switch.
- Generating a Full Palette from One Brand Color
Deriving a full palette from brand color alone: seed ramp, tinted neutrals, supporting hues from hue geometry, functional colors, contrast-checked roles.
- Hover and Pressed States: Deriving Them from the Scale
Button hover color done right: hover and pressed states are neighboring steps on the color scale, not opacity filters — worked through in OKLCH.
- Lightness Curves: Why Linear Ramps Look Wrong
Color scale lightness can't be divided evenly: why linear ramps starve the light end, and how a piecewise curve tied to the type ratio spaces the steps.
- Migrating a Legacy Palette to Color Scales
How to refactor a color palette that grew by accident: inventory the hex sprawl, cluster values by role, seed fresh ramps, and map every legacy value.
- Naming Color Tokens: brand-600 vs blue-600
Color token naming in three layers: why brand-600 beats blue-600 at the primitive level, what semantic tokens add, and when component tokens earn a place.
- Primary, Secondary, Accent: Role-Based Color
Primary, secondary and accent colors are roles, not kinds of color: what each role does, when a palette needs secondaries at all, and how to derive them well.
- Stop Hand-Picking Colors: The Scale-First Method
How to choose UI colors without hand-picking each one: fix a seed, endpoints, curve and profile once, then let every value follow from the rules.
- Success, Warning, Error, Info: Functional Colors Done Right
Semantic colors in UI — success, warning, error, info — are ramps, not swatches. Tuning hue, chroma and lightness so all four feel native and pass contrast.
- Testing a Palette for Color Blindness
How to test a color blind palette: simulate protanopia, deuteranopia and tritanopia, find the hue pairs that collapse, and fix them with lightness.
- Text on Colored Buttons: Picking the On-Color
Button text color contrast is measured against the fill, not the page — why mid-lightness brands trap both white and black text, and how the on-color is derived.
- What Is a Color Ramp (Color Scale)?
What a color ramp is — one hue at ten ordered lightness steps — plus the anatomy: which steps do which UI jobs, and why ramps beat swatch-picking.
- Why Color Steps Are Named 50–900
Color scale numbers explained: where 50–900 came from, why numbers beat names like light and lighter, and why a 500 is a position, not a measurement.
- Why Max Saturation Backfires in UI
Why saturated colors backfire in UI: vibrating edges and eye strain, flattened hierarchy, harder text — and where full chroma actually earns its place.
See a rebrand in one move
The strongest argument for scales over swatches is watching a system retune: swap the seed color and watch everything re-derive — ramps, neutrals, and every step’s contrast relationships rebuild from the new seed in one motion. That, compressed to a sentence, is what this whole hub teaches: pick colors once, derive them forever.