-._protesilaos-s-_ef_themes_.-/ef-themes.el

1111 lines
57 KiB
EmacsLisp
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; ef-themes.el --- Colorful and legible themes -*- lexical-binding:t -*-
;; Copyright (C) 2022 Free Software Foundation, Inc.
;; Author: Protesilaos Stavrou <info@protesilaos.com>
;; Maintainer: Ef-Themes Development <~protesilaos/ef-themes@lists.sr.ht>
;; URL: https://git.sr.ht/~protesilaos/ef-themes
;; Mailing-List: https://lists.sr.ht/~protesilaos/ef-themes
;; Version: 0.1.0
;; Package-Requires: ((emacs "28.1"))
;; Keywords: faces, theme, accessibility
;; This file is NOT 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 `ef-themes' are a collection of light and dark themes for GNU
;; Emacs whose goal is to provide colorful ("pretty") yet legible
;; options for users who want something with a bit more flair than the
;; `modus-themes' (also designed by me).
;;; Code:
(eval-when-compile
(require 'cl-lib)
(require 'subr-x))
(defgroup ef-themes ()
"Colorful and legible themes."
:group 'faces
:link '(info-link "(ef-themes) Top")
:prefix "ef-themes-"
:tag "Ef Themes")
;;; Commands and their helper functions
(defun ef-themes--list-enabled-themes ()
"Return list of `custom-enabled-themes' with ef- prefix."
(seq-filter
(lambda (theme)
(string-prefix-p "ef-" (symbol-name theme)))
custom-enabled-themes))
(defun ef-themes--list-known-themes ()
"Return list of `custom-known-themes' with ef- prefix."
(seq-filter
(lambda (theme)
(string-prefix-p "ef-" (symbol-name theme)))
custom-known-themes))
(defun ef-themes--current-theme ()
"Return first enabled Ef theme."
(if-let ((themes (ef-themes--list-enabled-themes)))
(car themes)
(user-error "No enabled Ef theme could be found")))
(defun ef-themes--palette (theme)
"Return THEME palette as a symbol."
(intern (format "%s-palette" theme)))
(defun ef-themes--current-theme-palette ()
"Return palette of active Ef theme, else produce `user-error'."
(if-let ((palette (ef-themes--palette (ef-themes--current-theme))))
palette
(user-error "No enabled Ef theme could be found")))
(defvar ef-themes--select-theme-history nil)
(defun ef-themes--select-prompt ()
"Minibuffer prompt for `ef-themes-select'."
(completing-read "Select Ef Theme: "
(ef-themes--list-known-themes)
nil t nil
'ef-themes--select-theme-history))
;;;###autoload
(defun ef-themes-select (theme)
"Load an Ef THEME using minibuffer completion.
When called from Lisp, THEME is a symbol."
(interactive (list (intern (ef-themes--select-prompt))))
(mapc #'disable-theme (ef-themes--list-known-themes))
(load-theme theme :no-confirm))
(defun ef-themes--minus-current (&optional variant)
"Return list of Ef themes minus the current one.
VARIANT is either `light' or `dark', which stand for
`ef-themes-light-themes' and `ef-themes-dark-themes',
respectively. Else check against the return value of
`ef-themes--list-known-themes'."
(let* ((list (when variant
(if (eq variant 'dark)
ef-themes-dark-themes
ef-themes-light-themes)))
(sequence (or list (ef-themes--list-known-themes)))
(themes (copy-sequence sequence)))
(delete (ef-themes--current-theme) themes)))
(defconst ef-themes-light-themes '(ef-day ef-light ef-spring ef-summer)
"List of symbols with the light Ef themes.")
(defconst ef-themes-dark-themes '(ef-autumn ef-dark ef-night ef-winter)
"List of symbols with the dark Ef themes.")
;;;###autoload
(defun ef-themes-load-random (&optional variant)
"Load an Ef theme at random, excluding the current one.
With optional VARIANT as either `light' or `dark', limit the set
to the relevant themes.
When called interactively, VARIANT is the prefix argument which
prompts with completion for either `light' or `dark'."
(interactive
(list (when current-prefix-arg
(intern (completing-read "Random choice of Ef themes VARIANT: "
'(light dark) nil t)))))
(let* ((themes (ef-themes--minus-current variant))
(n (random (length themes)))
(pick (nth n themes)))
(mapc #'disable-theme (ef-themes--list-known-themes))
(if (null pick)
(load-theme (car themes) :no-confim)
(load-theme pick :no-confim))))
(defun ef-themes--preview-colors-render (buffer theme &rest _)
"Render colors in BUFFER from THEME.
Routine for `ef-themes-preview-colors'."
(let ((palette (seq-remove (lambda (cell)
(symbolp (cadr cell)))
(symbol-value (ef-themes--palette theme))))
(current-buffer buffer)
(current-theme theme))
(with-help-window buffer
(with-current-buffer standard-output
(erase-buffer)
(when (<= (display-color-cells) 256)
(insert (concat "Your display terminal may not render all color previews!\n"
"It seems to only support <= 256 colors.\n\n"))
(put-text-property (point-min) (point) 'face 'warning))
;; We need this to properly render the first line.
(insert " ")
(dolist (cell palette)
(let* ((name (car cell))
(color (cadr cell))
(fg (readable-foreground-color color))
(pad (make-string 5 ?\s)))
(let ((old-point (point)))
(insert (format "%s %s" color pad))
(put-text-property old-point (point) 'face `( :foreground ,color)))
(let ((old-point (point)))
(insert (format " %s %s %s\n" color pad name))
(put-text-property old-point (point)
'face `( :background ,color
:foreground ,fg
:extend t)))
;; We need this to properly render the last line.
(insert " ")))
(setq-local revert-buffer-function
(lambda (_ignore-auto _noconfirm)
(ef-themes--preview-colors-render current-buffer current-theme)))))))
(defvar ef-themes--preview-colors-prompt-history '()
"Minibuffer history for `ef-themes--preview-colors-prompt'.")
(defun ef-themes--preview-colors-prompt ()
"Prompt for Ef theme.
Helper function for `ef-themes-preview-colors'."
(let ((def (format "%s" (ef-themes--current-theme))))
(completing-read
(format "Use palette from theme [%s]: " def)
(ef-themes--list-known-themes) nil t nil
'ef-themes--preview-colors-prompt-history def)))
;;;###autoload
(defun ef-themes-preview-colors (theme)
"Preview palette of the Ef THEME of choice."
(interactive (list (intern (ef-themes--preview-colors-prompt))))
(ef-themes--preview-colors-render
(format "*%s-preview-colors*" theme)
theme))
;;;###autoload
(defun ef-themes-preview-colors-current ()
"Call `ef-themes-preview-colors' for the current Ef theme."
(interactive)
(ef-themes-preview-colors (ef-themes--current-theme)))
;;; Faces and variables
(defconst ef-themes-faces
'(
;;;; all basic faces
`(default ((,c :background ,bg-main :foreground ,fg-main)))
`(cursor ((,c :background ,cursor)))
`(region ((,c :background ,bg-region)))
`(comint-highlight-input ((,c :inherit bold)))
`(comint-highlight-prompt ((,c :foreground ,accent-2)))
`(minibuffer-prompt ((,c :foreground ,accent-2)))
`(escape-glyph ((,c :foreground ,warning)))
`(error ((,c :inherit bold :foreground ,err)))
`(success ((,c :inherit bold :foreground ,info)))
`(warning ((,c :inherit bold :foreground ,warning)))
`(fringe ((,c :background unspecified)))
`(header-line ((,c :background ,bg-dim)))
`(header-line-highlight ((,c :inherit highlight)))
`(help-argument-name ((,c :foreground ,accent-0)))
`(help-key-binding ((,c :inherit bold :foreground ,keybind)))
`(highlight ((,c :background ,bg-hover :foreground ,fg-intense)))
`(secondary-selection ((,c :background ,bg-hover-alt :foreground ,fg-intense)))
`(hl-line ((,c :background ,bg-hl-line)))
`(button ((,c :foreground ,link :underline ,border)))
`(link ((,c :foreground ,link :underline ,border)))
`(link-visited ((,c :foreground ,link-alt :underline ,border)))
`(pgtk-im-0 ((,c :inherit secondary-selection)))
`(rectangle-preview ((,c :inherit secondary-selection)))
`(shadow ((,c :foreground ,fg-dim)))
`(trailing-whitespace ((,c :background ,bg-red :foreground ,fg-intense)))
`(tooltip ((,c :background ,bg-alt :foreground ,fg-intense)))
;;;; all-the-icons
`(all-the-icons-blue ((,c :foreground ,blue-cooler)))
`(all-the-icons-blue-alt ((,c :foreground ,blue-warmer)))
`(all-the-icons-cyan ((,c :foreground ,cyan)))
`(all-the-icons-cyan-alt ((,c :foreground ,cyan-warmer)))
`(all-the-icons-dblue ((,c :foreground ,blue-faint)))
`(all-the-icons-dcyan ((,c :foreground ,cyan-faint)))
`(all-the-icons-dgreen ((,c :foreground ,green-faint)))
`(all-the-icons-dmaroon ((,c :foreground ,magenta-faint)))
`(all-the-icons-dorange ((,c :foreground ,red-faint)))
`(all-the-icons-dpink ((,c :foreground ,magenta-faint)))
`(all-the-icons-dpurple ((,c :foreground ,blue-faint)))
`(all-the-icons-dred ((,c :foreground ,red-faint)))
`(all-the-icons-dsilver ((,c :foreground ,cyan-faint)))
`(all-the-icons-dyellow ((,c :foreground ,yellow-faint)))
`(all-the-icons-green ((,c :foreground ,green)))
`(all-the-icons-lblue ((,c :foreground ,blue-cooler)))
`(all-the-icons-lcyan ((,c :foreground ,cyan)))
`(all-the-icons-lgreen ((,c :foreground ,green-warmer)))
`(all-the-icons-lmaroon ((,c :foreground ,magenta-warmer)))
`(all-the-icons-lorange ((,c :foreground ,red-warmer)))
`(all-the-icons-lpink ((,c :foreground ,magenta)))
`(all-the-icons-lpurple ((,c :foreground ,magenta-faint)))
`(all-the-icons-lred ((,c :foreground ,red)))
`(all-the-icons-lsilver ((,c :foreground ,fg-dim)))
`(all-the-icons-lyellow ((,c :foreground ,yellow-warmer)))
`(all-the-icons-maroon ((,c :foreground ,magenta)))
`(all-the-icons-orange ((,c :foreground ,red-warmer)))
`(all-the-icons-pink ((,c :foreground ,magenta)))
`(all-the-icons-purple ((,c :foreground ,magenta-cooler)))
`(all-the-icons-purple-alt ((,c :foreground ,magenta-cooler)))
`(all-the-icons-red ((,c :foreground ,red-warmer)))
`(all-the-icons-red-alt ((,c :foreground ,red-cooler)))
`(all-the-icons-silver ((,c :foreground ,cyan-faint)))
`(all-the-icons-yellow ((,c :foreground ,yellow)))
;;;; all-the-icons-dired
`(all-the-icons-dired-dir-face ((,c :foreground ,accent-0)))
;;;; all-the-icons-ibuffer
`(all-the-icons-ibuffer-dir-face ((,c :foreground ,accent-0)))
`(all-the-icons-ibuffer-file-face ((,c :foreground ,name)))
`(all-the-icons-ibuffer-mode-face ((,c :foreground ,constant)))
`(all-the-icons-ibuffer-size-face ((,c :foreground ,variable)))
;;;; ansi-color
`(ansi-color-black ((,c :background "black" :foreground "black")))
`(ansi-color-blue ((,c :background ,blue :foreground ,blue)))
`(ansi-color-bold ((,c :inherit bold)))
`(ansi-color-bright-black ((,c :background "gray35" :foreground "gray35")))
`(ansi-color-bright-blue ((,c :background ,blue-warmer :foreground ,blue-warmer)))
`(ansi-color-bright-cyan ((,c :background ,cyan-cooler :foreground ,cyan-cooler)))
`(ansi-color-bright-green ((,c :background ,green-cooler :foreground ,green-cooler)))
`(ansi-color-bright-magenta ((,c :background ,magenta-cooler :foreground ,magenta-cooler)))
`(ansi-color-bright-red ((,c :background ,red-warmer :foreground ,red-warmer)))
`(ansi-color-bright-white ((,c :background "white" :foreground "white")))
`(ansi-color-bright-yellow ((,c :background ,yellow-warmer :foreground ,yellow-warmer)))
`(ansi-color-cyan ((,c :background ,cyan :foreground ,cyan)))
`(ansi-color-green ((,c :background ,green :foreground ,green)))
`(ansi-color-magenta ((,c :background ,magenta :foreground ,magenta)))
`(ansi-color-red ((,c :background ,red :foreground ,red)))
`(ansi-color-white ((,c :background "gray65" :foreground "gray65")))
`(ansi-color-yellow ((,c :background ,yellow :foreground ,yellow)))
;;;; bongo
`(bongo-album-title (( )))
`(bongo-artist ((,c :foreground ,rainbow-0)))
`(bongo-currently-playing-track ((,c :inherit bold)))
`(bongo-elapsed-track-part ((,c :background ,bg-alt :underline t)))
`(bongo-filled-seek-bar ((,c :background ,bg-hover)))
`(bongo-marked-track ((,c :inherit warning :background ,bg-dim)))
`(bongo-marked-track-line ((,c :background ,bg-dim)))
`(bongo-played-track ((,c :strike-through t)))
`(bongo-track-length ((,c :inherit shadow)))
`(bongo-track-title ((,c :foreground ,rainbow-1)))
`(bongo-unfilled-seek-bar ((,c :background ,bg-dim)))
;;;; bookmark
`(bookmark-face ((,c :foreground ,info)))
`(bookmark-menu-bookmark ((,c :inherit bold)))
;;;; calendar and diary
`(calendar-month-header ((,c :inherit bold)))
`(calendar-today ((,c :inherit bold :underline t)))
`(calendar-weekday-header ((,c :foreground ,fg-alt)))
`(calendar-weekend-header ((,c :inherit calendar-weekday-header)))
`(diary ((,c :background ,bg-dim :foreground ,accent-0)))
`(diary-anniversary ((,c :foreground ,accent-1)))
`(diary-time ((,c :foreground ,date)))
`(holiday ((,c :background ,bg-dim :foreground ,accent-2)))
;;;; change-log and log-view (`vc-print-log' and `vc-print-root-log')
`(change-log-acknowledgment ((,c :inherit shadow)))
`(change-log-conditionals ((,c :foreground ,preprocessor)))
`(change-log-date ((,c :foreground ,date)))
`(change-log-email ((,c :foreground ,constant)))
`(change-log-file ((,c :inherit bold)))
`(change-log-function ((,c :foreground ,fnname)))
`(change-log-list ((,c :inherit bold)))
`(change-log-name ((,c :foreground ,name)))
`(log-edit-header ((,c :inherit bold)))
`(log-edit-summary ((,c :inherit bold :foreground ,accent-0)))
`(log-edit-unknown-header ((,c :inherit shadow)))
`(log-view-commit-body (( )))
`(log-view-file ((,c :inherit bold)))
`(log-view-message ((,c :background ,bg-dim :foreground ,fg-dim)))
;;;; compilation
`(compilation-column-number ((,c :inherit compilation-line-number)))
`(compilation-error ((,c :inherit error)))
`(compilation-info ((,c :inherit success)))
`(compilation-line-number ((,c :inherit shadow)))
`(compilation-mode-line-exit ((,c :inherit bold)))
`(compilation-mode-line-fail ((,c :inherit error)))
`(compilation-mode-line-run ((,c :inherit warning)))
`(compilation-warning ((,c :inherit warning)))
;;;; completions
`(completions-annotations ((,c :inherit italic :foreground ,docstring)))
`(completions-common-part ((,c :inherit bold :foreground ,accent-0)))
`(completions-first-difference ((,c :inherit bold :foreground ,accent-1)))
;;;; custom (M-x customize)
`(custom-button ((,c :box ,fg-dim :background ,bg-alt :foreground ,fg-intense)))
`(custom-button-mouse ((,c :inherit (highlight custom-button))))
`(custom-button-pressed ((,c :inherit (secondary-selection custom-button))))
`(custom-changed ((,c :background ,bg-changed)))
`(custom-comment ((,c :inherit shadow)))
`(custom-comment-tag ((,c :inherit (bold shadow))))
`(custom-invalid ((,c :inherit error :strike-through t)))
`(custom-modified ((,c :inherit custom-changed)))
`(custom-rogue ((,c :inherit custom-invalid)))
`(custom-set ((,c :inherit success)))
`(custom-state ((,c :foreground ,fg-alt)))
`(custom-themed ((,c :inherit custom-changed)))
`(custom-variable-obsolete ((,c :inherit shadow)))
`(custom-face-tag ((,c :inherit bold :foreground ,type)))
`(custom-group-tag ((,c :inherit bold :foreground ,builtin)))
`(custom-group-tag-1 ((,c :inherit bold :foreground ,constant)))
`(custom-variable-tag ((,c :inherit bold :foreground ,variable)))
;;;; denote
`(denote-faces-date ((,c :foreground ,date)))
`(denote-faces-keywords ((,c :foreground ,name)))
;;;; dictionary
`(dictionary-button-face ((,c :inherit bold)))
`(dictionary-reference-face ((,c :inherit link)))
`(dictionary-word-definition-face (()))
`(dictionary-word-entry-face ((,c :inherit font-lock-comment-face)))
;;;; diff-hl
`(diff-hl-change ((,c :background ,bg-changed-refine)))
`(diff-hl-delete ((,c :background ,bg-removed-refine)))
`(diff-hl-dired-change ((,c :inherit diff-hl-change)))
`(diff-hl-dired-delete ((,c :inherit diff-hl-delete)))
`(diff-hl-dired-ignored ((,c :inherit dired-ignored)))
`(diff-hl-dired-insert ((,c :inherit diff-hl-insert)))
`(diff-hl-dired-unknown ((,c :inherit dired-ignored)))
`(diff-hl-insert ((,c :background ,bg-added-refine)))
`(diff-hl-reverted-hunk-highlight ((,c :background ,fg-main :foreground ,bg-main)))
;;;; diff-mode
`(diff-added ((,c :background ,bg-added)))
`(diff-changed ((,c :background ,bg-changed :extend t)))
`(diff-removed ((,c :background ,bg-removed)))
`(diff-refine-added ((,c :background ,bg-added-refine :foreground ,fg-intense)))
`(diff-refine-changed ((,c :background ,bg-changed-refine :foreground ,fg-intense)))
`(diff-refine-removed ((,c :background ,bg-removed-refine :foreground ,fg-intense)))
`(diff-indicator-added ((,c :inherit success :background ,bg-added)))
`(diff-indicator-changed ((,c :inherit warning :background ,bg-changed)))
`(diff-indicator-removed ((,c :inherit error :background ,bg-removed)))
`(diff-context (( )))
`(diff-error ((,c :inherit error)))
`(diff-file-header ((,c :inherit bold)))
`(diff-function ((,c :inherit shadow)))
`(diff-header (( )))
`(diff-hunk-header ((,c :inherit bold)))
`(diff-index ((,c :inherit italic)))
`(diff-nonexistent ((,c :inherit bold)))
;;;; dired
`(dired-broken-symlink ((,c :inherit (error link))))
`(dired-directory ((,c :foreground ,accent-0)))
`(dired-flagged ((,c :inherit error :background ,bg-err)))
`(dired-header ((,c :inherit bold)))
`(dired-ignored ((,c :inherit shadow)))
`(dired-mark ((,c :foreground ,fg-intense)))
`(dired-marked ((,c :inherit success :background ,bg-info)))
`(dired-symlink ((,c :inherit link)))
`(dired-warning ((,c :inherit warning)))
;;;; dired-subtree
;; remove backgrounds from dired-subtree faces, else they break
;; dired-{flagged,marked} and any other face that sets a background
;; such as hl-line. Also, denoting depth by varying shades of gray
;; does not look right.
`(dired-subtree-depth-1-face (( )))
`(dired-subtree-depth-2-face (( )))
`(dired-subtree-depth-3-face (( )))
`(dired-subtree-depth-4-face (( )))
`(dired-subtree-depth-5-face (( )))
`(dired-subtree-depth-6-face (( )))
;;;; diredfl
`(diredfl-autofile-name ((,c :background ,bg-alt)))
`(diredfl-compressed-file-name ((,c :foreground ,yellow-cooler)))
`(diredfl-compressed-file-suffix ((,c :foreground ,red)))
`(diredfl-date-time ((,c :foreground ,date)))
`(diredfl-deletion ((,c :inherit dired-flagged)))
`(diredfl-deletion-file-name ((,c :inherit diredfl-deletion)))
`(diredfl-dir-heading ((,c :inherit bold)))
`(diredfl-dir-name ((,c :inherit dired-directory)))
`(diredfl-dir-priv ((,c :inherit dired-directory)))
`(diredfl-exec-priv ((,c :foreground ,rainbow-3)))
`(diredfl-executable-tag ((,c :inherit diredfl-exec-priv)))
`(diredfl-file-name ((,c :foreground ,fg-main)))
`(diredfl-file-suffix ((,c :foreground ,variable)))
`(diredfl-flag-mark ((,c :inherit dired-marked)))
`(diredfl-flag-mark-line ((,c :inherit dired-marked)))
`(diredfl-ignored-file-name ((,c :inherit shadow)))
`(diredfl-link-priv ((,c :foreground ,link)))
`(diredfl-no-priv ((,c :inherit shadow)))
`(diredfl-number ((,c :inherit shadow)))
`(diredfl-other-priv ((,c :foreground ,rainbow-0)))
`(diredfl-rare-priv ((,c :foreground ,rainbow-0)))
`(diredfl-read-priv ((,c :foreground ,rainbow-1)))
`(diredfl-symlink ((,c :inherit dired-symlink)))
`(diredfl-tagged-autofile-name ((,c :inherit (diredfl-autofile-name dired-marked))))
`(diredfl-write-priv ((,c :foreground ,rainbow-2)))
;;;; ediff
`(ediff-current-diff-A ((,c :inherit diff-removed)))
`(ediff-current-diff-Ancestor ((,c :background ,bg-region))) ; TODO 2022-08-14: Needs review
`(ediff-current-diff-B ((,c :inherit diff-added)))
`(ediff-current-diff-C ((,c :inherit diff-changed)))
`(ediff-even-diff-A ((,c :background ,bg-dim)))
`(ediff-even-diff-Ancestor ((,c :background ,bg-dim)))
`(ediff-even-diff-B ((,c :background ,bg-dim)))
`(ediff-even-diff-C ((,c :background ,bg-dim)))
`(ediff-fine-diff-A ((,c :inherit diff-refine-removed)))
`(ediff-fine-diff-Ancestor ((,c :inherit diff-refine-cyan)))
`(ediff-fine-diff-B ((,c :inherit diff-refine-added)))
`(ediff-fine-diff-C ((,c :inherit diff-refine-changed)))
`(ediff-odd-diff-A ((,c :inherit ediff-even-diff-A)))
`(ediff-odd-diff-Ancestor ((,c :inherit ediff-even-diff-Ancestor)))
`(ediff-odd-diff-B ((,c :inherit ediff-even-diff-B)))
`(ediff-odd-diff-C ((,c :inherit ediff-even-diff-C)))
;;;; eldoc
;; NOTE: see https://github.com/purcell/package-lint/issues/187
(list 'eldoc-highlight-function-argument `((,c :inherit bold :background ,bg-dim :foreground ,accent-0)))
;;;; elfeed
`(elfeed-log-date-face ((,c :inherit elfeed-search-date-face)))
`(elfeed-log-debug-level-face ((,c :inherit elfeed-search-filter-face)))
`(elfeed-log-error-level-face ((,c :inherit error)))
`(elfeed-log-info-level-face ((,c :inherit success)))
`(elfeed-log-warn-level-face ((,c :inherit warning)))
`(elfeed-search-date-face ((,c :foreground ,date)))
`(elfeed-search-feed-face ((,c :foreground ,accent-1)))
`(elfeed-search-filter-face ((,c :inherit success)))
`(elfeed-search-last-update-face ((,c :inherit bold :foreground ,date)))
`(elfeed-search-tag-face ((,c :foreground ,accent-0)))
`(elfeed-search-title-face ((,c :foreground ,fg-dim)))
`(elfeed-search-unread-count-face ((,c :inherit bold)))
`(elfeed-search-unread-title-face ((,c :inherit bold :foreground ,fg-main)))
;;;; epa
`(epa-field-body (( )))
`(epa-field-name ((,c :inherit bold :foreground ,fg-dim)))
`(epa-mark ((,c :inherit bold)))
`(epa-string ((,c :foreground ,string)))
`(epa-validity-disabled ((,c :foreground ,err)))
`(epa-validity-high ((,c :inherit success)))
`(epa-validity-low ((,c :inherit shadow)))
`(epa-validity-medium ((,c :foreground ,info)))
;;;; eshell
`(eshell-ls-archive ((,c :foreground ,accent-2)))
`(eshell-ls-backup ((,c :inherit shadow)))
`(eshell-ls-clutter ((,c :inherit shadow)))
`(eshell-ls-directory ((,c :foreground ,accent-0)))
`(eshell-ls-executable ((,c :foreground ,accent-1)))
`(eshell-ls-missing ((,c :inherit error)))
`(eshell-ls-product ((,c :inherit shadow)))
`(eshell-ls-readonly ((,c :foreground ,warning)))
`(eshell-ls-special ((,c :foreground ,magenta)))
`(eshell-ls-symlink ((,c :inherit link)))
`(eshell-ls-unreadable ((,c :inherit shadow)))
`(eshell-prompt ((,c :inherit minibuffer-prompt)))
;;;; font-lock
`(font-lock-builtin-face ((,c :inherit bold :foreground ,builtin)))
`(font-lock-comment-delimiter-face ((,c :inherit font-lock-comment-face)))
`(font-lock-comment-face ((,c :inherit italic :foreground ,comment)))
`(font-lock-constant-face ((,c :foreground ,constant)))
`(font-lock-doc-face ((,c :inherit italic :foreground ,docstring)))
`(font-lock-function-name-face ((,c :foreground ,fnname)))
`(font-lock-keyword-face ((,c :inherit bold :foreground ,keyword)))
`(font-lock-negation-char-face ((,c :inherit bold)))
`(font-lock-preprocessor-face ((,c :foreground ,preprocessor)))
`(font-lock-regexp-grouping-backslash ((,c :inherit bold :foreground ,info)))
`(font-lock-regexp-grouping-construct ((,c :inherit bold :foreground ,err)))
`(font-lock-string-face ((,c :foreground ,string)))
`(font-lock-type-face ((,c :foreground ,type)))
`(font-lock-variable-name-face ((,c :foreground ,variable)))
`(font-lock-warning-face ((,c :foreground ,warning)))
;;;; git-commit
`(git-commit-comment-action ((,c :inherit font-lock-comment-face)))
`(git-commit-comment-branch-local ((,c :inherit font-lock-comment-face :foreground ,accent-0)))
`(git-commit-comment-heading ((,c :inherit (bold font-lock-comment-face))))
`(git-commit-comment-file ((,c :inherit font-lock-comment-face :foreground ,name)))
`(git-commit-keyword ((,c :foreground ,keyword)))
`(git-commit-nonempty-second-line ((,c :background ,bg-dim :foreground ,err)))
`(git-commit-overlong-summary ((,c :background ,bg-dim :foreground ,warning)))
`(git-commit-summary ((,c :inherit bold :foreground ,accent-0)))
;;;; git-rebase
`(git-rebase-comment-hash ((,c :inherit font-lock-comment-face :foreground ,constant)))
`(git-rebase-comment-heading ((,c :inherit (bold font-lock-comment-face))))
`(git-rebase-description ((,c :foreground ,fg-main)))
`(git-rebase-hash ((,c :foreground ,constant)))
;;;; gnus WORK-IN-PROGRESS
`(gnus-emphasis-highlight-words ((,c :background ,bg-alt :foreground ,warning)))
`(gnus-header-content ((,c :inherit message-header-other)))
`(gnus-header-from ((,c :inherit message-header-to :underline nil)))
`(gnus-header-name ((,c :inherit message-header-name)))
`(gnus-header-newsgroups ((,c :inherit message-header-newsgroups)))
`(gnus-header-subject ((,c :inherit message-header-subject)))
;;;; isearch, occur, and the like
`(isearch ((,c :background ,bg-yellow :foreground ,fg-intense)))
`(isearch-fail ((,c :background ,bg-red :foreground ,fg-intense)))
`(isearch-group-1 ((,c :background ,bg-magenta :foreground ,fg-intense)))
`(isearch-group-2 ((,c :background ,bg-green :foreground ,fg-intense)))
`(lazy-highlight ((,c :background ,bg-blue :foreground ,fg-intense)))
`(match ((,c :background ,bg-alt :foreground ,fg-intense)))
`(query-replace ((,c :background ,bg-red :foreground ,fg-intense)))
;;;; keycast
`(keycast-command ((,c :inherit bold)))
`(keycast-key ((,c :background ,bg-accent :foreground ,fg-accent)))
;;;; line numbers (display-line-numbers-mode and global variant)
;; We need to fall back to `default' otherwise line numbers do not
;; scale when using `text-scale-adjust'.
`(line-number ((,c :inherit (shadow default))))
`(line-number-current-line ((,c :inherit bold :foreground ,fg-intense)))
`(line-number-major-tick ((,c :inherit line-number :background ,bg-alt :foreground ,info)))
`(line-number-minor-tick ((,c :inherit line-number :background ,bg-dim :foreground ,warning)))
;;;; magit
`(magit-bisect-bad ((,c :inherit error)))
`(magit-bisect-good ((,c :inherit success)))
`(magit-bisect-skip ((,c :inherit warning)))
`(magit-blame-date (( )))
`(magit-blame-dimmed ((,c :inherit shadow)))
`(magit-blame-hash ((,c :inherit shadow)))
`(magit-blame-heading ((,c :background ,bg-dim :extend t)))
`(magit-blame-highlight ((,c :background ,bg-active :foreground ,fg-intense)))
`(magit-blame-name (( )))
`(magit-blame-summary (( )))
`(magit-branch-local ((,c :foreground ,accent-0)))
`(magit-branch-remote ((,c :foreground ,accent-1)))
`(magit-branch-upstream ((,c :inherit italic)))
`(magit-branch-warning ((,c :inherit warning)))
`(magit-cherry-equivalent ((,c :foreground ,magenta)))
`(magit-cherry-unmatched ((,c :foreground ,cyan)))
`(magit-diff-added ((,c :background ,bg-added-faint)))
`(magit-diff-added-highlight ((,c :background ,bg-added)))
`(magit-diff-base ((,c :background ,bg-changed-faint)))
`(magit-diff-base-highlight ((,c :background ,bg-changed)))
`(magit-diff-context ((,c :inherit shadow)))
`(magit-diff-context-highlight ((,c :background ,bg-dim)))
`(magit-diff-file-heading ((,c :inherit bold :foreground ,accent-0)))
`(magit-diff-file-heading-highlight ((,c :inherit magit-diff-file-heading :background ,bg-alt)))
`(magit-diff-file-heading-selection ((,c :inherit bold :background ,bg-hover-alt :foreground ,fg-intense)))
`(magit-diff-hunk-heading ((,c :inherit bold :background ,bg-dim)))
`(magit-diff-hunk-heading-highlight ((,c :inherit bold :background ,bg-active :foreground ,fg-intense)))
`(magit-diff-hunk-heading-selection ((,c :inherit bold :background ,bg-hover-alt :foreground ,fg-intense)))
`(magit-diff-hunk-region ((,c :inherit bold)))
`(magit-diff-lines-boundary ((,c :background ,fg-intense)))
`(magit-diff-lines-heading ((,c :background ,fg-alt :foreground ,bg-alt)))
`(magit-diff-removed ((,c :background ,bg-removed-faint)))
`(magit-diff-removed-highlight ((,c :background ,bg-removed)))
`(magit-diffstat-added ((,c :inherit success)))
`(magit-diffstat-removed ((,c :inherit error)))
`(magit-dimmed ((,c :inherit shadow)))
`(magit-filename ((,c :foreground ,name)))
`(magit-hash ((,c :inherit shadow)))
`(magit-head ((,c :inherit magit-branch-local)))
`(magit-header-line ((,c :inherit bold)))
`(magit-header-line-key ((,c :inherit help-key-binding)))
`(magit-header-line-log-select ((,c :inherit bold)))
`(magit-keyword ((,c :foreground ,keyword)))
`(magit-keyword-squash ((,c :inherit bold :foreground ,warning)))
`(magit-log-author ((,c :foreground ,name)))
`(magit-log-date ((,c :foreground ,date)))
`(magit-log-graph ((,c :inherit shadow)))
`(magit-mode-line-process ((,c :inherit success)))
`(magit-mode-line-process-error ((,c :inherit error)))
`(magit-process-ng ((,c :inherit error)))
`(magit-process-ok ((,c :inherit success)))
`(magit-reflog-amend ((,c :inherit warning)))
`(magit-reflog-checkout ((,c :inherit bold :foreground ,blue)))
`(magit-reflog-cherry-pick ((,c :inherit success)))
`(magit-reflog-commit ((,c :inherit bold)))
`(magit-reflog-merge ((,c :inherit success)))
`(magit-reflog-other ((,c :inherit bold :foreground ,cyan)))
`(magit-reflog-rebase ((,c :inherit bold :foreground ,magenta)))
`(magit-reflog-remote ((,c :inherit (bold magit-branch-remote))))
`(magit-reflog-reset ((,c :inherit error)))
`(magit-refname ((,c :inherit shadow)))
`(magit-refname-pullreq ((,c :inherit shadow)))
`(magit-refname-stash ((,c :inherit shadow)))
`(magit-refname-wip ((,c :inherit shadow)))
`(magit-section ((,c :background ,bg-dim :foreground ,fg-main)))
`(magit-section-heading ((,c :inherit bold)))
`(magit-section-heading-selection ((,c :inherit bold :background ,bg-hover-alt :foreground ,fg-intense)))
`(magit-section-highlight ((,c :background ,bg-dim)))
`(magit-sequence-done ((,c :inherit success)))
`(magit-sequence-drop ((,c :inherit error)))
`(magit-sequence-exec ((,c :inherit bold :foreground ,magenta)))
`(magit-sequence-head ((,c :inherit bold :foreground ,cyan)))
`(magit-sequence-onto ((,c :inherit (bold shadow))))
`(magit-sequence-part ((,c :inherit warning)))
`(magit-sequence-pick ((,c :inherit bold)))
`(magit-sequence-stop ((,c :inherit error)))
`(magit-signature-bad ((,c :inherit error)))
`(magit-signature-error ((,c :inherit error)))
`(magit-signature-expired ((,c :inherit warning)))
`(magit-signature-expired-key ((,c :foreground ,warning)))
`(magit-signature-good ((,c :inherit success)))
`(magit-signature-revoked ((,c :inherit bold :foreground ,warning)))
`(magit-signature-untrusted ((,c :inherit (bold shadow))))
`(magit-tag ((,c :foreground ,accent-3))) ; compare with branches
;;;; man
`(Man-overstrike ((,c :inherit bold :foreground ,accent-0)))
`(Man-underline ((,c :foreground ,accent-1 :underline t)))
;;;; marginalia
`(marginalia-archive ((,c :foreground ,accent-0)))
`(marginalia-char ((,c :foreground ,accent-2)))
`(marginalia-date ((,c :foreground ,date)))
`(marginalia-documentation ((,c :inherit italic :foreground ,docstring)))
`(marginalia-file-name (( )))
`(marginalia-file-owner ((,c :inherit shadow)))
`(marginalia-file-priv-dir (( )))
`(marginalia-file-priv-exec ((,c :foreground ,rainbow-3)))
`(marginalia-file-priv-link ((,c :foreground ,link)))
`(marginalia-file-priv-no ((,c :inherit shadow)))
`(marginalia-file-priv-other ((,c :foreground ,rainbow-0)))
`(marginalia-file-priv-rare ((,c :foreground ,rainbow-0)))
`(marginalia-file-priv-read ((,c :foreground ,rainbow-1)))
`(marginalia-file-priv-write ((,c :foreground ,rainbow-2)))
`(marginalia-function ((,c :foreground ,fnname)))
`(marginalia-key ((,c :inherit help-key-binding)))
`(marginalia-lighter ((,c :inherit shadow)))
`(marginalia-liqst ((,c :inherit shadow)))
`(marginalia-mode ((,c :foreground ,constant)))
`(marginalia-modified ((,c :inherit warning)))
`(marginalia-null ((,c :inherit shadow)))
`(marginalia-number ((,c :foreground ,constant)))
`(marginalia-size ((,c :foreground ,variable)))
`(marginalia-string ((,c :foreground ,string)))
`(marginalia-symbol ((,c :foreground ,builtin)))
`(marginalia-true (( )))
`(marginalia-type ((,c :foreground ,type)))
`(marginalia-value ((,c :inherit shadow)))
`(marginalia-version ((,c :foreground ,accent-1)))
;;;; markdown-mode
`(markdown-blockquote-face ((,c :inherit font-lock-doc-face)))
`(markdown-bold-face ((,c :inherit bold)))
`(markdown-code-face ((,c :background ,bg-dim :extend t)))
`(markdown-gfm-checkbox-face ((,c :foreground ,warning)))
`(markdown-header-face (( )))
`(markdown-header-face-1 ((,c :inherit bold :height 1.7 :foreground ,rainbow-0)))
`(markdown-header-face-2 ((,c :inherit bold :height 1.6 :foreground ,rainbow-1)))
`(markdown-header-face-3 ((,c :inherit bold :height 1.5 :foreground ,rainbow-2)))
`(markdown-header-face-4 ((,c :inherit bold :height 1.4 :foreground ,rainbow-3)))
`(markdown-header-face-5 ((,c :inherit bold :height 1.3 :foreground ,rainbow-4)))
`(markdown-header-face-6 ((,c :inherit bold :height 1.2 :foreground ,rainbow-5)))
`(markdown-highlighting-face ((,c :background ,bg-info :foreground ,info)))
`(markdown-inline-code-face ((,c :foreground ,accent-1))) ; same as `org-code'
`(markdown-italic-face ((,c :inherit italic)))
`(markdown-language-keyword-face ((,c :background ,bg-alt)))
`(markdown-line-break-face ((,c :inherit nobreak-space)))
`(markdown-link-face ((,c :inherit link)))
`(markdown-markup-face ((,c :inherit shadow)))
`(markdown-metadata-key-face ((,c :inherit bold)))
`(markdown-metadata-value-face ((,c :foreground ,string)))
`(markdown-missing-link-face ((,c :inherit warning)))
`(markdown-pre-face ((,c :inherit markdown-code-face)))
`(markdown-table-face ((,c :foreground ,fg-alt))) ; same as `org-table'
`(markdown-url-face ((,c :inherit link :underline nil)))
;;;; messages
`(message-cited-text-1 ((,c :foreground ,mail-0)))
`(message-cited-text-2 ((,c :foreground ,mail-1)))
`(message-cited-text-3 ((,c :foreground ,mail-2)))
`(message-cited-text-4 ((,c :foreground ,mail-3)))
`(message-header-name ((,c :inherit bold)))
`(message-header-newsgroups ((,c :inherit message-header-other)))
`(message-header-to ((,c :inherit bold :foreground ,mail-0)))
`(message-header-cc ((,c :foreground ,mail-1)))
`(message-header-subject ((,c :inherit bold :foreground ,mail-2)))
`(message-header-xheader ((,c :foreground ,mail-3)))
`(message-header-other ((,c :foreground ,mail-4)))
`(message-mml ((,c :foreground ,info)))
`(message-separator ((,c :background ,bg-alt)))
;;;; mode-line
`(mode-line ((,c :background ,bg-mode-line :foreground ,fg-mode-line)))
`(mode-line-active ((,c :inherit mode-line)))
`(mode-line-buffer-id ((,c :inherit bold)))
`(mode-line-emphasis ((,c :inherit bold :foreground ,fg-intense)))
`(mode-line-highlight ((,c :inherit highlight)))
`(mode-line-inactive ((,c :background ,bg-alt :foreground ,fg-dim)))
;;;; mu4e
`(mu4e-attach-number-face ((,c :inherit bold :foreground ,fg-dim)))
`(mu4e-cited-1-face ((,c :inherit message-cited-text-1)))
`(mu4e-cited-2-face ((,c :inherit message-cited-text-2)))
`(mu4e-cited-3-face ((,c :inherit message-cited-text-3)))
`(mu4e-cited-4-face ((,c :inherit message-cited-text-4)))
`(mu4e-cited-5-face ((,c :inherit message-cited-text-1)))
`(mu4e-cited-6-face ((,c :inherit message-cited-text-2)))
`(mu4e-cited-7-face ((,c :inherit message-cited-text-3)))
`(mu4e-compose-header-face ((,c :inherit mu4e-compose-separator-face)))
`(mu4e-compose-separator-face ((,c :inherit message-separator)))
`(mu4e-contact-face ((,c :inherit message-header-to)))
`(mu4e-context-face ((,c :inherit bold)))
`(mu4e-draft-face ((,c :foreground ,info)))
`(mu4e-flagged-face ((,c :foreground ,err)))
`(mu4e-footer-face ((,c :inherit italic :foreground ,fg-alt)))
`(mu4e-forwarded-face ((,c :inherit italic :foreground ,info)))
`(mu4e-header-face ((,c :inherit shadow)))
`(mu4e-header-highlight-face ((,c :inherit hl-line)))
`(mu4e-header-key-face ((,c :inherit message-header-name)))
`(mu4e-header-marks-face ((,c :inherit mu4e-special-header-value-face)))
`(mu4e-header-title-face ((,c :foreground ,rainbow-0)))
`(mu4e-header-value-face ((,c :inherit message-header-other)))
`(mu4e-highlight-face ((,c :inherit help-key-binding)))
`(mu4e-link-face ((,c :inherit link)))
`(mu4e-modeline-face ((,c :foreground ,info)))
`(mu4e-moved-face ((,c :inherit italic :foreground ,warning)))
`(mu4e-ok-face ((,c :inherit success)))
`(mu4e-region-code ((,c :foreground ,builtin)))
`(mu4e-related-face ((,c :inherit (italic shadow))))
`(mu4e-replied-face ((,c :foreground ,info)))
`(mu4e-special-header-value-face ((,c :inherit message-header-subject)))
`(mu4e-system-face ((,c :inherit italic)))
`(mu4e-title-face (( )))
`(mu4e-trashed-face ((,c :foreground ,err)))
`(mu4e-unread-face ((,c :inherit bold)))
`(mu4e-url-number-face ((,c :inherit shadow)))
`(mu4e-view-body-face (( )))
`(mu4e-warning-face ((,c :inherit warning)))
;;;; notmuch
`(notmuch-crypto-decryption ((,c :inherit (shadow bold))))
`(notmuch-crypto-part-header ((,c :foreground ,magenta-cooler)))
`(notmuch-crypto-signature-bad ((,c :inherit error)))
`(notmuch-crypto-signature-good ((,c :inherit success)))
`(notmuch-crypto-signature-good-key ((,c :inherit success)))
`(notmuch-crypto-signature-unknown ((,c :inherit warning)))
`(notmuch-jump-key ((,c :inherit help-key-binding)))
`(notmuch-message-summary-face ((,c :inherit bold :background ,bg-dim)))
`(notmuch-search-count ((,c :foreground ,fg-dim)))
`(notmuch-search-date ((,c :foreground ,date)))
`(notmuch-search-flagged-face ((,c :foreground ,err)))
`(notmuch-search-matching-authors ((,c :foreground ,name)))
`(notmuch-search-non-matching-authors ((,c :inherit shadow)))
`(notmuch-search-subject ((,c :foreground ,fg-main)))
`(notmuch-search-unread-face ((,c :inherit bold)))
`(notmuch-tag-added ((,c :underline t)))
`(notmuch-tag-deleted ((,c :strike-through t)))
`(notmuch-tag-face ((,c :foreground ,accent-0)))
`(notmuch-tag-flagged ((,c :foreground ,err)))
`(notmuch-tag-unread ((,c :foreground ,accent-1)))
`(notmuch-tree-match-author-face ((,c :inherit notmuch-search-matching-authors)))
`(notmuch-tree-match-date-face ((,c :inherit notmuch-search-date)))
`(notmuch-tree-match-face ((,c :foreground ,fg-main)))
`(notmuch-tree-match-tag-face ((,c :inherit notmuch-tag-face)))
`(notmuch-tree-no-match-face ((,c :inherit shadow)))
`(notmuch-tree-no-match-date-face ((,c :inherit shadow)))
`(notmuch-wash-cited-text ((,c :inherit message-cited-text-1)))
`(notmuch-wash-toggle-button ((,c :background ,bg-dim :foreground ,fg-alt)))
;;;; orderless
`(orderless-match-face-0 ((,c :inherit bold :foreground ,accent-0)))
`(orderless-match-face-1 ((,c :inherit bold :foreground ,accent-1)))
`(orderless-match-face-2 ((,c :inherit bold :foreground ,accent-2)))
`(orderless-match-face-3 ((,c :inherit bold :foreground ,accent-3)))
;;;; org
`(org-agenda-calendar-event ((,c :foreground ,fg-alt)))
`(org-agenda-calendar-sexp ((,c :inherit (italic org-agenda-calendar-event))))
`(org-agenda-clocking ((,c :background ,bg-alt :foreground ,red-warmer)))
`(org-agenda-column-dateline ((,c :background ,bg-alt)))
`(org-agenda-current-time ((,c :foreground ,variable)))
`(org-agenda-date ((,c :foreground ,date :height 1.4)))
`(org-agenda-date-today ((,c :inherit org-agenda-date :underline t)))
`(org-agenda-date-weekend ((,c :inherit org-agenda-date)))
`(org-agenda-date-weekend-today ((,c :inherit org-agenda-date-today)))
`(org-agenda-diary ((,c :inherit org-agenda-calendar-sexp)))
`(org-agenda-dimmed-todo-face ((,c :inherit shadow)))
`(org-agenda-done ((,c :inherit success)))
`(org-agenda-filter-category ((,c :inherit success)))
`(org-agenda-filter-effort ((,c :inherit success)))
`(org-agenda-filter-regexp ((,c :inherit success)))
`(org-agenda-filter-tags ((,c :inherit success)))
`(org-agenda-restriction-lock ((,c :background ,bg-dim :foreground ,fg-dim)))
`(org-agenda-structure ((,c :foreground ,rainbow-0 :height 1.7)))
`(org-agenda-structure-filter ((,c :inherit (bold org-agenda-structure) :foreground ,rainbow-1)))
`(org-agenda-structure-secondary ((,c :foreground ,rainbow-1)))
`(org-archived ((,c :background ,bg-alt :foreground ,fg-alt)))
`(org-block (( )))
`(org-block-begin-line ((,c :inherit shadow)))
`(org-block-end-line ((,c :inherit org-block-begin-line)))
`(org-checkbox ((,c :foreground ,warning)))
`(org-checkbox-statistics-done ((,c :inherit org-done)))
`(org-checkbox-statistics-todo ((,c :inherit org-todo)))
`(org-clock-overlay ((,c :background ,bg-alt :foreground ,red-cooler)))
`(org-code ((,c :foreground ,accent-1)))
`(org-column ((,c :inherit default :background ,bg-alt)))
`(org-column-title ((,c :inherit (bold default) :underline t :background ,bg-alt)))
`(org-date ((,c :foreground ,date)))
`(org-date-selected ((,c :foreground ,date :inverse-video t)))
`(org-dispatcher-highlight ((,c :inherit (bold secondary-selection))))
`(org-document-info ((,c :foreground ,rainbow-1)))
`(org-document-info-keyword ((,c :inherit shadow)))
`(org-document-title ((,c :foreground ,rainbow-0 :height 1.8)))
`(org-done ((,c :foreground ,info)))
`(org-drawer ((,c :inherit shadow)))
`(org-ellipsis (( ))) ; inherits from the heading's color
`(org-footnote ((,c :inherit link)))
`(org-formula ((,c :foreground ,fnname)))
`(org-headline-done ((,c :inherit org-done)))
`(org-headline-todo ((,c :inherit org-todo)))
`(org-hide ((,c :foreground ,bg-main)))
`(org-indent ((,c :inherit org-hide)))
`(org-imminent-deadline ((,c :inherit bold :foreground ,err)))
`(org-latex-and-related ((,c :foreground ,type)))
`(org-level-1 ((,c :inherit bold :foreground ,rainbow-1 :height 1.7)))
`(org-level-2 ((,c :inherit bold :foreground ,rainbow-2 :height 1.6)))
`(org-level-3 ((,c :inherit bold :foreground ,rainbow-3 :height 1.5)))
`(org-level-4 ((,c :inherit bold :foreground ,rainbow-4 :height 1.4)))
`(org-level-5 ((,c :inherit bold :foreground ,rainbow-5 :height 1.3)))
`(org-level-6 ((,c :inherit bold :foreground ,rainbow-6 :height 1.2)))
`(org-level-7 ((,c :inherit bold :foreground ,rainbow-7 :height 1.1)))
`(org-level-8 ((,c :inherit bold :foreground ,rainbow-8 :height 1.0)))
`(org-link ((,c :inherit link)))
`(org-list-dt ((,c :inherit bold)))
`(org-macro ((,c :foreground ,accent-2)))
`(org-meta-line ((,c :inherit shadow)))
`(org-mode-line-clock (( )))
`(org-mode-line-clock-overrun ((,c :inherit bold :foreground ,err)))
`(org-priority ((,c :foreground ,magenta)))
`(org-property-value ((,c :foreground ,fg-alt)))
`(org-quote (( )))
`(org-scheduled ((,c :foreground ,warning)))
`(org-scheduled-previously ((,c :inherit org-scheduled)))
`(org-scheduled-today ((,c :inherit (bold org-scheduled))))
`(org-sexp-date ((,c :foreground ,date)))
`(org-special-keyword ((,c :inherit shadow)))
`(org-table ((,c :foreground ,fg-alt)))
`(org-table-header ((,c :inherit (bold org-table))))
`(org-tag ((,c :foreground ,fg-alt)))
`(org-tag-group ((,c :inherit (bold org-tag))))
`(org-target ((,c :underline t)))
`(org-time-grid ((,c :foreground ,fg-dim)))
`(org-todo ((,c :foreground ,err)))
`(org-upcoming-deadline ((,c :foreground ,warning)))
`(org-upcoming-distant-deadline ((,c :inherit org-upcoming-deadline)))
`(org-verbatim ((,c :foreground ,accent-0)))
`(org-verse (( )))
`(org-warning ((,c :inherit warning)))
;;;; org-modern
`(org-modern-block-keyword (( )))
`(org-modern-date-active ((,c :background ,bg-alt)))
`(org-modern-date-inactive ((,c :background ,bg-dim :foreground ,fg-dim)))
`(org-modern-done ((,c :background ,bg-info :foreground ,info)))
`(org-modern-priority ((,c :inherit org-priority :background ,bg-dim)))
`(org-modern-statistics ((,c :background ,bg-dim)))
`(org-modern-tag ((,c :inherit org-tag :background ,bg-dim)))
`(org-modern-time-active ((,c :background ,bg-active :foreground ,fg-intense)))
`(org-modern-time-inactive ((,c :inherit org-modern-date-inactive)))
`(org-modern-todo ((,c :background ,bg-err :foreground ,err)))
;;;; outline-mode
`(outline-1 ((,c :inherit bold :foreground ,rainbow-1)))
`(outline-2 ((,c :inherit bold :foreground ,rainbow-2)))
`(outline-3 ((,c :inherit bold :foreground ,rainbow-3)))
`(outline-4 ((,c :inherit bold :foreground ,rainbow-4)))
`(outline-5 ((,c :inherit bold :foreground ,rainbow-5)))
`(outline-6 ((,c :inherit bold :foreground ,rainbow-6)))
`(outline-7 ((,c :inherit bold :foreground ,rainbow-7)))
`(outline-8 ((,c :inherit bold :foreground ,rainbow-8)))
;;;; outline-minor-faces
`(outline-minor-0 (( )))
;;;; package (M-x list-packages)
`(package-description ((,c :foreground ,docstring)))
`(package-help-section-name ((,c :inherit bold)))
`(package-name ((,c :inherit link)))
`(package-status-available ((,c :foreground ,date)))
`(package-status-avail-obso ((,c :inherit error)))
`(package-status-built-in ((,c :foreground ,builtin)))
`(package-status-dependency ((,c :foreground ,warning)))
`(package-status-disabled ((,c :inherit error :strike-through t)))
`(package-status-held ((,c :foreground ,warning)))
`(package-status-incompat ((,c :inherit warning)))
`(package-status-installed ((,c :foreground ,fg-alt)))
`(package-status-new ((,c :inherit success)))
`(package-status-unsigned ((,c :inherit error)))
;;;; rainbow-delimiters
`(rainbow-delimiters-base-error-face ((,c :inherit (bold rainbow-delimiters-mismatched-face))))
`(rainbow-delimiters-base-face ((,c :foreground ,rainbow-0)))
`(rainbow-delimiters-depth-1-face ((,c :foreground ,rainbow-0)))
`(rainbow-delimiters-depth-2-face ((,c :foreground ,rainbow-1)))
`(rainbow-delimiters-depth-3-face ((,c :foreground ,rainbow-2)))
`(rainbow-delimiters-depth-4-face ((,c :foreground ,rainbow-3)))
`(rainbow-delimiters-depth-5-face ((,c :foreground ,rainbow-4)))
`(rainbow-delimiters-depth-6-face ((,c :foreground ,rainbow-5)))
`(rainbow-delimiters-depth-7-face ((,c :foreground ,rainbow-6)))
`(rainbow-delimiters-depth-8-face ((,c :foreground ,rainbow-7)))
`(rainbow-delimiters-depth-9-face ((,c :foreground ,rainbow-8)))
`(rainbow-delimiters-mismatched-face ((,c :background ,bg-red :foreground ,fg-intense)))
`(rainbow-delimiters-unmatched-face ((,c :inherit (bold rainbow-delimiters-mismatched-face))))
;;;; regexp-builder (re-builder)
`(reb-match-0 ((,c :background ,bg-cyan :foreground ,fg-intense)))
`(reb-match-1 ((,c :background ,bg-magenta :foreground ,fg-intense)))
`(reb-match-2 ((,c :background ,bg-red :foreground ,fg-intense)))
`(reb-match-3 ((,c :background ,bg-yellow :foreground ,fg-intense)))
`(reb-regexp-grouping-backslash ((,c :inherit font-lock-regexp-grouping-backslash)))
`(reb-regexp-grouping-construct ((,c :inherit font-lock-regexp-grouping-construct)))
;;;; ruler-mode
`(ruler-mode-column-number ((,c :inherit ruler-mode-default)))
`(ruler-mode-comment-column ((,c :inherit ruler-mode-default :foreground ,red)))
`(ruler-mode-current-column ((,c :inherit ruler-mode-default :background ,bg-active :foreground ,fg-intense)))
`(ruler-mode-default ((,c :inherit default :background ,bg-dim :foreground ,fg-dim)))
`(ruler-mode-fill-column ((,c :inherit ruler-mode-default :foreground ,green)))
`(ruler-mode-fringes ((,c :inherit ruler-mode-default :foreground ,cyan)))
`(ruler-mode-goal-column ((,c :inherit ruler-mode-default :foreground ,blue)))
`(ruler-mode-margins ((,c :inherit ruler-mode-default :foreground ,bg-main)))
`(ruler-mode-pad ((,c :inherit ruler-mode-default :background ,bg-alt :foreground ,fg-dim)))
`(ruler-mode-tab-stop ((,c :inherit ruler-mode-default :foreground ,yellow)))
;;;; show-paren-mode
`(show-paren-match ((,c :background ,bg-paren :foreground ,fg-intense)))
`(show-paren-match-expression ((,c :background ,bg-alt)))
`(show-paren-mismatch ((,c :background ,bg-red :foreground ,fg-intense)))
;;;; tab-bar-mode
`(tab-bar ((,c :background ,bg-alt)))
`(tab-bar-tab-group-current ((,c :inherit bold :background ,bg-main :box (:line-width (2 . -2) :style flat-button) :foreground ,fg-alt)))
`(tab-bar-tab-group-inactive ((,c :background ,bg-alt :box (:line-width (2 . -2) :style flat-button) :foreground ,fg-alt)))
`(tab-bar-tab ((,c :inherit bold :box (:line-width (2 . -2) :style flat-button) :background ,bg-main :foreground ,fg-main)))
`(tab-bar-tab-inactive ((,c :box (:line-width (2 . -2) :style flat-button) :background ,bg-dim :foreground ,fg-dim)))
;;;; tab-line-mode
`(tab-line ((,c :background ,bg-alt :height 0.95)))
`(tab-line-close-highlight ((,c :foreground ,red)))
`(tab-line-highlight ((,c :inherit highlight)))
`(tab-line-tab (( )))
`(tab-line-tab-current ((,c :inherit bold :box (:line-width (2 . -2) :style flat-button) :background ,bg-main :foreground ,fg-main)))
`(tab-line-tab-inactive ((,c :box (:line-width (2 . -2) :style flat-button) :background ,bg-dim :foreground ,fg-dim)))
`(tab-line-tab-inactive-alternate ((,c :inherit tab-line-tab-inactive :foreground ,fg-alt)))
`(tab-line-tab-modified ((,c :foreground ,warning)))
;;;; term
`(term ((,c :background ,bg-main :foreground ,fg-main)))
`(term-bold ((,c :inherit bold)))
`(term-color-black ((,c :background "black" :foreground "black")))
`(term-color-blue ((,c :background ,blue :foreground ,blue)))
`(term-color-cyan ((,c :background ,cyan :foreground ,cyan)))
`(term-color-green ((,c :background ,green :foreground ,green)))
`(term-color-magenta ((,c :background ,magenta :foreground ,magenta)))
`(term-color-red ((,c :background ,red :foreground ,red)))
`(term-color-white ((,c :background "white" :foreground "white")))
`(term-color-yellow ((,c :background ,yellow :foreground ,yellow)))
`(term-underline ((,c :underline t)))
;;;; textsec
`(textsec-suspicious (( )))
;;;; transient
`(transient-active-infix ((,c :background ,bg-hover-alt :foreground ,fg-intense)))
`(transient-amaranth ((,c :inherit bold :foreground ,yellow-warmer)))
;; Placate the compiler for what is a spurious warning. We also
;; have to do this with `eldoc-highlight-function-argument'.
(list 'transient-argument `((,c :inherit bold :background ,bg-dim :foreground ,accent-0)))
`(transient-blue ((,c :inherit bold :foreground ,blue-cooler)))
`(transient-disabled-suffix ((,c :strike-through t)))
`(transient-enabled-suffix ((,c :background ,bg-dim :foreground ,accent-1)))
`(transient-heading ((,c :inherit bold)))
`(transient-inactive-argument ((,c :inherit shadow)))
`(transient-inactive-value ((,c :inherit shadow)))
`(transient-key ((,c :inherit help-key-binding)))
`(transient-mismatched-key ((,c :underline t)))
`(transient-nonstandard-key ((,c :underline t)))
`(transient-pink ((,c :inherit bold :foreground ,magenta)))
`(transient-purple ((,c :inherit bold :foreground ,magenta-cooler)))
`(transient-red ((,c :inherit bold :foreground ,red)))
`(transient-teal ((,c :inherit bold :foreground ,cyan-cooler)))
`(transient-unreachable ((,c :inherit shadow)))
`(transient-unreachable-key ((,c :inherit shadow)))
`(transient-value ((,c :background ,bg-dim :foreground ,accent-2)))
;;;; vc (vc-dir.el, vc-hooks.el)
`(vc-dir-directory ((,c :foreground ,accent-0)))
`(vc-dir-file ((,c :foreground ,name)))
`(vc-dir-header ((,c :foreground ,accent-1)))
`(vc-dir-header-value ((,c :foreground ,accent-2)))
`(vc-dir-mark-indicator ((,c :inherit success)))
`(vc-dir-status-edited ((,c :inherit warning)))
`(vc-dir-status-ignored ((,c :inherit shadow)))
`(vc-dir-status-up-to-date (( )))
`(vc-dir-status-warning ((,c :inherit error)))
`(vc-conflict-state ((,c :inherit error)))
`(vc-edited-state ((,c :inherit italic)))
`(vc-locally-added-state ((,c :inherit italic)))
`(vc-locked-state ((,c :inherit success)))
`(vc-missing-state ((,c :inherit error)))
`(vc-needs-update-state ((,c :inherit error)))
`(vc-removed-state ((,c :inherit error)))
`(vc-state-base (( )))
`(vc-up-to-date-state (( )))
;;;; vertico
`(vertico-current ((,c :background ,bg-completion)))
;;;; wgrep
`(wgrep-delete-face ((,c :inherit warning)))
`(wgrep-done-face ((,c :inherit success)))
`(wgrep-face ((,c :inherit bold)))
`(wgrep-file-face ((,c :foreground ,fg-alt)))
`(wgrep-reject-face ((,c :inherit error)))
;;;; which-function-mode
`(which-func ((,c :inherit bold :foreground ,fg-intense)))
;;;; whitespace-mode
`(whitespace-big-indent ((,c :background ,bg-err :foreground ,err)))
`(whitespace-empty ((,c :inherit whitespace-big-indent)))
`(whitespace-hspace ((,c :inherit whitespace-indentation)))
`(whitespace-indentation ((,c :background ,bg-dim :foreground ,fg-dim)))
`(whitespace-line ((,c :background ,bg-dim :foreground ,warning)))
`(whitespace-newline ((,c :inherit whitespace-indentation)))
`(whitespace-space ((,c :inherit whitespace-indentation)))
`(whitespace-space-after-tab ((,c :inherit whitespace-space-before-tab)))
`(whitespace-space-before-tab ((,c :background ,bg-red)))
`(whitespace-tab ((,c :inherit whitespace-indentation)))
`(whitespace-trailing ((,c :inherit whitespace-space-before-tab)))
;;;; widget
`(widget-button ((,c :inherit bold :foreground ,link)))
`(widget-button-pressed ((,c :inherit widget-button :foreground ,link-alt)))
`(widget-documentation ((,c :inherit font-lock-doc-face)))
`(widget-field ((,c :background ,bg-alt :foreground ,fg-main :extend nil)))
`(widget-inactive ((,c :inherit shadow :background ,bg-dim)))
`(widget-single-line-field ((,c :inherit widget-field)))
;;;; woman
`(woman-addition ((,c :foreground ,accent-2)))
`(woman-bold ((,c :inherit bold :foreground ,accent-0)))
`(woman-italic ((,c :inherit italic :foreground ,accent-1)))
`(woman-unknown ((,c :foreground ,accent-3))))
"Face specs for use with `ef-themes-theme'.")
(defconst ef-themes-custom-variables
'()
"Custom variables for `ef-themes-theme'.")
;;; Theme macros
;;;###autoload
(defmacro ef-themes-theme (name palette)
"Bind NAME's color PALETTE around face specs and variables.
Face specifications are passed to `custom-theme-set-faces'.
While variables are handled by `custom-theme-set-variables'.
Those are stored in `ef-themes-faces' and
`ef-themes-custom-variables' respectively."
(declare (indent 0))
(let ((sym (gensym))
(colors (mapcar #'car (symbol-value palette))))
`(let* ((c '((class color) (min-colors 256)))
(,sym ,palette)
,@(mapcar (lambda (color)
(list color
`(let* ((value (car (alist-get ',color ,sym))))
(if (stringp value)
value
(car (alist-get value ,sym))))))
colors))
(custom-theme-set-faces ',name ,@ef-themes-faces)
(custom-theme-set-variables ',name ,@ef-themes-custom-variables))))
;;; Use theme colors
(defmacro ef-themes-with-colors (&rest body)
"Evaluate BODY with colors from current palette bound."
(declare (indent 0))
(let* ((sym (gensym))
(palette (ef-themes--current-theme-palette))
(colors (mapcar #'car (symbol-value palette))))
`(let* ((c '((class color) (min-colors 256)))
(,sym ,palette)
,@(mapcar (lambda (color)
(list color
`(let* ((value (car (alist-get ',color ,sym))))
(if (stringp value)
value
(car (alist-get value ,sym))))))
colors))
(ignore c ,@colors) ; Silence unused variable warnings
,@body)))
;;;###autoload
(when load-file-name
(let ((dir (file-name-directory load-file-name)))
(unless (equal dir (expand-file-name "themes/" data-directory))
(add-to-list 'custom-theme-load-path dir))))
(provide 'ef-themes)
;;; ef-themes.el ends here