Greatly extend color palette and faces configured.
authorJoe Wreschnig <joe.wreschnig@gmail.com>
Sat, 10 Jun 2017 19:39:06 +0000 (21:39 +0200)
committerJoe Wreschnig <joe.wreschnig@gmail.com>
Sat, 10 Jun 2017 19:39:06 +0000 (21:39 +0200)
BTCSB-theme.el
README.md

index e7fa6408eeb970902b46e8179ee42a28a736bd37..b0cd08effdd02e0d447f7b6562a2f2e4bac9834d 100644 (file)
-(deftheme BTCSB "Baby, The Code Shines Bright.")
-
-(let ((class '((class color) (min-colors 89)))
-      (btcsb-fg "#f6f6f6")
-      (btcsb-fg-1 "#9c69f6")
-      (btcsb-fg-2 "#fff39e")
-      (btcsb-fg-3 "#d99ed1")
-      (btcsb-fg-4 "#4d605f")
-      (btcsb-fg-5 "#bff294")
-      (btcsb-fg-6 "#de99bf")
-      (btcsb-fg-7 "#94579e")
-      (btcsb-fg-8 "#61c8c3")
-      (btcsb-fg-9 "#f465b6")
-      (btcsb-fg-10 "#9ca8d4")
-
-      (btcsb-bg-1 "#a768ef")
-      (btcsb-bg-2 "#533477")
-      (btcsb-bg-3 "#d44741")
-      (btcsb-bg-4 "#2a1852")
-      (btcsb-bg-5 "#041c1a")
+;;; BTCSB-theme.el --- Baby, the Code Shines Bright  -*- lexical-binding: t; -*-
+;;
+;; Author: Joe Wreschnig
+;; Package-Version: 20170610
+;; Package-Requires: ((emacs "24"))
+;; Keywords: faces
+;;
+;; This is free and unencumbered software released into the public
+;; domain. Anyone is free to copy, modify, publish, use, compile,
+;; sell, or distribute this software, either in source code form or as
+;; a compiled binary, for any purpose, commercial or non-commercial,
+;; and by any means.
+\f
+;;; Commentary:
+;;
+;; "Baby, The Code Shines Bright" is an Emacs adaptation of Jessica
+;; Allen's TextMate theme of the same name, which is in turn a
+;; TextMate adaptation of frilly dresses.
+;;
+;; Because Emacs is not TextMate, it doesn't look exactly the same,
+;; but it uses the same color palette and basic color choices.
+\f
+;;; Code:
+
+(require 'color)
+
+(deftheme BTCSB "Baby, The Code Shines Bright theme
+
+Baby, The Code Shines Bright is an Emacs adaptation of Jessica
+Allen's TextMate theme of the same name, a pastel-on-dark color
+palette inspired by lolita dresses. URL
+`http://spacekat.github.com/blog/2010/08/26/cute-code-overload/'
+
+That's in turn a TextMate adaptation of frilly dresses. URL
+`http://www.babyssb.co.jp/'
+
+The theme doesn't provide a default font family or size, but
+recommended pairings are Fantasque Sans or Monaco.")
+
+(defun BTCSB-theme-dim (color dark desaturate)
+  "Darken COLOR by DARK and desaturate it by DESATURATE."
+  (color-desaturate-name (color-darken-name color dark) desaturate))
+
+(let (;; These are the colors from the original TextMate theme, along
+      ;; with what they were used for. These do not map cleanly either
+      ;; way to Emacs faces (I'm not sure what a "CSS constructor
+      ;; argument" even is) so the comments are more for reference
+      ;; back to the original file than any current use.
+      ;;
+      ;; "Support" refers to built-ins along with interfaces which are
+      ;; part of standard libraries; Emacs modes generally do not
+      ;; distinguish between library and client code.
+      ;;
+      ;; Most colors that were used as background colors are instead
+      ;; used as accents (e.g. underline and fringe), because Emacs
+      ;; doesn't blend colors when given multiple faces. Background
+      ;; colors are reserved for short-lived states that need
+      ;; immediate attention, e.g. region and search selection.
+
+      ;; TODO: Several of these colors are too dark to be reasonable,
+      ;; even if I assume they were in Generic RGB γ=2.2 originally.
+      ;; Also a few are indistinguishable to me on the displays
+      ;; I've tested so far (e.g. the two bright yellows). We could
+      ;; either merge them or pick a few more shades from more recent
+      ;; Baby design palettes.
+
+      (clr01 "#000000") ; background
+      (clr02 "#041C1A") ; line highlight
+      (clr03 "#1C1C1C") ; CSS constructor background
+
+      (clr04 "#F6F6F6") ; default foreground
+      (clr05 "#3E3E3E") ; precomposed "invisibles" foreground
+      (clr06 "#FFFFFF") ; caret
+
+      (clr07 "#4D605F") ; comment
+      (clr08 "#8693A5") ; CSS @at-rule
+      (clr09 "#9CA8D4") ; deprecated foreground
+
+      (clr10 "#D99ED1") ; entity
+      (clr11 "#DE99BF") ; support function, CSS property value
+      (clr12 "#F465B6") ; variable, string variable, CSS additional constant
+
+      (clr13 "#94579E") ; keyword
+      (clr14 "#9C69F6") ; regexp special
+      (clr15 "#A768EF") ; selection overlay
+      (clr16 "#442A61") ; premultiplied selection overlay, 41% opacity
+
+      (clr17 "#B3F382") ; string constant, support constant, CSS pseudo-class
+      (clr18 "#BFF294") ; constant
+
+      (clr19 "#FFC53B") ; old selection highlight at 48% opacity
+      (clr20 "#F9EE99") ; regexp
+      (clr21 "#FFF39E") ; storage (i.e. type)
+
+      (clr22 "#2A1852") ; deprecated background
+      (clr23 "#4B7FD4") ; support, inheritance, CSS constructor argument
+      (clr24 "#5BB5D0") ; CSS class name
+      (clr25 "#61C8C3") ; strings, embedded source
+      (clr26 "#9CEFF2") ; CSS tag name, ID
+      (clr27 "#D44741") ; illegal background
+
+      ;; Additional colors from a variant by Zak Remer
+      (clr28 "#240C29") ; alternate line highlight
+      (clr29 "#100E2D") ; alternate highlight
+      (clr30 "#DB558F") ; alternate storage modifier
       )
 
   (custom-theme-set-faces
    'BTCSB
-   `(default ((t (:background "black"
-                  :foreground ,btcsb-fg
-                  :slant normal
-                  :weight normal
-                  :height 120
-                  :width normal
-                  :foundry "apple"
-                  :family "Monaco"))))
-   `(cursor ((t (:background "#FFFFFF"))))
-   `(fixed-pitch ((t (:family "Monospace"))))
-   `(variable-pitch ((t (:family "Sans Serif"))))
-   `(escape-glyph ((t (:foreground ,btcsb-fg-2))))
-   `(minibuffer-prompt ((t (:foreground ,btcsb-fg-1))))
-   `(highlight ((t (:background ,btcsb-bg-1))))
-   `(region ((t (:background ,btcsb-bg-2))))
-   `(shadow ((t (:foreground "#777777"))))
-   `(secondary-selection ((t (:background ,btcsb-bg-2))))
-   `(trailing-whitespace ((t (:background ,btcsb-bg-3))))
-   `(font-lock-builtin-face ((t (:foreground ,btcsb-fg-3))))
-   `(font-lock-comment-delimiter-face ((t (:inherit (font-lock-comment-face)))))
-   `(font-lock-comment-face ((t (:foreground ,btcsb-fg-4 :slant italic))))
-   `(font-lock-constant-face ((t (:foreground ,btcsb-fg-5))))
-   `(font-lock-doc-face ((t (:inherit font-lock-string-face))))
-   `(font-lock-function-name-face ((t (:foreground ,btcsb-fg-6))))
-   `(font-lock-keyword-face ((t (:foreground ,btcsb-fg-7))))
-   `(font-lock-negation-char-face ((t nil)))
-   `(font-lock-preprocessor-face ((t (:inherit (font-lock-builtin-face)))))
-   `(font-lock-regexp-grouping-backslash ((t (:inherit (bold)))))
-   `(font-lock-regexp-grouping-construct ((t (:inherit (bold)))))
-   `(font-lock-string-face ((t (:foreground ,btcsb-fg-8))))
-   `(font-lock-type-face ((t (:foreground ,btcsb-fg-3))))
-   `(font-lock-variable-name-face ((t (:foreground ,btcsb-fg-9))))
-   `(font-lock-warning-face ((t (:background ,btcsb-bg-4
-                                 :foreground ,btcsb-fg-10
-                                 :underline t))))
+
+   ;; Basic Faces
    `(button ((t (:inherit (link)))))
-   `(link ((t (:foreground ,btcsb-fg-2 :underline t))))
-   `(link-visited ((t (:inherit link :foreground ,btcsb-fg-6))))
-   `(fringe ((t (:background ,btcsb-bg-5))))
-   `(header-line ((t (:inherit mode-line
-                      :background ,btcsb-bg-5
-                      :foreground ,btcsb-fg
-                      :box nil))))
-   `(tooltip ((t (:inherit variable-pitch
-                  :background ,btcsb-fg-2
-                  :foreground "black"))))
-   `(mode-line ((t (:background ,btcsb-fg-1
-                    :foreground "black"
-                    :box (:line-width -1 :style released-button)))))
-   `(mode-line-buffer-id ((t (:weight bold))))
+   `(cursor ((t (:background ,clr06))))
+   `(default ((t (:background ,clr01 :foreground ,clr04))))
+   `(error ((t (:foreground ,clr27))))
+   `(escape-glyph ((t (:foreground ,clr18))))
+   `(fringe ((t (:background ,clr03))))
+   ;; `(header TODO: I don't use this....)
+   `(highlight ((t (:background ,clr16))))
+   `(isearch ((t (:background ,clr15))))
+   `(lazy-highlight ((t (:background ,clr09))))
+   `(link ((t (:foreground ,clr26 :underline t))))
+   `(link-visited ((t (:inherit link :foreground ,clr25))))
+   `(match ((t (:inherit (lazy-highlight)))))
+   `(menu ((t (:background ,clr29))))
+   `(minibuffer-prompt ((t (:foreground ,clr17))))
+   `(mode-line ((t (:background ,clr14 :foreground ,clr02))))
+   `(mode-line-buffer-id ((t (:weight bold :foreground ,clr01))))
    `(mode-line-emphasis ((t (:weight bold))))
-   `(mode-line-highlight ((t (:background ,btcsb-bg-2
-                              :box (:line-width 2
-                                    :color ,btcsb-bg-2
-                                    :style released-button)))))
-   `(mode-line-inactive ((t (:weight light
-                             :box (:line-width -1 :color ,btcsb-bg-2)
-                             :foreground ,btcsb-fg
-                             :background ,btcsb-bg-2
+   `(mode-line-highlight ((t (:foreground ,clr21))))
+   `(mode-line-inactive ((t (:background ,(BTCSB-theme-dim clr14 25 55)
                              :inherit mode-line))))
-   `(isearch ((t (:background ,btcsb-bg-1))))
-   `(isearch-fail ((t (:background ,btcsb-bg-3 :foreground ,btcsb-fg))))
-   `(lazy-highlight ((t (:background ,btcsb-bg-2))))
-   `(match ((t (:background ,btcsb-fg-1))))
-   `(next-error ((t (:inherit (region)))))
+   `(nobreak-space ((t (:foreground ,clr05 :underline t))))
+   `(region ((t (:background ,clr16))))
+   `(secondary-selection ((t (:inherit (region)))))
+   `(shadow ((t (:foreground ,clr08))))
+   `(success ((t (:foreground ,clr17))))
+   `(trailing-whitespace ((t (:background ,clr22))))
+   `(tty-menu-enabled-face ((t (:foreground ,clr04 :background ,clr16))))
+   `(tty-menu-selected-face ((t (:foreground ,clr04 :background ,clr15))))
+   `(tty-menu-disabled-face ((t (:foreground ,clr08 :background ,clr16))))
+   `(warning ((t (:foreground ,clr19))))
+
+   ;; Font Lock Faces
+   `(font-lock-builtin-face ((t (:foreground ,clr23))))
+   `(font-lock-comment-delimiter-face ((t (:inherit (font-lock-comment-face)))))
+   `(font-lock-comment-face ((t (:foreground ,clr07))))
+   `(font-lock-constant-face ((t (:foreground ,clr18))))
+   `(font-lock-doc-face ((t (:foreground ,clr24))))
+   `(font-lock-function-name-face ((t (:foreground ,clr11))))
+   `(font-lock-keyword-face ((t (:foreground ,clr13))))
+   `(font-lock-negation-char-face ((t nil)))
+   `(font-lock-preprocessor-face ((t (:inherit (font-lock-builtin-face)))))
+   `(font-lock-regexp-grouping-backslash ((t :foreground ,clr08)))
+   `(font-lock-regexp-grouping-construct ((t :foreground ,clr08)))
+   `(font-lock-string-face ((t (:foreground ,clr25))))
+   `(font-lock-type-face ((t (:foreground ,clr21))))
+   `(font-lock-variable-name-face ((t (:foreground ,clr12))))
+   `(font-lock-warning-face ((t (:foreground ,clr20))))
+
+   ;; Highlighted Line Face
+   `(hl-line ((t (:background ,clr28))))
+
+   ;; Matching / I-search Faces
+   `(isearch-fail ((t (:foreground ,clr09))))
    `(query-replace ((t (:inherit (isearch)))))
-  
-   `(flyspell-duplicate ((t (:foreground ,btcsb-fg-9
-                             :weight bold
-                             :underline t))))
-   `(flyspell-incorrect ((t (:foreground ,btcsb-fg-9
-                             :weight bold
-                             :underline t))))
+
+   ;; Flyspell Mode Faces
+   `(flyspell-incorrect ((t (:underline (:color ,clr27 :style wave)))))
+   ;; Repeating a mistake doesn't make it right.
+   `(flyspell-duplicate ((t (:inherit (flyspell-incorrect)))))
+
+   ;; Flycheck Faces
+   `(flycheck-error ((t (:underline (:color ,clr27 :style wave)))))
+   `(flycheck-error-list-error ((t (:foreground ,clr27))))
+   `(flycheck-fringe-error ((t (:foreground ,clr27))))
+   `(flycheck-warning ((t (:underline (:color ,clr19 :style wave)))))
+   `(flycheck-error-list-warning ((t (:foreground ,clr20))))
+   `(flycheck-fringe-warning ((t (:foreground ,clr20))))
+   `(flycheck-info ((t (:underline (:color ,clr24 :style wave)))))
+   `(flycheck-error-list-info ((t (:foreground ,clr24))))
+   `(flycheck-fringe-info ((t (:foreground ,clr24))))
+   `(flycheck-error-list-id ((t (:inherit (font-lock-constant-face)))))
+   `(flycheck-error-list-checker-name ((t (:foreground ,clr11))))
+
+   ;; Pp^l Highlight Face - it's like a comment, I guess? I'm never
+   ;; happy with how this looks except that I'm always happier to see
+   ;; it than a literal ^L.
+   `(pp^L-highlight ((t (:box (:color ,clr07)))))
+
+   ;; Spar^L Mode Face. It's called "shines bright" after all.
+   `(spar^l-mode ((t (:foreground ,clr30))))
+
+   ;; Magit Faces
+   `(magit-section-highlight ((t (:inherit (region)))))
+
+   ;; Web Mode Faces
+   `(web-mode-html-tag-face ((t (:foreground ,clr11))))
+   `(web-mode-html-attr-name-face ((t (:foreground ,clr11))))
+   `(web-mode-html-entity-face ((t (:foreground ,clr10))))
+   `(web-mode-html-attr-equal-face ((t (:inherit (shadow)))))
+   `(web-mode-css-selector-face ((t (:foreground ,clr26))))
+   `(web-mode-css-pseudo-class-face ((t (:foreground ,clr17))))
    ))
 
-(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))))
+;;;###autoload
+(when load-file-name
+  (add-to-list 'custom-theme-load-path
+               (file-name-directory load-file-name)))
 
 (provide-theme 'BTCSB)
+(provide 'BTCSB-theme)
+
+;;; BTCSB-theme.el ends here
index 97a25c1c72ff4259a0bee60fc3f129c593e21320..1d74185f2dcfb52b17fc6bd11003e6cb8439ad60 100644 (file)
--- a/README.md
+++ b/README.md
@@ -2,21 +2,16 @@ _Baby, The Code Shines Bright_ is an Emacs adaptation of
 [Jessica Allen's TextMate theme of the same name][1], which is in turn
 a TextMate adaptation of [frilly dresses][3].
 
-Because Emacs and TextMate have slightly different views on how to
-fontify source code, it doesn't look exactly the same, but I think it
-has the same spirit.
+Because Emacs is not TextMate, it doesn't look exactly the same, but
+it uses the same color palette and basic color choices.
 
-It uses the new Emacs 24 theming capabilities, and not the old
-`color-theme` interface. To use it, just dump it in your `~/.emacs.d`
-and add something like
+To use it, just dump it in your `~/.emacs.d` and add something like
 
     (load-theme 'BTCSB t)
 
-to your `~/.emacs`. Make sure to disable any `color-theme`-based
-theming you may have been using previously because if put in the same
-buffer they will fight in uncute ways.
+to your `~/.emacs`.
 
-For more help with the new Emacs theming method,
+For more help with the “new” Emacs theming method in Emacs 24,
 [Bozhidar Batsov has a quick overview of the new interface][2].
 
   [1]: http://spacekat.github.com/blog/2010/08/26/cute-code-overload/