How Do You Build a Colour Palette That Actually Works Together?

colour palette — Chunky Munster

A colour palette works when every colour has a job. Start with one base colour, add a few supporting roles, and test the set against real UI states before you lock it in. If you want a quick way to see combinations instead of guessing in your head, give our free colour palette generator a spin.

Start with roles, not random swatches

The fastest way to build a usable palette is to define what the colours must do. A product UI usually needs a brand colour, a strong accent, a few neutral surfaces, and semantic colours for success, warning, and error states. If you skip the roles and just collect colours you like, you get visual noise with no hierarchy.

Think in terms of interface structure. The background should stay out of the way, text should stay readable, and the action colour should be loud only where it matters. That separation makes the system easier to maintain, especially once multiple screens and components start reusing the same values.

A simple starting set looks like this:

That is enough for a lot of dashboards, SaaS apps, and marketing sites. You can always extend later, but if the first five colours do not work together, more colours will not save the design.

Use contrast as a constraint, not an afterthought

A palette can look stylish and still fail in production. The common failure mode is low contrast: light gray text on slightly lighter gray panels, or a button colour that disappears on the chosen background. Readability matters before aesthetics, because no one enjoys squinting at a polished interface.

For text and interactive elements, check the contrast between foreground and background early. If your palette generator gives you a set that feels balanced but the labels vanish on cards or buttons, the palette is not actually working. This is where a companion checker helps; Chunky Munster also has a colour contrast checker if you want to verify accessibility while you iterate.

Practical rule: reserve the highest contrast pairings for text, icons, and critical actions. Use medium contrast for borders and secondary UI chrome. Save the low-contrast combinations for decorative details, because decorative details are where low contrast belongs.

Readable first, pretty second. In UI work, that order saves time.

If you are designing for both light and dark themes, test the palette in both modes. A colour that feels calm on white can turn radioactive on near-black, and a shade that works as a button fill in light mode may look muddy in dark mode.

Balance temperature and saturation

A good colour palette usually has one thing in common: it does not fight itself. If every colour is highly saturated, the interface feels tense. If everything is muted, the interface feels flat and generic.

Temperature matters too. Warm colours tend to advance visually; cool colours tend to recede. That gives you a useful lever: a warm accent can pull attention to a primary action, while cooler surfaces can keep the overall layout from feeling crowded.

The same applies to saturation. Use one or two vivid colours, then keep the rest restrained. That contrast in intensity creates hierarchy without needing a dozen distinct hues.

A practical workflow is to pick one anchor colour, then derive the rest by adjusting lightness and saturation instead of wandering into unrelated hues. If you need the raw hue values while you work, the hex colour picker can help you inspect and copy exact values without leaving the browser.

You will usually get cleaner results when your neutrals have a slight bias. Cool grays can feel more technical, warm grays can feel more editorial, and off-whites can keep a page from looking sterile. Tiny shifts like that make a palette feel deliberate instead of default.

Design for hierarchy and state changes

A palette is not just a list of colours. It is a language for priority. The first thing users should notice is the action that matters most, not every decorative accent fighting for attention.

That means mapping colours to states. Buttons, alerts, hover states, disabled states, and active navigation should all have predictable treatment. If the same blue means “brand,” “link,” “selected,” and “info message,” you have made the system harder to learn.

For developers, this is easiest when the palette becomes tokens. Keep the raw colour values separate from their meaning, then assign them in CSS variables:

:root {
  --color-primary: #3b82f6;
  --color-primary-hover: #2563eb;
  --color-surface: #f8fafc;
  --color-text: #0f172a;
  --color-border: #cbd5e1;
  --color-success: #16a34a;
  --color-warning: #f59e0b;
  --color-danger: #dc2626;
}

That structure makes it much easier to switch themes later. If you decide the brand blue should be slightly less aggressive, you update one token and let the rest of the interface follow.

Semantic colour names are the difference between a maintainable system and a box of paint samples. Blue-500 is a value. Primary button background is a role. Roles age better.

Build palettes that survive real screens

Colours do not exist in isolation. They sit next to typography, spacing, imagery, and motion. A palette that looks sharp in a picker can fall apart once it meets screenshots, charts, and dense copy.

Test the palette against real components: cards, nav bars, tables, alerts, charts, form fields, and empty states. A chart palette, for example, needs enough separation between series to stay readable, but not so much saturation that the graph becomes a neon fence. A dashboard palette also needs quiet neutrals so the data can be the loud part.

When a palette is meant for content-heavy pages, keep body text and surface colours conservative. Save richer colour for headings, links, CTAs, or key labels. That gives the page room to breathe.

For chart work specifically, you want colours that remain distinguishable even when placed side by side. If two data series are close in hue but different only in brightness, they can collapse into each other on smaller screens. That is why a palette should be judged in context, not as a row of isolated chips.

A simple workflow for generating and refining a palette

Do it in stages. Pick the anchor colour first, then derive supporting colours, then check contrast, then test in a mock UI. That sequence is boring, but boring is good when the goal is a system people can actually use.

  1. Choose one base colour from your brand, product, or content tone.
  2. Generate a few related hues and neutrals.
  3. Map each colour to a role: primary, accent, surface, text, status.
  4. Check text contrast on light and dark backgrounds.
  5. Test it on a button, card, form, and alert before you commit.

That workflow works whether you are building a new design system or trying to fix an ugly one. It also helps when collaborating with non-designers, because roles are easier to discuss than abstract taste. Nobody has to argue about whether “this blue feels more modern”; you can ask whether the button is readable and whether the error state is obvious.

If you are exporting colours into code, keep the palette close to the implementation format you actually use. Hex is fine for CSS. HSL is often nicer for systematic adjustments. RGB is useful when you need to feed values into scripts or tokens.

Real-World Example

Here is a small worked example for a SaaS dashboard. The first version looks fine in a swatch grid, but it falls apart in use because the accent is too close to the primary, the surfaces are too flat, and the error colour is not distinct enough.

Before

Primary:   #4f46e5
Accent:    #4338ca
Surface:   #f5f7ff
Text:      #6b7280
Border:    #e5e7eb
Success:   #4ade80
Warning:   #fbbf24
Danger:    #f87171

The problem is subtle but real. The primary and accent are nearly the same mood, the text is weak on the surface colour, and the semantic states feel like afterthoughts. The result is a palette that technically works but does not guide the eye well.

Now tighten the roles and separate the values more aggressively:

After

Primary:         #2563eb
Primary Hover:    #1d4ed8
Accent:           #f97316
Surface:          #f8fafc
Surface Alt:      #e2e8f0
Text Primary:     #0f172a
Text Secondary:   #475569
Border:           #cbd5e1
Success:          #16a34a
Warning:          #d97706
Danger:           #dc2626

This version is easier to use because the roles are clearer. Blue owns navigation and primary actions, orange handles accent moments, and the neutrals are calm enough to carry dense information. The semantic colours are now visibly different, which makes alerts faster to scan.

If you were turning this into CSS, you might wire it up like this:

.button-primary {
  background: var(--color-primary);
  color: white;
}

.button-primary:hover {
  background: var(--color-primary-hover);
}

.alert-danger {
  border-left: 4px solid var(--color-danger);
  background: color-mix(in srgb, var(--color-danger) 10%, white);
}

That is the kind of palette that survives real product work. It has enough personality to feel branded, but it still behaves like a system.

Frequently Asked Questions

How many colours should be in a colour palette?

For most interfaces, start with 5 to 8 core colours: primary, secondary, accent, a few neutrals, and semantic colours. You can expand later, but a smaller system is easier to keep consistent. If a palette needs 20 colours to function, the roles probably need tightening.

What makes a colour palette look good together?

Colours look coherent when they share a clear relationship in hue, saturation, or lightness, and when each one has a distinct role. The best palettes also respect contrast, so text and actions stay readable. Random colours can be individually nice and still fail as a system.

How do you create a colour palette for a website?

Pick one brand or base colour first, then add neutrals for surfaces and text, plus one or two accent or semantic colours. Test the palette on actual UI elements like buttons, cards, forms, and alerts. A palette that only looks good as a swatch usually breaks once layout and copy are involved.

What is the difference between a colour palette and a colour scheme?

A colour palette is the actual set of colour values you use. A colour scheme is the broader strategy or relationship between those colours, such as monochrome, analogous, complementary, or triadic. In practice, you use the scheme to guide the palette, then refine the palette for the real interface.

Wrapping Up

A good colour palette is not a pile of nice hex codes. It is a system: one colour does the heavy lifting, a few colours support it, and neutrals keep the whole thing from yelling at the user. If the palette works in buttons, cards, forms, and alerts, then it actually works.

The next move is simple. Pick one base colour, define the roles, and test the palette in a real layout instead of trusting the swatches alone. If you want a fast place to explore combinations, use the colour palette generator and check what holds up once the colours have to do real work.

Keep the rule set boring and the results sharp. That is usually the sweet spot.

// try the tool
give our free colour palette generator a spin →
// related reading
← all posts