- Create playlistFoldersStore.ts with full CRUD operations
- Add session-only expand/collapse state (not persisted per spec)
- Add folder_id to PlaylistSettings interface in all components:
- Sidebar.svelte
- PlaylistManagerView.svelte
- PlaylistDetailView.svelte
- Replace dropdown with checkbox-based filter panel
- Quality section: Hi-Res, CD Quality, Lossy (OR within section)
- Format section: FLAC, WAV, MP3, AAC, Other (OR within section)
- AND logic between Quality and Format sections
- Add filter count badge on button
- Add "Clear all" button to reset filters
- Improved layout with 2-column grid for formats
- Add filter dropdown with quality tiers: Hi-Res (24bit+), CD Quality (16bit), Lossy
- Add format-specific filters: FLAC, WAV, MP3, AAC, Other
- Filter integrates with existing search functionality
- Active filter highlighted with accent color
- Dropdown has section headers and divider for better organization
- Reduced column-gap from 18px to 14px in album grid
- Updated GRID_GAP constant in VirtualizedAlbumList for correct column count
- Updated CSS gap in album-grid-row to match
- Add track list header row with columns: #, Title, Duration, Quality
- Include spacers for local indicator and menu columns
- Add margin-top to album-actions for better visual spacing
- Add align-items: center to album-actions for button alignment
- Add onPlaylistsChanged callback to PlaylistManagerView
- Call it on: toggleHidden, toggleFavorite, reorder, edit, delete
- Connect callback to refresh sidebar playlists, settings, and local counts
- Also update PlaylistDetailView callbacks to refresh settings
Refresh button now calls refreshPlaylists() which loads both playlists
and their settings (including hidden flag). Previously only reloaded
playlists, so hidden status changes weren't reflected.
Reduced card width from 180px to 160px so artwork (140px) fills
content area exactly. Now all margins (top/right/bottom/left) are
equal at 10px padding.
- Only render header div when drag handle is present (fixes top margin)
- Set fixed 2-line height (34px) for playlist names
- Ensures track count row is always at same vertical position
- Track count and action buttons now on same line
- Reduced icon sizes to 12px and font to 11px to handle >999 tracks
- Reduced button padding for compact layout
- Meta on left, buttons on right with space-between
- Remove fixed header height, only show margin when drag handle present
- Constrain info and footer to 160px width (same as artwork)
- Center info and footer to align with artwork
- Add toggleFavorite function for playlist favorites
- Grid view: Move action buttons to footer for even margins
- Grid view: Remove favorite badge and hidden badge from artwork
- List view: Add favorite toggle to left of visibility button
- Remove unused CSS for hidden-badge, favorite-badge, favorite-indicator
Add visibility toggle in both grid and list views, next to edit button.
- Eye icon when visible (same tone as edit button)
- EyeOff icon when hidden (dimmed to indicate inactive)
Allows quick sidebar visibility toggle without opening edit modal.
Odesli/Songlink only works with tracks and albums (using ISRC/UPC identifiers).
Playlists are user-generated collections without universal identifiers,
so cross-platform matching is not possible. Keep only Qobuz share link.
- Add UPC field to Album models (Rust and TypeScript)
- Enhance share_album_songlink command to use iTunes lookup:
- First tries UPC lookup via iTunes API
- Falls back to Odesli API with UPC
- Then tries album title/artist search on iTunes
- Generates direct album.link/i/{id} URLs like tracks do
- Update frontend to use the backend command instead of
generating non-functional URL-based links
This mirrors the track sharing approach that uses ISRC/iTunes
lookup to generate working song.link URLs.
Odesli provides different domains for different content types:
- song.link for individual tracks
- album.link for albums
Updated album share functions and menu label accordingly.
Apply same anti-aliasing technique to .action-btn-circle classes
used in AlbumView and ArtistView headers. Replace border with
inset box-shadow for smoother circular edges.
Replace CSS border with inset box-shadow on overlay buttons and menu
trigger to reduce jagged edges caused by thin borders over blurred
album artwork backgrounds.
- AlbumCard overlay buttons: revert to hardcoded white rgba values
(overlay sits on album artwork, blur makes white always visible)
- AlbumMenu icon: use currentColor to inherit from CSS
(allows AlbumDetailView to override for theme-aware color)
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
Header buttons:
- Play button: circular 44px with accent background (primary action)
- Shuffle button: circular 36px with outline (secondary)
- Favorite button: circular 36px with outline, highlight when active
Release date:
- Added releaseDate field to AlbumDetail type
- Adapter now includes full release_date_original from Qobuz API
- Display formatted date (e.g., "January 15, 2024") with year fallback
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
- Scrollbar always visible (subtle), overlay mode in both states
- margin-right: 1px for slight visual separation
- Collapsed icons: padding-left 1px to compensate and stay aligned
- Toggle button: 20px diameter (was 22px)