L · lightness
How much light?
Zero is black, one hundred is white. Perceptual rather than mathematical, so fifty actually looks halfway, which is the part HSL gets wrong.
Use it for hierarchy. Contrast is almost entirely a lightness question.
A colour written in OKLCH answers three separate questions. How light, how colourful, which hue. Change the third and you have a new theme. Change nothing else and the hierarchy survives.
the whole ideaoklch(LCH)
Every colour on this page and on the rest of this site is these three numbers. The bands are live and redraw from whatever you set below.
L · lightness
Zero is black, one hundred is white. Perceptual rather than mathematical, so fifty actually looks halfway, which is the part HSL gets wrong.
Use it for hierarchy. Contrast is almost entirely a lightness question.
C · chroma
Zero is grey. Around 0.1 to 0.2 is vivid. Push further and the colour leaves what a screen can actually show.
Use it for energy. Hold it steady so no palette shouts louder than another.
H · hue
A position on the wheel, zero to three hundred and sixty. The only number that says which colour this is.
Use it for identity. This is the number a theme changes, and the only one.
Drag a slider and watch what changes, and more usefully what does not. The sample is the site’s own components with their role tokens driven by these three numbers.
Move this and the contrast moves with it. Hue and intensity hold exactly.
More or less intense, at the same weight. Notice the contrast barely moves.
Sweep this. The identity changes completely and the hierarchy does not move at all.
Hold lightness and chroma where they are, then sweep hue end to end. That single drag is what a theme change costs when the ladder is fixed.
One controlled lightness ladder makes emphasis predictable in every theme.
Analysts, leads and admins reading the same data at different depths.
40%
The number the redesign moved, drawn in whatever you have set.
faster to insightIn HSL every colour below says fifty percent lightness. They are not remotely the same brightness, which is why a scale built in HSL has to be corrected by eye, per colour, forever.
hsl(55 100% 50%)hsl(140 100% 50%)hsl(240 100% 50%)hsl(300 100% 50%)Yellow shouts, blue sinks. The number lied, and any rule you write against it is wrong for most hues.
oklch(72% 0.16 95)oklch(72% 0.16 145)oklch(72% 0.16 255)oklch(72% 0.16 325)Same perceived weight at every hue. Now a rule holds, and one ladder works for the whole wheel.
Take the hue you set above, hold chroma, step lightness. That is a full scale, and the four role tokens under it are all a component ever needs to name.
oklch(96.0% 0.008 0)headings and core copyoklch(66.0% 0.020 0)body and supportoklch(52.0% 0.000 0)links, focus, marksoklch(23.0% 0.024 0)cards and panelsMirror the lightness values around the midpoint and leave hue alone. The identity survives, the relationships survive, and there is no second palette to maintain.
/* hue and chroma unchanged */ --surface: oklch(99% 0.000 0); --text-lead: oklch(16% 0.000 0); --text-subtle: oklch(48% 0.000 0); --accent: oklch(52.0% 0.000 0);
/* only the L values moved */ --surface: oklch(23% 0.000 0); --text-lead: oklch(96% 0.000 0); --text-subtle: oklch(66% 0.000 0); --accent: oklch(60.0% 0.000 0);
You understand OKLCH when these three feel obvious rather than clever.
Hue, and only hue. Keep the lightness roles exactly as they are, then tune chroma only if the new hue reads weak or leaves the display gamut. If you find yourself changing lightness, you are rebuilding rather than retheming.
Almost never. Faintness is a lightness problem, because the gap between the text and its background is too small. Raising chroma makes it more colourful and no more legible, and on a dark ground it usually makes it worse.
No, and this is the one people get wrong. OKLCH is an authoring model, not a contrast certificate. Perceptual lightness and WCAG relative luminance are different measures, computed differently. The ratio in the lab above is a teaching estimate built from lightness alone, so it tracks the right relationship and is not a pass mark. Test every real text-on-background pair, which is exactly why the palettes page publishes 32 measured pairs per palette instead of asserting that the maths holds.
8 palettes built on exactly this — the same ladder at 8 hues — with every pair measured and the tokens ready to copy.