Colorscheme Lab

Editor and terminal palettes compared side by side: WCAG 2 and APCA contrast for every colour pair, perceptual distance (CIEDE2000) between every colour pair under normal vision and simulated colour-vision deficiency, and an accessibility summary. At the end is Cassette, a soft retro palette in four versions. In all of them, every pair of foreground colours is more than 20 ΔE apart at text size, and every terminal colour is clearly distinct from its bright shade.

Themes click a card to inspect it

Hex values come from each project's own source files (linked in the explorer). Every theme uses its default style, with editor colours taken from the Neovim port.

Explorer

Palette

Contrast matrix — row = text colour, column = background, WCAG 2 ratio

≥ 7 AAA≥ 4.5 AA≥ 3 large text / UI< 3 fail

Perceptual distance — ΔE2000 between every pair, under the selected vision mode and size

≥ 20 very distinct10–20 distinct5–10 close< 5 confusable
Colour map OKLab a/b plane (hue & chroma) with lightness bar
Closest pairs foreground colours, this vision mode & size
    Normal ↔ bright each ANSI colour vs its bright shade, this vision mode & size

      Compare click a column to sort

      Palette scores use the editor foreground colours: fg, comment, and every syntax accent. min ΔE is the smallest CIEDE2000 distance between any two of them. A low value means two token types can be mistaken for each other. The CVD columns repeat that check after simulating full protanopia, deuteranopia, and tritanopia (Machado 2009, severity 1.0), which is the worst case. The ANSI columns cover terminal colours 1–6 and 9–14.

      Cassette a soft, retro-inspired theme built to clear every check above

      Cream text and soft accents over two backgrounds: Dusk on warm espresso, Indigo on a deep blue-violet. Each comes in two versions. Soft keeps the soft background and lets accents sit at WCAG AA (≥ 4.5:1). Its yellow is a bright lemon, with green and magenta toned down. Deep darkens the background so every accent and terminal colour reaches AAA (≥ 7:1). Colours were placed in OKLCH with a max-min optimiser, inside hue bands that keep their meaning and a chroma cap (≤ 0.13; ≤ 0.17 for the Soft yellow) that keeps them soft. In every version all foreground colours (fg, comment, eight accents) are more than 20 ΔE2000 apart at text size (see Method), and the optimiser then pushed colour-blind separation as high as it could. The terminal palette is tuned alongside the editor: each hue has a normal and a lighter bright shade, at least 10 ΔE apart at text size, so normal and bright never blur together.

      Export

      
            

      Method

      WCAG 2 contrast ratio
      (L1 + 0.05) / (L2 + 0.05) on sRGB relative luminance. AA requires 4.5:1 for body text and 3:1 for large text and UI components. AAA requires 7:1. Code sits at body-text size, so 4.5 is the real floor for every token colour.
      APCA Lc
      Accessible Perceptual Contrast Algorithm 0.0.98G-4g, the WCAG 3 candidate. It is polarity-aware: negative values mean light text on a dark background. Rough guide: |Lc| 75 for body text, 60 for content text, 45 for large text or code highlights.
      Perceptual distance (ΔE2000)
      CIEDE2000 in CIELAB (D65). ΔE ≈ 2 is a just-noticeable difference for large adjacent patches. Thin glyphs need much more, so ≥ 10 is used as "distinct" and ≥ 20 as "very distinct" for syntax tokens that must be told apart at a glance.
      Colour-vision deficiency simulation
      Machado, Oliveira & Fernandes (2009) matrices at severity 1.0, applied in linear sRGB. Achromatopsia maps to luminance only. No palette of eight colours at text-friendly contrast can stay distinct in pure greyscale, so that mode is shown for reference and never scored.
      Text-size distance
      CIEDE2000 is calibrated on large patches, but code is drawn in thin glyphs. Stone, Szafir & Setlur (2014, An Engineering Model for Color Difference as a Function of Size, IS&T CIC) measured how much CIELAB difference is needed per axis as targets shrink: ND(50%, s) = C + K/s. At ⅓° (their smallest fitted size, about one 13px glyph at 60 cm) a*/b* differences are worth less than L* differences. The "Text ⅓°" size mode keeps L* at full weight and scales a* by 0.82 and b* by 0.65 before computing ΔE2000. Pairs that differ mostly in yellowness, such as red/orange and green/cyan, shrink the most.
      Colour map
      OKLab a (green↔red) on x and b (blue↔yellow) on y. Distance from the centre is chroma and the angle is hue. The bar on the right shows OKLab lightness. Points that cluster together get confused.