WCAG Contrast Requirements by UI Element

Pick any foreground and background pair, see live WCAG 2.1 AA and AAA results for normal text, large text, and UI components, and fix failing pairs in one click.

WCAG Contrast Requirements by UI Element

WCAG does not give one contrast number for a whole interface. Normal body text needs 4.5:1 for AA, large text such as headings needs 3:1, and the visible boundaries and states of controls, like a button outline or a focus ring, need 3:1 under the separate non-text contrast rule. Checking every pair against the strictest number rejects colors that comply, and checking a border against the text rows misses the rule that actually covers it.

The element decides the threshold, so this page is organized by element. Large text and headings come first, because that size cutoff is where most review disagreements start. Buttons and component states follow, then dark-mode text, where the dim grays that feel restful fail most often, and finally brand colors, which are usually chosen long before anyone checks them. Each section uses the same checker: enter the foreground and background, then read the Normal Text, Large Text or UI Component row that matches the element.

Run this check yourself in the WCAG Contrast Checker.

Open in the tool →

Checking Contrast for Large Text and Headings

A heading styled at 32 pixels can pass WCAG at a contrast ratio that would fail outright as body copy, and that gap trips up more design reviews than almost any other single rule in the guideline. WCAG defines large text as at least 18 point, which works out to 24 CSS pixels at regular weight, or roughly 14 point bold, close to 18.7 pixels, and grants that category a lower bar: 3:1 for AA instead of the 4.5:1 normal text needs, and 4.5:1 for AAA instead of 7:1. Knowing exactly where that size threshold sits, and checking a heading color against the right tier rather than the stricter one meant for paragraphs, is the difference between rejecting a perfectly compliant color and shipping it.

Run this check yourself in the WCAG Contrast Checker.

Open in the tool →

Finding the exact pixel size where the lower threshold kicks in

The 18-point and 14-point-bold definitions in the WCAG spec sound abstract until you convert them into the CSS pixel values a browser actually renders, which is where most of the confusion around this rule comes from. Point sizes are a print-era unit, and most designers today think entirely in pixels, so the guideline's own wording needs a translation step before it becomes actionable.

Converting point sizes into the CSS pixels your stylesheet uses

Eighteen point works out to 24 CSS pixels at regular font weight, using the standard 1 point equals 1.333 pixels conversion, while 14 point bold lands close to 18.7 pixels.1 A 24px regular heading and an 18px bold label both qualify for the large-text thresholds, while a 20px regular subheading, a size many design systems use, falls just short and still needs to clear the stricter normal-text bar. That single missing pixel is easy to overlook in a spec review, yet it decides which of two very different ratio requirements actually applies.

That size boundary matters because thicker, taller letterforms genuinely stay legible at lower contrast than the same color pair would at body-text size,1 which is the entire reasoning behind WCAG granting large text a lower bar in the first place rather than treating every visible pixel identically. Treating a headline and a caption as if they carried the same legibility risk would waste real design freedom on the headline for no accessibility benefit.

Bold weight lowers the size threshold, not the contrast requirement

Bumping a heading to bold weight, font-weight: bold or the numeric 700,2 lowers the pixel size needed to qualify as large text, from 24px down to roughly 18.7px, but it does not change the ratio target itself once a piece of text does qualify. It's a useful lever for a compact UI label that needs large-text treatment without taking up as much vertical space as a full 24px line.

A bold 19px label and a regular 24px headline both need the same 3:1 for AA, so weight is a tool for hitting the large-text size threshold at a smaller footprint, not a separate lever on the ratio requirement. Confuse the two and you either reject a compliant bold label for a threshold it never needed to meet, or approve a regular-weight one that actually needed the stricter bar.

Checking a heading color against the right threshold

Type your heading's exact foreground and background into the fields above and read the Large Text row specifically, not the Normal Text row, since the two apply completely different thresholds to the same colors.3 Reading the wrong row is the single most common mistake in a heading-contrast review, and it goes in both directions, rejecting valid colors and approving invalid ones equally often.

A color that fails as body text can be a legitimate heading choice

A muted slate gray like #808a9c against a white background lands around 3.5:1, comfortably clearing the large-text AA bar while falling well short of the 4.5:1 normal text needs.4 Type that exact pair into the fields above and both outcomes appear side by side in the same preview panel, one badge green and the other red for the identical two colors.

That's not a bug in the guideline or a loophole to exploit carefully; it's the intended outcome of a rule built around a real legibility difference between big, bold letterforms and small, dense body copy. Confirm the size and weight of the text you're actually shipping before you approve a color on the strength of the large-text row alone, since a heading style that later gets reused at a smaller size or lighter weight needs to be re-checked against the stricter thresholds.5

When to use this

Use this guide when choosing or auditing a heading, label, or any large-text element, whenever you need to confirm a color against the correct large-text threshold instead of the stricter bar meant for body copy.

Examples

A muted slate heading color that passes the tool's Large Text row but fails its Normal Text row

Before
Foreground #808a9c, background #ffffff
After
The Large Text (24px Bold) row clears AA at roughly 3.5:1, while the Normal Text (16px) row fails, since both rows render side by side for the same pair and only the large-text threshold is low enough to pass here.

A darker gray that clears both rows, not just the large-text one

Before
Foreground #6b7280, background #ffffff
After
This pair clears the Normal Text (16px) row at AA as well as the Large Text (24px Bold) row, so it works as a heading or as body copy without needing a separate check for either.
Sources
  1. 1.

    W3C, "Understanding Success Criterion 1.4.3: Contrast (Minimum)," w3.org, accessed August 2026. https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html

  2. 2.

    MDN Web Docs, "font-weight," developer.mozilla.org, accessed August 2026. https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight

  3. 3.

    WebAIM, "Contrast and Color Accessibility," webaim.org, accessed August 2026. https://webaim.org/articles/contrast/

  4. 4.

    W3C, "Web Content Accessibility Guidelines (WCAG) 2.1," w3.org, May 2025. https://www.w3.org/TR/WCAG21/

  5. 5.

    The A11Y Project, "Checklist," a11yproject.com, accessed August 2026. https://www.a11yproject.com/checklist/

FAQ

18 point regular weight, which converts to 24 CSS pixels, or 14 point bold, which lands close to 18.7 pixels. Text at or above either size and weight combination qualifies for the lower 3:1 AA and 4.5:1 AAA thresholds instead of the stricter normal-text bar.

Not at regular weight; it falls short of the 24px threshold and needs to clear the stricter 4.5:1 normal-text bar. Making that same subheading bold would qualify it, since bold text only needs to reach roughly 18.7px to count as large.

Yes, and this is one of the more commonly misunderstood parts of WCAG. A color scoring between 3:1 and 4.5:1 fails as normal text but is a completely valid, compliant choice for anything that qualifies as large text under the size and weight rules.

Yes. The color pair's ratio never changes, but which threshold applies depends entirely on the final rendered size and weight, so a color approved for a 32px heading needs a fresh check if it later gets reused for an 18px label.

No, since the tool has no way to see your actual CSS. It shows all three rows, normal text, large text, and UI components, side by side so you can read the one that matches the text size and weight you're actually shipping.

Because bigger, bolder letterforms stay legible at lower contrast than small body text does, a real perceptual difference the guideline accounts for rather than applying one strict number to every piece of visible text regardless of size.

Checking Contrast for Button and UI Component States

A button's fill color and label text usually get a careful contrast check before launch, but the border around an outline button, or the ring around a focus state, quietly gets skipped far more often. WCAG covers that gap under success criterion 1.4.11, the non-text contrast rule, which requires visible interface boundaries and states to reach 3:1 against their surrounding color,1 a separate and lower bar than the 4.5:1 body text needs. Testing a button's border, disabled state, and hover treatment here, one pair at a time, catches the interface elements a text-focused contrast review tends to walk right past.

Run this check yourself in the WCAG Contrast Checker.

Open in the tool →

The UI component row most contrast checks skip entirely

Most contrast audits focus on text, since that's where the highest-profile failures live, but WCAG's 1.4.11 criterion covers a different category: the visual boundaries and states of interface components like button outlines, input borders, and focus rings. A design review that checks every heading and paragraph but never opens this tool on a border color has only covered half of what WCAG actually requires.

Why default design-system grays often fail this specific threshold

A design system's default muted border color, chosen to look subtle and unobtrusive against a white background, is frequently the exact color that fails 1.4.11's 3:1 requirement.2 A slate gray border like #94a3b8 on white, for instance, reads as a soft, tasteful boundary to the eye while sitting well under the ratio the guideline actually requires, precisely because subtlety and sufficient contrast pull in opposite directions. Design teams rarely set out to fail this rule; they simply prioritize a quiet visual tone over a specific ratio number nobody checked.

The UI row in the preview panel above checks exactly this scenario. Unlike the text rows, it shows only a single AA badge, since WCAG defines no enhanced AAA tier for non-text contrast, meaning there's no stricter target to aim for beyond the one 3:1 bar every visible boundary needs to clear. Once that single badge turns green, the boundary color is done, with nothing further to chase toward a higher tier.

Hover and focus states need their own separate check

A button's default border is only the first check, not the last one. Hover, focus, and active states frequently swap in a different color entirely, and each of those states needs its own pass against 1.4.11 rather than inheriting a pass from the resting state. A design system that only checks the resting border and assumes every interactive variant inherits the same result is checking the easiest state and skipping the rest.

A focus ring in particular carries real accessibility weight, since keyboard users rely on it to track where they are on the page,3 which makes a low-contrast focus indicator a functional barrier, not just a cosmetic shortcoming. Someone tabbing through a long form with a faint focus ring can lose their place entirely, in a way a mouse user navigating the same page would never notice.

Disabled states and where WCAG intentionally looks away

Disabled controls occupy a genuine exception in WCAG's guidance: a button or input that is fully disabled, inert, and cannot be interacted with is not required to meet 1.4.11's contrast threshold at all,1 since a control a user cannot act on carries less risk from being visually faint. That exception is narrow and specific, not a blanket excuse to leave every muted gray in a design system unchecked.

The exception ends the moment a control becomes interactive again

That exception evaporates the instant the same element becomes interactive, whether that's a form field unlocking after a previous step or a submit button re-enabling once required fields are filled.4 Multi-step forms and wizard-style flows are the most common place this transition gets missed, since the disabled-state color was approved once and never revisited for the enabled version.

A gray so faint it's barely visible is a defensible choice while a button stays genuinely disabled, but the same color needs a real contrast check the moment it can be clicked, since at that point it's a functional control again, not a placeholder.5 Type that exact gray into the fields above the moment a control regains interactivity, rather than assuming the disabled-state shade was ever meant to double as the active one.

When to use this

Use this guide when auditing a button, input, or focus ring for WCAG success criterion 1.4.11, whenever you want to check a specific border or state color that a text-only contrast review would otherwise miss.

Examples

A slate-gray outline button border, checked against its white background

Before
Foreground #94a3b8, background #ffffff
After
The UI component row fails 3:1 here, even though the border reads as a tasteful, subtle line to the eye, which is exactly the kind of near-miss a visual review alone tends to approve.

The same border darkened one step to actually clear 1.4.11

Before
Foreground #64748b, background #ffffff
After
Darkening the border by roughly one design-token step is often enough to clear 3:1 without the boundary reading as heavy or out of place.

Compare this to the failing example above using the same background.

Sources
  1. 1.

    W3C, "Understanding Success Criterion 1.4.11: Non-text Contrast," w3.org, accessed August 2026. https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html

  2. 2.

    WebAIM, "Contrast and Color Accessibility," webaim.org, accessed August 2026. https://webaim.org/articles/contrast/

  3. 3.

    W3C, "Understanding Success Criterion 2.4.7: Focus Visible," w3.org, accessed August 2026. https://www.w3.org/WAI/WCAG21/Understanding/focus-visible.html

  4. 4.

    The A11Y Project, "Checklist," a11yproject.com, accessed August 2026. https://www.a11yproject.com/checklist/

  5. 5.

    Mozilla Developer Network, "ARIA: aria-disabled attribute," developer.mozilla.org, accessed August 2026. https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-disabled

FAQ

Success criterion 1.4.11 defines only a 3:1 requirement at the AA level, with no enhanced AAA tier for non-text contrast, so the UI row reflects the single real threshold that applies rather than inventing a stricter target that doesn't exist in the guideline.

Yes. Each visual state a component can be in counts as its own boundary or indicator under 1.4.11, so a border color that passes at rest can still fail once it changes color on hover or focus, and each one needs its own check.

Yes, while they remain genuinely disabled and non-interactive, WCAG doesn't require 1.4.11 compliance for them. That exemption ends the moment the same control becomes clickable again, at which point it needs a real check like any other active component.

Subtle, muted borders are often chosen specifically to look unobtrusive, which tends to land them below the 3:1 threshold 1.4.11 actually requires. A color that looks tastefully quiet to the eye and a color that clears this specific ratio are not the same thing.

Yes. CapyToolkit's checker uses one shared foreground and background color across the Normal Text, Large Text, and UI Component rows, so clicking Fix on the UI row changes that same color everywhere else in the preview too. The fix only has to clear the UI row's 3:1 target, though, which can still leave the stricter 4.5:1 Normal Text threshold failing.

Any meaningful graphical object needed to identify a control or convey its state, including input field borders, checkbox and radio outlines, toggle switches, and focus indicators, all fall under the same 3:1 non-text contrast requirement as a button border.

Checking Contrast for Dark-Mode UI Text

Dark mode looks effortless until you actually have to pick the gray that text sits on top of, and the wrong choice either burns a faint afterimage into a reader's eyes or fails WCAG outright. The relative luminance formula this tool runs works exactly the same whether your background is near-black or pure white, but designers regularly get dark-mode pairs wrong in a specific, predictable way: choosing a foreground gray dim enough to feel restful, then discovering it barely clears 3:1 instead of the 4.5:1 body text actually needs.1 A near-black background and a near-white foreground, like #121212 against #e0e0e0, is a safe, comfortably passing starting point worth understanding before you start narrowing the gap for aesthetic reasons.

Run this check yourself in the WCAG Contrast Checker.

Open in the tool →

Why dark mode tempts you toward failing contrast more than light mode does

Light-mode text almost always defaults toward black on white, a pairing so extreme that most designers would have to work hard to make it fail. Dark mode flips that instinct on its head, because pure white text on pure black can feel harsh and glary, especially in a dim room, so many interfaces deliberately soften both ends toward gray.

The gray-on-gray trap that fails more often than it should

That softening is exactly where trouble starts. A designer who lightens black to a comfortable charcoal and dims white to an easy-on-the-eyes off-white can end up with two colors that sit much closer together in relative luminance than either extreme would, sometimes without realizing how far the ratio dropped. Because both colors moved toward the middle of the brightness range at once, the contrast gap shrinks from both directions simultaneously, which is a faster way to fail than dimming just one side.

A safer approach keeps the background genuinely dark, close to true black, while giving the foreground more room to breathe than it would need against pure white. Material Design's widely used dark-theme baseline of a #121212 background against roughly 87% white text works for exactly this reason:2 the background stays dark enough to avoid glare while the foreground stays light enough to clear AAA with room to spare.

Testing your own dark palette before you commit to it

Type your candidate background and text colors into the fields above and read the Normal Text row specifically, since that is the threshold most of your body copy actually needs to clear. The Large Text row still matters for headings inside the same dark palette, but it is a separate, more forgiving check worth reading on its own.

If the badge shows a fail or a bare AA pass and you'd rather have more headroom, click Fix text to see the closest lighter foreground that reaches AAA without drifting off your original hue, which the tool's OKLab-based search handles automatically,3 letting you keep the same general gray rather than jumping to an unrelated color.

Reading the ratio for an #e0e0e0-on-#121212 pair

Type #e0e0e0 into the foreground field and #121212 into the background field above and the badge clears every WCAG tier by a comfortable margin, including AAA's stricter 7:1 requirement for normal text.4 Swap the two around with the Swap button and the result stays every bit as comfortable, since the ratio treats foreground and background symmetrically.

Why this specific pairing has so much room to spare

That headroom exists because both colors sit near the extremes of the brightness range rather than compromising toward a shared middle gray. The background's near-black luminance and the foreground's near-white luminance stay far enough apart that even a slightly different gray on either side would likely still pass, which gives you real flexibility to warm or cool the palette slightly for brand reasons without risking a fail.

Treat a result this comfortable as a ceiling you can spend, not a target you need to hit exactly, since a slightly softer pairing that still clears AA is often more pleasant to read for long stretches than the maximum-contrast version.5 Use the ratio number above to decide how much of that ceiling you actually want to spend on any given screen.

When to use this

Use this guide whenever you are picking or auditing text colors for a dark-mode interface, and want to confirm a specific foreground and background pair before it ships rather than relying on how restful the pairing looks at a glance.

Examples

A Material Design-style dark card: light text on a near-black background

Before
Foreground #e0e0e0, background #121212
After
Both colors plug directly into the formula above and clear every WCAG tier, including AAA, since the near-black background and near-white foreground sit far apart in relative luminance.

This is the pairing discussed in the Reading the ratio section above.

A muted gray-on-charcoal pair that looks restful but fails normal text

Before
Foreground #757575, background #1e1e1e
After
The Normal Text row fails AA here, even though both colors read as comfortably dark and readable to the eye, since dimming the foreground reduced the ratio more than it looks like it should have.

Click Fix text above to see the closest lighter gray that reaches AA without changing hue.

Sources
  1. 1.

    W3C, "Understanding Success Criterion 1.4.3: Contrast (Minimum)," w3.org, accessed August 2026. https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html

  2. 2.

    Google, "Dark Theme," material-design documentation, github.com, accessed August 2026. https://github.com/zhonghaohu/material-design/blob/master/docs/theming/Dark.md

  3. 3.

    Björn Ottosson, "A Perceptual Color Space for Image Processing," bottosson.github.io, December 2020. https://bottosson.github.io/posts/oklab/

  4. 4.

    W3C, "Web Content Accessibility Guidelines (WCAG) 2.1," w3.org, May 2025. https://www.w3.org/TR/WCAG21/

  5. 5.

    "Dark mode," Wikipedia, accessed August 2026. https://en.wikipedia.org/wiki/Light-on-dark_color_scheme

FAQ

It's the highest-contrast option, clearing every WCAG tier easily, but many designers find it harsher to read for long stretches than a near-black background paired with an off-white foreground like #e0e0e0, which still clears AAA comfortably while feeling gentler on the eyes.

Softening both the background and the foreground toward a shared middle gray shrinks the contrast gap from both directions at once, which fails faster than most designers expect. Keeping the background close to true black while giving the foreground more room gives you a wider safety margin.

A near-black background around #121212 paired with a foreground near 87% white, such as #e0e0e0, is a widely used baseline that clears AAA with room to spare, giving you flexibility to adjust either color slightly for brand reasons without risking a fail.

Yes. Clicking Fix text or Fix background searches lightness in OKLab space in both directions and returns whichever adjustment reaches your target ratio with the smallest change, regardless of whether the pair you started with was light-on-dark or dark-on-light.

No, and this applies in dark mode exactly as it does in light mode: large text, defined as roughly 24px regular weight or 18.7px bold, only needs 3:1 for AA instead of body text's 4.5:1, so a dark-mode heading can sit closer to its background than a paragraph safely can.

No. CapyToolkit doesn't send the colors you type to a server; the ratio calculation, the Auto-Fix search, and the color blindness simulation all run inside your browser tab, so testing a full dark-mode palette one pair at a time never leaves your machine.

Checking a Brand Color Pair Against WCAG

A brand color usually gets chosen in a logo file or a mood board long before anyone checks whether it can carry body text or button labels without failing accessibility review. That gap between this is our blue and this blue passes WCAG at 16px is exactly where design systems run into trouble months after launch, when a component built around the brand color turns out to fail a contrast audit.1 Testing a candidate brand pair here, before it gets baked into buttons, links, and headings across a whole product, catches the problem while it's still a five-minute color adjustment rather than a re-brand.

Run this check yourself in the WCAG Contrast Checker.

Open in the tool →

Why a brand color that looks bold can still fail contrast

Saturated brand colors, the kind that make a logo pop on a business card, often sit in a middle brightness range that neither reads as clearly light nor clearly dark. That middle ground is precisely where contrast failures cluster, because a color that's too bright to work well against white and too dark to work well against black ends up compromised against both.

The saturation trap: vivid does not mean high contrast

A vivid blue like #2563eb looks confident and energetic on a white background, and it does clear AA's 4.5:1 threshold for normal text, but it falls short of AAA's stricter 7:1 bar.2 A lighter, equally on-brand blue like #93c5fd can look almost identical in a logo lockup yet fail even the more forgiving large-text threshold against the same white background, because a small shift in lightness moves the ratio far more than it moves the color's apparent brand identity.

That's the trap: two shades of the same brand hue can sit on opposite sides of a pass or fail line while looking, to a design team eyeballing a mood board, like minor variations on the same color. Checking the exact hex value your team plans to ship, rather than judging the palette by eye, is the only way to know for certain which side of that line you landed on.

Keeping the hue while fixing the ratio

When a brand color fails, the instinct to just pick a completely different color is usually the wrong one, since it throws away the brand recognition the color exists to build. What you actually need is the smallest possible nudge that gets the same color over the line, not a replacement that starts the approval process over from scratch.

Auto-Fix solves the narrower problem instead: it searches for the closest lightness adjustment in OKLab space that reaches your target ratio while holding hue and chroma constant,3 so a failing brand blue comes back as a lighter or darker blue, not a color a brand guideline would reject. That's usually the difference between a fix your brand team signs off on in minutes and one that reopens a debate about the whole palette.

Locking in a pair once it passes, and sharing it with your team

Once a brand pair clears the tier you need, whether that's AA for general use or AAA for a long-form reading context,4 the Share button turns your exact foreground and background into a link anyone on your team can open to see the same result. No screenshot, spreadsheet cell, or verbal description of a color has to stand in for the real, checkable value again.

Documenting the decision instead of re-litigating it later

That link is worth attaching directly to the design system documentation or the ticket where the color got approved, since it saves the next person from re-deriving the ratio from scratch or trusting a screenshot that might not reflect the final hex value.5 Anyone who opens it later sees the live, current result rather than a snapshot that could have drifted out of date.

A shared, bookmarkable link that shows the exact pass or fail state removes the ambiguity that usually creeps in between a color being approved in a design file and it actually shipping in production CSS, and it gives future reviewers a live result instead of a static image that could quietly go stale.

When to use this

Use this guide before a brand color moves from a logo file into production CSS, whenever you need to confirm the exact hex pair clears WCAG rather than approving a palette by eye.

Examples

A vivid brand blue on a white background, checked before it becomes the primary button color

Before
Foreground #2563eb, background #ffffff
After
The badge shows a clear AA pass for normal text, just short of AAA, giving you a real number to attach to the design decision instead of a guess.

A lighter brand-adjacent blue that looks similar in a logo but fails against white

Before
Foreground #93c5fd, background #ffffff
After
Every tier fails here, including the more forgiving large-text threshold, which is exactly the kind of near-miss a mood board comparison would never catch.
Sources
  1. 1.

    WebAIM, "Contrast and Color Accessibility," webaim.org, accessed August 2026. https://webaim.org/articles/contrast/

  2. 2.

    W3C, "Understanding Success Criterion 1.4.3: Contrast (Minimum)," w3.org, accessed August 2026. https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html

  3. 3.

    Björn Ottosson, "A Perceptual Color Space for Image Processing," bottosson.github.io, December 2020. https://bottosson.github.io/posts/oklab/

  4. 4.

    W3C, "Web Content Accessibility Guidelines (WCAG) 2.1," w3.org, May 2025. https://www.w3.org/TR/WCAG21/

  5. 5.

    The A11Y Project, "Checklist," a11yproject.com, accessed August 2026. https://www.a11yproject.com/checklist/

FAQ

Vivid, saturated colors often sit in a middle brightness range, bright enough to struggle against white and dark enough to struggle against black. A color's apparent boldness in a logo has little to do with where it lands in the relative luminance formula this tool uses.

No. It adjusts only the lightness of the failing color in OKLab space, holding hue and chroma constant, so a failing brand blue comes back as a slightly lighter or darker blue rather than a different color entirely.

Yes, since a color that passes against white can fail against a light gray card background or a colored section, and each combination needs its own check rather than assuming one passing result covers every place the color appears.

Click Share to copy a link that encodes your exact foreground and background into the URL. CapyToolkit doesn't store that link anywhere central, so anyone who opens it sees the same live result, restored straight from the two colors in the address itself.

No. A pair that clears the 4.5:1 normal-text threshold automatically clears the lower 3:1 large-text bar too, but the reverse isn't true, so a color approved only for a large heading can still fail if it later gets reused for body copy.

Text contrast is checked against the 4.5:1 (AA) or 7:1 (AAA) thresholds, while a button border or other UI component boundary only needs 3:1 under success criterion 1.4.11, a lower bar that exists because interface boundaries carry less reading burden than actual text.

FAQ

Read Normal Text for body copy, labels and anything below the large-text size. Read Large Text for text of at least 24 CSS pixels, or about 18.7 pixels in bold. Read UI Component for borders, focus indicators, input outlines and icons that identify a control, since those fall under the non-text rule rather than the text rules.

Most accessibility laws and procurement rules reference WCAG level AA, so AA is the usual requirement. AAA asks for 7:1 on body text and 4.5:1 on large text. Treat it as a margin for long reading, dim screens and bright rooms rather than a target every element must hit.

The ratio of a pair never changes, but the threshold does. A gray that passes as a 32 pixel heading at 3:1 fails the moment the same style is reused for 16 pixel body text, so check the pair again whenever a color moves to a different element or size.

Placeholder text is still text a reader needs, so treat it like normal text if it carries information such as an input format. Fully disabled, non-interactive controls are exempt from the contrast rules, and the exemption ends as soon as the control can be used again.

No. CapyToolkit doesn't read your stylesheet or page; it only sees the two colors you enter. It shows the Normal Text, Large Text and UI Component results side by side so you can pick the row that matches the element and size you are shipping.

Additional resources

Guides

Checking Color Contrast on OLED and Mini-LED Displays Why a WCAG contrast ratio stays the same on every screen while the look of a color pair changes on the iPhone 17 Pro, MacBook Pro M4, Galaxy S25 and Dell XPS 16, and which display settings to turn off before judging. WCAG Contrast Requirements by UI Element Which WCAG contrast threshold applies to body text, large headings, button borders and focus rings, dark-mode text and brand colors, and how to check each pair in your browser.