FULL REWRITE: make the themes more programmatic

This provides the basis for the sustainable development of the Modus
themes.  The colours have been consolidated into a consistent palette,
while the colour combinations have been thoroughly reviewed to conform
with the highest accessibility criterion for colour contrast (between
background and foreground values).

Both `modus-operandi' (light) and `modus-vivendi' (dark) now share the
same template.  Only difference are the colour values.  This means
that the mapping of colours to objects is consistent, making the
transition between the two smoother.  The Modus themes can now be
considered part of the same group, which was not really the case in
their initial state.

The development effort will now shift to the coverage of more faces.
Priority will be given to the most common ones and to those provided
by packages I use or have been exposed to.

The Modus themes already are in a workable state.  I consider them
"very good" for my specific needs.  However, I am aware that there
still is room for improvement and potential adjustments.  As such, I
will not be providing a packaged version just yet.
This commit is contained in:
Protesilaos Stavrou 2019-08-07 10:36:38 +03:00
parent 8cd8edfcdd
commit 047e80ce99
No known key found for this signature in database
GPG key ID: 99BD6459CD5CA3EA
2 changed files with 536 additions and 190 deletions

View file

@ -1,113 +1,286 @@
;; modus-operandi.el --- very accessible light theme (WCAG AAA)
;; modus-operandi-theme.el --- very accessible light theme (WCAG AAA)
;;
;; This file is not part of GNU Emacs.
;;
;; Copyright (c) 2019 Protesilaos Stavrou <info@protesilaos.com>
;; Version: 0.1.0alpha
;;
;; This program is free software; you can redistribute it and/or
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;
;;; Commentary:
;;
;; Early prototype. Tested on Emacs 26.1 (Debian 10). The purpose of
;; this theme is to provide a consistent minimum contrast ratio
;; between background and foreground values of 7:1. This meets the
;; highest such accessibility criterion per the guidelines of the
;; Worldwide Web Consortium's Working Group on Accessibility.
;; The template is provided by `customize-create-theme'.
;; The primary purpose of this theme is to provide a consistent
;; minimum contrast ratio between background and foreground values of
;; 7:1 or higher. This meets the highest such accessibility criterion
;; per the guidelines of the Worldwide Web Consortium's Working Group
;; on Accessibility.
;;
;; The secondary goal is to provide as close to full coverage as
;; possible. The output of `list-faces-display' offers all we need.
;; Note though, that it is difficult to create theme styles without
;; actually using the packages/interfaces that require them. As such,
;; the development of this theme will be incremental, gradually
;; incorporating the customisations for packages I use or have been
;; exposed to.
;;
;; The original template is provided by `customize-create-theme'. The
;; design of the colour variables was taken from the Tango theme that
;; comes packaged with GNU Emacs (at least it does on Debian 10).
(deftheme modus-operandi
"Created 2019-07-08.")
"Light theme that conforms with the highest accessibility
standard for colour contrast between background and
foreground elements (WCAG AAA).")
(custom-theme-set-faces
'modus-operandi
'(default ((t (:foreground "#000000" :background "#ffffff"))))
'(cursor ((t (:background "#000000"))))
'(italic ((t (:foreground "#8b3800" :slant italic))))
'(warning ((t (:foreground "#8b3800" :weight bold))))
'(escape-glyph ((t (:weight bold :foreground "#714900"))))
'(homoglyph ((t (:foreground "#714900"))))
'(minibuffer-prompt ((t (:foreground "#0000ff"))))
'(highlight ((t (:foreground "#000000" :background "#00eeff" :weight bold))))
'(region ((t (:foreground "#000000" :background "#d3f1ff"))))
'(shadow ((t (:foreground "#68607d"))))
'(secondary-selection ((t (:foreground "#222222" :background "#55d0d0"))))
'(whitespace-tab ((t (:foreground "#888888"))))
'(trailing-whitespace ((t (:background "#880000"))))
'(font-lock-builtin-face ((t (:foreground "#800090"))))
'(font-lock-comment-delimiter-face ((default (:inherit (font-lock-comment-face)))))
'(font-lock-comment-face ((t (:foreground "#5f4d4f"))))
'(font-lock-constant-face ((t (:foreground "#0000ff"))))
'(font-lock-doc-face ((t (:inherit (font-lock-string-face)))))
'(font-lock-function-name-face ((t (:foreground "#b30042"))))
'(font-lock-keyword-face ((t (:foreground "#7000f0"))))
'(font-lock-negation-char-face ((t nil)))
'(font-lock-preprocessor-face ((t (:inherit (font-lock-builtin-face)))))
'(font-lock-regexp-grouping-backslash ((t (:inherit (bold)))))
'(font-lock-regexp-grouping-construct ((t (:inherit (bold)))))
'(font-lock-string-face ((t (:foreground "#0047d0"))))
'(font-lock-type-face ((t (:weight bold :foreground "#a0009d"))))
'(font-lock-variable-name-face ((t (:weight bold :foreground "#714900"))))
'(font-lock-warning-face ((t (:weight bold :foreground "#9b2230"))))
'(button ((t (:inherit (link)))))
'(link ((t (:underline (:color foreground-color :style line) :foreground "#003399"))))
'(link-visited ((t (:foreground "#7733bb"))))
'(fringe ((t (:inherit (default)))))
'(header-line ((t (:inverse-video t :inherit (default)))))
'(tooltip ((t (:foreground "#000000" :background "lightyellow"))))
'(mode-line ((t (:box (:line-width -1 :color nil :style released-button) :foreground "#464340" :background "#f8f2ff"))))
'(mode-line-buffer-id ((t (:weight bold))))
'(mode-line-emphasis ((t (:weight bold :inherit (highlight)))))
'(mode-line-highlight ((t (:box (:line-width 2 :color "#000000" :style released-button)))))
'(mode-line-inactive ((t (:foreground "#58506d" :background "#e9e9ee"))))
'(isearch ((t (:weight bold :foreground "#000000" :background "#90ff90"))))
'(isearch-fail ((t (:foreground "#000000" :background "#eebbbb"))))
'(lazy-highlight ((t (:foreground "#111111" :background "#ddeecc"))))
'(match ((t (:foreground "#ffffff" :background "#005f26"))))
'(next-error ((t (:foreground "#f3f1f3" :background "#b94000"))))
'(query-replace ((t (:inherit (isearch)))))
'(show-paren-match ((t (:background "#ffccbb" :foreground "#000000"))))
'(show-paren-match-expression ((t (:inherit (show-paren-match)))))
'(show-paren-mismatch ((t (:background "#ffff00" :foreground "#000000"))))
'(ido-first-match ((t (:weight bold))))
'(ido-only-match ((t (:foreground "#0000aa"))))
'(ido-incomplete-regexp ((t (:inherit (font-lock-warning-face)))))
'(ido-subdir ((t (:foreground "#8b3800" :weight bold))))
'(ido-indicator ((t (:background "#ffa200" :foreground "#000000" :width condensed))))
'(ido-virtual ((t (:inherit (font-lock-builtin-face)))))
'(completions-annotations ((t (:inherit (italic)))))
'(completions-common-part ((t nil)))
'(completions-first-difference ((t (:inherit (bold)))))
'(line-number ((t (:foreground "#5f4d4f" :background "#f3f1f3"))))
'(line-number-current-line ((t (:foreground "#000000" :weight bold))))
'(markdown-header-face ((t (:weight bold))))
'(markdown-pre-face ((t (:background "#f6f6f6" :foreground "#770044"))))
'(markdown-inline-code-face ((t (:inherit (markdown-pre-face)))))
'(markdown-blockquote-face ((t (:background "#f3f3f3"))))
'(sh-heredoc ((t (:inherit (font-lock-string-face)))))
'(sh-quoted-exec ((t (:inherit (font-lock-builtin-face)))))
'(diff-added ((t (:foreground "#006000" :background "#f0fff0"))))
'(diff-indicator-added ((t (:inherit (diff-added)))))
'(diff-changed ((t (:foreground "#665500" :background "#ffffee"))))
'(diff-indicator-changed ((t (:inherit (diff-changed)))))
'(diff-removed ((t (:foreground "#880000" :background "#ffe0e0"))))
'(diff-indicator-removed ((t (:inherit (diff-removed)))))
'(diff-file-header ((t (:foreground "#000000" :background "#f3f1f3" :weight bold))))
'(diff-function ((t (:inherit (diff-file-header) :weight normal))))
'(diff-header ((t (:inherit (diff-function)))))
'(diff-hunk-header ((t (:inherit (diff-function)))))
'(diff-index-header ((t (:inherit (diff-file-header) :weight normal))))
)
;; These faces will be inhered by actual constructs. They are meant
;; for those cases where a face needs to distinguish its output from
;; the rest of the text, such as `isearch' and `occur'… We define
;; these separately in order to combine each colour with its
;; appropriate foreground value. This is to ensure a consistent
;; contrast ratio of >= 7:1.
(defface modus-theme-subtle-bg-red nil t)
(defface modus-theme-subtle-bg-green nil t)
(defface modus-theme-subtle-bg-yellow nil t)
(defface modus-theme-subtle-bg-blue nil t)
(defface modus-theme-subtle-bg-magenta nil t)
(defface modus-theme-subtle-bg-cyan nil t)
(defface modus-theme-intense-bg-red nil t)
(defface modus-theme-intense-bg-green nil t)
(defface modus-theme-intense-bg-yellow nil t)
(defface modus-theme-intense-bg-blue nil t)
(defface modus-theme-intense-bg-magenta nil t)
(defface modus-theme-intense-bg-cyan nil t)
;; Define colour palette. Each colour must have a >= 7:1 contrast
;; ratio relative to the foreground/background colour it is rendered
;; against.
(let ((class '((class color) (min-colors 89)))
(fg-main "#000000") (bg-main "#ffffff")
(fg-alt "#5f4d4f") (bg-alt "#f3f1f3")
(fg-dim "#282828") (bg-dim "#f8f8f8")
;; specifically for the mode line and contexts where an on/off
;; state is necessary
(fg-inactive "#505050") (bg-inactive "#efefef")
;; styles for the main constructs
;; must be combined with: bg-main, bg-alt, bg-dim
(red "#a80000") (green "#006800")
(yellow "#8b3800") (blue "#2d48b0")
(magenta "#b30042") (cyan "#005589")
;; styles for common, but still specialised constructs
;; must be combined with: bg-main, bg-alt, bg-dim
(red-alt "#880000") (green-alt "#4a5700")
(yellow-alt "#714900") (blue-alt "#0047d0")
(magenta-alt "#800090") (cyan-alt "#185870")
;; same purpose as above, just slight differences
;; must be combined with: bg-main, bg-alt, bg-dim
(red-alt-other "#880000") (green-alt-other "#005f26")
(yellow-alt-other "#904200") (blue-alt-other "#003399")
(magenta-alt-other "#7733bb") (cyan-alt-other "#005a68")
;; styles for elements that should draw attention to themselves
;; must be combined with: bg-main, bg-alt, bg-dim
(red-intense "#b60000") (green-intense "#90ff90")
(yellow-intense "#ffff00") (blue-intense "#0000ff")
(magenta-intense "#7000f0") (cyan-intense "#33ddff")
;; styles for background elements that should be visible yet subtle
;; must be combined with: fg-dim
(red-subtle-bg "#ffccaa") (green-subtle-bg "#ddeecc")
(yellow-subtle-bg "#ffccaa") (blue-subtle-bg "#ddddff")
(magenta-subtle-bg "#ffddee") (cyan-subtle-bg "#d3f1ff")
;; styles for background elements that should be visible and distinguishable
;; must be combined with: fg-main
(red-intense-bg "#ffaaaa") (green-intense-bg "#aaeeaa")
(yellow-intense-bg "#ffeecc") (blue-intense-bg "#aaddff")
(magenta-intense-bg "#ddccff") (cyan-intense-bg "#aaffee"))
(custom-theme-set-faces
'modus-operandi
;; custom faces that are inherited by other constructs below
;;; subtle coloured backgrounds
`(modus-theme-subtle-bg-red ((,class (:background ,red-subtle-bg :foreground ,fg-dim))))
`(modus-theme-subtle-bg-green ((,class (:background ,green-subtle-bg :foreground ,fg-dim))))
`(modus-theme-subtle-bg-yellow ((,class (:background ,yellow-subtle-bg :foreground ,fg-dim))))
`(modus-theme-subtle-bg-blue ((,class (:background ,blue-subtle-bg :foreground ,fg-dim))))
`(modus-theme-subtle-bg-magenta ((,class (:background ,magenta-subtle-bg :foreground ,fg-dim))))
`(modus-theme-subtle-bg-cyan ((,class (:background ,cyan-subtle-bg :foreground ,fg-dim))))
;;; intense coloured backgrounds
`(modus-theme-intense-bg-red ((,class (:background ,red-intense-bg :foreground ,fg-main))))
`(modus-theme-intense-bg-green ((,class (:background ,green-intense-bg :foreground ,fg-main))))
`(modus-theme-intense-bg-yellow ((,class (:background ,yellow-intense-bg :foreground ,fg-main))))
`(modus-theme-intense-bg-blue ((,class (:background ,blue-intense-bg :foreground ,fg-main))))
`(modus-theme-intense-bg-magenta ((,class (:background ,magenta-intense-bg :foreground ,fg-main))))
`(modus-theme-intense-bg-cyan ((,class (:background ,cyan-intense-bg :foreground ,fg-main))))
;; actual styles
`(default ((,class (:background ,bg-main :foreground ,fg-main))))
`(fringe ((t (:inherit (default)))))
`(cursor ((,class (:background ,fg-main))))
`(italic ((,class (:foreground ,yellow :slant italic))))
`(warning ((,class (:foreground ,red :weight bold))))
`(escape-glyph ((,class (:weight bold :foreground ,yellow-alt))))
`(homoglyph ((,class (:foreground ,yellow-alt-other))))
`(minibuffer-prompt ((,class (:foreground ,blue-intense))))
`(highlight ((t (:inherit (modus-theme-subtle-bg-blue)))))
`(hi-black-b ((t ((:background ,fg-main :foreground ,bg-main)))))
`(hi-green-b ((t (:inherit (modus-theme-intense-bg-green)))))
`(hi-blue-b ((t (:inherit (modus-theme-intense-bg-blue)))))
`(hi-red-b ((t (:inherit (modus-theme-intense-bg-red)))))
`(hi-green ((,class (:background ,bg-alt :underline (:color foreground-color :style line) :foreground ,green))))
`(hi-blue ((,class (:background ,bg-alt :underline (:color foreground-color :style line) :foreground ,blue))))
`(hi-yellow ((,class (:background ,bg-alt :underline (:color foreground-color :style line) :foreground ,yellow))))
`(hi-pink ((,class (:background ,bg-alt :underline (:color foreground-color :style line) :foreground ,magenta))))
`(region ((,class (:inherit (modus-theme-subtle-bg-cyan)))))
`(shadow ((,class (:foreground ,fg-alt))))
`(secondary-selection ((t (:inherit (modus-theme-subtle-bg-magenta)))))
`(whitespace-tab ((,class (:foreground ,fg-alt))))
`(trailing-whitespace ((,class (:background ,red-alt))))
`(font-lock-builtin-face ((,class (:foreground ,magenta-alt))))
`(font-lock-comment-face ((t (:foreground ,fg-alt))))
`(font-lock-comment-delimiter-face ((t (:inherit (font-lock-comment-face)))))
`(font-lock-constant-face ((,class (:foreground ,blue-intense))))
`(font-lock-string-face ((,class (:foreground ,blue-alt))))
`(font-lock-doc-face ((,class (:foreground ,cyan-alt-other))))
`(font-lock-function-name-face ((,class (:foreground ,magenta))))
`(font-lock-keyword-face ((,class (:foreground ,magenta-intense))))
`(font-lock-negation-char-face ((t nil)))
`(font-lock-preprocessor-face ((,class (:foreground ,magenta-alt-other))))
`(font-lock-regexp-grouping-backslash ((t (:weight bold))))
`(font-lock-regexp-grouping-construct ((t (:weight bold))))
`(font-lock-type-face ((,class (:weight bold :foreground ,magenta-alt))))
`(font-lock-variable-name-face ((,class (:weight bold :foreground ,green))))
`(font-lock-warning-face ((,class (:weight bold :foreground ,yellow-alt-other))))
`(link ((,class (:underline (:color foreground-color :style line) :foreground ,blue-alt-other))))
`(link-visited ((,class (:foreground ,magenta-alt-other))))
`(button ((t (:inherit (link)))))
`(header-line ((,class (:background ,bg-alt :foreground ,fg-alt))))
`(tooltip ((t (:inherit (modus-theme-subtle-bg-yellow)))))
`(mode-line ((,class (:box (:line-width -1 :color nil :style released-button) :background ,bg-dim :foreground ,fg-main))))
`(mode-line-buffer-id ((t (:weight bold))))
`(mode-line-emphasis ((t (:weight bold :inherit (highlight)))))
`(mode-line-highlight ((,class (:box (:line-width 1 :color ,fg-main :style released-button) :background ,bg-main))))
`(mode-line-inactive ((,class (:background ,bg-inactive :foreground ,fg-inactive))))
`(isearch ((t (:weight bold :inherit (modus-theme-intense-bg-green)))))
`(isearch-fail ((t (:inherit (modus-theme-subtle-bg-red)))))
`(lazy-highlight ((t (:inherit (modus-theme-subtle-bg-green)))))
`(match ((t (:inherit (modus-theme-intense-bg-blue)))))
`(next-error ((t (:inherit (modus-theme-intense-bg-red))))) ;; check
`(query-replace ((t (:inherit (isearch)))))
`(show-paren-match ((t (:inherit (modus-theme-intense-bg-blue) :weight bold))))
`(show-paren-match-expression ((t (:inherit (show-paren-match)))))
`(show-paren-mismatch ((t (:inherit (modus-theme-intense-bg-red)))))
`(completions-annotations ((t (:inherit (italic)))))
`(completions-common-part ((t nil)))
`(completions-first-difference ((t (:inherit (bold)))))
;;;; ido-mode
`(ido-first-match ((t (:weight bold))))
`(ido-only-match ((,class (:foreground ,cyan-alt-other))))
`(ido-incomplete-regexp ((t (:inherit (font-lock-warning-face)))))
`(ido-subdir ((,class (:foreground ,cyan))))
`(ido-indicator ((,class (:background ,cyan-intense :foreground ,bg-main)))) ;; check
`(ido-virtual ((t (:inherit (font-lock-builtin-face)))))
;;;; dired
`(dired-header ((t (:foreground ,fg-main :weight bold))))
`(dired-directory ((t (:foreground ,blue :weight bold))))
`(dired-flagged ((t (:inherit (modus-theme-intense-bg-red)))))
`(dired-marked ((t (:inherit (modus-theme-intense-bg-magenta)))))
;;;; display-line-numbers-mode (and global variant)
`(line-number ((,class (:background ,bg-alt :foreground ,fg-alt))))
`(line-number-current-line ((,class (:background ,bg-dim :foreground ,fg-dim :weight bold))))
;;;; markdown format
`(markdown-header-face ((t (:weight bold))))
`(markdown-pre-face ((,class (:background ,bg-dim :foreground ,magenta-alt))))
`(markdown-inline-code-face ((t (:inherit (markdown-pre-face)))))
`(markdown-blockquote-face ((,class (:background ,bg-alt))))
;;;; shell scripts
`(sh-heredoc ((t (:inherit (font-lock-string-face)))))
`(sh-quoted-exec ((t (:inherit (font-lock-builtin-face)))))
;;;; diff-mode
`(diff-added ((t (:inherit (modus-theme-subtle-bg-green)))))
`(diff-indicator-added ((t (:inherit (diff-added)))))
`(diff-changed ((t (:inherit (diff-added) :weight bold))))
`(diff-indicator-changed ((t (:inherit (diff-changed)))))
`(diff-removed ((t (:inherit (modus-theme-subtle-bg-red)))))
`(diff-indicator-removed ((t (:inherit (diff-removed)))))
`(diff-file-header ((,class (:background ,bg-alt :weight bold :foreground ,fg-main))))
`(diff-function ((t (:inherit (diff-file-header) :weight normal))))
`(diff-header ((t (:inherit (diff-function)))))
`(diff-hunk-header ((t (:inherit (diff-function)))))
`(diff-index-header ((t (:inherit (diff-function)))))
;;;; magit
`(magit-section ((,class (:background ,bg-dim :foreground ,fg-main))))
`(magit-section-heading ((t (:inherit font-lock-variable-name-face))))
`(magit-section-highlight ((,class (:background ,bg-main))))
`(magit-diff-file-heading ((t (:inherit (diff-file-header)))))
`(magit-diff-file-heading-highlight ((t (:inherit (magit-section-highlight)))))
`(magit-diff-hunk-heading ((,class (:background ,bg-inactive :foreground ,fg-inactive))))
`(magit-diff-hunk-heading-highlight ((t (:inherit (diff-file-header)))))
`(magit-diff-context ((,class (:background ,bg-dim))))
`(magit-diff-context-highlight ((t (:background ,bg-main))))
`(magit-diff-removed ((t (:inherit (modus-theme-subtle-bg-red)))))
`(magit-diff-removed-highlight ((t (:inherit (modus-theme-intense-bg-red)))))
`(magit-diff-added ((t (:inherit (modus-theme-subtle-bg-green)))))
`(magit-diff-added-highlight ((t (:inherit (modus-theme-intense-bg-green)))))
`(magit-diff-changed ((t (:weight bold))))
`(magit-diff-changed-highlight ((t (:weight bold))))
`(magit-diffstat-added ((t (:inherit (magit-diff-added)))))
`(magit-diffstat-removed ((t (:inherit (magit-diff-removed)))))
`(magit-branch-local ((t (:inherit (font-lock-builtin-face)))))
`(magit-branch-current ((t (:inherit (font-lock-type-face)))))
`(magit-branch-remote ((t (:inherit (font-lock-function-name-face)))))
`(magit-hash ((t (:inherit (shadow)))))
;;;; elfeed
`(elfeed-search-date-face ((t (:inherit (default)))))
`(elfeed-search-date-face ((t (:inherit (default) :weight bold))))
`(elfeed-search-feed-face ((t (:inherit (default)))))
`(elfeed-search-tag-face ((t (:inherit (default)))))
`(elfeed-log-debug-level-face ((t (:inherit (modus-theme-intense-bg-magenta)))))
`(elfeed-log-error-level-face ((t (:inherit (modus-theme-intense-bg-red)))))
;;;; found in elfeed, should apply elsewhere check
`(message-header-name ((t (:inherit (default) :weight bold))))
`(message-header-to ((t (:inherit (default) :weight bold))))
`(message-header-subject ((t (:inherit (default) :weight bold))))
`(message-header-other ((t (:inherit (default)))))
;;;; org-mode
`(org-level-1 ((,class (:weight bold :foreground ,fg-main))))
`(org-level-2 ((,class (:weight bold :foreground ,cyan-alt-other))))
`(org-level-3 ((,class (:weight bold :foreground ,magenta-alt-other))))
`(org-level-4 ((,class (:weight bold :foreground ,green-alt-other))))
`(org-level-5 ((,class (:weight bold :foreground ,fg-alt))))
`(org-level-6 ((,class (:weight bold :foreground ,yellow-alt-other))))
`(org-level-7 ((,class (:weight bold :foreground ,blue-alt-other))))
`(org-level-8 ((,class (:weight bold :foreground ,red-alt-other))))
`(org-todo ((t (:inherit (warning)))))
`(org-emphasis ((t (:inherit (italic)))))
`(org-block ((,class (:background ,bg-dim :foreground ,fg-main))))
`(org-block-begin-line ((,class (:background ,bg-alt :foreground ,fg-main))))
`(org-block-end-line ((t (:inherit (org-block-begin-line)))))
`(org-verbatim ((t (:inherit (font-lock-constant-face)))))
;;;; whitespace-mode
`(whitespace-space ((,class (:background ,bg-alt :foreground ,fg-alt))))
`(whitespace-empty ((t (:inherit (modus-theme-intense-bg-magenta)))))
`(whitespace-hspace ((t (whitespace-space))))
`(whitespace-indentation ((t (:inherit (whitespace-space)))))
`(whitespace-line ((t (:inherit (modus-theme-subtle-bg-yellow)))))
`(whitespace-newline ((t (:inherit (whitespace-space)))))
`(whitespace-space-after-tab ((t (:inherit (modus-theme-subtle-bg-magenta)))))
`(whitespace-space-before-tab ((t (:inherit (modus-theme-subtle-bg-yellow)))))
`(whitespace-tab ((t (:inherit (whitespace-space)))))
`(whitespace-trailing ((t (:inherit (modus-theme-intense-bg-red)))))
`(whitespace-big-indent ((t (:inherit (modus-theme-intense-bg-red)))))
))
;;;###autoload
(when load-file-name
(add-to-list 'custom-theme-load-path
(file-name-as-directory (file-name-directory load-file-name))))
(provide-theme 'modus-operandi)
;; modus-operandi-theme.el ends here

View file

@ -1,113 +1,286 @@
;; modus-vivendi.el --- very accessible dark theme (WCAG AAA)
;; modus-vivendi-theme.el --- very accessible light theme (WCAG AAA)
;;
;; This file is not part of GNU Emacs.
;;
;; Copyright (c) 2019 Protesilaos Stavrou <info@protesilaos.com>
;; Version: 0.1.0alpha
;;
;; This program is free software; you can redistribute it and/or
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;
;;; Commentary:
;;
;; Early prototype. Tested on Emacs 26.1 (Debian 10). The purpose of
;; this theme is to provide a consistent minimum contrast ratio
;; between background and foreground values of 7:1. This meets the
;; highest such accessibility criterion per the guidelines of the
;; Worldwide Web Consortium's Working Group on Accessibility.
;; The template is provided by `customize-create-theme'.
;; The primary purpose of this theme is to provide a consistent
;; minimum contrast ratio between background and foreground values of
;; 7:1 or higher. This meets the highest such accessibility criterion
;; per the guidelines of the Worldwide Web Consortium's Working Group
;; on Accessibility.
;;
;; The secondary goal is to provide as close to full coverage as
;; possible. The output of `list-faces-display' offers all we need.
;; Note though, that it is difficult to create theme styles without
;; actually using the packages/interfaces that require them. As such,
;; the development of this theme will be incremental, gradually
;; incorporating the customisations for packages I use or have been
;; exposed to.
;;
;; The original template is provided by `customize-create-theme'. The
;; design of the colour variables was taken from the Tango theme that
;; comes packaged with GNU Emacs (at least it does on Debian 10).
(deftheme modus-vivendi
"Created 2019-07-08.")
"Dark theme that conforms with the highest accessibility
standard for colour contrast between background and
foreground elements (WCAG AAA).")
(custom-theme-set-faces
'modus-vivendi
'(default ((t (:foreground "#ffffff" :background "#000000"))))
'(cursor ((t (:background "#00ff00"))))
'(italic ((t (:foreground "#c0c022"))))
'(warning ((t (:foreground "#ffa900" :weight bold))))
'(escape-glyph ((t (:weight bold :foreground "#d7ae00"))))
'(homoglyph ((t (:foreground "#d7ae00"))))
'(minibuffer-prompt ((t (:foreground "#00ff00"))))
'(highlight ((t (:foreground "#ffffff" :background "#b00055" :weight bold))))
'(region ((t (:foreground "#ffffff" :background "#003388"))))
'(shadow ((t (:foreground "#c4bdaf"))))
'(secondary-selection ((t (:foreground "#ebebeb" :background "#444488"))))
'(whitespace-tab ((t (:foreground "#656565"))))
'(trailing-whitespace ((t (:background "#ef6f44"))))
'(font-lock-builtin-face ((t (:foreground "#33dd99"))))
'(font-lock-comment-delimiter-face ((default (:inherit (font-lock-comment-face)))))
'(font-lock-comment-face ((t (:foreground "#c4bdaf"))))
'(font-lock-constant-face ((t (:foreground "#ffaba3"))))
'(font-lock-doc-face ((t (:inherit (font-lock-string-face)))))
'(font-lock-function-name-face ((t (:foreground "#aaef55"))))
'(font-lock-keyword-face ((t (:foreground "#eecc77"))))
'(font-lock-negation-char-face ((t nil)))
'(font-lock-preprocessor-face ((t (:inherit (font-lock-builtin-face)))))
'(font-lock-regexp-grouping-backslash ((t (:inherit (bold)))))
'(font-lock-regexp-grouping-construct ((t (:inherit (bold)))))
'(font-lock-string-face ((t (:foreground "#ccccff"))))
'(font-lock-type-face ((t (:weight bold :foreground "#00ddaa"))))
'(font-lock-variable-name-face ((t (:weight bold :foreground "#9999ff"))))
'(font-lock-warning-face ((t (:weight bold :foreground "#f69d6a"))))
'(button ((t (:inherit (link)))))
'(link ((t (:underline (:color foreground-color :style line) :foreground "#1db5c3"))))
'(link-visited ((t (:foreground "#ee88ff"))))
'(fringe ((t (:inherit (default)))))
'(header-line ((t (:inverse-video t :inherit (default)))))
'(tooltip ((t (:foreground "#000000" :background "lightyellow"))))
'(mode-line ((t (:box (:line-width -1 :color nil :style released-button) :foreground "#ffffff" :background "#202020"))))
'(mode-line-buffer-id ((t (:weight bold))))
'(mode-line-emphasis ((t (:weight bold :inherit (highlight)))))
'(mode-line-highlight ((t (:box (:line-width 2 :color "#ffffff" :style released-button)))))
'(mode-line-inactive ((t (:foreground "#a9a9a9" :background "#111111"))))
'(isearch ((t (:weight bold :foreground "#ffffff" :background "#a0008d"))))
'(isearch-fail ((t (:foreground "#ffffff" :background "#880000"))))
'(lazy-highlight ((t (:foreground "#dedede" :background "#804080"))))
'(match ((t (:foreground "#000000" :background "#66aaff"))))
'(next-error ((t (:foreground "#333333" :background "#ffcc00"))))
'(query-replace ((t (:inherit (isearch)))))
'(show-paren-match ((t (:background "#8028c1" :foreground "#ffffff"))))
'(show-paren-match-expression ((t (:inherit (show-paren-match)))))
'(show-paren-mismatch ((t (:background "#555500" :foreground "#ffffff"))))
'(ido-first-match ((t (:weight bold))))
'(ido-only-match ((t (:foreground "#00ffff"))))
'(ido-incomplete-regexp ((t (:inherit (font-lock-warning-face)))))
'(ido-subdir ((t (:foreground "#abdd60" :weight bold))))
'(ido-indicator ((t (:background "#ffa200" :foreground "#000000" :width condensed))))
'(ido-virtual ((t (:inherit (font-lock-builtin-face)))))
'(completions-annotations ((t (:inherit (italic)))))
'(completions-common-part ((t nil)))
'(completions-first-difference ((t (:inherit (bold)))))
'(line-number ((t (:foreground "#c4bdaf" :background "#202020"))))
'(line-number-current-line ((t (:foreground "#fff4f0" :weight bold))))
'(markdown-header-face ((t (:weight bold))))
'(markdown-pre-face ((t (:background "#252525" :foreground "#eecccc"))))
'(markdown-inline-code-face ((t (:inherit (markdown-pre-face)))))
'(markdown-blockquote-face ((t (:background "#333333"))))
'(sh-heredoc ((t (:inherit (font-lock-string-face)))))
'(sh-quoted-exec ((t (:inherit (font-lock-builtin-face)))))
'(diff-added ((t (:background "#003000" :foreground "#66cc66"))))
'(diff-indicator-added ((t (:inherit (diff-added)))))
'(diff-changed ((t (:background "#605500" :foreground "#ffff66"))))
'(diff-indicator-changed ((t (:inherit (diff-changed)))))
'(diff-removed ((t (:background "#440000" :foreground "#ff8888"))))
'(diff-indicator-removed ((t (:inherit (diff-removed)))))
'(diff-file-header ((t (:background "#333333" :foreground "#f3f1f3" :weight bold))))
'(diff-function ((t (:inherit (diff-file-header) :weight normal))))
'(diff-header ((t (:inherit (diff-function)))))
'(diff-hunk-header ((t (:inherit (diff-function)))))
'(diff-index-header ((t (:inherit (diff-file-header) :weight normal))))
)
;; These faces will be inhered by actual constructs. They are meant
;; for those cases where a face needs to distinguish its output from
;; the rest of the text, such as `isearch' and `occur'… We define
;; these separately in order to combine each colour with its
;; appropriate foreground value. This is to ensure a consistent
;; contrast ratio of >= 7:1.
(defface modus-theme-subtle-bg-red nil t)
(defface modus-theme-subtle-bg-green nil t)
(defface modus-theme-subtle-bg-yellow nil t)
(defface modus-theme-subtle-bg-blue nil t)
(defface modus-theme-subtle-bg-magenta nil t)
(defface modus-theme-subtle-bg-cyan nil t)
(defface modus-theme-intense-bg-red nil t)
(defface modus-theme-intense-bg-green nil t)
(defface modus-theme-intense-bg-yellow nil t)
(defface modus-theme-intense-bg-blue nil t)
(defface modus-theme-intense-bg-magenta nil t)
(defface modus-theme-intense-bg-cyan nil t)
;; Define colour palette. Each colour must have a >= 7:1 contrast
;; ratio relative to the foreground/background colour it is rendered
;; against.
(let ((class '((class color) (min-colors 89)))
(fg-main "#ffffff") (bg-main "#000000")
(fg-alt "#d8cdcf") (bg-alt "#201626")
(fg-dim "#e0e6f0") (bg-dim "#14091c")
;; specifically for the mode line and contexts where an on/off
;; state is necessary
(fg-inactive "#b9b2b4") (bg-inactive "#282828")
;; styles for the main constructs
;; must be combined with: bg-main, bg-alt, bg-dim
(red "#ff9566") (green "#44bc44")
(yellow "#eecc00") (blue "#33beff")
(magenta "#df88ff") (cyan "#00ddcc")
;; styles for common, but still specialised constructs
;; must be combined with: bg-main, bg-alt, bg-dim
(red-alt "#f0a500") (green-alt "#58dd13")
(yellow-alt "#f0ce33") (blue-alt "#70bdff")
(magenta-alt "#cea0ff") (cyan-alt "#4ae8fc")
;; same purpose as above, just slight differences
;; must be combined with: bg-main, bg-alt, bg-dim
(red-alt-other "#ffaa99") (green-alt-other "#9afd00")
(yellow-alt-other "#e0dd00") (blue-alt-other "#55c4ff")
(magenta-alt-other "#e282dc") (cyan-alt-other "#69fae8")
;; styles for elements that should draw attention to themselves
;; must be combined with: bg-main
(red-intense "#ff6230") (green-intense "#00fc50")
(yellow-intense "#ffdd00") (blue-intense "#9dafff")
(magenta-intense "#ff70cf") (cyan-intense "#30ffc0")
;; styles for background elements that should be visible yet subtle
;; must be combined with: fg-dim
(red-subtle-bg "#990000") (green-subtle-bg "#3c5100")
(yellow-subtle-bg "#654400") (blue-subtle-bg "#004a90")
(magenta-subtle-bg "#820094") (cyan-subtle-bg "#0c5356")
;; styles for background elements that should be visible and distinguishable
;; must be combined with: fg-main
(red-intense-bg "#b60000") (green-intense-bg "#006800")
(yellow-intense-bg "#774400") (blue-intense-bg "#0053bd")
(magenta-intense-bg "#943376") (cyan-intense-bg "#006270"))
(custom-theme-set-faces
'modus-vivendi
;; custom faces that are inherited by other constructs below
;;; subtle coloured backgrounds
`(modus-theme-subtle-bg-red ((,class (:background ,red-subtle-bg :foreground ,fg-dim))))
`(modus-theme-subtle-bg-green ((,class (:background ,green-subtle-bg :foreground ,fg-dim))))
`(modus-theme-subtle-bg-yellow ((,class (:background ,yellow-subtle-bg :foreground ,fg-dim))))
`(modus-theme-subtle-bg-blue ((,class (:background ,blue-subtle-bg :foreground ,fg-dim))))
`(modus-theme-subtle-bg-magenta ((,class (:background ,magenta-subtle-bg :foreground ,fg-dim))))
`(modus-theme-subtle-bg-cyan ((,class (:background ,cyan-subtle-bg :foreground ,fg-dim))))
;;; intense coloured backgrounds
`(modus-theme-intense-bg-red ((,class (:background ,red-intense-bg :foreground ,fg-main))))
`(modus-theme-intense-bg-green ((,class (:background ,green-intense-bg :foreground ,fg-main))))
`(modus-theme-intense-bg-yellow ((,class (:background ,yellow-intense-bg :foreground ,fg-main))))
`(modus-theme-intense-bg-blue ((,class (:background ,blue-intense-bg :foreground ,fg-main))))
`(modus-theme-intense-bg-magenta ((,class (:background ,magenta-intense-bg :foreground ,fg-main))))
`(modus-theme-intense-bg-cyan ((,class (:background ,cyan-intense-bg :foreground ,fg-main))))
;; actual styles
`(default ((,class (:background ,bg-main :foreground ,fg-main))))
`(fringe ((t (:inherit (default)))))
`(cursor ((,class (:background ,fg-main))))
`(italic ((,class (:foreground ,yellow :slant italic))))
`(warning ((,class (:foreground ,red :weight bold))))
`(escape-glyph ((,class (:weight bold :foreground ,yellow-alt))))
`(homoglyph ((,class (:foreground ,yellow-alt-other))))
`(minibuffer-prompt ((,class (:foreground ,blue-intense))))
`(highlight ((t (:inherit (modus-theme-subtle-bg-blue)))))
`(hi-black-b ((t ((:background ,fg-main :foreground ,bg-main)))))
`(hi-green-b ((t (:inherit (modus-theme-intense-bg-green)))))
`(hi-blue-b ((t (:inherit (modus-theme-intense-bg-blue)))))
`(hi-red-b ((t (:inherit (modus-theme-intense-bg-red)))))
`(hi-green ((,class (:background ,bg-alt :underline (:color foreground-color :style line) :foreground ,green))))
`(hi-blue ((,class (:background ,bg-alt :underline (:color foreground-color :style line) :foreground ,blue))))
`(hi-yellow ((,class (:background ,bg-alt :underline (:color foreground-color :style line) :foreground ,yellow))))
`(hi-pink ((,class (:background ,bg-alt :underline (:color foreground-color :style line) :foreground ,magenta))))
`(region ((,class (:inherit (modus-theme-subtle-bg-cyan)))))
`(shadow ((,class (:foreground ,fg-alt))))
`(secondary-selection ((t (:inherit (modus-theme-subtle-bg-magenta)))))
`(whitespace-tab ((,class (:foreground ,fg-alt))))
`(trailing-whitespace ((,class (:background ,red-alt))))
`(font-lock-builtin-face ((,class (:foreground ,magenta-alt))))
`(font-lock-comment-face ((t (:foreground ,fg-alt))))
`(font-lock-comment-delimiter-face ((t (:inherit (font-lock-comment-face)))))
`(font-lock-constant-face ((,class (:foreground ,blue-intense))))
`(font-lock-string-face ((,class (:foreground ,blue-alt))))
`(font-lock-doc-face ((,class (:foreground ,cyan-alt-other))))
`(font-lock-function-name-face ((,class (:foreground ,magenta))))
`(font-lock-keyword-face ((,class (:foreground ,magenta-intense))))
`(font-lock-negation-char-face ((t nil)))
`(font-lock-preprocessor-face ((,class (:foreground ,magenta-alt-other))))
`(font-lock-regexp-grouping-backslash ((t (:weight bold))))
`(font-lock-regexp-grouping-construct ((t (:weight bold))))
`(font-lock-type-face ((,class (:weight bold :foreground ,magenta-alt))))
`(font-lock-variable-name-face ((,class (:weight bold :foreground ,green))))
`(font-lock-warning-face ((,class (:weight bold :foreground ,yellow-alt-other))))
`(link ((,class (:underline (:color foreground-color :style line) :foreground ,blue-alt-other))))
`(link-visited ((,class (:foreground ,magenta-alt-other))))
`(button ((t (:inherit (link)))))
`(header-line ((,class (:background ,bg-alt :foreground ,fg-alt))))
`(tooltip ((t (:inherit (modus-theme-subtle-bg-yellow)))))
`(mode-line ((,class (:box (:line-width -1 :color nil :style released-button) :background ,bg-dim :foreground ,fg-main))))
`(mode-line-buffer-id ((t (:weight bold))))
`(mode-line-emphasis ((t (:weight bold :inherit (highlight)))))
`(mode-line-highlight ((,class (:box (:line-width 1 :color ,fg-main :style released-button) :background ,bg-main))))
`(mode-line-inactive ((,class (:background ,bg-inactive :foreground ,fg-inactive))))
`(isearch ((t (:weight bold :inherit (modus-theme-intense-bg-green)))))
`(isearch-fail ((t (:inherit (modus-theme-subtle-bg-red)))))
`(lazy-highlight ((t (:inherit (modus-theme-subtle-bg-green)))))
`(match ((t (:inherit (modus-theme-intense-bg-blue)))))
`(next-error ((t (:inherit (modus-theme-intense-bg-red))))) ;; check
`(query-replace ((t (:inherit (isearch)))))
`(show-paren-match ((t (:inherit (modus-theme-intense-bg-blue) :weight bold))))
`(show-paren-match-expression ((t (:inherit (show-paren-match)))))
`(show-paren-mismatch ((t (:inherit (modus-theme-intense-bg-red)))))
`(completions-annotations ((t (:inherit (italic)))))
`(completions-common-part ((t nil)))
`(completions-first-difference ((t (:inherit (bold)))))
;;;; ido-mode
`(ido-first-match ((t (:weight bold))))
`(ido-only-match ((,class (:foreground ,cyan-alt-other))))
`(ido-incomplete-regexp ((t (:inherit (font-lock-warning-face)))))
`(ido-subdir ((,class (:foreground ,cyan))))
`(ido-indicator ((,class (:background ,cyan-intense :foreground ,bg-main)))) ;; check
`(ido-virtual ((t (:inherit (font-lock-builtin-face)))))
;;;; dired
`(dired-header ((t (:foreground ,fg-main :weight bold))))
`(dired-directory ((t (:foreground ,blue :weight bold))))
`(dired-flagged ((t (:inherit (modus-theme-intense-bg-red)))))
`(dired-marked ((t (:inherit (modus-theme-intense-bg-magenta)))))
;;;; display-line-numbers-mode (and global variant)
`(line-number ((,class (:background ,bg-alt :foreground ,fg-alt))))
`(line-number-current-line ((,class (:background ,bg-dim :foreground ,fg-dim :weight bold))))
;;;; markdown format
`(markdown-header-face ((t (:weight bold))))
`(markdown-pre-face ((,class (:background ,bg-dim :foreground ,magenta-alt))))
`(markdown-inline-code-face ((t (:inherit (markdown-pre-face)))))
`(markdown-blockquote-face ((,class (:background ,bg-alt))))
;;;; shell scripts
`(sh-heredoc ((t (:inherit (font-lock-string-face)))))
`(sh-quoted-exec ((t (:inherit (font-lock-builtin-face)))))
;;;; diff-mode
`(diff-added ((t (:inherit (modus-theme-subtle-bg-green)))))
`(diff-indicator-added ((t (:inherit (diff-added)))))
`(diff-changed ((t (:inherit (diff-added) :weight bold))))
`(diff-indicator-changed ((t (:inherit (diff-changed)))))
`(diff-removed ((t (:inherit (modus-theme-subtle-bg-red)))))
`(diff-indicator-removed ((t (:inherit (diff-removed)))))
`(diff-file-header ((,class (:background ,bg-alt :weight bold :foreground ,fg-main))))
`(diff-function ((t (:inherit (diff-file-header) :weight normal))))
`(diff-header ((t (:inherit (diff-function)))))
`(diff-hunk-header ((t (:inherit (diff-function)))))
`(diff-index-header ((t (:inherit (diff-function)))))
;;;; magit
`(magit-section ((,class (:background ,bg-dim :foreground ,fg-main))))
`(magit-section-heading ((t (:inherit font-lock-variable-name-face))))
`(magit-section-highlight ((,class (:background ,bg-main))))
`(magit-diff-file-heading ((t (:inherit (diff-file-header)))))
`(magit-diff-file-heading-highlight ((t (:inherit (magit-section-highlight)))))
`(magit-diff-hunk-heading ((,class (:background ,bg-inactive :foreground ,fg-inactive))))
`(magit-diff-hunk-heading-highlight ((t (:inherit (diff-file-header)))))
`(magit-diff-context ((,class (:background ,bg-dim))))
`(magit-diff-context-highlight ((t (:background ,bg-main))))
`(magit-diff-removed ((t (:inherit (modus-theme-subtle-bg-red)))))
`(magit-diff-removed-highlight ((t (:inherit (modus-theme-intense-bg-red)))))
`(magit-diff-added ((t (:inherit (modus-theme-subtle-bg-green)))))
`(magit-diff-added-highlight ((t (:inherit (modus-theme-intense-bg-green)))))
`(magit-diff-changed ((t (:weight bold))))
`(magit-diff-changed-highlight ((t (:weight bold))))
`(magit-diffstat-added ((t (:inherit (magit-diff-added)))))
`(magit-diffstat-removed ((t (:inherit (magit-diff-removed)))))
`(magit-branch-local ((t (:inherit (font-lock-builtin-face)))))
`(magit-branch-current ((t (:inherit (font-lock-type-face)))))
`(magit-branch-remote ((t (:inherit (font-lock-function-name-face)))))
`(magit-hash ((t (:inherit (shadow)))))
;;;; elfeed
`(elfeed-search-date-face ((t (:inherit (default)))))
`(elfeed-search-date-face ((t (:inherit (default) :weight bold))))
`(elfeed-search-feed-face ((t (:inherit (default)))))
`(elfeed-search-tag-face ((t (:inherit (default)))))
`(elfeed-log-debug-level-face ((t (:inherit (modus-theme-intense-bg-magenta)))))
`(elfeed-log-error-level-face ((t (:inherit (modus-theme-intense-bg-red)))))
;;;; found in elfeed, should apply elsewhere check
`(message-header-name ((t (:inherit (default) :weight bold))))
`(message-header-to ((t (:inherit (default) :weight bold))))
`(message-header-subject ((t (:inherit (default) :weight bold))))
`(message-header-other ((t (:inherit (default)))))
;;;; org-mode
`(org-level-1 ((,class (:weight bold :foreground ,fg-main))))
`(org-level-2 ((,class (:weight bold :foreground ,cyan-alt-other))))
`(org-level-3 ((,class (:weight bold :foreground ,magenta-alt-other))))
`(org-level-4 ((,class (:weight bold :foreground ,green-alt-other))))
`(org-level-5 ((,class (:weight bold :foreground ,fg-alt))))
`(org-level-6 ((,class (:weight bold :foreground ,yellow-alt-other))))
`(org-level-7 ((,class (:weight bold :foreground ,blue-alt-other))))
`(org-level-8 ((,class (:weight bold :foreground ,red-alt-other))))
`(org-todo ((t (:inherit (warning)))))
`(org-emphasis ((t (:inherit (italic)))))
`(org-block ((,class (:background ,bg-dim :foreground ,fg-main))))
`(org-block-begin-line ((,class (:background ,bg-alt :foreground ,fg-main))))
`(org-block-end-line ((t (:inherit (org-block-begin-line)))))
`(org-verbatim ((t (:inherit (font-lock-constant-face)))))
;;;; whitespace-mode
`(whitespace-space ((,class (:background ,bg-alt :foreground ,fg-alt))))
`(whitespace-empty ((t (:inherit (modus-theme-intense-bg-magenta)))))
`(whitespace-hspace ((t (whitespace-space))))
`(whitespace-indentation ((t (:inherit (whitespace-space)))))
`(whitespace-line ((t (:inherit (modus-theme-subtle-bg-yellow)))))
`(whitespace-newline ((t (:inherit (whitespace-space)))))
`(whitespace-space-after-tab ((t (:inherit (modus-theme-subtle-bg-magenta)))))
`(whitespace-space-before-tab ((t (:inherit (modus-theme-subtle-bg-yellow)))))
`(whitespace-tab ((t (:inherit (whitespace-space)))))
`(whitespace-trailing ((t (:inherit (modus-theme-intense-bg-red)))))
`(whitespace-big-indent ((t (:inherit (modus-theme-intense-bg-red)))))
))
;;;###autoload
(when load-file-name
(add-to-list 'custom-theme-load-path
(file-name-as-directory (file-name-directory load-file-name))))
(provide-theme 'modus-vivendi)
;; modus-vivendi-theme.el ends here