;;; campbell-theme.el --- Classic blue PowerShell theme -*- lexical-binding: t; -*-
;; Copyright (C) 2026
;; Author: ntmacs contributors
;; Version: 1.0.0
;; Package-Requires: ((emacs "27.1"))
;; Keywords: faces, theme
;;; Commentary:
;; An Emacs theme with the classic Windows PowerShell blue background and
;; white foreground. The Campbell terminal palette is preserved verbatim for
;; ANSI output; brighter variants are used where editor text needs contrast.
;;; Code:
(deftheme campbell
"Classic blue PowerShell with the Windows Campbell terminal palette.")
(let ((background "#012456")
(foreground "#FFFFFF")
(cursor "#FFFFFF")
(selection "#FFFFFF")
(black "#0C0C0C")
(blue "#0037DA")
(cyan "#3A96DD")
(green "#8CBD8C")
(purple "#881798")
(red "#C50F1F")
(white "#CCCCCC")
(yellow "#C19C00")
(bright-black "#767676")
(bright-blue "#3B78FF")
(bright-cyan "#61D6D6")
(bright-green "#16C60C")
(bright-purple "#B4009E")
(bright-red "#E74856")
(bright-white "#F2F2F2")
(bright-yellow "#F9F1A5"))
(custom-theme-set-faces
'campbell
;; Core Emacs UI
`(default ((t (:background ,background :foreground ,foreground))))
`(cursor ((t (:background ,cursor))))
`(fringe ((t (:background ,background :foreground ,bright-black))))
`(highlight ((t (:background ,bright-black :foreground ,bright-white))))
`(region ((t (:background ,selection :foreground ,black :extend t))))
`(secondary-selection ((t (:background ,cyan :foreground ,black :extend t))))
`(shadow ((t (:foreground ,bright-black))))
`(vertical-border ((t (:foreground ,bright-black))))
`(window-divider ((t (:foreground ,bright-black))))
`(window-divider-first-pixel ((t (:foreground ,background))))
`(window-divider-last-pixel ((t (:foreground ,bright-black))))
`(minibuffer-prompt ((t (:foreground ,bright-cyan :weight bold))))
`(link ((t (:foreground ,bright-cyan :underline t))))
`(link-visited ((t (:foreground ,bright-purple :underline t))))
`(button ((t (:foreground ,bright-cyan :underline t))))
`(escape-glyph ((t (:foreground ,bright-yellow))))
`(homoglyph ((t (:foreground ,bright-yellow))))
`(error ((t (:foreground ,bright-red :weight bold))))
`(warning ((t (:foreground ,bright-yellow :weight bold))))
`(success ((t (:foreground ,bright-green :weight bold))))
`(tooltip ((t (:background ,bright-white :foreground ,black))))
`(child-frame-border ((t (:background ,bright-blue))))
;; Mode lines, tabs, and line numbers
`(mode-line ((t (:background ,bright-white :foreground ,black
:box (:line-width -1 :color ,white) :weight bold))))
`(mode-line-inactive ((t (:background ,background :foreground ,bright-black
:box (:line-width -1 :color ,bright-black)))))
`(mode-line-buffer-id ((t (:weight bold))))
`(header-line ((t (:background ,background :foreground ,bright-cyan
:box (:line-width -1 :color ,bright-black)))))
`(tab-bar ((t (:background ,background :foreground ,foreground))))
`(tab-bar-tab ((t (:background ,bright-white :foreground ,black
:box (:line-width -1 :color ,bright-white) :weight bold))))
`(tab-bar-tab-inactive ((t (:background ,background :foreground ,bright-black
:box (:line-width -1 :color ,bright-black)))))
`(tab-line ((t (:background ,background :foreground ,bright-black))))
`(tab-line-tab ((t (:background ,bright-white :foreground ,black))))
`(tab-line-tab-current ((t (:background ,bright-blue :foreground ,bright-white
:weight bold))))
`(tab-line-tab-inactive ((t (:background ,background :foreground ,bright-black))))
`(line-number ((t (:background ,background :foreground ,bright-black))))
`(line-number-current-line ((t (:background ,background :foreground ,bright-yellow
:weight bold))))
`(fill-column-indicator ((t (:foreground ,bright-black))))
;; Searching, matching, and editing feedback
`(isearch ((t (:background ,bright-blue :foreground ,bright-white :weight bold))))
`(isearch-fail ((t (:background ,bright-red :foreground ,black :weight bold))))
`(lazy-highlight ((t (:background ,yellow :foreground ,black))))
`(match ((t (:background ,bright-yellow :foreground ,black :weight bold))))
`(query-replace ((t (:inherit isearch))))
`(show-paren-match ((t (:background ,bright-green :foreground ,black :weight bold))))
`(show-paren-mismatch ((t (:background ,bright-red :foreground ,black :weight bold))))
`(trailing-whitespace ((t (:background ,red))))
`(hl-line ((t (:underline (:color ,bright-black :style line)))))
`(pulse-highlight-start-face ((t (:background ,yellow :foreground ,black))))
;; Syntax highlighting
`(font-lock-builtin-face ((t (:foreground ,bright-purple))))
`(font-lock-comment-face ((t (:foreground ,bright-black :slant italic))))
`(font-lock-comment-delimiter-face ((t (:foreground ,bright-black))))
`(font-lock-constant-face ((t (:foreground ,bright-purple))))
`(font-lock-doc-face ((t (:foreground ,green :slant italic))))
`(font-lock-doc-markup-face ((t (:foreground ,bright-green))))
`(font-lock-function-call-face ((t (:foreground ,bright-cyan))))
`(font-lock-function-name-face ((t (:foreground ,bright-cyan :weight bold))))
`(font-lock-keyword-face ((t (:foreground ,bright-blue :weight bold))))
`(font-lock-negation-char-face ((t (:foreground ,bright-red :weight bold))))
`(font-lock-number-face ((t (:foreground ,bright-purple))))
`(font-lock-operator-face ((t (:foreground ,bright-white))))
`(font-lock-preprocessor-face ((t (:foreground ,bright-purple))))
`(font-lock-property-name-face ((t (:foreground ,cyan))))
`(font-lock-property-use-face ((t (:foreground ,cyan))))
`(font-lock-punctuation-face ((t (:foreground ,white))))
`(font-lock-regexp-grouping-backslash ((t (:foreground ,bright-yellow :weight bold))))
`(font-lock-regexp-grouping-construct ((t (:foreground ,bright-purple :weight bold))))
`(font-lock-string-face ((t (:foreground ,bright-yellow))))
`(font-lock-type-face ((t (:foreground ,bright-green))))
`(font-lock-variable-name-face ((t (:foreground ,cyan))))
`(font-lock-variable-use-face ((t (:foreground ,cyan))))
`(font-lock-warning-face ((t (:foreground ,bright-red :weight bold))))
;; Completion and minibuffer interfaces
`(completions-annotations ((t (:foreground ,bright-black :slant italic))))
`(completions-common-part ((t (:foreground ,bright-cyan :weight bold))))
`(completions-first-difference ((t (:foreground ,bright-yellow :weight bold))))
`(icomplete-first-match ((t (:foreground ,bright-green :weight bold))))
`(vertico-current ((t (:background ,bright-black :foreground ,bright-white))))
`(orderless-match-face-0 ((t (:foreground ,bright-cyan :weight bold))))
`(orderless-match-face-1 ((t (:foreground ,bright-yellow :weight bold))))
`(orderless-match-face-2 ((t (:foreground ,bright-green :weight bold))))
`(orderless-match-face-3 ((t (:foreground ,bright-purple :weight bold))))
`(company-tooltip ((t (:background ,background :foreground ,foreground))))
`(company-tooltip-selection ((t (:background ,bright-black :foreground ,bright-white))))
`(company-tooltip-common ((t (:foreground ,bright-cyan :weight bold))))
`(company-scrollbar-bg ((t (:background ,background))))
`(company-scrollbar-fg ((t (:background ,bright-black))))
`(company-preview-common ((t (:foreground ,bright-cyan))))
`(corfu-default ((t (:background ,background :foreground ,foreground))))
`(corfu-current ((t (:background ,bright-black :foreground ,bright-white))))
`(corfu-bar ((t (:background ,bright-black))))
`(corfu-border ((t (:background ,bright-blue))))
;; Diagnostics and compilation
`(flymake-error ((t (:underline (:style wave :color ,bright-red)))))
`(flymake-warning ((t (:underline (:style wave :color ,bright-yellow)))))
`(flymake-note ((t (:underline (:style wave :color ,bright-cyan)))))
`(flycheck-error ((t (:underline (:style wave :color ,bright-red)))))
`(flycheck-warning ((t (:underline (:style wave :color ,bright-yellow)))))
`(flycheck-info ((t (:underline (:style wave :color ,bright-cyan)))))
`(compilation-error ((t (:foreground ,bright-red :weight bold))))
`(compilation-warning ((t (:foreground ,bright-yellow :weight bold))))
`(compilation-info ((t (:foreground ,bright-green))))
`(compilation-mode-line-exit ((t (:foreground ,bright-green :weight bold))))
`(compilation-mode-line-fail ((t (:foreground ,bright-red :weight bold))))
`(compilation-mode-line-run ((t (:foreground ,bright-yellow :weight bold))))
;; Diff and version-control interfaces
`(diff-added ((t (:foreground ,bright-green))))
`(diff-removed ((t (:foreground ,bright-red))))
`(diff-changed ((t (:foreground ,bright-yellow))))
`(diff-refine-added ((t (:background ,green :foreground ,black))))
`(diff-refine-removed ((t (:background ,red :foreground ,bright-white))))
`(diff-refine-changed ((t (:background ,yellow :foreground ,black))))
`(diff-header ((t (:foreground ,bright-cyan))))
`(diff-file-header ((t (:foreground ,bright-white :weight bold))))
`(diff-hunk-header ((t (:foreground ,bright-purple))))
`(diff-context ((t (:foreground ,bright-black))))
`(magit-section-heading ((t (:foreground ,bright-yellow :weight bold))))
`(magit-section-highlight ((t (:background ,background))))
`(magit-branch-local ((t (:foreground ,bright-cyan))))
`(magit-branch-remote ((t (:foreground ,bright-green))))
`(magit-hash ((t (:foreground ,bright-black))))
`(magit-diff-added ((t (:foreground ,bright-green))))
`(magit-diff-added-highlight ((t (:background ,green :foreground ,black))))
`(magit-diff-removed ((t (:foreground ,bright-red))))
`(magit-diff-removed-highlight ((t (:background ,red :foreground ,bright-white))))
`(magit-diff-context-highlight ((t (:background ,background :foreground ,foreground))))
`(magit-diff-hunk-heading ((t (:background ,background :foreground ,bright-purple))))
`(magit-diff-hunk-heading-highlight ((t (:background ,bright-black :foreground ,bright-white))))
`(magit-diff-file-heading ((t (:foreground ,bright-white :weight bold))))
`(magit-diff-file-heading-highlight ((t (:background ,background :foreground ,bright-cyan
:weight bold))))
`(git-gutter:added ((t (:foreground ,bright-green :weight bold))))
`(git-gutter:deleted ((t (:foreground ,bright-red :weight bold))))
`(git-gutter:modified ((t (:foreground ,bright-yellow :weight bold))))
;; Org and outline
`(outline-1 ((t (:foreground ,bright-cyan :weight bold))))
`(outline-2 ((t (:foreground ,bright-green :weight bold))))
`(outline-3 ((t (:foreground ,bright-blue :weight bold))))
`(outline-4 ((t (:foreground ,bright-yellow :weight bold))))
`(outline-5 ((t (:foreground ,bright-purple :weight bold))))
`(outline-6 ((t (:foreground ,cyan :weight bold))))
`(outline-7 ((t (:foreground ,green :weight bold))))
`(outline-8 ((t (:foreground ,yellow :weight bold))))
`(org-document-title ((t (:foreground ,bright-white :weight bold :height 1.3))))
`(org-document-info ((t (:foreground ,bright-cyan))))
`(org-document-info-keyword ((t (:foreground ,bright-black))))
`(org-level-1 ((t (:inherit outline-1 :height 1.2))))
`(org-level-2 ((t (:inherit outline-2 :height 1.1))))
`(org-level-3 ((t (:inherit outline-3))))
`(org-level-4 ((t (:inherit outline-4))))
`(org-level-5 ((t (:inherit outline-5))))
`(org-level-6 ((t (:inherit outline-6))))
`(org-level-7 ((t (:inherit outline-7))))
`(org-level-8 ((t (:inherit outline-8))))
`(org-block ((t (:foreground ,white))))
`(org-block-begin-line ((t (:foreground ,bright-black :slant italic))))
`(org-block-end-line ((t (:inherit org-block-begin-line))))
`(org-code ((t (:foreground ,bright-yellow))))
`(org-verbatim ((t (:foreground ,bright-green))))
`(org-quote ((t (:foreground ,bright-white :slant italic))))
`(org-table ((t (:foreground ,bright-cyan))))
`(org-date ((t (:foreground ,bright-blue :underline t))))
`(org-link ((t (:inherit link))))
`(org-tag ((t (:foreground ,bright-purple :weight bold))))
`(org-todo ((t (:foreground ,bright-red :weight bold))))
`(org-done ((t (:foreground ,bright-green :weight bold))))
`(org-headline-done ((t (:foreground ,bright-black))))
`(org-checkbox ((t (:foreground ,bright-cyan :weight bold))))
`(org-special-keyword ((t (:foreground ,bright-black))))
;; Markdown
`(markdown-header-face-1 ((t (:inherit outline-1 :height 1.2))))
`(markdown-header-face-2 ((t (:inherit outline-2 :height 1.1))))
`(markdown-header-face-3 ((t (:inherit outline-3))))
`(markdown-header-face-4 ((t (:inherit outline-4))))
`(markdown-header-face-5 ((t (:inherit outline-5))))
`(markdown-header-face-6 ((t (:inherit outline-6))))
`(markdown-code-face ((t (:foreground ,bright-yellow))))
`(markdown-inline-code-face ((t (:foreground ,bright-yellow))))
`(markdown-link-face ((t (:foreground ,bright-cyan))))
`(markdown-url-face ((t (:foreground ,bright-blue :underline t))))
`(markdown-blockquote-face ((t (:foreground ,bright-black :slant italic))))
;; Dired, calendar, and miscellaneous built-ins
`(dired-directory ((t (:foreground ,bright-blue :weight bold))))
`(dired-symlink ((t (:foreground ,bright-cyan))))
`(dired-mark ((t (:foreground ,bright-yellow :weight bold))))
`(dired-marked ((t (:foreground ,bright-purple :weight bold))))
`(dired-flagged ((t (:foreground ,bright-red :weight bold))))
`(dired-header ((t (:foreground ,bright-cyan :weight bold))))
`(calendar-today ((t (:background ,bright-white :foreground ,black :weight bold))))
`(holiday ((t (:foreground ,bright-red))))
`(diary ((t (:foreground ,bright-yellow))))
`(help-key-binding ((t (:background ,bright-black :foreground ,bright-white
:box (:line-width -1 :color ,bright-black)))))
`(custom-variable-tag ((t (:foreground ,bright-cyan :weight bold))))
`(custom-group-tag ((t (:foreground ,bright-blue :weight bold :height 1.1))))
`(custom-button ((t (:background ,bright-white :foreground ,black
:box (:line-width 1 :style released-button)))))
`(custom-button-mouse ((t (:background ,bright-cyan :foreground ,black))))
`(custom-button-pressed ((t (:background ,bright-blue :foreground ,bright-white
:box (:line-width 1 :style pressed-button)))))
`(which-key-key-face ((t (:foreground ,bright-cyan :weight bold))))
`(which-key-command-description-face ((t (:foreground ,foreground))))
`(which-key-group-description-face ((t (:foreground ,bright-purple))))
`(which-key-note-face ((t (:foreground ,bright-yellow))))
`(transient-heading ((t (:foreground ,bright-yellow :weight bold))))
`(transient-key ((t (:foreground ,bright-cyan :weight bold))))
`(transient-argument ((t (:foreground ,bright-green))))
`(transient-inactive-value ((t (:foreground ,bright-black))))
;; Shells and ANSI colors
`(comint-highlight-prompt ((t (:foreground ,bright-cyan :weight bold))))
`(comint-highlight-input ((t (:foreground ,bright-white :weight bold))))
`(eshell-prompt ((t (:foreground ,bright-cyan :weight bold))))
`(ansi-color-black ((t (:foreground ,black :background ,black))))
`(ansi-color-red ((t (:foreground ,red :background ,red))))
`(ansi-color-green ((t (:foreground ,green :background ,green))))
`(ansi-color-yellow ((t (:foreground ,yellow :background ,yellow))))
`(ansi-color-blue ((t (:foreground ,blue :background ,blue))))
`(ansi-color-magenta ((t (:foreground ,purple :background ,purple))))
`(ansi-color-cyan ((t (:foreground ,cyan :background ,cyan))))
`(ansi-color-white ((t (:foreground ,white :background ,white))))
`(ansi-color-bright-black ((t (:foreground ,bright-black :background ,bright-black))))
`(ansi-color-bright-red ((t (:foreground ,bright-red :background ,bright-red))))
`(ansi-color-bright-green ((t (:foreground ,bright-green :background ,bright-green))))
`(ansi-color-bright-yellow ((t (:foreground ,bright-yellow :background ,bright-yellow))))
`(ansi-color-bright-blue ((t (:foreground ,bright-blue :background ,bright-blue))))
`(ansi-color-bright-magenta ((t (:foreground ,bright-purple :background ,bright-purple))))
`(ansi-color-bright-cyan ((t (:foreground ,bright-cyan :background ,bright-cyan))))
`(ansi-color-bright-white ((t (:foreground ,bright-white :background ,bright-white))))
`(term-color-black ((t (:foreground ,black :background ,black))))
`(term-color-red ((t (:foreground ,red :background ,red))))
`(term-color-green ((t (:foreground ,green :background ,green))))
`(term-color-yellow ((t (:foreground ,yellow :background ,yellow))))
`(term-color-blue ((t (:foreground ,blue :background ,blue))))
`(term-color-magenta ((t (:foreground ,purple :background ,purple))))
`(term-color-cyan ((t (:foreground ,cyan :background ,cyan))))
`(term-color-white ((t (:foreground ,white :background ,white)))))
(custom-theme-set-variables
'campbell
`(ansi-color-names-vector
[,black ,red ,green ,yellow ,blue ,purple ,cyan ,white])))
;;;###theme-autoload
(when load-file-name
(add-to-list 'custom-theme-load-path
(file-name-as-directory (file-name-directory load-file-name))))
(provide-theme 'campbell)
;;; campbell-theme.el ends here