Add Emacs-style built-in themes

ober

6b1a7b2533eb28c562ad1221eeb3b33b71650604

diff --git a/lib/jerboa-emacs/qt/commands-parity5.sls b/lib/jerboa-emacs/qt/commands-parity5.sls
index 2be3f3c..e2f459e 100644
--- a/lib/jerboa-emacs/qt/commands-parity5.sls
+++ b/lib/jerboa-emacs/qt/commands-parity5.sls
@@ -1113,16 +1113,13 @@
               [win (qt-current-window fr)]
               [ed (qt-edit-window-editor win)]
               [buf (qt-buffer-create! "*Themes*" ed #f)]
+              [theme-lines (map (lambda (name) (string-append "  " name))
+                                (sort
+                                  (map symbol->string (theme-names))
+                                  string<?))]
               [text (string-append "Available Themes\n" (make-string 40 #\=) "\n\n"
-                      "  default       — Standard dark theme\n"
-                      "  light         — Light background\n"
-                      "  solarized     — Solarized color scheme\n"
-                      "  monokai       — Monokai-inspired\n"
-                      "  gruvbox       — Gruvbox warm colors\n"
-                      "  zenburn       — Low contrast warm theme\n"
-                      "  dracula       — Dark purple theme\n"
-                      "  nord          — Arctic blue palette\n"
-                      "\nUse M-x load-theme to activate a theme.\n"
+                      (string-join theme-lines "\n")
+                      "\n\nUse M-x load-theme to activate a theme.\n"
                       "Use M-x disable-theme to reset to defaults.\n")])
          (qt-buffer-attach! ed buf)
          (qt-edit-window-buffer-set! win buf)
diff --git a/src/jerboa-emacs/core.ss b/src/jerboa-emacs/core.ss
index 830d3fb..35e30b6 100644
--- a/src/jerboa-emacs/core.ss
+++ b/src/jerboa-emacs/core.ss
@@ -206,6 +206,20 @@
   theme-dracula
   theme-nord
   theme-zenburn
+  theme-adwaita
+  theme-deeper-blue
+  theme-dichromacy
+  theme-leuven
+  theme-light-blue
+  theme-manoj-dark
+  theme-misterioso
+  theme-tango
+  theme-tango-dark
+  theme-tsdh-dark
+  theme-tsdh-light
+  theme-wheatgrass
+  theme-whiteboard
+  theme-wombat
 
   ;; Customize system (from :jerboa-emacs/customize)
   defvar!
diff --git a/src/jerboa-emacs/qt/commands-parity5.ss b/src/jerboa-emacs/qt/commands-parity5.ss
index 0f93232..903937b 100644
--- a/src/jerboa-emacs/qt/commands-parity5.ss
+++ b/src/jerboa-emacs/qt/commands-parity5.ss
@@ -996,18 +996,14 @@
          (win (qt-current-window fr))
          (ed (qt-edit-window-editor win))
          (buf (qt-buffer-create! "*Themes*" ed #f))
+         (theme-lines (map (lambda (name)
+                              (string-append "  " name))
+                            (sort (map symbol->string (theme-names)) string<?)))
          (text (string-append
                  "Available Themes\n"
                  (make-string 40 #\=) "\n\n"
-                 "  default       — Standard dark theme\n"
-                 "  light         — Light background\n"
-                 "  solarized     — Solarized color scheme\n"
-                 "  monokai       — Monokai-inspired\n"
-                 "  gruvbox       — Gruvbox warm colors\n"
-                 "  zenburn       — Low contrast warm theme\n"
-                 "  dracula       — Dark purple theme\n"
-                 "  nord          — Arctic blue palette\n"
-                 "\nUse M-x load-theme to activate a theme.\n"
+                 (string-join theme-lines "\n")
+                 "\n\nUse M-x load-theme to activate a theme.\n"
                  "Use M-x disable-theme to reset to defaults.\n")))
     (qt-buffer-attach! ed buf)
     (set! (qt-edit-window-buffer win) buf)
diff --git a/src/jerboa-emacs/themes.ss b/src/jerboa-emacs/themes.ss
index 03bf175..bdb0541 100644
--- a/src/jerboa-emacs/themes.ss
+++ b/src/jerboa-emacs/themes.ss
@@ -819,6 +819,346 @@
     (tab-inactive-fg . "#7f7f7f")))
 
 ;;; ============================================================================
+;;; Emacs Built-in Theme Palettes
+;;; ============================================================================
+;; Names mirror GNU Emacs bundled themes. The definitions below map those
+;; familiar palettes into Jemacs' compact face model rather than copying Elisp
+;; custom-theme forms.
+
+(def (palette-ref palette key fallback)
+  (let ((entry (assoc key palette)))
+    (if entry (cdr entry) fallback)))
+
+(def (theme-from-palette palette)
+  (let* ((bg (palette-ref palette 'bg "#181818"))
+         (fg (palette-ref palette 'fg "#d8d8d8"))
+         (selection (palette-ref palette 'selection "#404060"))
+         (comment (palette-ref palette 'comment "#999999"))
+         (keyword (palette-ref palette 'keyword "#cc99cc"))
+         (builtin (palette-ref palette 'builtin "#66cccc"))
+         (string (palette-ref palette 'string "#99cc99"))
+         (number (palette-ref palette 'number "#f99157"))
+         (operator (palette-ref palette 'operator fg))
+         (type (palette-ref palette 'type "#ffcc66"))
+         (preprocessor (palette-ref palette 'preprocessor number))
+         (heading (palette-ref palette 'heading builtin))
+         (modeline-bg (palette-ref palette 'modeline-bg selection))
+         (modeline-fg (palette-ref palette 'modeline-fg fg))
+         (modeline-inactive-fg (palette-ref palette 'modeline-inactive-fg comment))
+         (gutter-bg (palette-ref palette 'gutter-bg bg))
+         (gutter-fg (palette-ref palette 'gutter-fg comment))
+         (cursor-line (palette-ref palette 'cursor-line selection))
+         (match-fg (palette-ref palette 'match-fg bg))
+         (match-bg (palette-ref palette 'match-bg type))
+         (mismatch-fg (palette-ref palette 'mismatch-fg (palette-ref palette 'error "#ff4040")))
+         (mismatch-bg (palette-ref palette 'mismatch-bg selection))
+         (isearch-fg (palette-ref palette 'isearch-fg bg))
+         (isearch-bg (palette-ref palette 'isearch-bg type))
+         (error (palette-ref palette 'error "#ff4040"))
+         (todo (palette-ref palette 'todo error))
+         (done (palette-ref palette 'done string))
+         (link (palette-ref palette 'link builtin))
+         (tag (palette-ref palette 'tag keyword))
+         (date (palette-ref palette 'date number))
+         (property (palette-ref palette 'property comment))
+         (block-delimiter (palette-ref palette 'block-delimiter preprocessor))
+         (block-body (palette-ref palette 'block-body comment))
+         (border-active (palette-ref palette 'border-active builtin))
+         (border-inactive (palette-ref palette 'border-inactive selection))
+         (split (palette-ref palette 'split modeline-bg))
+         (tab-bg (palette-ref palette 'tab-bg bg))
+         (tab-border (palette-ref palette 'tab-border split))
+         (tab-active-bg (palette-ref palette 'tab-active-bg selection))
+         (tab-active-fg (palette-ref palette 'tab-active-fg fg))
+         (tab-inactive-bg (palette-ref palette 'tab-inactive-bg tab-bg))
+         (tab-inactive-fg (palette-ref palette 'tab-inactive-fg comment))
+         (org-heading-1 (palette-ref palette 'org-heading-1 heading))
+         (org-heading-2 (palette-ref palette 'org-heading-2 string))
+         (org-heading-3 (palette-ref palette 'org-heading-3 type))
+         (org-heading-4 (palette-ref palette 'org-heading-4 keyword))
+         (org-heading-5 (palette-ref palette 'org-heading-5 builtin))
+         (org-heading-6 (palette-ref palette 'org-heading-6 number))
+         (org-heading-7 (palette-ref palette 'org-heading-7 preprocessor))
+         (org-heading-8 (palette-ref palette 'org-heading-8 heading)))
+    `((default . (fg: ,fg bg: ,bg))
+      (region . (bg: ,selection))
+
+      ;; Syntax highlighting
+      (font-lock-keyword-face . (fg: ,keyword bold: #t))
+      (font-lock-builtin-face . (fg: ,builtin))
+      (font-lock-string-face . (fg: ,string))
+      (font-lock-comment-face . (fg: ,comment italic: #t))
+      (font-lock-number-face . (fg: ,number))
+      (font-lock-operator-face . (fg: ,operator))
+      (font-lock-type-face . (fg: ,type))
+      (font-lock-preprocessor-face . (fg: ,preprocessor))
+      (font-lock-heading-face . (fg: ,heading bold: #t))
+
+      ;; UI elements
+      (modeline . (fg: ,modeline-fg bg: ,modeline-bg))
+      (modeline-inactive . (fg: ,modeline-inactive-fg bg: ,modeline-bg))
+      (line-number . (fg: ,gutter-fg bg: ,gutter-bg))
+      (cursor-line . (bg: ,cursor-line))
+
+      ;; Search and matching
+      (match . (fg: ,match-fg bg: ,match-bg bold: #t))
+      (mismatch . (fg: ,mismatch-fg bg: ,mismatch-bg bold: #t))
+      (isearch . (fg: ,isearch-fg bg: ,isearch-bg))
+      (error . (fg: ,error))
+
+      ;; Org-mode headings
+      (org-heading-1 . (fg: ,org-heading-1 bold: #t))
+      (org-heading-2 . (fg: ,org-heading-2 bold: #t))
+      (org-heading-3 . (fg: ,org-heading-3 bold: #t))
+      (org-heading-4 . (fg: ,org-heading-4 bold: #t))
+      (org-heading-5 . (fg: ,org-heading-5 bold: #t))
+      (org-heading-6 . (fg: ,org-heading-6 bold: #t))
+      (org-heading-7 . (fg: ,org-heading-7 bold: #t))
+      (org-heading-8 . (fg: ,org-heading-8 bold: #t))
+
+      ;; Org-mode elements
+      (org-todo . (fg: ,todo bold: #t))
+      (org-done . (fg: ,done bold: #t))
+      (org-link . (fg: ,link underline: #t))
+      (org-code . (fg: ,string))
+      (org-verbatim . (fg: ,builtin))
+      (org-table . (fg: ,builtin))
+      (org-comment . (fg: ,comment italic: #t))
+      (org-tag . (fg: ,tag))
+      (org-date . (fg: ,date))
+      (org-property . (fg: ,property))
+      (org-block-delimiter . (fg: ,block-delimiter))
+      (org-block-body . (fg: ,block-body))
+
+      ;; Tab bar
+      (tab-active . (fg: ,tab-active-fg bg: ,tab-active-bg))
+      (tab-inactive . (fg: ,tab-inactive-fg bg: ,tab-inactive-bg))
+
+      ;; Window borders
+      (window-border-active . (fg: ,border-active))
+      (window-border-inactive . (fg: ,border-inactive))
+
+      ;; Legacy UI chrome keys
+      (bg . ,bg)
+      (fg . ,fg)
+      (selection . ,selection)
+      (modeline-bg . ,modeline-bg)
+      (modeline-fg . ,modeline-fg)
+      (echo-bg . ,modeline-bg)
+      (echo-fg . ,modeline-fg)
+      (gutter-bg . ,gutter-bg)
+      (gutter-fg . ,gutter-fg)
+      (split . ,split)
+      (tab-bg . ,tab-bg)
+      (tab-border . ,tab-border)
+      (tab-active-bg . ,tab-active-bg)
+      (tab-active-fg . ,tab-active-fg)
+      (tab-inactive-bg . ,tab-inactive-bg)
+      (tab-inactive-fg . ,tab-inactive-fg))))
+
+(def theme-adwaita
+  (theme-from-palette
+    '((bg . "#ffffff") (fg . "#2e3436") (selection . "#c2e0ff")
+      (modeline-bg . "#e9e9e9") (modeline-fg . "#2e3436")
+      (modeline-inactive-fg . "#888a85") (gutter-bg . "#f4f4f4")
+      (gutter-fg . "#888a85") (cursor-line . "#f3f3f3")
+      (keyword . "#204a87") (builtin . "#5c3566") (string . "#4e9a06")
+      (comment . "#8d8d84") (number . "#ad7fa8") (operator . "#2e3436")
+      (type . "#ce5c00") (preprocessor . "#8f5902") (heading . "#3465a4")
+      (match-bg . "#edd400") (isearch-bg . "#fce94f") (error . "#cc0000")
+      (todo . "#cc0000") (done . "#4e9a06") (link . "#204a87")
+      (tag . "#75507b") (date . "#ad7fa8") (border-active . "#3465a4")
+      (border-inactive . "#d3d7cf") (split . "#d3d7cf")
+      (tab-active-bg . "#c2e0ff") (tab-inactive-bg . "#eeeeec"))))
+
+(def theme-deeper-blue
+  (theme-from-palette
+    '((bg . "#000033") (fg . "#d9e6f2") (selection . "#003f5f")
+      (modeline-bg . "#102e4a") (modeline-fg . "#ffffff")
+      (gutter-bg . "#00002a") (gutter-fg . "#6c8ca8") (cursor-line . "#001f3f")
+      (keyword . "#00bfff") (builtin . "#87cefa") (string . "#00ff7f")
+      (comment . "#7f9f9f") (number . "#ffd700") (operator . "#b0c4de")
+      (type . "#add8e6") (preprocessor . "#ffb86c") (heading . "#5fafff")
+      (match-bg . "#ffd700") (isearch-bg . "#ff8c00") (error . "#ff6c6b")
+      (todo . "#ff6c6b") (done . "#00ff7f") (link . "#87cefa")
+      (tag . "#c792ea") (date . "#ffd700") (border-active . "#5fafff")
+      (border-inactive . "#102e4a") (split . "#102e4a")
+      (tab-active-bg . "#003f5f") (tab-inactive-bg . "#000033"))))
+
+(def theme-dichromacy
+  (theme-from-palette
+    '((bg . "#ffffff") (fg . "#000000") (selection . "#d7d7ff")
+      (modeline-bg . "#d7d7d7") (modeline-fg . "#000000")
+      (gutter-bg . "#eeeeee") (gutter-fg . "#707070") (cursor-line . "#eeeeff")
+      (keyword . "#0000ff") (builtin . "#005faf") (string . "#008700")
+      (comment . "#707070") (number . "#af5f00") (operator . "#000000")
+      (type . "#8700af") (preprocessor . "#af5f00") (heading . "#005faf")
+      (match-bg . "#ffff00") (isearch-bg . "#ffd700") (error . "#d70000")
+      (todo . "#d70000") (done . "#008700") (link . "#0000ff")
+      (tag . "#8700af") (date . "#af5f00") (border-active . "#005faf")
+      (border-inactive . "#bcbcbc") (split . "#bcbcbc")
+      (tab-active-bg . "#d7d7ff") (tab-inactive-bg . "#eeeeee"))))
+
+(def theme-leuven
+  (theme-from-palette
+    '((bg . "#ffffff") (fg . "#333333") (selection . "#d7eaff")
+      (modeline-bg . "#e5e5e5") (modeline-fg . "#000000")
+      (modeline-inactive-fg . "#8a8a8a") (gutter-bg . "#f5f5f5")
+      (gutter-fg . "#9a9a9a") (cursor-line . "#f0f4ff")
+      (keyword . "#0000ff") (builtin . "#8b008b") (string . "#008000")
+      (comment . "#8b0000") (number . "#b8860b") (operator . "#333333")
+      (type . "#228b22") (preprocessor . "#b8860b") (heading . "#1f5fbf")
+      (match-bg . "#ffff00") (isearch-bg . "#ffcc33") (error . "#ff0000")
+      (todo . "#ff0000") (done . "#008000") (link . "#0000ee")
+      (tag . "#8b008b") (date . "#b8860b") (block-body . "#555555")
+      (border-active . "#1f5fbf") (border-inactive . "#d0d0d0")
+      (split . "#d0d0d0") (tab-active-bg . "#d7eaff")
+      (tab-inactive-bg . "#f3f3f3"))))
+
+(def theme-light-blue
+  (theme-from-palette
+    '((bg . "#f0f8ff") (fg . "#000040") (selection . "#b7cfe8")
+      (modeline-bg . "#c7d8e8") (modeline-fg . "#000040")
+      (gutter-bg . "#e6f0fa") (gutter-fg . "#607080") (cursor-line . "#e6f0ff")
+      (keyword . "#0000aa") (builtin . "#006699") (string . "#008000")
+      (comment . "#708090") (number . "#8b4500") (operator . "#000040")
+      (type . "#00688b") (preprocessor . "#a0522d") (heading . "#005f9f")
+      (match-bg . "#ffff66") (isearch-bg . "#ffc857") (error . "#cc0000")
+      (todo . "#cc0000") (done . "#008000") (link . "#0000aa")
+      (tag . "#7f007f") (date . "#8b4500") (border-active . "#005f9f")
+      (border-inactive . "#b7cfe8") (split . "#b7cfe8")
+      (tab-active-bg . "#b7cfe8") (tab-inactive-bg . "#e6f0fa"))))
+
+(def theme-manoj-dark
+  (theme-from-palette
+    '((bg . "#000000") (fg . "#eeeeee") (selection . "#333366")
+      (modeline-bg . "#202040") (modeline-fg . "#ffffff")
+      (gutter-bg . "#080808") (gutter-fg . "#777777") (cursor-line . "#101020")
+      (keyword . "#00ffff") (builtin . "#87cefa") (string . "#00ff00")
+      (comment . "#7f7f7f") (number . "#ffaf00") (operator . "#eeeeee")
+      (type . "#ffff00") (preprocessor . "#ff5f87") (heading . "#87cefa")
+      (match-bg . "#ffff00") (isearch-bg . "#ffaf00") (error . "#ff0000")
+      (todo . "#ff0000") (done . "#00ff00") (link . "#87cefa")
+      (tag . "#ff5fff") (date . "#ffaf00") (border-active . "#00ffff")
+      (border-inactive . "#333333") (split . "#333333")
+      (tab-active-bg . "#333366") (tab-inactive-bg . "#101010"))))
+
+(def theme-misterioso
+  (theme-from-palette
+    '((bg . "#2d3743") (fg . "#e1e1e0") (selection . "#4a5664")
+      (modeline-bg . "#1f252d") (modeline-fg . "#ffffff")
+      (modeline-inactive-fg . "#8b9aaa") (gutter-bg . "#26313d")
+      (gutter-fg . "#8b9aaa") (cursor-line . "#34404d")
+      (keyword . "#b4fa70") (builtin . "#8cc4ff") (string . "#e9c062")
+      (comment . "#9f9f9f") (number . "#ff9da4") (operator . "#e1e1e0")
+      (type . "#fce94f") (preprocessor . "#ffb86c") (heading . "#8cc4ff")
+      (match-bg . "#fce94f") (isearch-bg . "#ffb86c") (error . "#ff6c6b")
+      (todo . "#ff6c6b") (done . "#b4fa70") (link . "#8cc4ff")
+      (tag . "#c792ea") (date . "#ff9da4") (border-active . "#8cc4ff")
+      (border-inactive . "#4a5664") (split . "#1f252d")
+      (tab-active-bg . "#4a5664") (tab-inactive-bg . "#2d3743"))))
+
+(def theme-tango
+  (theme-from-palette
+    '((bg . "#ffffff") (fg . "#2e3436") (selection . "#c7d9f1")
+      (modeline-bg . "#eeeeec") (modeline-fg . "#2e3436")
+      (gutter-bg . "#f4f4f2") (gutter-fg . "#888a85") (cursor-line . "#f2f2f0")
+      (keyword . "#204a87") (builtin . "#5c3566") (string . "#4e9a06")
+      (comment . "#8f5902") (number . "#ad7fa8") (operator . "#2e3436")
+      (type . "#ce5c00") (preprocessor . "#c4a000") (heading . "#3465a4")
+      (match-bg . "#fce94f") (isearch-bg . "#edd400") (error . "#cc0000")
+      (todo . "#cc0000") (done . "#4e9a06") (link . "#204a87")
+      (tag . "#75507b") (date . "#ad7fa8") (border-active . "#3465a4")
+      (border-inactive . "#d3d7cf") (split . "#d3d7cf")
+      (tab-active-bg . "#c7d9f1") (tab-inactive-bg . "#eeeeec"))))
+
+(def theme-tango-dark
+  (theme-from-palette
+    '((bg . "#2e3436") (fg . "#eeeeec") (selection . "#4a5f6a")
+      (modeline-bg . "#24292b") (modeline-fg . "#eeeeec")
+      (modeline-inactive-fg . "#888a85") (gutter-bg . "#24292b")
+      (gutter-fg . "#888a85") (cursor-line . "#383f41")
+      (keyword . "#729fcf") (builtin . "#ad7fa8") (string . "#8ae234")
+      (comment . "#888a85") (number . "#fce94f") (operator . "#eeeeec")
+      (type . "#e9b96e") (preprocessor . "#fcaf3e") (heading . "#729fcf")
+      (match-bg . "#fce94f") (isearch-bg . "#fcaf3e") (error . "#ef2929")
+      (todo . "#ef2929") (done . "#8ae234") (link . "#729fcf")
+      (tag . "#ad7fa8") (date . "#fce94f") (border-active . "#729fcf")
+      (border-inactive . "#555753") (split . "#555753")
+      (tab-active-bg . "#4a5f6a") (tab-inactive-bg . "#2e3436"))))
+
+(def theme-tsdh-dark
+  (theme-from-palette
+    '((bg . "#000000") (fg . "#dddddd") (selection . "#333333")
+      (modeline-bg . "#303030") (modeline-fg . "#ffffff")
+      (gutter-bg . "#080808") (gutter-fg . "#777777") (cursor-line . "#151515")
+      (keyword . "#00ffff") (builtin . "#87cefa") (string . "#98fb98")
+      (comment . "#7f7f7f") (number . "#ffa500") (operator . "#dddddd")
+      (type . "#ffff00") (preprocessor . "#ff69b4") (heading . "#87cefa")
+      (match-bg . "#ffff00") (isearch-bg . "#ffa500") (error . "#ff4040")
+      (todo . "#ff4040") (done . "#98fb98") (link . "#87cefa")
+      (tag . "#ff69b4") (date . "#ffa500") (border-active . "#00ffff")
+      (border-inactive . "#303030") (split . "#303030")
+      (tab-active-bg . "#333333") (tab-inactive-bg . "#000000"))))
+
+(def theme-tsdh-light
+  (theme-from-palette
+    '((bg . "#ffffff") (fg . "#000000") (selection . "#d7d7d7")
+      (modeline-bg . "#d0d0d0") (modeline-fg . "#000000")
+      (gutter-bg . "#eeeeee") (gutter-fg . "#777777") (cursor-line . "#f3f3f3")
+      (keyword . "#0000cd") (builtin . "#8b008b") (string . "#008b00")
+      (comment . "#7f7f7f") (number . "#b8860b") (operator . "#000000")
+      (type . "#228b22") (preprocessor . "#b22222") (heading . "#0000cd")
+      (match-bg . "#ffff00") (isearch-bg . "#ffd700") (error . "#ff0000")
+      (todo . "#ff0000") (done . "#008b00") (link . "#0000cd")
+      (tag . "#8b008b") (date . "#b8860b") (border-active . "#0000cd")
+      (border-inactive . "#bcbcbc") (split . "#bcbcbc")
+      (tab-active-bg . "#d7d7d7") (tab-inactive-bg . "#eeeeee"))))
+
+(def theme-wheatgrass
+  (theme-from-palette
+    '((bg . "#000000") (fg . "#f6f3e8") (selection . "#2f4f2f")
+      (modeline-bg . "#1f2f1f") (modeline-fg . "#f6f3e8")
+      (gutter-bg . "#050505") (gutter-fg . "#8f9f8f") (cursor-line . "#102010")
+      (keyword . "#00ff7f") (builtin . "#7fffd4") (string . "#f0e68c")
+      (comment . "#7f9f7f") (number . "#ffa500") (operator . "#f6f3e8")
+      (type . "#adff2f") (preprocessor . "#ffb86c") (heading . "#7fffd4")
+      (match-bg . "#f0e68c") (isearch-bg . "#ffa500") (error . "#ff4040")
+      (todo . "#ff4040") (done . "#00ff7f") (link . "#7fffd4")
+      (tag . "#dda0dd") (date . "#ffa500") (border-active . "#7fffd4")
+      (border-inactive . "#2f4f2f") (split . "#1f2f1f")
+      (tab-active-bg . "#2f4f2f") (tab-inactive-bg . "#000000"))))
+
+(def theme-whiteboard
+  (theme-from-palette
+    '((bg . "#ffffff") (fg . "#000000") (selection . "#d8e8ff")
+      (modeline-bg . "#e6e6e6") (modeline-fg . "#000000")
+      (gutter-bg . "#f5f5f5") (gutter-fg . "#8a8a8a") (cursor-line . "#f4f8ff")
+      (keyword . "#0000ff") (builtin . "#0060a8") (string . "#008000")
+      (comment . "#a02020") (number . "#b8860b") (operator . "#000000")
+      (type . "#228b22") (preprocessor . "#b22222") (heading . "#0000ff")
+      (match-bg . "#ffff00") (isearch-bg . "#ffd700") (error . "#ff0000")
+      (todo . "#ff0000") (done . "#008000") (link . "#0000ee")
+      (tag . "#8b008b") (date . "#b8860b") (border-active . "#0000ff")
+      (border-inactive . "#cfcfcf") (split . "#cfcfcf")
+      (tab-active-bg . "#d8e8ff") (tab-inactive-bg . "#f5f5f5"))))
+
+(def theme-wombat
+  (theme-from-palette
+    '((bg . "#242424") (fg . "#f6f3e8") (selection . "#444444")
+      (modeline-bg . "#303030") (modeline-fg . "#f6f3e8")
+      (modeline-inactive-fg . "#99968b") (gutter-bg . "#242424")
+      (gutter-fg . "#99968b") (cursor-line . "#303030")
+      (keyword . "#88b8f6") (builtin . "#cae682") (string . "#95e454")
+      (comment . "#99968b") (number . "#e5786d") (operator . "#f6f3e8")
+      (type . "#cae682") (preprocessor . "#e5786d") (heading . "#88b8f6")
+      (match-bg . "#cae682") (isearch-bg . "#e5786d") (error . "#ff6c6b")
+      (todo . "#ff6c6b") (done . "#95e454") (link . "#88b8f6")
+      (tag . "#e5786d") (date . "#cae682") (border-active . "#88b8f6")
+      (border-inactive . "#444444") (split . "#303030")
+      (tab-active-bg . "#444444") (tab-inactive-bg . "#242424"))))
+
+;;; ============================================================================
 ;;; Theme Registry
 ;;; ============================================================================
 
@@ -848,3 +1188,17 @@
 (register-theme! 'dracula theme-dracula)
 (register-theme! 'nord theme-nord)
 (register-theme! 'zenburn theme-zenburn)
+(register-theme! 'adwaita theme-adwaita)
+(register-theme! 'deeper-blue theme-deeper-blue)
+(register-theme! 'dichromacy theme-dichromacy)
+(register-theme! 'leuven theme-leuven)
+(register-theme! 'light-blue theme-light-blue)
+(register-theme! 'manoj-dark theme-manoj-dark)
+(register-theme! 'misterioso theme-misterioso)
+(register-theme! 'tango theme-tango)
+(register-theme! 'tango-dark theme-tango-dark)
+(register-theme! 'tsdh-dark theme-tsdh-dark)
+(register-theme! 'tsdh-light theme-tsdh-light)
+(register-theme! 'wheatgrass theme-wheatgrass)
+(register-theme! 'whiteboard theme-whiteboard)
+(register-theme! 'wombat theme-wombat)
diff --git a/tests/test-tier0.ss b/tests/test-tier0.ss
index cfe964e..f55d8f6 100644
--- a/tests/test-tier0.ss
+++ b/tests/test-tier0.ss
@@ -111,6 +111,10 @@
 (check-true "theme-names" (pair? (theme-names)))
 (check-true "dark-exists" (theme-get 'dark))
 (check-true "dracula-exists" (theme-get 'dracula))
+(check-true "wombat-exists" (theme-get 'wombat))
+(check-true "tango-dark-exists" (theme-get 'tango-dark))
+(check-true "leuven-exists" (theme-get 'leuven))
+(check-true "theme-count-expanded" (>= (length (theme-names)) 24))
 (check "theme-is-alist" (pair? (theme-get 'dark)) #t)
 
 ;;; ========================================================================