aboutsummaryrefslogtreecommitdiff
path: root/runtime/doc/dev_theme.txt
blob: 04ec3f293c067cdabeb850ee2b262bc6e2a535d0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
*dev_theme.txt*          Nvim


                            NVIM REFERENCE MANUAL


Nvim theme style guide                                        *dev-theme*

This is style guide for developers working on Nvim's default color scheme.

License: CC-By 3.0 https://creativecommons.org/licenses/by/3.0/

                                      Type |gO| to see the table of contents.

==============================================================================
Design

- Be "Neovim branded", i.e. have mostly "green-blue" feel plus one or two
  colors reserved for very occasional user attention.

- Be extra minimal for 'notermguicolors' (256 colors) while allowing a bit
  more shades when 'termguicolors' is set (true colors).

- Be accessible, i.e. have high enough contrast ratio (as defined in
  https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef).
  This means to have value at least 7 for |hl-Normal| and 4.5 for some common
  cases (|hl-Visual|, `Comment` with set 'cursorline', colored syntax, `Diff*`,
  |hl-Search|).

- 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.


==============================================================================
Palettes

- 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" greys for general UI. In 256 colors they are
      exact greys; in true colors they are shades of "cold" grey.

        - Dark ones (from darkest to lightest) are reserved as background for
          |hl-NormalFloat| (considered as "black"), |hl-Normal| (background),
          |hl-CursorLine|, |hl-Visual|.

        - 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.

- Each palette color should have a 256 colors variant with closest color
  computed based on the perceptually uniform distance measure.


==============================================================================
Highlight groups

Use:

- 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.

- Green for strings, |hl-DiffAdd| (as background), |hl-DiagnosticOk|, and some
  minor text UI elements.

- Cyan as main syntax color, i.e. for function usage (`Function` highlight
  group), |hl-DiffText|, |hl-DiagnosticInfo|, and some minor text UI elements.

- Red to generally mean high user attention, i.e. errors; in particular for
  |hl-ErrorMsg|, |hl-DiffDelete|, |hl-DiagnosticError|.

- Yellow very sparingly only with true colors to mean mild user attention,
  i.e. warnings. That is, |hl-DiagnosticWarn| and |hl-WarningMsg|.

- Blue very sparingly only with true colors as |hl-DiagnosticHint| and some
  additional important syntax group (like `Identifier`).

- Magenta very carefully (if at all).


 vim:tw=78:ts=8:et:ft=help:norl: