Build an Accessible Color Palette by Assigning Roles First
Choose surfaces, text, links and state colors as tested pairs, with calculated examples and a handoff checklist.
Updated : Replaced unsupported prevalence claims and approximate badges with computed role-specific examples.
An accessible palette is a set of usable relationships, not a row of attractive swatches. Start by naming the jobs: page surface, body text, muted text, link, button fill, button label and error message. Then test the pairs that actually touch. A color can succeed in one role and fail in another.
Establish the reading surface
A reproducible text and background example.
Same pair, larger text.
#1F2937 / #FFFFFF
A dark body-text candidate on a white page surface.
14.679118:1 WCAG contrast; 101.4834 Lc APCA.
Normal-text AA: Pass. Large-text AA: Pass. Labels apply to text contrast only.
Reproduce this pair and try a fixKeep this pair as a reference while introducing accent colors. If the default reading experience is stable, decorative choices are easier to evaluate. Check a card surface separately when it differs from the page background; inherited text tokens do not automatically preserve the same ratio.
Treat muted text as readable text
A reproducible text and background example.
Same pair, larger text.
#9CA3AF / #FFFFFF
A muted-looking candidate that needs a stronger foreground for ordinary body-size text.
2.538841:1 WCAG contrast; 49.7710 Lc APCA.
Normal-text AA: Fail. Large-text AA: Fail. Labels apply to text contrast only.
Reproduce this pair and try a fixA hint can be less prominent without becoming difficult to read. Try smaller spacing changes, reduced emphasis or a different weight before making the color much paler. If the hint contains information needed to complete a form, record it in the contrast inventory just like the label.
Assign accents to tested roles
A reproducible text and background example.
Same pair, larger text.
#FFFFFF / #2563EB
White label on a blue button fill. Use the calculated result for the actual text category.
5.168556:1 WCAG contrast; -80.2479 Lc APCA.
Normal-text AA: Pass. Large-text AA: Pass. Labels apply to text contrast only.
Reproduce this pair and try a fixA button introduces at least two relationships: label against fill, and the control or its identifying cue against its surroundings. Do not reuse the text result as a check of the button boundary. Test hover and focus arrangements on the surfaces where the component appears.
Do not make color carry the message alone
An error should have a readable message and an identifying cue, such as an icon or explicit label. A selected item can have a checkmark or a structural change. In a chart, labels and patterns can preserve meaning when colors are hard to distinguish. A color-vision simulation can support review but cannot establish that every person will interpret the design correctly.
Prepare a palette handoff
- •Name each token by role and show its intended surface.
- •List allowed foreground/background pairs and their checked text category.
- •Mark decorative accents so they are not accidentally used for small labels.
- •Record hover, focus, selected and error-state checks.
- •Include the exact values and a reproducible result link.
Build the swatches in Palette Studio, then use the contrast checker for each required pair.
The result is a small set of documented decisions. When a surface or text token changes, retest its listed relationships instead of guessing which screens may have been affected.