branch: externals/nano-theme commit afa83dc4f2d710b89ba957762b50851729a9f30d Author: Nicolas P. Rougier <nicolas.roug...@inria.fr> Commit: Nicolas P. Rougier <nicolas.roug...@inria.fr>
Light / Dark WIP --- nano-dark-theme.el | 65 ++++++++++++ nano-light-theme.el | 35 +++++++ nano-theme.el | 291 +++++++++++++++++++++++++++------------------------- 3 files changed, 250 insertions(+), 141 deletions(-) diff --git a/nano-dark-theme.el b/nano-dark-theme.el new file mode 100644 index 0000000..128aff4 --- /dev/null +++ b/nano-dark-theme.el @@ -0,0 +1,65 @@ +;;; nano-dark-theme.el --- N Λ N O theme -*- lexical-binding: t -*- + +;; Copyright (C) 2021 Free Software Foundation, Inc. + +;; Maintainer: Nicolas P. Rougier <nicolas.roug...@inria.fr> +;; URL: https://github.com/rougier/nano-theme +;; Version: 0.1 +;; Package-Requires: ((emacs "27.1")) +;; Keywords: theme, dark, light + +;; This file is not part of GNU Emacs. + +;; This file 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, or (at your option) +;; any later version. + +;; This file 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. + +;; For a full copy of the GNU General Public License +;; see <https://www.gnu.org/licenses/>. + +;;; Commentary: +;; +;; N Λ N O theme is a consistent theme that comes in two flavors: +;; - a light theme that is based on Material (https://material.io/) +;; - a dark theme that is based on Nord (https://www.nordtheme.com/). +;; +;; A theme is fully defined by a set of (1+6) faces as explained in +;; "On the Design of Text Editors" / https://arxiv.org/abs/2008.06030 +;; + +;;; Code: +(require 'nano-theme) + +(deftheme nano-dark + "N Λ N O dark theme") + +(set-foreground-color nano-dark-foreground) +(set-background-color nano-dark-background) +(nano-theme 'dark) + +;; (set-frame-parameter nil 'background-mode 'dark) +;; (set frame-background-mode 'dark) +;; (frame-set-background-mode (selected-frame)) + +;; (nano-theme 'dark) + +;; (dolist (buffer (list " *Minibuf-0*" " *Echo Area 0*" +;; " *Minibuf-1*" " *Echo Area 1*")) +;; (when (get-buffer buffer) +;; (with-current-buffer buffer +;; (face-remap-add-relative 'default 'nano-faded)))) + + +;;;###autoload +(when (and (boundp 'custom-theme-load-path) load-file-name) + (add-to-list 'custom-theme-load-path + (file-name-as-directory (file-name-directory load-file-name)))) + +(provide-theme 'nano-dark) +;;; nano-dark-theme.el ends here diff --git a/nano-light-theme.el b/nano-light-theme.el new file mode 100644 index 0000000..a3c22b5 --- /dev/null +++ b/nano-light-theme.el @@ -0,0 +1,35 @@ + +(defun nano-new-frame (&optional mode) + (interactive) + (let ((mode (or mode (frame-parameter nil 'background-mode))) + (background-mode frame-background-mode) + (selected-frame (selected-frame)) + (new-frame nil)) + + ;; Set mode + (setq frame-background-mode mode) + (setq new-frame (make-frame-command)) + (select-frame new-frame) + + ;; This forces recomputation of faces on the new frame + (frame-set-background-mode (selected-frame)) + + (when (eq mode 'light) + (set-foreground-color nano-light-foreground) + (set-background-color nano-light-background)) + + (when (eq mode 'dark) + (set-foreground-color nano-dark-foreground) + (set-background-color nano-dark-background)) + + ;; Restore background mode + (setq frame-background-mode background-mode) + (frame-set-background-mode selected-frame) + + new-frame)) + + +(nano-new-frame 'light) +(nano-new-frame 'dark) +(nano-new-frame) + diff --git a/nano-theme.el b/nano-theme.el index 04979e5..17be6c2 100644 --- a/nano-theme.el +++ b/nano-theme.el @@ -93,129 +93,132 @@ ;; Version 0.1 ;; - Submission to ELPA - ;;; Code: (require 'disp-table) -(deftheme nano - "N Λ N O Theme") - (defgroup nano nil "N Λ N O" :group 'convenience) -(defgroup nano-light nil - "Light theme color palette" :group 'nano) +(defgroup nano-theme nil + "Theme" + :group 'nano) + +(defgroup nano-theme-light nil + "Light color palette" + :group 'nano-theme) -(defgroup nano-dark nil - "Dark theme color palette" :group 'nano) +(defgroup nano-theme-dark nil + "Dark color palette" + :group 'nano-theme) -(defgroup nano-fonts nil - "Dark & Light theme fonts" :group 'nano) +(defgroup nano-theme-fonts nil + "Font stack" + :group 'nano-theme) (defcustom nano-fonts-use nil "Whether to use font stack" - :type 'boolean :group 'nano-fonts) + :type 'boolean :group 'nano-theme-fonts) (defface nano-mono '((t (:family "Roboto Mono" :height 140 :weight light))) "Default monospaced font (Roboto Mono Light, 14pt)." - :group 'nano-fonts) + :group 'nano-theme-fonts) (defface nano-mono-alt '((t (:family "Fira Code" :height 140 :weight light))) "Alternative monospaced font (Fira Code Light, 14pt)." - :group 'nano-fonts) + :group 'nano-theme-fonts) (defface nano-sans '((t (:family "Roboto" :height 140 :weight light))) "Default proportional sans font (Roboto Light, 14pt)." - :group 'nano-fonts) + :group 'nano-theme-fonts) (defface nano-serif '((t (:family "Roboto Slab" :height 140 :weight light))) "Default proportional serif font (Roboto Slab Light, 14pt)." - :group 'nano-fonts) + :group 'nano-theme-fonts) (defcustom nano-light-foreground "#37474F" ;; Blue Grey / L800 "Default foreground color" - :type 'color :group 'nano-light) + :type 'color :group 'nano-theme-light) (defcustom nano-light-background "#FFFFFF" ;; White "Default background color" - :type 'color :group 'nano-light) + :type 'color :group 'nano-theme-light) (defcustom nano-light-highlight "#FAFAFA" ;; Very Light Grey "Highlight color is used to highlight part of the screen." - :type 'color :group 'nano-light) + :type 'color :group 'nano-theme-light) (defcustom nano-light-subtle "#ECEFF1" ;; Blue Grey / L50 "Subtle color is used to suggest a physical area on the screen." - :type 'color :group 'nano-light) + :type 'color :group 'nano-theme-light) (defcustom nano-light-faded "#B0BEC5" ;; Blue Grey / L200 "Faded face is for information that are less important." - :type 'color :group 'nano-light) + :type 'color :group 'nano-theme-light) (defcustom nano-light-salient "#673AB7" ;; Deep Purple / L500 "Salient color is used for information that are important." - :type 'color :group 'nano-light) + :type 'color :group 'nano-theme-light) (defcustom nano-light-strong "#000000" ;; Black "Strong color is used for information of a structural nature." - :type 'color :group 'nano-light) + :type 'color :group 'nano-theme-light) (defcustom nano-light-popout "#FFAB91" ;; Deep Orange / L200 "Popout colour is used for information that needs attention." - :type 'color :group 'nano-light) + :type 'color :group 'nano-theme-light) (defcustom nano-light-critical "#FF6F00" ;; Amber / L900 "Critical face is for information that requires immediate action." - :type 'color :group 'nano-light) + :type 'color :group 'nano-theme-light) (defcustom nano-dark-foreground "#ECEFF4" ;; Snow Storm 3 / nord 6 "Default foreground color" - :type 'color :group 'nano-dark) + :type 'color :group 'nano-theme-dark) (defcustom nano-dark-background "#2E3440" ;; Polar Night 0 / nord 0 "Default background color" - :type 'color :group 'nano-dark) + :type 'color :group 'nano-theme-dark) (defcustom nano-dark-highlight "#3B4252" ;; Polar Night 1 / nord 1 "Highdark color is used to highdark part of the screen." - :type 'color :group 'nano-dark) + :type 'color :group 'nano-theme-dark) (defcustom nano-dark-subtle "#434C5E" ;; Polar Night 2 / nord 2 "Subtle color is used to suggest a physical area on the screen." - :type 'color :group 'nano-dark) + :type 'color :group 'nano-theme-dark) (defcustom nano-dark-faded "#677691" ;; "Faded face is for information that are less important." - :type 'color :group 'nano-dark) + :type 'color :group 'nano-theme-dark) (defcustom nano-dark-salient "#81A1C1" ;; Frost / nord 9 "Salient color is used for information that are important." - :type 'color :group 'nano-dark) + :type 'color :group 'nano-theme-dark) (defcustom nano-dark-strong "#FFFFFF" ;; White "Strong color is used for information of a structural nature." - :type 'color :group 'nano-dark) + :type 'color :group 'nano-theme-dark) (defcustom nano-dark-popout "#D08770" ;; Aurora / nord 12 "Popout colour is used for information that needs attention." - :type 'color :group 'nano-dark) + :type 'color :group 'nano-theme-dark) (defcustom nano-dark-critical "#EBCB8B" ;; Aurora / nord 11 "Critical face is for information that requires immediate action." - :type 'color :group 'nano-dark) + :type 'color :group 'nano-theme-dark) (defface nano-critical nil "Critical face is for information that requires immediate action. @@ -225,7 +228,8 @@ color, typically a shade of red. It must be used scarcely." :group nil) (defface nano-critical-i nil - "Critical face inversed." :group nil) + "Critical face inversed." + :group nil) (defface nano-popout nil "Popout face is used for information that needs attention. @@ -235,7 +239,8 @@ attention through the popout effect." :group nil) (defface nano-popout-i nil - "Popout face inversed." :group nil) + "Popout face inversed." + :group nil) (defface nano-strong nil "Strong face is used for information of a structural nature. @@ -246,7 +251,8 @@ directory, etc." :group nil) (defface nano-strong-i nil - "Strong face inversed." :group nil) + "Strong face inversed." + :group nil) (defface nano-salient nil "Salient face is used for information that are important. @@ -256,7 +262,8 @@ intensity as the default face. This is typically used for links." :group nil) (defface nano-salient-i nil - "Strong face inversed." :group nil) + "Strong face inversed." + :group nil) (defface nano-faded nil "Faded face is for information that are less important. @@ -267,7 +274,8 @@ abused anyway)." :group nil) (defface nano-faded-i nil - "Faded face inversed." :group nil) + "Faded face inversed." + :group nil) (defface nano-subtle nil "Subtle face is used to suggest a physical area on the screen. @@ -277,13 +285,16 @@ background color that is barely perceptible." :group nil) (defface nano-subtle-i nil - "Subtle face inversed." :group nil) + "Subtle face inversed." + :group nil) (defface nano-default nil - "Default face." :group nil) + "Default face." + :group nil) (defface nano-default-i nil - "Default face inversed." :group nil) + "Default face inversed." + :group nil) (defun nano-setup () "Defaults settings for nano (optional)" @@ -356,7 +367,7 @@ background color that is barely perceptible." ;; No toolbar (if (fboundp 'tool-bar-mode) - (tool-bar-mode nil)) + (tool-bar-mode -1)) ;; Default frame settings (setq default-frame-alist @@ -391,63 +402,63 @@ background color that is barely perceptible." (message "Roboto Mono Nerd font has not been found on your system")))) -(defun nano-light () - "Nano theme light" +;; (defun nano-light () +;; "Nano theme light" - (interactive) - (setq widget-image-enable nil) - (setq x-underline-at-descent-line t) - (set-foreground-color nano-light-foreground) - (set-face-background 'internal-border nano-light-background (selected-frame)) - (custom-set-variables '(frame-background-mode 'light)) - (load-theme 'nano t) - (set-frame-parameter nil 'background-mode 'light) - (if (assq 'background-color default-frame-alist) - (setcdr (assq 'background-color default-frame-alist) - nano-light-background) - (add-to-list 'default-frame-alist - `(background-color . ,nano-light-background))) - (if (assq 'background-mode default-frame-alist) - (setcdr (assq 'background-mode default-frame-alist) 'light) - (add-to-list 'default-frame-alist '(background-mode . light))) - - (dolist (buffer (list " *Minibuf-0*" " *Echo Area 0*" - " *Minibuf-1*" " *Echo Area 1*")) - (when (get-buffer buffer) - (with-current-buffer buffer - (face-remap-add-relative 'default 'nano-faded)))) - (frame-set-background-mode (selected-frame)) - (set-background-color nano-light-background)) - - -(defun nano-dark () - "Nano theme dark" +;; (interactive) +;; (setq widget-image-enable nil) +;; (setq x-underline-at-descent-line t) +;; (set-foreground-color nano-light-foreground) +;; (set-face-background 'internal-border nano-light-background (selected-frame)) +;; (custom-set-variables '(frame-background-mode 'light)) +;; (load-theme 'nano t) +;; (set-frame-parameter nil 'background-mode 'light) +;; (if (assq 'background-color default-frame-alist) +;; (setcdr (assq 'background-color default-frame-alist) +;; nano-light-background) +;; (add-to-list 'default-frame-alist +;; `(background-color . ,nano-light-background))) +;; (if (assq 'background-mode default-frame-alist) +;; (setcdr (assq 'background-mode default-frame-alist) 'light) +;; (add-to-list 'default-frame-alist '(background-mode . light))) + +;; (dolist (buffer (list " *Minibuf-0*" " *Echo Area 0*" +;; " *Minibuf-1*" " *Echo Area 1*")) +;; (when (get-buffer buffer) +;; (with-current-buffer buffer +;; (face-remap-add-relative 'default 'nano-faded)))) +;; (frame-set-background-mode (selected-frame)) +;; (set-background-color nano-light-background)) + + +;; (defun nano-dark () +;; "Nano theme dark" - (interactive) - (setq widget-image-enable nil) - (setq x-underline-at-descent-line t) - (set-foreground-color nano-dark-foreground) - (set-face-background 'internal-border nano-dark-background (selected-frame)) - (custom-set-variables '(frame-background-mode 'dark)) - (load-theme 'nano t) - (set-frame-parameter nil 'background-mode 'dark) - - (if (assq 'background-color default-frame-alist) - (setcdr (assq 'background-color default-frame-alist) - nano-dark-background) - (add-to-list 'default-frame-alist - `(background-color . ,nano-dark-background))) - (if (assq 'background-mode default-frame-alist) - (setcdr (assq 'background-mode default-frame-alist) 'dark) - (add-to-list 'default-frame-alist '(background-mode . dark))) - - (dolist (buffer (list " *Minibuf-0*" " *Echo Area 0*" - " *Minibuf-1*" " *Echo Area 1*")) - (when (get-buffer buffer) - (with-current-buffer buffer - (face-remap-add-relative 'default 'nano-faded)))) - (frame-set-background-mode (selected-frame)) - (set-background-color nano-dark-background)) +;; (interactive) +;; (setq widget-image-enable nil) +;; (setq x-underline-at-descent-line t) +;; (set-foreground-color nano-dark-foreground) +;; (set-face-background 'internal-border nano-dark-background (selected-frame)) +;; (custom-set-variables '(frame-background-mode 'dark)) +;; (load-theme 'nano t) +;; (set-frame-parameter nil 'background-mode 'dark) + +;; (if (assq 'background-color default-frame-alist) +;; (setcdr (assq 'background-color default-frame-alist) +;; nano-dark-background) +;; (add-to-list 'default-frame-alist +;; `(background-color . ,nano-dark-background))) +;; (if (assq 'background-mode default-frame-alist) +;; (setcdr (assq 'background-mode default-frame-alist) 'dark) +;; (add-to-list 'default-frame-alist '(background-mode . dark))) + +;; (dolist (buffer (list " *Minibuf-0*" " *Echo Area 0*" +;; " *Minibuf-1*" " *Echo Area 1*")) +;; (when (get-buffer buffer) +;; (with-current-buffer buffer +;; (face-remap-add-relative 'default 'nano-faded)))) +;; (frame-set-background-mode (selected-frame)) +;; (set-background-color nano-dark-background)) ;; (defun inherit (face &optional inherit) @@ -468,44 +479,44 @@ background color that is barely perceptible." ;; properties))) -;; --- Theme ---------------------------------------------------------- -(let ((light '((background light))) - (dark '((background dark))) - ;; (tty-light '((type tty) (background light))) - ;; (tty-dark '((type tty) (background dark))) - ) - - ;; Enforce nano fonts - (if nano-fonts-use - (custom-theme-set-faces - 'nano - `(default ((,light (:foreground ,nano-light-foreground - :weight ,(face-attribute 'nano-mono :weight) - :height ,(face-attribute 'nano-mono :height) - :family ,(face-attribute 'nano-mono :family))) - (,dark (:foreground ,nano-dark-foreground - :weight ,(face-attribute 'nano-mono :weight) - :height ,(face-attribute 'nano-mono :height) - :family ,(face-attribute 'nano-mono :family))))) - `(nano-strong ((,light (:weight normal)) - (,dark (:weight normal)))) - `(variable-pitch ((t (:weight ,(face-attribute 'nano-sans :weight) - :height ,(face-attribute 'nano-sans :height) - :family ,(face-attribute 'nano-sans :family))))))) - - ;; Enforce nano fonts - (if (not nano-fonts-use) - (custom-theme-set-faces - 'nano - `(default ((,light (:foreground ,nano-light-foreground)) - (,dark (:foreground ,nano-dark-foreground)))) - `(nano-strong ((,light (:weight bold)) - (,dark (:weight bold)))))) +(defun nano-theme (mode) + + (set-frame-parameter nil 'background-mode mode) + (set frame-background-mode mode) + (frame-set-background-mode (selected-frame)) + + (let ((light '((background light))) + (dark '((background dark))) + (theme (if (eq mode 'dark) + 'nano-dark + 'nano-light))) + + (if nano-fonts-use + (custom-theme-set-faces theme + `(default ((,light (:foreground ,nano-light-foreground + :weight ,(face-attribute 'nano-mono :weight) + :height ,(face-attribute 'nano-mono :height) + :family ,(face-attribute 'nano-mono :family))) + (,dark (:foreground ,nano-dark-foreground + :weight ,(face-attribute 'nano-mono :weight) + :height ,(face-attribute 'nano-mono :height) + :family ,(face-attribute 'nano-mono :family))))) + `(nano-strong ((,light (:weight normal)) + (,dark (:weight normal)))) + `(variable-pitch ((t (:weight ,(face-attribute 'nano-sans :weight) + :height ,(face-attribute 'nano-sans :height) + :family ,(face-attribute 'nano-sans :family))))))) + + (if (not nano-fonts-use) + (custom-theme-set-faces theme + `(default ((,light (:foreground ,nano-light-foreground)) + (,dark (:foreground ,nano-dark-foreground)))) + `(nano-strong ((,light (:weight bold)) + (,dark (:weight bold)))))) - (custom-theme-set-faces - 'nano + (custom-theme-set-faces theme ;; --- Base --------------------------------------------------------- `(cursor ((,light (:foreground ,nano-light-background @@ -835,7 +846,6 @@ background color that is barely perceptible." '(message-mml ((t (:inherit nano-popout)))) '(message-separator ((t (:inherit nano-faded)))) - ;; --- Outline ------------------------------------------------------ '(outline-1 ((t (:inherit nano-strong)))) '(outline-2 ((t (:inherit nano-strong)))) @@ -971,7 +981,6 @@ background color that is barely perceptible." '(mu4e-warning-face ((t (:inherit nano-popout)))) ;; --- GNUS --------------------------------------------------------- - '(gnus-button ((t (:inherit nano-salient)))) '(gnus-cite-1 ((t (:inherit nano-faded)))) '(gnus-cite-10 ((t (:inherit nano-faded)))) @@ -1087,7 +1096,6 @@ background color that is barely perceptible." '(rst-reference ((t (:inherit nano-salient)))) '(rst-transition ((t (:inherit nano-default)))) - ;; --- Markdown ---------------------------------------------------- '(markdown-blockquote-face ((t (:inherit nano-default)))) '(markdown-bold-face ((t (:inherit nano-strong)))) @@ -1132,7 +1140,6 @@ background color that is barely perceptible." '(markdown-table-face ((t (:inherit nano-default)))) '(markdown-url-face ((t (:inherit nano-salient)))) - ;; --- Terminal ---------------------------------------------------- '(term-bold ((t (:inherit nano-strong)))) '(term-color-black ((t (:inherit default)))) @@ -1150,10 +1157,12 @@ background color that is barely perceptible." :background "#FFF9C4")))) ;; material color yellow L100 )) -;;;###autoload -(when (and (boundp 'custom-theme-load-path) load-file-name) - (add-to-list 'custom-theme-load-path - (file-name-as-directory (file-name-directory load-file-name)))) + (dolist (buffer (list " *Minibuf-0*" " *Echo Area 0*" + " *Minibuf-1*" " *Echo Area 1*")) + (when (get-buffer buffer) + (with-current-buffer buffer + (face-remap-add-relative 'default 'nano-faded))))) + -(provide-theme 'nano) +(provide 'nano-theme) ;;; nano-theme.el ends here