;;; leucosis-theme.el --- Ouroboros daylight theme with opalescent, pastel colors -*- lexical-binding:t ;;; Commentary: ;; This is a low contrast theme. ;;; Code: (require 'subr-x) ;;; Helper functions for modifying colors (defun darken (hexcode %-lighter) "Darken a hex code by a given %" (let* ((code (string-remove-prefix "#" hexcode)) (r-val (string-to-number (substring code 0 2) 16)) (g-val (string-to-number (substring code 2 4) 16)) (b-val (string-to-number (substring code 4 6) 16)) (new-r (max 0 (round (- r-val (* r-val %-lighter))))) (new-g (max 0 (round (- g-val (* g-val %-lighter))))) (new-b (max 0 (round (- b-val (* b-val %-lighter)))))) (format "#%x%x%x" new-r new-g new-b))) (defun lighten (hexcode %-lighter) "Lighten a hex code by a given %" (let* ((code (string-remove-prefix "#" hexcode)) (r-val (string-to-number (substring code 0 2) 16)) (g-val (string-to-number (substring code 2 4) 16)) (b-val (string-to-number (substring code 4 6) 16)) (new-r (min 255 (round (+ r-val (* r-val %-lighter))))) (new-g (min 255 (round (+ g-val (* g-val %-lighter))))) (new-b (min 255 (round (+ b-val (* b-val %-lighter)))))) (format "#%x%x%x" new-r new-g new-b))) ;;; Custom faces (defface fixed-pitch-scrawled '() "Fixed pitch face for scrawled text." :group 'basic-faces) (defface variable-pitch-serif '() "Variable pitch serif face." :group 'basic-faces) (defface variable-pitch-serif-text '() "Slightly larger variable pitch serif face." :group 'basic-faces) ;;; Theme definition (deftheme leucosis "Daylight theme from Ouroboros - opalescent, pastel colours on an off-white background." :background-mode 'light :contrast 'low) ;; Color palette and settings (let ( ;; Fonts (fixed-pitch-font "Monaspace Argon Frozen") (fixed-pitch-alternative "Monaspace Radon Frozen ") (fixed-pitch-serif "Monaspace Xenon Frozen") (sans-serif-font "Ysabeau") (serif-font "Crimson Pro") ;; Default, standard colors (bg-main "#deeded") (fg-main "#4d4d4d") ;; Accent colors (accent-one "#c49672") (accent-two "#8ca8d1") (accent-three "#62c089") (accent-four "#A85D92") (accent-five "#CC9292") ;; Extra saturated accents (accent-one-saturated "#dc935b") (accent-two-saturated "#77a3e4") (accent-three-saturated "#49da85") (accent-four-saturated "#cb399f") (accent-five-saturated "#d85555") ;; Desaturated accents (accent-one-desaturated "#b49883") (accent-two-desaturated "#98a9c2") (accent-three-desaturated "#75ae8d") (accent-four-desaturated "#996c8b") (accent-five-desaturated "#ad8080") ) (custom-theme-set-faces 'leucosis ;;; Standard Text Faces ;; Default `(default ((t (:foreground ,fg-main :background ,bg-main :family ,fixed-pitch-font :weight semibold :height 98 :width semiexpanded)))) ;; Fixed pitch - the default fixed pitch setting here is Monaspace Radon, which can be used for comments ;; Fixed pitch serif - Monaspace Xenon `(fixed-pitch ((t (:foreground ,fg-main :background ,bg-main :family ,fixed-pitch-font :weight semibold :height 98 :width semiexpanded)))) `(fixed-pitch-scrawled ((t (:inheirt default :family ,fixed-pitch-alternative)))) `(fixed-pitch-serif ((t (:inherit default :family ,fixed-pitch-serif)))) ;; Variable pitch fonts - the default is sans serif Ysabeau, but we provide another face for serif fonts `(variable-pitch ((t (:inherit default :family ,sans-serif-font :height 118)))) `(variable-pitch-text ((t (:inherit variable-pitch :height 138)))) `(variable-pitch-serif ((t (:inherit default :family ,serif-font :height 118)))) `(variable-pitch-serif-text ((t (:inherit variable-pitch-serif :height 138)))) ;; Shadow is just a lightened foreground `(shadow ((t (:inherit default :foreground ,(lighten fg-main 0.7))))) ;;; Highlighting `(highlight ((t (:background ,(lighten accent-two-desaturated 0.3) :foreground ,(darken bg-main 0.4))))) `(region ((t (:extend t :background ,(lighten accent-one-desaturated 0.3))))) `(secondary-selection ((t (:inherit region :background ,(lighten accent-five-desaturated 0.3))))) ;; trailing-whitespace ;; escape-glyph ;; homoglyph ;; nobreak-space ;; nobreak-hyphen ;; isearch highlights `(isearch ((t (:background ,accent-three :foreground ,bg-main)))) `(query-replace ((t (:inherit isearch :slant italic)))) `(lazy-highlight ((t (:inherit isearch :background ,accent-five-desaturated)))) ;;; Frame Appearance `(cursor ((t (:background ,fg-main)))) `(fringe ((t (:background ,bg-main)))) ;; mouse ;; tooltip `(minibuffer-prompt ((t (:inherit default :foreground ,accent-two-saturated)))) `(vertical-border ((t (:foreground ,accent-one-saturated)))) ;;; Mode line and telephone `(mode-line ((t (:background ,accent-one :foreground ,fg-main :box (:line-width (1 . -1) :color ,accent-one-saturated))))) `(telephone-line-accent-active ((t (:inherit mode-line :background ,(darken fg-main 0.3) :foreground ,bg-main :box nil)))) `(mode-line-inactive ((t (:weight light :foreground ,bg-main :background ,accent-five)))) `(telephone-line-accent-inactive ((t (:inherit mode-line :background ,(lighten fg-main 0.3) :foreground ,bg-main :box nil)))) '(mode-line-buffer-id ((t (:weight bold)))) '(mode-line-emphasis ((t (:weight bold)))) `(mode-line-highlight ((t (:background ,accent-one-desaturated :box (:line-width (2 . 2) :color ,bg-main :style released-button))))) `(mode-line-buffer-id ((t (:foreground ,accent-four-saturated)))) `(header-line ((t (:inherit mode-line)))) `(tab-line ((t (:inherit mode-line)))) ;; scroll-bar ;; tool-bar ;; tab-bar ;; menu ;; tty-menu-enabled, disabled, selected-face ;;; Font lock faces '(font-lock-bracket-face ((t (:inherit font-lock-punctuation-face)))) `(font-lock-builtin-face ((t (:foreground ,accent-four-saturated :weight bold)))) '(font-lock-comment-delimiter-face ((t (:inherit font-lock-comment-face)))) `(font-lock-comment-face ((t (:foreground ,accent-four-desaturated :family ,fixed-pitch-alternative :slant italic)))) `(font-lock-constant-face ((t (:foreground ,accent-three :weight bold)))) '(font-lock-delimiter-face ((t (:inherit font-lock-punctuation-face)))) '(font-lock-doc-face ((t (:inherit font-lock-string-face)))) '(font-lock-doc-markup-face ((t (:inherit font-lock-constant-face)))) '(font-lock-escape-face ((t (:inherit font-lock-regexp-grouping-backslash)))) '(font-lock-function-call-face ((t (:inherit font-lock-function-name-face)))) `(font-lock-function-name-face ((t (:foreground ,accent-one :slant italic)))) `(font-lock-keyword-face ((t (:foreground ,accent-two-saturated)))) '(font-lock-negation-char-face ((t nil))) '(font-lock-number-face ((t nil))) '(font-lock-misc-punctuation-face ((t (:inherit font-lock-punctuation-face)))) '(font-lock-operator-face ((t nil))) '(font-lock-preprocessor-face ((t (:inherit font-lock-builtin-face)))) '(font-lock-property-name-face ((t (:inherit font-lock-variable-name-face)))) '(font-lock-property-use-face ((t (:inherit font-lock-property-name-face)))) '(font-lock-punctuation-face ((t nil))) '(font-lock-regexp-grouping-backslash ((t (:inherit bold)))) '(font-lock-regexp-grouping-construct ((t (:inherit bold)))) `(font-lock-string-face ((t (:foreground ,(darken accent-five 0.3))))) `(font-lock-type-face ((t (:foreground ,accent-two)))) `(font-lock-variable-name-face ((t (:foreground ,(darken accent-one 0.3))))) '(font-lock-variable-use-face ((t (:inherit font-lock-variable-name-face)))) '(font-lock-warning-face ((t (:inherit error)))) `(error ((t (:foreground ,accent-five-saturated :weight black)))) ;;; Rainbow delimiters `(rainbow-delimiters-depth-1-face ((t (:foreground ,accent-two-saturated :inherit rainbow-delimiters-base-face)))) `(rainbow-delimiters-depth-2-face ((t (:foreground ,accent-four-saturated :inherit rainbow-delimiters-base-face)))) `(rainbow-delimiters-depth-3-face ((t (:foreground ,accent-one-saturated :inherit rainbow-delimiters-base-face)))) `(rainbow-delimiters-depth-4-face ((t (:foreground ,accent-three-saturated :inherit rainbow-delimiters-base-face)))) `(rainbow-delimiters-depth-5-face ((t (:foreground ,accent-five :inherit rainbow-delimiters-base-face)))) `(rainbow-delimiters-depth-6-face ((t (:foreground ,accent-two :inherit rainbow-delimiters-base-face)))) `(rainbow-delimiters-depth-7-face ((t (:foreground ,accent-four :inherit rainbow-delimiters-base-face)))) `(rainbow-delimiters-depth-8-face ((t (:foreground ,accent-one :inherit rainbow-delimiters-base-face)))) `(rainbow-delimiters-depth-9-face ((t (:foreground ,accent-three :inherit rainbow-delimiters-base-face)))) `(rainbow-delimiters-base-error-face ((t (:foreground ,accent-five-saturated :inherit rainbow-delimiters-base-face :weight black)))) ;;; Treemacs `(treemacs-directory-face ((t (:inherit font-lock-function-name-face :foreground ,(darken accent-one 0.2))))) `(treemacs-root-face ((t (:underline t :weight bold :height 1.4 :family ,fixed-pitch-serif :foreground ,(darken accent-three 0.4))))) ;;; Magit `(magit-diff-added ((t (:background ,(lighten accent-three 0.3) :foreground ,(darken accent-three-saturated 0.5))))) `(magit-diff-removed ((t (:background ,(lighten accent-five 0.3) :foreground ,(darken accent-five-saturated 0.5))))) `(magit-diff-context-highlight ((t (:inherit default :extend t :background ,(lighten bg-main 0.05) :foreground ,(lighten fg-main 0.2))))) `(magit-section-highlight ((t (:extend t :background ,(lighten bg-main 0.05))))) `(magit-section-heading ((t (:extend t :background ,(darken bg-main 0.05) :foreground ,(darken accent-four-saturated 0.1) :weight bold)))) ;;; Org mode and org modern `(org-document-title ((t (:inherit variable-pitch-serif-text :height 1.6)))) `(org-document-info ((t (:inherit variable-pitch-serif-text :height 0.9 :foreground ,(darken accent-one 0.3))))) `(org-document-info-keyword ((t (:inherit variable-pitch-text :foreground ,accent-two-desaturated)))) ;; Outline faces `(outline-1 ((t (:inherit variable-pitch-serif :height 1.3 :foreground ,(darken accent-one-desaturated 0.3))))) `(outline-2 ((t (:inherit variable-pitch-serif :height 1.2 :foreground ,(darken accent-two-desaturated 0.3))))) `(outline-3 ((t (:inherit variable-pitch-serif :height 1.1 :foreground ,(darken accent-three-desaturated 0.3))))) `(outline-4 ((t (:inherit variable-pitch-serif :height 1.0 :foreground ,(darken accent-four-desaturated 0.3))))) `(outline-5 ((t (:inherit variable-pitch-serif :height 0.9 :foreground ,(darken accent-five-desaturated 0.3))))) `(outline-6 ((t (:inherit variable-pitch-serif :height 0.8 :foreground ,(darken accent-one-desaturated 0.6))))) `(outline-7 ((t (:inherit variable-pitch-serif :height 0.7 :foreground ,(darken accent-two-desaturated 0.6))))) `(outline-8 ((t (:inherit variable-pitch-serif :height 0.6 :foreground ,(darken accent-three-desaturated 0.6))))) ;; Todos and Labels `(org-todo ((t (:inherit variable-pitch :weight bold :foreground ,(darken accent-five-saturated 0.1))))) `(org-done ((t (:inherit variable-pitch :weight bold :background ,(darken accent-three-saturated 0.1) :foreground ,bg-main)))) `(org-modern-done ((t (:inherit org-done)))) `(org-modern-tag ((t (:extend t :foreground ,bg-main :background ,accent-two)))) ;; Drawers and blocks `(org-drawer ((t (:inherit fixed-pitch-serif :height 0.6 :foreground ,(darken accent-two-desaturated 0.2))))) `(org-special-keyword ((t (:inherit fixed-pitch-serif :height 0.6 :foreground ,(darken accent-two 0.2))))) `(org-property-value ((t (:inherit default :height 0.6 :foreground ,(darken accent-two-desaturated 0.2))))) `(org-block-begin-line ((t (:family ,fixed-pitch-serif :height 0.8 :foreground ,(darken accent-one-desaturated 0.2))))) `(org-meta-line ((t (:inheirt org-block-begin-line)))) `(org-block ((t (:inherit fixed-pitch)))) ;; Code and literal `(org-code ((t (:family ,fixed-pitch-font :weight semibold :height 0.8 :foreground ,(lighten fg-main 0.2))))) `(org-verbatim ((t (:family ,fixed-pitch-font :weight semibold :foreground ,(darken accent-two-saturated 0.2))))) ;; Indentation `(org-indent ((t (:inherit (org-hide fixed-pitch))))) ;; Tables `(org-table ((t (:inherit fixed-pitch :foreground ,(lighten fg-main 0.1))))) ;;; Company Mode `(company-tooltip ((t (:inherit fixed-pitch :background ,accent-one :foreground ,bg-main)))) `(company-tooltip-common ((t (:foreground ,(darken accent-four 0.2))))) ;;; HL-todo `(hl-todo ((t (:inherit default :background ,(darken accent-one 0.2) :foreground ,bg-main)))) ) (custom-theme-set-variables 'leucosis '(icon-preference '(symbol image emoji text)) `(beacon-color ,accent-two) '(org-hidden-keywords t) '(company-format-margin-function #'company-text-icons-margin)) (provide-theme 'leucosis)) ;;; leucosis-theme.el ends here