Text over images, and the scrim that makes it work
A hero image that averages to mid-gray can still contain a blown-out sky. Solve for the worst pixel, not the average one.
Blog
Essays on color theory as it actually applies to interfaces: contrast models, perceptual color spaces, dark mode, palettes that survive contact with real content.
Most screens sold in the last five years can show colors sRGB cannot express. Here is how to use them without breaking everything else.
Read the article →A hero image that averages to mid-gray can still contain a blown-out sky. Solve for the worst pixel, not the average one.
Blue does not mean trust. The studies most often cited for color psychology say considerably less than the infographics claim.
Those faint rings in your gradient are not a rendering bug. They are 8-bit quantisation, and the fix is about three percent of noise.
An accent has one job: to be the most noticeable thing on the screen at the moment it appears. What that requires depends entirely on what is behind it.
It is a useful heuristic from interior design that gets repeated as though it were a specification. Here is what it is actually good for.
WCAG 3 replaces the 4.5:1 ratio with a model that knows dark mode exists. Here is what changes and what to do about it now.
Shadow is the absence of light. On a dark background there is barely any light to remove, so depth has to come from somewhere else.
A story about --blue-500, told as a cautionary tale, with the two-layer token structure that prevents it.
Around one in twelve men cannot distinguish some of the color pairs in your interface. That is not an accessibility footnote, it is a larger group than Safari users.
Pure white is a default, not a decision. Look at the products you admire and almost none of them use it. Here is what they use instead and why.
Blue to yellow should pass through green. In CSS it passes through gray. The cause is one line in the spec and the fix is one keyword.
One brand color is not a palette. Here is how the 50–950 scale works, why the ends always look washed out, and which step you should actually be using for text.
filter: invert(1) takes about four seconds and produces a theme where your brand blue has turned orange. Here is what a real dark theme requires.
Everyone knows the number. Far fewer know what it is computing, where it is wrong, and why passing it does not mean your text is readable.
HSL claims that every hue at 50% lightness is equally light. Look at pure yellow next to pure blue and you can see that it is not true. Here is what that costs you.
One color covers more of your interface than every other color combined, and every decision downstream has to answer to it. Most teams pick it last.