Palette Generator

Harmonies built from one seed colour, with a full ramp from light to dark.

Palette

Click a swatch to copy its hex. Hovering tells you nothing, so if you want to compare two of them, copy rather than squint — the label under each square is the nearest colour name, which is what you will end up writing in the ticket anyway.

Shades and tints

The same hue and saturation walked from 6% lightness to 96% in even steps, which is the closest thing to a neutral scale you can build from a single seed. Click any step to copy it.

Seed
Harmony
Ramp
Seed on white

Seed colour

Everything on this page is derived from this one value by rotating its hue and shifting its lightness. Nothing is picked at random after this point, so the same seed always produces the same palette.

Harmony

30°

The distance between neighbouring colours, applied to analogous and split-complement. Under 20° the neighbours read as one muddy colour; past 45° they stop being neighbours and the palette starts to look accidental.

Contrast nudge

The nudge walks lightness down one point at a time and stops at the first value that genuinely clears 4.5:1 against white. Hue and saturation are untouched, so the result is still recognisably the colour you chose, taken far enough down to carry text.

Lightness carries it, hue only decorates

Five colours at the same lightness read as flat, however far apart the hues are. The reason is that the eye sorts a scene by brightness before it sorts it by colour — luminance is what defines edges, depth and hierarchy, and hue is what comes after that has been settled. A palette with a wide spread of lightness looks designed even when the hues are dull; a palette of vivid hues at one lightness looks like a colour wheel that has been rotated.

The practical version of this is to decide the lightness of each role before choosing any hue. Something has to be the darkest thing on the page and something the lightest, and the pair that matters most — text on its background — has to be far enough apart on that axis to read. Once those positions are fixed, the hues can be moved around them more or less freely, which is what makes a brand colour change a smaller job than it sounds.

A tint and a shade are not two colours. The same hue at 92% lightness and at 20% is one colour at two positions on a ramp, and listing them as separate palette entries is how a set grows past fifteen while still having nothing for a disabled button. Count the roles, not the swatches. If two entries are the same hue at different lightnesses, they are the same entry with two steps and belong on one row.

Nine steps, and what each one is for

A ramp is a tool rather than a decoration, and it works because each step has a job waiting for it. Nine is the honest minimum: fewer than that and two adjacent steps stop being visibly different, more and you are maintaining colours nobody can tell apart.

50, 100   page backgrounds, tinted panels, hover fills
      200, 300  borders, dividers, input outlines
      400, 500  the mid range — icons, muted text, chart fills
      600, 700  interactive fills: buttons, links, the accent itself
      800, 900  headings and body text on a light surface

      Each step is worth roughly one visible change. Two steps
      apart reads as a different colour; one step apart reads as
      the same colour in slightly different light, which is what
      hover states are for.

The scale exists so those decisions are made once. A team that has a ramp reaches for 600 for a button and stops thinking; a team without one re-decides the button on every screen, and ends up with four blues that are nearly but not quite the same. The ramp is not about having more colours — it is about not having the same argument repeatedly.

The greys carry the interface

Everything that is not a brand moment is a grey: text, borders, dividers, input outlines, hover fills, table stripes, disabled states, the surfaces things sit on. That is most of the pixels on most screens, and it is the part of a palette that gets skipped, because a neutral ramp is not interesting to choose. The habit of reaching for the brand hue at low opacity instead produces something that looks almost right: a page where every element is faintly tinted, and nothing is ever quite neutral enough to get out of the way.

The gap between a surface and a raised surface is a small-number problem worth its own decision. A card that differs from the page behind it by a couple of percent of lightness has no edge and reads as a printing error; one that differs by too much bands, and the page looks like it is made of stacked paper. Somewhere in the middle there is a step that reads as raised without being loud, and it is usually nearer the small end than people expect.

Disabled states are the other one that goes wrong, and always in the same direction. A disabled control is meant to be visibly out of service while staying legible, and the usual treatment — fading the whole thing to a low opacity — takes text that was already at the contrast floor and drops it below. A disabled button nobody can read is a broken button, whatever the exemption in the guidelines says.

Name a colour by its job

A token called blue-600 describes the value. A token called --accent describes the role, and the difference shows up the first time the brand changes: every call site that says blue-600 is now a lie, and every one that says --accent gets a different value. The name is the part of a palette that outlives the colours, so it is worth getting right before there are four hundred references to it.

Roles also make the failures visible. A palette organised by role has a slot for the muted text on a dark surface and a slot for the accent on a tinted panel, so a missing one is obvious — there is nowhere to put the value, which is the moment to notice that the pair has never been checked. Organised by hue, the same gap is invisible until someone needs it. Every text-on-surface pair here is worth passing through the Contrast Checker before it reaches a review, since a muted grey that clears the threshold on the page background will not clear it on a card.

Reference

How many colours a palette actually needs

RoleHow manyWhat it is forThe mistake people make
Base1The one colour every other value is derived fromChosen from a logo or a moodboard, then asked to carry a whole interface
Neutral ramp8 to 10 stepsText, borders, dividers, surfaces and disabled statesSkipped, with the brand hue at low opacity standing in for grey
Text1Body copy on the page's own backgroundChosen by eye as a soft grey rather than by contrast ratio
Muted text1Labels, captions, timestamps and help textThe muted value reused on a darker surface, where it no longer passes
Surface1The page background that everything else rests onTaken straight from the brand hue, so every screen looks tinted
Raised surface1Menus, modals and popovers that sit above the pageA gap so small the card edge vanishes, or so large that it bands
Accent1 or 2The thing on screen meant to be pressed or noticedA third and fourth accent, after which nothing reads as the accent
Semantic set3Success, warning and danger statesHue alone as the signal, which fails anyone who cannot separate red from green

A palette is a budget of roles rather than a collection of hues, and most of that budget goes on the parts nobody shows anyone. Spend it on the greys first and the interesting colours have somewhere to sit.

The word palette suggests a set of colours, and that is the first thing to unlearn. What a palette really is, though, is a set of jobs: something to write on, something to write with, something to separate two areas, something to press. That is why a set with an unglamorous grey in it can carry an entire product while a harmony of five hues and no greys cannot carry a form.

The greys carry most of the interface, which is why they get skipped. Text, borders, dividers, input outlines, hover fills, disabled buttons, table stripes: none of those want to be your brand hue, and all of them will be decided hundreds of times. A full ramp settles them once and stops the question coming back.

Two more habits save time later. A tint and a shade of the same hue are not two colours; they are one colour at two lightnesses, and filing them as separate entries is how a palette grows past ten with nothing to show for it. And every text-on-surface pair in the set has to be checked rather than assumed: a muted grey that passes on the page background will fail the moment it lands on a card, and the failure is invisible on a bright monitor.

Questions

Palettes, answered plainly

What's the difference between split-complement and triadic?

Both give you three hues. Triadic spaces them 120° apart — three colours of genuinely equal weight, which is lively and hard to balance, because nothing in the set is subordinate. Split-complement takes the complement and splits it in two, so you get one dominant hue and two near-neighbours on the opposite side. For an interface, split-complement is the easier set to live with: the accent is obvious and the second colour is optional.

Why do the pale steps lose saturation?

Because a fully saturated colour at 92% lightness is not a tint of your colour, it is a warning label. Real tints drop chroma as they approach white — the pigment has been diluted, not just brightened. Easing saturation down over the top third of the ramp is what makes the pale end usable as a background, a hover state, or a disabled fill.

What does the contrast nudge change?

Lightness, and nothing else. It walks the seed down one point at a time and stops at the first value whose relative luminance clears 4.5:1 against white, which is the threshold for body text. Hue and saturation are held, so the adjusted colour is the same colour, darker. If the seed already clears 4.5:1, it says so and leaves it alone.

How many steps should a ramp have?

Nine is the honest minimum for a usable scale and the point at which two adjacent steps are still visibly different. A 50-to-900 token scale is ten steps with the ends reserved: 50 and 100 for backgrounds, 600 and 700 for interactive fills, 900 for text. More steps than that and you are maintaining colours nobody can tell apart.

Why does my palette look flat?

Almost always because every colour sits at roughly the same lightness. Hue variety is the thing people reach for and lightness spread is the thing that actually carries a palette — a set of five colours at 60% lightness reads as flat no matter how far apart the hues are. Push two of them to 25% and one to 85% and the same hues will suddenly look designed.

Is five colours enough for a whole site?

Usually yes, provided the greys are doing their job. Five hues plus a neutral ramp covers a marketing page comfortably, and what runs out first is contrast rather than colour — the accent that reads on white will not read on a dark hero. If a site seems to need a sixth hue, the gap is more often a missing surface or a missing disabled state. This generator hands you a harmony and a ramp; the neutral scale is yours to build, and building it first makes five look generous.

Why do my tints all look the same?

Because evenly spaced HSL lightness is not evenly spaced to the eye. Stepping lightness by equal amounts gives steps that look large near black and tiny near white, so the pale end of a ramp built that way collapses into a row of near-identical pastels. The fix is to step lightness in a perceptual space such as OKLCH or Lab, where equal numbers are equal visual jumps. The ramp on this page is an even HSL walk, which is why its top steps sit so close together.

Should dark mode be the same palette inverted?

No. Inverting a light palette puts large areas of near-white text on near-black and produces glare, and it turns every grey you placed into a value you did not choose. A dark interface needs its own surfaces — dark, but not black — its own text colour, which is not white, and accents that are slightly desaturated, because a saturated colour that sits well on white will vibrate on a dark ground. Keep the hues and rebuild the lightness scale for the dark end.