APCA vs WCAG 2: A practical guide for designers and design systems

By LJK CreativeUpdated 12 min read
Stylized illustration of a split eye contrasting numeric and perceptual contrast measurement

TL;DR

WCAG 2 contrastis a numeric ratio between two colors' relative luminances, between 1:1 and 21:1. It's the current published accessibility standard and what most compliance regimes audit against — but it's a poor predictor of perceived readability, especially for light text on dark surfaces. APCA (Accessible Perceptual Contrast Algorithm) replaces the ratio with a signed Lc value derived from a perceptual model of human vision. It produces more consistent results across hues and polarities and was being explored for WCAG 3. Use WCAG 2 for legal compliance; use APCA to tune scales for actual readability.

1. What is “contrast”, exactly?

Contrast is the difference in lightness between two colors — typically text and its background. High contrast means text is easy to distinguish; low contrast means it blurs into the background. Reading is essentially a contrast-detection task, so contrast is the single biggest accessibility lever in typography.

The hard part is quantifying contrast in a way that matches what humans actually perceive. Two systems try to do that — both standardized, both used in practice, and they disagree meaningfully in some common cases.

2. WCAG 2: the current standard

The Web Content Accessibility Guidelines 2.2 — published as a W3C Recommendation in October 2023 — keeps the same contrast formula that shipped with WCAG 2.0 in 2008. Two colors are converted to relative luminance (a single brightness number derived from sRGB), and the contrast is a simple ratio:

contrast = (L_lighter + 0.05) / (L_darker + 0.05)

That ratio runs from 1:1 (identical colors) to 21:1 (pure black on pure white). WCAG 2 then defines pass/fail thresholds:

LevelNormal textLarge text (18pt+ or 14pt bold)
AA4.5 : 13 : 1
AAA7 : 14.5 : 1

AA is what most legal accessibility regimes audit against — the US ADA (via DOJ guidance), Section 508, and the European Accessibility Act all effectively require WCAG 2 AA for digital products. AAA is aspirational.

The model has well-documented shortcomings: it ignores the polarityof the contrast (light-on-dark and dark-on-light come out the same), it treats all hues as if they perceive equally (so saturated mid-blues can fail ratios that they look perfectly readable at), and the simple luminance math doesn't account for spatial frequency — the fact that thin, light fonts are much harder to read at the same ratio than heavy, large ones.

3. APCA: the perceptual alternative

The Accessible Perceptual Contrast Algorithm (APCA), developed by Andrew Somers, models how the human visual system actually perceives lightness differences. Instead of a ratio, APCA produces a signed Lcvalue — read as “Lightness contrast” — in the rough range of −108 to +106.

The sign tells you the polarity:

  • Positive Lc — dark text on a light background (e.g. black on white ≈ +106)
  • Negative Lc — light text on a dark background (e.g. white on black ≈ −108)

The magnitude tells you how strong the contrast is, perceptually. APCA's full conformance model uses lookup tables that map required Lc to specific combinations of font size and weight, but its Bronze Simple Mode defines a small set of threshold levels that approximate WCAG 2-style rules:

Lc levelUse
|Lc| ≥ 75Minimum for columns of body text at 14px/700, 16px/500, 18px/400, or 24px/300 (the rough WCAG 2 AA equivalent)
|Lc| ≥ 60Minimum for content text that isn't body, column, or block text — labels, UI strings, short copy
|Lc| ≥ 45Minimum for larger, heavier text (36px regular weight or 24px bold) such as headlines
|Lc| ≤ 90Suggested maximum(not minimum) for very large bold fonts (>36px bold) and large areas of color — higher than this can make extremely bold text harder to read

APCA also explicitly models spatial frequency: the same Lc value passes a 24px bold heading but fails a 12px light body. That's closer to how readability actually works.

4. Where they disagree

The two systems agree on extremes — pure black-on-white and pure white-on-black look great to both. The interesting cases are the middle, where APCA and WCAG 2 give meaningfully different verdicts. Three common patterns:

Light text on dark backgrounds

WCAG 2's ratio is polarity-blind, so it tells you white text on a 600-step blue is “the same contrast” as the same blue on white text. Human vision disagrees: the dark- mode version reads noticeably harder. APCA reflects that with a smaller Lc magnitude in the negative-polarity direction.

Saturated mid-blues

A saturated, mid-tone blue can hit a WCAG 2 ratio that looks fine on screen but flags as a fail because the luminance math undervalues how the eye perceives short-wavelength light. Conversely, some saturated reds and yellows pass WCAG 2 but are perceptually low-contrast. APCA's perceptual model evens this out across hues.

Thin / light-weight fonts

Two text blocks at the same WCAG 2 ratio can be very differently readable depending on font weight. APCA bakes weight and size into its required-Lc lookup, which means a design system that defines “text should be at least Lc 75” can actually rely on that rule landing readable results.

5. When to design against each

For most teams the answer is “both, for different reasons.”

  • Use WCAG 2 AA as your legal floor.If a regulator, contract, or procurement audit cares about accessibility, that's the standard they'll measure against. Run automated checks against it.
  • Use APCA to tune perceived readability. WCAG 2 will tell you a combination “passes”, but it won't tell you it's harder to read than it needs to be. APCA gives you a perceptual budget you can optimize against.
  • Use APCA when designing the dark-mode half of your palette. This is where WCAG 2 is most inconsistent and where most product surfaces actually live in 2026.
  • Don't use APCA as a compliance argument. Until a perceptual contrast model is adopted into a normative standard and incorporated by regulators, APCA is a design-quality tool, not a compliance one.

6. How Palette Daddy uses APCA

Palette Daddy ships with two algorithms for generating its 11-step color scales:

  • Tailwind mode— replicates the visual character of Tailwind CSS' default scales. Vibrant, balanced, optimized for visual appeal first.
  • APCA mode— tunes the lightness of each step so that text-color choices land at consistent Lc values across hues. The 600 step on a blue scale gives roughly the same APCA Lc against white text as the 600 step on a red scale, which means a single design-system rule (“use 600 for primary action backgrounds”) produces consistent readability everywhere.

Try the same input color in both modes on the generator and switch between light and dark previews to see the difference.

7. Frequently asked questions

Is APCA replacing WCAG 2 contrast?
Not yet, and not on any committed timeline. WCAG 2.2 — published as a W3C Recommendation in October 2023 — is the current published guideline and uses the legacy luminance-ratio contrast model. APCA was explored in earlier drafts of WCAG 3 (the next major version, originally drafted under the codename Silver) but was removed from the WCAG 3 working draft in July 2023, when exploratory content that hadn't gained Working Group support within six months was procedurally dropped. The contrast algorithm for WCAG 3 is currently undetermined, and WCAG 3 itself remains a working draft with no expected Recommendation date (industry estimates run 2028–2030). Until then, WCAG 2 remains the legal standard in most jurisdictions.
Do I have to use APCA?
No. Most compliance regimes — including the ADA (US), Section 508 (US federal), and the European Accessibility Act — point at WCAG 2.x AA, which uses the luminance ratio. If you're designing for legal compliance, WCAG 2 is what gets audited. APCA is the better predictor of perceived readability, especially for body text on dark backgrounds and for hue extremes, so many design systems use both.
Why does APCA give different answers for light text on dark vs dark text on light?
Because human vision is asymmetric. We perceive contrast differently when text is darker than its background (positive polarity) versus when text is lighter (negative polarity). APCA models that asymmetry directly — its Lc values are signed, and the lookup tables for minimum font weight and size differ for positive and negative polarity. WCAG 2 ignores polarity entirely; the ratio comes out the same either way.
Can I use both APCA and WCAG 2 in the same design system?
Yes, and it's often the most pragmatic approach. Use WCAG 2 ratios as the floor for legal compliance, then use APCA Lc values to tune perceived readability — especially across hues and on dark surfaces where WCAG 2 is known to be inconsistent. Palette Daddy's APCA mode tunes scales so that the same step (say, 600) lands at a consistent Lc against white text regardless of hue, which makes a system-wide readability rule possible.
What's the APCA Lc value I should target?
APCA uses a lookup-table approach rather than a single number — required Lc depends on font size and weight. Its Bronze Simple Mode defines simple thresholds: |Lc| ≥ 75 for columns of body text (the rough WCAG 2 AA equivalent), |Lc| ≥ 60 for content text that isn't body/column/block (labels, UI strings), and |Lc| ≥ 45 for larger heavier text like headlines. Lc 90 is a suggested maximum for very large bold text and large color areas, not a minimum. Consult the official APCA Readability Criterion tables linked below before locking thresholds for a design system.

8. Further reading

Try APCA-tuned scales in Palette Daddy

Pick a color, switch the algorithm to APCA, and ship the resulting 11-step scale to Figma Token Studio in one click.

Open the generator