DEV Community

J Now
J Now

Posted on

Why pure Klein blue disappears as text (and the two-slot fix)

Yves Klein's IKB is the hex value 002FA7. On a dark terminal ground, that renders at APCA Lc -12 — below the threshold where text is functionally legible. I found this out after spending two days trying to wire IKB directly into every blue slot in my Claude Code theme and watching permission prompts become nearly unreadable.

The fix isn't to abandon IKB. It's to split the work across two ANSI slots.

ansi:blue gets pure IKB. Claude Code uses this slot for decorative borders and structural chrome — things you parse by shape, not by reading word by word. Contrast doesn't need to clear the body-text bar; it just needs to not actively confuse you.

ansi:blueBright gets a lifted Klein-family blue (A8BEF0). Claude Code routes permission-prompt text through this slot — text you actually read. That lighter value clears Lc 90 on the dark ground, which is the threshold I set for body-weight prose in klein-blue.

The APCA system (as opposed to WCAG's older relative-luminance formula) matters here because it's perceptually calibrated for body size. A color that passes WCAG AA at 4.5:1 can still be tiring to read in paragraphs at 13px — APCA accounts for that. Klein Void Prot (V3) is the variation where every slot, including the accent roles, clears strict APCA gates. The other three variations make tradeoffs for aesthetics.

This is also why /theme dark-ansi in Claude Code is non-negotiable for the theme to work at all. Without it, Claude Code ignores the Terminal.app ANSI palette entirely and falls back to hardcoded RGB values — the split-slot work is irrelevant.

Full source, build script, and install instructions: https://github.com/robertnowell/klein-blue

Top comments (0)