From f3cb5a6e26810432bd4e24a33e4193fa7f3b6c87 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 10 May 2026 01:05:57 +0200 Subject: [PATCH] IC --- config.el | 394 ++++++++++++++++++++++++++++++ custom/avy-region.el | 29 +++ custom/buffer-table.el | 199 +++++++++++++++ custom/meow.el | 129 ++++++++++ custom/ui.el | 13 + custom/unifiedlist.el | 28 +++ early-init.el | 20 ++ init.el | 148 +++++++++++ themes/MTF/MTF4-extended-theme.el | 142 +++++++++++ themes/MTF/MTF5-theme.el | 142 +++++++++++ themes/MTF/MTX16-theme.el | 129 ++++++++++ themes/camm/camm1-theme.el | 222 +++++++++++++++++ themes/camm/camm2-theme.el | 118 +++++++++ themes/camm/camm3-theme.el | 223 +++++++++++++++++ themes/camm/camm4-theme.el | 152 ++++++++++++ themes/camm/camm4-theme.txt | 152 ++++++++++++ themes/cutar-theme.el | 167 +++++++++++++ themes/cutarv32-theme.el | 167 +++++++++++++ themes/cutarv32_dark-theme.el | 167 +++++++++++++ 19 files changed, 2741 insertions(+) create mode 100644 config.el create mode 100644 custom/avy-region.el create mode 100644 custom/buffer-table.el create mode 100644 custom/meow.el create mode 100644 custom/ui.el create mode 100644 custom/unifiedlist.el create mode 100644 early-init.el create mode 100644 init.el create mode 100644 themes/MTF/MTF4-extended-theme.el create mode 100644 themes/MTF/MTF5-theme.el create mode 100644 themes/MTF/MTX16-theme.el create mode 100644 themes/camm/camm1-theme.el create mode 100644 themes/camm/camm2-theme.el create mode 100644 themes/camm/camm3-theme.el create mode 100644 themes/camm/camm4-theme.el create mode 100644 themes/camm/camm4-theme.txt create mode 100644 themes/cutar-theme.el create mode 100644 themes/cutarv32-theme.el create mode 100644 themes/cutarv32_dark-theme.el diff --git a/config.el b/config.el new file mode 100644 index 0000000..6101417 --- /dev/null +++ b/config.el @@ -0,0 +1,394 @@ +;;; config.el -*- lexical-binding: t; -*- + +;; ============================================================ +;; Custom +;; ============================================================ +(let ((custom-dir (expand-file-name "custom/" user-emacs-directory))) + (when (file-directory-p custom-dir) + (mapc #'load (directory-files custom-dir t "\\.el$")))) + +(add-to-list 'custom-theme-load-path (expand-file-name "themes/" user-emacs-directory)) + +;; ============================================================ +;; Keybindings +;; ============================================================ +(use-package general + :config + (general-def + :keymaps 'global + "C-S-c" #'my/system-copy + "C-S-x" #'my/system-cut + "C-S-v" #'my/system-paste + "C-z" #'undo + "C-S-z" #'undo-redo + ) + + (general-def + :keymaps 'override + "C-k" #'avy-kill-whole-line + "C-s C-f" #'avy-goto-char-timer + "C-s C-s C-f" #'my/avy-char-region + "C-s C-S-s" #'my/avy-line-region + "C-s C-l" #'consult-line + "C-s C-e" #'er/expand-region + "C-x C-b" #'buffer-table + "M-g g" #'avy-goto-line + "C-r" #'recenter-top-bottom + "C-s w" #'my/vterm-sync-here + "C-b" #'scroll-down-command + "C-" #'my/delete-word-backward) + + (general-define-key + :keymaps 'global + "C-w" nil) + ;; If you want certain keys to ONLY work in Meow Normal state, use :states. + ) + +;; ============================================================ +;; Settings, UI +;; ============================================================ +(setq kill-ring-max 1 + select-enable-clipboard nil + select-enable-primary nil + save-interprogram-paste-before-kill nil + xterm-extra-capabilities '(getSelection setSelection modifyOtherKeys) + mouse-drag-copy-region nil + truncate-lines nil + + display-line-numbers-type t + cursor-type 'bar + savehist-additional-variables '(kill-ring search-ring) + recentf-max-saved-items 75 + ) + +;; Modes +(global-hl-line-mode t ) +(global-display-line-numbers-mode 1) +(hl-line-mode 1) +(savehist-mode 1) +(global-clipetty-mode) + +;; Fonts +(set-face-attribute 'default nil :family "Fira Code" :height 120) +(set-face-attribute 'variable-pitch nil :family "Noto Sans" :height 140) + +;; Apply variable pitch to specific modes +(dolist (hook '(markdown-mode-hook org-mode-hook json-mode-hook)) + (add-hook hook (lambda () (buffer-face-set '(:family "Noto Sans" :height 140))))) + +(add-to-list 'auto-mode-alist '("\\.qd$" . markdown-mode)) +(add-to-list 'term-file-aliases '("xterm-256" . "xterm")) + +;; Recentf cleanup +(with-eval-after-load 'recentf + (run-at-time nil 600 #'recentf-cleanup) + (setq recentf-exclude '(".*/$"))) ;; don't include dirs + +;; ============================================================ +;; packages +;; ============================================================ + +(use-package emacs + :ensure nil + :custom + (tab-always-indent 'complete) + (TEXT-mode-ispell-word-completion nil) + (read-extended-command-predicate #'command-completion-default-include-p) + ) + +(use-package corfu + :init + (global-corfu-mode) + (corfu-popupinfo-mode) + :custom + (corfu-auto t) + (corfu-auto-delay 0.2) + (corfu-auto-prefix 2) + (corfu-popupinfo-delay '(0.5 . 0.3))) + +(use-package vertico + :config + :init + (vertico-mode)) + +(use-package mason + :config + :init + (mason-ensure)) + +(use-package marginalia + :config + :init + (marginalia-mode)) + +(use-package orderless + :custom + (completion-styles '(orderless basic)) + (completion-category-overrides '((file (styles partial-completion)))) + (completion-pcm-leading-wildcard t)) ;; Emacs 31: partial-completion behaves like substring + + +(use-package meow + :init (setq meow--kbd-kill-region "C-S-x") + :config + (setq meow-use-clipboard nil) + (meow-setup) + (meow-global-mode 1) + (setq meow-use-clipboard t)) + +(use-package avy + :config + (setq avy-timeout-seconds 0.25 + avy-style 'at-full + avy-keys (number-sequence ?a ?z))) + +(use-package treesit-auto + :custom + (treesit-auto-install 'prompt) + :config + (treesit-auto-add-to-auto-mode-alist 'all) + (global-treesit-auto-mode) + ) + +(use-package treesit-fold + :commands (treesit-fold-close + treesit-fold-close-all + treesit-fold-open + treesit-fold-toggle + treesit-fold-open-all + treesit-fold-mode + global-treesit-fold-mode + treesit-fold-open-recursively + treesit-fold-line-comment-mode) + + :custom + (treesit-fold-line-count-show t) + (treesit-fold-line-count-format " ▼") + + :config + (set-face-attribute 'treesit-fold-replacement-face nil + :foreground "#808080" + :box nil + :weight 'bold)) + +;; Systems and General Purpose +(add-hook 'c-ts-mode-hook #'treesit-fold-mode) +(add-hook 'c++-ts-mode-hook #'treesit-fold-mode) +(add-hook 'java-ts-mode-hook #'treesit-fold-mode) +(add-hook 'rust-ts-mode-hook #'treesit-fold-mode) +(add-hook 'go-ts-mode-hook #'treesit-fold-mode) +(add-hook 'ruby-ts-mode-hook #'treesit-fold-mode) + +;; Web and Frontend +(add-hook 'js-ts-mode-hook #'treesit-fold-mode) +(add-hook 'typescript-ts-mode-hook #'treesit-fold-mode) +(add-hook 'tsx-ts-mode-hook #'treesit-fold-mode) +(add-hook 'css-ts-mode-hook #'treesit-fold-mode) +(add-hook 'html-ts-mode-hook #'treesit-fold-mode) + +;; Scripting and Infrastructure +(add-hook 'bash-ts-mode-hook #'treesit-fold-mode) +(add-hook 'cmake-ts-mode-hook #'treesit-fold-mode) +(add-hook 'dockerfile-ts-mode-hook #'treesit-fold-mode) + +;; Data and Configuration +(add-hook 'json-ts-mode-hook #'treesit-fold-mode) +(add-hook 'toml-ts-mode-hook #'treesit-fold-mode) + +(add-hook 'emacs-lisp-mode-hook #'outline-minor-mode) +(add-hook 'lisp-interaction-mode-hook #'hs-minor-mode) ; scratch +(add-hook 'lisp-mode-hook #'outline-minor-mode) +(add-hook 'conf-mode-hook #'outline-minor-mode) +(add-hook 'markdown-mode-hook #'outline-minor-mode) +(add-hook 'diff-mode-hook #'outline-minor-mode) + +(use-package highlight-quoted + :hook (emacs-lisp-mode . highlight-quoted-mode)) + +(use-package highlight-defined + :hook (emacs-lisp-mode . highlight-defined-mode)) + +(use-package color-identifiers-mode + :hook (emacs-lisp-mode . color-identifiers-mode)) + +(use-package rainbow-delimiters + :hook + (prog-mode . rainbow-delimiters-mode) + (inferior-ess-mode . rainbow-delimiters-mode)) + +(use-package nerd-icons-completion + :after marginalia + :config + (nerd-icons-completion-mode) + (add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) + +(use-package nerd-icons-corfu) + +(use-package nerd-icons-dired + :hook + (dired-mode . nerd-icons-dired-mode)) + +(use-package smartparens + :init (smartparens-global-mode 1) + :config + (sp-pair "\"" "\"" :wrap "C-c \"") + (sp-pair "'" "'" :wrap "C-c '") + (sp-pair "<<" ">>" :wrap "C-c <")) + +(use-package indent-bars + :config + (setq indent-bars-prefer-character ?. + indent-bars-pattern "true" + indent-bars-width-frac 1 + indent-bars-pad-frac 0.2 + indent-bars-color-by-depth '(:regexp "outline-\\([0-9]+\\)" :blend 0.9) + indent-bars-highlight-current-depth '(:face default :blend 0.4) + ) + :init + (add-hook 'prog-mode-hook #'indent-bars-mode)) + +(use-package kirigami + :commands (kirigami-open-fold kirigami-open-fold-rec kirigami-close-fold + kirigami-toggle-fold kirigami-open-folds + kirigami-close-folds-except-current + kirigami-close-folds)) + +(use-package clipetty + :hook (after-init . global-clipetty-mode)) + +(use-package denote + :config + (setq denote-directory (list (expand-file-name "~/lyfi/SOR/Notes/")) + denote-file-type 'markdown-yaml + denote-prompts '(title subdirectory keywords))) + +(use-package colorful-mode + :init (setq colorful-allow-mouse-clicks nil)) + +;; Tree-sitter & LSP tweaks +(with-eval-after-load 'treesit + (setq treesit-font-lock-level 4)) + +(with-eval-after-load 'typescript-ts-mode + (setq typescript-ts-mode-indent-offset 2) + (defvaralias 'typescript-indent-level 'typescript-ts-mode-indent-offset)) + +(with-eval-after-load 'lsp-mode + (setq lsp-completion-provider :none)) + +;; ============================================================ +;; Functions +;; ============================================================ + +(defun my/system-copy (beg end) + "Copy region directly to system clipboard, bypassing Emacs' kill ring. +Uses wl-copy on Wayland GUI, and Clipetty (OSC 52) in TUI/SSH." + (interactive "r") + (unless (region-active-p) + (user-error "No active region to copy")) + (let ((text (buffer-substring-no-properties beg end))) + (if (display-graphic-p) + ;; GUI: Pipe text directly to Wayland clipboard + (let ((process-connection-type nil)) + (let ((proc (start-process "wl-copy" nil "wl-copy"))) + (process-send-string proc text) + (process-send-eof proc))) + ;; TUI/SSH: Use clipetty to send OSC 52 sequence to kitty + (if (fboundp 'clipetty-set-selection) + (clipetty-set-selection text) + (error "Clipetty not loaded. Ensure (global-clipetty-mode) is active"))) + (deactivate-mark) + (message "Copied to system clipboard"))) + +(defun my/system-cut (beg end) + "Cut region directly to system clipboard, bypassing the kill ring." + (interactive "r") + (my/system-copy beg end) + ;; delete-region deletes without adding to the kill ring + (delete-region beg end)) + +(defun my/system-paste () + "Paste from system clipboard directly to point, bypassing the kill ring." + (interactive) + (if (display-graphic-p) + ;; GUI: Read directly from Wayland clipboard and insert + (let ((text (shell-command-to-string "wl-paste -n"))) + (insert text)) + ;; TUI/SSH: Warn the user to use the terminal's native paste + (message "In a terminal, use your terminal emulator's native paste shortcut (e.g., Ctrl-Shift-V)."))) + + +(defun dired-follow-symlink () + "In dired, visit the file or directory at point by its true physical path." + (interactive) + (let ((filename (dired-get-file-for-visit))) + (if filename + (find-file (file-truename filename)) + (message "No file at point")))) + +(defun my/vterm-sync-here () + "Switch to vterm and instantly 'cd' to the current buffer's directory." + (interactive) + (let ((cwd default-directory)) + (vterm-toggle) + (vterm-send-string (format "cd %s" (shell-quote-argument cwd))) + (vterm-send-return))) + +(defun my/delete-word-backward () + "Delete the word and any preceding whitespace without affecting the kill ring." + (interactive) + (let ((start (point))) + (skip-chars-backward "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + (skip-chars-backward " \t") + (delete-region (point) start))) + +(defun my-modern-delete-word-backward () + "Delete a block of similar characters backward without using the kill ring. +Similar characters are grouped as: +1. Whitespace (including newlines) +2. Alphanumerics +3. Special characters/symbols" + (interactive) + (let ((end (point)) + (start (1- (point)))) + (when (>= start 1) + (let* ((first-char (char-before end)) + (first-type (my-get-char-type first-char))) + ;; Move start point backward as long as the character type matches + (while (and (>= start 1) + (string= first-type (my-get-char-type (char-before start)))) + (setq start (1- start))) + ;; Delete the range without adding to the kill ring + (delete-region start end))))) + +(defun my-get-char-type (char) + "Helper to categorize characters into three groups." + (let ((cat (char-category char))) + (cond + ((member cat '("space" "newline")) "whitespace") + ((member cat '("letter" "number")) "alphanum") + (t "special")))) + +;; Bind it to Ctrl-Backspace +;; Note: In many terminals, C-Backspace is sent as C-h or C-Delete. +;; This binding works in GUI Emacs. +(global-set-key (kbd "C-") 'my-modern-delete-word-backward) + + +;; ============================================================ +;; Theming, ui +;; ============================================================ +;; + +(my/apply-theme (selected-frame)) +;; Apply to all future frames (important for emacsclient users) +(add-hook 'after-make-frame-functions 'my/apply-theme) +;;fonts +(setq doom-font "Fira Code 12") +(setq doom-variable-pitch-font "Noto Sans 14") +(setq nerd-icons-font-family "Symbols Nerd Font Mono") +(defun my-set-buffer-font () + "Set a specific font for the current buffer only." + (buffer-face-set '(:family "Noto Sans" :height 140))) + +(add-hook 'after-make-frame-functions #'my/apply-theme) diff --git a/custom/avy-region.el b/custom/avy-region.el new file mode 100644 index 0000000..afef4f8 --- /dev/null +++ b/custom/avy-region.el @@ -0,0 +1,29 @@ +;;; ../../lyfi/configs/apps/doom/custom/avy-region.el -*- lexical-binding: t; -*- + +(defun my/avy-region (jump-fn &optional inclusive) + "Select region between two points chosen with JUMP-FN. +JUMP-FN is a command like `avy-goto-char-timer' or `avy-goto-line'. +When INCLUSIVE is non-nil, include the character at the end point." + (interactive) + (let (p1 p2) + (cl-labels ((do-jump () (call-interactively jump-fn) (point))) + (setq p1 (do-jump)) + (setq p2 (do-jump))) + (when (and p1 p2) + (let ((beg (min p1 p2)) + (end (max p1 p2))) + (push-mark beg nil t) + (goto-char end) + (when inclusive + (unless (eobp) (forward-char 1))))))) + +(defun my/avy-char-region () + "mark region between 2 chars using avy-char" + (interactive) + (my/avy-region 'avy-goto-char-timer t)) + +(defun my/avy-line-region () + "mark region between 2 lines using avy-line" + (interactive) + (my/avy-region 'avy-goto-line) + (forward-line 1)) diff --git a/custom/buffer-table.el b/custom/buffer-table.el new file mode 100644 index 0000000..786d28a --- /dev/null +++ b/custom/buffer-table.el @@ -0,0 +1,199 @@ +;;; buffer-table.el --- Tabular view of buffers and recent files -*- lexical-binding: t; -*- + +(require 'cl-lib) +(require 'recentf) + +(defgroup buffer-table nil + "Tabular view of buffers and recent files." + :group 'convenience) + +;; Faces for distinction +(defface buffer-table-open '((t :inherit font-lock-keyword-face :bold t)) "Face for open files.") +(defface buffer-table-recent '((t :inherit shadow)) "Face for recent closed files.") +(defface buffer-table-special '((t :inherit font-lock-comment-face)) "Face for internal buffers.") +(defface buffer-table-modified '((t :inherit error :bold t)) "Face for modified flag.") +(defface buffer-table-marked '((t :inherit warning :bold t)) "Face for marked entries.") + +;; Mark tracking - set of entry IDs currently marked +(defvar buffer-table--marked nil + "Set of marked entry IDs (buffer objects or file paths).") + +(defun buffer-table--get-entries () + "Collect all items and format them for tabulated-list-entries." + (let ((file-entries nil) + (recent-entries nil) + (special-entries nil) + (processed-files (make-hash-table :test 'equal))) + + ;; 1. Open File-visiting Buffers + (dolist (buf (buffer-list)) + (let ((file (buffer-file-name buf))) + (when (and file (not (string-prefix-p " " (buffer-name buf)))) + (puthash file t processed-files) + (push (list buf + (vector + (if (buffer-modified-p buf) (propertize "*" 'face 'buffer-table-modified) " ") + (propertize "File" 'face 'buffer-table-open) + (propertize (buffer-name buf) 'face 'buffer-table-open) + (abbreviate-file-name (file-name-directory file)) + (if (gethash buf buffer-table--marked) + (propertize "☑" 'face 'buffer-table-marked) + "☐"))) + file-entries)))) + + ;; 2. Recent Files (Closed) + (recentf-mode 1) + (dolist (file recentf-list) + (unless (gethash file processed-files) + (push (list file + (vector + " " + (propertize "Recent" 'face 'buffer-table-recent) + (propertize (file-name-nondirectory file) 'face 'buffer-table-recent) + (abbreviate-file-name (file-name-directory file)) + (if (gethash file buffer-table--marked) + (propertize "☑" 'face 'buffer-table-marked) + "☐"))) + recent-entries))) + + ;; 3. Special Buffers + (dolist (buf (buffer-list)) + (unless (or (buffer-file-name buf) (string-prefix-p " " (buffer-name buf))) + (push (list buf + (vector + (if (buffer-modified-p buf) (propertize "*" 'face 'buffer-table-modified) " ") + (propertize "Special" 'face 'buffer-table-special) + (propertize (buffer-name buf) 'face 'buffer-table-special) + "" + (if (gethash buf buffer-table--marked) + (propertize "☑" 'face 'buffer-table-marked) + "☐"))) + special-entries))) + + ;; Return in requested order: Special, then File, then Recent + (append (nreverse special-entries) + (nreverse file-entries) + (nreverse recent-entries)))) + +(defun buffer-table--refresh () + "Refresh the list." + (setq tabulated-list-entries (buffer-table--get-entries)) + (tabulated-list-print t)) + +(defun buffer-table-mark () + "Mark the entry at point." + (interactive) + (let ((id (tabulated-list-get-id))) + (when id + (puthash id t buffer-table--marked) + (buffer-table--refresh)))) + +(defun buffer-table-unmark () + "Unmark the entry at point." + (interactive) + (let ((id (tabulated-list-get-id))) + (when id + (remhash id buffer-table--marked) + (buffer-table--refresh)))) + +(defun buffer-table-mark-all () + "Mark all entries." + (interactive) + (dolist (entry tabulated-list-entries) + (puthash (car entry) t buffer-table--marked)) + (buffer-table--refresh)) + +(defun buffer-table-unmark-all () + "Unmark all entries." + (interactive) + (setq buffer-table--marked (make-hash-table)) + (buffer-table--refresh)) + +(defun buffer-table-kill-marked () + "Kill all marked buffers. For recent files, remove from recentf list." + (interactive) + (unless (hash-table-p buffer-table--marked) + (user-error "No entries marked")) + (when (or (null (buffer-table--marked-count)) + (zerop (buffer-table--marked-count))) + (user-error "No entries marked")) + + (let ((buffers-to-kill nil) + (recent-to-remove nil)) + (maphash (lambda (id _) + (if (bufferp id) + (push id buffers-to-kill) + (push id recent-to-remove))) + buffer-table--marked) + + ;; Kill buffers + (when buffers-to-kill + (let ((count (length buffers-to-kill))) + (dolist (buf buffers-to-kill) + (when (buffer-live-p buf) + (kill-buffer buf))) + (message "Killed %d buffer%s" count (if (> count 1) "s" "")))) + + ;; Remove from recentf + (when recent-to-remove + (let ((count (length recent-to-remove))) + (dolist (file recent-to-remove) + (setq recentf-list (delq file recentf-list))) + (recentf-save-list) + (message "Removed %d file%s from recentf" count (if (> count 1) "s" "")))) + + (setq buffer-table--marked (make-hash-table)) + (buffer-table--refresh))) + +(defun buffer-table--marked-count () + "Return the number of marked entries." + (hash-table-count buffer-table--marked)) + +(defun buffer-table-visit () + "Visit the buffer or file at point." + (interactive) + (let ((id (tabulated-list-get-id))) + (cond + ((bufferp id) (switch-to-buffer id)) + ((stringp id) (find-file id)) + (t (user-error "Nothing to visit here"))))) + +(defun buffer-table-revert () + "Revert the table, clearing marks." + (interactive) + (setq buffer-table--marked (make-hash-table)) + (buffer-table--refresh)) + +(define-derived-mode buffer-table-mode tabulated-list-mode "Buffer-Table" + "Major mode for a unified buffer and file list." + (setq buffer-table--marked (make-hash-table)) + (setq tabulated-list-format + [("S" 1 t) ; Status (Modified) + ("Type" 8 t) ; File, Recent, or Special + ("Name" 35 t) ; File/Buffer name + ("Path" 0 t) ; Directory path (flexible width) + ("M" 3 t)]) ; Mark column + (setq tabulated-list-padding 2) + (setq tabulated-list-sort-key '("Type" . nil)) + (add-hook 'tabulated-list-revert-hook #'buffer-table--refresh nil t) + (tabulated-list-init-header)) + +(define-key buffer-table-mode-map (kbd "RET") #'buffer-table-visit) +(define-key buffer-table-mode-map (kbd "g") #'buffer-table-revert) +(define-key buffer-table-mode-map (kbd "m") #'buffer-table-mark) +(define-key buffer-table-mode-map (kbd "M") #'buffer-table-mark-all) +(define-key buffer-table-mode-map (kbd "u") #'buffer-table-unmark-all) +(define-key buffer-table-mode-map (kbd "U") #'buffer-table-unmark) +(define-key buffer-table-mode-map (kbd "D") #'buffer-table-kill-marked) + +;;;###autoload +(defun buffer-table () + "Display the unified buffer and file table." + (interactive) + (let ((buf (get-buffer-create "*Buffer Table*"))) + (with-current-buffer buf + (buffer-table-mode) + (buffer-table--refresh)) + (switch-to-buffer buf))) + +(provide 'buffer-table) diff --git a/custom/meow.el b/custom/meow.el new file mode 100644 index 0000000..fbd13ff --- /dev/null +++ b/custom/meow.el @@ -0,0 +1,129 @@ +;;; ../../lyfi/configs/apps/doom/custom/meow.el -*- lexical-binding: t; -*- +;;Custom Meow Cheatsheet Renderer + +(defvar my-meow-board-grid + '(("1" "2" "3" "4" "5" "6" "7" "8" "9" "0") + ("q" "w" "e" "r" "t" "y" "u" "i" "o" "p") + ("a" "s" "d" "f" "g" "h" "j" "k" "l" ";") + ("z" "x" "c" "v" "b" "n" "m" "," "." "/" "'")) + "The physical layout of the board as a 2D array.") + +(defun my-meow-get-cmd-name (key) + "Helper to get the short name of a command for a given key, or a placeholder." + (let ((cmd (key-binding key))) + (if cmd + (meow--short-command-name cmd) + (if (member key '("TAB" "SFT" "CTL" "CAPS" "GUI" "ALT" "MO1" "SPC" "ENT" "BKSL" "LMB" "RMB" "UP" "DN" "N2")) + key + "")))) + +(defun my-meow-render-grid () + "Generates a clean table of Meow commands with base and shift layers." + (let ((output "")) + (dolist (row my-meow-board-grid) + (let ((row-lower "") + (row-upper "")) + (dolist (key row) + (let* ((low-name (my-meow-get-cmd-name key)) + (up-key (upcase key)) + (up-name (my-meow-get-cmd-name up-key))) + ;; Build the lower layer string + (setq row-lower (concat row-lower + (format "[%s = %-12s] " key low-name))) + ;; Build the upper layer string + (setq row-upper (concat row-upper + (format "[%s = %-12s] " up-key up-name))))) + ;; Append both layers, then a newline for a gap between physical rows + (setq output (concat output row-lower "\n" row-upper "\n\n")))) + output)) + +(defun my-meow-cheatsheet () + "Custom cheatsheet that uses a grid instead of fragile ASCII art." + (interactive) + (let ((buf (get-buffer-create "*Meow Cheatsheet*"))) + (with-current-buffer buf + (text-mode) + (setq buffer-read-only nil) + (erase-buffer) + (insert "Meow Custom Layout Cheatsheet\n") + (insert "====================================================================================================\n\n") + (insert (my-meow-render-grid)) + (insert "\n====================================================================================================\n") + (insert meow--cheatsheet-note) + (insert (meow--render-cheatsheet-thing-table)) + (add-face-text-property (point-min) (point-max) 'meow-cheatsheet-command) + (setq buffer-read-only t)) + (switch-to-buffer buf))) + +(defun meow-setup () + ;; We no longer need the physical-layout strings because we use my-meow-board-grid + (meow-motion-overwrite-define-key + '("j" . meow-next) + '("k" . meow-prev) + '("" . mode-line-other-buffer)) + + (meow-leader-define-key + '("/" . meow-keypad-describe-key) + '("?" . my-meow-cheatsheet)) ;; Use our new custom renderer here + + (meow-normal-define-key + '("0" . meow-expand-0) + '("9" . meow-expand-9) + '("8" . meow-expand-8) + '("7" . meow-expand-7) + '("6" . meow-expand-6) + '("5" . meow-expand-5) + '("4" . meow-expand-4) + '("3" . meow-expand-3) + '("2" . meow-expand-2) + '("1" . meow-expand-1) + '("-" . negative-argument) + '(";" . meow-reverse) + '("," . meow-inner-of-thing) + '("." . meow-bounds-of-thing) + '("[" . meow-beginning-of-thing) + '("]" . meow-end-of-thing) + '("a" . meow-append) + '("A" . meow-open-below) + '("b" . meow-back-word) + '("B" . meow-back-symbol) + '("c" . meow-change) + '("d" . meow-delete) + '("D" . meow-backward-delete) + '("e" . meow-next-word) + '("E" . meow-next-symbol) + '("f" . meow-find) + '("g" . meow-cancel-selection) + '("G" . meow-grab) + '("h" . meow-left) + '("H" . meow-left-expand) + '("i" . meow-insert) + '("I" . meow-open-above) + '("j" . meow-next) + '("J" . meow-next-expand) + '("k" . meow-prev) + '("K" . meow-prev-expand) + '("l" . meow-right) + '("L" . meow-right-expand) + '("m" . meow-join) + '("n" . meow-search) + '("o" . meow-block) + '("O" . meow-to-block) + '("p" . meow-yank) + '("q" . meow-quit) + '("Q" . meow-goto-line) + '("r" . meow-replace) + '("R" . meow-swap-grab) + '("s" . meow-kill) + '("t" . meow-till) + '("u" . meow-undo) + '("U" . meow-undo-in-selection) + '("v" . meow-visit) + '("w" . meow-mark-word) + '("W" . meow-mark-symbol) + '("x" . meow-line) + '("X" . meow-goto-line) + '("y" . meow-save) + '("Y" . meow-sync-grab) + '("z" . meow-pop-selection) + '("'" . repeat))) diff --git a/custom/ui.el b/custom/ui.el new file mode 100644 index 0000000..ecdcacc --- /dev/null +++ b/custom/ui.el @@ -0,0 +1,13 @@ +;;; ../../lyfi/configs/apps/doom/custom/ui.el -*- lexical-binding: t; -*- + + +(defun my/apply-theme (frame) + "Apply a specific theme based on whether the FRAME is graphic or TUI." + (select-frame frame) + (if (display-graphic-p frame) + (progn + (mapc #'disable-theme custom-enabled-themes) + (load-theme 'cutarv32 t)) ;; Your GUI theme + (progn + (mapc #'disable-theme custom-enabled-themes) + (load-theme 'cutarv32_dark t)))) ;; Your TUI theme diff --git a/custom/unifiedlist.el b/custom/unifiedlist.el new file mode 100644 index 0000000..2d8d182 --- /dev/null +++ b/custom/unifiedlist.el @@ -0,0 +1,28 @@ +;;; ../../lyfi/configs/apps/doom/custom/unifiedlist.el -*- lexical-binding: t; -*- + +(defun my/get-unified-list () + "Combine buffers and recentf into a list for tabulated-list-mode." + (let ((items '())) + ;; Add Live Buffers + (dolist (buf (buffer-list)) + (with-current-buffer buf + (push (list buf (vector (buffer-name) "Live" (format-mode-line mode-name) (or (buffer-file-name) ""))) items))) + ;; Add Recent Files (if not already open) + (dolist (file recentf-list) + (unless (get-file-buffer file) + (push (list file (vector (file-name-nondirectory file) "Recent" "File" file)) items))) + (nreverse items))) + +(define-derived-mode my-unified-list-mode tabulated-list-mode "Unified-List" + (setq tabulated-list-format [("Name" 30 t) + ("Status" 10 t) + ("Mode" 15 t) + ("Path" 0 t)]) + (setq tabulated-list-entries #'my/get-unified-list) + (tabulated-list-init-header)) + +(defun my/open-unified-list () + (interactive) + (pop-to-buffer "*Unified Switcher*") + (my-unified-list-mode) + (tabulated-list-print)) diff --git a/early-init.el b/early-init.el new file mode 100644 index 0000000..ff8ae7b --- /dev/null +++ b/early-init.el @@ -0,0 +1,20 @@ +;;; early-init.el -*- lexical-binding: t; -*- + +;; Prevent package.el from loading at startup (elpaca handles it) +(setq package-enable-at-startup nil) + +;; Disable UI elements early for faster frame rendering +(setq inhibit-startup-screen t + inhibit-startup-echo-area-message user-login-name + initial-scratch-message nil + initial-major-mode 'fundamental-mode + frame-inhibit-implied-resize t + garbage-collection-messages t) + +;; Temporarily raise GC threshold during startup +(setq gc-cons-threshold most-positive-fixnum + gc-cons-percentage 0.6) + +;; Disable UI chrome +(dolist (mode '(menu-bar-mode tool-bar-mode scroll-bar-mode)) + (when (fboundp mode) (funcall mode -1))) diff --git a/init.el b/init.el new file mode 100644 index 0000000..5a49d34 --- /dev/null +++ b/init.el @@ -0,0 +1,148 @@ +;;; init.el -*- lexical-binding: t; -*- +;;elpaca +(defvar elpaca-installer-version 0.12) +(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) +(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory)) +(defvar elpaca-sources-directory (expand-file-name "sources/" elpaca-directory)) +(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git" + :ref nil :depth 1 :inherit ignore + :files (:defaults "elpaca-test.el" (:exclude "extensions")) + :build (:not elpaca-activate))) +(let* ((repo (expand-file-name "elpaca/" elpaca-sources-directory)) + (build (expand-file-name "elpaca/" elpaca-builds-directory)) + (order (cdr elpaca-order)) + (default-directory repo)) + (add-to-list 'load-path (if (file-exists-p build) build repo)) + (unless (file-exists-p repo) + (make-directory repo t) + (when (<= emacs-major-version 28) (require 'subr-x)) + (condition-case-unless-debug err + (if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) + ((zerop (apply #'call-process `("git" nil ,buffer t "clone" + ,@(when-let* ((depth (plist-get order :depth))) + (list (format "--depth=%d" depth) "--no-single-branch")) + ,(plist-get order :repo) ,repo)))) + ((zerop (call-process "git" nil buffer t "checkout" + (or (plist-get order :ref) "--")))) + (emacs (concat invocation-directory invocation-name)) + ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" + "--eval" "(byte-recompile-directory \".\" 0 'force)"))) + ((require 'elpaca)) + ((elpaca-generate-autoloads "elpaca" repo))) + (progn (message "%s" (buffer-string)) (kill-buffer buffer)) + (error "%s" (with-current-buffer buffer (buffer-string)))) + ((error) (warn "%s" err) (delete-directory repo 'recursive)))) + (unless (require 'elpaca-autoloads nil t) + (require 'elpaca) + (elpaca-generate-autoloads "elpaca" repo) + (let ((load-source-file-function nil)) (load "./elpaca-autoloads")))) +(add-hook 'after-init-hook #'elpaca-process-queues) +(elpaca `(,@elpaca-order)) +(elpaca-wait) + +;; emacs 30 fix +;;(add-to-list 'elpaca-ignored-dependencies 'compat) + +;; ============================================================================== +;; CORE UI & INTERFACE +;; ============================================================================== +(elpaca compat) +(elpaca general) ;; Keybindings +(elpaca vertico) ;; Vertical completion +(elpaca orderless) ;; Filtering for Consult/Vertico +(elpaca marginalia) ;; Annotations in the minibuffer +(elpaca corfu) ;; In-buffer completion +(elpaca nerd-icons) +(elpaca nerd-icons-completion) +(elpaca nerd-icons-dired) +(elpaca nerd-icons-corfu) +(elpaca-wait) ;; Ensure UI is ready before loading tools + +;; ============================================================================== +;; EDITING & NAVIGATION +;; ============================================================================== +(elpaca meow) ;; Modal editing +(elpaca avy) ;; Fast jumping +(elpaca smartparens) +(elpaca expand-region) +(elpaca undo-fu) +(elpaca vundo) ;; Visual undo tree +(elpaca xclip) +(elpaca clipetty) +(elpaca embark) ;; Contextual actions +(elpaca kirigami) ;; Selection/Editing +(elpaca jinx) ;; Fast duplicate lines + +;; ============================================================================== +;; CODE ANALYSIS & VISUALS +;; ============================================================================== +(elpaca treesit-auto) +(elpaca treesit-fold) +(elpaca highlight-quoted) +(elpaca highlight-defined) +(elpaca color-identifiers-mode) +(elpaca rainbow-delimiters) +(elpaca indent-bars) +(elpaca outline-indent) + +;; ============================================================================== +;; LSP & DEVELOPMENT +;; ============================================================================== +(elpaca mason) ;; LSP server manager +(elpaca lsp-mode) +(elpaca lsp-ui) +(elpaca consult-lsp) + +;; ============================================================================== +;; LANGUAGE MODES +;; ============================================================================== +(elpaca kdl-mode) +(elpaca csv-mode) + +;; ============================================================================== +;; UTILITIES +;; ============================================================================== +(elpaca consult) ;; Enhanced search/navigation +(elpaca vterm) +(elpaca vterm-toggle) +(elpaca colorful-mode) +;;(elpaca dirvish) ;;broken on emacs 30 +(elpaca transient) +(elpaca magit) +(elpaca casual) +;; ============================================================================== +;; KNOWLEDGE MANAGEMENT (ZK/DENOTE) +;; ============================================================================== +(elpaca denote) +(elpaca consult-denote) +(elpaca denote-menu) +(elpaca zk) +(elpaca zk-index) +(elpaca-wait) + +;; ============================================================================== +;; ELPACA CONFIGURATION +;; ============================================================================== +(elpaca elpaca-use-package + ;; Automatically adds :ensure t and :defer t to use-package declarations + (elpaca-use-package-mode) + (setq elpaca-use-package-by-default t)) + +(elpaca-wait) + + +(load (expand-file-name "config.el" user-emacs-directory)) +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(custom-safe-themes + '("faaccacbb368285948d610df3814315fa5f7727358ddb77ad8dd16d15cd58d9f" + default))) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) diff --git a/themes/MTF/MTF4-extended-theme.el b/themes/MTF/MTF4-extended-theme.el new file mode 100644 index 0000000..76ba9f1 --- /dev/null +++ b/themes/MTF/MTF4-extended-theme.el @@ -0,0 +1,142 @@ +;;; themes/MTF4-extended-theme.el -*- lexical-binding: t; -*- + +;; MTF4-extended-theme.el +;; A brighter, high-contrast light theme based on MTF4 with extended color palette + +(deftheme MTF4-extended + "A brighter, high-contrast light theme with extended color palette based on MTF4.") + +(let ( + ;; Core colors - Bright high-contrast palette + (bg-primary "#FFFFFF") + (bg-secondary "#F8F9FA") + (bg-tertiary "#F0F0F0") + (bg-highlight "#E0E0FF") + (bg-region "#C0C0FF") + + (fg-primary "#202020") + (fg-secondary "#444444") + (fg-tertiary "#666666") + (fg-comment "#8D8D84") + + ;; Syntax colors - Bright and distinct + (syntax-magenta "#EF89DF") + (syntax-blue "#508AE0") + (syntax-purple "#6434A3") + (syntax-green "#88D26E") + (syntax-teal "#008080") + (syntax-red "#FF6B6B") + (syntax-orange "#FFB347") + (syntax-cyan "#89DAFF") + + ;; UI colors + (ui-cursor "#6434A3") ; Purple cursor for visibility + (ui-fringe "#F8F9FA") ; Subtle fringe + (ui-mode-line "#508AE0") ; Bright blue mode line + (ui-mode-line-inactive "#C0C0C0") + (ui-search "#C0FFC0") ; Bright green search + (ui-search-fail "#FFC0C0") ; Bright red for failed search + ) + + (custom-theme-set-faces + 'MTF4-extended + + ;; Basic faces - High contrast foundation + `(default ((t (:background ,bg-primary :foreground ,fg-primary)))) + `(cursor ((t (:background ,ui-cursor)))) + `(fringe ((t (:background ,ui-fringe)))) + `(hl-line ((t (:background ,bg-highlight)))) + `(highlight ((t (:background ,bg-highlight)))) + `(region ((t (:background ,bg-region :foreground ,fg-primary)))) + `(secondary-selection ((t (:background ,syntax-cyan :foreground ,fg-primary)))) + `(lazy-highlight ((t (:background ,ui-search :foreground ,fg-primary)))) + + ;; Mode line - Bright and clear + `(mode-line ((t (:foreground "white" :background ,ui-mode-line :box nil)))) + `(mode-line-inactive ((t (:foreground ,fg-primary :background ,ui-mode-line-inactive :box nil)))) + `(mode-line-buffer-id ((t (:foreground "white" :weight bold)))) + `(mode-line-emphasis ((t (:foreground "white" :weight bold)))) + `(mode-line-highlight ((t (:foreground "white")))) + + ;; Syntax highlighting - Bright, distinct colors + `(font-lock-builtin-face ((t (:foreground ,syntax-purple)))) + `(font-lock-comment-face ((t (:foreground ,fg-comment :slant italic)))) + `(font-lock-comment-delimiter-face ((t (:foreground ,fg-comment)))) + `(font-lock-constant-face ((t (:foreground ,syntax-magenta)))) + `(font-lock-doc-face ((t (:foreground ,syntax-green)))) + `(font-lock-function-name-face ((t (:foreground ,syntax-blue)))) + `(font-lock-keyword-face ((t (:foreground ,syntax-purple :weight bold)))) + `(font-lock-string-face ((t (:foreground ,syntax-teal)))) + `(font-lock-type-face ((t (:foreground ,syntax-green)))) + `(font-lock-variable-name-face ((t (:foreground ,syntax-orange)))) + `(font-lock-preprocessor-face ((t (:foreground ,syntax-purple)))) + `(font-lock-warning-face ((t (:foreground ,syntax-red :weight bold)))) + `(font-lock-error-face ((t (:foreground ,syntax-red :weight bold)))) + + ;; Search and matching + `(isearch ((t (:background ,ui-search :foreground ,fg-primary)))) + `(isearch-fail ((t (:background ,ui-search-fail :foreground ,fg-primary)))) + `(match ((t (:background ,syntax-green :foreground ,bg-primary)))) + + ;; Minibuffer + `(minibuffer-prompt ((t (:foreground ,syntax-blue :weight bold)))) + + ;; Line numbers + `(line-number ((t (:foreground ,fg-comment :background ,bg-secondary)))) + `(line-number-current-line ((t (:foreground ,syntax-blue :background ,bg-tertiary :weight bold)))) + + ;; Diff + `(diff-added ((t (:background "#E0FFE0" :foreground ,syntax-green)))) + `(diff-removed ((t (:background "#FFE0E0" :foreground ,syntax-red)))) + `(diff-changed ((t (:background "#FFFFE0" :foreground ,syntax-orange)))) + + ;; Whitespace + `(whitespace-line ((t (:foreground ,syntax-red :background "#FFFF88")))) + `(whitespace-tab ((t (:foreground "#E0E0E0" :background "white")))) + `(whitespace-hspace ((t (:foreground "#E0E0E0")))) + + ;; Links + `(link ((t (:foreground ,syntax-blue :underline t)))) + `(link-visited ((t (:foreground ,syntax-purple :underline t)))) + + ;; Org-mode + `(org-level-1 ((t (:foreground ,syntax-purple :weight bold :height 1.2)))) + `(org-level-2 ((t (:foreground ,syntax-blue :weight bold)))) + `(org-level-3 ((t (:foreground ,syntax-magenta :weight bold)))) + `(org-done ((t (:foreground ,syntax-green :weight bold)))) + `(org-todo ((t (:foreground ,syntax-red :weight bold)))) + `(org-date ((t (:foreground ,syntax-teal)))) + `(org-block ((t (:background ,bg-secondary :foreground ,fg-primary)))) + `(org-code ((t (:foreground ,syntax-orange)))) + + ;; Terminal compatibility + `(term-color-black ((t (:foreground ,fg-primary :background ,fg-primary)))) + `(term-color-red ((t (:foreground ,syntax-red :background ,syntax-red)))) + `(term-color-green ((t (:foreground ,syntax-green :background ,syntax-green)))) + `(term-color-yellow ((t (:foreground ,syntax-orange :background ,syntax-orange)))) + `(term-color-blue ((t (:foreground ,syntax-blue :background ,syntax-blue)))) + `(term-color-magenta ((t (:foreground ,syntax-magenta :background ,syntax-magenta)))) + `(term-color-cyan ((t (:foreground ,syntax-teal :background ,syntax-teal)))) + `(term-color-white ((t (:foreground ,bg-primary :background ,bg-primary)))) + + ;; Company (autocompletion) + `(company-tooltip ((t (:background ,bg-secondary :foreground ,fg-primary)))) + `(company-tooltip-selection ((t (:background ,syntax-blue :foreground "white")))) + `(company-tooltip-common ((t (:foreground ,syntax-purple)))) + `(company-scrollbar-bg ((t (:background ,bg-tertiary)))) + `(company-scrollbar-fg ((t (:background ,fg-comment)))) + + ;; Ivy/Helm + `(ivy-current-match ((t (:background ,syntax-blue :foreground "white")))) + `(ivy-minibuffer-match-face-1 ((t (:foreground ,fg-tertiary)))) + `(ivy-minibuffer-match-face-2 ((t (:foreground ,syntax-purple :weight bold)))) + `(ivy-minibuffer-match-face-3 ((t (:foreground ,syntax-magenta)))) + `(ivy-minibuffer-match-face-4 ((t (:foreground ,syntax-green)))) + + ;; Dired + `(dired-directory ((t (:foreground ,syntax-blue :weight bold)))) + `(dired-flagged ((t (:foreground ,syntax-red)))) + `(dired-symlink ((t (:foreground ,syntax-magenta)))) + )) + +(provide-theme 'MTF4-extended) diff --git a/themes/MTF/MTF5-theme.el b/themes/MTF/MTF5-theme.el new file mode 100644 index 0000000..76ba9f1 --- /dev/null +++ b/themes/MTF/MTF5-theme.el @@ -0,0 +1,142 @@ +;;; themes/MTF4-extended-theme.el -*- lexical-binding: t; -*- + +;; MTF4-extended-theme.el +;; A brighter, high-contrast light theme based on MTF4 with extended color palette + +(deftheme MTF4-extended + "A brighter, high-contrast light theme with extended color palette based on MTF4.") + +(let ( + ;; Core colors - Bright high-contrast palette + (bg-primary "#FFFFFF") + (bg-secondary "#F8F9FA") + (bg-tertiary "#F0F0F0") + (bg-highlight "#E0E0FF") + (bg-region "#C0C0FF") + + (fg-primary "#202020") + (fg-secondary "#444444") + (fg-tertiary "#666666") + (fg-comment "#8D8D84") + + ;; Syntax colors - Bright and distinct + (syntax-magenta "#EF89DF") + (syntax-blue "#508AE0") + (syntax-purple "#6434A3") + (syntax-green "#88D26E") + (syntax-teal "#008080") + (syntax-red "#FF6B6B") + (syntax-orange "#FFB347") + (syntax-cyan "#89DAFF") + + ;; UI colors + (ui-cursor "#6434A3") ; Purple cursor for visibility + (ui-fringe "#F8F9FA") ; Subtle fringe + (ui-mode-line "#508AE0") ; Bright blue mode line + (ui-mode-line-inactive "#C0C0C0") + (ui-search "#C0FFC0") ; Bright green search + (ui-search-fail "#FFC0C0") ; Bright red for failed search + ) + + (custom-theme-set-faces + 'MTF4-extended + + ;; Basic faces - High contrast foundation + `(default ((t (:background ,bg-primary :foreground ,fg-primary)))) + `(cursor ((t (:background ,ui-cursor)))) + `(fringe ((t (:background ,ui-fringe)))) + `(hl-line ((t (:background ,bg-highlight)))) + `(highlight ((t (:background ,bg-highlight)))) + `(region ((t (:background ,bg-region :foreground ,fg-primary)))) + `(secondary-selection ((t (:background ,syntax-cyan :foreground ,fg-primary)))) + `(lazy-highlight ((t (:background ,ui-search :foreground ,fg-primary)))) + + ;; Mode line - Bright and clear + `(mode-line ((t (:foreground "white" :background ,ui-mode-line :box nil)))) + `(mode-line-inactive ((t (:foreground ,fg-primary :background ,ui-mode-line-inactive :box nil)))) + `(mode-line-buffer-id ((t (:foreground "white" :weight bold)))) + `(mode-line-emphasis ((t (:foreground "white" :weight bold)))) + `(mode-line-highlight ((t (:foreground "white")))) + + ;; Syntax highlighting - Bright, distinct colors + `(font-lock-builtin-face ((t (:foreground ,syntax-purple)))) + `(font-lock-comment-face ((t (:foreground ,fg-comment :slant italic)))) + `(font-lock-comment-delimiter-face ((t (:foreground ,fg-comment)))) + `(font-lock-constant-face ((t (:foreground ,syntax-magenta)))) + `(font-lock-doc-face ((t (:foreground ,syntax-green)))) + `(font-lock-function-name-face ((t (:foreground ,syntax-blue)))) + `(font-lock-keyword-face ((t (:foreground ,syntax-purple :weight bold)))) + `(font-lock-string-face ((t (:foreground ,syntax-teal)))) + `(font-lock-type-face ((t (:foreground ,syntax-green)))) + `(font-lock-variable-name-face ((t (:foreground ,syntax-orange)))) + `(font-lock-preprocessor-face ((t (:foreground ,syntax-purple)))) + `(font-lock-warning-face ((t (:foreground ,syntax-red :weight bold)))) + `(font-lock-error-face ((t (:foreground ,syntax-red :weight bold)))) + + ;; Search and matching + `(isearch ((t (:background ,ui-search :foreground ,fg-primary)))) + `(isearch-fail ((t (:background ,ui-search-fail :foreground ,fg-primary)))) + `(match ((t (:background ,syntax-green :foreground ,bg-primary)))) + + ;; Minibuffer + `(minibuffer-prompt ((t (:foreground ,syntax-blue :weight bold)))) + + ;; Line numbers + `(line-number ((t (:foreground ,fg-comment :background ,bg-secondary)))) + `(line-number-current-line ((t (:foreground ,syntax-blue :background ,bg-tertiary :weight bold)))) + + ;; Diff + `(diff-added ((t (:background "#E0FFE0" :foreground ,syntax-green)))) + `(diff-removed ((t (:background "#FFE0E0" :foreground ,syntax-red)))) + `(diff-changed ((t (:background "#FFFFE0" :foreground ,syntax-orange)))) + + ;; Whitespace + `(whitespace-line ((t (:foreground ,syntax-red :background "#FFFF88")))) + `(whitespace-tab ((t (:foreground "#E0E0E0" :background "white")))) + `(whitespace-hspace ((t (:foreground "#E0E0E0")))) + + ;; Links + `(link ((t (:foreground ,syntax-blue :underline t)))) + `(link-visited ((t (:foreground ,syntax-purple :underline t)))) + + ;; Org-mode + `(org-level-1 ((t (:foreground ,syntax-purple :weight bold :height 1.2)))) + `(org-level-2 ((t (:foreground ,syntax-blue :weight bold)))) + `(org-level-3 ((t (:foreground ,syntax-magenta :weight bold)))) + `(org-done ((t (:foreground ,syntax-green :weight bold)))) + `(org-todo ((t (:foreground ,syntax-red :weight bold)))) + `(org-date ((t (:foreground ,syntax-teal)))) + `(org-block ((t (:background ,bg-secondary :foreground ,fg-primary)))) + `(org-code ((t (:foreground ,syntax-orange)))) + + ;; Terminal compatibility + `(term-color-black ((t (:foreground ,fg-primary :background ,fg-primary)))) + `(term-color-red ((t (:foreground ,syntax-red :background ,syntax-red)))) + `(term-color-green ((t (:foreground ,syntax-green :background ,syntax-green)))) + `(term-color-yellow ((t (:foreground ,syntax-orange :background ,syntax-orange)))) + `(term-color-blue ((t (:foreground ,syntax-blue :background ,syntax-blue)))) + `(term-color-magenta ((t (:foreground ,syntax-magenta :background ,syntax-magenta)))) + `(term-color-cyan ((t (:foreground ,syntax-teal :background ,syntax-teal)))) + `(term-color-white ((t (:foreground ,bg-primary :background ,bg-primary)))) + + ;; Company (autocompletion) + `(company-tooltip ((t (:background ,bg-secondary :foreground ,fg-primary)))) + `(company-tooltip-selection ((t (:background ,syntax-blue :foreground "white")))) + `(company-tooltip-common ((t (:foreground ,syntax-purple)))) + `(company-scrollbar-bg ((t (:background ,bg-tertiary)))) + `(company-scrollbar-fg ((t (:background ,fg-comment)))) + + ;; Ivy/Helm + `(ivy-current-match ((t (:background ,syntax-blue :foreground "white")))) + `(ivy-minibuffer-match-face-1 ((t (:foreground ,fg-tertiary)))) + `(ivy-minibuffer-match-face-2 ((t (:foreground ,syntax-purple :weight bold)))) + `(ivy-minibuffer-match-face-3 ((t (:foreground ,syntax-magenta)))) + `(ivy-minibuffer-match-face-4 ((t (:foreground ,syntax-green)))) + + ;; Dired + `(dired-directory ((t (:foreground ,syntax-blue :weight bold)))) + `(dired-flagged ((t (:foreground ,syntax-red)))) + `(dired-symlink ((t (:foreground ,syntax-magenta)))) + )) + +(provide-theme 'MTF4-extended) diff --git a/themes/MTF/MTX16-theme.el b/themes/MTF/MTX16-theme.el new file mode 100644 index 0000000..ceabf33 --- /dev/null +++ b/themes/MTF/MTX16-theme.el @@ -0,0 +1,129 @@ +;;; themes/MTX16.el -*- lexical-binding: t; -*- + +;; my-extended-theme.el +;; A high-contrast Emacs theme based on the extended color palette + +(deftheme MTX16 "A high-contrast theme with extended color palette") + +(let ( + ;; Base colors - High contrast neutrals + (base00 "#eef0f0") ; Background + (base01 "#F8F9FA") ; Lighter background (status bars, line numbers) + (base02 "#F0F0F0") ; Selection background, current line + (base03 "#BBBBBB") ; Comments, invisible + (base04 "#8D8D84") ; Dark foreground (disabled) + (base05 "#666666") ; Default foreground (less important) + (base06 "#444444") ; Default foreground + (base07 "#333333") ; Strong foreground (important text) + (base08 "#FF6B6B") ; Red: errors, deleted + (base09 "#FFB347") ; Orange: warnings + (base0A "#88D26E") ; Green: success, strings + (base0B "#9EBD6E") ; Light green: strings alt + (base0C "#508AE0") ; Blue: functions, info + (base0D "#6434A3") ; Purple: keywords, variables + (base0E "#EF89DF") ; Magenta: constants, special + (base0F "#A080CA") ; Light purple: operators + + ;; Additional GUI-specific enhancements + (highlight "#CEF") + (region "#7DF") + (accent-strong "#508AE0") + (accent-subtle "#BEEFFF") + ) + + (custom-theme-set-faces + 'MTX16 + + ;; Basic faces + `(default ((t (:background ,base00 :foreground ,base07)))) + `(cursor ((t (:background ,base07)))) + `(fringe ((t (:background ,base01)))) + `(highlight ((t (:background ,highlight)))) + `(region ((t (:background ,region :foreground ,base07)))) + `(secondary-selection ((t (:background ,accent-subtle)))) + + ;; Mode line + `(mode-line ((t (:background ,base02 :foreground ,base07 :box nil)))) + `(mode-line-inactive ((t (:background ,base01 :foreground ,base04 :box nil)))) + `(mode-line-buffer-id ((t (:foreground ,base0D :weight bold)))) + + ;; Font lock - syntax highlighting + `(font-lock-comment-face ((t (:foreground ,base03 :slant italic)))) + `(font-lock-comment-delimiter-face ((t (:foreground ,base03)))) + `(font-lock-doc-face ((t (:foreground ,base04)))) + `(font-lock-string-face ((t (:foreground ,base0A)))) + `(font-lock-constant-face ((t (:foreground ,base0E)))) + `(font-lock-builtin-face ((t (:foreground ,base0F)))) + `(font-lock-type-face ((t (:foreground ,base0D)))) + `(font-lock-function-name-face ((t (:foreground ,base0C)))) + `(font-lock-variable-name-face ((t (:foreground ,base06)))) + `(font-lock-keyword-face ((t (:foreground ,base0D :weight bold)))) + `(font-lock-preprocessor-face ((t (:foreground ,base0F)))) + `(font-lock-warning-face ((t (:foreground ,base09 :weight bold)))) + + ;; UI elements + `(minibuffer-prompt ((t (:foreground ,base0C :weight bold)))) + `(link ((t (:foreground ,base0C :underline t)))) + `(link-visited ((t (:foreground ,base0E :underline t)))) + `(button ((t (:foreground ,base0C :underline t)))) + `(header-line ((t (:background ,base01 :foreground ,base07)))) + `(vertical-border ((t (:foreground ,base02)))) + + ;; Search and matching + `(isearch ((t (:background ,base0E :foreground ,base00 :weight bold)))) + `(isearch-fail ((t (:background ,base08)))) + `(lazy-highlight ((t (:background ,accent-subtle :foreground ,base07)))) + `(match ((t (:background ,base0A :foreground ,base00)))) + + ;; Line numbers + `(line-number ((t (:foreground ,base03 :background ,base01)))) + `(line-number-current-line ((t (:foreground ,base07 :background ,base02 :weight bold)))) + + ;; Company (autocompletion) + `(company-tooltip ((t (:background ,base01 :foreground ,base07)))) + `(company-tooltip-selection ((t (:background ,base0C :foreground ,base00)))) + `(company-tooltip-common ((t (:foreground ,base0D)))) + `(company-scrollbar-bg ((t (:background ,base02)))) + `(company-scrollbar-fg ((t (:background ,base04)))) + + ;; Org-mode + `(org-level-1 ((t (:foreground ,base0D :weight bold :height 1.2)))) + `(org-level-2 ((t (:foreground ,base0C :weight bold)))) + `(org-level-3 ((t (:foreground ,base0F :weight bold)))) + `(org-done ((t (:foreground ,base0A :weight bold)))) + `(org-todo ((t (:foreground ,base08 :weight bold)))) + `(org-date ((t (:foreground ,base0E)))) + `(org-special-keyword ((t (:foreground ,base03)))) + `(org-block ((t (:background ,base01 :foreground ,base06)))) + `(org-code ((t (:foreground ,base0B)))) + + ;; Terminal specific adjustments + `(term-color-black ((t (:foreground ,base00 :background ,base00)))) + `(term-color-red ((t (:foreground ,base08 :background ,base08)))) + `(term-color-green ((t (:foreground ,base0A :background ,base0A)))) + `(term-color-yellow ((t (:foreground ,base09 :background ,base09)))) + `(term-color-blue ((t (:foreground ,base0C :background ,base0C)))) + `(term-color-magenta ((t (:foreground ,base0E :background ,base0E)))) + `(term-color-cyan ((t (:foreground ,base0B :background ,base0B)))) + `(term-color-white ((t (:foreground ,base07 :background ,base07)))) + + ;; Error and warning faces + `(error ((t (:foreground ,base08 :weight bold)))) + `(warning ((t (:foreground ,base09 :weight bold)))) + `(success ((t (:foreground ,base0A :weight bold)))) + + ;; Dired + `(dired-directory ((t (:foreground ,base0C :weight bold)))) + `(dired-flagged ((t (:foreground ,base08)))) + `(dired-symlink ((t (:foreground ,base0E)))) + + ;; Ivy/Helm (completion frameworks) + `(ivy-current-match ((t (:background ,base0C :foreground ,base00)))) + `(ivy-minibuffer-match-face-1 ((t (:foreground ,base05)))) + `(ivy-minibuffer-match-face-2 ((t (:foreground ,base0D :weight bold)))) + `(ivy-minibuffer-match-face-3 ((t (:foreground ,base0E)))) + `(ivy-minibuffer-match-face-4 ((t (:foreground ,base0A)))) + )) + +;; Provide the theme +(provide-theme 'MTX16) diff --git a/themes/camm/camm1-theme.el b/themes/camm/camm1-theme.el new file mode 100644 index 0000000..e7684a0 --- /dev/null +++ b/themes/camm/camm1-theme.el @@ -0,0 +1,222 @@ +;;; camm1-theme.el --- Theme + +;; Copyright (C) 2026 , Lvy + +;; Author: Lvy +;; Version: 0.1 +;; Package-Requires: ((emacs "24.1")) +;; Created with ThemeCreator, https://github.com/mswift42/themecreator. + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; This file is not part of Emacs. + +;;; Commentary: +;;; camm1 theme created by Lvy in 2026 + +;;; Code: + +(deftheme camm1) +(let ((class '((class color) (min-colors 89))) + (fg1 "#111") + (fg2 "#242424") + (fg3 "#373737") + (fg4 "#4a4a4a") + (fg6 "#0d0d0d") + (bg1 "#f9fbfb") + (bg2 "#e5e7e7") + (bg3 "#d1d3d3") + (bg4 "#bdbfbf") + (builtin "#eb4747") + (keyword "#55b0f6") + (const "#ffa200") + (comment "#b2b6b8") + (func "#40b7bf") + (str "#abce1c") + (type "#ae58e4") + (var "#f04ceb") + (selection "#005fdb") + (warning "#C82829") + (warning2 "#f48925") + (unspec (when (>= emacs-major-version 29) 'unspecified))) + (custom-theme-set-faces + 'camm1 + `(default ((,class (:background ,bg1 :foreground ,fg1)))) + ;; syntax + `(font-lock-builtin-face ((,class (:foreground ,builtin)))) + `(font-lock-comment-face ((,class (:foreground ,comment)))) + `(font-lock-negation-char-face ((,class (:foreground ,const)))) + `(font-lock-reference-face ((,class (:foreground ,const)))) + `(font-lock-constant-face ((,class (:foreground ,const)))) + `(font-lock-doc-face ((,class (:foreground ,comment)))) + `(font-lock-function-name-face ((,class (:foreground ,func )))) + `(font-lock-keyword-face ((,class (:bold ,class :foreground ,keyword)))) + `(font-lock-string-face ((,class (:foreground ,str)))) + `(font-lock-type-face ((,class (:foreground ,type )))) + `(font-lock-variable-name-face ((,class (:foreground ,var)))) + `(font-lock-warning-face ((,class (:foreground ,warning :background ,bg2)))) + `(term-color-black ((,class (:foreground ,fg2 :background ,unspec)))) + ;; `(region ((,class (:background ,fg1 :foreground ,bg1)))) + `(region ((,class (:background ,selection)))) + `(highlight ((,class (:foreground ,fg3 :background ,bg3)))) + `(hl-line ((,class (:background ,bg2)))) + `(fringe ((,class (:background ,bg2 :foreground ,fg4)))) + `(cursor ((,class (:background ,fg4)))) + `(isearch ((,class (:bold t :foreground ,warning :background ,bg3)))) + ;;mode + `(mode-line ((,class (:box (:line-width 1 :color nil) :bold t :foreground ,fg4 :background ,bg2)))) + `(mode-line-inactive ((,class (:box (:line-width 1 :color nil :style pressed-button) :foreground ,var :background ,bg1 :weight normal)))) + `(mode-line-buffer-id ((,class (:bold t :foreground ,func :background ,unspec)))) + `(mode-line-highlight ((,class (:foreground ,keyword :box nil :weight bold)))) + `(mode-line-emphasis ((,class (:foreground ,fg1)))) + `(vertical-border ((,class (:foreground ,fg3)))) + + `(minibuffer-prompt ((,class (:bold t :foreground ,keyword)))) + `(default-italic ((,class (:italic t)))) + `(link ((,class (:foreground ,const :underline t)))) + `(font-latex-bold-face ((,class (:foreground ,type)))) + `(font-latex-italic-face ((,class (:foreground ,var :italic t)))) + `(font-latex-string-face ((,class (:foreground ,str)))) + `(font-latex-match-reference-keywords ((,class (:foreground ,const)))) + `(font-latex-match-variable-keywords ((,class (:foreground ,var)))) + `(ido-only-match ((,class (:foreground ,warning)))) + `(org-sexp-date ((,class (:foreground ,fg4)))) + `(ido-first-match ((,class (:foreground ,keyword :bold t)))) + `(ivy-current-match ((,class (:foreground ,fg3 :inherit highlight :underline t)))) + `(gnus-header-content ((,class (:foreground ,keyword)))) + `(gnus-header-from ((,class (:foreground ,var)))) + `(gnus-header-name ((,class (:foreground ,type)))) + `(gnus-header-subject ((,class (:foreground ,func :bold t)))) + `(mu4e-view-url-number-face ((,class (:foreground ,type)))) + `(mu4e-cited-1-face ((,class (:foreground ,fg2)))) + `(mu4e-cited-7-face ((,class (:foreground ,fg3)))) + `(mu4e-header-marks-face ((,class (:foreground ,type)))) + `(ffap ((,class (:foreground ,fg4)))) + `(js2-private-function-call ((,class (:foreground ,const)))) + `(js2-jsdoc-html-tag-delimiter ((,class (:foreground ,str)))) + `(js2-jsdoc-html-tag-name ((,class (:foreground ,var)))) + `(js2-external-variable ((,class (:foreground ,type )))) + `(js2-function-param ((,class (:foreground ,const)))) + `(js2-jsdoc-value ((,class (:foreground ,str)))) + `(js2-private-member ((,class (:foreground ,fg3)))) + `(js3-warning-face ((,class (:underline ,keyword)))) + `(js3-error-face ((,class (:underline ,warning)))) + `(js3-external-variable-face ((,class (:foreground ,var)))) + `(js3-function-param-face ((,class (:foreground ,fg2)))) + `(js3-jsdoc-tag-face ((,class (:foreground ,keyword)))) + `(js3-instance-member-face ((,class (:foreground ,const)))) + `(warning ((,class (:foreground ,warning)))) + `(ac-completion-face ((,class (:underline t :foreground ,keyword)))) + `(info-quoted-name ((,class (:foreground ,builtin)))) + `(info-string ((,class (:foreground ,str)))) + `(icompletep-determined ((,class :foreground ,builtin))) + `(undo-tree-visualizer-current-face ((,class :foreground ,builtin))) + `(undo-tree-visualizer-default-face ((,class :foreground ,fg2))) + `(undo-tree-visualizer-unmodified-face ((,class :foreground ,var))) + `(undo-tree-visualizer-register-face ((,class :foreground ,type))) + `(slime-repl-inputed-output-face ((,class (:foreground ,type)))) + `(trailing-whitespace ((,class :foreground ,unspec :background ,warning))) + `(rainbow-delimiters-depth-1-face ((,class :foreground ,fg1))) + `(rainbow-delimiters-depth-2-face ((,class :foreground ,type))) + `(rainbow-delimiters-depth-3-face ((,class :foreground ,var))) + `(rainbow-delimiters-depth-4-face ((,class :foreground ,const))) + `(rainbow-delimiters-depth-5-face ((,class :foreground ,keyword))) + `(rainbow-delimiters-depth-6-face ((,class :foreground ,fg1))) + `(rainbow-delimiters-depth-7-face ((,class :foreground ,type))) + `(rainbow-delimiters-depth-8-face ((,class :foreground ,var))) + `(magit-item-highlight ((,class :background ,bg3))) + `(magit-section-heading ((,class (:foreground ,keyword :weight bold)))) + `(magit-hunk-heading ((,class (:background ,bg3)))) + `(magit-section-highlight ((,class (:background ,bg2)))) + `(magit-hunk-heading-highlight ((,class (:background ,bg3)))) + `(magit-diff-context-highlight ((,class (:background ,bg3 :foreground ,fg3)))) + `(magit-diffstat-added ((,class (:foreground ,type)))) + `(magit-diffstat-removed ((,class (:foreground ,var)))) + `(magit-process-ok ((,class (:foreground ,func :weight bold)))) + `(magit-process-ng ((,class (:foreground ,warning :weight bold)))) + `(magit-branch ((,class (:foreground ,const :weight bold)))) + `(magit-log-author ((,class (:foreground ,fg3)))) + `(magit-hash ((,class (:foreground ,fg2)))) + `(magit-diff-file-header ((,class (:foreground ,fg2 :background ,bg3)))) + `(lazy-highlight ((,class (:foreground ,fg2 :background ,bg3)))) + `(term ((,class (:foreground ,fg1 :background ,bg1)))) + `(term-color-black ((,class (:foreground ,bg3 :background ,bg3)))) + `(term-color-blue ((,class (:foreground ,func :background ,func)))) + `(term-color-red ((,class (:foreground ,keyword :background ,bg3)))) + `(term-color-green ((,class (:foreground ,type :background ,bg3)))) + `(term-color-yellow ((,class (:foreground ,var :background ,var)))) + `(term-color-magenta ((,class (:foreground ,builtin :background ,builtin)))) + `(term-color-cyan ((,class (:foreground ,str :background ,str)))) + `(term-color-white ((,class (:foreground ,fg2 :background ,fg2)))) + `(rainbow-delimiters-unmatched-face ((,class :foreground ,warning)))) + ;; Legacy + (if (< emacs-major-version 22) + (custom-theme-set-faces + 'camm1 + `(show-paren-match-face ((,class (:background ,warning))))) ;; obsoleted in 22.1, removed 2016 + (custom-theme-set-faces + 'camm1 + `(show-paren-match ((,class (:foreground ,bg1 :background ,str)))) + `(show-paren-mismatch ((,class (:foreground ,bg1 :background ,warning)))))) + ;; emacs >= 26.1 + (when (>= emacs-major-version 26) + (custom-theme-set-faces + 'camm1 + `(line-number ((t (:inherit fringe)))) + `(line-number-current-line ((t (:inherit fringe :foreground ,fg6 :weight bold)))))) + + ;; emacs >= 27.1 + (when (>= emacs-major-version 27) + (custom-theme-set-faces + 'camm1 + `(tab-line ((,class (:background ,bg2 :foreground ,fg4)))) + `(tab-line-tab ((,class (:inherit tab-line)))) + `(tab-line-tab-inactive ((,class (:background ,bg2 :foreground ,fg4)))) + `(tab-line-tab-current ((,class (:background ,bg1 :foreground ,fg1)))) + `(tab-line-highlight ((,class (:background ,bg1 :foreground ,fg2)))))) + (when (>= emacs-major-version 28) + (custom-theme-set-faces + 'camm1 + `(line-number ((t (:inherit fringe)))) + `(line-number-current-line ((t (:inherit fringe :foreground ,fg6 :weight bold)))))) + ;; emacs >= 27.1 + (when (>= emacs-major-version 27) + (custom-theme-set-faces + 'camm1 + `(tab-line ((,class (:background ,bg2 :foreground ,fg4)))) + `(tab-line-tab ((,class (:inherit tab-line)))) + `(tab-line-tab-inactive ((,class (:background ,bg2 :foreground ,fg4)))) + `(tab-line-tab-current ((,class (:background ,bg1 :foreground ,fg1)))) + `(tab-line-highlight ((,class (:background ,bg1 :foreground ,fg2)))))) + (when (>= emacs-major-version 28) + (custom-theme-set-faces + 'camm1 + `(tab-line-tab-modified ((,class (:foreground ,warning2 :weight bold)))))) + (when (boundp 'font-lock-regexp-face) + (custom-theme-set-faces + 'camm1 + `(font-lock-regexp-face ((,class (:inherit font-lock-string-face :underline t))))))) + +;;;###autoload +(when load-file-name + (add-to-list 'custom-theme-load-path + (file-name-as-directory (file-name-directory load-file-name)))) + +(provide-theme 'camm1) + +;; Local Variables: +;; no-byte-compile: t +;; End: + +;;; camm1-theme.el ends here diff --git a/themes/camm/camm2-theme.el b/themes/camm/camm2-theme.el new file mode 100644 index 0000000..0abff24 --- /dev/null +++ b/themes/camm/camm2-theme.el @@ -0,0 +1,118 @@ +;;; camm2-theme.el --- A custom light theme based on provided colors -*- lexical-binding: t; -*- + +(deftheme camm2 + "Custom light theme created from user-supplied colors.") + +;; Helper to reference colors by name (makes the theme cleaner) +(defun my-color (name) + (cl-case name + (fg1 "#111") + (fg2 "#242424") + (fg3 "#373737") + (fg4 "#4a4a4a") + (fg6 "#0d0d0d") + (bg1 "#f9fbfb") + (bg2 "#e5e7e7") + (bg3 "#d1d3d3") + (bg4 "#bdbfbf") + (builtin "#40b7bf") + (keyword "#55b0f6") + (const "#ffa200") + (comment "#b2b6b8") + (func "#eb4747") + (str "#a8dc19") + (type "#ae58e4") + (var "#f04ceb") + (selection "#005fdb") + (warning "#C82829") + (warning2 "#f48925"))) + +(custom-theme-set-faces + 'camm2 + + ;; Basic faces + `(default ((t (:background ,(my-color 'bg1) :foreground ,(my-color 'fg1))))) + `(cursor ((t (:background ,(my-color 'fg4))))) + `(fringe ((t (:background ,(my-color 'bg2) :foreground ,(my-color 'fg3))))) + `(vertical-border ((t (:foreground ,(my-color 'bg3))))) + `(linum ((t (:background ,(my-color 'bg1) :foreground ,(my-color 'fg3))))) ; legacy + `(line-number ((t (:background ,(my-color 'bg1) :foreground ,(my-color 'fg3))))) + `(line-number-current-line ((t (:background ,(my-color 'bg1) :foreground ,(my-color 'fg1) :weight bold)))) + + ;; Font lock faces (syntax highlighting) + `(font-lock-builtin-face ((t (:foreground ,(my-color 'builtin))))) + `(font-lock-keyword-face ((t (:foreground ,(my-color 'keyword))))) + `(font-lock-constant-face ((t (:foreground ,(my-color 'const))))) + `(font-lock-comment-face ((t (:foreground ,(my-color 'comment) :slant italic)))) + `(font-lock-comment-delimiter-face ((t (:foreground ,(my-color 'comment) :slant italic)))) + `(font-lock-function-name-face ((t (:foreground ,(my-color 'func))))) + `(font-lock-string-face ((t (:foreground ,(my-color 'str))))) + `(font-lock-type-face ((t (:foreground ,(my-color 'type))))) + `(font-lock-variable-name-face ((t (:foreground ,(my-color 'var))))) + `(font-lock-doc-face ((t (:foreground ,(my-color 'comment) :slant italic)))) + `(font-lock-preprocessor-face ((t (:foreground ,(my-color 'builtin))))) + `(font-lock-warning-face ((t (:foreground ,(my-color 'warning) :weight bold)))) + + ;; Region and selection + `(region ((t (:background ,(my-color 'selection) :foreground ,(my-color 'bg1))))) + `(secondary-selection ((t (:background ,(my-color 'bg3))))) + + ;; Mode line + `(mode-line ((t (:background ,(my-color 'bg2) :foreground ,(my-color 'fg1) :box (:line-width 1 :color ,(my-color 'bg4)))))) + `(mode-line-inactive ((t (:background ,(my-color 'bg1) :foreground ,(my-color 'fg3) :box (:line-width 1 :color ,(my-color 'bg3)))))) + + ;; Minibuffer and prompts + `(minibuffer-prompt ((t (:foreground ,(my-color 'keyword) :weight bold)))) + + ;; Highlighting + `(highlight ((t (:background ,(my-color 'bg3))))) + `(hl-line ((t (:background ,(my-color 'bg2))))) + `(isearch ((t (:background ,(my-color 'warning2) :foreground ,(my-color 'bg1))))) + `(lazy-highlight ((t (:background ,(my-color 'bg4))))) + + ;; Matching parentheses + `(show-paren-match ((t (:background ,(my-color 'bg3) :foreground ,(my-color 'fg1) :weight bold)))) + `(show-paren-mismatch ((t (:background ,(my-color 'warning) :foreground ,(my-color 'bg1))))) + + ;; Error / warning / success + `(error ((t (:foreground ,(my-color 'warning) :weight bold)))) + `(warning ((t (:foreground ,(my-color 'warning2) :weight bold)))) + `(success ((t (:foreground ,(my-color 'str))))) + + ;; Button and link + `(link ((t (:foreground ,(my-color 'keyword) :underline t)))) + `(link-visited ((t (:foreground ,(my-color 'type) :underline t)))) + + ;; Tooltip + `(tooltip ((t (:background ,(my-color 'bg2) :foreground ,(my-color 'fg1) :box (:line-width 1 :color ,(my-color 'bg4)))))) + + ;; Dired + `(dired-directory ((t (:foreground ,(my-color 'keyword) :weight bold)))) + `(dired-symlink ((t (:foreground ,(my-color 'func))))) + `(dired-ignored ((t (:foreground ,(my-color 'comment))))) + + ;; Custom faces used by Doom modules (modeline, dashboard, etc.) + `(doom-modeline-bar ((t (:background ,(my-color 'keyword))))) + `(doom-modeline-buffer-file ((t (:foreground ,(my-color 'func))))) + `(doom-modeline-buffer-modified ((t (:foreground ,(my-color 'warning2))))) + `(doom-modeline-project-dir ((t (:foreground ,(my-color 'type))))) + + ;; Company / autocomplete + `(company-tooltip ((t (:background ,(my-color 'bg2) :foreground ,(my-color 'fg1))))) + `(company-tooltip-selection ((t (:background ,(my-color 'selection) :foreground ,(my-color 'bg1))))) + `(company-tooltip-common ((t (:foreground ,(my-color 'func))))) + `(company-scrollbar-fg ((t (:background ,(my-color 'fg4))))) + `(company-scrollbar-bg ((t (:background ,(my-color 'bg3))))) + + ;; Outline / Org headings (simple, can be extended) + `(outline-1 ((t (:foreground ,(my-color 'type) :weight bold)))) + `(outline-2 ((t (:foreground ,(my-color 'func) :weight bold)))) + `(outline-3 ((t (:foreground ,(my-color 'keyword) :weight bold)))) + `(org-level-1 ((t (:inherit outline-1 :height 1.1)))) + `(org-level-2 ((t (:inherit outline-2 :height 1.05)))) + `(org-level-3 ((t (:inherit outline-3)))) + ) + +;; Provide the theme +(provide-theme 'camm2) +;;; camm2-theme.el ends here diff --git a/themes/camm/camm3-theme.el b/themes/camm/camm3-theme.el new file mode 100644 index 0000000..5b29832 --- /dev/null +++ b/themes/camm/camm3-theme.el @@ -0,0 +1,223 @@ +;;; camm3-theme.el --- Custom theme based on user palette -*- lexical-binding: t; -*- + +(deftheme camm3 "Custom theme with neutrals, syntax highlighting, and UI feedback.") + +(let ((class '((class color) (min-colors 89))) + ;; Neutrals & surfaces + (bg-base "#f9fbfb") + (bg-panel "#f2f4f4") + (bg-surface-2 "#e5e7e7") + (bg-surface-3 "#d1d3d3") + (border "#bdbfbf") + (border-focus "#005fdb") + + ;; Text scale + (text-primary "#0d0d0d") + (text-secondary "#111111") + (text-tertiary "#242424") + (text-muted "#373737") + (text-faint "#4a4a4a") + (text-faint-2 "#5d5d5d") + (text-inverse "#ffffff") + + ;; Syntax highlighting + (code-comment "#b2b6b8") + (code-builtin "#40b7bf") + (code-keyword "#55b0f6") + (code-constant "#ffa200") + (code-function "#c42020") + (code-string "#a8dc19") + (code-type "#8a35b8") + (code-variable "#f04ceb") + (code-number "#f48925") + (code-operator "#4a4a4a") + + ;; UI & feedback + (ui-selection "#005fdb") + (ui-selection-bg "#e6eeff") + (ui-cursor "#005fdb") + (ui-active-line "#f0f4ff") + (status-error "#c82829") + (status-warning "#f48925") + (status-success "#22a653") + (status-info "#3b82f6")) + + (custom-theme-set-faces + 'camm3 + ;; Basic faces + `(default ((,class (:background ,bg-base :foreground ,text-primary)))) + `(cursor ((,class (:background ,ui-cursor)))) + `(region ((,class (:background ,ui-selection-bg :foreground ,ui-selection)))) + `(fringe ((,class (:background ,bg-panel :foreground ,text-faint)))) + `(highlight ((,class (:background ,ui-active-line)))) + `(hl-line ((,class (:background ,ui-active-line)))) + `(vertical-border ((,class (:foreground ,border)))) + `(window-divider ((,class (:foreground ,border)))) + `(window-divider-first-pixel ((,class (:foreground ,border)))) + `(window-divider-last-pixel ((,class (:foreground ,border)))) + `(minibuffer-prompt ((,class (:foreground ,status-info :weight bold)))) + `(link ((,class (:foreground ,status-info :underline t)))) + `(link-visited ((,class (:foreground ,code-type :underline t)))) + `(shadow ((,class (:foreground ,text-faint)))) + `(success ((,class (:foreground ,status-success :weight bold)))) + `(warning ((,class (:foreground ,status-warning :weight bold)))) + `(error ((,class (:foreground ,status-error :weight bold)))) + + ;; Mode line + `(mode-line ((,class (:background ,bg-surface-2 :foreground ,text-primary + :box (:line-width 1 :color ,border))))) + `(mode-line-inactive ((,class (:background ,bg-panel :foreground ,text-faint + :box (:line-width 1 :color ,border))))) + `(mode-line-buffer-id ((,class (:weight bold :foreground ,ui-selection)))) + + ;; Line numbers + `(line-number ((,class (:background ,bg-base :foreground ,text-faint-2)))) + `(line-number-current-line ((,class (:background ,ui-active-line :foreground ,text-primary :weight bold)))) + + ;; Font lock (syntax highlighting) + `(font-lock-builtin-face ((,class (:foreground ,code-builtin)))) + `(font-lock-comment-face ((,class (:foreground ,code-comment :slant italic)))) + `(font-lock-comment-delimiter-face ((,class (:foreground ,code-comment :slant italic)))) + `(font-lock-constant-face ((,class (:foreground ,code-constant)))) + `(font-lock-doc-face ((,class (:foreground ,code-comment :slant italic)))) + `(font-lock-function-name-face ((,class (:foreground ,code-function)))) + `(font-lock-keyword-face ((,class (:foreground ,code-keyword)))) + `(font-lock-number-face ((,class (:foreground ,code-number)))) + `(font-lock-operator-face ((,class (:foreground ,code-operator)))) + `(font-lock-string-face ((,class (:foreground ,code-string)))) + `(font-lock-type-face ((,class (:foreground ,code-type)))) + `(font-lock-variable-name-face ((,class (:foreground ,code-variable)))) + `(font-lock-warning-face ((,class (:foreground ,status-warning :weight bold)))) + + ;; Search & match + `(isearch ((,class (:background ,ui-selection :foreground ,text-inverse)))) + `(isearch-fail ((,class (:background ,status-error :foreground ,text-inverse)))) + `(lazy-highlight ((,class (:background ,ui-selection-bg :foreground ,ui-selection :underline t)))) + `(match ((,class (:background ,ui-selection-bg :foreground ,ui-selection)))) + + ;; Secondary selection (e.g., multiple-cursors) + `(secondary-selection ((,class (:background ,bg-surface-3)))) + + ;; Trailing whitespace + `(trailing-whitespace ((,class (:background ,status-error :foreground ,text-inverse)))) + + ;; Diff (vc-gutter, magit) + `(diff-added ((,class (:foreground ,status-success)))) + `(diff-removed ((,class (:foreground ,status-error)))) + `(diff-refine-added ((,class (:background ,status-success :foreground ,text-inverse)))) + `(diff-refine-removed ((,class (:background ,status-error :foreground ,text-inverse)))) + `(diff-header ((,class (:background ,bg-panel :foreground ,text-tertiary)))) + `(diff-file-header ((,class (:background ,bg-surface-2 :foreground ,text-primary :weight bold)))) + + ;; Org mode + `(org-level-1 ((,class (:foreground ,ui-selection :weight bold :height 1.2)))) + `(org-level-2 ((,class (:foreground ,code-function :weight bold :height 1.1)))) + `(org-level-3 ((,class (:foreground ,code-type :weight bold)))) + `(org-level-4 ((,class (:foreground ,code-variable :weight bold)))) + `(org-level-5 ((,class (:foreground ,code-builtin :weight bold)))) + `(org-level-6 ((,class (:foreground ,code-constant :weight bold)))) + `(org-level-7 ((,class (:foreground ,code-keyword :weight bold)))) + `(org-level-8 ((,class (:foreground ,code-string :weight bold)))) + `(org-todo ((,class (:foreground ,status-error :weight bold)))) + `(org-done ((,class (:foreground ,status-success :weight bold)))) + `(org-date ((,class (:foreground ,code-number :underline t)))) + `(org-link ((,class (:foreground ,status-info :underline t)))) + `(org-block ((,class (:background ,bg-surface-2 :extend t)))) + `(org-block-begin-line ((,class (:background ,bg-panel :foreground ,text-faint)))) + `(org-block-end-line ((,class (:background ,bg-panel :foreground ,text-faint)))) + + ;; Doom modeline specific (if using doom-modeline) + `(doom-modeline-bar ((,class (:background ,ui-selection)))) + `(doom-modeline-buffer-modified ((,class (:foreground ,status-warning)))) + `(doom-modeline-buffer-major-mode ((,class (:foreground ,code-type :weight bold)))) + `(doom-modeline-project-root-dir ((,class (:foreground ,code-builtin)))) + `(doom-modeline-evil-normal-state ((,class (:background ,ui-selection :foreground ,text-inverse)))) + `(doom-modeline-evil-insert-state ((,class (:background ,status-success :foreground ,text-inverse)))) + `(doom-modeline-evil-visual-state ((,class (:background ,code-variable :foreground ,text-inverse)))) + + ;; Tree-sitter (if you use tree-sitter modes) + `(tree-sitter-hl-face:function.call ((,class (:foreground ,code-function)))) + `(tree-sitter-hl-face:function.builtin ((,class (:foreground ,code-builtin)))) + `(tree-sitter-hl-face:function ((,class (:foreground ,code-function)))) + `(tree-sitter-hl-face:type ((,class (:foreground ,code-type)))) + `(tree-sitter-hl-face:constant ((,class (:foreground ,code-constant)))) + `(tree-sitter-hl-face:keyword ((,class (:foreground ,code-keyword)))) + `(tree-sitter-hl-face:string ((,class (:foreground ,code-string)))) + `(tree-sitter-hl-face:comment ((,class (:foreground ,code-comment :slant italic)))) + `(tree-sitter-hl-face:variable ((,class (:foreground ,code-variable)))) + `(tree-sitter-hl-face:number ((,class (:foreground ,code-number)))) + `(tree-sitter-hl-face:operator ((,class (:foreground ,code-operator)))) + `(tree-sitter-hl-face:property ((,class (:foreground ,text-secondary)))) + + ;; Company / Corfu completion + `(company-tooltip ((,class (:background ,bg-panel :foreground ,text-primary)))) + `(company-tooltip-selection ((,class (:background ,ui-selection-bg :foreground ,ui-selection)))) + `(company-tooltip-common ((,class (:foreground ,code-keyword)))) + `(company-tooltip-annotation ((,class (:foreground ,text-faint)))) + `(company-scrollbar-bg ((,class (:background ,bg-surface-3)))) + `(company-scrollbar-fg ((,class (:background ,border)))) + `(corfu-current ((,class (:background ,ui-selection-bg :foreground ,ui-selection)))) + + ;; LSP / Flycheck + `(flycheck-error ((,class (:underline (:style wave :color ,status-error))))) + `(flycheck-warning ((,class (:underline (:style wave :color ,status-warning))))) + `(flycheck-info ((,class (:underline (:style wave :color ,status-info))))) + `(lsp-face-highlight-textual ((,class (:background ,ui-active-line :underline t)))) + `(lsp-face-highlight-read ((,class (:background ,ui-selection-bg :underline t)))) + `(lsp-face-highlight-write ((,class (:background ,ui-selection-bg :underline t)))) + + ;; Whitespace mode + `(whitespace-space ((,class (:foreground ,bg-surface-3)))) + `(whitespace-tab ((,class (:foreground ,bg-surface-3)))) + `(whitespace-newline ((,class (:foreground ,bg-surface-3)))) + `(whitespace-indentation ((,class (:foreground ,bg-surface-3)))) + `(whitespace-line ((,class (:background ,ui-active-line :foreground ,text-primary)))) + `(whitespace-empty ((,class (:background ,status-error :foreground ,text-inverse)))) + + ;; Highlight indentation guides (indent-guides) + `(highlight-indent-guides-character-face ((,class (:foreground ,border)))) + `(highlight-indent-guides-stack-character-face ((,class (:foreground ,bg-surface-3)))) + `(highlight-indent-guides-odd-face ((,class (:background ,bg-panel)))) + `(highlight-indent-guides-even-face ((,class (:background ,bg-base)))) + + ;; IMenu / Outline + `(imenu-list-entry-face-0 ((,class (:foreground ,code-keyword)))) + `(imenu-list-entry-face-1 ((,class (:foreground ,code-function)))) + `(imenu-list-entry-face-2 ((,class (:foreground ,code-type)))) + `(imenu-list-entry-face-3 ((,class (:foreground ,code-constant)))) + + ;; Avy (jump hints) + `(avy-lead-face ((,class (:background ,ui-selection :foreground ,text-inverse :weight bold)))) + `(avy-lead-face-0 ((,class (:background ,status-success :foreground ,text-inverse :weight bold)))) + `(avy-lead-face-1 ((,class (:background ,status-warning :foreground ,text-inverse :weight bold)))) + `(avy-lead-face-2 ((,class (:background ,code-variable :foreground ,text-inverse :weight bold)))) + `(avy-background-face ((,class (:background ,bg-panel :foreground ,text-faint)))) + + ;; Denote (notes) + `(denote-faces-link ((,class (:foreground ,status-info :underline t)))) + `(denote-faces-date ((,class (:foreground ,code-number)))) + `(denote-faces-keyword ((,class (:foreground ,code-keyword :weight bold)))) + `(denote-faces-title ((,class (:foreground ,text-primary :weight bold :height 1.2)))) + + ;; Extra: markdown, json, etc. + `(markdown-header-face-1 ((,class (:inherit org-level-1)))) + `(markdown-header-face-2 ((,class (:inherit org-level-2)))) + `(markdown-header-face-3 ((,class (:inherit org-level-3)))) + `(markdown-header-face-4 ((,class (:inherit org-level-4)))) + `(markdown-header-face-5 ((,class (:inherit org-level-5)))) + `(markdown-header-face-6 ((,class (:inherit org-level-6)))) + `(markdown-link-face ((,class (:inherit link)))) + `(markdown-url-face ((,class (:foreground ,code-number)))) + `(json-key-face ((,class (:foreground ,code-keyword)))) + `(json-number-face ((,class (:foreground ,code-number)))) + `(json-string-face ((,class (:foreground ,code-string)))) + `(json-boolean-face ((,class (:foreground ,code-constant)))) + `(json-null-face ((,class (:foreground ,code-constant)))) + + ;; Custom faces used in user config (e.g., my-set-buffer-font buffer-face) + `(buffer-face ((,class (:family "Noto Sans" :height 140)))))) + +;; Provide the theme +(provide-theme 'camm3) + +;;; camm3-theme.el ends here diff --git a/themes/camm/camm4-theme.el b/themes/camm/camm4-theme.el new file mode 100644 index 0000000..dca6013 --- /dev/null +++ b/themes/camm/camm4-theme.el @@ -0,0 +1,152 @@ +;;; camm4-theme.el --- A light theme based on the camm4 palette -*- lexical-binding: t; no-byte-compile: t; -*- + +(deftheme camm4 + "Light theme with a calm, readable palette. +Core colours: blues (005FDB, 3B82F6, 007A8A, 40B7BF) and magenta (8A35B8, D33682).") + +(let ((class '((class color) (min-colors 89))) + ;; Basic palette + (camm4-bg "#fefcff") + (camm4-fg "#101010") + (camm4-cursor "#f04ceb") + ;; ANSI colours (index 01-16) + (camm4-black "#E6EEFF") ; 01 – very light blueish grey + (camm4-red "#C82829") ; 02 + (camm4-green "#419722") ; 03 + (camm4-yellow "#F48925") ; 04 + (camm4-blue "#005FDB") ; 05 – core blue + (camm4-magenta "#EF89DF") ; 06 – core purple + (camm4-cyan "#007A8A") ; 07 – core teal/blue + (camm4-white "#4D4D4C") ; 08 – dark grey + (camm4-brblack "#e2ecff") ; 09 + (camm4-brred "#E53935") ; 10 + (camm4-brgreen "#22A653") ; 11 + (camm4-bryellow "#FFA200") ; 12 + (camm4-brblue "#3B82F6") ; 13 – core bright blue + (camm4-brmagenta "#D33682") ; 14 – core bright magenta + (camm4-brcyan "#40B7BF") ; 15 – core bright teal + (camm4-brwhite "#1D1F21")) ; 16 – near black + + (custom-theme-set-faces + 'camm4 + ;; Basic faces + `(default ((,class (:background ,camm4-bg :foreground ,camm4-fg)))) + `(cursor ((,class (:background ,camm4-cursor)))) + `(fringe ((,class (:background ,camm4-bg :foreground ,camm4-white)))) + `(region ((,class (:background ,camm4-brblack :foreground ,camm4-fg)))) + `(highlight ((,class (:background ,camm4-brblack)))) + `(hl-line ((,class (:background ,camm4-brblack)))) + `(success ((,class (:foreground ,camm4-brgreen)))) + `(warning ((,class (:foreground ,camm4-bryellow)))) + `(error ((,class (:foreground ,camm4-brred :weight bold)))) + `(link ((,class (:foreground ,camm4-blue :underline t)))) + `(link-visited ((,class (:foreground ,camm4-magenta :underline t)))) + + ;; Font lock (syntax highlighting) + `(font-lock-builtin-face ((,class (:foreground ,camm4-cyan)))) + `(font-lock-comment-face ((,class (:foreground ,camm4-white :slant italic)))) + `(font-lock-comment-delimiter-face ((,class (:inherit font-lock-comment-face)))) + `(font-lock-constant-face ((,class (:foreground ,camm4-brblue)))) + `(font-lock-doc-face ((,class (:inherit font-lock-comment-face :foreground ,camm4-green)))) + `(font-lock-function-name-face ((,class (:foreground ,camm4-brmagenta :weight bold)))) + `(font-lock-keyword-face ((,class (:foreground ,camm4-blue :weight bold)))) + `(font-lock-negation-char-face ((,class (:foreground ,camm4-red)))) + `(font-lock-preprocessor-face ((,class (:foreground ,camm4-cyan)))) + `(font-lock-regexp-grouping-backslash ((,class (:foreground ,camm4-yellow)))) + `(font-lock-regexp-grouping-construct ((,class (:foreground ,camm4-red)))) + `(font-lock-string-face ((,class (:foreground ,camm4-red :weight semi-light)))) + `(font-lock-type-face ((,class (:foreground ,camm4-brcyan :weight normal)))) + `(font-lock-variable-name-face ((,class (:foreground ,camm4-magenta)))) + `(font-lock-warning-face ((,class (:foreground ,camm4-brred :weight bold)))) + + ;; Mode line + `(mode-line ((,class (:background ,camm4-black :foreground ,camm4-fg :box (:line-width 1 :color ,camm4-white))))) + `(mode-line-inactive ((,class (:background ,camm4-brblack :foreground ,camm4-white :box (:line-width 1 :color ,camm4-brblack))))) + `(mode-line-buffer-id ((,class (:weight bold :foreground ,camm4-brblue)))) + `(mode-line-emphasis ((,class (:weight bold)))) + `(mode-line-highlight ((,class (:box (:line-width 1 :color ,camm4-brblue))))) + + ;; Minibuffer, completion, etc. + `(minibuffer-prompt ((,class (:foreground ,camm4-blue :weight bold)))) + `(completions-common-part ((,class (:foreground ,camm4-fg)))) + `(completions-first-difference ((,class (:foreground ,camm4-brred :weight bold)))) + + ;; Search + `(isearch ((,class (:background ,camm4-bryellow :foreground ,camm4-fg)))) + `(isearch-fail ((,class (:background ,camm4-red :foreground ,camm4-bg)))) + `(lazy-highlight ((,class (:background ,camm4-yellow :foreground ,camm4-fg :underline t)))) + + ;; Line numbers + `(line-number ((,class (:foreground ,camm4-white :background ,camm4-bg)))) + `(line-number-current-line ((,class (:foreground ,camm4-blue :weight bold :background ,camm4-brblack)))) + + ;; Dired + `(dired-header ((,class (:foreground ,camm4-blue :weight bold)))) + `(dired-directory ((,class (:foreground ,camm4-brblue :weight bold)))) + `(dired-symlink ((,class (:foreground ,camm4-cyan :slant italic)))) + + ;; Org mode + `(org-level-1 ((,class (:foreground ,camm4-brblue :weight bold :height 1.2)))) + `(org-level-2 ((,class (:foreground ,camm4-blue :weight bold :height 1.1)))) + `(org-level-3 ((,class (:foreground ,camm4-cyan :weight bold)))) + `(org-level-4 ((,class (:foreground ,camm4-magenta :weight bold)))) + `(org-level-5 ((,class (:foreground ,camm4-brcyan :weight bold)))) + `(org-level-6 ((,class (:foreground ,camm4-brmagenta :weight bold)))) + `(org-todo ((,class (:foreground ,camm4-brred :weight bold :box t)))) + `(org-done ((,class (:foreground ,camm4-brgreen :weight bold :box t)))) + `(org-date ((,class (:foreground ,camm4-brblue :underline t)))) + `(org-link ((,class (:foreground ,camm4-blue :underline t)))) + `(org-tag ((,class (:foreground ,camm4-white :weight normal)))) + + ;; Markdown + `(markdown-header-face-1 ((,class (:inherit org-level-1)))) + `(markdown-header-face-2 ((,class (:inherit org-level-2)))) + `(markdown-header-face-3 ((,class (:inherit org-level-3)))) + `(markdown-link-face ((,class (:inherit link)))) + `(markdown-url-face ((,class (:inherit link)))) + + ;; Magit + `(magit-branch-local ((,class (:foreground ,camm4-brblue :weight bold)))) + `(magit-branch-remote ((,class (:foreground ,camm4-cyan :weight bold)))) + `(magit-tag ((,class (:foreground ,camm4-bryellow :weight bold)))) + `(magit-hash ((,class (:foreground ,camm4-white)))) + `(magit-diff-added ((,class (:foreground ,camm4-brgreen)))) + `(magit-diff-removed ((,class (:foreground ,camm4-brred)))) + `(magit-diff-context ((,class (:foreground ,camm4-white)))) + `(magit-section-heading ((,class (:foreground ,camm4-blue :weight bold :background ,camm4-brblack)))) + `(magit-section-highlight ((,class (:background ,camm4-brblack)))) + + ;; Tree‑sitter (if you use it) + `(tree-sitter-hl-face:function.call ((,class (:foreground ,camm4-brmagenta)))) + `(tree-sitter-hl-face:function.builtin ((,class (:foreground ,camm4-cyan)))) + `(tree-sitter-hl-face:variable.builtin ((,class (:foreground ,camm4-magenta)))) + `(tree-sitter-hl-face:type ((,class (:foreground ,camm4-brcyan)))) + `(tree-sitter-hl-face:constant.builtin ((,class (:foreground ,camm4-brblue)))) + + ;; LSP / Flycheck + `(flycheck-error ((,class (:underline (:style wave :color ,camm4-brred))))) + `(flycheck-warning ((,class (:underline (:style wave :color ,camm4-bryellow))))) + `(flycheck-info ((,class (:underline (:style wave :color ,camm4-brblue))))) + `(lsp-face-highlight-textual ((,class (:background ,camm4-brblack :underline t)))) + + ;; Extra + `(show-paren-match ((,class (:background ,camm4-brcyan :foreground ,camm4-bg :weight bold)))) + `(show-paren-mismatch ((,class (:background ,camm4-brred :foreground ,camm4-bg :weight bold)))) + `(match ((,class (:background ,camm4-yellow :foreground ,camm4-fg)))) + `(shadow ((,class (:foreground ,camm4-white)))) + `(secondary-selection ((,class (:background ,camm4-brblack)))) + `(trailing-whitespace ((,class (:background ,camm4-brred)))) + `(vertical-border ((,class (:foreground ,camm4-white)))) + `(widget-button ((,class (:foreground ,camm4-blue :weight bold)))) + `(widget-field ((,class (:background ,camm4-brblack)))) + )) + +;;;###autoload +(and load-file-name + (boundp 'custom-theme-load-path) + (add-to-list 'custom-theme-load-path + (file-name-as-directory (file-name-directory load-file-name)))) + +(provide-theme 'camm4) + +;;; camm4-theme.el ends here diff --git a/themes/camm/camm4-theme.txt b/themes/camm/camm4-theme.txt new file mode 100644 index 0000000..dca6013 --- /dev/null +++ b/themes/camm/camm4-theme.txt @@ -0,0 +1,152 @@ +;;; camm4-theme.el --- A light theme based on the camm4 palette -*- lexical-binding: t; no-byte-compile: t; -*- + +(deftheme camm4 + "Light theme with a calm, readable palette. +Core colours: blues (005FDB, 3B82F6, 007A8A, 40B7BF) and magenta (8A35B8, D33682).") + +(let ((class '((class color) (min-colors 89))) + ;; Basic palette + (camm4-bg "#fefcff") + (camm4-fg "#101010") + (camm4-cursor "#f04ceb") + ;; ANSI colours (index 01-16) + (camm4-black "#E6EEFF") ; 01 – very light blueish grey + (camm4-red "#C82829") ; 02 + (camm4-green "#419722") ; 03 + (camm4-yellow "#F48925") ; 04 + (camm4-blue "#005FDB") ; 05 – core blue + (camm4-magenta "#EF89DF") ; 06 – core purple + (camm4-cyan "#007A8A") ; 07 – core teal/blue + (camm4-white "#4D4D4C") ; 08 – dark grey + (camm4-brblack "#e2ecff") ; 09 + (camm4-brred "#E53935") ; 10 + (camm4-brgreen "#22A653") ; 11 + (camm4-bryellow "#FFA200") ; 12 + (camm4-brblue "#3B82F6") ; 13 – core bright blue + (camm4-brmagenta "#D33682") ; 14 – core bright magenta + (camm4-brcyan "#40B7BF") ; 15 – core bright teal + (camm4-brwhite "#1D1F21")) ; 16 – near black + + (custom-theme-set-faces + 'camm4 + ;; Basic faces + `(default ((,class (:background ,camm4-bg :foreground ,camm4-fg)))) + `(cursor ((,class (:background ,camm4-cursor)))) + `(fringe ((,class (:background ,camm4-bg :foreground ,camm4-white)))) + `(region ((,class (:background ,camm4-brblack :foreground ,camm4-fg)))) + `(highlight ((,class (:background ,camm4-brblack)))) + `(hl-line ((,class (:background ,camm4-brblack)))) + `(success ((,class (:foreground ,camm4-brgreen)))) + `(warning ((,class (:foreground ,camm4-bryellow)))) + `(error ((,class (:foreground ,camm4-brred :weight bold)))) + `(link ((,class (:foreground ,camm4-blue :underline t)))) + `(link-visited ((,class (:foreground ,camm4-magenta :underline t)))) + + ;; Font lock (syntax highlighting) + `(font-lock-builtin-face ((,class (:foreground ,camm4-cyan)))) + `(font-lock-comment-face ((,class (:foreground ,camm4-white :slant italic)))) + `(font-lock-comment-delimiter-face ((,class (:inherit font-lock-comment-face)))) + `(font-lock-constant-face ((,class (:foreground ,camm4-brblue)))) + `(font-lock-doc-face ((,class (:inherit font-lock-comment-face :foreground ,camm4-green)))) + `(font-lock-function-name-face ((,class (:foreground ,camm4-brmagenta :weight bold)))) + `(font-lock-keyword-face ((,class (:foreground ,camm4-blue :weight bold)))) + `(font-lock-negation-char-face ((,class (:foreground ,camm4-red)))) + `(font-lock-preprocessor-face ((,class (:foreground ,camm4-cyan)))) + `(font-lock-regexp-grouping-backslash ((,class (:foreground ,camm4-yellow)))) + `(font-lock-regexp-grouping-construct ((,class (:foreground ,camm4-red)))) + `(font-lock-string-face ((,class (:foreground ,camm4-red :weight semi-light)))) + `(font-lock-type-face ((,class (:foreground ,camm4-brcyan :weight normal)))) + `(font-lock-variable-name-face ((,class (:foreground ,camm4-magenta)))) + `(font-lock-warning-face ((,class (:foreground ,camm4-brred :weight bold)))) + + ;; Mode line + `(mode-line ((,class (:background ,camm4-black :foreground ,camm4-fg :box (:line-width 1 :color ,camm4-white))))) + `(mode-line-inactive ((,class (:background ,camm4-brblack :foreground ,camm4-white :box (:line-width 1 :color ,camm4-brblack))))) + `(mode-line-buffer-id ((,class (:weight bold :foreground ,camm4-brblue)))) + `(mode-line-emphasis ((,class (:weight bold)))) + `(mode-line-highlight ((,class (:box (:line-width 1 :color ,camm4-brblue))))) + + ;; Minibuffer, completion, etc. + `(minibuffer-prompt ((,class (:foreground ,camm4-blue :weight bold)))) + `(completions-common-part ((,class (:foreground ,camm4-fg)))) + `(completions-first-difference ((,class (:foreground ,camm4-brred :weight bold)))) + + ;; Search + `(isearch ((,class (:background ,camm4-bryellow :foreground ,camm4-fg)))) + `(isearch-fail ((,class (:background ,camm4-red :foreground ,camm4-bg)))) + `(lazy-highlight ((,class (:background ,camm4-yellow :foreground ,camm4-fg :underline t)))) + + ;; Line numbers + `(line-number ((,class (:foreground ,camm4-white :background ,camm4-bg)))) + `(line-number-current-line ((,class (:foreground ,camm4-blue :weight bold :background ,camm4-brblack)))) + + ;; Dired + `(dired-header ((,class (:foreground ,camm4-blue :weight bold)))) + `(dired-directory ((,class (:foreground ,camm4-brblue :weight bold)))) + `(dired-symlink ((,class (:foreground ,camm4-cyan :slant italic)))) + + ;; Org mode + `(org-level-1 ((,class (:foreground ,camm4-brblue :weight bold :height 1.2)))) + `(org-level-2 ((,class (:foreground ,camm4-blue :weight bold :height 1.1)))) + `(org-level-3 ((,class (:foreground ,camm4-cyan :weight bold)))) + `(org-level-4 ((,class (:foreground ,camm4-magenta :weight bold)))) + `(org-level-5 ((,class (:foreground ,camm4-brcyan :weight bold)))) + `(org-level-6 ((,class (:foreground ,camm4-brmagenta :weight bold)))) + `(org-todo ((,class (:foreground ,camm4-brred :weight bold :box t)))) + `(org-done ((,class (:foreground ,camm4-brgreen :weight bold :box t)))) + `(org-date ((,class (:foreground ,camm4-brblue :underline t)))) + `(org-link ((,class (:foreground ,camm4-blue :underline t)))) + `(org-tag ((,class (:foreground ,camm4-white :weight normal)))) + + ;; Markdown + `(markdown-header-face-1 ((,class (:inherit org-level-1)))) + `(markdown-header-face-2 ((,class (:inherit org-level-2)))) + `(markdown-header-face-3 ((,class (:inherit org-level-3)))) + `(markdown-link-face ((,class (:inherit link)))) + `(markdown-url-face ((,class (:inherit link)))) + + ;; Magit + `(magit-branch-local ((,class (:foreground ,camm4-brblue :weight bold)))) + `(magit-branch-remote ((,class (:foreground ,camm4-cyan :weight bold)))) + `(magit-tag ((,class (:foreground ,camm4-bryellow :weight bold)))) + `(magit-hash ((,class (:foreground ,camm4-white)))) + `(magit-diff-added ((,class (:foreground ,camm4-brgreen)))) + `(magit-diff-removed ((,class (:foreground ,camm4-brred)))) + `(magit-diff-context ((,class (:foreground ,camm4-white)))) + `(magit-section-heading ((,class (:foreground ,camm4-blue :weight bold :background ,camm4-brblack)))) + `(magit-section-highlight ((,class (:background ,camm4-brblack)))) + + ;; Tree‑sitter (if you use it) + `(tree-sitter-hl-face:function.call ((,class (:foreground ,camm4-brmagenta)))) + `(tree-sitter-hl-face:function.builtin ((,class (:foreground ,camm4-cyan)))) + `(tree-sitter-hl-face:variable.builtin ((,class (:foreground ,camm4-magenta)))) + `(tree-sitter-hl-face:type ((,class (:foreground ,camm4-brcyan)))) + `(tree-sitter-hl-face:constant.builtin ((,class (:foreground ,camm4-brblue)))) + + ;; LSP / Flycheck + `(flycheck-error ((,class (:underline (:style wave :color ,camm4-brred))))) + `(flycheck-warning ((,class (:underline (:style wave :color ,camm4-bryellow))))) + `(flycheck-info ((,class (:underline (:style wave :color ,camm4-brblue))))) + `(lsp-face-highlight-textual ((,class (:background ,camm4-brblack :underline t)))) + + ;; Extra + `(show-paren-match ((,class (:background ,camm4-brcyan :foreground ,camm4-bg :weight bold)))) + `(show-paren-mismatch ((,class (:background ,camm4-brred :foreground ,camm4-bg :weight bold)))) + `(match ((,class (:background ,camm4-yellow :foreground ,camm4-fg)))) + `(shadow ((,class (:foreground ,camm4-white)))) + `(secondary-selection ((,class (:background ,camm4-brblack)))) + `(trailing-whitespace ((,class (:background ,camm4-brred)))) + `(vertical-border ((,class (:foreground ,camm4-white)))) + `(widget-button ((,class (:foreground ,camm4-blue :weight bold)))) + `(widget-field ((,class (:background ,camm4-brblack)))) + )) + +;;;###autoload +(and load-file-name + (boundp 'custom-theme-load-path) + (add-to-list 'custom-theme-load-path + (file-name-as-directory (file-name-directory load-file-name)))) + +(provide-theme 'camm4) + +;;; camm4-theme.el ends here diff --git a/themes/cutar-theme.el b/themes/cutar-theme.el new file mode 100644 index 0000000..2ddda66 --- /dev/null +++ b/themes/cutar-theme.el @@ -0,0 +1,167 @@ +;;; cutar-theme.el --- A high-contrast dark theme with blue/pink accents -*- lexical-binding: t; no-byte-compile: t; -*- +(deftheme cutar + "High-contrast dark theme with blue/pink accents. +Optimized for syntax highlighting and UI clarity based on the Custom Terminal palette.") + +(let ((class '((class color) (min-colors 89))) + + ;; --- BASE UI --- + (bg "#fefcff") ;; Default background + (fg "#101010") ;; Default foreground + (cursor "#fefcff") ;; Cursor bg (matches `bg`; visibility depends on `cursor-type`) + (selection "#6ECFD5") ;; Region/selected text background + (selection-fg "#101010") ;; Region/selected text foreground + + ;; --- ANSI NORMAL --- + (dark_blue "#0094E7") ;; Fringe, minibuffer prompts, function names, line numbers, inactive tab borders + (red "#C82829") ;; Errors, negation chars, failed search (`isearch-fail`) + (medium_blue "#005FDB") ;; Keywords, active hyperlinks + (orange "#DD7050") ;; Constants, lazy search highlights, debug indicators + (magenta "#D536AD") ;; Strings, variables, UI dividers (`vertical-border`) + (green "#419722") ;; Docstrings, comment delimiters, info/status indicators + (cyan "#409FAF") ;; Types/Classes + (purple "#8a35b8") ;; Built-ins, visited links + + ;; --- ANSI BRIGHT --- + (light_blue "#82D3FF") ;; Inactive mode-line/tabs background (shares hex with `selection`) + (light_red "#FC7070") ;; Warnings, builtin, regex constructs + (accent_blue "#71A1F3") ;; (Currently unused in faces) + (yellow "#FFB633") ;; Active search (`isearch`), regex backslashes, modified buffer status, warnings + (accent_pink "#EF89DF") ;; Active mode-line/tabs, modeline accent bar + (bright_green "#19BD56") ;; (Currently unused in faces) + (bright_cyan "#9EDEEE") ;; hl-line hl-tab + (light_purple "#B197FC")) ;; (Currently unused in faces) + + (custom-theme-set-faces + 'cutar + + ;; --- CORE UI --- + `(default ((,class (:background ,bg :foreground ,fg)))) + `(cursor ((,class (:background ,bg :foreground ,bg)))) + `(fringe ((,class (:background ,bg :foreground ,dark_blue)))) + `(region ((,class (:background ,selection :foreground ,selection-fg)))) + `(highlight ((,class (:background ,light_blue :foreground ,bg)))) + `(hl-line ((,class (:background ,bright_cyan :extend t)))) ;; Using dark_blue for line highlight dimness + `(link ((,class (:foreground ,medium_blue :underline t)))) + `(link-visited ((,class (:foreground ,purple :underline t)))) + `(minibuffer-prompt ((,class (:foreground ,dark_blue :weight bold)))) + `(vertical-border ((,class (:foreground ,magenta)))) ;; "UI dividers" + + ;; --- SYNTAX HIGHLIGHTING (Font Lock) --- + ;; Comments: ansi_0 (Dark Blue) + `(font-lock-comment-face ((,class (:foreground ,green :slant italic)))) + `(font-lock-comment-delimiter-face ((,class (:foreground ,bright_green :slant italic)))) + + ;; Keywords: ansi_7 (Purple) + `(font-lock-keyword-face ((,class (:foreground ,medium_blue :weight bold)))) + + ;; Strings: ansi_4 (Magenta) + `(font-lock-string-face ((,class (:foreground ,magenta)))) + `(font-lock-regexp-grouping-backslash ((,class (:foreground ,yellow)))) + `(font-lock-regexp-grouping-construct ((,class (:foreground ,light_red)))) + + ;; Functions: Using Accent Pink (ansi_12) for better visibility as "Primary Accent" + `(font-lock-function-name-face ((,class (:foreground ,dark_blue :weight bold)))) + + ;; Variables: Default foreground or slightly dimmed + `(font-lock-variable-name-face ((,class (:foreground ,medium_blue)))) + + ;; Types: ansi_6 (Cyan) + `(font-lock-type-face ((,class (:foreground ,cyan)))) + + ;; Constants: ansi_3 (Orange) + `(font-lock-constant-face ((,class (:foreground ,orange)))) + `(font-lock-builtin-face ((,class (:foreground ,light_red)))) ;; Same as keywords usually + + ;; Doc & Warnings + `(font-lock-doc-face ((,class (:inherit font-lock-comment-face :foreground ,green)))) + `(font-lock-warning-face ((,class (:foreground ,light_red :weight bold)))) + `(font-lock-negation-char-face ((,class (:foreground ,red)))) + + ;; --- MODELINE (Tabs UI Mapping) --- + ;; Active Tab: Accent Pink + `(mode-line ((,class (:background ,accent_pink :foreground ,bg)))) + ;; Inactive Tab: Light Blue + `(mode-line-inactive ((,class (:background ,light_blue :foreground ,fg :box (:line-width 1 :color ,accent_blue))))) + `(mode-line-buffer-id ((,class (:weight bold)))) + `(mode-line-highlight ((,class (:box (:line-width 2 :color ,fg))))) + + ;; --- SEARCH & ISEARCH --- + ;; Search Matches: Yellow (ansi_11) + `(isearch ((,class (:background ,yellow :foreground ,bg :weight bold)))) + `(isearch-fail ((,class (:background ,red :foreground ,fg)))) + `(lazy-highlight ((,class (:background ,orange :foreground ,bg)))) + + ;; --- LINE NUMBERS --- + `(line-number ((,class (:foreground ,light_blue :background ,fg)))) + `(line-number-current-line ((,class (:foreground ,bg :background ,accent_pink :weight bold)))) + + ;; --- DIY (Doom Emacs Specifics) --- + `(doom-modeline-bar ((,class (:background ,accent_pink :foreground ,fg)))) + `(doom-modeline-buffer-file ((,class (:foreground ,fg :weight bold)))) + `(doom-modeline-buffer-path ((,class (:foreground ,fg :weight bold)))) + `(doom-modeline-buffer-modified ((,class (:foreground ,yellow :weight bold)))) + `(doom-modeline-debug ((,class (:foreground ,orange)))) + `(doom-modeline-info ((,class (:foreground ,green)))) + `(doom-modeline-warning ((,class (:foreground ,yellow)))) + `(doom-modeline-error ((,class (:foreground ,red)))) + + ;; --- ORG MODE --- + `(org-level-1 ((,class (:foreground ,accent_pink :weight bold :height 1.2)))) + `(org-level-2 ((,class (:foreground ,accent_blue :weight bold :height 1.1)))) + `(org-level-3 ((,class (:foreground ,bright_green :weight bold)))) + `(org-level-4 ((,class (:foreground ,bright_cyan :weight bold)))) + `(org-level-5 ((,class (:foreground ,light_purple :weight bold)))) + `(org-todo ((,class (:foreground ,light_red :weight bold :box t)))) + `(org-done ((,class (:foreground ,bright_green :weight bold :box t)))) + `(org-date ((,class (:foreground ,medium_blue)))) + `(org-link ((,class (:foreground ,light_purple :underline t)))) ;; "markdown links" -> light_purple + `(org-code ((,class (:foreground ,orange :background ,bg)))) + `(org-block ((,class (:background ,bg :foreground ,fg :extend t)))) + `(org-block-begin-line ((,class (:foreground ,dark_blue :background ,bg :extend t)))) + + ;; --- MAGIT / GIT --- + `(magit-branch-local ((,class (:foreground ,cyan :weight bold)))) + `(magit-branch-remote ((,class (:foreground ,green :weight bold)))) + `(magit-hash ((,class (:foreground ,dark_blue)))) + `(magit-item-highlight ((,class (:background ,selection :foreground ,selection-fg)))) + `(magit-diff-added ((,class (:foreground ,bright_green :background unspecified)))) + `(magit-diff-removed ((,class (:foreground ,light_red :background unspecified)))) + `(magit-diff-context-highlight ((,class (:background ,dark_blue :foreground ,fg)))) + `(magit-section-heading ((,class (:foreground ,bright_cyan :weight bold :underline t)))) + + ;; --- TREE-SITTER --- + `(tree-sitter-hl-face:function.call ((,class (:foreground ,accent_pink)))) + `(tree-sitter-hl-face:method.call ((,class (:foreground ,accent_pink)))) + `(tree-sitter-hl-face:type ((,class (:foreground ,cyan)))) + `(tree-sitter-hl-face:property ((,class (:foreground ,light_blue)))) + `(tree-sitter-hl-face:parameter ((,class (:foreground ,orange)))) + `(tree-sitter-hl-face:escape ((,class (:foreground ,light_red)))) + + ;; --- FLYCHECK / LSP --- + `(flycheck-error ((,class (:underline (:style wave :color ,red))))) + `(flycheck-warning ((,class (:underline (:style wave :color ,orange))))) + `(flycheck-info ((,class (:underline (:style wave :color ,medium_blue))))) + `(lsp-face-highlight-textual ((,class (:background ,selection :foreground ,selection-fg)))) + + ;; --- DASHBOARD --- + `(doom-dashboard-menu-desc ((,class (:foreground ,accent_blue)))) + `(doom-dashboard-banner ((,class (:foreground ,accent_pink)))) + + ;; --- MISC --- + `(show-paren-match ((,class (:background ,accent_blue :foreground ,bg :weight bold)))) + `(show-paren-mismatch ((,class (:background ,red :foreground ,fg :weight bold)))) + `(success ((,class (:foreground ,green)))) + `(error ((,class (:foreground ,red :weight bold)))) + `(warning ((,class (:foreground ,orange)))) + `(header-line ((,class (:background ,dark_blue :foreground ,fg)))))) + +;;;###autoload +(and load-file-name + (boundp 'custom-theme-load-path) + (add-to-list 'custom-theme-load-path + (file-name-as-directory (file-name-directory load-file-name)))) + +(provide-theme 'cutar) + +;;; cutar-theme.el ends here diff --git a/themes/cutarv32-theme.el b/themes/cutarv32-theme.el new file mode 100644 index 0000000..f0e6f5e --- /dev/null +++ b/themes/cutarv32-theme.el @@ -0,0 +1,167 @@ +;;; cutar-theme.el --- A high-contrast dark theme with blue/pink accents -*- lexical-binding: t; no-byte-compile: t; -*- +(deftheme cutarv32 + "High-contrast dark theme with blue/pink accents. +Optimized for syntax highlighting and UI clarity based on the Custom Terminal palette.") + +(let ((class '((class color) (min-colors 89))) + + ;; --- BASE UI --- + (bg "#f8f8ff") ;; Default background + (fg "#000000") ;; Default foreground + (cursor "#f8f8ff") ;; Cursor bg (matches `bg`; visibility depends on `cursor-type`) + (selection "#f0b94a") ;; Region/selected text background + ;;(selection-fg "#000000") ;; Region/selected text foreground + + ;; --- ANSI NORMAL --- + (dark_blue "#007cbf" ) ;; Fringe, minibuffer prompts, function names, line numbers, inactive tab borders + (red "#cf3f29" ) ;; Errors, negation chars, failed search (`isearch-fail`) + (medium_blue "#2374de" ) ;; Keywords, active hyperlinks + (orange "#c76e2a" ) ;; Constants, lazy search highlights, debug indicators + (magenta "#b05197" ) ;; Strings, variables, UI dividers (`vertical-border`) + (green "#429e66" ) ;; Docstrings, comment delimiters, info/status indicators + (cyan "#129cc9" ) ;; Types/Classes + (purple "#a64dd6" ) ;; Built-ins, visited links + + ;; --- ANSI BRIGHT --- + (light_blue "#7cc9f2") ;; Inactive mode-line/tabs background (shares hex with `selection`) + (light_red "#f07b69") ;; Warnings, builtin, regex constructs + (accent_blue "#6f9ff2") ;; (Currently unused in faces) + (yellow "#f0b94a") ;; Active search (`isearch`), regex backslashes, modified buffer status, warnings + (accent_pink "#EF89DF") ;; Active mode-line/tabs, modeline accent bar + (bright_green "#2cd45c") ;; (Currently unused in faces) + (bright_cyan "#17dbe6") ;; hl-line hl-tab + (light_purple "#c8a0f2")) ;; (Currently unused in faces) + + (custom-theme-set-faces + 'cutarv32 + + ;; --- CORE UI --- + `(default ((,class (:background ,bg :foreground ,fg)))) + `(cursor ((,class (:background ,bg :foreground ,bg)))) + `(fringe ((,class (:background ,bg :foreground ,dark_blue)))) + `(region ((,class (:background ,selection)))) + `(highlight ((,class (:background ,light_blue :foreground ,bg)))) + `(hl-line ((,class (:background ,light_purple :extend t)))) ;; Using dark_blue for line highlight dimness + `(link ((,class (:foreground ,medium_blue :underline t)))) + `(link-visited ((,class (:foreground ,purple :underline t)))) + `(minibuffer-prompt ((,class (:foreground ,dark_blue :weight bold)))) + `(vertical-border ((,class (:foreground ,magenta)))) ;; "UI dividers" + + ;; --- SYNTAX HIGHLIGHTING (Font Lock) --- + ;; Comments: ansi_0 (Dark Blue) + `(font-lock-comment-face ((,class (:foreground ,green :slant italic)))) + `(font-lock-comment-delimiter-face ((,class (:foreground ,bright_green :slant italic)))) + + ;; Keywords: ansi_7 (Purple) + `(font-lock-keyword-face ((,class (:foreground ,medium_blue :weight bold)))) + + ;; Strings: ansi_4 (Magenta) + `(font-lock-string-face ((,class (:foreground ,magenta)))) + `(font-lock-regexp-grouping-backslash ((,class (:foreground ,yellow)))) + `(font-lock-regexp-grouping-construct ((,class (:foreground ,light_red)))) + + ;; Functions: Using Accent Pink (ansi_12) for better visibility as "Primary Accent" + `(font-lock-function-name-face ((,class (:foreground ,dark_blue :weight bold)))) + + ;; Variables: Default foreground or slightly dimmed + `(font-lock-variable-name-face ((,class (:foreground ,medium_blue)))) + + ;; Types: ansi_6 (Cyan) + `(font-lock-type-face ((,class (:foreground ,purple)))) + + ;; Constants: ansi_3 (Orange) + `(font-lock-constant-face ((,class (:foreground ,orange)))) + `(font-lock-builtin-face ((,class (:foreground ,light_red)))) ;; Same as keywords usually + + ;; Doc & Warnings + `(font-lock-doc-face ((,class (:inherit font-lock-comment-face :foreground ,green)))) + `(font-lock-warning-face ((,class (:foreground ,light_red :weight bold)))) + `(font-lock-negation-char-face ((,class (:foreground ,red)))) + + ;; --- MODELINE (Tabs UI Mapping) --- + ;; Active Tab: Accent Pink + `(mode-line ((,class (:background ,accent_pink :foreground ,bg)))) + ;; Inactive Tab: Light Blue + `(mode-line-inactive ((,class (:background ,light_blue :foreground ,fg :box (:line-width 1 :color ,accent_blue))))) + `(mode-line-buffer-id ((,class (:weight bold)))) + `(mode-line-highlight ((,class (:box (:line-width 2 :color ,fg))))) + + ;; --- SEARCH & ISEARCH --- + ;; Search Matches: Yellow (ansi_11) + `(isearch ((,class (:background ,yellow :foreground ,bg :weight bold)))) + `(isearch-fail ((,class (:background ,red :foreground ,fg)))) + `(lazy-highlight ((,class (:background ,orange :foreground ,bg)))) + + ;; --- LINE NUMBERS --- + `(line-number ((,class (:foreground ,light_blue :background ,fg)))) + `(line-number-current-line ((,class (:foreground ,bg :background ,accent_pink :weight bold)))) + + ;; --- DIY (Doom Emacs Specifics) --- + `(doom-modeline-bar ((,class (:background ,accent_pink :foreground ,fg)))) + `(doom-modeline-buffer-file ((,class (:foreground ,fg :weight bold)))) + `(doom-modeline-buffer-path ((,class (:foreground ,fg :weight bold)))) + `(doom-modeline-buffer-modified ((,class (:foreground ,yellow :weight bold)))) + `(doom-modeline-debug ((,class (:foreground ,orange)))) + `(doom-modeline-info ((,class (:foreground ,green)))) + `(doom-modeline-warning ((,class (:foreground ,yellow)))) + `(doom-modeline-error ((,class (:foreground ,red)))) + + ;; --- ORG MODE --- + `(org-level-1 ((,class (:foreground ,accent_pink :weight bold :height 1.2)))) + `(org-level-2 ((,class (:foreground ,accent_blue :weight bold :height 1.1)))) + `(org-level-3 ((,class (:foreground ,bright_green :weight bold)))) + `(org-level-4 ((,class (:foreground ,bright_cyan :weight bold)))) + `(org-level-5 ((,class (:foreground ,light_purple :weight bold)))) + `(org-todo ((,class (:foreground ,light_red :weight bold :box t)))) + `(org-done ((,class (:foreground ,bright_green :weight bold :box t)))) + `(org-date ((,class (:foreground ,medium_blue)))) + `(org-link ((,class (:foreground ,light_purple :underline t)))) ;; "markdown links" -> light_purple + `(org-code ((,class (:foreground ,orange :background ,bg)))) + `(org-block ((,class (:background ,bg :foreground ,fg :extend t)))) + `(org-block-begin-line ((,class (:foreground ,dark_blue :background ,bg :extend t)))) + + ;; --- MAGIT / GIT --- + `(magit-branch-local ((,class (:foreground ,cyan :weight bold)))) + `(magit-branch-remote ((,class (:foreground ,green :weight bold)))) + `(magit-hash ((,class (:foreground ,dark_blue)))) + `(magit-item-highlight ((,class (:background ,selection)))) + `(magit-diff-added ((,class (:foreground ,bright_green :background unspecified)))) + `(magit-diff-removed ((,class (:foreground ,light_red :background unspecified)))) + `(magit-diff-context-highlight ((,class (:background ,dark_blue :foreground ,fg)))) + `(magit-section-heading ((,class (:foreground ,bright_cyan :weight bold :underline t)))) + + ;; --- TREE-SITTER --- + `(tree-sitter-hl-face:function.call ((,class (:foreground ,accent_pink)))) + `(tree-sitter-hl-face:method.call ((,class (:foreground ,accent_pink)))) + `(tree-sitter-hl-face:type ((,class (:foreground ,cyan)))) + `(tree-sitter-hl-face:property ((,class (:foreground ,light_blue)))) + `(tree-sitter-hl-face:parameter ((,class (:foreground ,orange)))) + `(tree-sitter-hl-face:escape ((,class (:foreground ,light_red)))) + + ;; --- FLYCHECK / LSP --- + `(flycheck-error ((,class (:underline (:style wave :color ,red))))) + `(flycheck-warning ((,class (:underline (:style wave :color ,orange))))) + `(flycheck-info ((,class (:underline (:style wave :color ,medium_blue))))) + `(lsp-face-highlight-textual ((,class (:background ,selection)))) + + ;; --- DASHBOARD --- + `(doom-dashboard-menu-desc ((,class (:foreground ,accent_blue)))) + `(doom-dashboard-banner ((,class (:foreground ,accent_pink)))) + + ;; --- MISC --- + `(show-paren-match ((,class (:background ,accent_blue :foreground ,bg :weight bold)))) + `(show-paren-mismatch ((,class (:background ,red :foreground ,fg :weight bold)))) + `(success ((,class (:foreground ,green)))) + `(error ((,class (:foreground ,red :weight bold)))) + `(warning ((,class (:foreground ,orange)))) + `(header-line ((,class (:background ,dark_blue :foreground ,fg)))))) + +;;;###autoload +(and load-file-name + (boundp 'custom-theme-load-path) + (add-to-list 'custom-theme-load-path + (file-name-as-directory (file-name-directory load-file-name)))) + +(provide-theme 'cutarv32) + +;;; cutarv32-theme.el ends here diff --git a/themes/cutarv32_dark-theme.el b/themes/cutarv32_dark-theme.el new file mode 100644 index 0000000..72aaa96 --- /dev/null +++ b/themes/cutarv32_dark-theme.el @@ -0,0 +1,167 @@ +;;; cutarv32_dark-theme.el --- A high-contrast dark theme with blue/pink accents -*- lexical-binding: t; no-byte-compile: t; -*- +(deftheme cutarv32_dark + "High-contrast dark theme with blue/pink accents. +Optimized for syntax highlighting and UI clarity based on the Custom Terminal palette.") + +(let ((class '((class color) (min-colors 89))) + + ;; --- BASE UI --- + (bg "#0d0d0d") ;; Default background + (fg "#f8f8ff") ;; Default foreground + (cursor "#f8f8ff") ;; Cursor bg (matches `bg`; visibility depends on `cursor-type`) + (selection "#f0b94a") ;; Region/selected text background + ;;(selection-fg "#000000") ;; Region/selected text foreground + + ;; --- ANSI NORMAL --- + (dark_blue "#007cbf" ) ;; Fringe, minibuffer prompts, function names, line numbers, inactive tab borders + (red "#cf3f29" ) ;; Errors, negation chars, failed search (`isearch-fail`) + (medium_blue "#2374de" ) ;; Keywords, active hyperlinks + (orange "#c76e2a" ) ;; Constants, lazy search highlights, debug indicators + (magenta "#b05197" ) ;; Strings, variables, UI dividers (`vertical-border`) + (green "#429e66" ) ;; Docstrings, comment delimiters, info/status indicators + (cyan "#129cc9" ) ;; Types/Classes + (purple "#a64dd6" ) ;; Built-ins, visited links + + ;; --- ANSI BRIGHT --- + (light_blue "#7cc9f2") ;; Inactive mode-line/tabs background (shares hex with `selection`) + (light_red "#f07b69") ;; Warnings, builtin, regex constructs + (accent_blue "#6f9ff2") ;; (Currently unused in faces) + (yellow "#f0b94a") ;; Active search (`isearch`), regex backslashes, modified buffer status, warnings + (accent_pink "#EF89DF") ;; Active mode-line/tabs, modeline accent bar + (bright_green "#2cd45c") ;; (Currently unused in faces) + (bright_cyan "#17dbe6") ;; hl-line hl-tab + (light_purple "#c8a0f2")) ;; (Currently unused in faces) + + (custom-theme-set-faces + 'cutarv32_dark + + ;; --- CORE UI --- + `(default ((,class (:background ,bg :foreground ,fg)))) + `(cursor ((,class (:background ,bg :foreground ,bg)))) + `(fringe ((,class (:background ,bg :foreground ,dark_blue)))) + `(region ((,class (:background ,selection)))) + `(highlight ((,class (:background ,light_blue :foreground ,bg)))) + `(hl-line ((,class (:background ,light_purple :extend t)))) ;; Using dark_blue for line highlight dimness + `(link ((,class (:foreground ,medium_blue :underline t)))) + `(link-visited ((,class (:foreground ,purple :underline t)))) + `(minibuffer-prompt ((,class (:foreground ,dark_blue :weight bold)))) + `(vertical-border ((,class (:foreground ,magenta)))) ;; "UI dividers" + + ;; --- SYNTAX HIGHLIGHTING (Font Lock) --- + ;; Comments: ansi_0 (Dark Blue) + `(font-lock-comment-face ((,class (:foreground ,green :slant italic)))) + `(font-lock-comment-delimiter-face ((,class (:foreground ,bright_green :slant italic)))) + + ;; Keywords: ansi_7 (Purple) + `(font-lock-keyword-face ((,class (:foreground ,medium_blue :weight bold)))) + + ;; Strings: ansi_4 (Magenta) + `(font-lock-string-face ((,class (:foreground ,magenta)))) + `(font-lock-regexp-grouping-backslash ((,class (:foreground ,yellow)))) + `(font-lock-regexp-grouping-construct ((,class (:foreground ,light_red)))) + + ;; Functions: Using Accent Pink (ansi_12) for better visibility as "Primary Accent" + `(font-lock-function-name-face ((,class (:foreground ,dark_blue :weight bold)))) + + ;; Variables: Default foreground or slightly dimmed + `(font-lock-variable-name-face ((,class (:foreground ,medium_blue)))) + + ;; Types: ansi_6 (Cyan) + `(font-lock-type-face ((,class (:foreground ,purple)))) + + ;; Constants: ansi_3 (Orange) + `(font-lock-constant-face ((,class (:foreground ,orange)))) + `(font-lock-builtin-face ((,class (:foreground ,light_red)))) ;; Same as keywords usually + + ;; Doc & Warnings + `(font-lock-doc-face ((,class (:inherit font-lock-comment-face :foreground ,green)))) + `(font-lock-warning-face ((,class (:foreground ,light_red :weight bold)))) + `(font-lock-negation-char-face ((,class (:foreground ,red)))) + + ;; --- MODELINE (Tabs UI Mapping) --- + ;; Active Tab: Accent Pink + `(mode-line ((,class (:background ,accent_pink :foreground ,bg)))) + ;; Inactive Tab: Light Blue + `(mode-line-inactive ((,class (:background ,light_blue :foreground ,fg :box (:line-width 1 :color ,accent_blue))))) + `(mode-line-buffer-id ((,class (:weight bold)))) + `(mode-line-highlight ((,class (:box (:line-width 2 :color ,fg))))) + + ;; --- SEARCH & ISEARCH --- + ;; Search Matches: Yellow (ansi_11) + `(isearch ((,class (:background ,yellow :foreground ,bg :weight bold)))) + `(isearch-fail ((,class (:background ,red :foreground ,fg)))) + `(lazy-highlight ((,class (:background ,orange :foreground ,bg)))) + + ;; --- LINE NUMBERS --- + `(line-number ((,class (:foreground ,light_blue :background ,fg)))) + `(line-number-current-line ((,class (:foreground ,bg :background ,accent_pink :weight bold)))) + + ;; --- DIY (Doom Emacs Specifics) --- + `(doom-modeline-bar ((,class (:background ,accent_pink :foreground ,fg)))) + `(doom-modeline-buffer-file ((,class (:foreground ,fg :weight bold)))) + `(doom-modeline-buffer-path ((,class (:foreground ,fg :weight bold)))) + `(doom-modeline-buffer-modified ((,class (:foreground ,yellow :weight bold)))) + `(doom-modeline-debug ((,class (:foreground ,orange)))) + `(doom-modeline-info ((,class (:foreground ,green)))) + `(doom-modeline-warning ((,class (:foreground ,yellow)))) + `(doom-modeline-error ((,class (:foreground ,red)))) + + ;; --- ORG MODE --- + `(org-level-1 ((,class (:foreground ,accent_pink :weight bold :height 1.2)))) + `(org-level-2 ((,class (:foreground ,accent_blue :weight bold :height 1.1)))) + `(org-level-3 ((,class (:foreground ,bright_green :weight bold)))) + `(org-level-4 ((,class (:foreground ,bright_cyan :weight bold)))) + `(org-level-5 ((,class (:foreground ,light_purple :weight bold)))) + `(org-todo ((,class (:foreground ,light_red :weight bold :box t)))) + `(org-done ((,class (:foreground ,bright_green :weight bold :box t)))) + `(org-date ((,class (:foreground ,medium_blue)))) + `(org-link ((,class (:foreground ,light_purple :underline t)))) ;; "markdown links" -> light_purple + `(org-code ((,class (:foreground ,orange :background ,bg)))) + `(org-block ((,class (:background ,bg :foreground ,fg :extend t)))) + `(org-block-begin-line ((,class (:foreground ,dark_blue :background ,bg :extend t)))) + + ;; --- MAGIT / GIT --- + `(magit-branch-local ((,class (:foreground ,cyan :weight bold)))) + `(magit-branch-remote ((,class (:foreground ,green :weight bold)))) + `(magit-hash ((,class (:foreground ,dark_blue)))) + `(magit-item-highlight ((,class (:background ,selection)))) + `(magit-diff-added ((,class (:foreground ,bright_green :background unspecified)))) + `(magit-diff-removed ((,class (:foreground ,light_red :background unspecified)))) + `(magit-diff-context-highlight ((,class (:background ,dark_blue :foreground ,fg)))) + `(magit-section-heading ((,class (:foreground ,bright_cyan :weight bold :underline t)))) + + ;; --- TREE-SITTER --- + `(tree-sitter-hl-face:function.call ((,class (:foreground ,accent_pink)))) + `(tree-sitter-hl-face:method.call ((,class (:foreground ,accent_pink)))) + `(tree-sitter-hl-face:type ((,class (:foreground ,cyan)))) + `(tree-sitter-hl-face:property ((,class (:foreground ,light_blue)))) + `(tree-sitter-hl-face:parameter ((,class (:foreground ,orange)))) + `(tree-sitter-hl-face:escape ((,class (:foreground ,light_red)))) + + ;; --- FLYCHECK / LSP --- + `(flycheck-error ((,class (:underline (:style wave :color ,red))))) + `(flycheck-warning ((,class (:underline (:style wave :color ,orange))))) + `(flycheck-info ((,class (:underline (:style wave :color ,medium_blue))))) + `(lsp-face-highlight-textual ((,class (:background ,selection)))) + + ;; --- DASHBOARD --- + `(doom-dashboard-menu-desc ((,class (:foreground ,accent_blue)))) + `(doom-dashboard-banner ((,class (:foreground ,accent_pink)))) + + ;; --- MISC --- + `(show-paren-match ((,class (:background ,accent_blue :foreground ,bg :weight bold)))) + `(show-paren-mismatch ((,class (:background ,red :foreground ,fg :weight bold)))) + `(success ((,class (:foreground ,green)))) + `(error ((,class (:foreground ,red :weight bold)))) + `(warning ((,class (:foreground ,orange)))) + `(header-line ((,class (:background ,dark_blue :foreground ,fg)))))) + +;;;###autoload +(and load-file-name + (boundp 'custom-theme-load-path) + (add-to-list 'custom-theme-load-path + (file-name-as-directory (file-name-directory load-file-name)))) + +(provide-theme 'cutarv32_dark) + +;;; cutarv32_dark-theme.el ends here