Brand system

Brand Color Picker

A brand color is one decision. A brand color system is a set of decisions about action, surface, text and state. Start with the color you love, then make the rest of the system earn its place.

Short answer

Use a brand color picker to choose an anchor color, then assign it to roles and test it against real text and surface pairs. A single HEX value is not a brand system; the roles and contrast checks are what make it usable.

A primary brand swatch surrounded by semantic roles for action, surface, text and status colors

Live theme

Preview a complete light and dark theme

Choose a sample palette, switch themes, and copy the CSS variables a real component library consumes.

Light
BrandHueDocsPricingGet started
Color system

A theme that holds up in both modes.

Surfaces, borders and text pairs are generated from the same palette. Switch the theme and compare the hierarchy.

Primary actionSecondary
Monthly reportUpdated today
+24.8%
Conversion8.4%
Activation62%

Semantic roles

Contrast checks

Light body text16.15:1AA
Light muted text16.15:1AA
Light primary button5.97:1AA
Dark body text15.46:1AA
Dark muted text15.46:1AA
Dark primary button9.3:1AA
Copy the theme
CSS variables
:root {
  --color-primary: #3B6C64;
  --color-primary-foreground: #FFFFFF;
  --color-secondary: #C8904A;
  --color-accent: #915A46;
  --color-neutral: #20261F;
  --color-background: #F8F4EA;
  --color-surface: #FCFAF6;
  --color-text: #111827;
  --color-muted-text: #111827;
  --color-border: #BCBAB1;
  --color-success: #16A34A;
  --color-warning: #C8904A;
  --color-danger: #DC2626;
}

[data-theme="dark"] {
  --color-background: #20261F;
  --color-surface: #151A1C;
  --color-text: #FFFFFF;
  --color-muted-text: #FFFFFF;
  --color-border: #20261F;
  --color-primary: #95C5BE;
  --color-primary-foreground: #111827;
}
shadcn theme
:root {
  --background: #F8F4EA;
  --foreground: #111827;
  --card: #FCFAF6;
  --card-foreground: #111827;
  --primary: #3B6C64;
  --primary-foreground: #FFFFFF;
  --secondary: #C8904A;
  --secondary-foreground: #111827;
  --accent: #915A46;
  --accent-foreground: #FFFFFF;
  --muted: #FAF7F0;
  --muted-foreground: #111827;
  --border: #BCBAB1;
  --destructive: #DC2626;
  --destructive-foreground: #FFFFFF;
  --ring: #3B6C64;
}

.dark {
  --background: #20261F;
  --foreground: #FFFFFF;
  --card: #151A1C;
  --card-foreground: #FFFFFF;
  --primary: #95C5BE;
  --primary-foreground: #111827;
  --secondary: #C8904A;
  --secondary-foreground: #111827;
  --accent: #CAA091;
  --accent-foreground: #111827;
  --muted: #1B201E;
  --muted-foreground: #FFFFFF;
  --border: #20261F;
  --destructive: #DC2626;
  --destructive-foreground: #FFFFFF;
  --ring: #95C5BE;
}
Figma tokens
{
  "color": {
    "primary": {
      "value": "#3B6C64",
      "type": "color"
    },
    "secondary": {
      "value": "#C8904A",
      "type": "color"
    },
    "accent": {
      "value": "#915A46",
      "type": "color"
    },
    "neutral": {
      "value": "#20261F",
      "type": "color"
    },
    "background": {
      "value": "#F8F4EA",
      "type": "color"
    },
    "surface": {
      "value": "#FCFAF6",
      "type": "color"
    },
    "text": {
      "value": "#111827",
      "type": "color"
    },
    "mutedText": {
      "value": "#111827",
      "type": "color"
    },
    "success": {
      "value": "#16A34A",
      "type": "color"
    },
    "warning": {
      "value": "#C8904A",
      "type": "color"
    },
    "danger": {
      "value": "#DC2626",
      "type": "color"
    }
  },
  "dark": {
    "background": {
      "value": "#20261F",
      "type": "color"
    },
    "surface": {
      "value": "#151A1C",
      "type": "color"
    },
    "text": {
      "value": "#FFFFFF",
      "type": "color"
    },
    "mutedText": {
      "value": "#FFFFFF",
      "type": "color"
    }
  }
}
OKLCH tokens
{
  "primary": "oklch(49.41% 0.0551 182.3)",
  "secondary": "oklch(69.42% 0.1102 70.3)",
  "accent": "oklch(52.41% 0.0792 40.7)",
  "neutral": "oklch(26.01% 0.0155 141.1)",
  "background": "oklch(96.75% 0.0139 88.7)",
  "foreground": "oklch(21.01% 0.0318 264.7)",
  "surface": "oklch(98.55% 0.0057 84.6)",
  "success": "oklch(62.71% 0.1699 149.2)",
  "warning": "oklch(69.42% 0.1102 70.3)",
  "danger": "oklch(57.71% 0.2152 27.3)"
}
Keep this palette

Email a private link to reopen it and its CSS, Tailwind, shadcn, Figma and OKLCH exports.

No account. We store the palette colors and your email, never the image.

A brand color is not a palette

Most brand conversations start with a single color. The color is memorable, it appears in the logo, and everyone has an opinion about it. But a product interface needs more than one color. It needs a background that recedes, a surface that groups content, a text color that stays readable, and state colors that communicate without relying on hue alone.

The single brand color usually becomes the primary action color, but not always. A bright yellow may be perfect for a logo and terrible for a button with white text. In that case, the yellow stays as an accent or a brand surface, and a darker companion becomes the action color.

The job of a brand color picker is not to choose one perfect HEX value. It is to choose an anchor and then build a system that can carry it.

Pick from evidence, not taste alone

A brand color should come from somewhere: a product photo, a logo, a material, a place, a piece of packaging, or a deliberate strategic choice. When the color has a source, it is easier to defend and easier to extend.

PhotoColors is useful here because it extracts colors from an actual image. You can upload the product photo, the logo, or the moodboard that started the conversation and see which colors are really present. That turns a subjective debate into a shared reference.

Taste still matters. The extractor gives you evidence; you decide which color deserves to lead. But the decision is now anchored in something the whole team can see.

The five decisions a brand palette must answer

First, what is the primary action color? It should be distinguishable from the background and readable with its foreground text. Second, what is the page background? It should recede and give the content room.

Third, what is the surface color? Cards, panels and modals need to separate from the page without creating a harsh outline. Fourth, what is the text color? Body text needs at least 4.5:1 contrast against the background for WCAG AA.

Fifth, what are the status colors? Success, warning and danger need to be distinguishable from each other and from the primary action. If the brand color is green, a green success state may disappear. In that case, use an icon or a label as well as color.

  • Primary action: the color people click.
  • Background: the calmest surface on the page.
  • Surface: cards, panels and grouped content.
  • Text: readable at body size, not just at display size.
  • Status: success, warning and danger, reinforced with text or icons.

Test the palette in context

A palette that looks good in a swatch strip can fall apart in a real screen. Test it with a heading, a paragraph, a button, a card, a border and a muted label. Test it in light and dark mode. Test it at mobile width.

The most common failure is a primary color that only works on white. On a dark surface, the same color may vibrate or lose contrast. A good brand system includes a dark-mode variant of the primary color, not just an inverted background.

PhotoColors previews both themes and reports the measured contrast ratios. Use the preview as a first pass, then test the final palette in your actual product.

When to break the rules

Accessibility thresholds are a floor, not a ceiling. A palette can pass every check and still feel cold, generic or wrong for the brand. The rules tell you when a design is likely to fail real users; they do not tell you what the brand should feel like.

There are legitimate cases for low-contrast decorative text, large display type, disabled states and brand photography. The key is intent. If a low-contrast element is decorative, mark it as decorative. If it is content, make it readable.

A brand system is strongest when the accessible choice and the expressive choice point in the same direction. That is the sweet spot the palette should aim for.

FAQ

Brand Color Picker FAQ

How do I choose a brand color?

Start with evidence such as a logo, product photo or material, then choose an anchor color and test it in real interface roles. The anchor should be memorable, but the system around it is what makes it usable.

Should my brand color be the button color?

Often, but not always. If the brand color cannot support readable button text, use it as an accent or surface and choose a darker or lighter companion for actions.

How many colors does a brand palette need?

A practical starting point is one primary, one or two supporting colors, a neutral family and three status colors. More colors are fine if each one has a job.

Can I use the same palette in dark mode?

You can reuse the brand colors, but the surfaces and some accents usually need adjustment. Dark mode is a separate contrast contract, not a simple inversion.

Does PhotoColors save my brand palette?

Only if you request a saved-kit email. The palette colors and email address are stored for 14 days. The source image is never stored.