Frontend (62 components, ~64 rules):
- Replace hardcoded `color: white` / `#fff` with `var(--btn-primary-text)`
in every rule that paints text on `var(--accent-primary)`. Covers in-rule
cases (BulkActionBar, GenreFilterButton, KeybindingsSettings, settings
views, login, modal primary buttons, wizard steps, etc.) plus descendant
selectors (`.parent.selected .child`).
- Semi-transparent rgba(255,255,255,X) over selected accent rows now use
`color-mix(in srgb, var(--btn-primary-text) X%, transparent)` so the mute
level inherits the per-theme token color.
Theme tokens in app.css (--btn-primary-text fixes):
- rose-pine-dawn: #faf4ed → #575279 (was the bg color, ratio 2.60 FAIL;
now 5.71 AA against coral accent)
- kurosaki: #fbf9f2 → #262424 (was the bg color, ratio 1.76 FAIL;
now 8.33 AA against gold accent)
- snow-storm: #eceff4 → #2e3440 (was the bg color, ratio 3.50 AA-Large;
now 6.13 AA against blue accent)
- stratego: #0a0a0a → #ffffff (visual choice; 4.14 AA-Large is
acceptable for button labels and matches palette intent)
Auto-theme generator (src-tauri/src/auto_theme/generator.rs):
- pick_btn_text_for_accent_set(): WCAG-aware FG selection that holds
across accent / hover / active states. Replaces the broken
`luminance < 0.5` threshold which produced 2.0:1 ratios on mid-luminance
accents (Catppuccin lavender, Dracula purple, rose-pine coral).
- ensure_text_contrast_target(text, bg, is_dark, target): generalize the
iterative contrast helper to accept a target ratio. Apply to
text_secondary (4.5) and text_muted (3.0).
- Add --btn-danger-text and --btn-warning-text tokens via
pick_btn_text_for_bg for future status-button consumers.
Misc fixes:
- SettingsView.svelte: extract initialTitlebarMode to const, avoids the
Svelte 5 state_referenced_locally warning.
- QueuePanel.svelte: wrap .stop-after-marker in :global() (the class is
forwarded to a Svelte component child, not a native element) and fix
var(--accent) typo to the correct var(--accent-primary).
Tests: 13 generator tests pass (8 prior + 5 new). svelte-check 0 errors,
31 warnings (down from 33).
cc