Commit Graph
45 Commits
Author SHA1 Message Date
vicrodh a2eabf08f1 fix: freeze equalizer animation when player is paused
Separate isActiveTrack (current track) from isPlaying (actively playing)
so the equalizer bars freeze via animation-play-state when paused instead
of always animating. Show Play icon on hover when paused, Pause when playing.
Also fix AlbumDetailView which was missing the isPlaybackActive check.
2026-03-08 13:24:12 -06:00
vicrodh 5b9f5a75c2 feat(ui): add explicit content badge across entire app
Display parental_warning badge (E icon) next to track titles in all
views: TrackRow, QueuePanel, NowPlayingBar, ImmersivePlayer with all
13 visualizer panels, MiniPlayer surfaces, and AlbumDetailView.

Propagate parental_warning field through the full data chain from
Rust backend (qbz-models, queue, commands_v2, session_store, API
server) to frontend stores, adapters, and UI components. Badge uses
CSS mask technique with explicit.svg for theme compatibility.
2026-03-06 08:48:51 -06:00
vicrodh 955f5edd05 fix(svelte): resolve all remaining a11y and real warnings
Key discovery: Svelte 5 requires commas between svelte-ignore codes,
not spaces. Fixed separator in all multi-code ignore comments.

Additional fixes across 36 files:
- TrackMenu/AlbumMenu: add role="menu" and ignore comments to menus
- LocalLibraryTagEditorModal: link labels to inputs with for/id
- TrackReplacementModal/DACSetupWizard: fix dialog a11y
- BookletViewer: fix reactivity ($state for bookletLoaded)
- StackIcon/SearchPlaylistCard/QobuzPlaylistCard/FavoritePlaylistCard:
  fix state_referenced_locally with $derived()
- CoverflowPanel/HomeSettingsModal/FavoritesEditModal: fix reactivity
- ImmersiveHeader/FolderEditModal: replace deprecated svelte:component
- Toggle: add aria-label prop
- Various modals: add tabindex="-1" and role to dialogs
- Dropdown/DeviceDropdown: add proper listbox roles

Build output: 0 Svelte warnings (down from ~200)
2026-03-04 20:20:40 -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 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 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 36a708d501 feat(ui): add artwork column in playlist tracks
cx
2026-02-16 23:02:45 -06:00
vicrodh fb3204f2e4 merge(pre-release): sync latest integration branch into plex feature
cx
2026-02-09 02:25:37 -06:00
vicrodh bf99a19eb3 fix(plex): hydrate track quality and show plex source indicator
cx
2026-02-09 01:47:24 -06:00
vicrodh 7631ed3e20 fix(ui): remove hover background flicker on download button
Hide the square button background on hover when downloading (the
ring needs no bg). Also hide the download indicator completely when
idle (opacity 0 + pointer-events none) instead of showing a faint
ghost that triggers hover artifacts across all track row buttons.
2026-02-08 11:18:50 -06:00
vicrodh 6ff6269f74 feat(blacklist): add grayout styling for blacklisted artist tracks
- TrackRow: Add isBlacklisted prop with grayout styling and ban icon
- VirtualizedTrackList: Check blacklist status for each track
- PlaylistDetailView: Gray out and restrict actions for blacklisted tracks
- AlbumDetailView: Apply album-level blacklist check to all tracks
- HomeView: Gray out blacklisted tracks in Continue Listening section
- ArtistDetailView: Banner shown when viewing blacklisted artist page

Blacklisted tracks show reduced opacity, ban icon instead of track
number, and restricted menu actions (navigation only, no playback).
2026-02-02 14:17:01 -06:00
vicrodh 90f24ff122 fix: pass onFindReplacement to TrackMenu from TrackRow
Added missing onFindReplacement to TrackMenuActions interface and
pass it through to TrackMenu component.
2026-01-31 17:02:04 -06:00
vicrodh faefc68381 fix: maintain column alignment for unavailable tracks
Add placeholders for favorite and download columns when hidden to
prevent column misalignment in unavailable tracks.
2026-01-31 16:36:46 -06:00
vicrodh d46a08465c feat: unavailable track handling with icon in track number column
- Add isUnavailable prop to TrackRow to show AlertCircle instead of track number
- Show unavailable icon only for user's own playlists (not Qobuz official playlists)
- Gray out unavailable tracks in both owned and non-owned playlists
- Remove all interactions for unavailable tracks in non-owned playlists
- Keep only "remove from playlist" option for unavailable tracks in owned playlists
- Create unavailableTracksStore for persisting unavailable track IDs to localStorage
- Load unavailable tracks on app startup in bootstrap.ts
- Auto-mark tracks as unavailable when playback fails with TrackUnavailable error
2026-01-31 16:20:23 -06:00
vicrodh defd2f0fe1 fix(favorites): ensure favorites sync with Qobuz API and show loading state
Issues fixed:
- playbackService was bypassing the favorites store, causing UI desync
- Album favorites weren't loaded on login (only track favorites were)
- No visual feedback while favorite API call was in progress

Changes:
- Add toggling state tracking to favoritesStore and albumFavoritesStore
- Add isTrackToggling() and isAlbumToggling() exports
- Prevent double-toggle while API call is in progress
- Update TrackRow and AlbumCard to show pulse animation while toggling
- Update playbackService to use store's toggle (centralized API calls)
- Load both track and album favorites on login
2026-01-29 19:24:13 -06:00
vicrodh e025882a9f fix(favorites): add type=button to favorite toggle and remove debug logs 2026-01-28 01:56:23 -06:00
vicrodh efb305fe09 debug(favorites): add logging to track favorite toggle issue
Also adds type="button" to favorite button for consistency with other buttons.
2026-01-27 19:44:59 -06:00
vicrodh 6601a3a5e6 feat(track-info): integrate TrackInfoModal with views
Phase 3 - Integration:
- Add onTrackShowInfo prop to TrackRow, AlbumDetailView,
  PlaylistDetailView, SearchView
- Add TrackInfoModal to +page.svelte with state management
- Pass showTrackInfo callback from main page to all views

cc
2026-01-25 02:28:52 -06:00
vicrodh 139658065f fix(TrackRow): make download indicator subtly visible like favorite button 2026-01-24 12:42:18 -06:00
vicrodh 97c18ad920 fix(tracks): center-align duration and quality columns 2026-01-24 12:41:01 -06:00
vicrodh 84a2164079 refactor(stores): rename store to offlineCacheState
- Create offlineCacheState.ts with compliant terminology
- Update all component imports and type references
- Add compatibility aliases for gradual migration
- Remove deprecated downloadState.ts

cc
2026-01-23 11:57:53 -06:00
vicrodh 73cc935d99 fix: remove open-folder action from download menus
cx
2026-01-22 11:14:51 -06:00
vicrodh 378ba36443 Fix Download menu not showing in TrackRow-based views
- Added onDownload, isTrackDownloaded, onOpenFolder, onReDownload to TrackMenuActions interface
- Pass download props from menuActions to TrackMenu in TrackRow
- Removed debug logging
- Fixes Download menu missing in HomeView, AlbumDetailView, and FavoritesView
2026-01-19 21:46:14 -06:00
vicrodh 318e3d795a feat(context): scroll to active track on context navigation
cx
2026-01-19 11:19:52 -06:00
vicrodh c6f86a9bcc feat(ui): pause from track row playing icon
cx
2026-01-18 05:46:43 -06:00
vicrodh 515632913d feat(ui): add context menu actions for playback context
- Add 'Play track only' option (clears context, single track)
- Add 'Play from here' option (sets context from current position)
- Update TrackMenu component with new actions
- Update TrackRow to pass new menu actions
- Backend integration ready for Phase 3 (settings + wiring)

cp
2026-01-18 00:41:17 -06:00
vicrodh 5f4cfa5888 feat(playlists): include local tracks in counts everywhere
- Add playlist_get_all_local_track_counts command to get local track
  counts for all playlists efficiently
- PlaylistDetailView: show combined track count and duration in header,
  style local count with muted color, remove redundant count below
- Sidebar: load and display local track counts in tooltips
- PlaylistModal: show combined counts when selecting playlist to add to
- PlaylistManagerView: show combined counts in both grid and list views
- TrackRow: move local indicator to download column position, add
  placeholder for favorite column to maintain alignment, update tooltip
- Remove local tracks notice banner (info now in tooltip)

cc
2026-01-16 06:32:13 -06:00
vicrodh d731805eca refactor(playlists): unify track row appearance and add remove option
- Move local track indicator from quality column to favorite button position
  for consistent row alignment with Qobuz tracks
- Remove explicit delete button from playlist track rows (was easy to
  accidentally click)
- Add "Remove from playlist" option to TrackMenu for all tracks (local and
  Qobuz)
- Qobuz track removal uses playlist_track_id from API response
- Clean up unused CSS and imports from PlaylistDetailView

cc
2026-01-16 06:18:32 -06:00
vicrodh 3915abd3bb fix(playlists): add local tracks to playlists correctly
- PlaylistModal now uses playlist_add_local_track command for local tracks
  instead of the Qobuz-only add_tracks_to_playlist command
- Added isLocalTracks prop to PlaylistModal and wired it through uiStore
- Updated LocalLibraryView to pass isLocal=true when adding tracks to playlists
- Added HardDrive icon indicator next to quality badge for local tracks in TrackRow

cc
2026-01-16 06:03:09 -06:00
vicrodh 437027790e fix(ui): improve Light theme contrast for quality badges and play buttons
- Quality badge in AlbumCard: inverted colors for better visibility
- Quality badge in NowPlayingBar: added Light theme specific styles
- Play button in TrackRow: changed color for better contrast
- Fixed Recently Played section badge height to prevent border clipping

cp
2026-01-15 12:15:27 -06:00
vicrodh 86c237ab02 feat(ui): make track artist and album clickable 2026-01-14 00:04:25 -06:00
vicrodh 73d2bd114a feat(ui): show now-playing indicator in album and playlist rows 2026-01-12 15:56:08 -06:00
vicrodh 60fcc7253d fix: playlist track quality column alignment and CD Quality fallback
- TrackRow: Always render quality column to maintain consistent layout
- PlaylistDetailView: Show exact quality (24bit/96kHz) when available
- PlaylistDetailView: Fall back to 'Hi-Res' or 'CD Quality' label
- Prevents column shift when quality data is missing
2026-01-11 19:45:42 -06:00
vicrodh f9cf4f06cd feat(ui): queue panel improvements and playlist album column
Queue Panel:
- Fix scroll by constraining panel between TitleBar and NowPlayingBar
- Add search bar to filter entire queue (not just first 20)
- Reduce font sizes by 1px for compact layout
- Reduce item height from 48px to 40px

TrackRow:
- Add album prop to display album column

PlaylistDetailView:
- Pass album data to TrackRow for album column display
2026-01-11 18:51:38 -06:00
vicrodh 29ded155d1 feat(ui): add compact mode to TrackRow for Continue Listening
- Add compact prop to TrackRow: smaller height (44px), artist as column
- Apply compact mode to Continue Listening section in Home
- Reduces vertical space and improves scannability
2026-01-11 02:21:26 -06:00
vicrodh 1b90a45212 refactor(favorites): centralize track favorites in favoritesStore
- Create favoritesStore.ts for centralized favorites state management
- Refactor TrackRow to be self-sufficient with internal favorites handling
- TrackRow now subscribes to store and toggles favorites internally
- Remove redundant favoriteTrackIds state from AlbumDetailView and PlaylistDetailView
- Remove manual onAddFavorite prop drilling from all views
- Add trackId prop to TrackRow for store lookup (optional for local tracks)
- Add hideFavorite prop for local tracks that don't have Qobuz IDs
- Load favorites once on app init in +page.svelte
2026-01-11 02:08:14 -06:00
vicrodh c529a28c6e fix(ux): favorite button click + home loading overlay
TrackRow:
- Convert favorite indicator div to interactive button
- Add stopPropagation to prevent row click (play) when clicking favorite
- Add hover state and proper button styling

HomeView:
- Add loading overlay that waits for at least 2 sections to load
- Overlay fades out smoothly when content is ready
- Prevents jarring "sections appearing and reordering" effect
2026-01-11 01:55:09 -06:00
vicrodh 93a6e9545a feat: hide download button for local library tracks 2026-01-10 03:50:29 -06:00
vicrodh 7149cf5c4b feat: add download UI for offline listening
- DownloadButton component with status indicators
- TrackRow now shows download button on hover
- downloadState store for managing download states
- Tauri event listeners for download progress
- Integration with AlbumDetailView
2026-01-09 19:42:35 -06:00
vicrodh 1ccb78ef52 fix: multiple UI and integration fixes
1. Credential storage fallback - when keyring (KWallet) unavailable,
   falls back to obfuscated file in config directory

2. Heart icon always visible - shows outlined when not favorite,
   filled when favorite, with hover states

3. Player favorite state - checks favorite status when track plays
   and updates the heart icon in NowPlayingBar

4. Song.link ISRC lookup - uses Spotify/Deezer search URLs with ISRC
   since Qobuz isn't directly supported by Odesli
2026-01-09 19:00:12 -06:00
vicrodh 334f05b870 Add favorite heart indicator to tracks in track lists
- Add isFavorite prop to TrackRow component
- Show filled heart icon for favorited tracks
- Fetch favorite tracks on mount in AlbumDetailView
- Fetch favorite tracks on mount in PlaylistDetailView
- Always show heart in FavoritesView tracks (already favorited)
2026-01-09 17:59:28 -06:00
vicrodh e9151b6c55 feat(tracks): add share and queue actions menu 2026-01-09 17:15:55 -06:00
vicrodh ffadf70c8b fix: track list layout and HomeView content rendering
- Add explicit flex-direction: row and width: 100% to TrackRow
- Add missing .track-list and .tracks container styles in AlbumDetailView
- Add gap: 16px to table header to match TrackRow alignment
- Add box-sizing: border-box for consistent sizing
2026-01-09 15:11:07 -06:00
vicrodh cdc06d8759 fix: multiple UX improvements and bug fixes
Playlist & Favorites:
- Fix playlist loading error (missing field `id` in JSON parsing)
- Add serde defaults for Track and PlaylistOwner optional fields
- Fix track favorites toggle to actually call backend API
- Add "Add to playlist" button on track rows in album view

Sidebar UI improvements:
- Increase sidebar width to 280px
- Reduce text size and margins throughout
- Normalize all icons to 14px (matching + and refresh buttons)
- Add text overflow with ellipsis and tooltip for playlist names

User card:
- Make user card more compact (smaller avatar, fonts, icons)
- Add collapsible toggle - when collapsed shows mini QBZ logo + username

Queue & Playback:
- Fix next_track spam when queue has only one song (queueEnded flag)

Other fixes:
- Fix TrackRow prop types (remove invalid hires, bitDepth, samplingRate props)
- Fix FavoritesView and PlaylistDetailView component prop types
- Add diagnostic logging to credential persistence
2026-01-09 14:55:53 -06:00
vicrodh cdfd3263de feat: Convert Figma React UI to Svelte 5
- Add lucide-svelte for icons
- Create app.css with theme CSS variables (Dark, Light, OLED, Warm)
- Convert all React components to Svelte 5 using runes ($state, $derived, $effect, $props)
- Implement core components: Sidebar, NowPlayingBar, NavigationItem, UserCard,
  AlbumCard, HorizontalScrollRow, HeroSection, TrackRow, Toggle, Dropdown,
  Tooltip, VolumeSlider
- Implement view components: HomeView, SettingsView, AlbumDetailView
- Implement overlay components: QueuePanel, FullScreenNowPlaying, FocusMode, Toast
- Create main +page.svelte with routing, state management and keyboard shortcuts
- All components use Svelte 5 snippets for component children patterns
2026-01-09 07:16:46 -06:00