Research · published 18 September 2026 · corrected 19 September 2026
Two of our four colours are one colour.
We measured it, and redesigned around it.
klapp answers are laid out as four directions, each with its own colour.
Under a common form of colour blindness, two of those four colours are almost impossible to tell apart.
Here is the measurement, and what we built instead of trusting the palette.
Colours in the cross
4
One per direction: up, right, down, left.
Tightest against black
6.77:1
Corall. All four clear the AA threshold on their own.
Corall against fiolett
1.08:1
Under simulated deuteranopia: practically one colour.
Lime against cyan
1.18:1
Under simulated protanopia. 1.22:1 under tritanopia.
What we measured
Here are the four colours, each with the arrow and the direction name it always carries, and its measured
contrast against black. The contrast is the reason black text is the only text allowed on them
(docs/designsystem.md). It is also the number that hides the problem: every colour passes on its own.
↑
Up · lime
16.21:1 on black
→
Right · cyan
12.43:1 on black
↓
Down · corall
6.77:1 on black
←
Left · fiolett
7.34:1 on black
The numbers behind the swatches
Each colour against black, the background it sits on
Direction
Colour
Contrast on black
Up ↑
lime
16.21:1
Right →
cyan
12.43:1
Left ←
fiolett
7.34:1
Down ↓
corall
6.77:1
The same colours against each other, under simulation
Pair
Simulated as
Contrast
Corall ↓ and fiolett ←
deuteranopia
1.08:1
Lime ↑ and cyan →
protanopia
1.18:1
Lime ↑ and cyan →
tritanopia
1.22:1
1:1 would be the same colour exactly. Simulated with the Vienot and Brettel transform matrices, the
standard method for approximating what a colour-blind eye receives. The pair itself is recorded in
design/kontrastpar.json, and the decision it forced is V28 in docs/vedtak.md.
Our four direction colours, checked against black, all clear the standard AA contrast threshold on
their own: lime 16.21:1, cyan 12.43:1, fiolett 7.34:1, and corall 6.77:1 — the tightest of the four
(docs/designsystem.md).
That is contrast against a black background, not against each other's colour vision. Under
deuteranopia — the full form of the most common red-green colour blindness, about 1% of men, while its
milder form, deuteranomaly, is about 5%
(Colour Blind Awareness,
read 19 September 2026) — corall and fiolett collapse to 1.08:1 contrast against each other:
practically the same colour. Under protanopia, lime and cyan collide at 1.18:1; under tritanopia, at
1.22:1 (docs/vedtak.md, decision V28).
Corrected 19 September 2026. This paragraph said deuteranopia affects roughly 6% of
men. About 6% is the whole deutan group, most of it the milder deuteranomaly; deuteranopia itself is
about 1%. The simulation models the full form, so for most deutan players the two colours are likely
closer to telling apart than 1.08:1 suggests. We have not measured that.
We looked for a palette of four colours that would stay distinct under every common form of colour
blindness while still holding AA contrast for black text on top of each one. It does not exist: the
same lightness spread that keeps two hues apart in greyscale is what pushes one of them below the
contrast floor. The palette cannot fix this. The interface has to stop depending on it.
So the colour carries nothing
The information in a klapp answer is never the colour. It is the
direction: where an option sits in the cross — up, right, down or left — carried a second time by an
arrow, so a player who cannot separate two hues still reads the layout correctly. The colour is
decoration on top of a position, never the only signal for it.
The same rule applies to feedback. Whether an answer was right or wrong is never shown as red versus
green, and never borrowed from one of the four direction colours. It is a check mark, a cross, and
dimming for the answers that were not chosen (design/kontrastpar.json). Red-green confusion is the most
common form of colour blindness there is, so building the one piece of feedback every player needs
around exactly that pair would have undone the rest of the work.
What carries the meaning instead
the position in the cross: up, right, down, left
an arrow on every option: ↑ → ↓ ←
the direction written out as a word
right or wrong as a mark, never as red against green
dimming for the answers that were not chosen
Why this is useful even if you never play klapp
Any interface that hands someone four options in four colours has this exact problem, whether it is a quiz,
a dashboard legend, or a set of buttons on a remote control. Four is also the number where it gets hard to
hide: two colours can usually be chosen far enough apart to survive most simulations, but a fourth colour
has nowhere left to sit once the first three have claimed the distinguishable range. If your product asks
someone to pick from four colour-coded things, the honest question is not whether your palette is pretty —
it is what a deuteranope actually sees when they look at it, and whether the choice still makes sense if the
colour disappears entirely.
The limit of what we measured
A simulation is not a person.
It is a transform on an RGB value, not a colour-blind person looking at a screen. It does not capture
how someone actually adapts, what a projector does to these numbers in a bright room, or how
colour-blind players actually see the palette compared with what the matrices predict.
The fix itself is untested with players.
What we have is a measurement that told us not to trust the colours; what we do not have is a session
with colour-blind players confirming the fix works in practice. That test has not been run yet.
It is enforced, not just designed.
A build gate refuses to let any screen ship where all four direction colours appear without a
non-colour way to tell them apart — an arrow, a direction attribute, or a label naming the direction. A
rule that only lives in a document gets forgotten the first time someone is in a hurry.
The numbers are ours to recheck.
The contrast figures against black are recomputed from the tokens on every build, so a colour cannot
drift away from the number written next to it. The simulated pair contrasts were computed once, and are
recorded in design/kontrastpar.json.