Spent an afternoon watching pure IKB disappear against a dark ground. WCAG 2.1 contrast ratio for IKB (hex 002FA7): 3.2:1 — technically a pass for large text. APCA Lc score: -12 — effectively invisible. WCAG uses a symmetric formula that assumes light backgrounds; on dark ground it systematically overstates how readable dark colors are. APCA accounts for polarity, so the score for dark-on-dark reflects what actually happens.
That failure drove most of the design decisions in klein-blue, a set of four Terminal.app themes for Claude Code tuned for prose legibility over long sessions.
The split that came out of it: pure IKB lives in the ansi:blue slot — decorative borders and highlights where it reads as color, not text. A lifted Klein-family blue (A8BEF0) goes in ansi:blueBright — the slot Claude Code uses for permission-prompt text, where you actually need to read it. Same hue family, but the lifted value passes the body-prose gate (Lc >= 90) instead of sitting at -12.
APCA gates I used per role:
body text: Lc >= 90
subtle text: Lc >= 75
muted text: Lc >= 45
accent: Lc >= 60
Of the four variations, only Klein Void Prot passes every gate strictly. The others make deliberate tradeoffs — Klein Void Gallery accepts maximum IKB presence at the cost of some accent scores; Klein Void Sand & Sea lets the claude-sand ansi:redBright slot compete as a second hero color instead of neutralizing it.
One setup requirement worth knowing: Claude Code has to be set to dark-ansi in its /theme picker. If you leave it on the default, Claude Code overrides everything with its hardcoded RGB palette and the ANSI theme does nothing.
Top comments (0)