Case study

Accessible Palette Case Study

This article follows one five-color sample palette from a visual reference through contrast review, rejected combinations, and final CSS token decisions.

Last Reviewed

2026-10-01

How This Was Tested

The palette was extracted from the sample visual below, reviewed with HexAnyTool, and checked again with contrast math before the final tokens were written.

Goal

Choose which colors can become text, surface, or highlight tokens without losing accessibility.

Sample visual used for extraction

Instead of using a brand image with copyright limits, this walkthrough uses a sample landing-page composition created for the article. It contains a dark hero, a green accent, a warm highlight, and two neutral surface colors.

Sample landing page composition with dark blue hero, green accent button, gold badge, and warm neutral surfaces
The sample visual intentionally includes both strong accents and large neutral areas so the review has meaningful tradeoffs.

Extracted palette

The first extraction returned `#17324D`, `#2F6F5E`, `#D9A441`, `#E8E1D4`, and `#F7F5F0`. Those values are useful because they span one dark text candidate, one strong accent, one decorative highlight, and two light surfaces.

Extracted color Initial role Reason to keep reviewing
#17324DText candidateDark enough to test against both light surfaces.
#2F6F5EAccent candidateStrong but still muted enough to consider for UI controls.
#D9A441Highlight onlyLikely decorative, but still worth checking for badges.
#E8E1D4Secondary surfaceWarm neutral that can divide content zones.
#F7F5F0Page backgroundQuiet base for the other four colors.

Contrast review before approval

The first decision was not which color looked nicest. It was which pairings could survive real text use. The table below shows the combinations that were checked before any token was approved.

Pair Ratio Decision Why
#17324D on #F7F5F0 12.05:1 Accepted Safe for body text and headings.
#2F6F5E on #F7F5F0 5.42:1 Accepted with role limit Strong enough for links, buttons, and short labels.
#D9A441 on #F7F5F0 2.06:1 Rejected for text Useful as a badge fill or decorative border only.
#F7F5F0 on #17324D 12.05:1 Accepted Suitable for hero text on the dark surface.

Rejected combinations still matter

The failed gold-on-cream pairing was not wasted work. It clarified that `#D9A441` should stay decorative instead of becoming a primary label token. That single rejection prevented a misleading highlight color from spreading into buttons and text styles.

This is the main reason to treat extraction as a review process rather than a copy-paste shortcut. The fastest palette is not always the safest one.

Final token set after review

:root {
  --color-page-background: #F7F5F0;
  --color-surface-secondary: #E8E1D4;
  --color-text-primary: #17324D;
  --color-accent-brand: #2F6F5E;
  --color-highlight-decorative: #D9A441;
}

The naming shows the outcome of the review. Only one color became decorative-only, one became the main accent, and the darkest tone became the stable text token.

What to copy into your own workflow

  1. 1. Keep the extracted palette and the final token set separate.
  2. 2. Record rejected text pairings, not only the accepted ones.
  3. 3. Promote a color to a reusable token only after its likely foreground and background pairings are tested.
Try the image extractor Review contrast rules Back to guides