Keep the onPerformerSearch infrastructure in TrackInfoModal and
AlbumCreditsModal but don't pass the prop. Performer names are
now plain text. Re-enable when MusicBrainz allows precise lookups.
Also fixes: sticky tabs in AlbumCreditsModal now work correctly.
Phase 7 quick wins (closes#17):
- Performer names in TrackInfoModal are now clickable
- Clicking a performer searches for their name in Qobuz
- SearchView auto-searches when opened with pre-filled query
- Credits/Review tabs in AlbumCreditsModal stay fixed when scrolling
- Increase modal width to 850px
- Increase album column to 260px (with larger artwork)
- Move tab switcher above track list/review content
- Reduce track row height by 2px (9px padding instead of 10px)
- Combine quality badges into single "24-Bit / 96 kHz" format
- Make scrollbar always visible and not overlay content
- Add padding to tracks list for scrollbar space
- Two columns: fixed album info (200px) + scrollable track list/review
- Remove track backgrounds, use thin divider lines between tracks
- Modal dimensions: 800px wide, reduced height by 5px
- Move tabs to bottom of album column (only show Review when available)
- Album info scroll area with overflow for long metadata
- Move album title and artist to modal header
- Remove "Credits" label since track list is always visible
- Add onTrackShowInfo to HomeView (Continue Listening tracks)
- Add onShowInfo to VirtualizedTrackList (for FavoritesView)
- Add onTrackShowInfo to FavoritesView and wire to VirtualizedTrackList
- Pass showTrackInfo to HomeView and FavoritesView in +page.svelte
- Add clickable artist name to TrackInfoModal header
- Artist link navigates to artist page and closes modal
- Use custom info SVG icon without circle outline
- All tracks collapsed by default (removed auto-expand)
- Add description field to Album model for editorial reviews
- Implement Review tab with album description content
- Tab switches between Credits (track list) and Review (description)
- Review tab disabled when no description available
- Add get_album_credits Tauri command with TrackCredits, AlbumCredits,
and AlbumInfo structs for consolidated album/track credits view
- Create AlbumCreditsModal component with two-column layout:
album info (artwork, metadata, quality badges) and collapsible
track list with performers and copyright
- Add Info button to AlbumDetailView header actions
- Integrate modal in +page.svelte with track play support
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
Phase 2 of track-info feature:
- Add performers, composer, copyright fields to Track model
- Add get_track_info command with parsed performers
- Create TrackInfoModal component to display track details and credits
- Add "Track info" option to TrackMenu context menu
cc
- Hide "Copy to My Library" button after playlist has been copied
- Persist copied playlist IDs in localStorage for subsequent visits
- Add attribution note to description: "Originally curated by X on Qobuz"
When viewing a playlist not owned by the current user, a new "Copy to
My Library" button appears between the favorite and context menu buttons.
Clicking it creates a copy of the playlist with all its tracks in the
user's library.
- Add get_current_user_id command to check playlist ownership
- Add subscribe_playlist command to copy playlist with all tracks
- Add ListPlus button in PlaylistDetailView for non-owned playlists
- Button only shows for playlists owned by others (e.g., Qobuz curated)
When creating a new playlist from a track, the sidebar was showing 0 tracks
because the Qobuz API returns the playlist with tracks_count: 0 at creation
time (eventual consistency). The tracks are added after, but the sidebar
refresh might get stale data.
- Update newPlaylist.tracks_count after adding tracks in PlaylistModal
- Have handlePlaylistCreated update the sidebar with correct count
- Handle both Qobuz and local track cases
- Show search input when 8+ folders exist
- Scrollable folder list with max-height
- Filter folders as user types
- "No folders match" message when search has no results
- Search resets when context menu closes
- Add oncontextmenu prop to NavigationItem component
- Right-click on playlist shows context menu with folder options
- "Move to folder" shows available folders
- "Move to root" appears if playlist is already in a folder
- Context menu closes on outside click
- Immediate UI update after moving playlist
- Add absorption animation when dragging playlist to folder
- Playlist fades out and folder pulses on drop
- Update local state immediately after drop
- Add info icon with tooltip about custom sort requirement for drag & drop
- Make folder cards match playlist card width/spacing in grid view
- Add compact horizontal folder layout for list view
- Smaller icon (36x36), name beside icon
- Playlist count shown only on hover
- Create FolderEditModal component with icon presets and background colors
- Reuse same styling pattern as FavoritesEditModal
- Update folder cards in PlaylistManagerView to show custom icons/backgrounds
- Support preset icons (heart, star, music, folder, disc, library)
- Support solid colors and gradients for backgrounds
- Support custom image upload
This customization only affects PlaylistManagerView, not the sidebar.
- Change folder name to use --text-muted color (same as playlists)
- Change folder font-weight to 400 (same as playlists)
- Make folder icon inherit muted color from parent
- Hide playlist count by default, show on hover only
- Add folder selector dropdown to PlaylistModal for create/edit modes
- Pass currentFolderId prop to PlaylistModal in detail and manager views
- Remove custom folder colors from Sidebar (consistent styling)
- Simplify folder creation - name only, no color picker
- Remove unused color-picker CSS from PlaylistManagerView
Phase 5 of playlist folders feature.
- Add folder imports and state management
- Filter displayPlaylists by current folder
- Add breadcrumb navigation when inside a folder
- Add collapsible folders section with folder cards
- Add folder cards with icon, name, playlist count
- Add drag & drop support for moving playlists to folders
- Add folder edit/create modal with name and color picker
- Add delete folder functionality with confirmation
- Style folders grid, cards, modal, and breadcrumb
The index was being created during schema execution, but for existing
databases the column doesn't exist until the migration runs. Now the
index is created after all migrations have completed.
- Import and integrate playlistFoldersStore
- Add folder state management and expand/collapse tracking
- Add "New Folder" option to dropdown menu
- Render folders with collapsible playlist lists
- Add folder expand/collapse with chevron indicator
- Add folder name and playlist count display
- Add Create Folder modal with name input
- Add NavigationItem indented prop for nested playlists
- Style folder items, collapsed folder buttons, and modal
- 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