Commit Graph
100 Commits
Author SHA1 Message Date
vicrodh 21358aa876 fix(oauth): use 'code' param for /oauth/callback API (Qobuz uses code_autorisation in redirect URL but 'code' in the API) 2026-02-23 15:24:40 -06:00
vicrodh 674990ebe5 debug(oauth): log response body on /oauth/callback failure, add app_id query param 2026-02-23 15:22:06 -06:00
vicrodh 22060d1d35 fix(oauth): correct parameter names (code_autorisation, not code)
Qobuz redirects to play.qobuz.com/discover?code_autorisation=XXX
not ?code=XXX. Both the navigation intercept and the /oauth/callback
API call were using the wrong parameter name, so the code was never
captured and the exchange request was malformed.
2026-02-23 15:18:52 -06:00
vicrodh fea13ecee7 fix(oauth): close window from navigation callback, always return true
on_navigation returning false does not reliably block HTTP 302 redirects
on WebKitGTK (Linux). Closing the window from within the callback is
more reliable than calling close() from an async Tokio thread.

Changes:
- Always return true from on_navigation (never try to block)
- Close oauth window inside on_navigation callback after code capture
- Best-effort close via app.get_webview_window() after await (fallback)
- Add logging of every URL visited for debugging
- Idempotent: ignore duplicate code captures if callback fires twice
2026-02-23 15:16:05 -06:00
vicrodh 35ac015bb7 feat(login): add OAuth browser login button and fix ToS persistence race condition 2026-02-23 14:45:34 -06:00
vicrodh e5d34ccee7 feat(commands): add v2_start_oauth_login Tauri command with WebView browser login 2026-02-23 14:45:30 -06:00
vicrodh afbe541fca feat(api): add private_key extraction, OAUTH_CALLBACK path, and login_with_oauth_code to legacy client 2026-02-23 14:45:27 -06:00
vicrodh 9d6be623d4 feat(core): add set_session to QbzCore and login_with_session to CoreBridge for OAuth 2026-02-23 14:45:24 -06:00
vicrodh 5ed96c1d2d feat(qobuz): add private_key extraction and login_with_oauth_code to qbz-qobuz client 2026-02-23 14:45:20 -06:00
vicrodh b8eadf9fe2 docs: add vorce queue fix credit and QA thank-you to 1.1.15 release notes 2026-02-23 13:11:58 -06:00
vicrodh 161b304c55 docs: reformat 1.1.15 TAG_DETAILS to match established release note style 2026-02-23 12:47:41 -06:00
vicrodh 305af37a67 docs: add 1.1.15 release notes (tag details, highlights, full changelog) 2026-02-23 12:25:55 -06:00
vicrodh 0df1448a69 chore(release): bump root snapcraft.yaml to 1.1.15 2026-02-23 12:19:13 -06:00
vicrodh 26db1c1728 chore(release): bump version to 1.1.15 2026-02-23 12:18:08 -06:00
vicrodh 5678032722 Merge branch 'pre-release' of github.com:vicrodh/qbz into pre-release
# Conflicts:
#	src/lib/components/views/ArtistDetailView.svelte
2026-02-23 12:15:38 -06:00
vicrodh 84709b4adc fix(navigation): expire scroll positions after 1 hour 2026-02-23 12:14:04 -06:00
vicrodh 69b60b1bd9 fix(navigation): scope scroll position by item ID to prevent bleed between different albums/artists
Previously all albums shared one scroll position key ('album'), so
opening any album would restore the scroll from the last album visited.
Now keyed as 'album:id', 'artist:id', 'playlist:id' so each item
tracks its own position independently. Back navigates to exact scroll,
fresh opens start at 0.
2026-02-23 12:09:40 -06:00
vicrodh 6b6dd54944 fix(multi-select): move BulkActionBar to bottom position, add LabelView multi-select
- Revert placement='top' to default bottom sticky across all views
- Content area already has padding-bottom: 100px in all views so no
  track is ever hidden behind the bar
- AlbumDetailView/ArtistDetailView/WeeklySuggestView: bar now after tracks
- DynamicSuggestView/FavQView/TopQView: bar now after tracks (new views)
- LabelView: complete multi-select implementation with checkbox rows,
  Select toggle button, and BulkActionBar after popular tracks list
2026-02-23 12:05:14 -06:00
vicrodh e2beba23f2 feat(multi-select): Phase 3 - AlbumDetailView, ArtistDetailView, WeeklySuggestView
AlbumDetailView:
- Select toggle button alongside AlbumMenu in action bar
- TrackRow selectable/selected/onToggleSelect props wired
- BulkActionBar with play next/later, add to playlist, add to favorites
- buildAlbumQueueTracks helper (album artwork and artist from album props)

ArtistDetailView (Popular Tracks section):
- Select button in section-header-actions alongside Play All
- Checkbox injected before track-number in custom track-row div
- click/keydown/contextmenu handlers respect multiSelectMode
- multi-selected highlight CSS
- BulkActionBar with add to favorites using toggleTrackFavorite

WeeklySuggestView:
- Select toggle button in track-controls (next to search)
- TrackRow selectable/selected/onToggleSelect props wired
- BulkActionBar with play next/later, add to playlist
- Reuses existing buildQueueTracks helper
2026-02-23 11:31:58 -06:00
vicrodh 127841a18b feat(multi-select): Phase 2 - PlaylistDetailView + BulkActionBar fixes
- Add multi-select mode to PlaylistDetailView (independent of custom order mode):
  Select toggle button in track-controls toolbar, multiSelectedKeys state,
  checkboxes per row, multi-selected highlight, BulkActionBar with play
  next/later, add to playlist, and bulk remove from playlist
- Bulk remove handles local tracks (one-by-one), Qobuz tracks with
  playlistTrackId, and fallback trackId in a single invocation each
- Add onRemoveFavorites prop to BulkActionBar (HeartOff icon, danger style)
- Fix FavoritesView: replace Add to Favorites with Remove from Favorites
  (tracks are already in favorites, remove makes sense there)
2026-02-23 11:13:09 -06:00
vicrodh b1a7ce51c7 feat(multi-select): Phase 1 - FavoritesView track multi-select
- Add BulkActionBar component (sticky-bottom bar with queue split button,
  add to playlist, add to favorites, clear selection)
- Add selectable/selected/onToggleSelect props to TrackRow with checkbox UI
- Add .selected highlight and .track-checkbox CSS to TrackRow
- Extend VirtualizedTrackList with selectable/selectedIds/onToggleSelect props
- Wire FavoritesView tracks tab: Select toggle button in toolbar,
  selectedTrackIds state, BulkActionBar with bulk queue/favorites/playlist handlers
- Add actions.select and actions.cancelSelection i18n keys to all 4 locales
2026-02-23 11:07:30 -06:00
vicrodh 9de0c3c233 feat(backend): add bulk queue and bulk favorites commands
- v2_bulk_add_to_queue: add multiple tracks to end of queue
- v2_bulk_add_to_queue_next: add multiple tracks as play next (reversed
  to preserve selection order)
- v2_bulk_add_favorites: add multiple tracks to favorites via API then
  update local cache atomically (lock not held across await points)
- v2_add_tracks_to_playlist and v2_remove_tracks_from_playlist already
  accept Vec<u64> — no changes needed for playlist bulk actions
2026-02-23 10:55:59 -06:00
vicrodh f53af39185 feat(favorites): show album artwork in track rows, add release codename
- Favorite tracks now display album art between track number and title,
  matching the layout used in PlaylistDetailView (showArtwork=true)
- VirtualizedTrackList gains showArtwork and getArtworkUrl props
- AboutModal: add release codename 'La marrano de engorda' (1.1.15)
- README: remove stale KWin native title bar manual workaround section
2026-02-23 10:25:36 -06:00
vicrodh e843cb736f fix(svelte): remove hidden t shadow and harden checker
cx
2026-02-23 10:09:41 -06:00
vicrodh 7084c49182 docs: document manual KWin SSD rule for native Plasma title bar on KDE Wayland 2026-02-23 10:01:51 -06:00
vicrodh c473b86a2d fix: cleanup stale KWin SSD rule written by 1.1.14 on startup 2026-02-23 10:00:46 -06:00
vicrodh 9db1e5ca6b perf(cache): increase L1 to 400MB and L2 to 800MB
L1 (memory): 300MB -> 400MB (+100MB)
L2 (disk):   500MB -> 800MB (+300MB)
2026-02-23 08:55:33 -06:00
vicrodh c761ff1fd7 feat(settings): add 85% and 95% UI scale options
Add finer granularity below 100% for users who prefer slightly
smaller UI without jumping from 90% to 100%.
2026-02-23 08:55:25 -06:00
vicrodh cd1a56cde6 feat(ui): sync custom image store from detail and library views
After setting/removing custom artist images in ArtistDetailView
or LocalLibraryView, update the global store so all views
reflect the change immediately. Also fix LocalLibraryView to use
the resized thumbnail path from the backend result instead of
the original unresized file path.
2026-02-23 08:55:25 -06:00
vicrodh 40060497db feat(ui): resolve custom artist images in LabelView
Insert custom image check at top of getArtistImageUrl() before
all other fallback sources. Artists on label pages show custom
images when set.
2026-02-23 08:55:25 -06:00
vicrodh c1a67c61d5 feat(ui): resolve custom artist images in FavoritesView
Add withCustomImages() helper that overrides artist image objects
before passing to groupArtists(). All 3 call sites (alpha index,
sidepanel, virtualized grid) get custom image overrides.
2026-02-23 08:55:25 -06:00
vicrodh aac411d82f feat(ui): resolve custom artist images in HomeView
Wrap toArtistCard() image resolution with custom image store
lookup. Featured artists on home page show custom images.
2026-02-23 08:55:25 -06:00
vicrodh c4c467eecd feat(ui): resolve custom artist images in SearchView
Wrap getArtistImage() to check custom image store before
falling back to Qobuz default. All 3 call sites (most popular,
search results, virtual grid) get the override automatically.
2026-02-23 08:55:25 -06:00
vicrodh 7f17d53879 feat(app): initialize custom artist image store on login
Load all custom artist image overrides on login and clear
them on logout, alongside existing blacklist store init.
2026-02-23 08:55:25 -06:00
vicrodh 6b54db1073 feat(store): create customArtistImageStore
Centralized store for resolving custom artist image overrides
globally. Loaded on login, exposes resolveArtistImage() with
normalized name matching (handles diacritics, case differences).
2026-02-23 08:55:25 -06:00
vicrodh 7c6e07908f feat(backend): add bulk fetch for custom artist images
Add get_all_custom_artist_images() database method and
v2_library_get_all_custom_artist_images command to support
loading all custom artist image overrides at once for the
global resolution store.
2026-02-23 08:55:25 -06:00
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 01d57ca7bb feat(backend): add remove and get custom artist image commands 2026-02-23 08:55:25 -06:00
vicrodh 98d719d833 feat(backend): resize and thumbnail custom artist images 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 6d38e8f6a1 docs: rewrite README to reflect current feature set and architecture
Major updates:
- Replace outdated 1.1.8 highlights with comprehensive feature list
- Add all 4 audio backends, loudness normalization, cache sizes
- Document immersive player with 14 visualization panels
- Add 26 themes, auto-theme, native KDE title bar
- Document multi-crate architecture and all 9 crates
- Add system dependencies per distro (Debian, Fedora, Arch)
- Update project structure to reflect current codebase
- Add 4-language i18n, custom artist images, recommendations
- Update tech stack table with all major dependencies
- Remove stale "Coming soon" screenshots placeholder
2026-02-23 05:30:11 -06:00
vicrodh e9c4b4ce0d perf(cache): increase L1 to 400MB and L2 to 800MB
L1 (memory): 300MB -> 400MB (+100MB)
L2 (disk):   500MB -> 800MB (+300MB)
2026-02-23 05:24:33 -06:00
vicrodh fd2457c9ff Merge branch 'feature/image-lightbox' into pre-release 2026-02-23 05:21:38 -06:00
vicrodh 9b4f0dd353 chore(window): suppress dead_code warning on remove_kwin_window_rule
Will be called when v2_set_use_system_titlebar toggles off.
2026-02-23 05:01:41 -06:00
vicrodh abb4f1de50 fix(window): use KWin window rules instead of scripting for native SSD
KWin scripting noBorder=false cannot override the xdg-decoration
protocol on Wayland. Window rules (kwinrulesrc) operate at a deeper
level and should force SSD before protocol negotiation. Uses
kwriteconfig6 to add/remove rules and qdbus6 to trigger reconfigure.
2026-02-23 04:57:58 -06:00
vicrodh 3072a135ef chore(window): remove diagnostic print() from KWin SSD script
Now that the script is confirmed working (noBorder=false set on QBZ
window, resourceClass=qbz), remove the chatty per-window log lines
that would spam journalctl on every app launch.
2026-02-23 04:54:20 -06:00
vicrodh ce8a899244 fix(window): use Script.run() instead of Scripting.start() for KWin SSD
The KWin D-Bus scripting API requires calling run() on the specific
script object (/Scripting/Script{id}) returned by loadScript(), not
start() on the /Scripting root. Also unloads previous script instance
before reloading, and adds 500ms delay to ensure window is mapped.
2026-02-23 04:52:30 -06:00
vicrodh 0c0eb48adc fix(window): match full app_id in KWin SSD script
The KWin script checked for resourceClass === "qbz" but on Wayland,
KWin sets resourceClass from the xdg-toplevel app_id, which is the
full GTK application ID: "com.blitzfc.qbz" (from tauri.conf.json
identifier). Now matches all three possible values: com.blitzfc.qbz,
qbz, qbz-nix. Added diagnostic print() for journalctl debugging.
2026-02-23 04:40:11 -06:00
vicrodh 55b4a5af13 fix(window): use KWin scripting for native SSD on KDE Plasma Wayland
GTK3 hardcodes CLIENT_SIDE in the xdg-decoration Wayland protocol,
so GTK_CSD=0 alone doesn't work — KWin still sees CSD preference
and won't draw server-side decorations.

New approach for KDE Plasma + Wayland + system title bar:
1. Create window with decorations=false (no GTK CSD)
2. Load a KWin script via D-Bus that forces noBorder=false for QBZ
3. KWin draws its own native Breeze SSD title bar

This gives QBZ a title bar identical to Dolphin, Konsole, etc.
On non-KDE DEs, the old decorations(true) path is used unchanged.

Reverts the ineffective GTK_CSD=0 approach from previous commit.
2026-02-23 04:32:44 -06:00
vicrodh 5d87042044 fix(window): use server-side decorations on Wayland when system title bar is enabled
Previously GTK_CSD=1 was set unconditionally on Wayland, forcing GTK to
draw its own client-side title bar (Breeze-GTK). On KDE Plasma this
looks wrong because native apps use KWin's server-side decorations
(Breeze-KDE).

Now reads the use_system_titlebar setting before GTK init:
- system title bar ON: GTK_CSD=0 (WM draws native decorations)
- system title bar OFF: GTK_CSD=1 (doesn't matter, decorations=false)

This makes QBZ's title bar match Dolphin, Konsole, etc. on KDE Plasma,
and Nautilus, etc. on GNOME — the window manager draws the decorations
in its own native style.
2026-02-23 04:15:55 -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 74d8d2d3cf fix(auto-theme): async spawn_blocking for image processing, KDE color scheme fallback
- V2 commands (generate_theme_from_image, generate_theme_from_wallpaper,
  extract_palette) now use tokio::task::spawn_blocking to avoid freezing
  the main thread during CPU-bound image decoding and k-means clustering.
  This lets the UI spinner animate properly.

- KDE accent detection now falls back to Colors:Selection DecorationFocus
  and BackgroundNormal from kdeglobals when no explicit AccentColor is set.
  This reads the actual KDE color scheme accent instead of only looking
  for the Plasma 6 custom accent field.

cc
2026-02-23 03:42: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 2e95c6c98a feat(auto-theme): add V2 commands for theme generation and system detection
Six new commands:
- v2_detect_desktop_environment: detect current DE
- v2_get_system_wallpaper: get wallpaper path
- v2_get_system_accent_color: get DE accent color
- v2_generate_theme_from_image: generate theme from any image
- v2_generate_theme_from_wallpaper: generate theme from system wallpaper
- v2_extract_palette: extract color palette for preview

All are pure functions (no State needed), registered in invoke_handler.

cc
2026-02-23 03:19:28 -06:00
vicrodh 1c46fde82c feat(auto-theme): add palette extraction, theme generation, and DE detection
Rust module auto_theme/ with:
- K-means clustering (k=6) on downsampled images for palette extraction
- CSS variable generator producing all ~40 required theme tokens
- WCAG AA contrast enforcement for text and accent colors
- Desktop environment detection (GNOME, KDE Plasma, COSMIC, XFCE, Cinnamon)
- Wallpaper path retrieval per DE (gsettings, Plasma config, COSMIC config)
- System accent color retrieval (GNOME 47+, KDE, COSMIC)

cc
2026-02-23 03:18:00 -06:00
vicrodh fc5d88795d feat(settings): add 85% and 95% UI scale options
Add finer granularity below 100% for users who prefer slightly
smaller UI without jumping from 90% to 100%.
2026-02-23 02:48:38 -06:00
vicrodh 589e57249e feat(ui): sync custom image store from detail and library views
After setting/removing custom artist images in ArtistDetailView
or LocalLibraryView, update the global store so all views
reflect the change immediately. Also fix LocalLibraryView to use
the resized thumbnail path from the backend result instead of
the original unresized file path.
2026-02-23 02:46:27 -06:00
vicrodh a74ecee1ab feat(ui): resolve custom artist images in LabelView
Insert custom image check at top of getArtistImageUrl() before
all other fallback sources. Artists on label pages show custom
images when set.
2026-02-23 02:45:15 -06:00
vicrodh fac6b89b83 feat(ui): resolve custom artist images in FavoritesView
Add withCustomImages() helper that overrides artist image objects
before passing to groupArtists(). All 3 call sites (alpha index,
sidepanel, virtualized grid) get custom image overrides.
2026-02-23 02:44:55 -06:00
vicrodh 1ec7341c1d feat(ui): resolve custom artist images in HomeView
Wrap toArtistCard() image resolution with custom image store
lookup. Featured artists on home page show custom images.
2026-02-23 02:44:29 -06:00
vicrodh 75b46a2077 feat(ui): resolve custom artist images in SearchView
Wrap getArtistImage() to check custom image store before
falling back to Qobuz default. All 3 call sites (most popular,
search results, virtual grid) get the override automatically.
2026-02-23 02:44:16 -06:00
vicrodh fce342a3e9 feat(app): initialize custom artist image store on login
Load all custom artist image overrides on login and clear
them on logout, alongside existing blacklist store init.
2026-02-23 02:43:24 -06:00
vicrodh 076c2482dc feat(store): create customArtistImageStore
Centralized store for resolving custom artist image overrides
globally. Loaded on login, exposes resolveArtistImage() with
normalized name matching (handles diacritics, case differences).
2026-02-23 02:42:34 -06:00
vicrodh 26d8fb502c feat(backend): add bulk fetch for custom artist images
Add get_all_custom_artist_images() database method and
v2_library_get_all_custom_artist_images command to support
loading all custom artist image overrides at once for the
global resolution store.
2026-02-23 02:42:03 -06:00
vicrodh 7f0e28cf6d feat(ui): right-click context menu to change artist image 2026-02-23 02:25:47 -06:00
vicrodh 378003f14b fix(ui): remove round mask from lightbox, show image at natural shape 2026-02-23 02:22:23 -06:00
vicrodh c6f05346d7 feat(backend): add remove and get custom artist image commands 2026-02-23 02:21:42 -06:00
vicrodh 6b8955e2d3 feat(backend): resize and thumbnail custom artist images 2026-02-23 02:19:08 -06:00
vicrodh 118656ee18 feat(ui): click album artwork to view full size 2026-02-23 02:17:42 -06:00
vicrodh b8f8ca4e3d feat(ui): click artist image to view full size 2026-02-23 02:16:45 -06:00
vicrodh a5da6e4755 feat(ui): add ImageLightbox component 2026-02-23 02:15:35 -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 3d2a4cbe97 fix(deep-link): robust qobuzapp:// handler across all packages
- Auto-detect installed .desktop filename (com.blitzfc.qbz.desktop,
  qbz.desktop, qbz-nix.desktop) instead of hardcoding
- Run update-desktop-database after register/deregister so xdg-open
  and browsers pick up the MIME association immediately
- Fix v2_check_qobuzapp_handler to match all known desktop filenames
- Align StartupWMClass to com.blitzfc.qbz across all packaging formats
- Add StartupNotify=true to Arch/AUR/Snap desktop files

Fixes browser URI handler not working for .deb users (Discussion #44)
2026-02-23 00:38:10 -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 0dea116c69 fix(audio): move reload_settings from per-play to once at bootstrap
reload_settings() was running before every v2_play_track call, which
is excessive and can overwrite correct in-memory audio settings with
stale DB values (especially in Flatpak where DB sync timing differs).

Moved to runtime_bootstrap Step 6, after session activation when
per-user stores are ready. v2_reinit_audio_device still reloads on
explicit device changes.
2026-02-22 19:48:32 -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