mirror of
https://github.com/protesilaos/modus-themes.git
synced 2026-09-10 07:16:30 -04:00
Compare commits
No commits in common. "main" and "2.3.2" have entirely different histories.
4788
CHANGELOG.org
4788
CHANGELOG.org
File diff suppressed because it is too large
Load diff
4
COPYING
4
COPYING
|
|
@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
|
|||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
modus-themes
|
||||
Copyright (C) 2019-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2019-2022 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
|
|||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
modus-themes Copyright (C) 2019-2023 Free Software Foundation, Inc.
|
||||
modus-themes Copyright (C) 2019-2022 Free Software Foundation, Inc.
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
|
|
|||
321
README.md
321
README.md
|
|
@ -1,137 +1,230 @@
|
|||
# Modus themes for GNU Emacs
|
||||
# Modus themes for GNU Emacs (Modus Operandi and Modus Vivendi)
|
||||
|
||||
IMAGES HERE: <https://protesilaos.com/emacs/modus-themes-pictures>.
|
||||
A pair of highly accessible themes that conform with the WCAG AAA
|
||||
standard for colour contrast between background and foreground
|
||||
combinations (a minimum contrast of 7:1---the highest standard of its
|
||||
kind). The Modus themes also strive to empower users with red-green
|
||||
color deficiency: this is achieved through customisation options that
|
||||
replace all relevant instances of green with blue, as well as the
|
||||
overall design of the themes which relies mostly on colours that cover
|
||||
the blue-cyan-magenta side of the spectrum.
|
||||
|
||||
Highly accessible themes, conforming with the highest standard for
|
||||
colour contrast between background and foreground values (WCAG AAA).
|
||||
They also are optimised for users with red-green colour deficiency.
|
||||
The themes are built into GNU Emacs 28 (development target). They are
|
||||
also distributed in several packages formats.
|
||||
|
||||
The themes are very customisable and provide support for a very wide
|
||||
range of packages. Their manual is detailed so that new users can get
|
||||
started, while it also provides custom code for all sorts of more
|
||||
advanced customisations.
|
||||
+ `modus-operandi` is light.
|
||||
+ `modus-vivendi` is dark.
|
||||
|
||||
Since August 2020, the original Modus themes (`modus-operandi`,
|
||||
`modus-vivendi`) are built into Emacs version 28 or higher. Emacs 28
|
||||
ships with `modus-themes` version `1.6.0`. Emacs 29 includes version
|
||||
`3.0.0`. Emacs 30 provides a newer, refactored version that
|
||||
thoroughly refashions how the themes are implemented and customized.
|
||||
Such major versions are not backward-compatible due to the limited
|
||||
resources at my disposal to support multiple versions of Emacs and of
|
||||
the themes across the years.
|
||||
For some demo content, check:
|
||||
|
||||
Starting with version `5.0.0` of the `modus-themes`, other packages
|
||||
can be built on top to provide their own "Modus" derivative themes.
|
||||
The manual has a section about building on top of Modus. My
|
||||
`ef-themes` and `standard-themes` are done in this way (versions
|
||||
`2.0.0` and `3.0.0`, respectively).
|
||||
+ The screenshots of the themes <https://protesilaos.com/emacs/modus-themes-pictures/>.
|
||||
+ My videos on Emacs <https://protesilaos.com/code-casts/>.
|
||||
|
||||
+ Package name (GNU ELPA): `modus-themes`
|
||||
+ Official manual: <https://protesilaos.com/emacs/modus-themes>
|
||||
+ Change log: <https://protesilaos.com/emacs/modus-themes-changelog>
|
||||
+ Colour palette: <https://protesilaos.com/emacs/modus-themes-colors>
|
||||
+ Sample pictures: <https://protesilaos.com/emacs/modus-themes-pictures>
|
||||
+ Git repositories:
|
||||
+ GitHub: <https://github.com/protesilaos/modus-themes>
|
||||
+ GitLab: <https://gitlab.com/protesilaos/modus-themes>
|
||||
+ Backronym: My Old Display Unexpectedly Sharpened ... themes.
|
||||
## Quick setup for the latest version
|
||||
|
||||
### Built-in version
|
||||
|
||||
For the themes that are built into Emacs you cannot `require` the
|
||||
package. Use the following instead.
|
||||
|
||||
With `use-package`:
|
||||
|
||||
```elisp
|
||||
(use-package emacs
|
||||
:init
|
||||
;; Add all your customizations prior to loading the themes
|
||||
(setq modus-themes-italic-constructs t
|
||||
modus-themes-bold-constructs nil
|
||||
modus-themes-region '(bg-only no-extend))
|
||||
:config
|
||||
;; Load the theme of your choice:
|
||||
(load-theme 'modus-operandi) ;; OR (load-theme 'modus-vivendi)
|
||||
:bind ("<f5>" . modus-themes-toggle)
|
||||
```
|
||||
|
||||
Without `use-package`:
|
||||
|
||||
```elisp
|
||||
;; Add all your customizations prior to loading the themes
|
||||
(setq modus-themes-italic-constructs t
|
||||
modus-themes-bold-constructs nil
|
||||
modus-themes-region '(bg-only no-extend))
|
||||
|
||||
;; Load the theme of your choice:
|
||||
(load-theme 'modus-operandi) ;; OR (load-theme 'modus-vivendi)
|
||||
|
||||
(define-key global-map (kbd "<f5>") #'modus-themes-toggle)
|
||||
```
|
||||
|
||||
### Packaged version
|
||||
|
||||
With `use-package`:
|
||||
|
||||
```elisp
|
||||
(use-package modus-themes
|
||||
:ensure t
|
||||
:demand t
|
||||
:ensure
|
||||
:init
|
||||
;; Starting with version 5.0.0 of the `modus-themes', other packages
|
||||
;; can be built on top to provide their own "Modus" derivatives.
|
||||
;; For example, this is what I do with my `ef-themes' and
|
||||
;; `standard-themes' (starting with versions 2.0.0 and 3.0.0,
|
||||
;; respectively).
|
||||
;;
|
||||
;; The `modus-themes-include-derivatives-mode' makes all Modus
|
||||
;; commands that act on a theme consider all such derivatives, if
|
||||
;; their respective packages are available and have been loaded.
|
||||
;;
|
||||
;; Note that those packages can even completely take over from the
|
||||
;; Modus themes such that, for example, `modus-themes-rotate' only
|
||||
;; goes through the Ef themes (to this end, the Ef themes provide
|
||||
;; the `ef-themes-take-over-modus-themes-mode' and the Standard
|
||||
;; themes have the `standard-themes-take-over-modus-themes-mode'
|
||||
;; equivalent).
|
||||
;;
|
||||
;; If you only care about the Modus themes, then (i) you do not need
|
||||
;; to enable the `modus-themes-include-derivatives-mode' and (ii) do
|
||||
;; not install and activate those other theme packages.
|
||||
(modus-themes-include-derivatives-mode 1)
|
||||
:bind
|
||||
(("<f5>" . modus-themes-rotate)
|
||||
("C-<f5>" . modus-themes-select)
|
||||
("M-<f5>" . modus-themes-load-random))
|
||||
;; Add all your customizations prior to loading the themes
|
||||
(setq modus-themes-italic-constructs t
|
||||
modus-themes-bold-constructs nil
|
||||
modus-themes-region '(bg-only no-extend))
|
||||
|
||||
;; Load the theme files before enabling a theme
|
||||
(modus-themes-load-themes)
|
||||
:config
|
||||
;; Your customizations here. All customizations must evaluated
|
||||
;; BEFORE loading the theme.
|
||||
(setq modus-themes-to-toggle '(modus-operandi modus-vivendi)
|
||||
modus-themes-to-rotate modus-themes-items
|
||||
modus-themes-mixed-fonts t
|
||||
modus-themes-variable-pitch-ui t
|
||||
modus-themes-italic-constructs t
|
||||
modus-themes-bold-constructs t
|
||||
modus-themes-completions '((t . (bold)))
|
||||
modus-themes-prompts '(bold)
|
||||
modus-themes-headings
|
||||
'((agenda-structure . (variable-pitch light 2.2))
|
||||
(agenda-date . (variable-pitch regular 1.3))
|
||||
(t . (regular 1.15))))
|
||||
|
||||
(setq modus-themes-common-palette-overrides nil)
|
||||
|
||||
;; Finally, load your theme of choice (or a random one with
|
||||
;; `modus-themes-load-random', `modus-themes-load-random-dark',
|
||||
;; `modus-themes-load-random-light').
|
||||
(modus-themes-load-theme 'modus-operandi))
|
||||
;; Load the theme of your choice:
|
||||
(modus-themes-load-operandi) ;; OR (modus-themes-load-vivendi)
|
||||
:bind ("<f5>" . modus-themes-toggle))
|
||||
```
|
||||
|
||||
## Links to other projects
|
||||
Without `use-package`:
|
||||
|
||||
In this section I collect links to other themes built on top of Modus,
|
||||
have Modus as a dependency, or are porting Modus to some other
|
||||
platform. You are welcome to append your project to the relevant list.
|
||||
```elisp
|
||||
(require 'modus-themes)
|
||||
|
||||
In linking to these projects, I am not endorsing anybody's views.
|
||||
;; Add all your customizations prior to loading the themes
|
||||
(setq modus-themes-italic-constructs t
|
||||
modus-themes-bold-constructs nil
|
||||
modus-themes-region '(bg-only no-extend))
|
||||
|
||||
### Emacs themes based on Modus
|
||||
;; Load the theme files before enabling a theme
|
||||
(modus-themes-load-themes)
|
||||
|
||||
This is not an exhaustive list. You are welcome to add your package
|
||||
here. Newer projects are at the bottom and are added as I am made
|
||||
aware of them.
|
||||
;; Load the theme of your choice:
|
||||
(modus-themes-load-operandi) ;; OR (modus-themes-load-vivendi)
|
||||
|
||||
- `ef-themes` by Protesilaos <https://github.com/protesilaos/ef-themes>
|
||||
- `standard-themes` by Protesilaos <https://github.com/protesilaos/standard-themes>
|
||||
- `modus-ewal-theme` by Oliwier Czerwiński <https://github.com/deadendpl/modus-ewal-theme>
|
||||
- `modus-flexoki` by Derek Passen <https://github.com/dpassen/modus-flexoki>
|
||||
- `faff-theme` (since version 4) by James Ferguson <https://github.com/WJCFerguson/emacs-faff-theme>
|
||||
- `modus-catpuccin` by Magnus Therning <https://gitlab.com/magus/modus-catppuccin>
|
||||
- `pixel-themes` by Lucas <https://github.com/lucasobx/pixel-themes>
|
||||
- `modus-nordic` (`modus-nordic-night` and `modus-nordic-midnight`) by Ashton Wiersdorf <https://codeberg.org/ashton314/modus-nordic-night>
|
||||
- `folio-theme` by kn66 (nobu43) <https://github.com/kn66/folio-theme.el>
|
||||
- `modus-alabaster` by Derek Passen <https://github.com/dpassen/modus-alabaster>
|
||||
- `modus-vague` by Ashish Panigrahi <https://github.com/paniash/modus-vague.git>
|
||||
- `peppers-theme` by Joar von Arndt <https://codeberg.org/joar/peppers-theme>
|
||||
(define-key global-map (kbd "<f5>") #'modus-themes-toggle)
|
||||
```
|
||||
|
||||
### Other Emacs packages based on Modus
|
||||
Note: make sure that you **do not customise** `custom-theme-load-path`
|
||||
or `custom-theme-directory` _after_ the themes' package declaration.
|
||||
That will lead to failures in loading the files. If you must change
|
||||
those variables, do it before the package declaration.
|
||||
|
||||
- `modus-themes-exporter` by Protesilaos <https://github.com/protesilaos/modus-themes-exporter>
|
||||
## All customisations in short
|
||||
|
||||
### Projects inspired by the Modus themes
|
||||
While you should read the manual for all the details (see next section),
|
||||
here is a snippet with all current customisation options and their
|
||||
possible values. Note that those settings are only for purposes of
|
||||
demonstration:
|
||||
|
||||
This is not an exhaustive list. You are welcome to add your project here.
|
||||
```elisp
|
||||
(setq modus-themes-italic-constructs t
|
||||
modus-themes-bold-constructs nil
|
||||
modus-themes-mixed-fonts nil
|
||||
modus-themes-subtle-line-numbers nil
|
||||
modus-themes-intense-mouseovers nil
|
||||
modus-themes-deuteranopia t
|
||||
modus-themes-tabs-accented t
|
||||
modus-themes-variable-pitch-ui nil
|
||||
modus-themes-inhibit-reload t ; only applies to `customize-set-variable' and related
|
||||
|
||||
- `hugo-modus` by Yejun Su is a theme for the Hugo static site
|
||||
generator: <https://github.com/goofansu/hugo-modus>. It uses colours
|
||||
from the Modus themes.
|
||||
- `modus-themes.nvim` by Miika Nissi and others is a port for NeoVim:
|
||||
<https://github.com/miikanissi/modus-themes.nvim>.
|
||||
- `zed-modus-themes` by Vitaly Slobodin is a port for the Zed editor:
|
||||
<https://github.com/vitallium/zed-modus-themes>.
|
||||
- `word-smith` by Sadsnake1 is a distraction-free writing for Obsidian
|
||||
that includes ports of the Modus themes: <https://github.com/Sadsnake1/word-smith>
|
||||
- `omarchy-modus-themes` by Dhavan Vaidya: <https://github.com/codingquark/omarchy-modus-themes>
|
||||
modus-themes-fringes nil ; {nil,'subtle,'intense}
|
||||
|
||||
;; Options for `modus-themes-lang-checkers' are either nil (the
|
||||
;; default), or a list of properties that may include any of those
|
||||
;; symbols: `straight-underline', `text-also', `background',
|
||||
;; `intense' OR `faint'.
|
||||
modus-themes-lang-checkers nil
|
||||
|
||||
;; Options for `modus-themes-mode-line' are either nil, or a list
|
||||
;; that can combine any of `3d' OR `moody', `borderless',
|
||||
;; `accented', a natural number for extra padding (or a cons cell
|
||||
;; of padding and NATNUM), and a floating point for the height of
|
||||
;; the text relative to the base font size (or a cons cell of
|
||||
;; height and FLOAT)
|
||||
modus-themes-mode-line '(accented borderless (padding . 4) (height . 0.9))
|
||||
|
||||
;; Same as above:
|
||||
;; modus-themes-mode-line '(accented borderless 4 0.9)
|
||||
|
||||
;; Options for `modus-themes-markup' are either nil, or a list
|
||||
;; that can combine any of `bold', `italic', `background',
|
||||
;; `intense'.
|
||||
modus-themes-markup '(background italic)
|
||||
|
||||
;; Options for `modus-themes-syntax' are either nil (the default),
|
||||
;; or a list of properties that may include any of those symbols:
|
||||
;; `faint', `yellow-comments', `green-strings', `alt-syntax'
|
||||
modus-themes-syntax nil
|
||||
|
||||
;; Options for `modus-themes-hl-line' are either nil (the default),
|
||||
;; or a list of properties that may include any of those symbols:
|
||||
;; `accented', `underline', `intense'
|
||||
modus-themes-hl-line '(underline accented)
|
||||
|
||||
;; Options for `modus-themes-paren-match' are either nil (the
|
||||
;; default), or a list of properties that may include any of those
|
||||
;; symbols: `bold', `intense', `underline'
|
||||
modus-themes-paren-match '(bold intense)
|
||||
|
||||
;; Options for `modus-themes-links' are either nil (the default),
|
||||
;; or a list of properties that may include any of those symbols:
|
||||
;; `neutral-underline' OR `no-underline', `faint' OR `no-color',
|
||||
;; `bold', `italic', `background'
|
||||
modus-themes-links '(neutral-underline background)
|
||||
|
||||
;; Options for `modus-themes-box-buttons' are either nil (the
|
||||
;; default), or a list that can combine any of `flat', `accented',
|
||||
;; `faint', `variable-pitch', `underline', `all-buttons', the
|
||||
;; symbol of any font weight as listed in `modus-themes-weights',
|
||||
;; and a floating point number (e.g. 0.9) for the height of the
|
||||
;; button's text.
|
||||
modus-themes-box-buttons '(variable-pitch flat faint 0.9)
|
||||
|
||||
;; Options for `modus-themes-prompts' are either nil (the
|
||||
;; default), or a list of properties that may include any of those
|
||||
;; symbols: `background', `bold', `gray', `intense', `italic'
|
||||
modus-themes-prompts '(intense bold)
|
||||
|
||||
;; The `modus-themes-completions' is an alist that reads three
|
||||
;; keys: `matches', `selection', `popup'. Each accepts a nil
|
||||
;; value (or empty list) or a list of properties that can include
|
||||
;; any of the following (for WEIGHT read further below):
|
||||
;;
|
||||
;; `matches' - `background', `intense', `underline', `italic', WEIGHT
|
||||
;; `selection' - `accented', `intense', `underline', `italic', `text-also' WEIGHT
|
||||
;; `popup' - same as `selected'
|
||||
;; `t' - applies to any key not explicitly referenced (check docs)
|
||||
;;
|
||||
;; WEIGHT is a symbol such as `semibold', `light', or anything
|
||||
;; covered in `modus-themes-weights'. Bold is used in the absence
|
||||
;; of an explicit WEIGHT.
|
||||
modus-themes-completions '((matches . (extrabold))
|
||||
(selection . (semibold accented))
|
||||
(popup . (accented intense)))
|
||||
|
||||
modus-themes-mail-citations nil ; {nil,'intense,'faint,'monochrome}
|
||||
|
||||
;; Options for `modus-themes-region' are either nil (the default),
|
||||
;; or a list of properties that may include any of those symbols:
|
||||
;; `no-extend', `bg-only', `accented'
|
||||
modus-themes-region '(bg-only no-extend)
|
||||
|
||||
;; Options for `modus-themes-diffs': nil, 'desaturated, 'bg-only
|
||||
modus-themes-diffs 'desaturated
|
||||
|
||||
modus-themes-org-blocks 'gray-background ; {nil,'gray-background,'tinted-background}
|
||||
|
||||
modus-themes-org-agenda ; this is an alist: read the manual or its doc string
|
||||
'((header-block . (variable-pitch 1.3))
|
||||
(header-date . (grayscale workaholic bold-today 1.1))
|
||||
(event . (accented varied))
|
||||
(scheduled . uniform)
|
||||
(habit . traffic-light))
|
||||
|
||||
modus-themes-headings ; this is an alist: read the manual or its doc string
|
||||
'((1 . (overline background variable-pitch 1.3))
|
||||
(2 . (rainbow overline 1.1))
|
||||
(t . (semibold))))
|
||||
```
|
||||
|
||||
## Further information
|
||||
|
||||
Read the [Info manual HTML](https://protesilaos.com/emacs/modus-themes)
|
||||
version for how to install, load, enable, and customise the themes. If
|
||||
you are using the latest version of the themes, you already have the
|
||||
manual installed: evaluate `(info "(modus-themes) Top")` to start
|
||||
reading it.
|
||||
|
||||
The themes cover a broad range of packages and are highly customisable.
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
7948
doc/modus-themes.org
7948
doc/modus-themes.org
File diff suppressed because it is too large
Load diff
|
|
@ -1,95 +0,0 @@
|
|||
;;; modus-operandi-deuteranopia-theme.el --- Deuteranopia-optimized theme with a white background -*- lexical-binding:t -*-
|
||||
|
||||
;; Copyright (C) 2019-2026 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Protesilaos <info@protesilaos.com>
|
||||
;; Maintainer: Protesilaos <info@protesilaos.com>
|
||||
;; URL: https://github.com/protesilaos/modus-themes
|
||||
;; Keywords: faces, theme, accessibility
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs is free software: you can redistribute it and/or modify
|
||||
;; 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.
|
||||
;;
|
||||
;; GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; The Modus themes conform with the highest standard for
|
||||
;; color-contrast accessibility between background and foreground
|
||||
;; values (WCAG AAA). They are also highly customizable and can even
|
||||
;; be used as the basis for other themes. Please refer to the official
|
||||
;; Info manual for further documentation (distributed with the themes,
|
||||
;; or available at: <https://protesilaos.com/emacs/modus-themes>).
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
||||
|
||||
(unless (and (fboundp 'require-theme)
|
||||
load-file-name
|
||||
(equal (file-name-directory load-file-name)
|
||||
(expand-file-name "themes/" data-directory))
|
||||
(require-theme 'modus-themes t))
|
||||
(require 'modus-themes))
|
||||
|
||||
(defcustom modus-operandi-deuteranopia-palette-user nil
|
||||
"Like the `modus-operandi-deuteranopia-palette' for user-defined entries.
|
||||
This is meant to extend the palette with custom named colors and/or
|
||||
semantic palette mappings. Those may then be used in combination with
|
||||
palette overrides (also see `modus-themes-common-palette-overrides' and
|
||||
`modus-operandi-deuteranopia-palette-overrides')."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.5.0")
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Option to extend the palette for use with overrides"))
|
||||
|
||||
(defcustom modus-operandi-deuteranopia-palette-overrides nil
|
||||
"Overrides for `modus-operandi-deuteranopia-palette'.
|
||||
|
||||
Mirror the elements of the aforementioned palette, overriding
|
||||
their value.
|
||||
|
||||
For overrides that are shared across all of the Modus themes,
|
||||
refer to `modus-themes-common-palette-overrides'.
|
||||
|
||||
Theme-specific overrides take precedence over shared overrides.
|
||||
The idea of common overrides is to change semantic color
|
||||
mappings, such as to make the cursor red. Wherea theme-specific
|
||||
overrides can also be used to change the value of a named color,
|
||||
such as what hexadecimal RGB value the red-warmer symbol
|
||||
represents."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.0.0")
|
||||
:version "30.1"
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Palette overrides"))
|
||||
|
||||
(modus-themes-theme
|
||||
'modus-operandi-deuteranopia
|
||||
'modus-themes
|
||||
"Deuteranopia-optimized theme with a white background.
|
||||
This variant is optimized for users with red-green color
|
||||
deficiency (deuteranopia). It conforms with the highest
|
||||
legibility standard for color contrast between background and
|
||||
foreground in any given piece of text, which corresponds to a
|
||||
minimum contrast in relative luminance of 7:1 (WCAG AAA
|
||||
standard)."
|
||||
'light
|
||||
'modus-themes-operandi-deuteranopia-palette
|
||||
'modus-operandi-deuteranopia-palette-user
|
||||
'modus-operandi-deuteranopia-palette-overrides
|
||||
'modus-themes-faces-deuteranopia)
|
||||
|
||||
(provide 'modus-operandi-deuteranopia-theme)
|
||||
|
||||
;;; modus-operandi-deuteranopia-theme.el ends here
|
||||
|
|
@ -1,10 +1,11 @@
|
|||
;;; modus-operandi-theme.el --- Elegant, highly legible theme with a white background -*- lexical-binding:t -*-
|
||||
;;; modus-operandi-theme.el --- Elegant, highly legible and customizable light theme -*- lexical-binding:t -*-
|
||||
|
||||
;; Copyright (C) 2019-2026 Free Software Foundation, Inc.
|
||||
;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Protesilaos <info@protesilaos.com>
|
||||
;; Maintainer: Protesilaos <info@protesilaos.com>
|
||||
;; URL: https://github.com/protesilaos/modus-themes
|
||||
;; Author: Protesilaos Stavrou <info@protesilaos.com>
|
||||
;; URL: https://git.sr.ht/~protesilaos/modus-themes
|
||||
;; Version: 2.3.2
|
||||
;; Package-Requires: ((emacs "27.1"))
|
||||
;; Keywords: faces, theme, accessibility
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
|
@ -24,69 +25,48 @@
|
|||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; The Modus themes conform with the highest standard for
|
||||
;; color-contrast accessibility between background and foreground
|
||||
;; values (WCAG AAA). They are also highly customizable and can even
|
||||
;; be used as the basis for other themes. Please refer to the official
|
||||
;; Info manual for further documentation (distributed with the themes,
|
||||
;; or available at: <https://protesilaos.com/emacs/modus-themes>).
|
||||
;; Modus Operandi is the light variant of the Modus themes (Modus
|
||||
;; Vivendi is the dark one). The themes are designed for color-contrast
|
||||
;; accessibility. More specifically:
|
||||
;;
|
||||
;; 1. 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 (WCAG AAA
|
||||
;; standard).
|
||||
;;
|
||||
;; 2. Offer as close to full face coverage as possible. The list is
|
||||
;; already quite long, with more additions to follow as part of the
|
||||
;; ongoing development process.
|
||||
;;
|
||||
;; For a complete view of the project, also refer to the following files
|
||||
;; (should be distributed in the same repository/directory as the
|
||||
;; current item):
|
||||
;;
|
||||
;; - modus-themes.el (Main code shared between the themes)
|
||||
;; - modus-vivendi-theme.el (Dark theme)
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
||||
|
||||
(unless (and (fboundp 'require-theme)
|
||||
load-file-name
|
||||
(equal (file-name-directory load-file-name)
|
||||
(expand-file-name "themes/" data-directory))
|
||||
(require-theme 'modus-themes t))
|
||||
(require 'modus-themes))
|
||||
(eval-and-compile
|
||||
(unless (and (fboundp 'require-theme)
|
||||
load-file-name
|
||||
(equal (file-name-directory load-file-name)
|
||||
(expand-file-name "themes/" data-directory))
|
||||
(require-theme 'modus-themes t))
|
||||
(require 'modus-themes))
|
||||
|
||||
(defcustom modus-operandi-palette-user nil
|
||||
"Like the `modus-operandi-palette' for user-defined entries.
|
||||
This is meant to extend the palette with custom named colors and/or
|
||||
semantic palette mappings. Those may then be used in combination with
|
||||
palette overrides (also see `modus-themes-common-palette-overrides' and
|
||||
`modus-operandi-palette-overrides')."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.5.0")
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Option to extend the palette for use with overrides"))
|
||||
|
||||
(defcustom modus-operandi-palette-overrides nil
|
||||
"Overrides for `modus-operandi-palette'.
|
||||
|
||||
Mirror the elements of the aforementioned palette, overriding
|
||||
their value.
|
||||
|
||||
For overrides that are shared across all of the Modus themes,
|
||||
refer to `modus-themes-common-palette-overrides'.
|
||||
|
||||
Theme-specific overrides take precedence over shared overrides.
|
||||
The idea of common overrides is to change semantic color
|
||||
mappings, such as to make the cursor red. Wherea theme-specific
|
||||
overrides can also be used to change the value of a named color,
|
||||
such as what hexadecimal RGB value the red-warmer symbol
|
||||
represents."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.0.0")
|
||||
:version "30.1"
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Palette overrides"))
|
||||
|
||||
(modus-themes-theme
|
||||
'modus-operandi
|
||||
'modus-themes
|
||||
"Elegant, highly legible theme with a white background.
|
||||
(deftheme modus-operandi
|
||||
"Elegant, highly legible and customizable light theme.
|
||||
Conforms with the highest legibility standard for color contrast
|
||||
between background and foreground in any given piece of text,
|
||||
which corresponds to a minimum contrast in relative luminance of
|
||||
7:1 (WCAG AAA standard)."
|
||||
'light
|
||||
'modus-themes-operandi-palette
|
||||
'modus-operandi-palette-user
|
||||
'modus-operandi-palette-overrides)
|
||||
7:1 (WCAG AAA standard).")
|
||||
|
||||
(provide 'modus-operandi-theme)
|
||||
(modus-themes-theme modus-operandi)
|
||||
|
||||
(provide-theme 'modus-operandi))
|
||||
|
||||
;;; modus-operandi-theme.el ends here
|
||||
|
|
|
|||
|
|
@ -1,92 +0,0 @@
|
|||
;;; modus-operandi-tinted-theme.el --- Elegant, highly legible theme with a light ochre background -*- lexical-binding:t -*-
|
||||
|
||||
;; Copyright (C) 2019-2026 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Protesilaos <info@protesilaos.com>
|
||||
;; Maintainer: Protesilaos <info@protesilaos.com>
|
||||
;; URL: https://github.com/protesilaos/modus-themes
|
||||
;; Keywords: faces, theme, accessibility
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs is free software: you can redistribute it and/or modify
|
||||
;; 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.
|
||||
;;
|
||||
;; GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; The Modus themes conform with the highest standard for
|
||||
;; color-contrast accessibility between background and foreground
|
||||
;; values (WCAG AAA). They are also highly customizable and can even
|
||||
;; be used as the basis for other themes. Please refer to the official
|
||||
;; Info manual for further documentation (distributed with the themes,
|
||||
;; or available at: <https://protesilaos.com/emacs/modus-themes>).
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
||||
|
||||
(unless (and (fboundp 'require-theme)
|
||||
load-file-name
|
||||
(equal (file-name-directory load-file-name)
|
||||
(expand-file-name "themes/" data-directory))
|
||||
(require-theme 'modus-themes t))
|
||||
(require 'modus-themes))
|
||||
|
||||
(defcustom modus-operandi-tinted-palette-user nil
|
||||
"Like the `modus-operandi-tinted-palette' for user-defined entries.
|
||||
This is meant to extend the palette with custom named colors and/or
|
||||
semantic palette mappings. Those may then be used in combination with
|
||||
palette overrides (also see `modus-themes-common-palette-overrides' and
|
||||
`modus-operandi-tinted-palette-overrides')."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.5.0")
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Option to extend the palette for use with overrides"))
|
||||
|
||||
(defcustom modus-operandi-tinted-palette-overrides nil
|
||||
"Overrides for `modus-operandi-tinted-palette'.
|
||||
|
||||
Mirror the elements of the aforementioned palette, overriding
|
||||
their value.
|
||||
|
||||
For overrides that are shared across all of the Modus themes,
|
||||
refer to `modus-themes-common-palette-overrides'.
|
||||
|
||||
Theme-specific overrides take precedence over shared overrides.
|
||||
The idea of common overrides is to change semantic color
|
||||
mappings, such as to make the cursor red. Wherea theme-specific
|
||||
overrides can also be used to change the value of a named color,
|
||||
such as what hexadecimal RGB value the red-warmer symbol
|
||||
represents."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.0.0")
|
||||
:version "30.1"
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Palette overrides"))
|
||||
|
||||
(modus-themes-theme
|
||||
'modus-operandi-tinted
|
||||
'modus-themes
|
||||
"Elegant, highly legible theme with a light ochre background.
|
||||
Conforms with the highest legibility standard for color contrast
|
||||
between background and foreground in any given piece of text,
|
||||
which corresponds to a minimum contrast in relative luminance of
|
||||
7:1 (WCAG AAA standard)."
|
||||
'light
|
||||
'modus-themes-operandi-tinted-palette
|
||||
'modus-operandi-tinted-palette-user
|
||||
'modus-operandi-tinted-palette-overrides)
|
||||
|
||||
(provide 'modus-operandi-tinted-theme)
|
||||
|
||||
;;; modus-operandi-tinted-theme.el ends here
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
;;; modus-operandi-tritanopia-theme.el --- Tritanopia-optimized theme with a white background -*- lexical-binding:t -*-
|
||||
|
||||
;; Copyright (C) 2019-2026 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Protesilaos <info@protesilaos.com>
|
||||
;; Maintainer: Protesilaos <info@protesilaos.com>
|
||||
;; URL: https://github.com/protesilaos/modus-themes
|
||||
;; Keywords: faces, theme, accessibility
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs is free software: you can redistribute it and/or modify
|
||||
;; 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.
|
||||
;;
|
||||
;; GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; The Modus themes conform with the highest standard for
|
||||
;; color-contrast accessibility between background and foreground
|
||||
;; values (WCAG AAA). They are also highly customizable and can even
|
||||
;; be used as the basis for other themes. Please refer to the official
|
||||
;; Info manual for further documentation (distributed with the themes,
|
||||
;; or available at: <https://protesilaos.com/emacs/modus-themes>).
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
||||
|
||||
(unless (and (fboundp 'require-theme)
|
||||
load-file-name
|
||||
(equal (file-name-directory load-file-name)
|
||||
(expand-file-name "themes/" data-directory))
|
||||
(require-theme 'modus-themes t))
|
||||
(require 'modus-themes))
|
||||
|
||||
(defcustom modus-operandi-tritanopia-palette-user nil
|
||||
"Like the `modus-operandi-tritanopia-palette' for user-defined entries.
|
||||
This is meant to extend the palette with custom named colors and/or
|
||||
semantic palette mappings. Those may then be used in combination with
|
||||
palette overrides (also see `modus-themes-common-palette-overrides' and
|
||||
`modus-operandi-tritanopia-palette-overrides')."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.5.0")
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Option to extend the palette for use with overrides"))
|
||||
|
||||
(defcustom modus-operandi-tritanopia-palette-overrides nil
|
||||
"Overrides for `modus-operandi-tritanopia-palette'.
|
||||
|
||||
Mirror the elements of the aforementioned palette, overriding
|
||||
their value.
|
||||
|
||||
For overrides that are shared across all of the Modus themes,
|
||||
refer to `modus-themes-common-palette-overrides'.
|
||||
|
||||
Theme-specific overrides take precedence over shared overrides.
|
||||
The idea of common overrides is to change semantic color
|
||||
mappings, such as to make the cursor red. Wherea theme-specific
|
||||
overrides can also be used to change the value of a named color,
|
||||
such as what hexadecimal RGB value the red-warmer symbol
|
||||
represents."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.0.0")
|
||||
:version "30.1"
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Palette overrides"))
|
||||
|
||||
(modus-themes-theme
|
||||
'modus-operandi-tritanopia
|
||||
'modus-themes
|
||||
"Tritanopia-optimized theme with a white background.
|
||||
This variant is optimized for users with blue-yellow color
|
||||
deficiency (tritanopia). It conforms with the highest
|
||||
legibility standard for color contrast between background and
|
||||
foreground in any given piece of text, which corresponds to a
|
||||
minimum contrast in relative luminance of 7:1 (WCAG AAA
|
||||
standard)."
|
||||
'light
|
||||
'modus-themes-operandi-tritanopia-palette
|
||||
'modus-operandi-tritanopia-palette-user
|
||||
'modus-operandi-tritanopia-palette-overrides
|
||||
'modus-themes-faces-tritanopia)
|
||||
|
||||
(provide 'modus-operandi-tritanopia-theme)
|
||||
|
||||
;;; modus-operandi-tritanopia-theme.el ends here
|
||||
14477
modus-themes.el
14477
modus-themes.el
File diff suppressed because it is too large
Load diff
|
|
@ -1,95 +0,0 @@
|
|||
;;; modus-vivendi-deuteranopia-theme.el --- Deuteranopia-optimized theme with a black background -*- lexical-binding:t -*-
|
||||
|
||||
;; Copyright (C) 2019-2026 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Protesilaos <info@protesilaos.com>
|
||||
;; Maintainer: Protesilaos <info@protesilaos.com>
|
||||
;; URL: https://github.com/protesilaos/modus-themes
|
||||
;; Keywords: faces, theme, accessibility
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs is free software: you can redistribute it and/or modify
|
||||
;; 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.
|
||||
;;
|
||||
;; GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; The Modus themes conform with the highest standard for
|
||||
;; color-contrast accessibility between background and foreground
|
||||
;; values (WCAG AAA). They are also highly customizable and can even
|
||||
;; be used as the basis for other themes. Please refer to the official
|
||||
;; Info manual for further documentation (distributed with the themes,
|
||||
;; or available at: <https://protesilaos.com/emacs/modus-themes>).
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
||||
|
||||
(unless (and (fboundp 'require-theme)
|
||||
load-file-name
|
||||
(equal (file-name-directory load-file-name)
|
||||
(expand-file-name "themes/" data-directory))
|
||||
(require-theme 'modus-themes t))
|
||||
(require 'modus-themes))
|
||||
|
||||
(defcustom modus-vivendi-deuteranopia-palette-user nil
|
||||
"Like the `modus-vivendi-deuteranopia-palette' for user-defined entries.
|
||||
This is meant to extend the palette with custom named colors and/or
|
||||
semantic palette mappings. Those may then be used in combination with
|
||||
palette overrides (also see `modus-themes-common-palette-overrides' and
|
||||
`modus-vivendi-deuteranopia-palette-overrides')."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.5.0")
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Option to extend the palette for use with overrides"))
|
||||
|
||||
(defcustom modus-vivendi-deuteranopia-palette-overrides nil
|
||||
"Overrides for `modus-vivendi-deuteranopia-palette'.
|
||||
|
||||
Mirror the elements of the aforementioned palette, overriding
|
||||
their value.
|
||||
|
||||
For overrides that are shared across all of the Modus themes,
|
||||
refer to `modus-themes-common-palette-overrides'.
|
||||
|
||||
Theme-specific overrides take precedence over shared overrides.
|
||||
The idea of common overrides is to change semantic color
|
||||
mappings, such as to make the cursor red. Wherea theme-specific
|
||||
overrides can also be used to change the value of a named color,
|
||||
such as what hexadecimal RGB value the red-warmer symbol
|
||||
represents."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.0.0")
|
||||
:version "30.1"
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Palette overrides"))
|
||||
|
||||
(modus-themes-theme
|
||||
'modus-vivendi-deuteranopia
|
||||
'modus-themes
|
||||
"Deuteranopia-optimized theme with a black background.
|
||||
This variant is optimized for users with red-green color
|
||||
deficiency (deuteranopia). It conforms with the highest
|
||||
legibility standard for color contrast between background and
|
||||
foreground in any given piece of text, which corresponds to a
|
||||
minimum contrast in relative luminance of 7:1 (WCAG AAA
|
||||
standard)."
|
||||
'dark
|
||||
'modus-themes-vivendi-deuteranopia-palette
|
||||
'modus-vivendi-deuteranopia-palette-user
|
||||
'modus-vivendi-deuteranopia-palette-overrides
|
||||
'modus-themes-faces-deuteranopia)
|
||||
|
||||
(provide 'modus-vivendi-deuteranopia-theme)
|
||||
|
||||
;;; modus-vivendi-deuteranopia-theme.el ends here
|
||||
|
|
@ -1,10 +1,11 @@
|
|||
;;; modus-vivendi-theme.el --- Elegant, highly legible theme with a black background -*- lexical-binding:t -*-
|
||||
;;; modus-vivendi-theme.el --- Elegant, highly legible and customizable light theme -*- lexical-binding:t -*-
|
||||
|
||||
;; Copyright (C) 2019-2026 Free Software Foundation, Inc.
|
||||
;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Protesilaos <info@protesilaos.com>
|
||||
;; Maintainer: Protesilaos <info@protesilaos.com>
|
||||
;; URL: https://github.com/protesilaos/modus-themes
|
||||
;; Author: Protesilaos Stavrou <info@protesilaos.com>
|
||||
;; URL: https://git.sr.ht/~protesilaos/modus-themes
|
||||
;; Version: 2.3.2
|
||||
;; Package-Requires: ((emacs "27.1"))
|
||||
;; Keywords: faces, theme, accessibility
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
|
@ -24,69 +25,48 @@
|
|||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; The Modus themes conform with the highest standard for
|
||||
;; color-contrast accessibility between background and foreground
|
||||
;; values (WCAG AAA). They are also highly customizable and can even
|
||||
;; be used as the basis for other themes. Please refer to the official
|
||||
;; Info manual for further documentation (distributed with the themes,
|
||||
;; or available at: <https://protesilaos.com/emacs/modus-themes>).
|
||||
;; Modus Vivendi is the dark variant of the Modus themes (Modus Operandi
|
||||
;; is the light one). The themes are designed for color-contrast
|
||||
;; accessibility. More specifically:
|
||||
;;
|
||||
;; 1. 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 (WCAG AAA
|
||||
;; standard).
|
||||
;;
|
||||
;; 2. Offer as close to full face coverage as possible. The list is
|
||||
;; already quite long, with more additions to follow as part of the
|
||||
;; ongoing development process.
|
||||
;;
|
||||
;; For a complete view of the project, also refer to the following files
|
||||
;; (should be distributed in the same repository/directory as the
|
||||
;; current item):
|
||||
;;
|
||||
;; - modus-themes.el (Main code shared between the themes)
|
||||
;; - modus-operandi-theme.el (Light theme)
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
||||
|
||||
(unless (and (fboundp 'require-theme)
|
||||
load-file-name
|
||||
(equal (file-name-directory load-file-name)
|
||||
(expand-file-name "themes/" data-directory))
|
||||
(require-theme 'modus-themes t))
|
||||
(require 'modus-themes))
|
||||
(eval-and-compile
|
||||
(unless (and (fboundp 'require-theme)
|
||||
load-file-name
|
||||
(equal (file-name-directory load-file-name)
|
||||
(expand-file-name "themes/" data-directory))
|
||||
(require-theme 'modus-themes t))
|
||||
(require 'modus-themes))
|
||||
|
||||
(defcustom modus-vivendi-palette-user nil
|
||||
"Like the `modus-vivendi--palette' for user-defined entries.
|
||||
This is meant to extend the palette with custom named colors and/or
|
||||
semantic palette mappings. Those may then be used in combination with
|
||||
palette overrides (also see `modus-themes-common-palette-overrides' and
|
||||
`modus-vivendi--palette-overrides')."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.5.0")
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Option to extend the palette for use with overrides"))
|
||||
|
||||
(defcustom modus-vivendi-palette-overrides nil
|
||||
"Overrides for `modus-vivendi-palette'.
|
||||
|
||||
Mirror the elements of the aforementioned palette, overriding
|
||||
their value.
|
||||
|
||||
For overrides that are shared across all of the Modus themes,
|
||||
refer to `modus-themes-common-palette-overrides'.
|
||||
|
||||
Theme-specific overrides take precedence over shared overrides.
|
||||
The idea of common overrides is to change semantic color
|
||||
mappings, such as to make the cursor red. Wherea theme-specific
|
||||
overrides can also be used to change the value of a named color,
|
||||
such as what hexadecimal RGB value the red-warmer symbol
|
||||
represents."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.0.0")
|
||||
:version "30.1"
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Palette overrides"))
|
||||
|
||||
(modus-themes-theme
|
||||
'modus-vivendi
|
||||
'modus-themes
|
||||
"Elegant, highly legible theme with a black background.
|
||||
(deftheme modus-vivendi
|
||||
"Elegant, highly legible and customizable dark theme.
|
||||
Conforms with the highest legibility standard for color contrast
|
||||
between background and foreground in any given piece of text,
|
||||
which corresponds to a minimum contrast in relative luminance of
|
||||
7:1 (WCAG AAA standard)."
|
||||
'dark
|
||||
'modus-themes-vivendi-palette
|
||||
'modus-vivendi-palette-user
|
||||
'modus-vivendi-palette-overrides)
|
||||
7:1 (WCAG AAA standard).")
|
||||
|
||||
(provide 'modus-vivendi-theme)
|
||||
(modus-themes-theme modus-vivendi)
|
||||
|
||||
(provide-theme 'modus-vivendi))
|
||||
|
||||
;;; modus-vivendi-theme.el ends here
|
||||
|
|
|
|||
|
|
@ -1,92 +0,0 @@
|
|||
;;; modus-vivendi-tinted-theme.el --- Elegant, highly legible theme with a night sky background -*- lexical-binding:t -*-
|
||||
|
||||
;; Copyright (C) 2019-2026 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Protesilaos <info@protesilaos.com>
|
||||
;; Maintainer: Protesilaos <info@protesilaos.com>
|
||||
;; URL: https://github.com/protesilaos/modus-themes
|
||||
;; Keywords: faces, theme, accessibility
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs is free software: you can redistribute it and/or modify
|
||||
;; 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.
|
||||
;;
|
||||
;; GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; The Modus themes conform with the highest standard for
|
||||
;; color-contrast accessibility between background and foreground
|
||||
;; values (WCAG AAA). They are also highly customizable and can even
|
||||
;; be used as the basis for other themes. Please refer to the official
|
||||
;; Info manual for further documentation (distributed with the themes,
|
||||
;; or available at: <https://protesilaos.com/emacs/modus-themes>).
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
||||
|
||||
(unless (and (fboundp 'require-theme)
|
||||
load-file-name
|
||||
(equal (file-name-directory load-file-name)
|
||||
(expand-file-name "themes/" data-directory))
|
||||
(require-theme 'modus-themes t))
|
||||
(require 'modus-themes))
|
||||
|
||||
(defcustom modus-vivendi-tinted-palette-user nil
|
||||
"Like the `modus-vivendi-tinted-palette' for user-defined entries.
|
||||
This is meant to extend the palette with custom named colors and/or
|
||||
semantic palette mappings. Those may then be used in combination with
|
||||
palette overrides (also see `modus-themes-common-palette-overrides' and
|
||||
`modus-vivendi-tinted-palette-overrides')."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.5.0")
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Option to extend the palette for use with overrides"))
|
||||
|
||||
(defcustom modus-vivendi-tinted-palette-overrides nil
|
||||
"Overrides for `modus-vivendi-tinted-palette'.
|
||||
|
||||
Mirror the elements of the aforementioned palette, overriding
|
||||
their value.
|
||||
|
||||
For overrides that are shared across all of the Modus themes,
|
||||
refer to `modus-themes-common-palette-overrides'.
|
||||
|
||||
Theme-specific overrides take precedence over shared overrides.
|
||||
The idea of common overrides is to change semantic color
|
||||
mappings, such as to make the cursor red. Wherea theme-specific
|
||||
overrides can also be used to change the value of a named color,
|
||||
such as what hexadecimal RGB value the red-warmer symbol
|
||||
represents."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.0.0")
|
||||
:version "30.1"
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Palette overrides"))
|
||||
|
||||
(modus-themes-theme
|
||||
'modus-vivendi-tinted
|
||||
'modus-themes
|
||||
"Elegant, highly legible theme with a night sky background.
|
||||
Conforms with the highest legibility standard for color contrast
|
||||
between background and foreground in any given piece of text,
|
||||
which corresponds to a minimum contrast in relative luminance of
|
||||
7:1 (WCAG AAA standard)."
|
||||
'dark
|
||||
'modus-themes-vivendi-tinted-palette
|
||||
'modus-vivendi-tinted-palette-user
|
||||
'modus-vivendi-tinted-palette-overrides)
|
||||
|
||||
(provide 'modus-vivendi-tinted-theme)
|
||||
|
||||
;;; modus-vivendi-tinted-theme.el ends here
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
;;; modus-vivendi-tritanopia-theme.el --- Tritanopia-optimized theme with a black background -*- lexical-binding:t -*-
|
||||
|
||||
;; Copyright (C) 2019-2026 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Protesilaos <info@protesilaos.com>
|
||||
;; Maintainer: Protesilaos <info@protesilaos.com>
|
||||
;; URL: https://github.com/protesilaos/modus-themes
|
||||
;; Keywords: faces, theme, accessibility
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs is free software: you can redistribute it and/or modify
|
||||
;; 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.
|
||||
;;
|
||||
;; GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; The Modus themes conform with the highest standard for
|
||||
;; color-contrast accessibility between background and foreground
|
||||
;; values (WCAG AAA). They are also highly customizable and can even
|
||||
;; be used as the basis for other themes. Please refer to the official
|
||||
;; Info manual for further documentation (distributed with the themes,
|
||||
;; or available at: <https://protesilaos.com/emacs/modus-themes>).
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
||||
|
||||
(unless (and (fboundp 'require-theme)
|
||||
load-file-name
|
||||
(equal (file-name-directory load-file-name)
|
||||
(expand-file-name "themes/" data-directory))
|
||||
(require-theme 'modus-themes t))
|
||||
(require 'modus-themes))
|
||||
|
||||
(defcustom modus-vivendi-tritanopia-palette-user nil
|
||||
"Like the `modus-vivendi-tritanopia-palette' for user-defined entries.
|
||||
This is meant to extend the palette with custom named colors and/or
|
||||
semantic palette mappings. Those may then be used in combination with
|
||||
palette overrides (also see `modus-themes-common-palette-overrides' and
|
||||
`modus-vivendi-tritanopia-palette-overrides')."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.5.0")
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Option to extend the palette for use with overrides"))
|
||||
|
||||
(defcustom modus-vivendi-tritanopia-palette-overrides nil
|
||||
"Overrides for `modus-vivendi-tritanopia-palette'.
|
||||
|
||||
Mirror the elements of the aforementioned palette, overriding
|
||||
their value.
|
||||
|
||||
For overrides that are shared across all of the Modus themes,
|
||||
refer to `modus-themes-common-palette-overrides'.
|
||||
|
||||
Theme-specific overrides take precedence over shared overrides.
|
||||
The idea of common overrides is to change semantic color
|
||||
mappings, such as to make the cursor red. Wherea theme-specific
|
||||
overrides can also be used to change the value of a named color,
|
||||
such as what hexadecimal RGB value the red-warmer symbol
|
||||
represents."
|
||||
:group 'modus-themes
|
||||
:package-version '(modus-themes . "4.0.0")
|
||||
:version "30.1"
|
||||
:type '(repeat (list symbol (choice symbol string)))
|
||||
:link '(info-link "(modus-themes) Palette overrides"))
|
||||
|
||||
(modus-themes-theme
|
||||
'modus-vivendi-tritanopia
|
||||
'modus-themes
|
||||
"Tritanopia-optimized theme with a black background.
|
||||
This variant is optimized for users with blue-yellow color
|
||||
deficiency (tritanopia). It conforms with the highest
|
||||
legibility standard for color contrast between background and
|
||||
foreground in any given piece of text, which corresponds to a
|
||||
minimum contrast in relative luminance of 7:1 (WCAG AAA
|
||||
standard)."
|
||||
'dark
|
||||
'modus-themes-vivendi-tritanopia-palette
|
||||
'modus-vivendi-tritanopia-palette-user
|
||||
'modus-vivendi-tritanopia-palette-overrides
|
||||
'modus-themes-faces-tritanopia)
|
||||
|
||||
(provide 'modus-vivendi-tritanopia-theme)
|
||||
|
||||
;;; modus-vivendi-tritanopia-theme.el ends here
|
||||
|
|
@ -1,372 +0,0 @@
|
|||
;;; modus-themes-test.el --- Unit tests for the Modus themes -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright (C) 2025-2026 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Protesilaos <info@protesilaos.com>,
|
||||
;; Rudolf Adamkovič <rudolf@adamkovic.org>
|
||||
;; Maintainer: Protesilaos <info@protesilaos.com>
|
||||
;; URL: https://github.com/protesilaos/modus-themes
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Tests for the Modus themes. Note that we are using Shorthands in
|
||||
;; this file, so the "mtt-" prefix really is "modus-themes-test-".
|
||||
;; Evaluate the following to learn more:
|
||||
;;
|
||||
;; (info "(elisp) Shorthands")
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'ert)
|
||||
(require 'modus-themes)
|
||||
|
||||
(defmacro mtt-define-test (symbol &rest body)
|
||||
"Write test for SYMBOL with BODY forms.
|
||||
If the `car' of BODY is a string, use it as the docstring of the test.
|
||||
Else provide a generic snippet of text."
|
||||
(declare (doc-string 2) (indent defun))
|
||||
(let* ((first (car body))
|
||||
(has-docstring (stringp first))
|
||||
(docstring (if has-docstring
|
||||
first
|
||||
(format "Test that `%s' does the right thing." symbol)))
|
||||
(body (if has-docstring (cdr body) body)))
|
||||
`(ert-deftest ,(intern (format "mtt-%s" symbol)) ()
|
||||
,docstring
|
||||
,@body)))
|
||||
|
||||
(mtt-define-test modus-themes--color-hex-p
|
||||
(should (modus-themes--color-hex-p "#123"))
|
||||
(should (modus-themes--color-hex-p "#123456"))
|
||||
(should (modus-themes--color-hex-p "#abc"))
|
||||
(should (modus-themes--color-hex-p "#ABCDEF"))
|
||||
(should-not (modus-themes--color-hex-p "abc"))
|
||||
(should-not (modus-themes--color-hex-p "#abcd"))
|
||||
(should-not (modus-themes--color-hex-p "#12345"))
|
||||
(should-not (modus-themes--color-hex-p "#1234567"))
|
||||
(should-not (modus-themes--color-hex-p "#zzz"))
|
||||
(should-not (modus-themes--color-hex-p "#zzz"))
|
||||
(should-not (modus-themes--color-hex-p "#12g456")))
|
||||
|
||||
(mtt-define-test modus-themes--hex-or-name-to-rgb
|
||||
(should (equal (modus-themes--hex-or-name-to-rgb "#fff") (list 1.0 1.0 1.0)))
|
||||
(should (equal (modus-themes--hex-or-name-to-rgb "#000") (list 0.0 0.0 0.0)))
|
||||
(should (equal (modus-themes--hex-or-name-to-rgb "#f00") (list 1.0 0.0 0.0)))
|
||||
(should (equal (modus-themes--hex-or-name-to-rgb "#0f0") (list 0.0 1.0 0.0)))
|
||||
(should (equal (modus-themes--hex-or-name-to-rgb "#00f") (list 0.0 0.0 1.0)))
|
||||
(should (equal (modus-themes--hex-or-name-to-rgb "#ffffff") (list 1.0 1.0 1.0)))
|
||||
(should (equal (modus-themes--hex-or-name-to-rgb "#000000") (list 0.0 0.0 0.0)))
|
||||
(should (equal (modus-themes--hex-or-name-to-rgb "#ff0000") (list 1.0 0.0 0.0)))
|
||||
(should (equal (modus-themes--hex-or-name-to-rgb "#00ff00") (list 0.0 1.0 0.0)))
|
||||
;; NOTE 2026-04-12: I do not need it to be precise here, hence the `format'.
|
||||
(let ((rgb-rounded-fn
|
||||
(lambda (hex)
|
||||
(let ((rgb (modus-themes--hex-or-name-to-rgb hex)))
|
||||
(mapcar (lambda (float) (string-to-number (format "%.2f" float))) rgb)))))
|
||||
(should (equal (funcall rgb-rounded-fn "#800000") (list 0.5 0.0 0.0)))
|
||||
(should (equal (funcall rgb-rounded-fn "#008000") (list 0.0 0.5 0.0)))
|
||||
(should (equal (funcall rgb-rounded-fn "#000080") (list 0.0 0.0 0.5))))
|
||||
(should-error (modus-themes--hex-or-name-to-rgb ""))
|
||||
(should-error (modus-themes--hex-or-name-to-rgb "#"))
|
||||
(should-error (modus-themes--hex-or-name-to-rgb "#1"))
|
||||
(should-error (modus-themes--hex-or-name-to-rgb "#12"))
|
||||
(should-error (modus-themes--hex-or-name-to-rgb "#1234"))
|
||||
(should-error (modus-themes--hex-or-name-to-rgb "#12345"))
|
||||
(should-error (modus-themes--hex-or-name-to-rgb "#gggggg"))
|
||||
(should-error (modus-themes--hex-or-name-to-rgb (list 1.0 1.0 1.0))))
|
||||
|
||||
(mtt-define-test modus-themes-wcag-formula
|
||||
"Test that `modus-themes-wcag-formula' does the right thing.
|
||||
Also see `modus-themes-test--modus-themes--hex-to-rgb'."
|
||||
(should (= (modus-themes-wcag-formula "#ffffff") 1.0))
|
||||
(should (= (modus-themes-wcag-formula "#000000") 0.0))
|
||||
(should-error (modus-themes-wcag-formula "#00000")))
|
||||
|
||||
(mtt-define-test modus-themes-contrast
|
||||
"Test that `modus-themes-contrast' works as intended.
|
||||
Also see `modus-themes-test--modus-themes--hex-to-rgb'."
|
||||
(should (= (modus-themes-contrast "#ffffff" "#000000") 21.0))
|
||||
(should (= (modus-themes-contrast "#000000" "#ffffff") 21.0))
|
||||
;; NOTE 2026-04-12: I do not need it to be precise here, hence the `format'.
|
||||
(let ((float-2-fn (lambda (hex1 hex2) (string-to-number (format "%.2f" (modus-themes-contrast hex1 hex2))))))
|
||||
(should (= (funcall float-2-fn "#ff0000" "#ffffff") 4.0))
|
||||
(should (= (funcall float-2-fn "#00ff00" "#ffffff") 1.37))
|
||||
(should (= (funcall float-2-fn "#0000ff" "#ffffff") 8.59))
|
||||
(should (= (funcall float-2-fn "#ffff00" "#ffffff") 1.07))
|
||||
(should (= (funcall float-2-fn "#00ffff" "#ffffff") 1.25))
|
||||
(should (= (funcall float-2-fn "#ff00ff" "#ffffff") 3.14)))
|
||||
(should-error (modus-themes-contrast "#ffffff" "#00000"))
|
||||
(should-error (modus-themes-contrast "#fffff" "#00000")))
|
||||
|
||||
(mtt-define-test modus-themes--color-eight-to-six-digits
|
||||
(should (string= (modus-themes--color-eight-to-six-digits "#f00") "#f00"))
|
||||
(should (string= (modus-themes--color-eight-to-six-digits "#ff1919") "#ff1919"))
|
||||
(should (string= (modus-themes--color-eight-to-six-digits "#ffff19991999") "#ff1919")))
|
||||
|
||||
(mtt-define-test modus-themes-adjust-value
|
||||
"Test that `modus-themes-adjust-value' does the right thing.
|
||||
Also see `modus-themes-test--modus-themes--hex-to-rgb'."
|
||||
(should (string= (modus-themes-adjust-value "#ff0000" 10) "#ff1919"))
|
||||
(should (string= (modus-themes-adjust-value "#505050" 100) "#ffffff"))
|
||||
(should (string= (modus-themes-adjust-value "#505050" -100) "#000000"))
|
||||
(should (string= (modus-themes-adjust-value "#505050" 0) "#505050"))
|
||||
(should-error (modus-themes-adjust-value "#ff00" 10)))
|
||||
|
||||
(mtt-define-test modus-themes-activate
|
||||
(if (custom-theme-p 'modus-operandi-tritanopia)
|
||||
(should-not (modus-themes-activate 'modus-operandi-tritanopia))
|
||||
(should (custom-theme-p 'modus-operandi-tritanopia))))
|
||||
|
||||
(mtt-define-test modus-themes--belongs-to-family-p
|
||||
(should (modus-themes--belongs-to-family-p 'modus-operandi 'modus-themes))
|
||||
(should-not (modus-themes--belongs-to-family-p 'my-fancy-theme 'modus-themes))
|
||||
(should-not (modus-themes--belongs-to-family-p 'modus-operandi 'my-fancy-themes)))
|
||||
|
||||
(mtt-define-test modus-themes-get-all-known-themes
|
||||
(should (equal (modus-themes-get-all-known-themes) modus-themes-items))
|
||||
(should-not (modus-themes-get-all-known-themes 'my-fancy-themes)))
|
||||
|
||||
(mtt-define-test modus-themes--background-p
|
||||
(should (modus-themes--background-p 'modus-operandi 'light))
|
||||
(should-not (modus-themes--background-p 'modus-operandi 'dark))
|
||||
(should-not (modus-themes--background-p 'modus-operandi t))
|
||||
(should-not (modus-themes--background-p 'modus-operandi :light)))
|
||||
|
||||
(mtt-define-test modus-themes-sort
|
||||
(let ((first-has-prefix-fn (lambda (themes prefix)
|
||||
(when-let* ((first (car themes))
|
||||
(name (symbol-name first)))
|
||||
(string-match-p prefix name)))))
|
||||
(should (funcall first-has-prefix-fn (modus-themes-sort (reverse modus-themes-items) 'light) "modus-operandi"))
|
||||
(should (funcall first-has-prefix-fn (modus-themes-sort modus-themes-items 'dark) "modus-vivendi"))))
|
||||
|
||||
(mtt-define-test inheritance
|
||||
"Ensure all faces inherit from valid faces."
|
||||
;; Third-party packages, loaded if possible to better test face inheritance.
|
||||
(require 'font-latex nil t)
|
||||
(let ((current-theme (modus-themes-get-current-theme)))
|
||||
(unwind-protect
|
||||
(progn
|
||||
(modus-themes-load-theme 'modus-operandi)
|
||||
(should-not (seq-filter
|
||||
(lambda (face)
|
||||
;; The face either has no parent ...
|
||||
(if-let* ((parent (face-attribute face :inherit)))
|
||||
(and (symbolp parent)
|
||||
(not (eq parent 'unspecified))
|
||||
;; ... or its parent is a valid face.
|
||||
(not (facep parent)))))
|
||||
(face-list))))
|
||||
(modus-themes-load-theme current-theme))))
|
||||
|
||||
(mtt-define-test color-dark-p
|
||||
(let ((modus-operandi-sample-foregrounds
|
||||
'("#a60000"
|
||||
"#972500"
|
||||
"#a0132f"
|
||||
"#7f0000"
|
||||
"#006800"
|
||||
"#316500"
|
||||
"#00663f"
|
||||
"#2a5045"
|
||||
"#6f5500"
|
||||
"#884900"
|
||||
"#7a4f2f"
|
||||
"#624416"
|
||||
"#0031a9"
|
||||
"#3548cf"
|
||||
"#0000b0"
|
||||
"#003497"
|
||||
"#721045"
|
||||
"#8f0075"
|
||||
"#531ab6"
|
||||
"#7c318f"
|
||||
"#005e8b"
|
||||
"#3f578f"
|
||||
"#005f5f"
|
||||
"#005077"))
|
||||
(modus-vivendi-sample-foregrounds
|
||||
'("#ff5f59"
|
||||
"#ff6b55"
|
||||
"#ff7f86"
|
||||
"#ff9580"
|
||||
"#44bc44"
|
||||
"#70b900"
|
||||
"#00c06f"
|
||||
"#88ca9f"
|
||||
"#d0bc00"
|
||||
"#fec43f"
|
||||
"#dfaf7a"
|
||||
"#d2b580"
|
||||
"#2fafff"
|
||||
"#79a8ff"
|
||||
"#00bcff"
|
||||
"#82b0ec"
|
||||
"#feacd0"
|
||||
"#f78fe7"
|
||||
"#b6a0ff"
|
||||
"#caa6df"
|
||||
"#00d3d0"
|
||||
"#4ae2f0"
|
||||
"#6ae4b9"
|
||||
"#9ac8e0")))
|
||||
(should (seq-every-p #'modus-themes-color-dark-p modus-operandi-sample-foregrounds))
|
||||
(should-not (seq-every-p #'modus-themes-color-dark-p modus-vivendi-sample-foregrounds))))
|
||||
|
||||
(mtt-define-test get-readable-foreground
|
||||
(let ((modus-operandi-sample-foregrounds
|
||||
'("#a60000"
|
||||
"#972500"
|
||||
"#a0132f"
|
||||
"#7f0000"
|
||||
"#006800"
|
||||
"#316500"
|
||||
"#00663f"
|
||||
"#2a5045"
|
||||
"#6f5500"
|
||||
"#884900"
|
||||
"#7a4f2f"
|
||||
"#624416"
|
||||
"#0031a9"
|
||||
"#3548cf"
|
||||
"#0000b0"
|
||||
"#003497"
|
||||
"#721045"
|
||||
"#8f0075"
|
||||
"#531ab6"
|
||||
"#7c318f"
|
||||
"#005e8b"
|
||||
"#3f578f"
|
||||
"#005f5f"
|
||||
"#005077"))
|
||||
(modus-vivendi-sample-foregrounds
|
||||
'("#ff5f59"
|
||||
"#ff6b55"
|
||||
"#ff7f86"
|
||||
"#ff9580"
|
||||
"#44bc44"
|
||||
"#70b900"
|
||||
"#00c06f"
|
||||
"#88ca9f"
|
||||
"#d0bc00"
|
||||
"#fec43f"
|
||||
"#dfaf7a"
|
||||
"#d2b580"
|
||||
"#2fafff"
|
||||
"#79a8ff"
|
||||
"#00bcff"
|
||||
"#82b0ec"
|
||||
"#feacd0"
|
||||
"#f78fe7"
|
||||
"#b6a0ff"
|
||||
"#caa6df"
|
||||
"#00d3d0"
|
||||
"#4ae2f0"
|
||||
"#6ae4b9"
|
||||
"#9ac8e0")))
|
||||
(should (seq-every-p
|
||||
(lambda (value)
|
||||
(string= value "#ffffff"))
|
||||
(mapcar #'modus-themes-get-readable-foreground modus-operandi-sample-foregrounds)))
|
||||
(should (seq-every-p
|
||||
(lambda (value)
|
||||
(string= value "#000000"))
|
||||
(mapcar #'modus-themes-get-readable-foreground modus-vivendi-sample-foregrounds)))))
|
||||
|
||||
(mtt-define-test complete-palette-mappings
|
||||
"Ensure all built-in palettes contain entries for all palette mappings.
|
||||
This computes a complete list of mapping names from the built-in palettes
|
||||
and then cross-checks the palettes against the list. This should help ensure
|
||||
consistency and completeness where adding a new mapping in one palette will
|
||||
fail this test until it is added in all palettes."
|
||||
(let* ((operandi-names (seq-uniq (mapcar #'car modus-themes-operandi-palette)))
|
||||
(operandi-tinted-names (seq-uniq (mapcar #'car modus-themes-operandi-tinted-palette)))
|
||||
(operandi-deuteranopia-names (seq-uniq (mapcar #'car modus-themes-operandi-deuteranopia-palette)))
|
||||
(operandi-tritanopia-names (seq-uniq (mapcar #'car modus-themes-operandi-tritanopia-palette)))
|
||||
(vivendi-names (seq-uniq (mapcar #'car modus-themes-vivendi-palette)))
|
||||
(vivendi-tinted-names (seq-uniq (mapcar #'car modus-themes-vivendi-tinted-palette)))
|
||||
(vivendi-deuteranopia-names (seq-uniq (mapcar #'car modus-themes-vivendi-deuteranopia-palette)))
|
||||
(vivendi-tritanopia-names (seq-uniq (mapcar #'car modus-themes-vivendi-tritanopia-palette)))
|
||||
(all-names (seq-uniq (append operandi-names
|
||||
operandi-tinted-names
|
||||
operandi-deuteranopia-names
|
||||
operandi-tritanopia-names
|
||||
vivendi-names
|
||||
vivendi-tinted-names
|
||||
vivendi-deuteranopia-names
|
||||
vivendi-tritanopia-names))))
|
||||
(should (seq-empty-p (seq-difference all-names operandi-names)))
|
||||
(should (seq-empty-p (seq-difference all-names operandi-tinted-names)))
|
||||
(should (seq-empty-p (seq-difference all-names operandi-deuteranopia-names)))
|
||||
(should (seq-empty-p (seq-difference all-names operandi-tritanopia-names)))
|
||||
(should (seq-empty-p (seq-difference all-names vivendi-names)))
|
||||
(should (seq-empty-p (seq-difference all-names vivendi-tinted-names)))
|
||||
(should (seq-empty-p (seq-difference all-names vivendi-deuteranopia-names)))
|
||||
(should (seq-empty-p (seq-difference all-names vivendi-tritanopia-names)))))
|
||||
|
||||
(mtt-define-test modus-themes-generate-palette
|
||||
"Ensure `modus-themes-generate-palette' provides enough mapping coverage
|
||||
such that the generated palette does not inherit explicit color values
|
||||
from a parent core palette."
|
||||
(let* ((generated-palette (modus-themes-generate-palette
|
||||
'((fg-main "#ffffff")
|
||||
(bg-main "#000000")
|
||||
(red "#ff0000")
|
||||
(green "#00ff00")
|
||||
(yellow "#ffff00")
|
||||
(blue "#0000ff")
|
||||
(magenta "#ff00ff")
|
||||
(cyan "#00ffff"))))
|
||||
;; These are colors we expect to have an explicit hex value,
|
||||
;; either because they were provided explicitly in the call to
|
||||
;; `modus-themes-generate-palette' above, or because we expect
|
||||
;; `modus-themes-generate-palette' to generate the color.
|
||||
(explicit-colors '( fg-main bg-main
|
||||
fg-alt fg-dim bg-inactive bg-active bg-dim border
|
||||
;; cyan
|
||||
cyan bg-cyan-nuanced bg-cyan-subtle bg-cyan-intense
|
||||
cyan-intense cyan-faint cyan-cooler cyan-warmer
|
||||
;; magenta
|
||||
magenta bg-magenta-nuanced bg-magenta-subtle bg-magenta-intense
|
||||
magenta-intense magenta-faint magenta-cooler magenta-warmer
|
||||
;; blue
|
||||
blue bg-blue-nuanced bg-blue-subtle bg-blue-intense
|
||||
blue-intense blue-faint blue-cooler blue-warmer
|
||||
;; yellow
|
||||
yellow bg-yellow-nuanced bg-yellow-subtle bg-yellow-intense
|
||||
yellow-intense yellow-faint yellow-cooler yellow-warmer
|
||||
;; green
|
||||
green bg-green-nuanced bg-green-subtle bg-green-intense
|
||||
green-intense green-faint green-cooler green-warmer
|
||||
;; red
|
||||
red bg-red-nuanced bg-red-subtle bg-red-intense
|
||||
red-intense red-faint red-cooler red-warmer)))
|
||||
;; Ensure all other colors in the palette map to a color name and not an
|
||||
;; explicit hex value. If this check fails, the offending color should
|
||||
;; be mapped to an appropriate color name in `modus-themes-generate-palette'.
|
||||
(should (seq-empty-p (seq-remove (lambda (elem)
|
||||
(or (member (car elem) explicit-colors)
|
||||
(symbolp (cadr elem))))
|
||||
generated-palette)))))
|
||||
|
||||
(provide 'modus-themes-test)
|
||||
;;; modus-themes-test.el ends here
|
||||
|
||||
;; Local Variables:
|
||||
;; read-symbol-shorthands: (("mtt" . "modus-themes-test-"))
|
||||
;; End:
|
||||
Loading…
Reference in a new issue