Your design is unreadable to every 12th man. Check the contrast right now
Main chat
A chat for vibe coders: news, guides, live cases, marketplace, and finding executors.
Open your latest layout and imagine that red and green look the same. Gray brown porridge. Your Remove button is the same temperature as the Save button. The revenue growth schedule is indistinguishable from the fall. Badge "mistake" - on the same wavelength with the badge "success".
This is neither hypothetical nor rare. Daltonism in one form or another is about every twelfth man and every two hundredth woman. For an audience of one hundred thousand men, that's about eight thousand people for whom your interface can be uncomfortable at best, dangerous at worst. And that's just color vision. Add in age-related declines in contrast sensitivity, people with migraines, those who watch screens in the sun, OLED gleaming in the street, cheap office monitors with killed calibration — and it turns out that “unreadable” is not a marginal scenario, but a mass one.
At the same time, most layouts undergo a review with the phrase “looks clean”. Because we look at them in perfect conditions: a calibrated monitor, a dark room, fresh eyes, normal color vision. And the product doesn't live there.
Why is this a design problem and not a “special case”
There is a convenient myth: accessibility is about “special users.” Blind, visually impaired, disabled people. Something separate, for which there is a separate team, a separate sprint and a separate checklist at the end of the quarter.
In practice, contrast blindness is not about disability. The eye is an imperfect sensor, and the conditions of use are almost always bad.
- A person reads an app on the subway, a face by a window, a screen in glare.
- The manager watches your dashboard through the sharing in Zoom, where the colors are compressed by the codec.
- The designer shows the layout to the customer from the projector, which has a contrast of 200: 1.
- The user has put a dark theme of the OS, and your application is forcefully light and slightly illuminates.
In all these scenarios, the same laws apply as in colorblindness: the difference between the two colors falls, and if it was kept only on the shade, it is no longer there.
What is contrast in a practical sense
Designers often confuse three different things and call it “contrast.”.
- Luminance contrast. How much lighter is one element than another. This is what WCAG and most plugins measure. This is the base currency of readability.
- Hue contrast. Red vs. green, blue vs. orange. It looks “contrast” to a healthy eye, but may completely disappear with color blindness or a poor monitor.
- *Saturation Contrast. Bright vs. Blind. The weakest of the three, easily breaks in the sun and in a dark theme.
The rule that should be hammered into the command: ** If the difference between the elements is kept only in the shade, there is none.** Seriously, consider it not. Color can be used as an additional signal, but not as the only one.
Quick check right now
Do not close this text, open your current project and spend two minutes.
- Take a screenshot of the key screen and translate it into black and white (in Figma – the Color Blind plugin, in the system – the filter “shades of gray”).
- Is it possible to distinguish an active button from an inactive one?
- Can you see which link is a link and which is a regular text?
- On the charts it is clear what line is, without legend and signatures?
- Are success/error/warning statuses distinguishable without color?
If you answered “no” or “not sure” to any of these questions, you’re not a question of aesthetics. You have a broken interface for a noticeable share of the audience.
Anti-patterns that occur almost everywhere
This is a short list of things that look normal on a review, but in reality quietly break the experience.
Color badges without icons and text
Green circle "online", red - "offline". Yellow in progress. No signature, no form, no icon. For a person with deuteranopia, these are just three gray circles of equal brightness. Treatment: Add either a signature, a shape (dot/square/triangle), or an icon inside.
Light gray text on white
Landing classic: subtitle with #B0B0B0 color on a white background because "the designer wanted hierarchy." Hierarchy has emerged, readability gone. On a laptop under the sun, this text disappears completely. The minimum for the main text is the contrast ratio of 4.5:1, for the large one - 3:1. This is not taste, this is the lower limit, below which the text is officially considered unreadable.
Charts in one shade
Five lines in five shades of blue. Beautiful on a dribbble, useless at work. If you need to distinguish lines, distinguish them by the shape of the stroke, thickness, markers on the points, and use the color as an additional signal. The same applies to cakes and stacks of similar flowers.
"Only in colour" in forms
The error field is illuminated with a red frame. No icon, no text under the field. A colorblind user sees a normal field and does not understand why the form is not sent. An error should always be expressed in at least two ways: color + text, or color + icon + text.
How to Incorporate Contrast Checking into the Workflow
The main mistake is to think of accessibility as the final checkmark before release. By the time the layout has gone into development, it is already expensive to remake the palette: color affects tokens, tokens on components, components on dozens of screens. Contrast should be a boundary condition at the entrance, not an edit at the exit.
A good rule of thumb is that a color that has not been tested should not physically be in the library. If Figma has Text/Tertiary with a contrast of 2.8:1, sooner or later someone uses it for the main text, because “it is in the system, so you can”.
Design system level
80% of the problems are solved here, because then designers just take ready-made tokens.
- Make explicit “background to text” pairs, not individual colors. Not
Gray/600, butText/OnSurface, which has a contrast toSurface/Default. - For each pair, put in the style description its contrast ratio and allowable text size. It's debunking the revue.
- Conditions (hover, disabled, focus) count separately.
Disabledalmost always violates 3:1 – which is fine, but then honestly note that it should not be used where the user is required to read the content. - Semantic colors (success, warning, error) duplicate the pair “color + icon”. In tokens, keep both entities close.
Layout level
- Each screen has one main layer of content. Check it first, then everything else.
- Any text on top of the image is a separate case. Darkening, gradient-substrate or bleaching is not “decoration”, but part of the requirements.
- Semi-transparency (
rgba(0,0,0,0.6)on dynamic background) check on the worst version of the substrate, not what lies in the layout.
Diagnosis: what and what to see
There are many tools, but really three modes are enough.
Simulating color blindness
Figma has plugins, Chrome has DevTools → Rendering → Emulate vision deficiencies. Run the screen through three modes: deuteranopia, protanopia, achromatopsia (completely gray). If in gray mode the interface remains workable - you are fine.
Numerical check of contrast
Any contraster (built into Figma, Stark, Contrast, devtools browser). It is important not to “get a green tick”, but to understand the thresholds:
- 4.5:1 - main text, small UI elements, icons that carry meaning.
- 3:1 - large text (from 18pt / 14pt bold), boundaries of interactive elements, focus rings.
- 1.5-2:1 - decorative separators, background elements that do not carry information.
Real conditions
Once a week, watch the layout not only on a calibrated monitor.
- Open the phone at maximum brightness and take it to the window.
- Open your phone at minimum brightness in a dark room.
- Share the screen in Zoom or Meet and see through the eyes of the viewer.
- Print the key screen in black and white on an office printer.
Each of these scenarios is a real user case, not paranoia.
Typical revision errors
“We have a dark topic, it’s okay.”
It often turns out that the light theme has been tested and the dark theme has not, because it was inverted on the last day. The dark theme is a separate palette, it has its own pairs and contrasts. Check both equally carefully.
"It's a decorative text."
Slogans in the hero, quotes, captions under illustrations - formally "decor", in fact they are read. If the text makes sense, the same rules apply to it as to the paragraph.
The designer agreed with the customer
The customer approves of a 27-inch IPS with perfect light. That's not an argument. The argument is numbers and simulations.
"The talking icon."
The icon without a signature is clear to you because you drew it. For the user, no. If the icon carries a critical meaning (status, action, error), there should be a signature or at least an accessible aria-label that the screen reader will read.
Questions for design review
Run each layout through this list. Not as a formality, but as a diagnosis.
- Did all of the text styles in the library go 4.5:1 or are clearly labeled "big text/decor"?
- Are button states (default, hover, disabled, focus) distinguishable without color?
- Any form error is expressed in at least two ways?
- Graphs and statuses remain readable in silver?
- The text over the picture is checked on the lightest and darkest zone of the substrate?
- Has the dark theme passed the same tests as the light?
- The focus ring is visible on all backgrounds where the component might be?
If one item is “not sure,” it’s a task, not a taste.
Segment summary
Availability by contrast is the cheapest at the token level and the most expensive at the finished product level. Embed verification into the system, hold its pair and number next to the color, and use simulations as a normal part of the job, not as a pre-launch ritual.
When contrast breaks down in production, not in layout
The most painful failures do not occur in a static image in Figma, but in a live interface: dynamic data, localization, dark theme, user content. This is no longer the task of “twisting the token”, it is the task of the process. Below are the scripts that regularly pop up for review, and how to close them without heroism.
Dynamic Content and UGC
The user downloads an avatar, banner, profile background. The designer has no control over what will come. So, on top of such content, you can not put “naked” text and count on luck.
What works:
- Mandatory substrate under the text: translucent layer, scrim or gradient with guaranteed contrast against white and against black background.
- Minimum size and weight of text that survives a noisy background.
- Spare solid background if the image is not loaded or is too bright.
Anti-pattern: “We’ll show a beautiful playholder for preview, and there will be any background in the sale.” It'll be any. Check on the cat tail screenshot, not the drain gradient.
Charts, charts, heat maps
Dashboard is a separate hell. Data series, legends, toltypes, comparison of periods. If the differences are only in shade, one in twelve analysts will not distinguish “revenue” from “return.”.
Minimum requirements:
- Different patterns or shapes of markers, not just color lines.
- Direct series signatures next to the line, not just in the legend sideways.
- Toults with an explicit indication of a series by a word rather than a point of the same color.
- A palette tested in gray mode as a separate artifact.
Conditions and animations
Contrast is not just static. Skeleton, spinner, progress, toast notification, real-time validation. Each state is a separate case.
- The Disabled button should look disabled, but the text on it is still readable – otherwise the user will not understand what is not available.
- A toast on a semi-transparent background should maintain contrast over both the light and dark content underneath.
- Focus animation should not be the only focus signal. Remove the animation, the ring must remain.
AI and MCP in contrast hygiene
More and more teams are now clinging Figma to the LLM via an MCP server or running layouts through visual models. It works, but not as it seems at first glance.
What AI is doing well
- It calculates the contrast on the tokens uploaded and compiles a library report in minutes, not a day.
- Finds inconsistencies: the same "secondary text" in different components with different meanings.
- It generates alternative palettes with specified thresholds for a brand color that cannot be changed.
- Writes a draft documentation on pairs of color and background, which is then brought by the designer.
Where AI is consistently wrong
- Does not understand the context: considers the caption contrast to the icon as "decorative", although it is critical status.
- Ignores the real substrate under the translucent layer and counts the contrast against the design background.
- The formal threshold of 4.5:1 passes confidently on pairs that merge in deuteranopia.
- Sounds good in the answer, but does not open the real sale - judges by the layout, which he was fed.
A workflow that doesn’t fall apart
- AI drives away the entire token library and tags pairs outside the thresholds.
- The designer manually looks at suspicious cases in the context of the component, not in a vacuum.
- Simulation of color blindness is a separate step, not trusted by the model.
- The decision and rationale are fixed in the design system with text, so that the next query to AI is based on your rules, not general ones.
The main risk of automation is the illusion of coverage. The green tick from the bot is perceived as “verified”, and the person stops looking. Make sure that the AI report is the entrance to the review, not its final.
How to explain the decision to the team
Contrast often loses in meetings, because the argument sounds like “Hydline should”. This is a weak position against “but beautiful and branded”. A strong position is built differently.
Turn it into money and risk
- "This shade of gray doesn't pass on a mobile in the sun" - weak.
- One in twelve men in our audience will not distinguish here the status of "paid" from "error." That’s a lot of support on the scale — a lot.
Don’t make up numbers, but link the contrast to the specific pain of the business: support, returns, legal risk, tenders, where availability is a formal requirement.
Show, not tell
Do not read the threshold of 4.5:1. Open the simulator and show the screen in gray mode next to the original. One screenshot of "this is what your CFO sees with deuteranopia" closes the discussion faster than ten slides.
Offer an alternative, not a ban
"You can't do that" is a dead end. “You can’t do that, but here are three options that keep the brand and get tested.” Keep 2-3 pairs in your pocket in advance, which are coordinated with the brand team and close typical scenarios.
Questions to Ask at the Review
- What task does the user break if the contrast breaks?
- What will a person with deuteranopia see on this screen?
- On what worst device and under what worst conditions have we tested this?
- If you remove the color, does the information remain?
- What is the default decision when the content is user-generated?
Outcome of the segment
The advanced level of contrast work is not more subtle palettes, but a wider scope of scenarios: dynamics, data, states, AI checks, conversation with the team. Tools speed up routine, but the decision remains with the person who saw the layout in gray mode, in the sun and the eyes of the teamlid with color blindness.
Checklist before sending the layout to the development
This is not the final availability check - this is the minimum below which the layout just doesn't leave for Jira. Run through it every screen that contains interactive or status.
Base layer
- All text/background pairs are checked on a real substrate, not a white artboard
- Text smaller than 18px passes the threshold of 4.5:1, large – 3:1
- Icons that carry meaning pass 3:1 to the background
- Focus, hover, active, disabled states checked separately
- Disabled elements are distinguishable from active elements not only in color
- Placeholder in the field is not used as the only label
Colour and meaning
- Statuses (success, error, warning) are duplicated by an icon or text
- The charts are read in black and white
- References in the text differ from ordinary text not only in color
- Required fields are marked not only with a red star
- Palette tested in deuteranopia and protanopia simulator
Dynamics and context
- The text on top of the photo and video has a substrate, gradient or trimming
- Buttons on color banners are checked separately, not by default from the library
- User-generated content (avatars, covers) accounted for in the worst-case scenario
- The dark theme is a separate test, not a light inversion
- The layout is looked at on the phone in bright light, not just on the 27 monitor
Anti-patterns that regularly skip to the review
These are not rare cases. This is what is caught in every second product, if you open it with the eyes of a person who looks at the contrast consciously.
Gray on gray for air
The caption #999 against the background of #F5F5F5 looks elegant in layout and unreadable on a matte-screen laptop. If you want air, add indentation instead of reducing contrast.
Brand color as the only signal
"The active tab is highlighted in branded blue." There is no active tab for a person with protanopia. Duplicate the line, fat or icon.
Contrast "in a fresh eye"
The designer looks at his layout for the eighth hour in a row with a monitor brightness of 80%. After a day in the client’s office at 30% brightness and the sun in the window the same screen looks different. Check for a cold head and someone else’s device.
"Rectify in development."
We can't fix it. The developer will substitute a token from the design system, and if the token is broken in the system, it is broken everywhere. Contrast is treated at the source, not at a specific screen.
Dark theme by inversion method
White became black, black became white, grays floated, an accent color on a dark background now burns the eyes. The dark theme is a separate palette with separate thresholds, not a filter.
Disabled that looks like it is pressed
A gray button with white text and a gray button with slightly darker text do not distinguish between “unavailable” and “accessible but boring”. Minimum: icon, cursor, tultip with cause.
Questions for a review of contrast
These questions are worth asking not only yourself, but also the author of the layout on design criticism. They translate the conversation from “like/dislike” to a user-generated script.
- Where will this screen meet the user for the first time: office, subway, warehouse, street?
- What is the minimum threshold for this product and why is it?
- What happens if user-generated content is three times longer and more contrasting than the layout?
- Which pairs of colors in this screen duplicate the meaning, and which carry it alone?
- If tomorrow the brand changes its primary color, what checks will it have to run again?
- Who in the team last discovered this flow in a colorblind simulator?
- In which component of the design system is the problem stitched when it is repeated on five screens?
Short practical outcome
Contrast is not a taste category or a line from the availability checklist. It's about whether it makes sense to the person who looks at your screen in imperfect conditions and not with the same vision as the author of the layout.
The working practice is simple. Thresholds are sewn into tokens, not heads. Each color choice has a double meaning – shape, icon, text. Dynamic substrates and user-generated content are laid in the worst-case scenario, not the average. AI and plugins remove routine, but the decision is made by the person who saw the screen in gray mode and on the phone in the sun. And at every revue, the same question is raised: what does the twelfth man see here.
If this question is asked out of habit, the product is in a different league than most.