Be "Neovim branded", i.e. have mostly "green-blue" feel plus one or two
colors reserved for very occasional user attention.
Be suitable for dark and light backgrounds via exchange of dark and light
palettes.
Be usable, i.e. provide enough visual feedback for common objects.
There are two separate palettes: dark and light. They all contain the same
set of colors exported as NvimDark*
and NvimLight*
colors respectively.
The dark palette is used for background in the dark color scheme and for
foreground in the light color scheme; and vice versa. This introduces
recognizable visual system without too standing out.
Actual computation of palettes should be done in a perceptually uniform
color space. Oklch is a good choice.
Each palette has the following colors (descriptions are for dark background;
reverse for light one):
Four shades of colored "cold" greys for general UI.
Light ones (also from darkest to lightest) are reserved for
Comment
,
hl-StatusLine/|hl-TabLine|,
hl-Normal (foreground),
and color considered as "white".
Six colors to provide enough terminal colors: red, yellow, green, cyan,
blue, magenta.
They should have (reasonably) similar lightness and chroma to make them
visually coherent. Lightness should be as equal to the palette's basic grey
(which is used for
hl-Normal) as possible. They should have (reasonably)
different hues to make them visually separable.
For 16 colors:
Greys are not used and are replaced with the foreground and background
colors of the terminal emulator.
Non-grey colors fall back to terminal colors as ordered in ANSI codes
(
https://en.wikipedia.org/wiki/ANSI_escape_code#3-bit_and_4-bit),
that is red (1, 9), green (2, 10), yellow (3, 11), blue (4, 12),
magenta (5, 13), cyan (6, 14).
To increase contrast, colors 1-6 are used for light background and 9-14
for dark background.
Grey shades for general UI according to their design.
Bold text for keywords (Statement
highlight group). This is an important
choice to increase accessibility for people with color deficiencies, as it
doesn't rely on actual color.
Cyan as main syntax color, i.e. for function usage (
Function
highlight
group),
hl-DiffText,
hl-DiagnosticInfo, and some minor text UI elements.
Blue very sparingly as
hl-DiagnosticHint and some additional important
syntax group (like
Identifier
).
Magenta very carefully (if at all).
Rely on the assumption "Background color can be used as background; other
colors can be used as foreground". This means that in any
foreground/background combination there should be background and one
non-background color.
Use 0 (black) or 15 (bright white) as foreground for non-grey background,
depending on whether normal background is light or dark.