Commit 2d11bbe8b986

Vincent Demeester <vincent@sbr.pm>
2026-07-22 10:23:21
feat(emacs): add Alabaster BG modus theme variants
Added three background-wash syntax highlighting themes built on modus-themes infrastructure, inspired by Tonsky's Alabaster BG approach. Strings, comments, and definitions use pastel background washes instead of foreground colors. Includes light/dark Alabaster BG and a Tonski-palette light variant.
1 parent 53638d8
dots/config/emacs/site-lisp/modus-alabaster-bg-dark-theme.el
@@ -0,0 +1,292 @@
+;;; modus-alabaster-bg-dark-theme.el --- Alabaster BG dark on modus-vivendi -*- lexical-binding: t -*-
+
+;; Author: Vincent Demeester
+;; Based on: https://github.com/tonsky/sublime-scheme-alabaster (Alabaster BG + Dark)
+;;           https://github.com/dpassen/modus-alabaster
+;; Keywords: faces, theme, accessibility
+
+;;; Commentary:
+;;
+;; Alabaster BG dark: background-wash syntax highlighting on a dark
+;; canvas.  Strings get a dark green wash, comments a dark yellow wash,
+;; definitions a dark blue wash.  Only constants use a distinct
+;; foreground color.
+
+;;; Code:
+
+(require 'modus-alabaster-bg)
+
+(defconst modus-alabaster-bg-dark-palette
+  (modus-themes-generate-palette
+   '(
+     ;; Base surfaces — Tonsky Alabaster Dark upstream values
+     (bg-main      "#0E1415")
+     (bg-dim       "#1D2324")   ; line_highlight (#ffffff10 over #0E1415)
+     (bg-active    "#293334")   ; selection
+     (bg-inactive  "#293334")
+     (border       "#708B8D")
+     (fringe       "#0E1415")
+     (fg-main      "#CECECE")
+     (fg-dim       "#708B8D")
+     (fg-alt       "#AAAAAA")
+     (cursor       "#CD974B")
+
+     ;; BG-variant background washes — dark equivalents of the light washes
+     ;; Subtle tints over the dark background
+     (alabaster-bg-string-bg      "#1A2A1A")   ; dark green wash
+     (alabaster-bg-escape-bg      "#253525")   ; slightly brighter green
+     (alabaster-bg-comment-bg     "#2A2A1A")   ; dark yellow wash
+     (alabaster-bg-definition-bg  "#1A2030")   ; dark blue wash
+     (alabaster-bg-error-bg       "#2B1D1E")   ; dark red wash (upstream)
+
+     ;; Foreground accents
+     (alabaster-bg-constant    "#CC8BC9")
+     (alabaster-bg-active      "#CD974B")
+     (alabaster-bg-error-fg    "#CC3333")
+     (alabaster-bg-punctuation "#708B8D")
+     (alabaster-bg-operator    "#708B8D")
+     (alabaster-bg-bracket     "#CECECE")
+
+     ;; Modus accent vocabulary
+     (red          "#CC3333")
+     (red-warmer   "#CC3333")
+     (red-cooler   "#CC3333")
+     (red-faint    "#CC3333")
+     (red-intense  "#CC3333")
+     (green        "#95CB82")
+     (green-warmer "#95CB82")
+     (green-cooler "#95CB82")
+     (green-faint  "#95CB82")
+     (green-intense "#95CB82")
+     (yellow        "#DFDF8E")
+     (yellow-warmer "#DFDF8E")
+     (yellow-cooler "#DFDF8E")
+     (yellow-faint  "#DFDF8E")
+     (yellow-intense "#DFDF8E")
+     (blue         "#71ADE7")
+     (blue-warmer  "#71ADE7")
+     (blue-cooler  "#71ADE7")
+     (blue-faint   "#71ADE7")
+     (blue-intense "#71ADE7")
+     (magenta         "#CC8BC9")
+     (magenta-warmer  "#CC8BC9")
+     (magenta-cooler  "#CC8BC9")
+     (magenta-faint   "#CC8BC9")
+     (magenta-intense "#CC8BC9")
+     (cyan         "#CD974B")
+     (cyan-warmer  "#CD974B")
+     (cyan-cooler  "#CD974B")
+     (cyan-faint   "#CD974B")
+     (cyan-intense "#CD974B")
+     (rust   "#CD974B")
+     (gold   "#CD974B")
+     (olive  "#95CB82")
+     (slate  "#71ADE7")
+     (indigo "#CC8BC9")
+     (maroon "#CC3333")
+     (pink   "#CC8BC9")
+
+     ;; Colored backgrounds — dark washes
+     (bg-red-intense "#2B1D1E")
+     (bg-red-subtle  "#2B1D1E")
+     (bg-red-nuanced "#2B1D1E")
+     (bg-green-intense   "#1A2A1A")
+     (bg-green-subtle    "#1A2A1A")
+     (bg-green-nuanced   "#1A2A1A")
+     (bg-yellow-intense  "#2A2A1A")
+     (bg-yellow-subtle   "#2A2A1A")
+     (bg-yellow-nuanced  "#2A2A1A")
+     (bg-blue-intense    "#1A2030")
+     (bg-blue-subtle     "#1A2030")
+     (bg-blue-nuanced    "#1A2030")
+     (bg-magenta-intense "#2A1A2A")
+     (bg-magenta-subtle  "#2A1A2A")
+     (bg-magenta-nuanced "#2A1A2A")
+     (bg-cyan-intense    "#1A2030")
+     (bg-cyan-subtle     "#1A2030")
+     (bg-cyan-nuanced    "#1A2030")
+
+     ;; Thematic slots
+     (bg-clay     "#0E1415")
+     (fg-clay     "#CC3333")
+     (bg-ochre    "#0E1415")
+     (fg-ochre    "#CD974B")
+     (bg-lavender "#0E1415")
+     (fg-lavender "#CC8BC9")
+     (bg-sage     "#0E1415")
+     (fg-sage     "#95CB82")
+     (bg-graph-red-0     "#D2322D")
+     (bg-graph-red-1     "#D2322D")
+     (bg-graph-green-0   "#6ABF40")
+     (bg-graph-green-1   "#6ABF40")
+     (bg-graph-yellow-0  "#EC8013")
+     (bg-graph-yellow-1  "#EC8013")
+     (bg-graph-blue-0    "#71ADE7")
+     (bg-graph-blue-1    "#71ADE7")
+     (bg-graph-magenta-0 "#CC8BC9")
+     (bg-graph-magenta-1 "#CC8BC9")
+     (bg-graph-cyan-0    "#CD974B")
+     (bg-graph-cyan-1    "#CD974B")
+
+     ;; Editor chrome
+     (bg-completion      "#293334")
+     (bg-popup           "#0E1415")
+     (bg-hover           "#293334")
+     (bg-hover-secondary "#1D2324")
+     (bg-hl-line         "#1D2324")
+     (bg-region          "#293334")
+     (fg-region          "#CECECE")
+     (bg-mode-line-active       "#293334")
+     (fg-mode-line-active       "#CECECE")
+     (border-mode-line-active   "#708B8D")
+     (bg-mode-line-inactive     "#1D2324")
+     (fg-mode-line-inactive     "#708B8D")
+     (border-mode-line-inactive "#293334")
+     (modeline-err     "#CC3333")
+     (modeline-warning "#CC3333")
+     (modeline-info    "#CD974B")
+     (bg-tab-bar     "#1D2324")
+     (bg-tab-current "#0E1415")
+     (bg-tab-other   "#293334")
+     (fg-line-number-inactive "#708B8D")
+     (fg-line-number-active   "#CECECE")
+     (bg-line-number-inactive "#0E1415")
+     (bg-line-number-active   "#1D2324")
+
+     ;; Diff — dark washes
+     (bg-added         "#1A2A1A")
+     (bg-added-faint   "#1A2A1A")
+     (bg-added-refine  "#253525")
+     (bg-added-fringe  "#6ABF40")
+     (fg-added         "#6ABF40")
+     (fg-added-intense "#95CB82")
+     (bg-removed         "#2B1D1E")
+     (bg-removed-faint   "#2B1D1E")
+     (bg-removed-refine  "#3A2528")
+     (bg-removed-fringe  "#D2322D")
+     (fg-removed         "#D2322D")
+     (fg-removed-intense "#D2322D")
+     (bg-changed         "#2A2A1A")
+     (bg-changed-faint   "#2A2A1A")
+     (bg-changed-refine  "#3A3520")
+     (bg-changed-fringe  "#EC8013")
+     (fg-changed         "#EC8013")
+     (fg-changed-intense "#EC8013")
+     (bg-diff-context "#0E1415")
+
+     ;; Search
+     (bg-search-current    "#CD974B")
+     (bg-search-lazy       "#CD974B")
+     (bg-search-static     "#CD974B")
+     (bg-search-replace    "#CD974B")
+     (bg-search-rx-group-0 "#CD974B")
+     (bg-search-rx-group-1 "#CD974B")
+     (bg-search-rx-group-2 "#CD974B")
+     (bg-search-rx-group-3 "#CD974B")
+     (bg-paren-match      "#0E1415")
+     (bg-paren-expression "#0E1415")
+     (fg-paren-match      "#CECECE")
+     (bg-prose-block-delimiter "#1D2324")
+     (fg-prose-block-delimiter "#CECECE")
+     (bg-prose-block-contents  "#1D2324")
+
+     ;; Terminal
+     (bg-term-black        "#0E1415")
+     (fg-term-black        "#0E1415")
+     (bg-term-black-bright "#708B8D")
+     (fg-term-black-bright "#708B8D")
+     (bg-term-white        "#AAAAAA")
+     (fg-term-white        "#AAAAAA")
+     (bg-term-white-bright "#CECECE")
+     (fg-term-white-bright "#CECECE"))
+   nil
+   modus-themes-vivendi-palette
+   modus-alabaster-bg-common-palette-mappings)
+  "Full palette for `modus-alabaster-bg-dark'.")
+
+(defcustom modus-alabaster-bg-dark-palette-overrides nil
+  "Palette overrides for `modus-alabaster-bg-dark'."
+  :group 'modus-themes
+  :type '(repeat (list symbol (choice symbol string))))
+
+;; Dark BG washes: subtle tints visible against the dark background.
+(defconst modus-alabaster-bg-dark-custom-faces
+  '(
+    ;; No bold/italic for syntax
+    '(modus-themes-bold ((t (:weight normal))))
+    '(modus-themes-slant ((t (:slant normal))))
+
+    ;; Strings: dark green wash
+    '(font-lock-string-face
+      ((t (:foreground "#CECECE" :background "#1A2A1A"))))
+    '(font-lock-doc-face
+      ((t (:foreground "#CECECE" :background "#1A2A1A"))))
+
+    ;; Comments: dark yellow/olive wash
+    '(font-lock-comment-face
+      ((t (:foreground "#CECECE" :background "#2A2A1A"))))
+    '(font-lock-comment-delimiter-face
+      ((t (:foreground "#CECECE" :background "#2A2A1A"))))
+
+    ;; Definitions: dark blue wash
+    '(font-lock-function-name-face
+      ((t (:foreground "#CECECE" :background "#1A2030"))))
+
+    ;; Constants: purple foreground (the one fg exception)
+    '(font-lock-constant-face
+      ((t (:foreground "#CC8BC9"))))
+
+    ;; Escapes: slightly brighter green wash
+    '(font-lock-escape-face
+      ((t (:foreground "#CECECE" :background "#253525"))))
+    '(font-lock-regexp-grouping-backslash
+      ((t (:foreground "#CECECE" :background "#253525"))))
+
+    ;; Errors: dark red wash
+    '(font-lock-warning-face
+      ((t (:foreground "#CC3333" :background "#2B1D1E" :weight normal))))
+
+    ;; Bracket matching: underline with active color
+    '(show-paren-match
+      ((t (:foreground "#CECECE" :background unspecified
+           :underline (:color "#CD974B" :style line)))))
+    '(show-paren-match-expression
+      ((t (:foreground "#CECECE" :background unspecified
+           :underline (:color "#CD974B" :style line)))))
+
+    ;; Org TODO/DONE: background washes
+    '(org-todo
+      ((t (:foreground "#CECECE" :background "#2B1D1E" :weight bold))))
+    '(org-done
+      ((t (:foreground "#CECECE" :background "#1A2A1A"))))
+    '(org-headline-done
+      ((t (:foreground "#708B8D"))))
+    '(org-agenda-done
+      ((t (:foreground "#CECECE" :background "#1A2A1A"))))
+    '(org-checkbox-statistics-todo
+      ((t (:foreground "#CECECE" :background "#2B1D1E"))))
+    '(org-checkbox-statistics-done
+      ((t (:foreground "#CECECE" :background "#1A2A1A"))))
+
+    ;; Tree-sitter faces — plain
+    '(font-lock-function-call-face
+      ((t (:foreground "#CECECE" :background unspecified))))
+    '(font-lock-variable-use-face
+      ((t (:foreground "#CECECE" :background unspecified))))
+    '(font-lock-property-use-face
+      ((t (:foreground "#CECECE" :background unspecified)))))
+  "Custom face specifications for `modus-alabaster-bg-dark'.")
+
+;;;###theme-autoload
+(modus-themes-theme
+ 'modus-alabaster-bg-dark
+ 'modus-alabaster-bg
+ "Alabaster BG dark palette on modus-vivendi."
+ 'dark
+ 'modus-themes-vivendi-palette
+ 'modus-alabaster-bg-dark-palette
+ 'modus-alabaster-bg-dark-palette-overrides
+ 'modus-alabaster-bg-dark-custom-faces)
+
+(provide-theme 'modus-alabaster-bg-dark)
+;;; modus-alabaster-bg-dark-theme.el ends here
dots/config/emacs/site-lisp/modus-alabaster-bg-light-theme.el
@@ -0,0 +1,289 @@
+;;; modus-alabaster-bg-light-theme.el --- Alabaster BG light on modus-operandi -*- lexical-binding: t -*-
+
+;; Author: Vincent Demeester
+;; Based on: https://github.com/tonsky/sublime-scheme-alabaster (Alabaster BG)
+;;           https://github.com/dpassen/modus-alabaster
+;; Keywords: faces, theme, accessibility
+
+;;; Commentary:
+;;
+;; Alabaster BG light: background-wash syntax highlighting on a white
+;; canvas.  Strings get green wash, comments yellow wash, definitions
+;; blue wash.  Only constants use a distinct foreground (purple).
+
+;;; Code:
+
+(require 'modus-alabaster-bg)
+
+(defconst modus-alabaster-bg-light-palette
+  (modus-themes-generate-palette
+   '(
+     ;; Base surfaces — Tonsky Alabaster BG upstream values
+     (bg-main      "#FFFFFF")
+     (bg-dim       "#F7F7F7")
+     (bg-active    "#B4D8FD")   ; selection
+     (bg-inactive  "#E0E0E0")
+     (border       "#E0E0E0")
+     (fringe       "#FFFFFF")
+     (fg-main      "#000000")
+     (fg-dim       "#777777")
+     (fg-alt       "#AAAAAA")
+     (cursor       "#007ACC")
+
+     ;; BG-variant semantic colors
+     ;; These are the background washes from Alabaster BG
+     (alabaster-bg-string-bg      "#F1FADF")   ; green wash for strings
+     (alabaster-bg-escape-bg      "#DBECB6")   ; darker green for escapes
+     (alabaster-bg-comment-bg     "#FFFABC")   ; yellow wash for comments
+     (alabaster-bg-definition-bg  "#DBF1FF")   ; blue wash for definitions
+     (alabaster-bg-error-bg       "#FFE0E0")   ; red wash for errors
+
+     ;; Foreground accents (only constants + errors use fg color)
+     (alabaster-bg-constant    "#7A3E9D")
+     (alabaster-bg-active      "#007ACC")
+     (alabaster-bg-error-fg    "#CC3333")
+     (alabaster-bg-punctuation "#00000090")
+     (alabaster-bg-operator    "#000000")
+     (alabaster-bg-bracket     "#00000075")
+
+     ;; Modus accent vocabulary
+     (red          "#CC3333")
+     (red-warmer   "#CC3333")
+     (red-cooler   "#CC3333")
+     (red-faint    "#CC3333")
+     (red-intense  "#CC3333")
+     (green        "#448C27")
+     (green-warmer "#448C27")
+     (green-cooler "#448C27")
+     (green-faint  "#448C27")
+     (green-intense "#448C27")
+     (yellow        "#FFBC5D")
+     (yellow-warmer "#FFBC5D")
+     (yellow-cooler "#FFBC5D")
+     (yellow-faint  "#FFBC5D")
+     (yellow-intense "#FFBC5D")
+     (blue         "#325CC0")
+     (blue-warmer  "#325CC0")
+     (blue-cooler  "#325CC0")
+     (blue-faint   "#325CC0")
+     (blue-intense "#325CC0")
+     (magenta         "#7A3E9D")
+     (magenta-warmer  "#7A3E9D")
+     (magenta-cooler  "#7A3E9D")
+     (magenta-faint   "#7A3E9D")
+     (magenta-intense "#7A3E9D")
+     (cyan         "#007ACC")
+     (cyan-warmer  "#007ACC")
+     (cyan-cooler  "#007ACC")
+     (cyan-faint   "#007ACC")
+     (cyan-intense "#007ACC")
+     (rust   "#FFBC5D")
+     (gold   "#FFBC5D")
+     (olive  "#448C27")
+     (slate  "#325CC0")
+     (indigo "#7A3E9D")
+     (maroon "#CC3333")
+     (pink   "#7A3E9D")
+
+     ;; Colored backgrounds — mostly plain for BG variant
+     (bg-red-intense "#FFE0E0")
+     (bg-red-subtle  "#FFE0E0")
+     (bg-red-nuanced "#FFE0E0")
+     (bg-green-intense   "#F1FADF")
+     (bg-green-subtle    "#F1FADF")
+     (bg-green-nuanced   "#F1FADF")
+     (bg-yellow-intense  "#FFFABC")
+     (bg-yellow-subtle   "#FFFABC")
+     (bg-yellow-nuanced  "#FFFABC")
+     (bg-blue-intense    "#DBF1FF")
+     (bg-blue-subtle     "#DBF1FF")
+     (bg-blue-nuanced    "#DBF1FF")
+     (bg-magenta-intense "#F9E0FF")
+     (bg-magenta-subtle  "#F9E0FF")
+     (bg-magenta-nuanced "#F9E0FF")
+     (bg-cyan-intense    "#DBF1FF")
+     (bg-cyan-subtle     "#DBF1FF")
+     (bg-cyan-nuanced    "#DBF1FF")
+
+     ;; Thematic slots
+     (bg-clay     "#FFFFFF")
+     (fg-clay     "#CC3333")
+     (bg-ochre    "#FFFFFF")
+     (fg-ochre    "#FFBC5D")
+     (bg-lavender "#FFFFFF")
+     (fg-lavender "#7A3E9D")
+     (bg-sage     "#FFFFFF")
+     (fg-sage     "#448C27")
+     (bg-graph-red-0     "#D2322D")
+     (bg-graph-red-1     "#D2322D")
+     (bg-graph-green-0   "#6ABF40")
+     (bg-graph-green-1   "#6ABF40")
+     (bg-graph-yellow-0  "#EC8013")
+     (bg-graph-yellow-1  "#EC8013")
+     (bg-graph-blue-0    "#325CC0")
+     (bg-graph-blue-1    "#325CC0")
+     (bg-graph-magenta-0 "#7A3E9D")
+     (bg-graph-magenta-1 "#7A3E9D")
+     (bg-graph-cyan-0    "#007ACC")
+     (bg-graph-cyan-1    "#007ACC")
+
+     ;; Editor chrome
+     (bg-completion      "#E0E0E0")
+     (bg-popup           "#FFFFFF")
+     (bg-hover           "#B4D8FD")
+     (bg-hover-secondary "#F7F7F7")
+     (bg-hl-line         "#F7F7F7")
+     (bg-region          "#B4D8FD")
+     (fg-region          "#000000")
+     (bg-mode-line-active       "#F7F7F7")
+     (fg-mode-line-active       "#000000")
+     (border-mode-line-active   "#E0E0E0")
+     (bg-mode-line-inactive     "#E0E0E0")
+     (fg-mode-line-inactive     "#777777")
+     (border-mode-line-inactive "#E0E0E0")
+     (modeline-err     "#CC3333")
+     (modeline-warning "#CC3333")
+     (modeline-info    "#007ACC")
+     (bg-tab-bar     "#E0E0E0")
+     (bg-tab-current "#FFFFFF")
+     (bg-tab-other   "#F7F7F7")
+     (fg-line-number-inactive "#777777")
+     (fg-line-number-active   "#000000")
+     (bg-line-number-inactive "#FFFFFF")
+     (bg-line-number-active   "#F7F7F7")
+
+     ;; Diff — use washes that match the BG philosophy
+     (bg-added         "#F1FADF")
+     (bg-added-faint   "#F1FADF")
+     (bg-added-refine  "#DBECB6")
+     (bg-added-fringe  "#6ABF40")
+     (fg-added         "#6ABF40")
+     (fg-added-intense "#448C27")
+     (bg-removed         "#FFE0E0")
+     (bg-removed-faint   "#FFE0E0")
+     (bg-removed-refine  "#FFCECE")
+     (bg-removed-fringe  "#D2322D")
+     (fg-removed         "#D2322D")
+     (fg-removed-intense "#D2322D")
+     (bg-changed         "#FFFABC")
+     (bg-changed-faint   "#FFFABC")
+     (bg-changed-refine  "#FFE8A0")
+     (bg-changed-fringe  "#EC8013")
+     (fg-changed         "#EC8013")
+     (fg-changed-intense "#EC8013")
+     (bg-diff-context "#FFFFFF")
+
+     ;; Search
+     (bg-search-current    "#FFBC5D")
+     (bg-search-lazy       "#FFBC5D")
+     (bg-search-static     "#FFBC5D")
+     (bg-search-replace    "#FFBC5D")
+     (bg-search-rx-group-0 "#FFBC5D")
+     (bg-search-rx-group-1 "#FFBC5D")
+     (bg-search-rx-group-2 "#FFBC5D")
+     (bg-search-rx-group-3 "#FFBC5D")
+     (bg-paren-match      "#FFFFFF")
+     (bg-paren-expression "#FFFFFF")
+     (fg-paren-match      "#007ACC")
+     (bg-prose-block-delimiter "#F7F7F7")
+     (fg-prose-block-delimiter "#000000")
+     (bg-prose-block-contents  "#F7F7F7")
+
+     ;; Terminal
+     (bg-term-black        "#000000")
+     (fg-term-black        "#000000")
+     (bg-term-black-bright "#777777")
+     (fg-term-black-bright "#777777")
+     (bg-term-white        "#AAAAAA")
+     (fg-term-white        "#AAAAAA")
+     (bg-term-white-bright "#FFFFFF")
+     (fg-term-white-bright "#FFFFFF"))
+   nil
+   modus-themes-operandi-palette
+   modus-alabaster-bg-common-palette-mappings)
+  "Full palette for `modus-alabaster-bg-light'.")
+
+(defcustom modus-alabaster-bg-light-palette-overrides nil
+  "Palette overrides for `modus-alabaster-bg-light'."
+  :group 'modus-themes
+  :type '(repeat (list symbol (choice symbol string))))
+
+;; The heart of Alabaster BG: background washes on syntax faces.
+(defconst modus-alabaster-bg-light-custom-faces
+  '(
+    ;; No bold/italic for syntax
+    '(modus-themes-bold ((t (:weight normal))))
+    '(modus-themes-slant ((t (:slant normal))))
+
+    ;; Strings: green background wash
+    '(font-lock-string-face
+      ((t (:foreground "#000000" :background "#F1FADF"))))
+    '(font-lock-doc-face
+      ((t (:foreground "#000000" :background "#F1FADF"))))
+
+    ;; Comments: yellow background wash
+    '(font-lock-comment-face
+      ((t (:foreground "#000000" :background "#FFFABC"))))
+    '(font-lock-comment-delimiter-face
+      ((t (:foreground "#000000" :background "#FFFABC"))))
+
+    ;; Definitions: blue background wash
+    '(font-lock-function-name-face
+      ((t (:foreground "#000000" :background "#DBF1FF"))))
+
+    ;; Constants: purple foreground (the one exception — keeps fg color)
+    '(font-lock-constant-face
+      ((t (:foreground "#7A3E9D"))))
+
+    ;; Escapes: darker green background
+    '(font-lock-escape-face
+      ((t (:foreground "#000000" :background "#DBECB6"))))
+    '(font-lock-regexp-grouping-backslash
+      ((t (:foreground "#000000" :background "#DBECB6"))))
+
+    ;; Errors: red wash
+    '(font-lock-warning-face
+      ((t (:foreground "#CC3333" :background "#FFE0E0" :weight normal))))
+
+    ;; Bracket matching: underline, no fill
+    '(show-paren-match
+      ((t (:foreground "#007ACC" :background unspecified :underline t))))
+    '(show-paren-match-expression
+      ((t (:foreground "#007ACC" :background unspecified :underline t))))
+
+    ;; Org TODO/DONE: background washes
+    '(org-todo
+      ((t (:foreground "#000000" :background "#FFE0E0" :weight bold))))
+    '(org-done
+      ((t (:foreground "#000000" :background "#F1FADF"))))
+    '(org-headline-done
+      ((t (:foreground "#777777"))))
+    '(org-agenda-done
+      ((t (:foreground "#000000" :background "#F1FADF"))))
+    '(org-checkbox-statistics-todo
+      ((t (:foreground "#000000" :background "#FFE0E0"))))
+    '(org-checkbox-statistics-done
+      ((t (:foreground "#000000" :background "#F1FADF"))))
+
+    ;; Tree-sitter faces (these inherit from font-lock but let's be explicit)
+    '(font-lock-function-call-face
+      ((t (:foreground "#000000" :background unspecified))))
+    '(font-lock-variable-use-face
+      ((t (:foreground "#000000" :background unspecified))))
+    '(font-lock-property-use-face
+      ((t (:foreground "#000000" :background unspecified)))))
+  "Custom face specifications for `modus-alabaster-bg-light'.")
+
+;;;###theme-autoload
+(modus-themes-theme
+ 'modus-alabaster-bg-light
+ 'modus-alabaster-bg
+ "Alabaster BG light palette on modus-operandi."
+ 'light
+ 'modus-themes-operandi-palette
+ 'modus-alabaster-bg-light-palette
+ 'modus-alabaster-bg-light-palette-overrides
+ 'modus-alabaster-bg-light-custom-faces)
+
+(provide-theme 'modus-alabaster-bg-light)
+;;; modus-alabaster-bg-light-theme.el ends here
dots/config/emacs/site-lisp/modus-alabaster-bg.el
@@ -0,0 +1,159 @@
+;;; modus-alabaster-bg.el --- Alabaster BG colours on top of Modus themes -*- lexical-binding: t -*-
+
+;; Author: Vincent Demeester
+;; Based on: https://github.com/tonsky/sublime-scheme-alabaster (Alabaster BG variant)
+;;           https://github.com/dpassen/modus-alabaster
+;; Package-Requires: ((emacs "28.1") (modus-themes "5.0.0"))
+;; Keywords: faces, theme, accessibility
+
+;;; Commentary:
+;;
+;; Alabaster BG variant: uses background washes instead of foreground
+;; colors for syntax highlighting.  Strings get a green background,
+;; comments get a yellow background, definitions get a blue background.
+;; Only constants keep a distinct foreground color.
+
+;;; Code:
+
+(require 'modus-themes)
+
+(defconst modus-alabaster-bg-common-palette-mappings
+  '(
+    ;; BG variant: most syntax gets fg-main foreground; the background
+    ;; washes are applied via custom faces below.
+    (keyword          fg-main)
+    (builtin          fg-main)
+    (constant         alabaster-bg-constant)
+    (string           fg-main)
+    (docstring        fg-main)
+    (docmarkup        fg-main)
+    (comment          fg-main)
+    (fnname           fg-main)
+    (fnname-call      fg-main)
+    (type             fg-main)
+    (variable         fg-main)
+    (variable-use     fg-main)
+    (preprocessor     fg-main)
+    (property         fg-main)
+    (rx-backslash     fg-main)
+    (rx-construct     fg-main)
+    (number           alabaster-bg-constant)
+    (punctuation      alabaster-bg-punctuation)
+    (operator         alabaster-bg-operator)
+    (bracket          alabaster-bg-bracket)
+    (delimiter        alabaster-bg-punctuation)
+
+    ;; Links
+    (fg-link                 alabaster-bg-active)
+    (underline-link          alabaster-bg-active)
+    (fg-link-symbolic        alabaster-bg-active)
+    (underline-link-symbolic alabaster-bg-active)
+    (fg-link-visited         alabaster-bg-constant)
+    (underline-link-visited  alabaster-bg-constant)
+
+    ;; Prose — quiet, but keep status indicators visible
+    (fg-prose-code        fg-main)
+    (fg-prose-macro       fg-main)
+    (fg-prose-verbatim    fg-main)
+    (prose-done           fg-main)
+    (prose-todo           fg-main)
+    (prose-tag            fg-dim)
+    (prose-metadata       fg-dim)
+    (prose-metadata-value fg-dim)
+    (fg-heading-0         fg-main)
+    (fg-heading-1         fg-main)
+    (fg-heading-2         fg-main)
+    (fg-heading-3         fg-main)
+    (fg-heading-4         fg-main)
+    (fg-heading-5         fg-main)
+    (fg-heading-6         fg-main)
+    (fg-heading-7         fg-main)
+    (fg-heading-8         fg-main)
+
+    ;; Completion
+    (accent-0              alabaster-bg-active)
+    (accent-1              alabaster-bg-constant)
+    (accent-2              fg-main)
+    (accent-3              fg-main)
+    (fg-completion-match-0 alabaster-bg-active)
+    (fg-completion-match-1 alabaster-bg-constant)
+    (fg-completion-match-2 fg-main)
+    (fg-completion-match-3 fg-main)
+    (fg-prompt             alabaster-bg-active)
+
+    ;; Diagnostics
+    (modeline-err     alabaster-bg-error-fg)
+    (modeline-warning alabaster-bg-error-fg)
+    (modeline-info    alabaster-bg-active)
+    (err               alabaster-bg-error-fg)
+    (warning           alabaster-bg-error-fg)
+    (info              alabaster-bg-active)
+    (underline-err     alabaster-bg-error-fg)
+    (underline-warning alabaster-bg-error-fg)
+    (underline-note    alabaster-bg-active)
+
+    (keybind    alabaster-bg-active)
+    (name       fg-main)
+    (identifier alabaster-bg-constant)
+
+    ;; Dates
+    (date-common           fg-main)
+    (date-deadline         alabaster-bg-error-fg)
+    (date-deadline-subtle  alabaster-bg-error-fg)
+    (date-scheduled        fg-main)
+    (date-scheduled-subtle fg-main)
+    (date-holiday          fg-main)
+    (date-holiday-other    fg-main)
+    (date-weekday          fg-main)
+    (date-weekend          fg-main)
+
+    ;; Mail — minimal
+    (mail-cite-0    fg-main)
+    (mail-cite-1    fg-main)
+    (mail-cite-2    fg-main)
+    (mail-cite-3    fg-main)
+    (mail-part      fg-main)
+    (mail-recipient fg-main)
+    (mail-subject   fg-main)
+    (mail-other     fg-main))
+  "Common palette mappings for the Alabaster BG Modus themes.")
+
+(defcustom modus-alabaster-bg-common-palette-overrides nil
+  "Palette overrides shared by all Modus Alabaster BG themes."
+  :group 'modus-themes
+  :type '(repeat (list symbol (choice symbol string))))
+
+;;;; Theme declaration and registration
+
+(defconst modus-alabaster-bg-with-properties
+  '((modus-alabaster-bg-light modus-alabaster-bg "Alabaster BG light palette on modus-operandi." light modus-themes-operandi-palette modus-alabaster-bg-light-palette modus-alabaster-bg-light-palette-overrides)
+    (modus-alabaster-bg-dark modus-alabaster-bg "Alabaster BG dark palette on modus-vivendi." dark modus-themes-vivendi-palette modus-alabaster-bg-dark-palette modus-alabaster-bg-dark-palette-overrides)
+    (modus-tonski-bg-light modus-alabaster-bg "Tonski BG light palette on modus-operandi." light modus-themes-operandi-palette modus-tonski-bg-light-palette modus-tonski-bg-light-palette-overrides))
+  "Properties for each Modus Alabaster BG theme.")
+
+(defvar modus-alabaster-bg--declared-p nil
+  "Non-nil if Modus Alabaster BG themes have been declared.")
+
+(defun modus-alabaster-bg-declare-themes ()
+  "Declare and register the Modus Alabaster BG themes."
+  (unless modus-alabaster-bg--declared-p
+    (dolist (theme modus-alabaster-bg-with-properties)
+      (apply #'modus-themes-declare theme)
+      (modus-themes-register (car theme)))
+    (setq modus-alabaster-bg--declared-p t)))
+
+(modus-alabaster-bg-declare-themes)
+
+;;;; Convenience commands
+
+;;;###autoload (autoload 'modus-alabaster-bg-toggle "modus-alabaster-bg")
+(modus-themes-define-derivative-command modus-alabaster-bg toggle)
+
+;;;###autoload (autoload 'modus-alabaster-bg-rotate "modus-alabaster-bg")
+(modus-themes-define-derivative-command modus-alabaster-bg rotate)
+
+;;;###autoload (autoload 'modus-alabaster-bg-select "modus-alabaster-bg")
+(modus-themes-define-derivative-command modus-alabaster-bg select)
+
+(provide 'modus-alabaster-bg)
+;;; modus-alabaster-bg.el ends here
dots/config/emacs/site-lisp/modus-tonski-bg-light-theme.el
@@ -0,0 +1,300 @@
+;;; modus-tonski-bg-light-theme.el --- Tonski BG light on modus-operandi -*- lexical-binding: t -*-
+
+;; Author: Vincent Demeester
+;; Based on: tonski-modus-ts-focus palette with Alabaster BG wash approach
+;; Keywords: faces, theme, accessibility
+
+;;; Commentary:
+;;
+;; Tonski BG light: background-wash syntax highlighting using color
+;; hues from the tonski-modus-ts-focus palette.  Strings get a blue
+;; wash (from #004080), comments a grey wash (from #555555),
+;; definitions a green wash (from #006800), parameters a subtle bg.
+;; Constants keep ochre foreground (#804000).
+
+;;; Code:
+
+(require 'modus-alabaster-bg)
+
+(defconst modus-tonski-bg-light-palette
+  (modus-themes-generate-palette
+   '(
+     ;; Base surfaces
+     (bg-main      "#FFFFFF")
+     (bg-dim       "#F8F8F8")
+     (bg-active    "#C0D8F0")   ; selection — blue tint
+     (bg-inactive  "#E8E8E8")
+     (border       "#D0D0D0")
+     (fringe       "#FFFFFF")
+     (fg-main      "#000000")
+     (fg-dim       "#555555")
+     (fg-alt       "#888888")
+     (cursor       "#000088")
+
+     ;; BG washes — pastel versions of tonski foreground colors
+     ;; String (#004080 deep blue) → light blue wash
+     (tonski-bg-string-bg      "#E0ECF5")
+     ;; Comment (#555555 grey) → light warm grey wash
+     (tonski-bg-comment-bg     "#EEEEEE")
+     ;; Function (#006800 dark green) → light green wash
+     (tonski-bg-definition-bg  "#E5F2E0")
+     ;; Escape → slightly deeper blue wash
+     (tonski-bg-escape-bg      "#D0E0F0")
+     ;; Error (#a60000 dark red) → light red wash
+     (tonski-bg-error-bg       "#F5E0E0")
+     ;; Parameter bg (from tonski original)
+     (tonski-bg-param-bg       "#EEEEEE")
+
+     ;; Foreground accents — from tonski palette
+     (alabaster-bg-constant    "#804000")   ; ochre — the one fg exception
+     (alabaster-bg-active      "#000088")   ; dark blue for links/interactive
+     (alabaster-bg-error-fg    "#A60000")   ; dark red
+     (alabaster-bg-punctuation "#555555")
+     (alabaster-bg-operator    "#000000")
+     (alabaster-bg-bracket     "#555555")
+
+     ;; Modus accent vocabulary — tonski palette
+     (red          "#A60000")
+     (red-warmer   "#A60000")
+     (red-cooler   "#A60000")
+     (red-faint    "#A60000")
+     (red-intense  "#A60000")
+     (green        "#006800")
+     (green-warmer "#006800")
+     (green-cooler "#006800")
+     (green-faint  "#006800")
+     (green-intense "#006800")
+     (yellow        "#804000")
+     (yellow-warmer "#804000")
+     (yellow-cooler "#804000")
+     (yellow-faint  "#804000")
+     (yellow-intense "#804000")
+     (blue         "#000088")
+     (blue-warmer  "#000088")
+     (blue-cooler  "#004080")
+     (blue-faint   "#000088")
+     (blue-intense "#000088")
+     (magenta         "#880088")
+     (magenta-warmer  "#880088")
+     (magenta-cooler  "#880088")
+     (magenta-faint   "#880088")
+     (magenta-intense "#880088")
+     (cyan         "#008888")
+     (cyan-warmer  "#008888")
+     (cyan-cooler  "#008888")
+     (cyan-faint   "#008888")
+     (cyan-intense "#008888")
+     (rust   "#804000")
+     (gold   "#804000")
+     (olive  "#006800")
+     (slate  "#000088")
+     (indigo "#880088")
+     (maroon "#A60000")
+     (pink   "#880088")
+
+     ;; Colored backgrounds — derived from tonski hues
+     (bg-red-intense "#F5E0E0")
+     (bg-red-subtle  "#F5E0E0")
+     (bg-red-nuanced "#F5E0E0")
+     (bg-green-intense   "#E5F2E0")
+     (bg-green-subtle    "#E5F2E0")
+     (bg-green-nuanced   "#E5F2E0")
+     (bg-yellow-intense  "#F5EED8")
+     (bg-yellow-subtle   "#F5EED8")
+     (bg-yellow-nuanced  "#F5EED8")
+     (bg-blue-intense    "#E0ECF5")
+     (bg-blue-subtle     "#E0ECF5")
+     (bg-blue-nuanced    "#E0ECF5")
+     (bg-magenta-intense "#F0E0F0")
+     (bg-magenta-subtle  "#F0E0F0")
+     (bg-magenta-nuanced "#F0E0F0")
+     (bg-cyan-intense    "#E0F0F0")
+     (bg-cyan-subtle     "#E0F0F0")
+     (bg-cyan-nuanced    "#E0F0F0")
+
+     ;; Thematic slots
+     (bg-clay     "#FFFFFF")
+     (fg-clay     "#A60000")
+     (bg-ochre    "#FFFFFF")
+     (fg-ochre    "#804000")
+     (bg-lavender "#FFFFFF")
+     (fg-lavender "#880088")
+     (bg-sage     "#FFFFFF")
+     (fg-sage     "#006800")
+     (bg-graph-red-0     "#A60000")
+     (bg-graph-red-1     "#A60000")
+     (bg-graph-green-0   "#006800")
+     (bg-graph-green-1   "#006800")
+     (bg-graph-yellow-0  "#804000")
+     (bg-graph-yellow-1  "#804000")
+     (bg-graph-blue-0    "#000088")
+     (bg-graph-blue-1    "#000088")
+     (bg-graph-magenta-0 "#880088")
+     (bg-graph-magenta-1 "#880088")
+     (bg-graph-cyan-0    "#008888")
+     (bg-graph-cyan-1    "#008888")
+
+     ;; Editor chrome
+     (bg-completion      "#E8E8E8")
+     (bg-popup           "#FFFFFF")
+     (bg-hover           "#C0D8F0")
+     (bg-hover-secondary "#F8F8F8")
+     (bg-hl-line         "#F8F8F8")
+     (bg-region          "#C0D8F0")
+     (fg-region          "#000000")
+     (bg-mode-line-active       "#F8F8F8")
+     (fg-mode-line-active       "#000000")
+     (border-mode-line-active   "#D0D0D0")
+     (bg-mode-line-inactive     "#E8E8E8")
+     (fg-mode-line-inactive     "#555555")
+     (border-mode-line-inactive "#D0D0D0")
+     (modeline-err     "#A60000")
+     (modeline-warning "#A60000")
+     (modeline-info    "#000088")
+     (bg-tab-bar     "#E8E8E8")
+     (bg-tab-current "#FFFFFF")
+     (bg-tab-other   "#F8F8F8")
+     (fg-line-number-inactive "#888888")
+     (fg-line-number-active   "#000000")
+     (bg-line-number-inactive "#FFFFFF")
+     (bg-line-number-active   "#F8F8F8")
+
+     ;; Diff — washes matching tonski hues
+     (bg-added         "#E5F2E0")
+     (bg-added-faint   "#E5F2E0")
+     (bg-added-refine  "#D0E8C8")
+     (bg-added-fringe  "#006800")
+     (fg-added         "#006800")
+     (fg-added-intense "#006800")
+     (bg-removed         "#F5E0E0")
+     (bg-removed-faint   "#F5E0E0")
+     (bg-removed-refine  "#F0CECE")
+     (bg-removed-fringe  "#A60000")
+     (fg-removed         "#A60000")
+     (fg-removed-intense "#A60000")
+     (bg-changed         "#F5EED8")
+     (bg-changed-faint   "#F5EED8")
+     (bg-changed-refine  "#EEE0C0")
+     (bg-changed-fringe  "#804000")
+     (fg-changed         "#804000")
+     (fg-changed-intense "#804000")
+     (bg-diff-context "#FFFFFF")
+
+     ;; Search
+     (bg-search-current    "#F5EED8")
+     (bg-search-lazy       "#E0ECF5")
+     (bg-search-static     "#E0ECF5")
+     (bg-search-replace    "#F5E0E0")
+     (bg-search-rx-group-0 "#E0ECF5")
+     (bg-search-rx-group-1 "#E5F2E0")
+     (bg-search-rx-group-2 "#F0E0F0")
+     (bg-search-rx-group-3 "#F5EED8")
+     (bg-paren-match      "#FFFFFF")
+     (bg-paren-expression "#FFFFFF")
+     (fg-paren-match      "#000088")
+     (bg-prose-block-delimiter "#F8F8F8")
+     (fg-prose-block-delimiter "#000000")
+     (bg-prose-block-contents  "#F8F8F8")
+
+     ;; Terminal
+     (bg-term-black        "#000000")
+     (fg-term-black        "#000000")
+     (bg-term-black-bright "#555555")
+     (fg-term-black-bright "#555555")
+     (bg-term-white        "#888888")
+     (fg-term-white        "#888888")
+     (bg-term-white-bright "#FFFFFF")
+     (fg-term-white-bright "#FFFFFF"))
+   nil
+   modus-themes-operandi-palette
+   modus-alabaster-bg-common-palette-mappings)
+  "Full palette for `modus-tonski-bg-light'.")
+
+(defcustom modus-tonski-bg-light-palette-overrides nil
+  "Palette overrides for `modus-tonski-bg-light'."
+  :group 'modus-themes
+  :type '(repeat (list symbol (choice symbol string))))
+
+;; Tonski BG washes using tonski-derived hues.
+(defconst modus-tonski-bg-light-custom-faces
+  '(
+    ;; No bold/italic for syntax
+    '(modus-themes-bold ((t (:weight normal))))
+    '(modus-themes-slant ((t (:slant normal))))
+
+    ;; Strings: blue wash (from tonski #004080)
+    '(font-lock-string-face
+      ((t (:foreground "#000000" :background "#E0ECF5"))))
+    '(font-lock-doc-face
+      ((t (:foreground "#000000" :background "#E0ECF5"))))
+
+    ;; Comments: warm grey wash (from tonski #555555)
+    '(font-lock-comment-face
+      ((t (:foreground "#555555" :background "#EEEEEE" :slant italic))))
+    '(font-lock-comment-delimiter-face
+      ((t (:foreground "#555555" :background "#EEEEEE" :slant italic))))
+
+    ;; Definitions: green wash (from tonski #006800)
+    '(font-lock-function-name-face
+      ((t (:foreground "#000000" :background "#E5F2E0"))))
+
+    ;; Constants: ochre foreground (the one fg exception, from tonski #804000)
+    '(font-lock-constant-face
+      ((t (:foreground "#804000"))))
+
+    ;; Escapes: deeper blue wash
+    '(font-lock-escape-face
+      ((t (:foreground "#000000" :background "#D0E0F0"))))
+    '(font-lock-regexp-grouping-backslash
+      ((t (:foreground "#000000" :background "#D0E0F0"))))
+
+    ;; Errors: red wash (from tonski #a60000)
+    '(font-lock-warning-face
+      ((t (:foreground "#A60000" :background "#F5E0E0" :weight normal))))
+
+    ;; Parameters: subtle grey bg (from tonski original)
+    '(font-lock-variable-name-face
+      ((t (:foreground "#000000" :background unspecified))))
+
+    ;; Bracket matching: underline with dark blue
+    '(show-paren-match
+      ((t (:foreground "#000088" :background unspecified :underline t))))
+    '(show-paren-match-expression
+      ((t (:foreground "#000088" :background unspecified :underline t))))
+
+    ;; Org TODO/DONE: background washes
+    '(org-todo
+      ((t (:foreground "#000000" :background "#F5E0E0" :weight bold))))
+    '(org-done
+      ((t (:foreground "#000000" :background "#E5F2E0"))))
+    '(org-headline-done
+      ((t (:foreground "#888888"))))
+    '(org-agenda-done
+      ((t (:foreground "#000000" :background "#E5F2E0"))))
+    '(org-checkbox-statistics-todo
+      ((t (:foreground "#000000" :background "#F5E0E0"))))
+    '(org-checkbox-statistics-done
+      ((t (:foreground "#000000" :background "#E5F2E0"))))
+
+    ;; Plain tree-sitter faces
+    '(font-lock-function-call-face
+      ((t (:foreground "#000000" :background unspecified))))
+    '(font-lock-variable-use-face
+      ((t (:foreground "#000000" :background unspecified))))
+    '(font-lock-property-use-face
+      ((t (:foreground "#000000" :background unspecified)))))
+  "Custom face specifications for `modus-tonski-bg-light'.")
+
+;;;###theme-autoload
+(modus-themes-theme
+ 'modus-tonski-bg-light
+ 'modus-alabaster-bg
+ "Tonski BG light palette on modus-operandi."
+ 'light
+ 'modus-themes-operandi-palette
+ 'modus-tonski-bg-light-palette
+ 'modus-tonski-bg-light-palette-overrides
+ 'modus-tonski-bg-light-custom-faces)
+
+(provide-theme 'modus-tonski-bg-light)
+;;; modus-tonski-bg-light-theme.el ends here
dots/config/emacs/init.el
@@ -172,6 +172,7 @@ Otherwise, call `backward-kill-word'."
     (set-fontset-font t 'symbol "Symbola" nil 'append))
 
   (require 'modus-themes)
+  (require 'modus-alabaster-bg)
   (defvar modus-themes-preset-overrides-cooler)
   (setopt modus-themes-common-palette-overrides
 	  `((border-mode-line-active unspecified)
@@ -272,6 +273,7 @@ Otherwise, call `backward-kill-word'."
 
 ;; Add site-lisp to load-path for local elisp files
 (add-to-list 'load-path (expand-file-name "site-lisp" user-emacs-directory))
+(add-to-list 'custom-theme-load-path (expand-file-name "site-lisp" user-emacs-directory))
 
 (use-package vde-toggle
   :bind ("C-c t m" . vde-toggle-modes))