diff --git a/leucosis-theme.el b/leucosis-theme.el new file mode 100644 index 0000000..58f83a9 --- /dev/null +++ b/leucosis-theme.el @@ -0,0 +1,234 @@ +;;; leucosis-theme.el --- Ouroboros daylight theme with opalescent, pastel colors -*- lexical-binding:t + +;;; Commentary: +;; This is a low contrast theme. + +;;; Code: + +;;; 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))))) + ) + + (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