Commit Graph
1805 Commits
Author SHA1 Message Date
vicrodh e9ffff53f4 feat(ui): right-click context menu to change artist image 2026-02-23 08:55:25 -06:00
vicrodh 3229640a12 fix(ui): remove round mask from lightbox, show image at natural shape 2026-02-23 08:55:25 -06:00
vicrodh f49e5a35ec feat(ui): click album artwork to view full size 2026-02-23 08:55:25 -06:00
vicrodh 668a92b3a8 feat(ui): click artist image to view full size 2026-02-23 08:55:25 -06:00
vicrodh 8deef0be10 feat(ui): add ImageLightbox component 2026-02-23 08:55:25 -06:00
vicrodh 285421ece9 feat(auto-theme): make color swatches editable with color picker
Replace the 5 static k-means palette previews with 8 labeled, editable
swatches showing the actual applied CSS variables: Base, Surface,
Elevated, Accent, Text, Muted, Border, Danger.

Each swatch opens a native color picker on click. Changes apply
instantly to the live theme and persist to localStorage.

Remove unused ThemePalette/PaletteColor types and k-means palette
extraction from the frontend store (no longer needed since swatches
are driven by the GeneratedTheme variables directly).
2026-02-23 04:06:30 -06:00
vicrodh 0886f69cc5 feat(auto-theme): add experimental notice below detected DE line
Shows a warning-colored message below the detected desktop environment
indicating this is an experimental feature that may not match exactly.
2026-02-23 04:00:44 -06:00
vicrodh 1aeb9bf47e feat(auto-theme): read full DE color scheme for system theme
Instead of using wallpaper k-means + accent override (which produced
wrong backgrounds), the system source now reads ALL colors from the
DE config (kdeglobals for KDE, dconf hints for GNOME).

Maps Window/View/Button/Selection/Header sections directly to CSS
variables — bg-primary from Window, bg-secondary from View,
bg-tertiary from Button, accent from Selection, text from
ForegroundNormal, etc.

Adds SystemColorScheme type, get_system_color_scheme() in system.rs,
generate_theme_from_scheme() in generator.rs, and two new V2 commands:
v2_generate_theme_from_system_colors and v2_get_system_color_scheme.

Frontend tryAccentColorTheme() replaced with trySystemColorSchemeTheme()
which calls the new endpoint. Old color math helpers removed.
2026-02-23 03:51:37 -06:00
vicrodh 93ff5db9a0 feat(auto-theme): add accent-first cascade, overlay spinner, and failure modal
Source options: System Colors (accent -> wallpaper fallback), Wallpaper
Sync, Custom Image. Selecting System shows fullscreen overlay while
generating. On failure: modal recommends another theme or custom image,
falls back to Dark immediately.

Store cascade logic: tryAccentColorTheme() first (with wallpaper
backgrounds + system accent override), then generateFromWallpaper(),
then throw for caller to handle.

cc
2026-02-23 03:35:12 -06:00
vicrodh 12a8744f38 feat(auto-theme): add settings UI with System theme, source picker, and palette preview
- "System" theme option in dropdown (after Dark/OLED/Light, before others)
- Selecting System triggers wallpaper-based theme generation
- Sub-controls: source picker (wallpaper/custom image), image selector
- Palette swatches preview, DE detection display, error handling
- Switching to any static theme cleanly disables auto-theme
- i18n keys added to all 4 locales (en, es, de, fr)

cc
2026-02-23 03:27:02 -06:00
vicrodh c48377b092 feat(auto-theme): add autoThemeStore with CSS variable injection and bootstrap restore
- autoThemeStore.ts: manages theme generation, CSS injection, and localStorage persistence
- Bootstrap: restoreAutoThemeVars() called before loadSavedTheme() to prevent FOUC
- data-theme="auto" prevents static CSS theme blocks from matching
- ~40 CSS variables injected at runtime via document.documentElement.style

cc
2026-02-23 03:20:59 -06:00
vicrodh 985e673b72 feat(favorites): add genre filter to tracks tab with independent persistence 2026-02-23 02:02:31 -06:00
vicrodh faa4dd969c fix(ui): move results count to nav bar, left of filter/sort controls 2026-02-23 01:58:00 -06:00
vicrodh dc6646efbd fix(ui): prevent alpha-index from expanding to fill flex space in artist browse view 2026-02-23 01:56:17 -06:00
vicrodh 61b73147ca fix(ui): reduce results-count reserved width, fix dropdown menus clipped by nav bar 2026-02-23 01:53:17 -06:00
vicrodh 44d0794d4d fix(ui): move results count to header row right of search with reserved width 2026-02-23 01:50:29 -06:00
vicrodh 4b5649a464 fix(ui): move toolbar controls into nav bar right-aligned for all tabs 2026-02-23 01:48:07 -06:00
vicrodh 30e1e0d0d4 fix(ui): always show close button on expanded search input 2026-02-23 01:44:54 -06:00
vicrodh 627c7d403e fix(ui): move search to header row, right-aligned inline with title 2026-02-23 01:44:20 -06:00
vicrodh 1293ae7aa7 fix(ui): match play button size to secondary in favorites tracks header 2026-02-23 01:41:46 -06:00
vicrodh 79f4bea41b fix(ui): favorites header layout - title and actions inline on same row
Remove header-content wrapper so h1 and action buttons are direct
flex children of .header, placing them inline on the same row.
Remove orphaned CSS and margin-top from header-actions.
2026-02-23 01:41:04 -06:00
vicrodh 8955d90c3a refactor(favorites): remove custom icon, keep only tab order settings
Strip the customizable icon from the Favorites header (now always a
Heart icon) and remove icon/background customization sections from the
edit modal. The modal now only handles tab order reordering. Removed
dead code: resolveCustomIconSrc, customIconSrc, unused lucide imports
(Star, Folder, Library, Heart), convertFileSrc import, header-icon CSS.
2026-02-23 01:35:41 -06:00
vicrodh 4ce765d7f8 fix(immersive): add drag handle button to window controls
Add a Move icon button inside the expandable window controls group
in ImmersiveHeader. On mousedown it calls window.startDragging() to
let the user reposition the window. Cursor shows grab/grabbing.
Only available when the controls are expanded (hover), so collapsed
state has no drag zone as intended.
2026-02-23 01:03:46 -06:00
vicrodh d2f846c541 fix(ui): disable playback controls when nothing to play
Grey out shuffle, previous, play/pause, next, repeat, add-to-playlist,
and favorite buttons when no track is loaded and queue is empty.
Volume/mute controls remain always active.

Closes #103
2026-02-23 00:56:39 -06:00
vicrodh 7a5fe2f5ce fix(ui): keybindings settings modal z-index and 2-column layout
KeybindingsSettings (Customize Shortcuts) had z-index 1000, behind
NowPlayingBar (2001). Bumped to 3000 per ADR-003. Also widened to
660px and added 2-column grid layout with responsive fallback.

This was the actual broken modal — KeyboardShortcutsModal was already
fixed but KeybindingsSettings was missed.
2026-02-22 22:28:07 -06:00
vicrodh abc7a1a2a3 fix(ui): right-click context menu on all card components
- AlbumCard: right-click opens AlbumMenu at click position
- FavoritePlaylistCard: right-click opens menu at click position
- QobuzPlaylistCard: add right-click context menu with click positioning
- SearchPlaylistCard: add right-click context menu with click positioning
- All card menus now use floatingMenuStore for mutual exclusion
- Menu positioning uses click coordinates instead of trigger button
2026-02-22 20:17:40 -06:00
vicrodh 0ee8b9db0e feat(settings): make sync audio on startup opt-in
The reload_settings() call at bootstrap is now gated behind a new
sync_audio_on_startup setting (default OFF). Most users don't need
it; it exists for edge cases where Player::new() holds stale settings
(e.g., after Flatpak updates changing DB schema).

Adds toggle in Settings > Audio with i18n for all 4 locales.
2026-02-22 19:54:12 -06:00
vicrodh 33e8d34bef fix(i18n): add missing diacritics in es, fr, de locales 2026-02-22 18:45:14 -06:00
vicrodh e811afe27e feat(ui): add right-click context menu to album and playlist cards 2026-02-22 18:13:11 -06:00
vicrodh d5203d498a feat(favorites): add random album and artist buttons 2026-02-22 18:12:20 -06:00
vicrodh 6229fa8400 feat(ui): add loading spinner to radio buttons 2026-02-22 18:09:07 -06:00
vicrodh 6c1979b7ea fix(session): persist empty queue state on clear 2026-02-22 18:05:18 -06:00
vicrodh 643bb20c2e feat(settings): add opt-in session persistence toggle 2026-02-22 18:05:02 -06:00
vicrodh 2e51c2e1f2 fix(ui): favorites albums and artists height overflow behind player 2026-02-22 17:58:58 -06:00
vicrodh 37cca5dccf fix(ui): render sanitized HTML in playlist descriptions 2026-02-22 17:58:41 -06:00
vicrodh 66d25b773b fix(ui): keybindings modal z-index and 2-column layout 2026-02-22 17:57:46 -06:00
vicrodh 02bfc7ba91 fix(ui): suppress WebKit default context menu globally 2026-02-22 17:57:05 -06:00
vicrodh 06c6b3457b feat(radio): add track radio submenu to playlist and favorites views
Thread onCreateQbzRadio/onCreateQobuzRadio through TrackRow,
VirtualizedTrackList, PlaylistDetailView, and FavoritesView so
track context menus in playlists and favorites show the radio
submenu with QBZ Radio and Qobuz Radio options.
2026-02-21 07:34:58 -06:00
vicrodh 209cacb569 feat(mixes): add FavQ and TopQ to Your Mixes section
FavQ shuffles up to 50 tracks from the user's Qobuz favorites.
TopQ seeds the Qobuz suggest API from the user's most-played playlists.
Both have same-day cache, refresh button, red/blue gradient artwork,
and a "qbz" badge (vs "qobuz" on DailyQ/WeeklyQ).
2026-02-20 22:45:55 -06:00
vicrodh f4113a9622 feat(ui): add right-click context menu to track rows
Add context menu support (right-click) to the inline track rows in
ArtistDetailView and LabelView popular tracks sections. Right-clicking
a track opens the TrackMenu at the cursor position with all available
actions. Also wires up TrackRow component with contextMenuPosition
prop for the same functionality in reusable track rows.
2026-02-20 22:12:35 -06:00
vicrodh 2dcaa76027 feat(radio): add Qobuz artist/track radio with submenu selection
Add /radio/artist and /radio/track Qobuz API endpoints alongside the
existing /radio/album. TrackMenu now shows a radio submenu with QBZ
Radio (RadioPoolBuilder) and Qobuz Radio options when both are
available. Artist header radio button opens a dropdown to choose
between the two engines.

Backend: get_radio_artist(), get_radio_track() in client.rs,
v2_create_qobuz_artist_radio and v2_create_qobuz_track_radio commands.
Frontend: TrackMenu radio submenu with mutual exclusion against
share/download submenus, ArtistDetailView dropdown, LabelView support.
i18n keys added to all four locale files.
2026-02-20 22:10:44 -06:00
vicrodh 557414ce4e feat(radio): add album radio button to UI
Add Radio button to album detail header (next to favorite button)
that calls v2_create_album_radio, populates the queue with Qobuz
API recommended tracks, and starts playback of the first track.

Add i18n keys for album radio in all 4 locale files (en/es/de/fr).
2026-02-20 21:35:15 -06:00
vicrodh 06c0e9735c fix(session): use struct return type and proactive saves
Two fixes for session not persisting:

1. Changed v2_get_all_queue_tracks to return a struct instead of a
   tuple — Tauri IPC serialization of tuples is unreliable.

2. Added proactive session saves instead of relying on async
   beforeunload (which races with window close):
   - Debounced full save on track change (2s after new track starts)
   - Debounced full save on pause
   - Reduced periodic save from 60s to 15s during playback
   - Close handler remains as best-effort backup
2026-02-20 20:43:35 -06:00
vicrodh aa1aa32f7a fix(session): save full queue with all tracks and metadata
The save was broken in two ways:
1. Only current_track + upcoming (capped at 20) were saved, dropping
   all history tracks. Queue was reconstructed incomplete on restore.
2. Track metadata (hires, bit_depth, sample_rate, source, etc.) was
   not being persisted, only the basic 6 fields.

Add v2_get_all_queue_tracks command that returns the full uncapped
track list with correct current_index. Use it in saveSessionBeforeClose
instead of the capped v2_get_queue_state. Map all metadata fields.
2026-02-20 20:33:39 -06:00
vicrodh 5a0d4c50a1 feat(session): re-enable session restore and add startup page setting
Re-enable queue/track restore on startup (visual only, paused at 0:00).
Update saveSessionBeforeClose to persist current view with context IDs.
Add "Startup page" dropdown in Settings > Appearance (Home / Where you
left off) that controls whether the last view is restored on launch.
i18n keys added to all 4 locale files.
2026-02-20 20:02:26 -06:00
vicrodh 07d5d95cea feat(session): extend frontend service and add restoreView helpers
Update PersistedSession interface with last_view fields. Add lastView,
viewContextId, viewContextType params to saveSessionState(). Add
restoreView(), setRestoredPlaylistId(), setRestoredLocalAlbumId() to
navigationStore for session restore without triggering data fetches.
2026-02-20 19:58:54 -06:00
vicrodh 6a04f13174 fix(keybindings): resolve 4 keyboard shortcut bugs (#95)
- Strip Shift modifier for symbol keys in eventToShortcut() so ? maps correctly
- Remove duplicate Space handler in ImmersivePlayer that caused double-fire
- Add bindingsVersion dependency to KeybindingsSettings for instant visual updates
- Add missing uiOpenLink i18n key and use getActionLabel() fallback in modal
- Add full keybindings translations to de.json and fr.json
2026-02-20 19:33:40 -06:00
vicrodh cd57d37e7a feat(settings): add font family selector in Appearance
- Add 4 bundled fonts: Montserrat, Noto Sans, Source Sans 3, plus
  existing LINE Seed JP (default) and System fallback
- Font selector dropdown in Settings > Appearance, after Language
- Persisted in localStorage, applied on app bootstrap via data-font
  attribute on <html> which overrides --font-sans CSS variable
- @font-face declarations for variable font files in static/fonts/
- i18n key "fontFamily" added to all 4 locales
2026-02-20 18:13:57 -06:00
vicrodh e82940810b feat(immersive): make window draggable and rename to Immersive Mode
- Add persistent drag region (32px strip) at top of immersive overlay
  that remains active even when the header auto-hides after 4 seconds
- Add app-region: drag CSS to ImmersiveHeader's left spacer for proper
  drag support when header is visible
- Add app-region: no-drag to tabs and window controls to keep them
  clickable
- Double-click on drag strip toggles maximize
- Rename "Full Screen" to "Immersive Mode" in all 4 locales (en/es/de/fr)
2026-02-20 18:03:41 -06:00
vicrodh 9ba09ff37b fix(share): handle Odesli entities with numeric IDs (Bandcamp)
Odesli's API returns entity IDs as integers for some platforms (e.g.
Bandcamp) while others return strings. The Entity.id field was typed as
String which caused serde deserialization to fail on numeric values.

Add a custom deserializer that accepts both strings and numbers.
Also show actual backend error in LinkResolverModal for easier debugging.
2026-02-20 16:31:02 -06:00