dotfiles

🎜 Clone'em, tweak'em, stick'em in your $HOME 🎝
git clone https://git.kevinlegouguec.net/dotfiles
Log | Files | Refs | README

eighters-theme.el (34463B)


      1 ;; -*- lexical-binding: t -*-
      2 
      3 (require 'color)
      4 (require 'compile)                      ; compilation-*-directory-face
      5 (require-theme 'modus-themes)
      6 
      7 (deftheme eighters
      8   "Eighters gonna eight.")
      9 
     10 (defun eighters-hsl-to-hex (h s l)
     11   (apply
     12    'color-rgb-to-hex
     13    `(,@(color-hsl-to-rgb h s l) 2)))
     14 
     15 (defun eighters-decline-hue (name light-step)
     16   (interactive
     17    (list (read-color "Color to decline? ")
     18          (read-number "Light step? (1–100) ")))
     19   (pcase-let* ((`(,r ,g ,b) (color-name-to-rgb name))
     20                (`(,h _ _)  (color-rgb-to-hsl r g b)))
     21     (let ((variants (seq-map
     22                      (lambda (l)
     23                        (cons l (eighters-hsl-to-hex h 1.0 (/ l 100.0))))
     24                      (number-sequence 0 100 light-step)))
     25           (buf (format "*%s variants*" name)))
     26       (with-current-buffer (get-buffer-create buf)
     27         (pcase-dolist (`(,l . ,hex) variants)
     28           (let ((cr (modus-themes-contrast "#fff" hex)))
     29             (when (> cr 7.0)
     30               (insert
     31                (propertize (format "%s %3s\t%6.3f\n" hex l cr)
     32                 'face `(:background ,hex :extend t))))))
     33         (pcase-dolist (`(,l . ,hex) variants)
     34           (let ((cr (modus-themes-contrast "#000" hex)))
     35             (when (> cr 7.0)
     36               (insert
     37                (propertize (format "%s %3s\t%6.3f\n" hex l cr)
     38                 'face `(:foreground ,hex)))))))
     39       (pop-to-buffer buf))))
     40 
     41 (defvar eighters-hues
     42   '((red     . "brown2")
     43     (green   . "chartreuse2")
     44     (yellow  . "gold")
     45     (blue    . "steelblue1")
     46     (magenta . "violet")
     47     (cyan    . "cadetblue2")))
     48 
     49 (defvar eighters-palette
     50   '((bg "#000") (bg-hl-dimmer "#0f0f0f") (bg-hl-dim "#181818") (bg-hl "#222")
     51     (fg-red     "#ed5e5e") (fg-red-dim     "#ba5e5e") (fg-red-subtle     "#f4a3a3")
     52     (bg-red     "#4c0000") (bg-red-dim     "#300000") (bg-red-dimmer     "#1e0000")
     53     (fg-green   "#a5ed5e") (fg-green-dim   "#8bba5e") (fg-green-subtle   "#cbf4a3")
     54     (bg-green   "#122600") (bg-green-dim   "#0b1600") (bg-green-dimmer   "#060c00")
     55     (fg-yellow  "#edd65e") (fg-yellow-dim  "#baab5e") (fg-yellow-subtle  "#f4e8a3")
     56     (bg-yellow  "#262000") (bg-yellow-dim  "#161300") (bg-yellow-dimmer  "#0c0a00")
     57     (fg-blue    "#5eaced") (fg-blue-dim    "#5e90ba") (fg-blue-subtle    "#a3cff4")
     58     (bg-blue    "#00223f") (bg-blue-dim    "#001426") (bg-blue-dimmer    "#000b14")
     59     (fg-magenta "#ed5eed") (fg-magenta-dim "#ba5eba") (fg-magenta-subtle "#f4a3f4")
     60     (bg-magenta "#420042") (bg-magenta-dim "#280028") (bg-magenta-dimmer "#190019")
     61     (fg-cyan    "#5edfed") (fg-cyan-dim    "#5eb1ba") (fg-cyan-subtle    "#a3edf4")
     62     (bg-cyan    "#002428") (bg-cyan-dim    "#001416") (bg-cyan-dimmer    "#000b0c")
     63     (fg "#fff") (fg-dim "#bbb") (fg-dimmer "#888")))
     64 
     65 (defun eighters--step-while (init step predicate)
     66   (let ((result init)
     67         (next init))
     68     (while (funcall predicate (cl-incf next step))
     69       (setq result next))
     70     result))
     71 
     72 (defun eighters--brightest-bg (hue contrast-min)
     73   (eighters-hsl-to-hex
     74    hue 1
     75    (eighters--step-while
     76     0 .005
     77     (lambda (luminance)
     78       (let ((candidate (eighters-hsl-to-hex hue 1 luminance)))
     79         (> (modus-themes-contrast "#fff" candidate) contrast-min))))))
     80 
     81 (defun eighters-set-palette ()
     82   (interactive)
     83   (pcase-dolist (`(,hue-sym . ,hue-name) eighters-hues)
     84     (let ((hue (car (apply 'color-rgb-to-hsl (color-name-to-rgb hue-name)))))
     85       (setf
     86        (eighters-color 'fg hue-sym nil)     (eighters-hsl-to-hex hue .8 .65)
     87        (eighters-color 'fg hue-sym 'dim)    (eighters-hsl-to-hex hue .4 .55)
     88        (eighters-color 'fg hue-sym 'subtle) (eighters-hsl-to-hex hue .8 .8)
     89        (eighters-color 'bg hue-sym nil)     (eighters--brightest-bg hue 16)
     90        (eighters-color 'bg hue-sym 'dim)    (eighters--brightest-bg hue 18.5)
     91        (eighters-color 'bg hue-sym 'dimmer) (eighters--brightest-bg hue 19.75))))
     92   (load-theme 'eighters t))
     93 
     94 (defun eighters-showcase--insert (&rest _)
     95   (erase-buffer)
     96   (pcase-dolist (`(,sym ,color)
     97                  eighters-palette)
     98     (pcase-let* ((`(,r ,g ,b) (color-name-to-rgb color))
     99                  (`(,h ,s ,l) (color-rgb-to-hsl r g b)))
    100       (let (bg fg face)
    101         (if (string-prefix-p "fg" (symbol-name sym))
    102             (setq fg color
    103                   bg "#000")
    104           (setq bg color
    105                 fg "#fff"))
    106         (setq face `(:foreground ,fg :background ,bg :extend t))
    107         (insert
    108          (propertize (format "%-16s\t(%.3f %.3f %.3f) (%.3f %.3f %.3f)\t\t%.3f\n"
    109                              sym r g b h s l (modus-themes-contrast fg bg))
    110                      'face face))))))
    111 
    112 (defun eighters-showcase ()
    113   (interactive)
    114   (let ((buf (get-buffer-create "*Eighters palette*")))
    115     (with-current-buffer buf
    116       (eighters-showcase--insert)
    117       (setq-local revert-buffer-function 'eighters-showcase--insert)
    118       (pop-to-buffer buf))))
    119 
    120 (defun eighters-serialize ()
    121   (interactive)
    122   (let ((blacks '(bg bg-hl-dimmer bg-hl-dim bg-hl))
    123         (colors '(red green yellow blue magenta cyan))
    124         (whites '(fg fg-dim fg-dimmer))
    125         (beg (point))
    126         (format-sym
    127          (lambda (sym)
    128            (format "(%s \"%s\")"
    129                    sym (car (alist-get sym eighters-palette))))))
    130     (insert
    131      "(defvar eighters-palette\n'("
    132      (string-join (seq-map format-sym blacks) " ")
    133      "\n")
    134     (let ((beg (point)))
    135       (dolist (hue colors)
    136         (dolist (template '("fg-%s" "fg-%s-dim" "fg-%s-subtle"))
    137           (insert (funcall format-sym (intern (format template hue)))))
    138         (insert "\n")
    139         (dolist (template '("bg-%s" "bg-%s-dim" "bg-%s-dimmer"))
    140           (insert (funcall format-sym (intern (format template hue)))))
    141         (insert "\n"))
    142       (align-regexp beg (point) "\\(\\s-*\\)\\(\"[^)]\\|(\\)" 1 1 t))
    143     (insert
    144      (string-join (seq-map format-sym whites) " ")
    145      "))\n")
    146     (indent-region beg (point))))
    147 
    148 (defun eighters-color (symbol)
    149   (car (alist-get symbol eighters-palette)))
    150 
    151 (defun eighters--sym (xground hue qualifier)
    152   (intern
    153    (apply 'concat `( ,(symbol-name xground) "-"
    154                      ,(symbol-name hue)
    155                      ,@(when qualifier `("-" ,(symbol-name qualifier)))))))
    156 
    157 (defun eighters-color-set (xground hue qualifier value)
    158   (let ((sym (eighters--sym xground hue qualifier)))
    159     (setf (car (alist-get sym eighters-palette)) value)))
    160 
    161 (gv-define-simple-setter eighters-color eighters-color-set)
    162 
    163 (defface eighters-button nil
    164   "Face for elements that can be \"pushed\" with RET.")
    165 (defface eighters-checkbox nil
    166   "Face for text that represents togglable boxes.")
    167 (defface eighters-citation-1 nil
    168   "Face for level 1 citations.")
    169 (defface eighters-citation-2 nil
    170   "Face for level 2 citations.")
    171 (defface eighters-citation-3 nil
    172   "Face for level 3 citations.")
    173 (defface eighters-citation-4 nil
    174   "Face for level 4 citations.")
    175 (defface eighters-citation-5 nil
    176   "Face for level 5 citations.")
    177 (defface eighters-citation-6 nil
    178   "Face for level 6 citations.")
    179 (defface eighters-date nil
    180   "Face for text that describes dates.")
    181 (defface eighters-identity nil
    182   "Face for names of persons.")
    183 (defface eighters-markup nil
    184   "Face for text that describes \"structure\" rather than content.")
    185 (defface eighters-metadata nil
    186   "Face for extra context surrounding something of interest.")
    187 (defface eighters-title-1 nil
    188   "Face for level 1 headings.")
    189 (defface eighters-title-2 nil
    190   "Face for level 2 headings.")
    191 (defface eighters-title-3 nil
    192   "Face for level 3 headings.")
    193 (defface eighters-title-4 nil
    194   "Face for level 4 headings.")
    195 (defface eighters-title-5 nil
    196   "Face for level 5 headings.")
    197 (defface eighters-title-6 nil
    198   "Face for level 6 headings.")
    199 (defface eighters-title-7 nil
    200   "Face for level 7 headings.")
    201 (defface eighters-title-8 nil
    202   "Face for level 8 headings.")
    203 (defface eighters-ui-input nil
    204   "Face for UI elements that invite user interaction.")
    205 (defface eighters-ui-intangible nil
    206   "Face for UI elements that point cannot reach.")
    207 
    208 (defmacro eighters-with-palette (&rest body)
    209   `(let ,eighters-palette ,@body))
    210 
    211 (eighters-with-palette
    212  (custom-theme-set-faces
    213   'eighters
    214 ;;; Theme faces.
    215   `(eighters-button ((t (:box (:line-width (-1 . -1) :style released-button) :inherit eighters-ui-input))))
    216   `(eighters-checkbox ((t (:background ,bg-hl-dim :foreground ,fg-blue-dim))))
    217   `(eighters-citation-1 ((t (:foreground ,fg-cyan-dim))))
    218   `(eighters-citation-2 ((t (:foreground ,fg-green-dim))))
    219   `(eighters-citation-3 ((t (:foreground ,fg-yellow-dim))))
    220   `(eighters-citation-4 ((t (:foreground ,fg-red-dim))))
    221   `(eighters-citation-5 ((t (:foreground ,fg-magenta-dim))))
    222   `(eighters-citation-6 ((t (:foreground ,fg-blue-dim))))
    223   `(eighters-date ((t (:foreground ,fg-magenta-dim))))
    224   `(eighters-identity ((t (:foreground ,fg-red-subtle))))
    225   `(eighters-markup ((t (:foreground ,fg-dim))))
    226   `(eighters-metadata ((t (:foreground ,fg-magenta-dim))))
    227   `(eighters-title-1 ((t (:foreground ,fg-cyan-subtle :weight bold :height 1.28 :inherit variable-pitch))))
    228   `(eighters-title-2 ((t (:foreground ,fg-green-subtle :weight bold :height 1.20 :inherit variable-pitch))))
    229   `(eighters-title-3 ((t (:foreground ,fg-yellow-subtle :weight bold :height 1.12 :inherit variable-pitch))))
    230   `(eighters-title-4 ((t (:foreground ,fg-red-subtle :weight bold :height 1.04 :inherit variable-pitch))))
    231   `(eighters-title-5 ((t (:foreground ,fg-magenta-subtle :weight bold :inherit variable-pitch))))
    232   `(eighters-title-6 ((t (:foreground ,fg-blue-subtle :weight bold :inherit variable-pitch))))
    233   `(eighters-title-7 ((t (:foreground ,fg-cyan-subtle :weight bold :inherit variable-pitch))))
    234   `(eighters-title-8 ((t (:foreground ,fg-green-subtle :weight bold :inherit variable-pitch))))
    235   `(eighters-ui-input ((t (:background ,bg-blue-dim :foreground ,fg-blue-subtle))))
    236   `(eighters-ui-intangible ((t (:inherit variable-pitch))))
    237 ;;; Standard faces.
    238   `(ansi-color-black ((t (:foreground ,bg :background ,bg))))
    239   `(ansi-color-red ((t (:foreground ,fg-red :background ,bg-red-dim))))
    240   `(ansi-color-green ((t (:foreground ,fg-green :background ,bg-green-dim))))
    241   `(ansi-color-yellow ((t (:foreground ,fg-yellow :background ,bg-yellow-dim))))
    242   `(ansi-color-blue ((t (:foreground ,fg-blue :background ,bg-blue-dim))))
    243   `(ansi-color-magenta ((t (:foreground ,fg-magenta :background ,bg-magenta-dim))))
    244   `(ansi-color-cyan ((t (:foreground ,fg-cyan :background ,bg-cyan-dim))))
    245   `(ansi-color-white ((t (:foreground ,fg-dim :background ,fg-dim))))
    246   `(ansi-color-bright-black ((t (:foreground ,bg-hl :background ,bg-hl))))
    247   `(ansi-color-bright-red ((t (:foreground ,fg-red-subtle :background ,bg-red))))
    248   `(ansi-color-bright-green ((t (:foreground ,fg-green-subtle :background ,bg-green))))
    249   `(ansi-color-bright-yellow ((t (:foreground ,fg-yellow-subtle :background ,bg-yellow))))
    250   `(ansi-color-bright-blue ((t (:foreground ,fg-blue-subtle :background ,bg-blue))))
    251   `(ansi-color-bright-magenta ((t (:foreground ,fg-magenta-subtle :background ,bg-magenta))))
    252   `(ansi-color-bright-cyan ((t (:foreground ,fg-cyan-subtle :background ,bg-cyan))))
    253   `(ansi-color-bright-white ((t (:foreground ,fg :background ,fg))))
    254   `(button ((t (:inherit eighters-button))))
    255   `(calendar-today ((t (:inverse-video t))))
    256   `(change-log-date ((t (:inherit eighters-date))))
    257   `(change-log-email ((t (:inherit (eighters-identity fixed-pitch-serif)))))
    258   `(change-log-name ((t (:inherit eighters-identity))))
    259   `(comint-highlight-prompt ((t (:weight bold :inherit eighters-ui-input))))
    260   `(compilation-column-number ((t (:inherit eighters-metadata))))
    261   `(compilation-line-number ((t (:inherit eighters-metadata))))
    262   `(compilation-mode-line-exit ((t (:inherit compilation-info))))
    263   `(compilation-mode-line-fail ((t (:inherit compilation-error))))
    264   `(compilation-mode-line-run ((t (:inherit compilation-warning))))
    265   `(completions-annotations ((t (:inherit font-lock-doc-face))))
    266   `(completions-common-part ((t (:inherit shadow))))
    267   `(completions-first-difference ((t (:foreground ,fg-magenta :weight bold))))
    268   `(completions-highlight ((t (:background ,bg-magenta))))
    269   `(custom-button ((t (:inherit eighters-button))))
    270   `(custom-comment ((t (:background ,bg-hl-dim :foreground ,fg-dim))))
    271   `(custom-variable-tag ((t (:inherit eighters-title-3))))
    272   `(default ((t (:background ,bg :foreground ,fg))))
    273   `(dired-broken-symlink ((t (:background ,bg-red :foreground ,fg-yellow :weight bold))))
    274   `(dired-directory ((t (:weight bold :foreground ,fg-blue))))
    275   `(dired-header ((t (:inherit eighters-title-1))))
    276   `(dired-special ((t (:foreground ,fg-yellow-dim))))
    277   `(eglot-highlight-symbol-face ((t (:background ,bg-cyan-dim :underline ,fg-cyan-dim))))
    278   `(eldoc-highlight-function-argument ((t (:background ,bg-red-dim :foreground ,fg-magenta :inverse-video t :weight bold))))
    279   `(elisp-bound-variable ((t (:slant italic :inherit font-lock-variable-use-face))))
    280   `(elisp-free-variable ((t (:foreground ,fg-yellow-subtle))))
    281   `(elisp-shadowed-variable ((t (:inherit elisp-shadowing-variable))))
    282   `(elisp-shadowing-variable ((t (:inherit (elisp-free-variable elisp-binding-variable)))))
    283   `(emacs-authors-author ((t (:inherit (bold eighters-identity variable-pitch)))))
    284   `(emacs-authors-descriptor ((t (:inherit (shadow variable-pitch)))))
    285   `(emacs-news-does-not-need-documentation ((t (:foreground ,fg-dimmer))))
    286   `(emacs-news-is-documented ((t (:foreground ,fg-blue-dim))))
    287   `(erc-button ((t (:inherit link))))
    288   `(erc-current-nick-face ((t (:weight bold :inherit eighters-identity))))
    289   `(erc-direct-msg-face ((t (:inherit font-lock-doc-face))))
    290   `(erc-error-face ((t (:inherit error))))
    291   `(erc-input-face ((t (:inherit eighters-citation-1))))
    292   `(erc-keyword-face ((t (:inherit font-lock-keyword-face))))
    293   `(erc-my-nick-face ((t (:foreground ,fg-red-dim))))
    294   `(erc-nick-default-face ((t (:inherit eighters-identity))))
    295   `(erc-nick-msg-face ((t (:weight bold :inherit eighters-identity))))
    296   `(erc-notice-face ((t (:inherit font-lock-comment-face))))
    297   `(erc-prompt-face ((t (:inherit minibuffer-prompt))))
    298   `(erc-timestamp-face ((t (:inherit eighters-date))))
    299   `(error ((t :foreground ,fg-red :weight bold)))
    300   `(escape-glyph ((t (:foreground ,fg-red-dim :inherit fixed-pitch-serif))))
    301   `(eww-invalid-certificate ((t (:inherit error))))
    302   `(eww-valid-certificate ((t (:inherit success))))
    303   `(flymake-error ((t (:underline (:color ,fg-red :style wave)))))
    304   `(flymake-note ((t (:underline (:color ,fg-blue :style wave)))))
    305   `(flymake-warning ((t (:underline (:color ,fg-yellow :style wave)))))
    306   `(flyspell-duplicate ((t (:underline (:color ,fg-yellow :style wave)))))
    307   `(flyspell-incorrect ((t (:underline (:color ,fg-red :style wave)))))
    308   `(font-lock-builtin-face ((t (:foreground ,fg-blue))))
    309   `(font-lock-comment-face ((t (:foreground ,fg-dim :slant italic))))
    310   `(font-lock-constant-face ((t (:foreground ,fg-magenta))))
    311   `(font-lock-doc-face ((t (:foreground ,fg-green-dim :slant italic))))
    312   `(font-lock-function-call-face ((t (:foreground ,fg-blue-subtle))))
    313   `(font-lock-function-name-face ((t (:foreground ,fg-blue :weight bold))))
    314   `(font-lock-keyword-face ((t (:foreground ,fg-cyan :weight bold))))
    315   `(font-lock-negation-char-face ((t (:inherit warning))))
    316   `(font-lock-preprocessor-face ((t (:foreground ,fg-blue :inherit fixed-pitch-serif))))
    317   `(font-lock-regexp-grouping-backslash ((t (:foreground ,fg-yellow-dim))))
    318   `(font-lock-regexp-grouping-construct ((t (:foreground ,fg-yellow :weight bold))))
    319   `(font-lock-string-face ((t (:foreground ,fg-magenta-dim))))
    320   `(font-lock-type-face ((t (:foreground ,fg-green))))
    321   `(font-lock-variable-name-face ((t (:foreground ,fg-yellow))))
    322   `(font-lock-warning-face ((t (:inherit warning))))
    323   `(fringe ((t (:background ,bg-hl-dimmer :foreground ,fg-dimmer))))
    324   `(gnus-group-mail-1 ((t (:foreground ,fg-yellow :weight bold))))
    325   `(gnus-group-mail-1-empty ((t (:foreground ,fg-yellow-dim))))
    326   `(gnus-group-mail-3 ((t (:foreground ,fg-green :weight bold))))
    327   `(gnus-group-mail-3-empty ((t (:foreground ,fg-green-dim))))
    328   `(gnus-group-mail-low ((t (:foreground ,fg-dim :weight bold))))
    329   `(gnus-group-mail-low-empty ((t (:foreground ,fg-dimmer))))
    330   `(gnus-group-news-3 ((t (:foreground ,fg-magenta :weight bold))))
    331   `(gnus-group-news-3-empty ((t (:foreground ,fg-magenta-dim))))
    332   `(gnus-button ((t (:inherit link))))
    333   `(gnus-cite-1 ((t (:inherit eighters-citation-1))))
    334   `(gnus-cite-2 ((t (:inherit eighters-citation-2))))
    335   `(gnus-cite-3 ((t (:inherit eighters-citation-3))))
    336   `(gnus-cite-4 ((t (:inherit eighters-citation-4))))
    337   `(gnus-cite-5 ((t (:inherit eighters-citation-5))))
    338   `(gnus-cite-6 ((t (:inherit eighters-citation-6))))
    339   `(gnus-cite-7 ((t (:inherit eighters-citation-1))))
    340   `(gnus-cite-8 ((t (:inherit eighters-citation-2))))
    341   `(gnus-cite-9 ((t (:inherit eighters-citation-3))))
    342   `(gnus-cite-10 ((t (:inherit eighters-citation-4))))
    343   `(gnus-cite-11 ((t (:inherit eighters-citation-5))))
    344   `(gnus-header ((t ())))
    345   `(gnus-header-content ((t (:foreground ,fg-dim :inherit gnus-header))))
    346   `(gnus-header-from ((t (:inherit (eighters-identity gnus-header)))))
    347   `(gnus-header-name ((t (:inherit (eighters-ui-intangible eighters-ui-input gnus-header)))))
    348   `(gnus-header-newsgroups ((t (:inherit (warning gnus-header)))))
    349   `(gnus-header-subject ((t (:inherit (eighters-title-1 gnus-header)))))
    350   `(gnus-server-closed ((t (:inherit shadow))))
    351   `(gnus-server-cloud ((t (:foreground ,fg-dimmer))))
    352   `(gnus-server-cloud-host ((t (:foreground ,fg-dim :underline t))))
    353   `(gnus-server-denied ((t (:inherit error))))
    354   `(gnus-server-offline ((t (:inherit error))))
    355   `(gnus-server-opened ((t (:inherit success))))
    356   `(gnus-signature ((t (:inherit font-lock-comment-face))))
    357   `(gnus-summary-cancelled ((t (:strike-through t :inherit shadow))))
    358   `(gnus-summary-normal-ancient ((t (:foreground ,fg-dim))))
    359   `(gnus-summary-normal-read ((t (:foreground ,fg-dim :slant italic))))
    360   `(gnus-summary-normal-ticked ((t (:foreground ,fg-yellow-dim))))
    361   `(gnus-summary-selected ((t (:inherit highlight))))
    362   `(header-line ((t (:background ,bg-hl :inherit eighters-ui-intangible))))
    363   `(help-key-binding ((t (:background ,bg-hl-dimmer :foreground ,fg-magenta :inherit fixed-pitch-serif))))
    364   `(hi-aquamarine ((t (:foreground ,fg-cyan :inverse-video t))))
    365   `(hi-blue ((t (:foreground ,fg-blue :inverse-video t))))
    366   `(hi-blue-b ((t (:foreground ,fg-blue :weight bold))))
    367   `(hi-green ((t (:foreground ,fg-green :inverse-video t))))
    368   `(hi-green-b ((t (:foreground ,fg-green :weight bold))))
    369   `(hi-pink ((t (:foreground ,fg-red-subtle :inverse-video t))))
    370   `(hi-red-b ((t (:foreground ,fg-red :weight bold))))
    371   `(hi-salmon ((t (:foreground ,fg-red-dim :inverse-video t))))
    372   `(hi-yellow ((t (:foreground ,fg-yellow :inverse-video t))))
    373   `(highlight ((t (:background ,bg-hl-dim))))
    374   `(icomplete-selected-match ((t (:inherit completions-highlight))))
    375   `(info-title-1 ((t (:inherit eighters-title-1))))
    376   `(info-title-2 ((t (:inherit eighters-title-2))))
    377   `(info-title-3 ((t (:inherit eighters-title-3))))
    378   `(info-title-4 ((t (:inherit eighters-title-4))))
    379   `(isearch ((t (:background ,bg-red-dim :foreground ,fg-magenta :inverse-video t))))
    380   `(isearch-fail ((t (:background ,bg-red :weight bold))))
    381   `(isearch-group-1 ((t (:background ,bg-red :foreground ,fg-red :inverse-video t))))
    382   `(isearch-group-2 ((t (:background ,bg-red :foreground ,fg-blue :inverse-video t))))
    383   `(lazy-highlight ((t (:background ,bg-cyan :foreground ,fg-cyan :inverse-video t))))
    384   `(link ((t (:foreground ,fg-blue :underline t))))
    385   `(link-visited ((t (:foreground ,fg-magenta-dim :underline t))))
    386   `(log-edit-header ((t (:inherit minibuffer-prompt))))
    387   `(log-edit-headers-separator ((t (:inherit separator-line))))
    388   `(log-edit-summary ((t (:inherit eighters-title-1))))
    389   `(Man-overstrike ((t (:foreground ,fg-cyan :inherit bold))))
    390   `(match ((t (:background ,bg-cyan-dim :underline ,fg-cyan-dim))))
    391   `(message-cited-text-1 ((t (:inherit eighters-citation-1))))
    392   `(message-cited-text-2 ((t (:inherit eighters-citation-2))))
    393   `(message-cited-text-3 ((t (:inherit eighters-citation-3))))
    394   `(message-cited-text-4 ((t (:inherit eighters-citation-4))))
    395   `(message-header-cc ((t (:inherit eighters-identity))))
    396   `(message-header-from ((t (:inherit eighters-identity))))
    397   `(message-header-name ((t (:inherit (eighters-ui-intangible eighters-ui-input)))))
    398   `(message-header-newsgroups ((t (:inherit warning))))
    399   `(message-header-subject ((t (:inherit eighters-title-1))))
    400   `(message-header-other ((t (:foreground ,fg-dim))))
    401   `(message-header-to ((t (:weight bold :inherit eighters-identity))))
    402   `(message-header-xheader ((t (:inherit font-lock-preprocessor-face))))
    403   `(message-mml ((t (:foreground ,fg-blue :inherit eighters-ui-input))))
    404   `(message-separator ((t (:background ,bg-hl-dim :inherit (eighters-ui-intangible shadow)))))
    405   `(message-signature-separator ((t (:inherit message-separator))))
    406   `(minibuffer-prompt ((t (:weight bold :inherit (eighters-ui-input eighters-ui-intangible)))))
    407   `(minibuffer-nonselected ((t (:background ,bg-red :foreground ,fg-yellow))))
    408   `(mm-uu-extract ((t (:background ,bg-hl-dimmer))))
    409   `(mode-line ((t (:background ,bg-hl :box (:color ,fg) :inherit eighters-ui-intangible))))
    410   `(mode-line-inactive ((t (:background ,bg-hl-dimmer :foreground ,fg-dimmer :box (:color ,bg-hl-dimmer) :inherit eighters-ui-intangible))))
    411   `(nobreak-space ((t (:background ,bg-magenta-dimmer :underline t :inherit escape-glyph))))
    412   `(outline-1 ((t (:inherit eighters-title-1))))
    413   `(outline-2 ((t (:inherit eighters-title-2))))
    414   `(outline-3 ((t (:inherit eighters-title-3))))
    415   `(outline-4 ((t (:inherit eighters-title-4))))
    416   `(outline-5 ((t (:inherit eighters-title-5))))
    417   `(outline-6 ((t (:inherit eighters-title-6))))
    418   `(outline-7 ((t (:inherit eighters-title-7))))
    419   `(outline-8 ((t (:inherit eighters-title-8))))
    420   `(org-block ((t (:background ,bg-hl-dimmer :inherit fixed-pitch-serif))))
    421   `(org-block-begin-line ((t (:background ,bg-hl-dim :inherit shadow :extend t))))
    422   `(org-block-end-line ((t (:background ,bg-hl-dim :inherit shadow :extend t))))
    423   `(org-checkbox ((t (:inherit eighters-checkbox))))
    424   `(org-code ((t (:background ,bg-hl-dim :inherit fixed-pitch-serif))))
    425   `(org-date ((t (:inherit eighters-date))))
    426   `(org-done ((t (:inherit success))))
    427   `(org-drawer ((t (:inherit shadow))))
    428   `(org-ellipsis ((t (:inherit shadow))))
    429   `(org-footnote ((t (:inherit font-lock-comment-face))))
    430   `(org-macro ((t (:inherit font-lock-preprocessor-face))))
    431   `(org-mode-line-clock ((t (:inherit font-lock-constant-face))))
    432   `(org-special-keyword ((t (:inherit shadow))))
    433   `(org-table ((t (:foreground ,fg-dim :inherit fixed-pitch-serif))))
    434   `(org-tag ((t (:inherit eighters-metadata))))
    435   `(org-todo ((t (:inherit error))))
    436   `(org-verbatim ((t (:background ,bg-hl-dim :foreground ,fg-magenta :inherit fixed-pitch-serif))))
    437   `(package-mark-delete-line ((t (:inherit diff-removed :extend t))))
    438   `(package-mark-install-line ((t (:inherit diff-added :extend t))))
    439   `(region ((t (:background ,bg-cyan))))
    440   `(rst-adornment ((t (:inherit shadow))))
    441   `(rst-block ((t (:inherit (bold rst-adornment)))))
    442   `(rst-definition ((t (:inherit font-lock-type-face))))
    443   `(rst-directive ((t (:foreground ,fg-dim))))
    444   `(rst-external ((t (:inherit font-lock-constant-face))))
    445   `(rst-level-1 ((t (:inherit eighters-title-1))))
    446   `(rst-level-2 ((t (:inherit eighters-title-2))))
    447   `(rst-level-3 ((t (:inherit eighters-title-3))))
    448   `(rst-level-4 ((t (:inherit eighters-title-4))))
    449   `(rst-level-5 ((t (:inherit eighters-title-5))))
    450   `(rst-level-6 ((t (:inherit eighters-title-6))))
    451   `(rst-literal ((t (:background ,bg-hl-dim :foreground ,fg-magenta :extend t :inherit fixed-pitch-serif))))
    452   `(rst-reference ((t (:inherit font-lock-string-face))))
    453   `(secondary-selection ((t (:background ,bg-blue))))
    454   `(separator-line ((t (:background ,bg-hl :height 0.1))))
    455   `(sh-heredoc ((t (:background ,bg-hl-dimmer :extend t :inherit fixed-pitch-serif))))
    456   `(sh-quoted-exec ((t (:background ,bg-hl-dim :inherit fixed-pitch-serif))))
    457   `(shadow ((t (:foreground ,fg-dimmer))))
    458   `(shortdoc-heading ((t (:inherit eighters-title-1))))
    459   `(show-paren-match ((t (:foreground ,fg-cyan :inverse-video t))))
    460   `(show-paren-mismatch ((t (:foreground ,fg-red :inverse-video t))))
    461   `(shr-h1 ((t (:inherit eighters-title-1))))
    462   `(shr-h2 ((t (:inherit eighters-title-2))))
    463   `(shr-h3 ((t (:inherit eighters-title-3))))
    464   `(shr-h4 ((t (:inherit eighters-title-4))))
    465   `(shr-h5 ((t (:inherit eighters-title-5))))
    466   `(shr-h6 ((t (:inherit eighters-title-6))))
    467   `(success ((t (:foreground ,fg-blue :weight bold))))
    468   `(tab-bar ((t (:background ,bg-hl-dimmer :inherit eighters-ui-intangible))))
    469   `(tab-bar-tab ((t (:weight bold :box (:style released-button) :inherit tab-bar))))
    470   `(tab-bar-tab-highlight ((t (:background ,bg-hl :inherit tab-bar-tab))))
    471   `(tab-bar-tab-inactive ((t (:foreground ,fg-dimmer :weight normal :box (:style pressed-button) :inherit tab-bar-tab))))
    472   `(tab-line ((t (:inherit tab-bar :height 0.9))))
    473   `(tab-line-tab-current ((t (:inherit (tab-line-tab tab-bar-tab)))))
    474   `(tab-line-highlight ((t (:inherit tab-bar-tab-highlight))))
    475   `(tab-line-tab-inactive ((t (:inherit (tab-line-tab tab-bar-tab-inactive)))))
    476   `(table-cell ((t (:inherit fixed-pitch-serif))))
    477   `(textsec-suspicious ((t (:background ,bg-red))))
    478   `(trailing-whitespace ((t (:background ,bg-red))))
    479   `(transient-argument ((t :weight bold :inherit font-lock-string-face)))
    480   `(transient-key ((t :inherit help-key-binding)))
    481   `(transient-key-exit ((t :inherit (bold transient-key))))
    482   `(transient-key-return ((t :inherit (bold transient-key))))
    483   `(transient-key-stay ((t :inherit transient-key)))
    484   `(transient-unreachable-key ((t :inherit (shadow help-key-binding))))
    485   `(vc-dir-directory ((t (:inherit dired-directory))))
    486   `(vc-dir-file ((t (:inherit default))))
    487   `(vc-dir-header ((t (:foreground ,fg-blue-subtle))))
    488   `(vc-dir-header-value ((t (:foreground ,fg-dim))))
    489   `(vc-dir-mark-indicator ((t (:inherit dired-mark))))
    490   `(vc-dir-status-edited ((t (:foreground ,fg-yellow))))
    491   `(vertical-border ((t (:foreground ,bg-hl))))
    492   `(warning ((t (:foreground ,fg-yellow :weight bold))))
    493   `(whitespace-hspace ((t (:weight bold :inherit whitespace-space))))
    494   `(whitespace-indentation ((t (:background ,bg-yellow-dim :foreground ,fg-red))))
    495   `(whitespace-newline ((t (:foreground ,fg-blue-dim))))
    496   `(whitespace-space ((t (:background ,bg-blue-dimmer :foreground ,fg-blue-dim))))
    497   `(whitespace-space-after-tab ((t (:inherit whitespace-indentation))))
    498   `(whitespace-tab ((t (:inherit whitespace-space))))
    499   `(whitespace-trailing ((t (:background ,bg-red-dim :foreground ,fg-yellow :weight bold))))
    500   `(widget-field ((t (:background ,bg-hl-dim))))
    501 ;;;; Diff faces.
    502   `(diff-header ((t (:background ,bg-hl-dimmer :foreground ,fg-dim))))
    503   `(diff-file-header ((t (:background ,bg-hl-dimmer :foreground ,fg :weight bold))))
    504   `(diff-hunk-header ((t (:background ,bg-hl-dim :foreground ,fg-dim))))
    505   `(diff-function ((t (:background ,bg-hl-dim :weight bold))))
    506   `(diff-context ((t :foreground ,fg-dim)))
    507   `(diff-removed ((t (:background ,bg-red-dimmer))))
    508   `(diff-refine-removed ((t (:background ,bg-red))))
    509   `(diff-indicator-removed ((t (:foreground ,fg-red :inherit diff-removed))))
    510   `(diff-added ((t :background ,bg-blue-dimmer)))
    511   `(diff-refine-added ((t (:background ,bg-blue))))
    512   `(diff-indicator-added ((t (:foreground ,fg-blue :inherit diff-added))))
    513   `(diff-changed ((t :background ,bg-yellow-dimmer)))
    514   `(diff-refine-changed ((t (:background ,bg-yellow))))
    515   `(diff-indicator-changed ((t (:foreground ,fg-yellow :inherit diff-changed))))
    516   `(ediff-even-diff-A ((t (:background ,bg-hl-dimmer))))
    517   `(ediff-even-diff-B ((t (:background ,bg-hl-dimmer))))
    518   `(ediff-even-diff-C ((t (:background ,bg-hl-dimmer))))
    519   `(ediff-even-diff-Ancestor ((t (:background ,bg-hl-dimmer))))
    520   `(ediff-odd-diff-A ((t (:background ,bg-hl-dimmer))))
    521   `(ediff-odd-diff-B ((t (:background ,bg-hl-dimmer))))
    522   `(ediff-odd-diff-C ((t (:background ,bg-hl-dimmer))))
    523   `(ediff-odd-diff-Ancestor ((t (:background ,bg-hl-dimmer))))
    524   `(ediff-current-diff-A ((t (:inherit diff-removed))))
    525   `(ediff-current-diff-B ((t (:inherit diff-added))))
    526   `(ediff-current-diff-C ((t (:inherit diff-changed))))
    527   `(ediff-current-diff-Ancestor ((t (:background ,bg-magenta-dimmer))))
    528   `(ediff-fine-diff-A ((t (:inherit diff-refine-removed))))
    529   `(ediff-fine-diff-B ((t (:inherit diff-refine-added))))
    530   `(ediff-fine-diff-C ((t (:inherit diff-refine-changed))))
    531   `(ediff-fine-diff-Ancestor ((t (:background ,bg-magenta))))
    532   `(smerge-markers ((t (:background ,bg-hl-dim :foreground ,fg-dim))))
    533   `(smerge-base ((t (:background ,bg-yellow-dim))))
    534   `(smerge-refine-shadow-cursor ((t (:box (:color ,fg-dimmer :line-width (-1 . -1))))))
    535   ;; Do *NOT* customize smerge-refined-changed, because that tells
    536   ;; smerge to use it for both removed and added sections.
    537   `(smerge-upper ((t (:background ,bg-red-dim))))
    538   `(smerge-refined-removed ((t (:inherit diff-refine-removed))))
    539   `(smerge-lower ((t (:background ,bg-blue-dim))))
    540   `(smerge-refined-added ((t (:inherit diff-refine-added))))
    541 ;;; Third-party faces.
    542   `(diff-hl-delete ((t (:foreground ,fg-red :background ,bg-red))))
    543   `(diff-hl-insert ((t (:foreground ,fg-blue :background ,bg-blue))))
    544   `(diff-hl-change ((t (:foreground ,fg-yellow :background ,bg-yellow))))
    545   `(forge-dimmed ((t (:inherit shadow))))
    546   `(forge-post-author ((t (:inherit eighters-identity))))
    547   `(forge-post-date ((t (:inherit eighters-date))))
    548   `(forge-pullreq-merged ((t (:inherit forge-dimmed))))
    549   `(forge-pullreq-open ((t ())))
    550   `(forge-pullreq-rejected ((t (:inherit forge-dimmed :strike-through t))))
    551   `(forge-topic-done ((t ())))
    552   `(forge-topic-slug-completed ((t (:foreground ,fg-blue-dim))))
    553   `(forge-topic-slug-open ((t (:foreground ,fg-red-subtle))))
    554   `(forge-topic-slug-saved ((t (:foreground ,fg-yellow))))
    555   `(forge-topic-slug-unplanned ((t (:inherit forge-dimmed :strike-through t))))
    556   `(forge-topic-slug-unread ((t ())))
    557   `(markdown-blockquote-face ((t (:inherit eighters-citation-1))))
    558   `(markdown-code-face ((t (:inherit fixed-pitch-serif))))
    559   `(markdown-gfm-checkbox-face ((t :inherit eighters-checkbox)))
    560   `(markdown-header-face-1 ((t (:inherit eighters-title-1))))
    561   `(markdown-header-face-2 ((t (:inherit eighters-title-2))))
    562   `(markdown-header-face-3 ((t (:inherit eighters-title-3))))
    563   `(markdown-header-face-4 ((t (:inherit eighters-title-4))))
    564   `(markdown-header-face-5 ((t (:inherit eighters-title-5))))
    565   `(markdown-header-face-6 ((t (:inherit eighters-title-6))))
    566   `(markdown-inline-code-face ((t (:background ,bg-hl-dim :foreground ,fg-magenta :inherit markdown-code-face))))
    567   `(markdown-line-break-face ((t (:background ,bg-hl-dimmer :underline t :inherit markdown-markup-face))))
    568   `(markdown-pre-face ((t (:background ,bg-hl-dimmer :inherit markdown-code-face :extend t))))
    569   `(markdown-url-face ((t (:inherit (markdown-markup-face markdown-plain-url-face)))))
    570   `(which-key-group-description-face ((t (:foreground ,fg-green-dim))))
    571   `(which-key-key-face ((t :weight bold :inherit help-key-binding)))
    572 ;;;; Magit.
    573   `(magit-blame-highlight ((t (:foreground ,fg-blue-dim :background ,bg-blue-dimmer :inherit eighters-ui-intangible))))
    574   `(magit-branch-current ((t (:inverse-video t :inherit magit-branch-local))))
    575   `(magit-branch-local ((t (:foreground ,fg-blue))))
    576   `(magit-branch-remote ((t (:foreground ,fg-green-dim))))
    577   `(magit-branch-remote-head ((t (:inverse-video t :inherit magit-branch-remote))))
    578   `(magit-keyword ((t (:inherit eighters-metadata))))
    579   `(magit-process-ng ((t (:inherit error))))
    580   `(magit-process-ok ((t (:inherit success))))
    581   `(magit-log-date ((t (:inherit eighters-date))))
    582   `(magit-hash ((t (:inherit shadow))))
    583   `(magit-log-author ((t (:inherit eighters-identity))))
    584   `(magit-log-graph ((t (:inherit eighters-markup))))
    585   `(magit-mode-line-process ((t (:inherit compilation-mode-line-run))))
    586   ;; FIXME: Teach magit-section overlays to de-prioritize their
    587   ;; :background so that tags can have one.
    588   `(magit-tag ((t (:foreground ,fg-yellow))))
    589 ;;;;; Section backgrounds.
    590   `(magit-section-highlight ((t :background ,bg-hl-dimmer)))
    591   `(magit-diff-revision-summary ((t (:inherit (magit-diff-hunk-heading eighters-title-1)))))
    592   `(magit-section-heading ((t (:inherit eighters-title-2))))
    593   `(magit-diff-file-heading ((t (:inherit eighters-title-3))))
    594   `(magit-diff-context ((t (:foreground ,fg-dim))))
    595   `(magit-diff-context-highlight ((t (:background ,bg-hl-dimmer :inherit magit-diff-context))))
    596   `(magit-diff-hunk-heading ((t (:background ,bg-hl-dim))))
    597   `(magit-diff-hunk-heading-highlight ((t (:background ,bg-hl))))
    598 ;;;;; Selections.
    599   `(magit-section-heading-selection ((t (:foreground ,fg-cyan :background ,bg-cyan-dim))))
    600   `(magit-diff-file-heading-selection ((t (:foreground ,fg-cyan :background ,bg-cyan-dim))))
    601   `(magit-diff-hunk-heading-selection ((t (:foreground ,fg-cyan :background ,bg-cyan-dim))))
    602   `(magit-diff-lines-heading ((t (:foreground ,fg-cyan :inverse-video t))))
    603 ;;;;; Diffs.
    604   `(magit-diff-base ((t (:foreground ,fg-dim :inherit diff-changed))))
    605   `(magit-diff-base-highlight ((t (:background ,bg-yellow-dim))))
    606   `(magit-diff-removed ((t (:foreground ,fg-dim :inherit diff-removed))))
    607   `(magit-diff-removed-highlight ((t (:background ,bg-red-dim))))
    608   `(magit-diffstat-removed ((t (:foreground ,fg-red))))
    609   `(magit-diff-added ((t (:foreground ,fg-dim :inherit diff-added))))
    610   `(magit-diff-added-highlight ((t (:background ,bg-blue-dim))))
    611   `(magit-diffstat-added ((t (:foreground ,fg-blue))))
    612 ;;;;; Git commit.
    613   `(git-commit-comment-action ((t (:inherit eighters-title-3))))
    614   `(git-commit-comment-branch-local ((t (:inherit magit-branch-local))))
    615   `(git-commit-comment-branch-remote ((t (:inherit magit-branch-remote))))
    616   `(git-commit-comment-file ((t (:foreground ,fg-dim))))
    617   `(git-commit-comment-heading ((t (:inherit eighters-title-2))))
    618   `(git-commit-keyword ((t (:inherit eighters-metadata))))
    619   `(git-commit-known-pseudo-header ((t (:inherit message-header-name))))
    620   `(git-commit-pseudo-header ((t (:inherit eighters-identity))))
    621   `(git-commit-summary ((t (:inherit eighters-title-1)))))
    622  (custom-theme-set-variables
    623   'eighters
    624   '(compilation-enter-directory-face 'dired-directory)
    625   `(compilation-leave-directory-face '(:foreground ,fg-blue-dim))))
    626 
    627 (provide-theme 'eighters)