- Remove suggested tracks feature (no similarity algorithm)
- Fix collage to show 3-4 covers properly in square format
- Covers now fill full height, cropped on sides as needed
- Fixed grid card layout with header row (drag handle left, edit right)
- Fixed 180px card width with 160px artwork
- Added playlist search bar for both list and grid views
- Replaced hide/show button with edit button (opens PlaylistModal)
- Clean separation of clickable content area
- Reset customArtworkPath when switching playlists (prevents wrong image)
- Fixed asset:// URL for custom playlist artwork display
- Updated ROADMAP.md with current implementation status
- Created hi-res-gray.svg: grayscale filter on original logo
- Created hi-res-blue.svg: metallic blue version matching app accent
- Created hi-res-mono.svg: simplified black/white version
- QualityBadge now uses grayscale version for cleaner look
- Add consistent scrollbar styling to all view components
- Scrollbar is visible (subtle) by default, brighter on hover
- Position scrollbar 8px from right edge
- Each view now handles its own scroll container
- Set min-height for import modal to prevent layout shift
- Fix Qobuz logo color to match text (white)
- Invert Tidal logo when active for visibility on dark background
- Reduce spacing between platform icons
- Refresh sidebar on playlist edit/delete from detail view
- Custom scrollbar: closer to edge, hidden until hover/scroll
- Upscale Qobuz image URLs to 600x600 for better quality
- Change import icon from Download to Import for clarity
- Move hidden badge to bottom-right of artwork
- Reduce playlist name font size in grid view
- Use large album art instead of thumbnail for collage quality
- Move edit button to navigation row (same level as back button)
- Replace glass effect with solid background in PlaylistModal
- New view for managing playlists with full features
- Filter by All/Visible/Hidden
- Sort by Name/Recent/Play Count/Custom
- Toggle between grid and list view
- Drag reorder when in Custom sort mode
- Display play count stats
- Toggle visibility per playlist
- Uses PlaylistCollage for artwork
- Persists preferences in localStorage
- Remove filter, sort, view toggle from sidebar (will be in manager page)
- Remove grid view and collage from sidebar
- Add Settings button for playlist manager
- Show only visible playlists in sidebar
- Add onPlaylistManagerClick prop for navigation
- Clean up unused CSS
- Replace artwork section with PlaylistCollage component
- Add play count display in header info (with BarChart2 icon)
- Increment play count when "Play All" is clicked
- Add edit button that opens PlaylistModal
- Add handleEditSuccess and handleDelete callbacks
- Add onPlaylistUpdated and onPlaylistDeleted props
- Update Sidebar to use NavigationItem in list view (icons only)
- Keep PlaylistCollage in grid view only per user request
- Add badge and class props to NavigationItem component
- Add hidden checkbox to toggle sidebar visibility in edit mode
- Add danger zone with delete button and confirmation
- Update handleUpdate to save hidden status locally
- Add handleDelete function with proper error handling
- Style danger zone with red theme for visibility
Root cause: Queue tracks were being built without quality fields (hires,
bit_depth, sample_rate) in multiple views. When auto-advancing or skipping
tracks, the playerStore would have undefined quality data, causing
QualityBadge to default to CD tier.
Fixed by:
- Adding quality fields to queue track builders in PlaylistDetailView,
FavoritesView, ArtistDetailView, and LocalLibraryView
- Replacing all 'CD Quality' fallbacks with '-' placeholder in +page.svelte
- Adding bitDepth/samplingRate fields to ArtistDetailView DisplayTrack
The GlassSurface's .glass-content wrapper wasn't set up for flex layout,
preventing the inner .content div from scrolling properly.
Added global styles for .queue-panel .glass-content:
- display: flex; flex-direction: column
- flex: 1; min-height: 0
- overflow: hidden (so child .content can scroll)
- PlaylistDetailView: Show '-' when quality data is unavailable
- handleDisplayTrackPlay: Use '-' fallback, added TODO for streaming update
- handleDisplayTrackDownload: Consistent quality fallback logic
- TrackRow: Always render quality column (previous commit)
This prevents showing potentially incorrect 'CD Quality' labels.
Quality should be updated when actual streaming info is available.
- 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
- Moved scroll from .content to .tracks container
- Added wheel event stopPropagation to prevent main content scroll
- Thin 4px scrollbar that brightens on hover
- overscroll-behavior: contain for scroll isolation
- Fixed flex layout so tracks list fills available space
Quality Badge Fix:
- Extended BackendQueueTrack with hires, bit_depth, sample_rate fields
- Updated all queue track builder functions to pass quality data
- Fixed quality badge showing CD instead of Hi-Res for playlist tracks
- Extended session persistence to save/restore quality info
Queue Drag-to-Reorder:
- Added move_track function to Rust QueueManager
- Added move_queue_track Tauri command
- Implemented HTML5 drag-and-drop in QueuePanel
- Visual feedback with drag-over indicator and dragging opacity
- Disabled drag when search filter is active
- Prevented text selection during drag operations
- Add overscroll-behavior: contain to prevent scroll chaining to main content
- Add visible fancy scrollbar (webkit) with hover effect
- Move search bar below Now Playing section for better UX
- Scroll now works independently when cursor is over queue panel
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
- Fix clicking another playlist from sidebar while on playlist view
(was not notifying listeners because view type hadn't changed)
- Use $effect to reload playlist data when playlistId prop changes
- Reduce playlist title from 48px to 24px
- Reduce album title from 26px to 24px
- Max font size is now 24px (same as home greeting)
- Add 200ms delay between API calls to avoid 429 Too Many Requests
- Reduce chunk size from 50 to 20 (Tidal API limit for filter[id])
- Improve error messages to include response body for debugging
Cherry-pick and integrate playlist import from playlist-import-impl branch:
- Add playlist_import Rust module with providers (Spotify, Apple, Tidal, Deezer)
- Add track matching algorithm (ISRC first, then fuzzy matching)
- Add PlaylistImportModal.svelte with progress log UI
- Wire up import button in Sidebar
- Add modal state management in uiStore
- Register Tauri commands for preview and execute
Original implementation by Codex, integrated manually due to branch divergence.
Changed quality-indicator to column flex layout with badges row below
the QualityBadge. Both badges now expand to fill the width equally,
matching the QualityBadge width.
Session restore:
- Add pendingSessionRestore state to playerStore
- When restored track is played, load from Qobuz first
- Seek to saved position after track loads
Audio badges:
- Always show DAC/EXC badges (very muted when off)
- Adjust margins and sizing for better alignment
- Validate device has supported output configs before using
- Fall back to default if saved device is invalid
- Reduces polling frequency to 10 seconds
UI:
- Cover art now has 2px margin vs song-card edges
- Quality badges have 2px margin on right side
Audio:
- Track consecutive sink failures to detect broken streams
- Stop playback gracefully after 3 failures
- Add AudioOutputBadges component showing DAC/Exclusive mode status
- Badges are reactive to actual player state, not just settings
- Add device tooltip on hover showing current output device
- Create audioDeviceNames helper for ALSA name to friendly name mapping
- Use pretty names in Settings dropdown while storing raw names
- Add get_audio_output_status backend command
- Store current device name in player SharedState
- Player::new() now accepts optional device name
- Uses OutputStream::try_from_device() for specific device
- AppState reads saved device from audio settings on startup
- SettingsView loads/saves audio settings to backend
- Changes take effect on app restart