aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-15 11:21:41 -0500
committerCraig Jennings <c@cjennings.net>2026-06-15 11:21:41 -0500
commit4f0a8d80fe208e67f6debac430024053c6958729 (patch)
tree2efe74803c693498f863c54a1fb6f5b4d59dee1b
parent7bcf6dad2b1078994346b61531bce281a75519f9 (diff)
downloaddotemacs-4f0a8d80fe208e67f6debac430024053c6958729.tar.gz
dotemacs-4f0a8d80fe208e67f6debac430024053c6958729.zip
refactor(themes): retire dupre, fall back to modus-vivendi
WIP, the theme-studio export, is the active theme. dupre was only the fallback and a structural reference. Move the fallback to the built-in modus-vivendi, guaranteed present everywhere this config loads. Delete the three dupre files plus its test and palette assets, and fix the stale comments that pointed at dupre-faces.el for the auto-dim and org-keyword faces (those moved to org-faces-config.el). Repoint the dupre-clear-theme spec's palette reference to git history.
-rw-r--r--docs/specs/dupre-clear-theme-spec.org2
-rw-r--r--modules/auto-dim-config.el4
-rw-r--r--modules/org-config.el6
-rw-r--r--modules/ui-theme.el9
-rw-r--r--scripts/theme-studio/build-theme.el8
-rw-r--r--tests/test-build-theme.el4
-rw-r--r--tests/test-dupre-theme.el261
-rw-r--r--tests/test-ui-theme-commands.el12
-rw-r--r--tests/test-ui-theme-persistence.el4
-rw-r--r--themes/dupre-color-palette.html81
-rw-r--r--themes/dupre-faces.el918
-rw-r--r--themes/dupre-palette.el131
-rw-r--r--themes/dupre-palette.pngbin46570 -> 0 bytes
-rw-r--r--themes/dupre-theme.el63
14 files changed, 23 insertions, 1480 deletions
diff --git a/docs/specs/dupre-clear-theme-spec.org b/docs/specs/dupre-clear-theme-spec.org
index 9594eb3d9..578eb240e 100644
--- a/docs/specs/dupre-clear-theme-spec.org
+++ b/docs/specs/dupre-clear-theme-spec.org
@@ -82,7 +82,7 @@ The hardest slot is *blue keywords*: a deep dupre blue (#67809c) is intrinsicall
- The session's exploration tooling was a set of throwaway =/tmp/gen-*.py= scripts that render palette + 4-language code samples to HTML and open them in a browser; they include WCAG-contrast and CIEDE2000 (perceptual distance) helpers. Those /tmp files won't survive a reboot — re-derive the helpers (WCAG: relative luminance with the sRGB linearization, contrast = (L1+0.05)/(L2+0.05); CIEDE2000 for separation). The math is also embedded in =tests/test-dupre-theme.el= (the WCAG half).
- modus reference palette: =/usr/share/emacs/30.2/etc/themes/modus-vivendi-theme.el= (and the operandi/tinted variants alongside it).
-- dupre lineage: dupre ← distinguished (emacs, Kim Silkebaekken) ← vim-distinguished. The dupre palette lives in =themes/dupre-palette.el= + =themes/dupre-faces.el=; swatch PNG at =themes/dupre-palette.png=.
+- dupre lineage: dupre ← distinguished (emacs, Kim Silkebaekken) ← vim-distinguished. The dupre theme has since been retired from the tree (recoverable from git history); WIP, the active theme-studio theme, descends from its palette.
- The key perceptual lessons from the session (also in the anchor): thin colored text desaturates (muted hues grey out as glyphs — bold helps); a near-black ground forces depth-vs-AAA as a hard tradeoff; Hyprland inactive-window dimming silently shifts colors (disable with =hyprctl keyword decoration:dim_inactive false= during color work).
* Open questions
diff --git a/modules/auto-dim-config.el b/modules/auto-dim-config.el
index 7101c241a..a143f8fe0 100644
--- a/modules/auto-dim-config.el
+++ b/modules/auto-dim-config.el
@@ -16,8 +16,8 @@
;; Dims windows that do not have focus so the selected window stands out,
;; using a local fork of auto-dim-other-buffers (the fork adds a focus-change
;; debounce). The dimmed faces (auto-dim-other-buffers and
-;; auto-dim-other-buffers-hide) live in the active theme
-;; (themes/dupre-faces.el) so they track theme switches.
+;; auto-dim-other-buffers-hide) live in the active theme (the generated
+;; theme-studio theme) so they track theme switches.
;;
;; Terminal buffers (ghostel) do not participate in window dimming: ghostel
;; bakes its color palette into the native module per-terminal, not per-window,
diff --git a/modules/org-config.el b/modules/org-config.el
index 783109349..e7538f244 100644
--- a/modules/org-config.el
+++ b/modules/org-config.el
@@ -209,9 +209,9 @@ whole row line."
"DELEGATED(x)" "|"
"FAILED(f!)" "DONE(d!)" "CANCELLED(c!)")))
- ;; Keyword and priority colors are left to the active theme's standard org
- ;; faces (org-todo / org-done / org-priority) so they follow whatever theme is
- ;; loaded rather than hard-wiring the dupre-org-* faces.
+ ;; Keyword and priority faces are defined and wired in org-faces-config.el
+ ;; (loaded just after this module): each keyword and priority maps to its own
+ ;; org-faces-* face, which the active theme recolors.
(setq org-highest-priority ?A)
(setq org-lowest-priority ?D)
(setq org-default-priority ?D)
diff --git a/modules/ui-theme.el b/modules/ui-theme.el
index a7873b9a5..8be3b4fdf 100644
--- a/modules/ui-theme.el
+++ b/modules/ui-theme.el
@@ -64,14 +64,13 @@ directory that is sync'd across machines with this configuration."
:type 'file
:group 'cj/ui-theme)
-(defcustom fallback-theme-name "dupre"
+(defcustom fallback-theme-name "modus-vivendi"
"The name of the theme to fallback on.
This is used when there's no file, or the theme name doesn't match
any of the installed themes. It must be available wherever this config is
-loaded, since the fallback has no further fallback. dupre is bundled in
-themes/ and carries the dimming colors chosen for this config, so it is the
-default; a built-in theme like modus-vivendi works too but has no chosen
-dimming colors. If theme name is `nil', there will be no theme."
+loaded, since the fallback has no further fallback. modus-vivendi ships with
+Emacs, so it is present on every machine that loads this config, which makes
+it the right default. If theme name is `nil', there will be no theme."
:type 'string
:group 'cj/ui-theme)
diff --git a/scripts/theme-studio/build-theme.el b/scripts/theme-studio/build-theme.el
index f7cd127d1..ebfc2eb5c 100644
--- a/scripts/theme-studio/build-theme.el
+++ b/scripts/theme-studio/build-theme.el
@@ -27,10 +27,10 @@
;; emacs --batch -l build-theme.el \
;; --eval '(build-theme/convert-file "dupre-revised.json" "themes")'
;;
-;; The output is a flat generated deftheme, not the hand-authored
-;; palette/faces/theme trio that the original dupre theme ships -- a theme.json
-;; carries resolved per-face hex, not dupre's semantic-mapping layer, so a flat
-;; deftheme is the faithful output and never clobbers the curated dupre files.
+;; The output is a flat generated deftheme: a theme.json carries resolved
+;; per-face hex, so the converter emits one custom-theme-set-faces with a
+;; literal value per face. Giving generated themes a palette + assignments
+;; structure is tracked in its own spec.
;;; Code:
diff --git a/tests/test-build-theme.el b/tests/test-build-theme.el
index 9221946e6..6c2fa3cf5 100644
--- a/tests/test-build-theme.el
+++ b/tests/test-build-theme.el
@@ -1,4 +1,4 @@
-;;; test-build-theme.el --- Tests for the theme.json -> dupre-*.el converter -*- lexical-binding: t -*-
+;;; test-build-theme.el --- Tests for the theme.json -> deftheme converter -*- lexical-binding: t -*-
;;; Commentary:
@@ -74,7 +74,7 @@ drift the way Craig's downloaded exports under scripts/theme-studio/ can.")
(unwind-protect (progn ,@body)
(delete-directory ,var t))))
-;; --- WCAG contrast helpers (mirror of the dupre-theme test helpers) ---
+;; --- WCAG contrast helpers ---
(defun test-build-theme--channel-luminance (c)
"Linearize an 8-bit channel value C (0-255) per the WCAG formula."
diff --git a/tests/test-dupre-theme.el b/tests/test-dupre-theme.el
deleted file mode 100644
index 4d0e786cb..000000000
--- a/tests/test-dupre-theme.el
+++ /dev/null
@@ -1,261 +0,0 @@
-;;; test-dupre-theme.el --- Tests for dupre-theme -*- lexical-binding: t -*-
-
-;;; Commentary:
-
-;; ERT tests for the dupre-theme.
-
-;;; Code:
-
-(require 'ert)
-
-;; Add themes directory to load-path and custom-theme-load-path
-(let ((themes-dir (expand-file-name "../themes" (file-name-directory (or load-file-name buffer-file-name)))))
- (add-to-list 'load-path themes-dir)
- (add-to-list 'custom-theme-load-path themes-dir))
-
-(require 'dupre-palette)
-
-;;; Palette tests
-
-(ert-deftest dupre-palette-exists ()
- "Palette constant should be defined."
- (should (boundp 'dupre-palette))
- (should (listp dupre-palette)))
-
-(ert-deftest dupre-palette-has-base-colors ()
- "Palette should contain essential base colors."
- (should (assq 'bg dupre-palette))
- (should (assq 'fg dupre-palette))
- (should (assq 'bg+1 dupre-palette))
- (should (assq 'bg+2 dupre-palette)))
-
-(ert-deftest dupre-palette-has-accent-colors ()
- "Palette should contain accent colors."
- (should (assq 'yellow dupre-palette))
- (should (assq 'blue dupre-palette))
- (should (assq 'green dupre-palette))
- (should (assq 'red dupre-palette)))
-
-(ert-deftest dupre-palette-colors-are-hex ()
- "All palette colors should be valid hex strings."
- (dolist (entry dupre-palette)
- (let ((color (cadr entry)))
- (should (stringp color))
- (should (string-match-p "^#[0-9a-fA-F]\\{6\\}$" color)))))
-
-(ert-deftest dupre-get-color-base ()
- "dupre-get-color should retrieve base colors."
- (should (string= (dupre-get-color 'bg) "#151311"))
- (should (string= (dupre-get-color 'fg) "#f0fef0"))
- (should (string= (dupre-get-color 'yellow) "#d7af5f")))
-
-(ert-deftest dupre-get-color-semantic ()
- "dupre-get-color should resolve semantic mappings."
- (should (string= (dupre-get-color 'accent) (dupre-get-color 'yellow)))
- (should (string= (dupre-get-color 'err) (dupre-get-color 'intense-red)))
- (should (string= (dupre-get-color 'success) (dupre-get-color 'green))))
-
-(ert-deftest dupre-get-color-unknown-errors ()
- "dupre-get-color should error on unknown colors."
- (should-error (dupre-get-color 'nonexistent-color)))
-
-(ert-deftest dupre-with-colors-binds-values ()
- "dupre-with-colors should bind palette colors as variables."
- (dupre-with-colors
- (should (string= bg "#151311"))
- (should (string= fg "#f0fef0"))
- (should (string= yellow "#d7af5f"))
- (should (string= blue "#67809c"))))
-
-(ert-deftest dupre-with-colors-binds-semantic ()
- "dupre-with-colors should bind semantic colors resolved to values."
- (dupre-with-colors
- (should (string= accent "#d7af5f"))
- (should (string= err "#ff2a00"))
- (should (string= success "#a4ac64"))))
-
-;;; Theme loading tests
-
-(ert-deftest dupre-theme-loads ()
- "Theme should load without errors."
- (load-theme 'dupre t)
- (should (memq 'dupre custom-enabled-themes)))
-
-(ert-deftest dupre-theme-default-face ()
- "dupre-theme should set the default face correctly."
- (load-theme 'dupre t)
- (let ((bg (face-attribute 'default :background))
- (fg (face-attribute 'default :foreground)))
- (should (string= bg "#151311"))
- (should (string= fg "#f0fef0"))))
-
-(ert-deftest dupre-theme-comment-face-italic ()
- "Comments should be rendered in italic slant."
- (load-theme 'dupre t)
- (should (eq (face-attribute 'font-lock-comment-face :slant) 'italic)))
-
-(ert-deftest dupre-theme-keyword-face ()
- "Keywords should use blue color."
- (load-theme 'dupre t)
- (should (string= (face-attribute 'font-lock-keyword-face :foreground) "#67809c")))
-
-(ert-deftest dupre-theme-string-face ()
- "Strings should use green color."
- (load-theme 'dupre t)
- (should (string= (face-attribute 'font-lock-string-face :foreground) "#a4ac64")))
-
-(ert-deftest dupre-theme-function-face ()
- "Functions should use terracotta color."
- (load-theme 'dupre t)
- (should (string= (face-attribute 'font-lock-function-name-face :foreground) "#a7502d")))
-
-;;; Org-mode face tests (require org to be loaded)
-;; Note: org-level-N faces use :inherit dupre-heading-N
-;; We verify inheritance is set up correctly by checking the inherit attribute
-
-(ert-deftest dupre-theme-org-level-1 ()
- "Org level 1 should inherit from dupre-heading-1."
- (require 'org)
- (load-theme 'dupre t)
- ;; Verify the inheritance relationship is set
- (should (eq (face-attribute 'org-level-1 :inherit) 'dupre-heading-1)))
-
-(ert-deftest dupre-theme-org-level-2 ()
- "Org level 2 should inherit from dupre-heading-2."
- (require 'org)
- (load-theme 'dupre t)
- ;; Verify the inheritance relationship is set
- (should (eq (face-attribute 'org-level-2 :inherit) 'dupre-heading-2)))
-
-(ert-deftest dupre-theme-org-todo ()
- "Org TODO should use intense-red."
- (require 'org)
- (load-theme 'dupre t)
- (should (string= (face-attribute 'org-todo :foreground) "#ff2a00")))
-
-(ert-deftest dupre-theme-org-done ()
- "Org DONE should use green."
- (require 'org)
- (load-theme 'dupre t)
- (should (string= (face-attribute 'org-done :foreground) "#a4ac64")))
-
-;;; Diff face tests (require diff-mode to be loaded)
-
-(ert-deftest dupre-theme-diff-added ()
- "Diff added should use green foreground."
- (require 'diff-mode)
- (load-theme 'dupre t)
- (should (string= (face-attribute 'diff-added :foreground) "#a4ac64")))
-
-(ert-deftest dupre-theme-diff-removed ()
- "Diff removed should use red foreground."
- (require 'diff-mode)
- (load-theme 'dupre t)
- (should (string= (face-attribute 'diff-removed :foreground) "#d47c59")))
-
-;;; UI face tests
-
-(ert-deftest dupre-theme-mode-line ()
- "Mode line should have correct background."
- (load-theme 'dupre t)
- (should (string= (face-attribute 'mode-line :background) "#474544")))
-
-(ert-deftest dupre-theme-region ()
- "Region should use bg+2 as background."
- (load-theme 'dupre t)
- (should (string= (face-attribute 'region :background) "#474544")))
-
-;;; Vertico face tests (skip if vertico not available)
-
-(ert-deftest dupre-theme-vertico-current ()
- "Vertico current should use bg+2 background."
- (skip-unless (require 'vertico nil t))
- (load-theme 'dupre t)
- (should (string= (face-attribute 'vertico-current :background) "#474544")))
-
-;;; Rainbow-delimiters tests (skip if package not available)
-
-(ert-deftest dupre-theme-rainbow-depth-1 ()
- "Rainbow depth 1 should use blue."
- (skip-unless (require 'rainbow-delimiters nil t))
- (load-theme 'dupre t)
- (should (string= (face-attribute 'rainbow-delimiters-depth-1-face :foreground) "#67809c")))
-
-(ert-deftest dupre-theme-rainbow-depth-2 ()
- "Rainbow depth 2 should use gray+2."
- (skip-unless (require 'rainbow-delimiters nil t))
- (load-theme 'dupre t)
- (should (string= (face-attribute 'rainbow-delimiters-depth-2-face :foreground) "#d0cbc0")))
-
-;;; Error/warning face tests
-
-(ert-deftest dupre-theme-error-face ()
- "Error face should use intense-red."
- (load-theme 'dupre t)
- (should (string= (face-attribute 'error :foreground) "#ff2a00")))
-
-(ert-deftest dupre-theme-warning-face ()
- "Warning face should use yellow+1."
- (load-theme 'dupre t)
- (should (string= (face-attribute 'warning :foreground) "#ffd75f")))
-
-(ert-deftest dupre-theme-success-face ()
- "Success face should use green."
- (load-theme 'dupre t)
- (should (string= (face-attribute 'success :foreground) "#a4ac64")))
-
-;;; Face registration
-
-(ert-deftest dupre-semantic-faces-are-registered ()
- "Dupre's own faces must be real faces, not just theme specs.
-An unregistered face renders only through `:inherit'; applied directly as
-a text property (e.g. via `org-todo-keyword-faces') it silently fails.
-The defface registration in dupre-faces.el is what makes direct use work."
- (load-theme 'dupre t)
- (dolist (face '(dupre-accent dupre-heading-1
- dupre-org-todo dupre-org-todo-dim
- dupre-org-failed dupre-org-priority-a
- dupre-org-priority-a-dim))
- (should (facep face)))
- ;; and the theme colours them from the palette
- (should (string= (face-attribute 'dupre-org-todo :foreground nil 'default)
- "#a4ac64"))
- (should (string= (face-attribute 'dupre-org-todo-dim :foreground nil 'default)
- "#869038")))
-
-;;; Diff face legibility (WCAG contrast)
-
-(defun dupre-test--channel-luminance (c)
- "Linearize an 8-bit channel value C (0-255) per the WCAG formula."
- (let ((x (/ c 255.0)))
- (if (<= x 0.03928) (/ x 12.92) (expt (/ (+ x 0.055) 1.055) 2.4))))
-
-(defun dupre-test--relative-luminance (hex)
- "WCAG relative luminance of HEX color \"#rrggbb\"."
- (+ (* 0.2126 (dupre-test--channel-luminance (string-to-number (substring hex 1 3) 16)))
- (* 0.7152 (dupre-test--channel-luminance (string-to-number (substring hex 3 5) 16)))
- (* 0.0722 (dupre-test--channel-luminance (string-to-number (substring hex 5 7) 16)))))
-
-(defun dupre-test--contrast (fg bg)
- "WCAG contrast ratio between hex colors FG and BG."
- (let ((l1 (dupre-test--relative-luminance fg))
- (l2 (dupre-test--relative-luminance bg)))
- (/ (+ (max l1 l2) 0.05) (+ (min l1 l2) 0.05))))
-
-(ert-deftest dupre-diff-changed-faces-meet-wcag-aa ()
- "Error/Regression: diff-changed and diff-refine-changed must stay legible as
-standalone backgrounds (WCAG AA, >= 4.5:1 for normal text). Guards the bug
-where diff-refine-changed rendered the default fg (#f0fef0) on the bright-gold
-yellow-1 (#ffd700) at 1.35:1 -- unreadable wherever the face is used as a plain
-background, not just inside diff-mode's own foreground overlay."
- (require 'diff-mode)
- (load-theme 'dupre t)
- (dolist (face '(diff-changed diff-refine-changed))
- (let ((fg (face-attribute face :foreground nil t))
- (bg (face-attribute face :background nil t)))
- (should (string-match-p "^#[0-9a-fA-F]\\{6\\}$" fg))
- (should (string-match-p "^#[0-9a-fA-F]\\{6\\}$" bg))
- (should (>= (dupre-test--contrast fg bg) 4.5)))))
-
-(provide 'test-dupre-theme)
-;;; test-dupre-theme.el ends here
diff --git a/tests/test-ui-theme-commands.el b/tests/test-ui-theme-commands.el
index 55facc17e..4e3ce7f28 100644
--- a/tests/test-ui-theme-commands.el
+++ b/tests/test-ui-theme-commands.el
@@ -36,13 +36,11 @@
;;; fallback-theme-name default
-(ert-deftest test-ui-theme-default-fallback-is-bundled-dupre ()
- "Normal: the default fallback theme is dupre, the config's bundled theme.
-modus-vivendi ships with Emacs but has no chosen dimming colors; dupre is
-bundled in themes/, so it is available on every machine that loads this
-config and is the right default fallback. Its loadability is covered by
-test-dupre-theme.el."
- (should (equal "dupre" (default-value 'fallback-theme-name))))
+(ert-deftest test-ui-theme-default-fallback-is-builtin-modus ()
+ "Normal: the default fallback theme is modus-vivendi.
+The fallback has no further fallback, so it must be present everywhere this
+config loads. modus-vivendi ships with Emacs, so it always resolves."
+ (should (equal "modus-vivendi" (default-value 'fallback-theme-name))))
;;; cj/save-theme-to-file
diff --git a/tests/test-ui-theme-persistence.el b/tests/test-ui-theme-persistence.el
index 31e0e6cc8..02bb105a6 100644
--- a/tests/test-ui-theme-persistence.el
+++ b/tests/test-ui-theme-persistence.el
@@ -46,12 +46,12 @@
(lambda (&rest _args)
(setq write-file-called t)
(error "write-file should not be used"))))
- (should (cj/theme-write-file-contents "dupre" file)))
+ (should (cj/theme-write-file-contents "modus-vivendi" file)))
(delete-file file))
(should (equal (list (car write-region-args)
(cadr write-region-args)
(nth 2 write-region-args))
- (list "dupre" nil file)))
+ (list "modus-vivendi" nil file)))
(should-not write-file-called)))
(ert-deftest test-ui-theme-load-valid-persisted-theme ()
diff --git a/themes/dupre-color-palette.html b/themes/dupre-color-palette.html
deleted file mode 100644
index f3d6ae31a..000000000
--- a/themes/dupre-color-palette.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <title>Dupre Theme Color Palette</title>
- <style>
- body { font-family: 'Courier New', monospace; background: #151311; color: #f0fef0;
- padding: 28px; margin: 0; width: max-content; }
- h1 { font-size: 20px; font-weight: bold; margin: 0 0 24px; }
- .family { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 14px; }
- .fam { width: 96px; text-align: right; padding-top: 46px; color: #b4b1a2;
- font-size: 13px; flex-shrink: 0; }
- .swatch { width: 120px; flex-shrink: 0; }
- .box { width: 112px; height: 112px; border: 1px solid #474544; border-radius: 3px; }
- .name { font-weight: bold; color: #f0fef0; font-size: 12px; margin-top: 5px; }
- .hex { color: #969385; font-size: 11px; }
- </style>
-</head>
-<body>
- <h1>Dupre Theme Color Palette</h1>
- <div class="family">
- <div class="fam">bg</div>
- <div class="swatch"><div class="box" style="background:#151311"></div><div class="name">bg</div><div class="hex">#151311</div></div>
- <div class="swatch"><div class="box" style="background:#151311"></div><div class="name">bg+0</div><div class="hex">#151311</div></div>
- <div class="swatch"><div class="box" style="background:#252321"></div><div class="name">bg+1</div><div class="hex">#252321</div></div>
- <div class="swatch"><div class="box" style="background:#474544"></div><div class="name">bg+2</div><div class="hex">#474544</div></div>
- </div>
- <div class="family">
- <div class="fam">gray</div>
- <div class="swatch"><div class="box" style="background:#58574e"></div><div class="name">gray-2</div><div class="hex">#58574e</div></div>
- <div class="swatch"><div class="box" style="background:#6c6a60"></div><div class="name">gray-1</div><div class="hex">#6c6a60</div></div>
- <div class="swatch"><div class="box" style="background:#969385"></div><div class="name">gray</div><div class="hex">#969385</div></div>
- <div class="swatch"><div class="box" style="background:#b4b1a2"></div><div class="name">gray+1</div><div class="hex">#b4b1a2</div></div>
- <div class="swatch"><div class="box" style="background:#d0cbc0"></div><div class="name">gray+2</div><div class="hex">#d0cbc0</div></div>
- </div>
- <div class="family">
- <div class="fam">steel</div>
- <div class="swatch"><div class="box" style="background:#8a9496"></div><div class="name">steel</div><div class="hex">#8a9496</div></div>
- <div class="swatch"><div class="box" style="background:#acb0b3"></div><div class="name">steel+1</div><div class="hex">#acb0b3</div></div>
- <div class="swatch"><div class="box" style="background:#c0c7ca"></div><div class="name">steel+2</div><div class="hex">#c0c7ca</div></div>
- </div>
- <div class="family">
- <div class="fam">blue</div>
- <div class="swatch"><div class="box" style="background:#67809c"></div><div class="name">blue</div><div class="hex">#67809c</div></div>
- <div class="swatch"><div class="box" style="background:#b2c3cc"></div><div class="name">blue+1</div><div class="hex">#b2c3cc</div></div>
- <div class="swatch"><div class="box" style="background:#d9e2ff"></div><div class="name">blue+2</div><div class="hex">#d9e2ff</div></div>
- </div>
- <div class="family">
- <div class="fam">green</div>
- <div class="swatch"><div class="box" style="background:#646d14"></div><div class="name">green-2</div><div class="hex">#646d14</div></div>
- <div class="swatch"><div class="box" style="background:#869038"></div><div class="name">green-1</div><div class="hex">#869038</div></div>
- <div class="swatch"><div class="box" style="background:#a4ac64"></div><div class="name">green</div><div class="hex">#a4ac64</div></div>
- <div class="swatch"><div class="box" style="background:#ccc768"></div><div class="name">green+1</div><div class="hex">#ccc768</div></div>
- </div>
- <div class="family">
- <div class="fam">red</div>
- <div class="swatch"><div class="box" style="background:#3f1c0f"></div><div class="name">red-3</div><div class="hex">#3f1c0f</div></div>
- <div class="swatch"><div class="box" style="background:#7c2a09"></div><div class="name">red-2</div><div class="hex">#7c2a09</div></div>
- <div class="swatch"><div class="box" style="background:#a7502d"></div><div class="name">red-1</div><div class="hex">#a7502d</div></div>
- <div class="swatch"><div class="box" style="background:#d47c59"></div><div class="name">red</div><div class="hex">#d47c59</div></div>
- <div class="swatch"><div class="box" style="background:#edb08f"></div><div class="name">red+1</div><div class="hex">#edb08f</div></div>
- <div class="swatch"><div class="box" style="background:#edbca2"></div><div class="name">red+2</div><div class="hex">#edbca2</div></div>
- </div>
- <div class="family">
- <div class="fam">yellow</div>
- <div class="swatch"><div class="box" style="background:#875f00"></div><div class="name">yellow-2</div><div class="hex">#875f00</div></div>
- <div class="swatch"><div class="box" style="background:#ffd700"></div><div class="name">yellow-1</div><div class="hex">#ffd700</div></div>
- <div class="swatch"><div class="box" style="background:#d7af5f"></div><div class="name">yellow</div><div class="hex">#d7af5f</div></div>
- <div class="swatch"><div class="box" style="background:#ffd75f"></div><div class="name">yellow+1</div><div class="hex">#ffd75f</div></div>
- <div class="swatch"><div class="box" style="background:#f9ee98"></div><div class="name">yellow+2</div><div class="hex">#f9ee98</div></div>
- </div>
- <div class="family">
- <div class="fam">intense-red</div>
- <div class="swatch"><div class="box" style="background:#ff2a00"></div><div class="name">intense-red</div><div class="hex">#ff2a00</div></div>
- </div>
- <div class="family">
- <div class="fam">fg</div>
- <div class="swatch"><div class="box" style="background:#f0fef0"></div><div class="name">fg</div><div class="hex">#f0fef0</div></div>
- </div>
-</body>
-</html>
diff --git a/themes/dupre-faces.el b/themes/dupre-faces.el
deleted file mode 100644
index 17daa41c1..000000000
--- a/themes/dupre-faces.el
+++ /dev/null
@@ -1,918 +0,0 @@
-;;; dupre-faces.el --- Face definitions for dupre-theme -*- lexical-binding: t -*-
-
-;; Author: Craig Jennings <c@cjennings.net>
-
-;;; Commentary:
-
-;; Face definitions for dupre-theme, following the 60-30-10 color rule:
-;; - 60% Neutrals (bg, grays, fg) - the canvas
-;; - 30% Signature blue (#67809c) - theme character
-;; - 10% Accents (gold, green, terracotta) - semantic meaning only
-
-;;; Code:
-
-(require 'dupre-palette)
-
-(defgroup dupre-faces nil
- "Semantic faces owned by the dupre theme."
- :group 'faces)
-
-;; Register dupre's own faces so they are real faces (facep t): customizable,
-;; usable via `:inherit', and -- importantly -- applicable directly as a text
-;; property (which `org-todo-keyword-faces' and `org-priority-faces' do).
-;; `custom-theme-set-faces' below sets their colours; this only declares them.
-;; Without this, the faces existed only as theme specs and rendered only
-;; through `:inherit', silently failing wherever a face was applied directly.
-(dolist (face '(dupre-accent dupre-err dupre-warning dupre-success dupre-info
- dupre-heading-1 dupre-heading-2 dupre-heading-3 dupre-heading-4
- dupre-org-todo dupre-org-todo-dim
- dupre-org-project dupre-org-project-dim
- dupre-org-doing dupre-org-doing-dim
- dupre-org-waiting dupre-org-waiting-dim
- dupre-org-verify dupre-org-verify-dim
- dupre-org-stalled dupre-org-stalled-dim
- dupre-org-failed dupre-org-failed-dim
- dupre-org-done dupre-org-done-dim
- dupre-org-priority-a dupre-org-priority-a-dim
- dupre-org-priority-b dupre-org-priority-b-dim
- dupre-org-priority-c dupre-org-priority-c-dim
- dupre-org-priority-d dupre-org-priority-d-dim))
- (custom-declare-face
- face '((t)) "Dupre theme face; colour set by `dupre-theme-set-faces'."
- :group 'dupre-faces))
-
-(defun dupre-theme-set-faces ()
- "Set all faces for dupre-theme."
- (dupre-with-colors
- (custom-theme-set-faces
- 'dupre
-
-;;;;; Base/abstract faces (for inheritance)
- `(dupre-accent ((t (:foreground ,yellow))))
- `(dupre-err ((t (:foreground ,intense-red))))
- `(dupre-warning ((t (:foreground ,yellow+1))))
- `(dupre-success ((t (:foreground ,green))))
- `(dupre-info ((t (:foreground ,blue))))
- ;; Headings: only level 1 gets gold, rest use blue or neutrals
- `(dupre-heading-1 ((t (:foreground ,yellow :weight bold :height 1.2))))
- `(dupre-heading-2 ((t (:foreground ,blue :weight bold :height 1.1))))
- `(dupre-heading-3 ((t (:foreground ,gray+2 :weight bold))))
- `(dupre-heading-4 ((t (:foreground ,gray+1 :weight bold))))
-
-;;;;; Core Emacs faces
- `(default ((t (:foreground ,fg :background ,bg))))
- `(cursor ((t (:background ,fg))))
- `(hl-line ((t (:background ,bg+0))))
- `(region ((t (:background ,bg+2))))
- `(secondary-selection ((t (:background ,bg+1))))
- `(fringe ((t (:foreground ,gray-2 :background ,bg+1))))
- `(vertical-border ((t (:foreground ,bg+2))))
- `(window-divider ((t (:foreground ,bg+2))))
- `(window-divider-first-pixel ((t (:foreground ,bg+1))))
- `(window-divider-last-pixel ((t (:foreground ,bg+1))))
- `(minibuffer-prompt ((t (:foreground ,blue :weight bold))))
- `(highlight ((t (:background ,bg+2))))
- `(shadow ((t (:foreground ,gray))))
- `(success ((t (:foreground ,green :weight bold))))
- `(warning ((t (:foreground ,yellow+1 :weight bold))))
- `(error ((t (:foreground ,intense-red :weight bold))))
- `(link ((t (:foreground ,blue :underline t))))
- `(link-visited ((t (:foreground ,gray+1 :underline t))))
- `(button ((t (:foreground ,blue :underline t))))
- `(escape-glyph ((t (:foreground ,gray+1))))
- `(homoglyph ((t (:foreground ,gray+1))))
- `(nobreak-space ((t (:foreground ,gray+1 :underline t))))
- `(nobreak-hyphen ((t (:foreground ,gray+1))))
- `(trailing-whitespace ((t (:background ,red-2))))
-
-;;;;; Mode line
- `(mode-line ((t (:foreground ,gray+2 :background ,bg+2
- :box (:line-width -1 :style released-button)))))
- `(mode-line-inactive ((t (:foreground ,gray :background ,bg+1
- :box (:line-width -1 :style released-button)))))
- `(mode-line-buffer-id ((t (:foreground ,blue :weight bold))))
- `(mode-line-emphasis ((t (:foreground ,fg :weight bold))))
- `(mode-line-highlight ((t (:box (:line-width 2 :color ,gray+1)))))
-
-;;;;; Header line
- `(header-line ((t (:foreground ,fg :background ,bg+1
- :box (:line-width -1 :color ,bg+2)))))
- `(header-line-highlight ((t (:foreground ,blue))))
-
-;;;;; Tab line (Emacs 27+)
- `(tab-line ((t (:inherit mode-line :background ,bg+1
- :box (:line-width 4 :color ,bg+1)))))
- `(tab-line-tab ((t (:inherit tab-line))))
- `(tab-line-tab-inactive ((t (:inherit tab-line :foreground ,gray))))
- `(tab-line-tab-current ((t (:background ,bg+2 :foreground ,fg :weight bold))))
- `(tab-line-highlight ((t (:background ,bg+1 :foreground ,fg))))
- `(tab-line-close-highlight ((t (:foreground ,intense-red))))
-
-;;;;; Tab bar (Emacs 27+)
- `(tab-bar ((t (:background ,bg+1 :foreground ,gray))))
- `(tab-bar-tab ((t (:background ,bg+2 :foreground ,fg :weight bold))))
- `(tab-bar-tab-inactive ((t (:background ,bg+1 :foreground ,gray))))
-
-;;;;; Line numbers (Emacs 26+)
- `(line-number ((t (:foreground ,gray-1 :background ,bg+1))))
- `(line-number-current-line ((t (:foreground ,yellow :background ,bg+1 :weight bold))))
- `(line-number-major-tick ((t (:foreground ,gray+1 :background ,bg+1 :weight bold))))
- `(line-number-minor-tick ((t (:foreground ,gray :background ,bg+1))))
-
-;;;;; Font-lock faces - CORE SYNTAX (30% blue for keywords, 10% accents for semantics)
- `(font-lock-builtin-face ((t (:foreground ,blue))))
- `(font-lock-comment-face ((t (:foreground ,gray :slant italic))))
- `(font-lock-comment-delimiter-face ((t (:foreground ,gray-1))))
- `(font-lock-doc-face ((t (:foreground ,gray))))
- `(font-lock-constant-face ((t (:foreground ,gray+2 :weight bold))))
- `(font-lock-function-name-face ((t (:foreground ,red-1)))) ; terracotta
- `(font-lock-keyword-face ((t (:foreground ,blue :weight bold))))
- `(font-lock-negation-char-face ((t (:foreground ,gray+1 :weight bold))))
- `(font-lock-preprocessor-face ((t (:foreground ,gray+1 :slant italic))))
- `(font-lock-regexp-grouping-construct ((t (:foreground ,gray+1 :weight bold))))
- `(font-lock-regexp-grouping-backslash ((t (:foreground ,gray+1 :weight bold))))
- `(font-lock-string-face ((t (:foreground ,green))))
- `(font-lock-type-face ((t (:foreground ,gray+2))))
- `(font-lock-variable-name-face ((t (:foreground ,fg))))
- `(font-lock-warning-face ((t (:foreground ,intense-red :weight bold))))
- ;; Emacs 29+ faces
- `(font-lock-bracket-face ((t (:foreground ,gray+1))))
- `(font-lock-delimiter-face ((t (:foreground ,gray+1))))
- `(font-lock-escape-face ((t (:foreground ,gray+1))))
- `(font-lock-misc-punctuation-face ((t (:foreground ,gray+1))))
- `(font-lock-number-face ((t (:foreground ,gray+2))))
- `(font-lock-operator-face ((t (:foreground ,gray+1))))
- `(font-lock-property-name-face ((t (:foreground ,fg))))
- `(font-lock-property-use-face ((t (:foreground ,fg))))
- `(font-lock-punctuation-face ((t (:foreground ,gray+1))))
- `(font-lock-variable-use-face ((t (:foreground ,fg))))
-
-;;;;; Show-paren
- `(show-paren-match ((t (:foreground ,fg :background ,green-2 :weight bold))))
- `(show-paren-mismatch ((t (:foreground ,fg :background ,intense-red :weight bold))))
- `(show-paren-match-expression ((t (:background ,bg+1))))
-
-;;;;; Search and replace
- `(isearch ((t (:foreground ,fg :background ,green-2 :weight bold))))
- `(isearch-fail ((t (:foreground ,fg :background ,red-2 :weight bold))))
- `(lazy-highlight ((t (:foreground ,bg :background ,yellow :weight bold))))
- `(isearch-group-1 ((t (:foreground ,fg :background ,blue))))
- `(isearch-group-2 ((t (:foreground ,fg :background ,green-1))))
- `(match ((t (:foreground ,fg :background ,green-2 :weight bold))))
- `(query-replace ((t (:inherit isearch))))
-
-;;;;; Diff mode
- `(diff-added ((t (:foreground ,green :background ,green-2))))
- `(diff-removed ((t (:foreground ,red :background ,red-3))))
- `(diff-changed ((t (:foreground ,fg :background ,yellow-2))))
- `(diff-refine-added ((t (:foreground ,fg :background ,green-1 :weight bold))))
- `(diff-refine-removed ((t (:foreground ,fg :background ,red-2 :weight bold))))
- `(diff-refine-changed ((t (:foreground ,fg :background ,yellow-2 :weight bold))))
- `(diff-header ((t (:foreground ,fg :background ,bg+2))))
- `(diff-file-header ((t (:foreground ,blue :background ,bg+2 :weight bold))))
- `(diff-hunk-header ((t (:foreground ,gray+1 :background ,bg+1))))
- `(diff-index ((t (:foreground ,gray))))
- `(diff-indicator-added ((t (:foreground ,green :weight bold))))
- `(diff-indicator-removed ((t (:foreground ,red :weight bold))))
- `(diff-indicator-changed ((t (:foreground ,yellow :weight bold))))
- `(diff-context ((t (:foreground ,gray))))
- `(diff-nonexistent ((t (:foreground ,gray-1 :slant italic))))
-
-;;;;; Ediff
- `(ediff-current-diff-A ((t (:background ,red-3))))
- `(ediff-current-diff-B ((t (:background ,green-2))))
- `(ediff-current-diff-C ((t (:background ,yellow-2))))
- `(ediff-current-diff-Ancestor ((t (:background ,bg+2))))
- `(ediff-fine-diff-A ((t (:foreground ,fg :background ,red-2 :weight bold))))
- `(ediff-fine-diff-B ((t (:foreground ,fg :background ,green-1 :weight bold))))
- `(ediff-fine-diff-C ((t (:foreground ,fg :background ,yellow-1 :weight bold))))
- `(ediff-fine-diff-Ancestor ((t (:foreground ,fg :background ,bg+2 :weight bold))))
- `(ediff-even-diff-A ((t (:background ,bg+1))))
- `(ediff-even-diff-B ((t (:background ,bg+1))))
- `(ediff-even-diff-C ((t (:background ,bg+1))))
- `(ediff-even-diff-Ancestor ((t (:background ,bg+1))))
- `(ediff-odd-diff-A ((t (:background ,bg+1))))
- `(ediff-odd-diff-B ((t (:background ,bg+1))))
- `(ediff-odd-diff-C ((t (:background ,bg+1))))
- `(ediff-odd-diff-Ancestor ((t (:background ,bg+1))))
-
-;;;;; Org-mode - Gold for level 1 only, blue for level 2, then neutrals
- ;; Inherit the dupre-heading-* colour and height but force a normal
- ;; weight: org headings read cleaner non-bold. The override lives here
- ;; rather than on dupre-heading-* so info, markdown, and shr headings
- ;; (which also inherit those faces) keep their bold.
- `(org-level-1 ((t (:inherit dupre-heading-1 :weight normal))))
- `(org-level-2 ((t (:inherit dupre-heading-2 :weight normal))))
- `(org-level-3 ((t (:inherit dupre-heading-3 :weight normal))))
- `(org-level-4 ((t (:inherit dupre-heading-4 :weight normal))))
- `(org-level-5 ((t (:foreground ,gray+1))))
- `(org-level-6 ((t (:foreground ,gray+1))))
- `(org-level-7 ((t (:foreground ,gray))))
- `(org-level-8 ((t (:foreground ,gray))))
- ;; Pin keyword/priority faces to the body height (143). org layers the
- ;; heading's org-level-N face onto a bare keyword but drops it when a
- ;; priority cookie is present, so without an explicit height the same
- ;; keyword renders at the heading size on some lines and the body size on
- ;; others. An absolute height (not a float, which would re-inherit the
- ;; level height inside the face list) keeps every keyword uniform.
- `(org-todo ((t (:foreground ,red-1 :weight bold :height 143))))
- `(org-done ((t (:foreground ,green :weight bold :height 143))))
- `(org-headline-done ((t (:foreground ,gray))))
- `(org-headline-todo ((t (:foreground ,fg))))
-
-;;;;; Org TODO-keyword and priority status faces
- ;; Focused colours (closest dupre palette to the former hard-coded
- ;; names in org-config.el) plus a dimmed variant per status, for
- ;; non-selected windows. org-config.el points org-todo-keyword-faces and
- ;; org-priority-faces at the focused faces; auto-dim-config.el remaps each
- ;; focused face to its -dim variant in unfocused windows.
- `(dupre-org-todo ((t (:foreground ,green :weight bold :height 143))))
- `(dupre-org-todo-dim ((t (:foreground ,green-1 :weight bold :height 143))))
- `(dupre-org-project ((t (:foreground ,blue :weight bold :height 143))))
- `(dupre-org-project-dim ((t (:foreground "#3d4a5a" :weight bold :height 143))))
- `(dupre-org-doing ((t (:foreground ,yellow :weight bold :height 143))))
- `(dupre-org-doing-dim ((t (:foreground ,yellow-2 :weight bold :height 143))))
- `(dupre-org-waiting ((t (:foreground ,fg :weight bold :height 143))))
- `(dupre-org-waiting-dim ((t (:foreground ,gray :weight bold :height 143))))
- `(dupre-org-verify ((t (:foreground ,red :weight bold :height 143))))
- `(dupre-org-verify-dim ((t (:foreground ,red-1 :weight bold :height 143))))
- `(dupre-org-stalled ((t (:foreground ,blue+1 :weight bold :height 143))))
- `(dupre-org-stalled-dim ((t (:foreground ,blue :weight bold :height 143))))
- `(dupre-org-failed ((t (:foreground ,intense-red :weight bold :height 143))))
- `(dupre-org-failed-dim ((t (:foreground ,red :weight bold :height 143))))
- `(dupre-org-done ((t (:foreground ,gray-2 :weight bold :height 143))))
- `(dupre-org-done-dim ((t (:foreground ,bg+2 :weight bold :height 143))))
- `(dupre-org-priority-a ((t (:foreground ,blue+1 :weight bold :height 143))))
- `(dupre-org-priority-a-dim ((t (:foreground ,blue :weight bold :height 143))))
- `(dupre-org-priority-b ((t (:foreground ,yellow :height 143))))
- `(dupre-org-priority-b-dim ((t (:foreground ,yellow-2 :height 143))))
- `(dupre-org-priority-c ((t (:foreground ,green :height 143))))
- `(dupre-org-priority-c-dim ((t (:foreground ,green-1 :height 143))))
- `(dupre-org-priority-d ((t (:foreground ,gray :height 143))))
- `(dupre-org-priority-d-dim ((t (:foreground ,gray-1 :height 143))))
-
- `(org-date ((t (:foreground ,gray :underline t))))
- `(org-link ((t (:foreground ,blue :underline t))))
- `(org-code ((t (:foreground ,green :background ,bg+1))))
- `(org-verbatim ((t (:foreground ,gray+1 :background ,bg+1))))
- `(org-block ((t (:background ,bg+0 :extend t))))
- `(org-block-begin-line ((t (:foreground ,gray :background ,bg :extend t))))
- `(org-block-end-line ((t (:foreground ,gray :background ,bg :extend t))))
- `(org-meta-line ((t (:foreground ,gray))))
- `(org-document-title ((t (:foreground ,yellow :height 1.4))))
- `(org-document-info ((t (:foreground ,gray+1))))
- `(org-document-info-keyword ((t (:foreground ,gray))))
- `(org-tag ((t (:foreground ,gray))))
- `(org-checkbox ((t (:foreground ,blue :weight bold))))
- `(org-checkbox-statistics-todo ((t (:foreground ,gray+1))))
- `(org-checkbox-statistics-done ((t (:foreground ,green))))
- `(org-table ((t (:foreground ,gray+1))))
- `(org-formula ((t (:foreground ,gray+1))))
- `(org-special-keyword ((t (:foreground ,gray))))
- `(org-drawer ((t (:foreground ,gray))))
- `(org-property-value ((t (:foreground ,gray))))
- `(org-priority ((t (:foreground ,yellow :weight bold))))
- `(org-scheduled ((t (:foreground ,fg))))
- `(org-scheduled-today ((t (:foreground ,fg :weight bold))))
- `(org-scheduled-previously ((t (:foreground ,gray+1))))
- `(org-upcoming-deadline ((t (:foreground ,yellow+1))))
- `(org-warning ((t (:foreground ,red :weight bold))))
- `(org-agenda-structure ((t (:foreground ,blue :weight bold))))
- `(org-agenda-date ((t (:foreground ,fg))))
- `(org-agenda-date-today ((t (:foreground ,yellow :weight bold))))
- `(org-agenda-date-weekend ((t (:foreground ,gray))))
- `(org-agenda-done ((t (:foreground ,green))))
- `(org-time-grid ((t (:foreground ,gray))))
- `(org-ellipsis ((t (:foreground ,gray :underline nil))))
-
-;;;;; Magit
- `(magit-section-heading ((t (:foreground ,blue :weight bold))))
- `(magit-section-highlight ((t (:background ,bg+1))))
- `(magit-section-heading-selection ((t (:foreground ,yellow))))
- `(magit-branch-local ((t (:foreground ,blue))))
- `(magit-branch-remote ((t (:foreground ,green))))
- `(magit-branch-remote-head ((t (:foreground ,green :weight bold))))
- `(magit-branch-current ((t (:foreground ,blue :weight bold :box (:line-width -1 :color ,blue)))))
- `(magit-branch-upstream ((t (:foreground ,gray+1 :slant italic))))
- `(magit-tag ((t (:foreground ,gray+1))))
- `(magit-hash ((t (:foreground ,gray))))
- `(magit-head ((t (:foreground ,blue :weight bold))))
- `(magit-log-author ((t (:foreground ,gray+1))))
- `(magit-log-date ((t (:foreground ,gray))))
- `(magit-log-graph ((t (:foreground ,gray))))
- `(magit-diff-added ((t (:foreground ,green :background ,green-2))))
- `(magit-diff-added-highlight ((t (:foreground ,green+1 :background ,green-2))))
- `(magit-diff-removed ((t (:foreground ,red :background ,red-3))))
- `(magit-diff-removed-highlight ((t (:foreground ,red+1 :background ,red-3))))
- `(magit-diff-context ((t (:foreground ,gray))))
- `(magit-diff-context-highlight ((t (:foreground ,gray+1 :background ,bg+1))))
- `(magit-diff-hunk-heading ((t (:foreground ,gray+1 :background ,bg+2))))
- `(magit-diff-hunk-heading-highlight ((t (:foreground ,fg :background ,bg+2 :weight bold))))
- `(magit-diff-hunk-heading-selection ((t (:foreground ,yellow :background ,bg+2))))
- `(magit-diff-file-heading ((t (:foreground ,fg :weight bold))))
- `(magit-diff-file-heading-highlight ((t (:foreground ,fg :background ,bg+1 :weight bold))))
- `(magit-diff-file-heading-selection ((t (:foreground ,yellow))))
- `(magit-diff-lines-heading ((t (:foreground ,fg :background ,yellow-2))))
- `(magit-diffstat-added ((t (:foreground ,green))))
- `(magit-diffstat-removed ((t (:foreground ,red))))
- `(magit-dimmed ((t (:foreground ,gray))))
- `(magit-filename ((t (:foreground ,fg))))
- `(magit-header-line ((t (:foreground ,blue :weight bold))))
- `(magit-header-line-key ((t (:foreground ,blue))))
- `(magit-header-line-log-select ((t (:foreground ,fg :weight bold))))
- `(magit-keyword ((t (:foreground ,gray+1))))
- `(magit-keyword-squash ((t (:foreground ,yellow))))
- `(magit-process-ng ((t (:foreground ,intense-red :weight bold))))
- `(magit-process-ok ((t (:foreground ,green :weight bold))))
- `(magit-reflog-amend ((t (:foreground ,gray+1))))
- `(magit-reflog-checkout ((t (:foreground ,blue))))
- `(magit-reflog-cherry-pick ((t (:foreground ,green))))
- `(magit-reflog-commit ((t (:foreground ,green))))
- `(magit-reflog-merge ((t (:foreground ,green))))
- `(magit-reflog-other ((t (:foreground ,gray))))
- `(magit-reflog-rebase ((t (:foreground ,gray+1))))
- `(magit-reflog-remote ((t (:foreground ,gray))))
- `(magit-reflog-reset ((t (:foreground ,red))))
- `(magit-refname ((t (:foreground ,gray))))
- `(magit-sequence-done ((t (:foreground ,gray))))
- `(magit-sequence-drop ((t (:foreground ,red))))
- `(magit-sequence-head ((t (:foreground ,blue))))
- `(magit-sequence-onto ((t (:foreground ,gray))))
- `(magit-sequence-part ((t (:foreground ,gray+1))))
- `(magit-sequence-pick ((t (:foreground ,fg))))
- `(magit-sequence-stop ((t (:foreground ,green))))
- `(magit-signature-bad ((t (:foreground ,intense-red :weight bold))))
- `(magit-signature-error ((t (:foreground ,red))))
- `(magit-signature-expired ((t (:foreground ,gray+1))))
- `(magit-signature-good ((t (:foreground ,green))))
- `(magit-signature-revoked ((t (:foreground ,red))))
- `(magit-signature-untrusted ((t (:foreground ,gray+1))))
-
-;;;;; Transient (used by Magit)
- `(transient-heading ((t (:foreground ,blue :weight bold))))
- `(transient-key ((t (:foreground ,blue))))
- `(transient-argument ((t (:foreground ,green))))
- `(transient-value ((t (:foreground ,gray+1))))
- `(transient-inactive-argument ((t (:foreground ,gray))))
- `(transient-inactive-value ((t (:foreground ,gray))))
- `(transient-unreachable ((t (:foreground ,gray-1))))
- `(transient-unreachable-key ((t (:foreground ,gray-1))))
- `(transient-enabled-suffix ((t (:foreground ,green :weight bold))))
- `(transient-disabled-suffix ((t (:foreground ,red :weight bold))))
- `(transient-separator ((t (:background ,bg+1 :extend t))))
-
-;;;;; Vertico
- `(vertico-current ((t (:background ,bg+2))))
- `(vertico-group-title ((t (:foreground ,blue :weight bold))))
- `(vertico-group-separator ((t (:foreground ,bg+2 :strike-through t))))
- `(vertico-multiline ((t (:foreground ,gray))))
-
-;;;;; Consult
- `(consult-preview-line ((t (:background ,bg+1))))
- `(consult-preview-match ((t (:inherit lazy-highlight))))
- `(consult-narrow-indicator ((t (:foreground ,yellow))))
- `(consult-async-running ((t (:foreground ,gray+1))))
- `(consult-async-finished ((t (:foreground ,green))))
- `(consult-async-failed ((t (:foreground ,intense-red))))
- `(consult-key ((t (:foreground ,blue))))
- `(consult-file ((t (:foreground ,fg))))
- `(consult-bookmark ((t (:foreground ,fg))))
- `(consult-buffer ((t (:foreground ,fg))))
- `(consult-line-number ((t (:foreground ,gray))))
- `(consult-line-number-prefix ((t (:foreground ,gray-1))))
- `(consult-grep-context ((t (:foreground ,gray))))
- `(consult-highlight-match ((t (:foreground ,yellow :weight bold))))
-
-;;;;; Orderless
- `(orderless-match-face-0 ((t (:foreground ,yellow :weight bold))))
- `(orderless-match-face-1 ((t (:foreground ,blue :weight bold))))
- `(orderless-match-face-2 ((t (:foreground ,green :weight bold))))
- `(orderless-match-face-3 ((t (:foreground ,gray+2 :weight bold))))
-
-;;;;; Marginalia
- `(marginalia-key ((t (:foreground ,blue))))
- `(marginalia-value ((t (:foreground ,gray))))
- `(marginalia-size ((t (:foreground ,gray))))
- `(marginalia-date ((t (:foreground ,gray))))
- `(marginalia-file-name ((t (:foreground ,fg))))
- `(marginalia-file-priv-dir ((t (:foreground ,blue))))
- `(marginalia-file-priv-exec ((t (:foreground ,green))))
- `(marginalia-file-priv-link ((t (:foreground ,gray+1))))
- `(marginalia-file-priv-no ((t (:foreground ,gray))))
- `(marginalia-file-priv-other ((t (:foreground ,gray+1))))
- `(marginalia-file-priv-rare ((t (:foreground ,gray+1))))
- `(marginalia-file-priv-read ((t (:foreground ,gray+1))))
- `(marginalia-file-priv-write ((t (:foreground ,gray+1))))
- `(marginalia-documentation ((t (:foreground ,gray :slant italic))))
- `(marginalia-function ((t (:foreground ,red-1))))
- `(marginalia-mode ((t (:foreground ,gray+1))))
- `(marginalia-modified ((t (:foreground ,yellow))))
- `(marginalia-null ((t (:foreground ,gray-1))))
- `(marginalia-number ((t (:foreground ,gray+1))))
- `(marginalia-symbol ((t (:foreground ,fg))))
- `(marginalia-type ((t (:foreground ,gray+1))))
- `(marginalia-version ((t (:foreground ,gray))))
-
-;;;;; Company
- `(company-tooltip ((t (:background ,bg+1 :foreground ,fg))))
- `(company-tooltip-selection ((t (:background ,bg+2))))
- `(company-tooltip-common ((t (:foreground ,yellow :weight bold))))
- `(company-tooltip-common-selection ((t (:foreground ,yellow :weight bold))))
- `(company-tooltip-annotation ((t (:foreground ,gray))))
- `(company-tooltip-annotation-selection ((t (:foreground ,gray+1))))
- `(company-scrollbar-bg ((t (:background ,bg+1))))
- `(company-scrollbar-fg ((t (:background ,gray))))
- `(company-preview ((t (:foreground ,gray))))
- `(company-preview-common ((t (:foreground ,gray+1))))
- `(company-preview-search ((t (:foreground ,green))))
- `(company-echo ((t nil)))
- `(company-echo-common ((t (:foreground ,gray+1))))
-
-;;;;; Corfu
- `(corfu-default ((t (:background ,bg+1 :foreground ,fg))))
- `(corfu-current ((t (:background ,bg+2))))
- `(corfu-border ((t (:background ,bg+2))))
- `(corfu-bar ((t (:background ,gray))))
- `(corfu-annotations ((t (:foreground ,gray))))
- `(corfu-deprecated ((t (:foreground ,gray :strike-through t))))
- `(corfu-echo ((t (:foreground ,gray))))
-
-;;;;; Embark
- `(embark-keybinding ((t (:foreground ,blue :weight bold))))
- `(embark-target ((t (:foreground ,yellow :weight bold))))
- `(embark-collect-candidate ((t (:foreground ,fg))))
- `(embark-collect-group-title ((t (:foreground ,blue :weight bold))))
- `(embark-collect-group-separator ((t (:foreground ,bg+2 :strike-through t))))
- `(embark-collect-marked ((t (:foreground ,yellow :weight bold))))
- `(embark-verbose-indicator-title ((t (:foreground ,blue))))
-
-;;;;; Dired
- `(dired-directory ((t (:foreground ,blue :weight bold))))
- `(dired-flagged ((t (:foreground ,intense-red))))
- `(dired-header ((t (:foreground ,blue :weight bold))))
- `(dired-ignored ((t (:foreground ,gray))))
- `(dired-mark ((t (:foreground ,yellow :weight bold))))
- `(dired-marked ((t (:foreground ,yellow :weight bold))))
- `(dired-perm-write ((t (:foreground ,gray+1))))
- `(dired-symlink ((t (:foreground ,gray+1))))
- `(dired-warning ((t (:foreground ,yellow+1))))
- `(dired-broken-symlink ((t (:foreground ,fg :background ,red-2))))
-
-;;;;; Dirvish
- `(dirvish-hl-line ((t (:background ,bg+2))))
- `(dirvish-git-commit-message-face ((t (:foreground ,gray :slant italic))))
- `(dirvish-subtree-guide ((t (:foreground ,bg+2))))
- `(dirvish-subtree-state ((t (:foreground ,gray+1))))
-
-;;;;; Flycheck
- `(flycheck-error ((t (:underline (:style wave :color ,intense-red)))))
- `(flycheck-warning ((t (:underline (:style wave :color ,yellow+1)))))
- `(flycheck-info ((t (:underline (:style wave :color ,blue)))))
- `(flycheck-fringe-error ((t (:foreground ,intense-red))))
- `(flycheck-fringe-warning ((t (:foreground ,yellow+1))))
- `(flycheck-fringe-info ((t (:foreground ,blue))))
- `(flycheck-error-list-error ((t (:foreground ,intense-red))))
- `(flycheck-error-list-warning ((t (:foreground ,yellow+1))))
- `(flycheck-error-list-info ((t (:foreground ,blue))))
- `(flycheck-error-list-filename ((t (:foreground ,fg))))
- `(flycheck-error-list-line-number ((t (:foreground ,gray))))
- `(flycheck-error-list-column-number ((t (:foreground ,gray))))
- `(flycheck-error-list-id ((t (:foreground ,gray))))
- `(flycheck-error-list-checker-name ((t (:foreground ,gray))))
- `(flycheck-error-list-highlight ((t (:background ,bg+2))))
-
-;;;;; Flymake
- `(flymake-error ((t (:underline (:style wave :color ,intense-red)))))
- `(flymake-warning ((t (:underline (:style wave :color ,yellow+1)))))
- `(flymake-note ((t (:underline (:style wave :color ,blue)))))
-
-;;;;; Mu4e
- `(mu4e-header-face ((t (:foreground ,fg))))
- `(mu4e-header-highlight-face ((t (:background ,bg+2))))
- `(mu4e-header-key-face ((t (:foreground ,blue :weight bold))))
- `(mu4e-header-marks-face ((t (:foreground ,yellow))))
- `(mu4e-header-title-face ((t (:foreground ,blue :weight bold))))
- `(mu4e-header-value-face ((t (:foreground ,gray+1))))
- `(mu4e-unread-face ((t (:foreground ,fg :weight bold))))
- `(mu4e-flagged-face ((t (:foreground ,yellow))))
- `(mu4e-replied-face ((t (:foreground ,gray+1))))
- `(mu4e-forwarded-face ((t (:foreground ,gray+1))))
- `(mu4e-draft-face ((t (:foreground ,gray :slant italic))))
- `(mu4e-trashed-face ((t (:foreground ,gray :strike-through t))))
- `(mu4e-attach-number-face ((t (:foreground ,blue :weight bold))))
- `(mu4e-cited-1-face ((t (:foreground ,gray+1))))
- `(mu4e-cited-2-face ((t (:foreground ,gray))))
- `(mu4e-cited-3-face ((t (:foreground ,gray))))
- `(mu4e-cited-4-face ((t (:foreground ,gray-1))))
- `(mu4e-cited-5-face ((t (:foreground ,gray-1))))
- `(mu4e-cited-6-face ((t (:foreground ,gray-1))))
- `(mu4e-cited-7-face ((t (:foreground ,gray-2))))
- `(mu4e-compose-header-face ((t (:foreground ,blue :weight bold))))
- `(mu4e-compose-separator-face ((t (:foreground ,gray))))
- `(mu4e-contact-face ((t (:foreground ,fg))))
- `(mu4e-context-face ((t (:foreground ,blue :weight bold))))
- `(mu4e-footer-face ((t (:foreground ,gray))))
- `(mu4e-highlight-face ((t (:foreground ,yellow :weight bold))))
- `(mu4e-link-face ((t (:foreground ,blue :underline t))))
- `(mu4e-modeline-face ((t (:foreground ,gray+1))))
- `(mu4e-moved-face ((t (:foreground ,gray :slant italic))))
- `(mu4e-ok-face ((t (:foreground ,green :weight bold))))
- `(mu4e-region-code ((t (:background ,bg+1))))
- `(mu4e-related-face ((t (:foreground ,gray :slant italic))))
- `(mu4e-special-header-value-face ((t (:foreground ,gray+1))))
- `(mu4e-system-face ((t (:foreground ,gray :slant italic))))
- `(mu4e-title-face ((t (:foreground ,blue :weight bold))))
- `(mu4e-url-number-face ((t (:foreground ,blue :weight bold))))
- `(mu4e-warning-face ((t (:foreground ,yellow+1 :weight bold))))
-
-;;;;; Elfeed
- `(elfeed-search-date-face ((t (:foreground ,gray))))
- `(elfeed-search-title-face ((t (:foreground ,fg))))
- `(elfeed-search-unread-title-face ((t (:foreground ,fg :weight bold))))
- `(elfeed-search-feed-face ((t (:foreground ,blue))))
- `(elfeed-search-tag-face ((t (:foreground ,gray+1))))
- `(elfeed-search-unread-count-face ((t (:foreground ,gray+1))))
- `(elfeed-search-filter-face ((t (:foreground ,blue :weight bold))))
- `(elfeed-log-date-face ((t (:foreground ,gray))))
- `(elfeed-log-info-level-face ((t (:foreground ,blue))))
- `(elfeed-log-warn-level-face ((t (:foreground ,yellow+1))))
- `(elfeed-log-error-level-face ((t (:foreground ,intense-red))))
- `(elfeed-log-debug-level-face ((t (:foreground ,gray))))
-
-;;;;; Rainbow-delimiters - signature blue first, then neutrals
- `(rainbow-delimiters-depth-1-face ((t (:foreground ,blue))))
- `(rainbow-delimiters-depth-2-face ((t (:foreground ,gray+2))))
- `(rainbow-delimiters-depth-3-face ((t (:foreground ,gray+1))))
- `(rainbow-delimiters-depth-4-face ((t (:foreground ,gray))))
- `(rainbow-delimiters-depth-5-face ((t (:foreground ,blue))))
- `(rainbow-delimiters-depth-6-face ((t (:foreground ,gray+2))))
- `(rainbow-delimiters-depth-7-face ((t (:foreground ,gray+1))))
- `(rainbow-delimiters-depth-8-face ((t (:foreground ,gray))))
- `(rainbow-delimiters-depth-9-face ((t (:foreground ,gray-1))))
- `(rainbow-delimiters-base-face ((t (:foreground ,fg))))
- `(rainbow-delimiters-base-error-face ((t (:foreground ,intense-red :weight bold))))
- `(rainbow-delimiters-unmatched-face ((t (:foreground ,intense-red :weight bold))))
- `(rainbow-delimiters-mismatched-face ((t (:foreground ,intense-red :weight bold))))
-
-;;;;; Dashboard
- `(dashboard-banner-logo-title ((t (:foreground ,yellow :weight bold :height 1.2))))
- `(dashboard-heading ((t (:foreground ,blue :weight bold))))
- `(dashboard-items-face ((t (:foreground ,steel+2))))
- `(dashboard-no-items-face ((t (:foreground ,gray))))
- `(dashboard-navigator ((t (:foreground ,blue))))
- `(dashboard-footer ((t (:foreground ,gray :slant italic))))
- `(dashboard-footer-icon ((t (:foreground ,blue))))
-
-;;;;; Which-key
- `(which-key-key-face ((t (:foreground ,blue :weight bold))))
- `(which-key-separator-face ((t (:foreground ,gray))))
- `(which-key-note-face ((t (:foreground ,gray))))
- `(which-key-command-description-face ((t (:foreground ,fg))))
- `(which-key-local-map-description-face ((t (:foreground ,fg))))
- `(which-key-group-description-face ((t (:foreground ,blue))))
- `(which-key-special-key-face ((t (:foreground ,yellow :weight bold))))
- `(which-key-highlighted-command-face ((t (:foreground ,yellow :weight bold))))
- `(which-key-docstring-face ((t (:foreground ,gray :slant italic))))
-
-;;;;; Eshell
- `(eshell-prompt ((t (:foreground ,blue :weight bold))))
- `(eshell-ls-directory ((t (:foreground ,blue :weight bold))))
- `(eshell-ls-symlink ((t (:foreground ,gray+1))))
- `(eshell-ls-executable ((t (:foreground ,green))))
- `(eshell-ls-readonly ((t (:foreground ,gray))))
- `(eshell-ls-unreadable ((t (:foreground ,gray-1))))
- `(eshell-ls-special ((t (:foreground ,gray+1))))
- `(eshell-ls-missing ((t (:foreground ,intense-red))))
- `(eshell-ls-archive ((t (:foreground ,gray+1))))
- `(eshell-ls-backup ((t (:foreground ,gray))))
- `(eshell-ls-product ((t (:foreground ,gray))))
- `(eshell-ls-clutter ((t (:foreground ,gray-1))))
-
-;;;;; Vterm
- `(vterm-color-default ((t (:foreground ,fg :background ,bg))))
- `(vterm-color-black ((t (:foreground ,bg+2 :background ,gray-2))))
- `(vterm-color-red ((t (:foreground ,red-1 :background ,red))))
- `(vterm-color-green ((t (:foreground ,green :background ,green+1))))
- `(vterm-color-yellow ((t (:foreground ,yellow :background ,yellow+1))))
- `(vterm-color-blue ((t (:foreground ,blue :background ,blue+1))))
- `(vterm-color-magenta ((t (:foreground ,red :background ,red+1))))
- `(vterm-color-cyan ((t (:foreground ,steel :background ,steel+1))))
- `(vterm-color-white ((t (:foreground ,gray+1 :background ,fg))))
-
-;;;;; Compilation
- `(compilation-info ((t (:foreground ,green))))
- `(compilation-warning ((t (:foreground ,yellow+1))))
- `(compilation-error ((t (:foreground ,intense-red))))
- `(compilation-mode-line-exit ((t (:foreground ,green :weight bold))))
- `(compilation-mode-line-fail ((t (:foreground ,intense-red :weight bold))))
- `(compilation-mode-line-run ((t (:foreground ,gray+1))))
- `(compilation-line-number ((t (:foreground ,gray))))
- `(compilation-column-number ((t (:foreground ,gray))))
-
-;;;;; Info
- `(info-title-1 ((t (:inherit dupre-heading-1))))
- `(info-title-2 ((t (:inherit dupre-heading-2))))
- `(info-title-3 ((t (:inherit dupre-heading-3))))
- `(info-title-4 ((t (:inherit dupre-heading-4))))
- `(info-menu-header ((t (:foreground ,blue :weight bold))))
- `(info-menu-star ((t (:foreground ,gray+1))))
- `(info-node ((t (:foreground ,blue :weight bold))))
- `(info-xref ((t (:foreground ,blue :underline t))))
- `(info-xref-visited ((t (:foreground ,gray+1 :underline t))))
- `(info-header-node ((t (:foreground ,fg :weight bold))))
- `(info-header-xref ((t (:foreground ,blue))))
- `(info-index-match ((t (:inherit lazy-highlight))))
-
-;;;;; Help
- `(help-key-binding ((t (:foreground ,blue :background ,bg+1
- :box (:line-width -1 :color ,bg+2)))))
- `(help-for-help-header ((t (:foreground ,blue :weight bold :height 1.2))))
- `(help-argument-name ((t (:foreground ,gray+1 :slant italic))))
-
-;;;;; Custom (customize interface)
- `(custom-variable-tag ((t (:foreground ,blue :weight bold))))
- `(custom-group-tag ((t (:foreground ,blue :weight bold :height 1.2))))
- `(custom-group-tag-1 ((t (:foreground ,blue :weight bold))))
- `(custom-state ((t (:foreground ,green))))
- `(custom-changed ((t (:foreground ,yellow))))
- `(custom-modified ((t (:foreground ,yellow))))
- `(custom-invalid ((t (:foreground ,intense-red))))
- `(custom-set ((t (:foreground ,green))))
- `(custom-themed ((t (:foreground ,blue))))
- `(custom-saved ((t (:foreground ,green :weight bold))))
- `(custom-button ((t (:foreground ,fg :background ,bg+1
- :box (:line-width -1 :style released-button)))))
- `(custom-button-mouse ((t (:foreground ,fg :background ,bg+2
- :box (:line-width -1 :style released-button)))))
- `(custom-button-pressed ((t (:foreground ,fg :background ,bg+1
- :box (:line-width -1 :style pressed-button)))))
- `(custom-comment ((t (:foreground ,gray))))
- `(custom-comment-tag ((t (:foreground ,gray))))
- `(custom-face-tag ((t (:foreground ,blue :weight bold))))
- `(custom-link ((t (:foreground ,blue :underline t))))
- `(custom-visibility ((t (:foreground ,blue :underline t))))
-
-;;;;; Markdown
- `(markdown-header-face-1 ((t (:inherit dupre-heading-1))))
- `(markdown-header-face-2 ((t (:inherit dupre-heading-2))))
- `(markdown-header-face-3 ((t (:inherit dupre-heading-3))))
- `(markdown-header-face-4 ((t (:inherit dupre-heading-4))))
- `(markdown-header-face-5 ((t (:foreground ,gray+1))))
- `(markdown-header-face-6 ((t (:foreground ,gray))))
- `(markdown-bold-face ((t (:weight bold))))
- `(markdown-italic-face ((t (:slant italic))))
- `(markdown-strike-through-face ((t (:strike-through t))))
- `(markdown-code-face ((t (:foreground ,green :background ,bg+1))))
- `(markdown-inline-code-face ((t (:foreground ,green :background ,bg+1))))
- `(markdown-pre-face ((t (:foreground ,green :background ,bg+1))))
- `(markdown-blockquote-face ((t (:foreground ,gray :slant italic))))
- `(markdown-list-face ((t (:foreground ,gray+1))))
- `(markdown-link-face ((t (:foreground ,blue))))
- `(markdown-url-face ((t (:foreground ,gray :underline t))))
- `(markdown-link-title-face ((t (:foreground ,fg))))
- `(markdown-reference-face ((t (:foreground ,gray))))
- `(markdown-footnote-marker-face ((t (:foreground ,gray+1))))
- `(markdown-footnote-text-face ((t (:foreground ,gray))))
- `(markdown-table-face ((t (:foreground ,gray+1))))
- `(markdown-hr-face ((t (:foreground ,bg+2))))
- `(markdown-metadata-key-face ((t (:foreground ,gray))))
- `(markdown-metadata-value-face ((t (:foreground ,gray+1))))
- `(markdown-language-keyword-face ((t (:foreground ,gray+1))))
- `(markdown-language-info-face ((t (:foreground ,gray))))
- `(markdown-gfm-checkbox-face ((t (:foreground ,blue))))
- `(markdown-highlight-face ((t (:background ,yellow-2))))
- `(markdown-markup-face ((t (:foreground ,gray))))
-
-;;;;; Eglot/LSP
- `(eglot-highlight-symbol-face ((t (:background ,bg+2))))
- `(eglot-diagnostic-tag-unnecessary-face ((t (:foreground ,gray :slant italic))))
- `(eglot-diagnostic-tag-deprecated-face ((t (:foreground ,gray :strike-through t))))
-
-;;;;; Ace-window
- `(aw-leading-char-face ((t (:foreground ,yellow :weight bold :height 2.0))))
- `(aw-background-face ((t (:foreground ,gray))))
- `(aw-mode-line-face ((t (:foreground ,blue :weight bold))))
- `(aw-key-face ((t (:foreground ,blue :weight bold))))
-
-;;;;; Avy
- `(avy-lead-face ((t (:foreground ,fg :background ,yellow-2 :weight bold))))
- `(avy-lead-face-0 ((t (:foreground ,fg :background ,blue :weight bold))))
- `(avy-lead-face-1 ((t (:foreground ,fg :background ,bg+2 :weight bold))))
- `(avy-lead-face-2 ((t (:foreground ,fg :background ,bg+2 :weight bold))))
- `(avy-background-face ((t (:foreground ,gray))))
- `(avy-goto-char-timer-face ((t (:foreground ,yellow :weight bold))))
-
-;;;;; Whitespace
- `(whitespace-space ((t (:foreground ,bg+2))))
- `(whitespace-tab ((t (:foreground ,bg+2))))
- `(whitespace-newline ((t (:foreground ,bg+2))))
- `(whitespace-trailing ((t (:background ,red-2))))
- `(whitespace-line ((t (:background ,red-3))))
- `(whitespace-indentation ((t (:foreground ,bg+2 :background ,bg))))
- `(whitespace-empty ((t (:background ,yellow-2))))
- `(whitespace-space-after-tab ((t (:foreground ,bg+2 :background ,yellow-2))))
- `(whitespace-space-before-tab ((t (:foreground ,bg+2 :background ,yellow-2))))
- `(whitespace-hspace ((t (:foreground ,bg+2))))
- `(whitespace-big-indent ((t (:background ,red-3))))
- `(whitespace-missing-newline-at-eof ((t (:background ,yellow-2))))
-
-;;;;; Anzu
- `(anzu-mode-line ((t (:foreground ,blue :weight bold))))
- `(anzu-mode-line-no-match ((t (:foreground ,intense-red :weight bold))))
- `(anzu-match-1 ((t (:foreground ,fg :background ,green-2))))
- `(anzu-match-2 ((t (:foreground ,fg :background ,blue))))
- `(anzu-match-3 ((t (:foreground ,fg :background ,bg+2))))
- `(anzu-replace-highlight ((t (:foreground ,fg :background ,red-2))))
- `(anzu-replace-to ((t (:foreground ,fg :background ,green-2))))
-
-;;;;; Bookmark
- `(bookmark-face ((t (:foreground ,blue :background ,bg+1))))
- `(bookmark-menu-bookmark ((t (:foreground ,blue :weight bold))))
- `(bookmark-menu-heading ((t (:foreground ,blue :weight bold))))
-
-;;;;; Speedbar
- `(speedbar-button-face ((t (:foreground ,gray+1))))
- `(speedbar-directory-face ((t (:foreground ,blue :weight bold))))
- `(speedbar-file-face ((t (:foreground ,fg))))
- `(speedbar-highlight-face ((t (:background ,bg+2))))
- `(speedbar-selected-face ((t (:foreground ,yellow :weight bold))))
- `(speedbar-separator-face ((t (:foreground ,bg+2 :overline t))))
- `(speedbar-tag-face ((t (:foreground ,gray+1))))
-
-;;;;; Term
- `(term-color-black ((t (:foreground ,bg+2 :background ,gray-2))))
- `(term-color-red ((t (:foreground ,red-1 :background ,red))))
- `(term-color-green ((t (:foreground ,green :background ,green+1))))
- `(term-color-yellow ((t (:foreground ,yellow :background ,yellow+1))))
- `(term-color-blue ((t (:foreground ,blue :background ,blue+1))))
- `(term-color-magenta ((t (:foreground ,red :background ,red+1))))
- `(term-color-cyan ((t (:foreground ,steel :background ,steel+1))))
- `(term-color-white ((t (:foreground ,gray+1 :background ,fg))))
- `(term-default-fg-color ((t (:foreground ,fg))))
- `(term-default-bg-color ((t (:background ,bg))))
-
-;;;;; Comint
- `(comint-highlight-prompt ((t (:foreground ,blue :weight bold))))
- `(comint-highlight-input ((t (:foreground ,fg :weight bold))))
-
-;;;;; Woman
- `(woman-bold ((t (:foreground ,fg :weight bold))))
- `(woman-italic ((t (:foreground ,gray+1 :slant italic))))
- `(woman-unknown ((t (:foreground ,gray+1))))
- `(woman-addition ((t (:foreground ,gray+1))))
-
-;;;;; Xref
- `(xref-file-header ((t (:foreground ,blue :weight bold))))
- `(xref-line-number ((t (:foreground ,gray))))
- `(xref-match ((t (:inherit lazy-highlight))))
-
-;;;;; Calendar/Diary
- `(calendar-today ((t (:foreground ,yellow :weight bold))))
- `(calendar-weekday-header ((t (:foreground ,fg))))
- `(calendar-weekend-header ((t (:foreground ,gray))))
- `(calendar-month-header ((t (:foreground ,blue :weight bold))))
- `(diary ((t (:foreground ,fg))))
- `(diary-anniversary ((t (:foreground ,gray+1))))
- `(diary-time ((t (:foreground ,gray))))
- `(holiday ((t (:foreground ,green))))
-
-;;;;; Message mode (for email)
- `(message-header-name ((t (:foreground ,blue :weight bold))))
- `(message-header-to ((t (:foreground ,fg))))
- `(message-header-cc ((t (:foreground ,gray+1))))
- `(message-header-subject ((t (:foreground ,fg :weight bold))))
- `(message-header-other ((t (:foreground ,gray))))
- `(message-header-newsgroups ((t (:foreground ,fg))))
- `(message-header-xheader ((t (:foreground ,gray))))
- `(message-separator ((t (:foreground ,gray))))
- `(message-cited-text ((t (:foreground ,gray :slant italic))))
- `(message-cited-text-1 ((t (:foreground ,gray+1))))
- `(message-cited-text-2 ((t (:foreground ,gray))))
- `(message-cited-text-3 ((t (:foreground ,gray))))
- `(message-cited-text-4 ((t (:foreground ,gray-1))))
- `(message-mml ((t (:foreground ,gray+1))))
-
-;;;;; Gnus
- `(gnus-group-mail-1 ((t (:foreground ,fg :weight bold))))
- `(gnus-group-mail-2 ((t (:foreground ,fg))))
- `(gnus-group-mail-3 ((t (:foreground ,gray+1))))
- `(gnus-group-mail-1-empty ((t (:foreground ,gray))))
- `(gnus-group-mail-2-empty ((t (:foreground ,gray))))
- `(gnus-group-mail-3-empty ((t (:foreground ,gray))))
- `(gnus-group-news-1 ((t (:foreground ,fg :weight bold))))
- `(gnus-group-news-2 ((t (:foreground ,fg))))
- `(gnus-group-news-3 ((t (:foreground ,gray+1))))
- `(gnus-group-news-1-empty ((t (:foreground ,gray))))
- `(gnus-group-news-2-empty ((t (:foreground ,gray))))
- `(gnus-group-news-3-empty ((t (:foreground ,gray))))
- `(gnus-summary-normal-read ((t (:foreground ,gray))))
- `(gnus-summary-normal-unread ((t (:foreground ,fg :weight bold))))
- `(gnus-summary-normal-ancient ((t (:foreground ,gray-1))))
- `(gnus-summary-selected ((t (:foreground ,yellow :weight bold))))
- `(gnus-summary-cancelled ((t (:foreground ,intense-red :strike-through t))))
- `(gnus-header-name ((t (:foreground ,blue :weight bold))))
- `(gnus-header-from ((t (:foreground ,fg))))
- `(gnus-header-subject ((t (:foreground ,fg :weight bold))))
- `(gnus-header-content ((t (:foreground ,gray))))
- `(gnus-header-newsgroups ((t (:foreground ,fg))))
- `(gnus-cite-1 ((t (:foreground ,gray+1))))
- `(gnus-cite-2 ((t (:foreground ,gray))))
- `(gnus-cite-3 ((t (:foreground ,gray))))
- `(gnus-cite-4 ((t (:foreground ,gray-1))))
- `(gnus-cite-5 ((t (:foreground ,gray-1))))
- `(gnus-signature ((t (:foreground ,gray :slant italic))))
-
-;;;;; Web-mode
- `(web-mode-html-tag-face ((t (:foreground ,blue))))
- `(web-mode-html-tag-bracket-face ((t (:foreground ,gray+1))))
- `(web-mode-html-attr-name-face ((t (:foreground ,gray+1))))
- `(web-mode-html-attr-value-face ((t (:foreground ,green))))
- `(web-mode-html-attr-equal-face ((t (:foreground ,gray+1))))
- `(web-mode-doctype-face ((t (:foreground ,gray :weight bold))))
- `(web-mode-comment-face ((t (:foreground ,gray :slant italic))))
- `(web-mode-css-selector-face ((t (:foreground ,blue))))
- `(web-mode-css-property-name-face ((t (:foreground ,gray+1))))
- `(web-mode-css-color-face ((t (:foreground ,gray+1))))
- `(web-mode-css-at-rule-face ((t (:foreground ,blue :weight bold))))
- `(web-mode-css-pseudo-class-face ((t (:foreground ,gray+1))))
- `(web-mode-css-function-face ((t (:foreground ,red-1))))
- `(web-mode-function-name-face ((t (:foreground ,red-1 :weight bold))))
- `(web-mode-function-call-face ((t (:foreground ,red-1))))
- `(web-mode-string-face ((t (:foreground ,green))))
- `(web-mode-keyword-face ((t (:foreground ,blue :weight bold))))
- `(web-mode-constant-face ((t (:foreground ,gray+2 :weight bold))))
- `(web-mode-type-face ((t (:foreground ,gray+2))))
- `(web-mode-variable-name-face ((t (:foreground ,fg))))
- `(web-mode-builtin-face ((t (:foreground ,blue))))
- `(web-mode-symbol-face ((t (:foreground ,gray))))
- `(web-mode-current-element-highlight-face ((t (:background ,bg+2))))
- `(web-mode-current-column-highlight-face ((t (:background ,bg+1))))
- `(web-mode-error-face ((t (:foreground ,intense-red :underline t))))
- `(web-mode-warning-face ((t (:foreground ,yellow+1 :underline t))))
- `(web-mode-folded-face ((t (:foreground ,gray :underline t))))
- `(web-mode-block-face ((t (:background ,bg+0))))
-
-;;;;; Treemacs
- `(treemacs-directory-face ((t (:foreground ,blue))))
- `(treemacs-file-face ((t (:foreground ,fg))))
- `(treemacs-root-face ((t (:foreground ,blue :weight bold :height 1.2))))
- `(treemacs-git-modified-face ((t (:foreground ,yellow))))
- `(treemacs-git-added-face ((t (:foreground ,green))))
- `(treemacs-git-conflict-face ((t (:foreground ,intense-red :weight bold))))
- `(treemacs-git-ignored-face ((t (:foreground ,gray))))
- `(treemacs-git-renamed-face ((t (:foreground ,gray+1))))
- `(treemacs-git-untracked-face ((t (:foreground ,gray))))
- `(treemacs-tags-face ((t (:foreground ,gray+1))))
- `(treemacs-help-title-face ((t (:foreground ,blue :weight bold))))
- `(treemacs-help-column-face ((t (:foreground ,gray))))
- `(treemacs-fringe-indicator-face ((t (:foreground ,blue))))
- `(treemacs-on-failure-pulse-face ((t (:background ,red-2))))
- `(treemacs-on-success-pulse-face ((t (:background ,green-2))))
-
-;;;;; Gptel (AI chat)
- `(gptel-context-highlight-face ((t (:background ,bg+1))))
- `(gptel-rewrite-highlight-face ((t (:background ,yellow-2))))
-
-;;;;; Eww
- `(eww-form-text ((t (:foreground ,fg :background ,bg+1
- :box (:line-width -1 :color ,bg+2)))))
- `(eww-form-textarea ((t (:foreground ,fg :background ,bg+1
- :box (:line-width -1 :color ,bg+2)))))
- `(eww-form-submit ((t (:foreground ,fg :background ,bg+2
- :box (:line-width -1 :style released-button)))))
- `(eww-form-checkbox ((t (:foreground ,blue :background ,bg+1
- :box (:line-width -1 :color ,bg+2)))))
- `(eww-form-select ((t (:foreground ,fg :background ,bg+1
- :box (:line-width -1 :color ,bg+2)))))
- `(eww-form-file ((t (:foreground ,blue :background ,bg+1
- :box (:line-width -1 :color ,bg+2)))))
- `(eww-valid-certificate ((t (:foreground ,green :weight bold))))
- `(eww-invalid-certificate ((t (:foreground ,intense-red :weight bold))))
-
-;;;;; Shr (simple html renderer)
- `(shr-link ((t (:foreground ,blue :underline t))))
- `(shr-selected-link ((t (:foreground ,yellow :underline t))))
- `(shr-strike-through ((t (:strike-through t))))
- `(shr-h1 ((t (:inherit dupre-heading-1))))
- `(shr-h2 ((t (:inherit dupre-heading-2))))
- `(shr-h3 ((t (:inherit dupre-heading-3))))
- `(shr-h4 ((t (:inherit dupre-heading-4))))
- `(shr-h5 ((t (:foreground ,gray+1))))
- `(shr-h6 ((t (:foreground ,gray))))
- `(shr-code ((t (:foreground ,green :background ,bg+1))))
- `(shr-mark ((t (:background ,yellow-2))))
-
-;;;;; auto-dim-other-buffers
- ;; Non-selected windows recede to a pure-black background with faded
- ;; gray text, so an inactive window reads as "disabled". This face is
- ;; remapped onto default, the font-lock faces, and org-block (see
- ;; auto-dim-config.el), so code text fades too rather than staying lit.
- ;; The -hide face keeps org hidden text invisible in dimmed windows (its
- ;; foreground must match the dimmed background).
- `(auto-dim-other-buffers ((t (:foreground ,gray-1 :background "#000000"))))
- `(auto-dim-other-buffers-hide ((t (:foreground "#000000" :background "#000000"))))
-
- )))
-
-(provide 'dupre-faces)
-;;; dupre-faces.el ends here
diff --git a/themes/dupre-palette.el b/themes/dupre-palette.el
deleted file mode 100644
index d6715a788..000000000
--- a/themes/dupre-palette.el
+++ /dev/null
@@ -1,131 +0,0 @@
-;;; dupre-palette.el --- Color palette for dupre-theme -*- lexical-binding: t -*-
-
-;; Author: Craig Jennings <c@cjennings.net>
-
-;;; Commentary:
-
-;; This file defines the color palette and semantic mappings for dupre-theme.
-;; Colors are defined as hex values for GUI Emacs.
-
-;;; Code:
-
-(defconst dupre-palette
- '(;;; Base colors
- (bg "#0d0b0a")
- (bg+0 "#0d0b0a")
- (bg+1 "#252321")
- (bg+2 "#474544")
-
- ;; Grays
- (gray-2 "#58574e")
- (gray-1 "#6c6a60")
- (gray "#969385")
- (gray+1 "#b4b1a2")
- (gray+2 "#d0cbc0")
-
- ;; Steel (blue-grays)
- (steel "#8a9496")
- (steel+1 "#acb0b3")
- (steel+2 "#c0c7ca")
-
- ;; Blues
- (blue "#67809c")
- (blue+1 "#b2c3cc")
- (blue+2 "#d9e2ff")
-
- ;; Greens
- (green-2 "#646d14")
- (green-1 "#869038")
- (green "#a4ac64")
- (green+1 "#ccc768")
-
- ;; Reds
- (red-3 "#3f1c0f")
- (red-2 "#7c2a09")
- (red-1 "#a7502d")
- (red "#d47c59")
- (red+1 "#edb08f")
- (red+2 "#edbca2")
-
- ;; Yellows
- (yellow-2 "#875f00")
- (yellow-1 "#ffd700")
- (yellow "#d7af5f")
- (yellow+1 "#ffd75f")
- (yellow+2 "#f9ee98")
-
- ;; Intense/alert colors
- (intense-red "#ff2a00")
-
- ;; Foreground
- (fg "#f0fef0"))
- "Color palette for dupre-theme.
-Each entry is (NAME VALUE) where VALUE is a hex color string.")
-
-(defconst dupre-semantic-mappings
- '(;;; Status colors
- (accent yellow)
- (err intense-red)
- (warning yellow+1)
- (success green)
- (info blue+1)
-
- ;;; Syntax highlighting
- (keyword blue)
- (string green)
- (comment gray)
- (constant yellow+1)
- (function red)
- (variable blue+1)
- (type green+1)
- (builtin yellow)
- (preprocessor steel+1)
-
- ;;; UI elements
- (border bg+2)
- (selection bg+2)
- (hl-line bg+0)
- (link blue+1)
- (cursor fg)
- (prompt green)
-
- ;;; Diff colors
- (diff-added-bg green-2)
- (diff-added-fg green)
- (diff-removed-bg red-3)
- (diff-removed-fg red)
- (diff-changed-bg yellow-2)
- (diff-changed-fg fg))
- "Semantic color mappings for dupre-theme.
-Each entry maps a semantic name to a palette color name.")
-
-(defun dupre-get-color (name)
- "Get the hex value for color NAME from the palette.
-NAME can be a base palette color or a semantic mapping."
- (let ((semantic (assq name dupre-semantic-mappings)))
- (if semantic
- ;; Resolve semantic mapping to base color
- (dupre-get-color (cadr semantic))
- ;; Look up in base palette
- (let ((color (assq name dupre-palette)))
- (if color
- (cadr color)
- (error "Unknown color: %s" name))))))
-
-(defmacro dupre-with-colors (&rest body)
- "Execute BODY with all palette colors bound as local variables."
- (declare (indent 0))
- `(let ,(mapcar (lambda (entry)
- (list (car entry) (cadr entry)))
- dupre-palette)
- ;; Also bind semantic mappings resolved to their values
- (let ,(mapcar (lambda (entry)
- (let* ((name (car entry))
- (target (cadr entry))
- (resolved (cadr (assq target dupre-palette))))
- (list name resolved)))
- dupre-semantic-mappings)
- ,@body)))
-
-(provide 'dupre-palette)
-;;; dupre-palette.el ends here
diff --git a/themes/dupre-palette.png b/themes/dupre-palette.png
deleted file mode 100644
index 94bd084c6..000000000
--- a/themes/dupre-palette.png
+++ /dev/null
Binary files differ
diff --git a/themes/dupre-theme.el b/themes/dupre-theme.el
deleted file mode 100644
index 5edb1a177..000000000
--- a/themes/dupre-theme.el
+++ /dev/null
@@ -1,63 +0,0 @@
-;;; dupre-theme.el --- A dark and elegant theme for Emacs -*- lexical-binding: t -*-
-
-;; Version: 1.0.0
-;; Author: Craig Jennings <c@cjennings.net>
-;; URL: https://github.com/cjennings/dupre-theme
-;; Keywords: dark theme faces
-
-;;; Commentary:
-
-;; A dark, warm theme for Emacs with 150+ face definitions.
-;; Originally based on the distinguished theme by Kim Silkebaekken.
-;;
-;; This theme is optimized for GUI Emacs. Terminal fallbacks are basic.
-;;
-;; Color palette follows a warm aesthetic:
-;; - Yellow (#d7af5f) as primary accent
-;; - Blue (#67809c) for keywords and navigation
-;; - Green (#a4ac64) for strings and success
-;; - Red (#d47c59) for functions and emphasis
-;;
-;; File structure:
-;; - dupre-theme.el (this file) - Theme definition and entry point
-;; - dupre-palette.el - Color definitions and semantic mappings
-;; - dupre-faces.el - All face specifications (~150 faces)
-
-;;; Code:
-
-(eval-and-compile
- ;; Add themes directory to load-path for require
- (when-let ((dir (file-name-directory (or load-file-name
- buffer-file-name
- (locate-library "dupre-theme")))))
- (unless (member dir load-path)
- (add-to-list 'load-path dir))))
-
-(require 'dupre-palette)
-(require 'dupre-faces)
-
-(defgroup dupre-theme nil
- "Options for the `dupre' colour theme."
- :group 'faces)
-
-(deftheme dupre
- "A dark and elegant theme for Emacs with warm undertones."
- :background-mode 'dark
- :kind 'color-scheme)
-
-;; Set theme variables
-(custom-theme-set-variables
- 'dupre
- '(frame-background-mode 'dark)
- '(fringe-mode 8))
-
-;; Apply all face definitions
-(dupre-theme-set-faces)
-
-;;;###autoload
-(when load-file-name
- (add-to-list 'custom-theme-load-path
- (file-name-as-directory (file-name-directory load-file-name))))
-
-(provide-theme 'dupre)
-;;; dupre-theme.el ends here