diff --git a/src/lib/components/AlbumCard.svelte b/src/lib/components/AlbumCard.svelte index 152158a00..8d8627f9f 100644 --- a/src/lib/components/AlbumCard.svelte +++ b/src/lib/components/AlbumCard.svelte @@ -282,9 +282,9 @@ } [data-theme="light"] .quality-badge { - color: rgba(40, 42, 54, 0.85); - background: rgba(40, 42, 54, 0.08); - border: 1px solid rgba(40, 42, 54, 0.2); + color: #ffffff; + background: rgba(40, 42, 54, 0.85); + border: 1px solid rgba(40, 42, 54, 0.95); } .play-overlay { diff --git a/src/lib/components/QualityBadge.svelte b/src/lib/components/QualityBadge.svelte index fe30748b7..c9d47fc52 100644 --- a/src/lib/components/QualityBadge.svelte +++ b/src/lib/components/QualityBadge.svelte @@ -114,8 +114,21 @@ } [data-theme="light"] .quality-badge { - background: rgba(40, 42, 54, 0.06); - border: 1px solid rgba(40, 42, 54, 0.15); + background: rgba(40, 42, 54, 0.85); + border: 1px solid rgba(40, 42, 54, 0.95); + } + + [data-theme="light"] .tier-label, + [data-theme="light"] .quality-info { + color: #ffffff; + } + + [data-theme="light"] .badge-icon { + filter: invert(1) brightness(1.5); + } + + [data-theme="light"] .badge-icon.hires { + filter: brightness(1.2); } .badge-icon { diff --git a/src/lib/components/views/LocalLibraryView.svelte b/src/lib/components/views/LocalLibraryView.svelte index 8eaa757bb..e69de29bb 100644 --- a/src/lib/components/views/LocalLibraryView.svelte +++ b/src/lib/components/views/LocalLibraryView.svelte @@ -1,3244 +0,0 @@ - - -
- {#if selectedAlbum} - {@const albumSections = buildAlbumSections(albumTracks)} - {@const showDiscHeaders = albumSections.length > 1} - -
- - -
-
- {#if selectedAlbum.artwork_path} - {selectedAlbum.title} - {:else} -
- -
- {/if} -
-
-

{selectedAlbum.title}

- {#if onQobuzArtistClick} - - {:else} -

{selectedAlbum.artist}

- {/if} -

- {#if selectedAlbum.year}{selectedAlbum.year} • {/if} - {selectedAlbum.track_count} tracks • - {formatTotalDuration(selectedAlbum.total_duration_secs)} -

- {#if albumTracks.length > 0} - {@const firstTrack = albumTracks[0]} -
- - {firstTrack.format.toUpperCase()} - - {formatBitDepth(firstTrack.bit_depth)} - {formatSampleRate(firstTrack.sample_rate)} - {firstTrack.channels === 2 ? 'Stereo' : firstTrack.channels === 1 ? 'Mono' : `${firstTrack.channels}ch`} -
- {/if} -
- - -
-
-
- -
- {#each albumSections as section (section.disc)} - {#if showDiscHeaders} -
{section.label}
- {/if} - {#each section.tracks as track, index (track.id)} - handleLocalArtistClick(track.artist) - : undefined} - onPlay={() => handleTrackPlay(track)} - menuActions={{ - onPlayNow: () => handleTrackPlay(track), - onPlayNext: onTrackPlayNext ? () => onTrackPlayNext(track) : undefined, - onPlayLater: onTrackPlayLater ? () => onTrackPlayLater(track) : undefined, - onAddToPlaylist: onTrackAddToPlaylist ? () => onTrackAddToPlaylist(track.id) : undefined - }} - /> - {/each} - {/each} -
-
- {:else} - -
-
- -
-
-

Local Library

- {#if stats} -

- {stats.album_count} albums • {stats.track_count} tracks • - {formatTotalDuration(stats.total_duration_secs)} • - {formatFileSize(stats.total_size_bytes)} -

- {:else} -

Your local music collection

- {/if} -
-
- - -
-
- - - {#if scanning && scanProgress} -
-
-
-
-
- Scanning: {scanProgress.processed_files} / {scanProgress.total_files} files - {#if scanProgress.current_file} - {scanProgress.current_file.split('/').pop()} - {/if} - -
-
- {/if} - - - {#if showSettings} -
-
-

Library Folders

-
- - -
-
- - {#if folders.length === 0} -
-

No folders added yet. Add a folder to start building your library.

-
- {:else} -
- {#each folders as folder} -
- - {folder} -
- {/each} -
- {/if} - -
- - {#if hasDiscogsCredentials} - - {:else} -
- Configure Discogs API for automatic artwork fetching -
- {/if} -
- -
-
Danger Zone
- -
-
- {/if} - - -
- - - -
- - -
- {#if loading} -
-
-

Loading library...

-
- {:else if error} -
- -

Failed to load library

-

{error}

- -
- {:else if activeTab === 'albums'} - {#if showHiddenAlbums} - -
-
-

Hidden Albums ({hiddenAlbums.length})

- -
- {#if hiddenAlbums.length === 0} -
- -

No hidden albums

-
- {:else} -
- {#each hiddenAlbums as album (album.id)} -
-
handleAlbumClick(album)}> - {#if album.artwork_path} - {album.title} - {:else} -
- -
- {/if} -
-
handleAlbumClick(album)}> -
{album.title}
-
{album.artist}
-
- {#if album.year}{album.year}•{/if} - {album.track_count} tracks - • - {formatTotalDuration(album.total_duration_secs)} - • - {getAlbumQualityBadge(album)} -
-
- -
- {/each} -
- {/if} -
- {:else} - - {#if albums.length === 0} -
- -

No albums in library

-

Add folders and scan to build your library

-
- {:else} - {@const filteredAlbums = albumSearch.trim() - ? albums.filter(album => matchesAlbumSearch(album, albumSearch)) - : albums} - -
-
- - - {#if albumSearch} - - {/if} -
- - - - - - {filteredAlbums.length} albums -
- - {#if filteredAlbums.length === 0} -
- -

No albums match your search

-

Try a different artist or album name

-
- {:else} - {@const groupedAlbums = albumGroupingEnabled ? groupAlbums(filteredAlbums, albumGroupMode) : [{ key: '', id: 'ungrouped', albums: filteredAlbums }]} - {@const alphaGroups = albumGroupingEnabled && albumGroupMode === 'alpha' - ? new Set(groupedAlbums.map(group => group.key)) - : new Set()} - -
-
- {#each groupedAlbums as group (group.id)} -
- {#if albumGroupingEnabled} -
- {group.key} - {group.albums.length} -
- {/if} - {#if albumViewMode === 'grid'} -
- {#each group.albums as album (album.id)} - handleAlbumPlayFromGrid(album)} - onPlayNext={() => handleAlbumQueueNextFromGrid(album)} - onPlayLater={() => handleAlbumQueueLaterFromGrid(album)} - onclick={() => handleAlbumClick(album)} - /> - {/each} -
- {:else} -
- {#each group.albums as album (album.id)} -
handleAlbumClick(album)}> -
- {#if album.artwork_path} - {album.title} - {:else} -
- -
- {/if} -
-
-
{album.title}
-
- {album.artist} - {#if album.year}{album.year}{/if} - {album.track_count} tracks - {formatTotalDuration(album.total_duration_secs)} -
-
-
- - {getAlbumQualityBadge(album)} - -
-
- {/each} -
- {/if} -
- {/each} -
- - {#if albumGroupingEnabled && albumGroupMode === 'alpha'} -
- {#each alphaIndexLetters as letter} - - {/each} -
- {/if} -
- {/if} - {/if} - {/if} - {:else if activeTab === 'artists'} - {#if artists.length === 0} -
- -

No artists in library

-
- {:else} - {@const filteredArtists = artists.filter(artist => matchesArtistSearch(artist, artistSearch))} -
-
- - - {#if artistSearch} - - {/if} -
- {filteredArtists.length} artists -
- - {#if filteredArtists.length === 0} -
- -

No artists match your search

-
- {:else} -
- {#each filteredArtists as artist (artist.name)} - {@const artistImage = artistImages.get(artist.name)} -
handleLocalArtistClick(artist.name)} - onkeydown={(event) => event.key === 'Enter' && handleLocalArtistClick(artist.name)} - > -
- {#if artistImage} - {artist.name} - {:else} - - {/if} -
- {#if showSettings} - - {/if} -
{artist.name}
-
- {artist.album_count} albums • {artist.track_count} tracks -
-
- {/each} -
- {/if} - {/if} - {:else if activeTab === 'tracks'} - {#if tracks.length === 0} -
- -

No tracks in library

-
- {:else} -
-
- - - {#if trackSearch} - - {/if} -
- - - - {tracks.length} tracks -
- - {@const groupedTracks = trackGroupingEnabled ? groupTracks(tracks, trackGroupMode) : [{ id: 'ungrouped', title: '', subtitle: '', tracks, key: '' }]} - {@const trackIndexTargets = trackGroupingEnabled && trackGroupMode === 'artist' - ? (() => { - const map = new Map(); - for (const group of groupedTracks) { - const letter = alphaGroupKey(group.title); - if (!map.has(letter)) { - map.set(letter, group.id); - } - } - return map; - })() - : new Map()} - {@const trackAlphaGroups = trackGroupingEnabled && trackGroupMode === 'name' - ? new Set(groupedTracks.map(group => group.key)) - : trackGroupingEnabled && trackGroupMode === 'artist' - ? new Set(trackIndexTargets.keys()) - : new Set()} - -
-
- {#each groupedTracks as group (group.id)} -
- {#if trackGroupingEnabled} -
-
{group.title}
- {#if group.subtitle} -
{group.subtitle}
- {/if} -
{group.tracks.length} tracks
-
- {/if} - -
- {#if trackGroupingEnabled && trackGroupMode === 'album'} - {@const trackSections = buildAlbumSections(group.tracks)} - {@const showTrackDiscHeaders = trackSections.length > 1} - {#each trackSections as section (section.disc)} - {#if showTrackDiscHeaders} -
{section.label}
- {/if} - {#each section.tracks as track, index (track.id)} - handleLocalArtistClick(track.artist) : undefined} - onAlbumClick={track.album_group_key ? () => handleLocalAlbumLink(track) : undefined} - onPlay={() => handleTrackPlay(track)} - menuActions={{ - onPlayNow: () => handleTrackPlay(track), - onPlayNext: onTrackPlayNext ? () => onTrackPlayNext(track) : undefined, - onPlayLater: onTrackPlayLater ? () => onTrackPlayLater(track) : undefined, - onAddToPlaylist: onTrackAddToPlaylist ? () => onTrackAddToPlaylist(track.id) : undefined - }} - /> - {/each} - {/each} - {:else} - {#each group.tracks as track, index (track.id)} - handleLocalArtistClick(track.artist) : undefined} - onAlbumClick={track.album_group_key ? () => handleLocalAlbumLink(track) : undefined} - onPlay={() => handleTrackPlay(track)} - menuActions={{ - onPlayNow: () => handleTrackPlay(track), - onPlayNext: onTrackPlayNext ? () => onTrackPlayNext(track) : undefined, - onPlayLater: onTrackPlayLater ? () => onTrackPlayLater(track) : undefined, - onAddToPlaylist: onTrackAddToPlaylist ? () => onTrackAddToPlaylist(track.id) : undefined - }} - /> - {/each} - {/if} -
-
- {/each} -
- - {#if trackGroupingEnabled && (trackGroupMode === 'name' || trackGroupMode === 'artist')} -
- {#each alphaIndexLetters as letter} - - {/each} -
- {/if} -
- {/if} - {/if} -
- {/if} -
- - -{#if showAlbumEditModal && selectedAlbum} - -{/if} - -