-(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