Every hue goes through the same steps, so whichever hue you pick, your text gets the same contrast:
Here's every hue at one stop. Drag across the stops to watch the cap move, or switch to the wheel or the 3D view:
L* 67.5 in every hue · chroma cap 0.161 · proTurquoise, proCyan, proCobalt, proIndigo, proIris, proViolet can't reach it
Colored area: the most chroma Display P3 can show at this lightness, hue by hue. Faded above the line: color we leave out so every hue is equally vivid. Black marks under the line: hues that can't reach the cap, which keep 98% of their maximum.
The colored area is the most chroma, or vividness, that a Display P3 screen like an iPhone's can show at this lightness, hue by hue. The line is the palette's cap, the one chroma every hue gets. The black marks under it are the hues that can't reach it: at _400, turquoise and cyan, and the violet-blues from cobalt to violet. How the ramps are built explains where the cap sits.
Why aren't the colors brighter?#
Because every hue gets the same amount of color at each stop, the most that nearly every hue can show. The faded color above the line is what we give up: pick _600, and red could have twice the chroma it gets.
We tried giving every hue its own sRGB maximum, at the same L*. Light yellows got up to 3.5 times the typical chroma, and yellow-greens even more, so they looked far more colorful than the rest. The darkest indigos and violets got more than twice. Blues with extra chroma also look lighter than they measure (the Helmholtz–Kohlrausch effect), so those dark stops stood out from their neighbors at the same L*.
So every hue keeps one chroma per stop. The palette got more vivid only by moving to Display P3, which gives every hue more room. When one color should stand out, saturate(by:) adds chroma and keeps the contrast.
Why does every hue share one lightness?#
So you can swap one hue for another without checking contrast again. Switch to "Lightness only" to take the hue away:
HSL, lightness 50%
ColorTokensKit, stop _350
Every HSL swatch says 50% lightness, yet the lightness your eyes see (L*) runs from 32 to 97. The ColorTokensKit row holds one L* for every hue. Switch to “Lightness only” to see it.
Your eyes don't see every hue as equally bright. At the same HSL lightness, yellow's gray is nearly white and blue's is dark. The palette measures lightness the way your eyes do, as L*, and gives every hue the same one at each stop, so its row turns into one gray. That's why _600 is 4.68:1 on white in every hue. Why OKLCH? has the color science.
What about screens without Display P3?#
Every iPhone since the iPhone 7 can show Display P3, a wider range of color than sRGB, and the palette uses it. That's what lets every hue share 16% to 29% more chroma than the same rule allows inside sRGB.
There's no sRGB fallback. Of the 720 colored stops, 301 are beyond sRGB, and an sRGB-only screen, such as many external monitors, clips them, so they look less vivid there.
How were the 36 hues named?#
There's a hue every 10°, so every family sits the same distance from its neighbors. Eleven of them fill the gaps between the older names: coral, amber, mustard, chartreuse, emerald, turquoise, cerulean, azure, grape, orchid and rose.
The other names come from the library's earlier palette, where each sat at the median hue that nine color systems give it, from Tailwind and Material to Apple's system colors and the XKCD color survey. Each moved 5° or less to land on the grid, a change smaller than a just-noticeable difference. What does the library offer? shows every family, stop by stop.
Sources#
- The library's Color+ProColors.swift, which places a hue every 10° and says where each name came from, and UniformRamp.swift, which sets each stop's lightness and chroma.
- Björn Ottosson, A perceptual color space for image processing (2020), which introduces OKLab and OKLCH.
- W3C, CSS Color Module Level 4, which defines
hsl(),oklch()anddisplay-p3. - W3C, Web Content Accessibility Guidelines (WCAG) 2.2, which defines relative luminance and contrast ratio.
- Gregory High, Phil Green and Peter Nussbaum, The Helmholtz–Kohlrausch effect on display-based light colors and simulated substrate colors (2023), which finds the effect strong in blues and negligible in yellows.
- Apple, iPhone 7 technical specifications, which lists its wide color (P3) display.
See also
- How accessible is it? What the palette guarantees for contrast in every hue and mode, and what you still need to check.
- Color theory Pair stops that always read, and pick secondary hues that match your brand, in both modes.
- Fitting colors into Display P3 Stay inside Display P3 without losing contrast: chroma drops, lightness holds.
- What does equal lightness cost? What equal contrast costs, from quieter reds to olive yellows, and what you can do about each.
- How do other color systems choose their colors? Compare how Material, Radix, Tailwind and others pick colors, and what each choice costs you.