Submitting a form only to see fields turn red or green — but you can’t tell which — is a frustrating experience.
TL;DR: Relying solely on color to convey information excludes millions of people with color vision deficiency (CVD). Using symbols, text labels, and patterns alongside color ensures accessibility and clarity for everyone.
This is the reality for roughly 300 million people worldwide with color vision deficiency (CVD), a condition where individuals have difficulty distinguishing certain colors.
Quick Stats
- 8% of men and 0.5% of women have some form of CVD.
- In a room of 20 people, odds are at least one person struggles with color-coded interfaces.
The Problem: Color Alone Isn’t Enough
We love color-coding. It’s fast, it’s intuitive, it feels natural:
- 🟢 Success
- 🔴 Error
- 🟡 Warning
But here’s what someone with deuteranopia (the most common form of red-green color vision deficiency) sees:
- 🟤 Success
- 🟤 Error
- 🟤 Warning
All the same. No distinction. No meaning.
This isn’t a niche problem. 8% of men and 0.5% of women have some form of CVD. In a room of 20 people, odds are at least one person struggles with color-coded interfaces.
Why This Matters Everywhere
Color-only coding shows up across digital experiences:
1. Form Validation
<!-- Bad: color-only validation -->
<input class="error" type="email" />
<input class="success" type="text" />
<!-- Good: symbols + color -->
<div>
<input type="email" aria-invalid="true" />
<span class="error-icon">❌</span>
<span class="error-text">Please enter a valid email</span>
</div>
<div>
<input type="text" aria-invalid="false" />
<span class="success-icon">✅</span>
</div>
Without the text and icons, CVD users can’t tell which fields need correction.
2. Status Indicators
E-commerce sites, dashboards, and admin panels are full of status badges:
- Order status: “Shipped” (green), “Cancelled” (red), “Pending” (yellow)
- Account status: “Active” (green), “Suspended” (red)
- Payment status: “Paid” (green), “Failed” (red), “Refunded” (orange)
If these rely on color alone, they become meaningless to CVD users.
Better approach:
<!-- Color + text label + icon -->
<span class="badge badge-success"> <CheckIcon /> Shipped </span>
<span class="badge badge-error"> <XIcon /> Cancelled </span>
<span class="badge badge-warning"> <ClockIcon /> Pending </span>
3. Data Visualizations
Charts and graphs frequently use color to distinguish data:
- Line charts with multiple colored lines
- Pie charts with colored segments
- Heat maps with color gradients
Solutions:
- Add patterns or textures (stripes, dots, hatching)
- Use direct labels instead of color-coded legends
- Provide data tables as an alternative view
- Use varying line styles (solid, dashed, dotted) in addition to color
4. Call-to-Action Buttons
Primary actions are often green (“Continue”, “Submit”, “Buy Now”) while destructive actions are red (“Delete”, “Cancel Order”). But if the only difference is color:
<!-- Bad: color-only distinction -->
<button class="btn-green">Continue</button>
<button class="btn-red">Delete Account</button>
<!-- Good: clear labeling + icons + placement -->
<button class="btn-primary">Continue →</button>
<button class="btn-destructive"><TrashIcon /> Delete Account</button>
The icon and explicit wording carry the weight, not the color.
5. Notification Systems
Toast notifications, alerts, and system messages:
// Bad: color-only
<Notification color="red">Action failed</Notification>
<Notification color="green">Saved successfully</Notification>
// Good: icon + color + clear message
<Notification icon={<AlertCircle />} variant="error">
Action failed: Unable to save changes
</Notification>
<Notification icon={<CheckCircle />} variant="success">
Saved successfully
</Notification>
Developer Tools: Logs and Terminals
In addition to general web UI, developers face color-only patterns constantly:
Terminal Output
# Color-only (inaccessible)
Build succeeded
Build failed
Warning: deprecated API
# Color + symbols (accessible)
✅ Build succeeded
❌ Build failed
⚠️ Warning: deprecated API
Without symbols, CVD users can’t distinguish success from failure.
Git Diffs
Standard git diffs use red and green:
- const oldValue = 'foo';
+ const newValue = 'bar';
For someone with protanopia or deuteranopia, these lines look identical. The + and - symbols are essential, not optional.
CI/CD Pipelines
Status indicators in GitHub Actions, CircleCI, Jenkins:
- ✅ Green checkmark (passed)
- ❌ Red X (failed)
- 🟡 Yellow circle (pending)
Remove the symbols and meaning disappears.
Emojis: The Unexpected Accessibility Win
This is where emojis shine.
In my previous post defending emojis in developer logs, I argued they improve scannability. But there’s a deeper benefit: emojis are inherently accessible symbols.
function logSuccess(message) {
log(`✅ ${message}`, colors.green);
}
function logError(message) {
log(`❌ ${message}`, colors.red);
}
function logWarning(message) {
log(`⚠️ ${message}`, colors.yellow);
}
Even if the terminal strips all color, the emojis remain:
✅ Build succeeded
❌ Build failed
⚠️ Warning: deprecated API
Meaning intact. No color required.
Emojis are language-agnostic, platform-independent symbols that work across cultures and accessibility needs. They’re not just decoration — they’re functional signifiers that transcend color perception.
This applies to web UI too:
// Status badges with emojis
<Badge>✅ Active</Badge>
<Badge>⚠️ Warning</Badge>
<Badge>❌ Suspended</Badge>
// Form feedback
<span>✅ Password strength: Strong</span>
<span>⚠️ Username already taken</span>
<span>❌ Invalid email format</span>
The emoji provides meaning independent of color.
Designing for Everyone
Accessible design isn’t “extra work.” It’s better design for everyone.
Here are practical guidelines:
✅ Do This
- Combine symbols and color (icons, emojis, text labels)
- Use patterns or textures in data visualizations (hatching, dots, stripes)
- Provide text alternatives for purely visual indicators
- Test interfaces with color vision deficiency (CVD) simulators
- Add explicit labels (“Error:”, “Success:”, “Warning:”)
- Use shape and position in addition to color
- Ensure sufficient text labels that explain the state
❌ Avoid This
- Color as the only differentiator
- Relying on red/green without additional cues
- Unlabeled status indicators
- Graphs with color-only legends
- Form validation that only changes border color
- Icon-only buttons where color is the only distinction
Real-World Examples
GitHub
GitHub’s PR status checks combine symbols and color:
- ✅ Green checkmark + “All checks have passed”
- ❌ Red X + “Some checks failed”
- 🟡 Yellow dot + “Checks pending”
Remove the color and you still know what’s happening.
Stripe’s Dashboard
Stripe uses badges with text labels (“Paid”, “Failed”, “Refunded”) alongside color. The text carries the meaning, color is supplementary.
Figma
Figma’s comment system uses:
- Icons (speech bubbles, checkmarks)
- Text labels (“Open”, “Resolved”)
- Color as enhancement
Material Design
Google’s Material Design components include:
- Explicit error text below form fields
- Icons in alert dialogs
- Text labels in chips and badges
- Loading spinners (animation, not just color)
Testing Your Interfaces
You don’t need to be color vision deficient (CVD) to test for accessibility:
- Use browser extensions: Chrome’s “Colorblind – Dalton” or “Colorblindly” simulate various types of CVD
- Desaturate your screen: Convert to grayscale and see if meaning is preserved
- Ask your users: If you have colleagues or users with CVD, get their feedback
- Automated tools: Lighthouse and axe DevTools check for color contrast, but manual testing catches symbol issues
- Print in black and white: Old-school but effective for catching color-only dependencies
The WCAG Standard
The Web Content Accessibility Guidelines (WCAG) explicitly address this:
Success Criterion 1.4.1: Use of Color (Level A)
Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.
This is a Level A requirement — the most basic level of accessibility. It’s not optional. It’s foundational.
The Takeaway
Color is powerful. It’s fast, it’s beautiful, it’s intuitive. But it’s not universal.
For 300 million people worldwide, red and green are the same. Yellow and blue blur together. Interfaces that rely solely on color exclude them entirely.
Symbols — whether icons, text labels, or even emojis — are the universal language. They work for everyone, regardless of color perception, language, or assistive technology.
So the next time you’re designing a form validation flow, a status indicator, a data visualization, or a terminal logger:
Don’t ask: “What color should this be?”
Ask instead: “What symbol represents this?”
Because the symbol is what matters. The color is just a nice bonus.
Accessibility is not just a technical requirement — it’s an act of empathy.