Summary
The dashboard supports seven themes but only one is light (vanilla), and theme selection ignores the OS prefers-color-scheme. Users on systems that auto-switch between light and dark mode can't have the dashboard follow along, and a popular palette (Solarized) is missing entirely.
Current state
interface/src/hooks/useTheme.ts defines default | vanilla | midnight | noir | slate | nord | mocha | catpucchino
- Of those, only
vanilla is light
- No
prefers-color-scheme listener anywhere in interface/ (verified by grep)
- Tokens come from
@spacedrive/tokens@0.2.3 — its themes/ directory has dark.css, light.css, midnight.css, mocha.css, noir.css, nord.css, slate.css (no Solarized)
- Theme is persisted under
localStorage["spacebot-theme"] as a single id
Proposed change
- Add
solarized-light and solarized-dark theme tokens. Either upstream in @spacedrive/tokens (preferred — keeps the same tokenization model the rest of the dashboard uses) or as a local override stylesheet imported in interface/src/styles.css.
- Add 1-2 more light variants (e.g.
paper, or Catppuccin latte to pair with the existing mocha).
- Add a "mode" selector alongside the theme picker in Settings:
light | dark | system.
- When
system, watch window.matchMedia("(prefers-color-scheme: dark)") and swap between a chosen light theme and a chosen dark theme.
- Persist mode + per-mode theme choices separately (e.g.
spacebot-theme-mode, spacebot-theme-light, spacebot-theme-dark).
- Settings UI: when mode is
system, render two pickers ("Light theme" + "Dark theme") instead of one.
Out of scope
- Custom user-authored themes (separate issue)
- Per-component theme overrides
Open questions
- Is the maintainer happy to take Solarized as a local override here, or should the addition go upstream to
@spacedrive/tokens? Upstream is cleaner long-term but slower to land.
Summary
The dashboard supports seven themes but only one is light (
vanilla), and theme selection ignores the OSprefers-color-scheme. Users on systems that auto-switch between light and dark mode can't have the dashboard follow along, and a popular palette (Solarized) is missing entirely.Current state
interface/src/hooks/useTheme.tsdefinesdefault | vanilla | midnight | noir | slate | nord | mocha | catpucchinovanillais lightprefers-color-schemelistener anywhere ininterface/(verified by grep)@spacedrive/tokens@0.2.3— itsthemes/directory hasdark.css, light.css, midnight.css, mocha.css, noir.css, nord.css, slate.css(no Solarized)localStorage["spacebot-theme"]as a single idProposed change
solarized-lightandsolarized-darktheme tokens. Either upstream in@spacedrive/tokens(preferred — keeps the same tokenization model the rest of the dashboard uses) or as a local override stylesheet imported ininterface/src/styles.css.paper, or Catppuccinlatteto pair with the existingmocha).light | dark | system.system, watchwindow.matchMedia("(prefers-color-scheme: dark)")and swap between a chosen light theme and a chosen dark theme.spacebot-theme-mode,spacebot-theme-light,spacebot-theme-dark).system, render two pickers ("Light theme" + "Dark theme") instead of one.Out of scope
Open questions
@spacedrive/tokens? Upstream is cleaner long-term but slower to land.