- Removed padding-left: 20px from main-content
- Toggle button and jump-nav don't collide (different vertical positions)
- Updated all view nav bars with corrected margin/width calculations
- Nav bars now truly flush with sidebar edge
- ArtistDetailView: jump-nav now flush with sidebar (margin -44px left)
- FavoritesView: favorites-nav flush with sidebar
- LocalLibraryView: jump-nav flush with sidebar
- SettingsView: settings-nav flush with sidebar
- All navs compensate for both main-content and view padding
- Radio animation: faster floating messages (1.2s), infinite loop
- Move action buttons below Similar Artists section
- Remove images from Similar Artists (text-only with bullet separators)
- Remove solid background from biography
- Add thin font weight (300) to bio area
- Update Similar Artists to uppercase title with letter-spacing
- Fix jump-nav to span 100% of content width with proper margins
- Make Popular Tracks section header consistent with other sections
- Add track count badge to Popular Tracks
- Remove unused section-header-row CSS
Apply section-header-left wrapper to all remaining album sections
for consistent structure (EPs & Singles, Live Albums, Compilations,
Tributes & Covers, Others, Playlists).
- Move album sort dropdown from jump-nav to Discography section header
- Align sort dropdown to right of section title
- Revert similar artists styling to original
- Sort now only applies to album sections below it
Add sort dropdown in artist detail view jump navigation with options:
- Default (API order)
- Newest First (by release year)
- Oldest First (by release year)
- Title (A-Z / Z-A)
Sorting applies to all album sections: albums, EPs/singles, live albums,
compilations, tributes, and others.
Restructure artist header layout:
- Move favorite and radio buttons below the artist photo
- Remove album count line from header
- Artist name now left-aligned in its own row
- Create artist-image-column for photo + actions grouping
Change artist info section to align content to top of the image
instead of vertically centering. This positions the artist name
closer to the photo. Also move margin from h1 to the row container
to fix alignment between name and action buttons.
Add album_id and artist_id fields to QueueTrack struct so that
radio tracks have proper navigation metadata. This enables
clicking artist/album in the main player to navigate correctly
when playing tracks from artist or track radio.
Changes:
- Add album_id/artist_id to Rust QueueTrack struct
- Update track_to_queue_track to extract IDs from Qobuz Track
- Add fields to frontend BackendQueueTrack interface
- Pass IDs in ArtistDetailView radio playback
- Pass IDs in playQueueTrack to playTrack service
- Use playQueueIndex(0) instead of reading from queue store to get full track data
- Fixes missing artwork, duration, and seekbar for first track
- Add animated pill button with loading messages during radio creation
- Add glowing blue effect on radio icon after successful creation
- Loading messages: preparing, fetching artists, experimental notice
- Fix radio playback initiation using onTrackPlay callback
- Fix sampling rate display for Qobuz tracks (already in kHz)
- Disable session restore to prevent local/Qobuz ID conflicts
- Replace Lucide Pause icon with solid SVG pause icon
- Pause button only shows when hovering over currently playing track
- Playing indicator (animated bars) shows when track is playing
- Play button shows for all non-playing tracks on hover
- Fixes issue where pause appeared on all tracks on hover
Multiple critical fixes for context tracking:
1. Add 'local_library' to backend context type parser
- Was rejecting 'local_library' causing "Invalid context type" error
- Now properly recognized in set_playback_context command
2. Fix shuffle to not always start with first track
- Removed logic that moved current track to front of shuffle
- Now finds current track position in shuffled order instead
- Shuffle is truly random, not biased to original order
3. Add missing await to all setPlaybackContext calls
- PlaylistDetailView: await context creation
- FavoritesView: make setFavoritesContext async + await calls
- ArtistDetailView: await context creation
- HomeView: await context creation
- SearchView: await + use home_list type (search type doesn't exist)
This fixes intermittent context tracking (race condition)
Fixes: shuffle starting with first song, Local Library context error,
intermittent playlist/favorites/artist/home/search context tracking
cc
Context creation:
- Creates 'artist_top' context when playing from Top Tracks
- Uses artist ID and name
- Passes track index from UI loop
- Stack icon will show "Playing from: Artist · {name}"
Artist view now fully integrated with context system.
cp
- Add navigation to search results with smooth scrolling
- Show result counter (X/Y) with prev/next chevron buttons
- Support keyboard navigation (Enter, Shift+Enter, Escape)
- Add searchId prop to AlbumCard for DOM targeting
- Style search toggle button without background
- Remove focus outline from search input
Page search:
- Add search button in sticky jump-nav bar
- Slide-in animation from right when opened
- Filter albums, EPs, live, compilations, tributes, others, playlists
- Show result count or "No results" message
- Press Escape to close
Bio improvements:
- Reduce truncation to 530 chars (was 800, now 2/3)
- Only show "Read more" if text actually needs truncation
Live detection - additional languages:
- German: Konzert, liveopname
- Japanese: ライブ (raibu)
- Korean: 라이브 (laibeu), 콘서트 (konseuteu)
- Dutch: liveopname
Major improvements to album categorization logic:
Detection improvements:
- Broadcasts: detect plural forms, "Radio Broadcasts", "The Beast Radio"
- Live albums: detect "Alive", city+year patterns (Seattle 1989, Tokyo 1986)
- Podcasts: detect "Report Episode X", single-track 20+ min releases
- Singles: 1-4 tracks (classic 45rpm), explicit markers in title
New Tributes section:
- Albums by different artists now go to "Tributes & Covers"
- Separates tribute/cover albums from legitimate artist content
- Keeps Others clean for compilations, B-sides, unofficial releases
Categorization priority:
1. Different artist -> Tributes
2. Broadcasts/bootlegs/podcasts -> Others
3. Compilations (greatest hits, B-sides) -> Others
4. Live albums -> Live
5. Studio albums (7+ tracks, 25+ min, deluxe) -> Discography
6. EPs/Singles (1-4 tracks, <15 min) -> EPs & Singles
- Add locale field to QobuzClient for API language preference
- Pass lang parameter to Qobuz artist detail endpoints
- Create set_api_locale command to update client locale
- Sync API locale with UI i18n settings automatically
- Render artist biography HTML tags properly using @html
- Fix syntax error in FavoritesView (missing comma)
cp
- Increase initial artist albums fetch from 500 to 1000
- Increase load more albums batch from 50 to 200
- Increase top tracks display from 5 to 20
- Prefer full biography content over summary
- Increase bio truncate threshold from 500 to 800 characters
cp
- Increase artist detail album fetch from 100 to 500
- Increase bio truncation from 300 to 500 chars
- Add Others category for greatest hits/anthologies
- Add configurable limits for Home sections
- Update HomeSettingsModal with limits grid UI
cp
Add downloadStateVersion prop to AlbumCard component to make download
status reactive in all grid views. This fixes the issue where the
download menu submenu would not appear in Home, Search, and Artist
Detail views even when albums were fully downloaded.
cp
- Force Map reactivity by re-assigning after .set()
- Add missing downloadStateVersion effect in SearchView
- Ensures download menu updates across all grid views
cp
Load download status for all albums when they are first loaded
in grid views (Home, Search, Artist Detail, Favorites) so the
'Download Album' menu shows correct state immediately.
cp
- Update SearchView, ArtistDetailView, and FavoritesView
- Add download status tracking to all views with AlbumCards
- Display Open Folder and Re-download options when album is fully downloaded
- All grid overlays now show download status consistently
cp
- Add loading="lazy" decoding="async" to images in AlbumCard, ArtistDetailView
- Convert AlbumCard hover from JS state to CSS :hover (fewer re-renders)
- Reduce IntersectionObserver thresholds from 4 to 1 in ArtistDetailView
- Reduce default audio cache from 500MB to 200MB