Skip to content

feat: add theme system with dark, light, green, purple, and yellow themes - #29

Merged
lstebner merged 5 commits into
mainfrom
feat/theme-system
Jul 9, 2026
Merged

feat: add theme system with dark, light, green, purple, and yellow themes#29
lstebner merged 5 commits into
mainfrom
feat/theme-system

Conversation

@lstebner

@lstebner lstebner commented Jul 9, 2026

Copy link
Copy Markdown
Owner

Summary

  • Converts Spudbox's colors into a token-based design system (docs/DESIGN_SYSTEM.md) so a new theme is a theme.css-only change, with documented rules for choosing accent hues, deriving hover/contrast colors, and handling status-color/accent-hue collisions.
  • Ports the existing palette to dark (unchanged) and adds light (a proper contrast-checked inverse) plus green/purple/yellow — each colored theme has its own tinted, elevation-ramped neutral scale (not just a swapped accent) built around a muted accent chosen visually against the real app chrome.
  • Removes every remaining hardcoded hex/rgba color from components in favor of tokens (status colors, scrims, accent-contrast); fixes the sort-select chevron to adapt per theme.
  • Adds theme persistence: appearance_get_theme/appearance_set_theme Tauri commands backed by the existing app_settings table.
  • Adds a quick-access theme switcher (palette icon next to the settings cog) — no duplicate control in Settings.

Test plan

  • cargo test --lib — 105 passed
  • npm run test — 4 passed
  • npm run check — 0 errors
  • Manually verified all 5 themes in a running dev build (buttons, badges, star ratings, equalizer, destructive/warning states)
Screencast.from.2026-07-08.21-45-25.mp4

🤖 Generated with Claude Code

@lstebner lstebner mentioned this pull request Jul 9, 2026
lstebner added 5 commits July 8, 2026 21:46
…emes

Converts the existing palette into a token-based design system
(docs/DESIGN_SYSTEM.md) so a new theme is a theme.css-only change, then
adds five themes and a quick-access switcher next to the settings cog.
Theme choice persists via the existing app_settings table.
Matches the roving-tabindex + Escape-to-close pattern already used by
Equalizer.svelte's preset-list popover, which this component otherwise
duplicates the structure of.
Toggling .hide-toggle's opacity on album hover was forcing WebKitGTK to
switch the whole window's text antialiasing mode for a frame, visible as
every album's title/artist text flashing bold — invisible against dark
theme's near-black surfaces, but obvious against light theme's near-white
one. will-change: opacity pre-promotes it to its own compositing layer so
the hover no longer triggers a window-wide repaint.
Title/subtitle were below the project's 1em font-size floor, and the
title's semibold weight read as too heavy once the antialiasing-flash fix
made it render consistently. Also fixes the "NEW" badge's sub-1em text
while touching this file. Bumps the virtualizer's per-card text-height
reservation to match the now-taller lines.
1em overwhelmed the album art it sits on top of. Kept as a documented,
narrow exception to the project's 1em text-size floor since it's a
decorative corner pill, not reading content.
@lstebner
lstebner force-pushed the feat/theme-system branch from ae7de94 to 2bf50d5 Compare July 9, 2026 04:46
@lstebner
lstebner merged commit b31b02c into main Jul 9, 2026
2 checks passed
@lstebner
lstebner deleted the feat/theme-system branch July 9, 2026 04:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant