Suggestions
← TIL
~2 min read
#css#accessibility#ui-ux#baseline-2026

contrast-color(): Native and Automatic Accessibility

How many times have you had to write a JavaScript conditional or a PostCSS macro to decide whether button text should be black or white based on the background? That logic is fragile and adds unnecessary weight.

Baseline 2026 introduces contrast-color(), a native CSS function that analyzes background luminosity and automatically selects the color that meets accessibility standards (WCAG).

Chromatic magic for humans!

💡 Key Takeaways (BLUF)#

  • Zero Logic: The browser performs the contrast calculation for you in real time.
  • Dynamic: If the user changes the theme or brand color, the text adapts instantly.
  • Standards-Based: It uses the official WCAG 2.1 algorithm to guarantee readability.

How to use it (2026 Syntax)#

The most basic form takes a background color and returns either black or white:

.badge {
  background-color: var(--brand-color);
  /* The browser selects the best contrast */
  color: contrast-color(var(--brand-color));
}

Senior Level: List of candidates#

You can be more specific and provide the browser with a list of brand colors to choose from:

.card {
  background-color: var(--card-bg);
  /* Choose the best from these three, please */
  color: contrast-color(
    var(--card-bg) max,
    #ffffff,
    #000000,
    var(--action-primary)
  );
}

Why is this a game changer?#

JS/Manual vs. Native CSS

contrast-color() (CSS)

  • Accessibility guaranteed by the browser engine.
  • Less code to maintain.
  • Works perfectly with dynamic CSS variables.
  • Instant performance (no layout recalculation).

Manual Logic (Traditional)

  • Requires external libraries (e.g., TinyColor) or JS logic.
  • Easy to forget in new components.
  • Can fail if background color changes asynchronously.

Implementation in campa.dev#

We are using contrast-color() in our <StatusBadge /> component. Previously, we had to manually define a .dark-text or .light-text class. Now, the badge is a smart component that takes care of itself, regardless of the color passed to it.

Are you ready to stop guessing colors?

Link copied to clipboard