Accessibility
APCA Contrast
WCAG 2.1 asks: is the luminance ratio above 4.5:1? APCA asks: can a human actually read this text at this size, weight, and polarity? The difference is not academic. It changes which color pairs pass and which fail. Explore pairs, build a token palette, export with contrast data baked in.
Pixel's Design Studio
APCA
Explore contrast pairs with APCA's perceptual model. Build a token system with every pair measured. Export as W3C Design Tokens or CSS custom properties.
Color pair
Headline — 24px
Body text at 16px. The paragraph is the unit of thought.
Small text at 12px — captions, metadata, footnotes.
APCA contrast
WCAG 2.x vs APCA
WCAG 2.x (legacy)
APCA (perceptual)
44px / 100
28px / 200
Perception
Spatial frequency — why size matters
Human vision filters high spatial frequencies. Small text is high-frequency. Low contrast + small size = invisible. WCAG cannot model this. APCA can.
The blur simulates spatial frequency filtering at distance. Small text disappears first — exactly what APCA predicts. Slide to see 12px vanish while 48px survives.
Polarity
Polarity test
WCAG returns the same ratio regardless of direction. APCA treats them differently — because human vision does.
Font size / weight matrix
Every cell shows whether this size + weight combination is safe at the current Lc.
| Size | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 |
|---|---|---|---|---|---|---|---|---|---|
| 10px | 44 | 28 | 19 | 16 | 15 | 14 | 14 | 16 | 18 |
| 12px | 44 | 28 | 19 | 16 | 15 | 14 | 14 | 16 | 18 |
| 14px | 44 | 28 | 19 | 16 | 15 | Aa | Aa | 16 | 18 |
| 16px | 44 | 28 | 19 | Aa | Aa | Aa | Aa | Aa | 18 |
| 18px | 44 | 28 | 19 | Aa | Aa | Aa | Aa | Aa | Aa |
| 21px | 44 | 28 | Aa | Aa | Aa | Aa | Aa | Aa | Aa |
| 24px | 44 | 28 | Aa | Aa | Aa | Aa | Aa | Aa | Aa |
| 28px | 44 | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa |
| 32px | 44 | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa |
| 36px | 44 | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa |
| 48px | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa |
| 60px | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa |
| 72px | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa |
| 96px | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa | Aa |
Add to token system
Promote the current pair to your token palette.
Why APCA Exists
WCAG 2.1 contrast ratios use a simple formula: relative luminance of the lighter
color divided by the darker. It works symmetrically — #767676
on white and white on #767676
produce the same 4.54:1 ratio. Human vision does not work symmetrically. Dark text
on a light background is easier to read than the reverse. WCAG ignores this.
APCA (Accessible Perceptual Contrast Algorithm) models what the visual cortex actually does. It accounts for polarity (dark-on-light vs. light-on-dark), spatial frequency (small text needs more contrast than large text), and font weight (bold text is more legible at lower contrast). The result is a single number — Lc (Lightness Contrast) — that maps directly to readability.
The practical consequence: some pairs that pass WCAG fail APCA. Some that fail WCAG pass APCA. If you have ever looked at a "passing" gray-on-white combination and thought "nobody can read that," APCA is the reason you were right.
Lc Thresholds
Lc 75+ — Body Text
The floor for readable paragraph text at 16px or smaller. Below this, sustained reading becomes effortful. Most users will not notice the effort — they will notice that they stopped reading.
Lc 60+ — Content Text
Subheadings, secondary content, descriptions. Text the user scans rather than reads continuously. Size typically 14–18px. Weight 400–500.
Lc 45+ — Large Text
Headlines, display type, hero sections. Text above 24px or bold above 18px. The eye processes large glyphs differently — spatial frequency is lower, less contrast is needed.
Lc 30+ — Non-Text
Icons, focus rings, active borders. Visual elements that communicate state but are not read as text. Below Lc 30, even non-text elements become unreliable for users with reduced contrast sensitivity.
Polarity Matters
Dark text on a light background produces a positive Lc value. Light text on dark
produces negative Lc. The absolute values are not equivalent —
Lc +60 is more readable
than Lc -60 at the same
size. For dark-mode interfaces, you need higher absolute Lc to match light-mode
readability. This is biology, not preference.
From Pairs to System
The System tab lets you define tokens (text, surface, accent) and generates a contrast matrix — every text color against every surface. Export as W3C Design Tokens or CSS custom properties. The contrast data travels with the tokens, so the system enforces what the designer intended.