summaryrefslogtreecommitdiff
path: root/themes/dupre-palette.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-01-26 01:18:02 -0600
committerCraig Jennings <c@cjennings.net>2026-01-26 01:18:02 -0600
commit51418d3b375f5223b98a3b7865ab428886e5acbc (patch)
tree901d188584ead435abaf33efb7aa431bd04af6e5 /themes/dupre-palette.el
parent92e2b82170f77ef2b21686916485fb2e3f61efb6 (diff)
feat(theme): restructure dupre-theme into modular architecture
Split monolithic theme into three files following modus-themes pattern: - dupre-palette.el: 30 base colors + 28 semantic mappings - dupre-faces.el: 150+ face definitions organized by package - dupre-theme.el: thin entry point that loads palette and faces Applied 60-30-10 color design rule: - 60% neutrals (grays for comments, metadata, lower headings) - 30% signature blue (#67809c) for keywords, links, directories - 10% accents (gold for h1, green for strings, terracotta for functions)
Diffstat (limited to 'themes/dupre-palette.el')
-rw-r--r--themes/dupre-palette.el131
1 files changed, 131 insertions, 0 deletions
diff --git a/themes/dupre-palette.el b/themes/dupre-palette.el
new file mode 100644
index 00000000..b2451e81
--- /dev/null
+++ b/themes/dupre-palette.el
@@ -0,0 +1,131 @@
+;;; 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 "#151311")
+ (bg+0 "#151311")
+ (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 yellow))
+ "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