Released Modus themes 0.9.0

I just published version 0.9.0 of the Modus themes. These are my highly-accessible themes for GNU Emacs. They conform with the WCAG AAA standard for colour contrast accessibility (a minimum contrast ratio of 7:1 between the foreground and background values). You can find the packages on GNU ELPA, MELPA, MELPA stable:

  • modus-operandi-theme (light)
  • modus-vivendi-theme (dark)

Below are the release notes copied verbatim.

Modus Operandi and Modus Vivendi version 0.9.0

By Protesilaos Stavrou on 2020-06-03

This entry records the changes since version 0.8.0 (2020-04-28). The present release contains about 50 commits, covering a month of active development.

All changes are aligned with the primary objective of this project, which is conformance with the WCAG AAA accessibility standard for colour contrast. This translates to a minimum contrast ratio of 7:1 between a given combination of foreground and background colours. The highest standard of its kind.

All customisation options that are booleans are off (nil) by default. The project’s policy is to offer such features on an “opt-in” basis, while always respecting the principle of least surprise.

Refer to the README for further information on the exact names of symbols and the like.

New customisation options

  • It is now possible to make the faces of Icomplete, Ido, and a few other related tools such as orderless, use coloured backgrounds to style their feedback. This is the aesthetic already in effect for Ivy, Helm, and Selectrum. The default is more subtle, in that it uses just an accented foreground value without any added background.

  • Advanced users can now override both the exact values of colour variables, as well as the mapping of properties/variables to faces. In practice this means that it is possible to completely change parts of the theme (or the entirety of it for that matter). It also means that users can simply access the theme’s palette for the sake of correctly passing the appropriate value to some bespoke face of theirs.

  • An extra increment for scaled headings is now available. This should hold the highest value on the scale. Such variables only take effect when the user opts for the “scaled headings” option.

Overview of changes

  • A set of internal reforms were carried through in order to allow the colour palette to be accessed from user configuration files. This required a lot of debugging work to make sure the themes compile properly and performance is not affected.

    • The original idea for this redesign was suggested by Len Trigg in issue 39: Len also provided a real-world implementation of this new option, which is included in the project’s README.

    • AndrĂ© Alexandre Gomes helped figure out the problems caused by the initial design of this feature. In particular, AndrĂ© identified a performance penalty as well as errors pertaining to byte compilation. Everything was eventually resolved. For more see issue 44:

  • Several org-mode faces were reviewed in order to cope well with mixed font settings. This is about use-cases where the main typeface is proportionately-spaced, either by default or by some minor mode like the built-in variable-pitch-mode. The intent of configuring those faces is to make them always inherit a fixed-pitch (monospace) font family, in the interest of preserving the alignment of elements. The idea, suggested code, as well as user feedback were offered by Ben in issue 40:

  • Mixed font settings may have some side-effects depending on user configurations. This is unavoidable as we cannot control how users define their fonts. Mark Barton reported one such case, while he was able to fix it by making use of the suggested typeface definitions. See issue 42:

  • The faces for the tab-bar-mode and tab-line-mode that ship with Emacs 27 were written anew. Same for those of centaur-tabs. The ideas for the redesign as well as the overall aesthetic are Ben’s, per issue 41:

  • An edge case with Helm’s interpretation of colour values for its ripgrep interface was reported by Manuel Uberti in issue 49: It essentially had to do with the syntax for the regexp engine as read by the underlying rg executable. Collaboration on that front eventually led to fixes in Helm itself, committed by its maintainer. Note that the README for the Modus themes already contains information on how Helm applies a face to the matches of grep or grep-like commands. Issue 49 confirmed what was already known in that regard (i.e. that the “–color=never” command-line option is required to use the Helm face, else a colour value from the ANSI colour vector is used—both are supported by the themes).

  • The faces for Flycheck, Flymake, and Flyspell that would apply an underline effect were completely rewritten to account for relevant differences between GUI and TUI Emacs.

    • For GUI Emacs, all affected faces will now just use a colour-coded wavy underline. Empowered by the introduction of dedicated linter-related colours in prior commits (for version 0.8.0), we no longer have to change the foreground value of the offending text in addition to applying the underline effect. Whereas before the text would also get repainted, which was too intrusive in most circumstances.

    • If support for wavy underlines is not available, we assume the presence of a TUI, which generally is relatively more limited in its ability to reproduce colours with precision (meaning that the dedicated linter colour could be distorted, potentially producing inaccessible combinations). So for those cases we apply a straight underline combined with a colour-coded foreground for the affected text. This makes it more intense compared to the GUI equivalent, but is the necessary course of action to overcome the constraints imposed by the underlying terminal.

  • The palette of Modus Operandi underwent lots of subtle changes to make the background value of hl-line-mode more visible while retaining the overall style and character of the theme. In principle, you should not be able to tell the difference, unless presented with a careful side-by-side comparison. This is the comprehensive report, including a reproducible org-mode document with all the relevant contrast ratios:

  • Fixed `org-hide’ to actually “hide” by using the appropriate colour value.

  • Several other face groups received minor tweaks.

  • The README was improved to better present the available customisation options and to cover other topics of interest.

  • Updated the screen shots and their description in the relevant Wiki page:

Added support for

  • circe
  • el-search
  • eros
  • golden-ratio-scroll-screen
  • highlight-indentation
  • hyperlist
  • indium
  • journalctl-mode
  • minimap
  • nxml-mode
  • vdiff
  • yasnippet