A personal design system

Warm, bookish colour
that stays readable.

Wana is a small palette with a gruvbox soul and a Flexoki-paper light mode. Ten semantic roles, two variants, every foreground/background pair locked to WCAG AA. It is authored in OKLCH, so the accent re-lights by arithmetic, not by eye.

The palette

Ten roles, shown in both variants. Ratios are contrast against that variant's bg; every text role clears AA (4.5:1).

Light · Flexoki paper

Dark · Gruvbox

The idea

Colours are defined in OKLCH, not hex. Lightness in OKLCH is perceptual, so the accent can be re-lit for dark mode by lowering the lightness and keeping the hue and chroma. The contrast ratio comes out predictable instead of guessed. Every text-on-background pair is checked against WCAG AA.

The look is warm. Dark mode uses Gruvbox's soft, low-glare greys. Light mode uses Flexoki's paper, a warm off-white that reads like a page instead of a screen. Green is the accent in both variants.

Under the roles it is a base24 scheme: sixteen ANSI colours plus extra background and bright ramps. Every app theme is generated from it, and the web tokens expose ten of those colours as semantic roles. One source of truth; everything else regenerates.

In use

The same tokens, rendering real UI.

Reading on screens

Body text sits at --text on --bg, a measure capped at 65 characters. Links use the accent; secondary text drops to --muted, still AA.

def relight(accent, target):
    """Darken until contrast ≥ target."""
    while contrast(accent, bg) < target:
        accent = darken(accent)  # AA or bust
    return accent

In the terminal

Wana ships a base24 scheme, so it themes far past the browser: kitty, alacritty, tmux, fzf, delta, bat, btop, yazi, Neovim, and more, all generated from the same palette.

wana@forest ~/repos/wana
$ git status
On branch main
  modified:   tokens/base.css
  new file:   themes/eza/wana-dark.yml

Get it