- Use size="large" (180px) for all AlbumCard instances
- Change album grids from CSS grid with 1fr to flexbox
- Fix LocalLibrary gap issue by using consistent spacing
- Align VirtualizedAlbumList, ArtistDetailView, SearchView,
FavoritesView, HomeView, and AlbumDetailView
Add --alpha-* CSS variables (4-95%) to app.css that adapt to theme:
- Dark themes: white-based rgba
- Light themes: black-based rgba (auto-inverts for proper contrast)
Mass-replaced 100+ instances of rgba(255,255,255,...) across 23 files
with var(--alpha-*) for consistent theming support.
This fixes borders, overlays, and UI elements being invisible or
having poor contrast in light themes.
- Extract .action-btn-circle styles to app.css for reuse
- Remove duplicate button styles from ArtistDetailView and AlbumDetailView
- Use theme-aware colors (--text-primary) instead of hardcoded white
- Icons now use currentColor for theme compatibility
The jump-nav sticky header uses negative margins to extend beyond
the container padding. The right margin was -16px (or -32px in Settings)
but the container only has 8px (or 24px) of right padding, causing
8px of horizontal overflow.
Fixed by matching the negative right margin to the actual padding:
- ArtistDetailView: -16px → -8px, width calc(100%+40px) → calc(100%+32px)
- FavoritesView: -16px → -8px, width calc(100%+40px) → calc(100%+32px)
- LocalLibraryView: -16px → -8px, width calc(100%+40px) → calc(100%+32px)
- SettingsView: -32px → -24px, width calc(100%+64px) → calc(100%+56px)
- Reorder sections: Others -> Playlists -> Tributes
- Tributes section now collapsed by default with expand/collapse caret
- Add info icon with tooltip explaining content may include covers by other artists
- Implement pagination with Load More (20 items at a time)
- Sort dropdown only visible when section is expanded
- Add margin-bottom 2px to local-library-section in sidebar
- Make dividers transparent (keep spacing, remove visible line)
- Add independent sort dropdowns to: EPs & Singles, Live Albums,
Compilations, Tributes & Covers, Others
- Each section maintains its own sort state
- Remove solid background from Discography and all sections below
- Remove Load More button from Discography (initial display sufficient)
- Change badge font-weight to 100 (Thin) in AlbumCard and QualityBadge
- Use LINE Seed JP font family for badges
- Use CSS line-clamp for exactly 3 lines (reactive to container width)
- ResizeObserver detects window/container resizes
- Auto-hide Read more/Show less if text fits in 3 lines
- Works across all screen sizes (4K to HD)
- Change margin-top to padding-top for 10px spacing (avoids collapse)
- Add animated glow expansion on Play All button hover
- Match context menu styling to TrackMenu component
- Add 10px top margin for spacing from jump-nav
- Play All button (44px) larger than context menu button (40px)
- Add backdrop to context menu for click-outside-to-close behavior
- Reduce icon size in smaller button (18px)
- Remove solid background container
- Show 5 tracks by default with progressive loading (5 → 20 → 50)
- Add "Load More" link that disappears after 50 tracks
- Replace text Play All button with circular icon button
- Add context menu (...) with: Play Next, Play Later, Shuffle, Add to Playlist
- All actions apply to full track list (up to 50)
- Remove divider line before section
- 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