Original data

37.1% of the brand accents we measured fail WCAG AA with white text

By Yao Xiangqian · · 6 min read · data: CSV

We pulled the dominant accent colour out of the CSS on 70 well-known homepages and checked it against WCAG 2.2. With white text — the default label colour on most brand buttons — 37.1% of accents (26 of 70) fail the 4.5:1 requirement, and 14 fail even the 3:1 large-text threshold. With black text, the picture inverts almost completely: 0 accents fail both. The colour is rarely the problem; the label colour is.

70homepages measured
37.1%accent fails AA with white text
14fail even 3:1 (large text)
0fail with both black and white

Why the label colour matters more than the brand colour

Contrast is symmetric but not symmetric in practice: designers pick white labels on brand buttons far more often than black, because white reads as "clean" on a saturated surface. The measurement says that instinct takes a mid-tone accent and drops it below the normal-text threshold.

Take a mid blue at #2560FF: 5.00:1 with white, which passes. Now the same hue one step lighter, #3B82F6: 3.68:1 — still fine to the eye, and below 4.5:1 on paper. The colour did not get worse; the pairing did.

How the sample behaves

Share of accents by contrast with white text below 3:1: fails AA at every size 20% 3–4.49:1: large text only 17.1% 4.5–6.99:1: passes AA 44.3% 7:1+: passes AAA 18.6%
Each bar is one contrast band; the value is the share of the 70 measured accents.
Accent contrast against white textsitesshare
below 3:1 — fails AA at every size1420%
3–4.49:1 — large text only1217.1%
4.5–6.99:1 — passes AA3144.3%
7:1+ — passes AAA1318.6%

The second row is the expensive one: 12 accents sit between 3:1 and 4.5:1. They look correct on a bright monitor and fail for body-size labels, which is exactly the zone that survives design review and ships.

By hue: warm and light accents are the ones that break

Share of accents passing AA 4.5:1 with white text, by hue band Yellow (45–70°) (n=2) 0% Green (70–165°) (n=9) 33.3% Cyan (165–200°) (n=2) 0% Orange (15–45°) (n=10) 20% Red (345–15°) (n=9) 44.4% Blue (200–260°) (n=33) 90.9% Purple (260–345°) (n=5) 100%
Pass rate at 4.5:1 with white text, by hue. Bands with fewer than two sites are omitted.
Hue bandnmedian contrast with whitepasses 4.5:1 with white
Yellow (45–70°)21.26:10%
Green (70–165°)92:133.3%
Cyan (165–200°)22.54:10%
Orange (15–45°)103.26:120%
Red (345–15°)94.36:144.4%
Blue (200–260°)335.37:190.9%
Purple (260–345°)59.5:1100%

Yellow, green and cyan accents are close to unusable as a white-text surface — the median yellow in this sample scores 1.26:1, which is effectively invisible. Blue is the only band where a majority of accents can carry white text, which explains why it stays the default accent of the web. The practical rule: the lighter or more saturated toward yellow the accent, the more likely the label should be near-black.

By category (small n, read as direction)

Categorynmedian with whitepasses 4.5:1fails 3:1
SaaS143.42:142.9%4
Social44.93:150%0
Devtools204.43:150%6
Education24:150%1
Travel34.58:166.7%0
Media84.71:175%2
AI46.47:175%0
Fintech76.04:185.7%1
Enterprise34.94:1100%0
Ecommerce55.89:1100%0

SaaS and dev-tool sites — the categories with the most design-system investment — are also the ones whose accents most often fail with white text, because they favour vivid indigo and violet accents. Categories with two or three sites move entirely on one domain; do not rank them.

Five accents at the bottom of the distribution

CategoryAccentwith whitewith black
Site 1Fintech#CCFF001.18:117.87:1
Site 2Devtools#FEEC7B1.2:117.5:1
Site 3SaaS#FFE01B1.32:115.93:1
Site 4SaaS#B4D1FF1.55:113.5:1
Site 5Devtools#1CE7831.64:112.81:1

Sites are numbered rather than named. The number is a property of the extracted colour, not a verdict on the brand, and a single CSS token is a thin basis for naming anyone. Note the last column: every one of these accents is perfectly readable with black text.

Five that carry white text well

CategoryAccentwith whitewith black
Site 1Devtools#000C2A19.34:11.09:1
Site 2Social#16182317.66:11.19:1
Site 3AI#141C2E17:11.24:1
Site 4Fintech#11223116.19:11.3:1
Site 5SaaS#172B4D14.1:11.49:1

If your accent is in the failing band

  1. Try the label colour first. Switch white to #111827. It costs nothing, keeps the brand colour, and clears 4.5:1 for most mid-tone accents.
  2. Then darken the hue, not replace it. A 12–18% lightness reduction in OKLCH usually lifts a mid-tone accent past 4.5:1 while staying recognisable.
  3. Split the token. Keep the pure brand colour for large text and decorative fills; ship a darkened step as --brand-text for body-size labels and links.
  4. Do not rely on the eye. Every failure above was invisible to the person who shipped it. Measure the pair, not the swatch — you can do it in the contrast checker.
  5. Build the ramp up front. A ten-step scale from one hex gives you a compliant step for each state; the shades generator produces it in one click.

Method

  1. Fetched each homepage and up to three linked stylesheets on 2026-11-11.
  2. Counted every declared colour: hex, rgb()/rgba(), inline SVG fill, CSS colour keywords.
  3. Kept chromatic candidates (saturation ≥ 0.30, lightness 0.12–0.88) and took the most frequent as the accent.
  4. Weighted an explicit meta name="theme-color" six times — that tag is the site's own statement of its brand colour.
  5. Computed WCAG 2.2 contrast with the relative-luminance formula against white and black.

Limits. 26 of 96 sites were dropped: bot protection (HTTP 403/429), a page whose colour lives only in an image, or no chromatic declaration at all. This measures a declared CSS colour, not a rendered button, so treat it as a proxy for brand-colour legibility rather than a component-level audit. The sample is hand-picked well-known domains, not a traffic-weighted ranking.

Download the CSV (70 rows)
node tools/brand-contrast-study.mjs .   # crawl + measure
node tools/gen-study-article.mjs .      # rebuild this page from the data