TUI Themes
July 17, 2026 ยท View on GitHub
Zero's TUI ships a set of built-in color themes. Pick one with --theme <name>,
the ZERO_THEME environment variable, or the /theme <name> command while
running. auto (the default) follows the terminal's detected background.
Run /theme with no argument to open a picker: move through the list to
live-preview each theme, press Enter to apply the highlighted one, or Esc to
cancel and restore the previously active theme. Run /theme list to print
the active theme and the registered names without opening the picker.
Dune (dune)
A warm sand-and-cream palette: sand/cream surface, charcoal ink, and a soft amber accent.
Neon (neon)
A neon-on-black palette: pitch-black surface, bright green ink, and a cyan accent.
Adding a theme
Every theme is a palette (a table of color hex tokens) plus one entry in
themeRegistry, both in internal/tui/theme_palettes.go. buildTheme in
internal/tui/theme.go turns a palette into the resolved lipgloss.Style
set every renderer reads from the active zeroTheme. Adding a theme means
adding a new palette{...} literal, a themeRegistry entry, and test
coverage for the new palette (see below).
Registry-wide tests in internal/tui/theme_select_test.go assert the basic
WCAG AA text tokens, the gray-ramp order, the diff word-span pairs, and the
selected-row band for every entry. The rendered-surface invariants beyond
those (permission surfaces, selected-row secondary text, diff gutters, and
the xterm-256 downsampling checks) are asserted per palette, not against the
whole registry: TestExtendedThemeContrastInvariants and
TestExtendedThemeANSI256Contrast enumerate the palettes they cover. A new
theme must be added to those tests (or given equivalent palette-specific
assertions), or CI can stay green while its permission, selected-row, and
diff surfaces ship unreadable.