+ {!perfFlags.disableMainstageStickyHeader && (
+
+
+
+ {selectionMode && selectedIds.size > 0
+ ? t('albums.selectionCount', { count: selectedIds.size })
+ : t('home.losslessAlbums')}
+
+ {!(selectionMode && selectedIds.size > 0) && (
+
+ {t('losslessAlbums.slowFetchHint')}
+
+ )}
+
+
+ {selectionMode && selectedIds.size > 0 && (
+ <>
+
+
+
+ >
+ )}
+
+
+
+ )}
+
+ {unsupported ? (
+
+ {t('losslessAlbums.unsupported')}
+
+ ) : loading && albums.length === 0 ? (
+
+ ) : albums.length === 0 ? (
+
+ {t('losslessAlbums.empty')}
+
+ ) : (
+ <>
+
+ {albums.map(a => (
+
+ ))}
+
+
+ {loading && hasMore &&
}
+
+ >
+ )}
+
+ );
+}
diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx
index c4e195b0..bb2078c6 100644
--- a/src/pages/Settings.tsx
+++ b/src/pages/Settings.tsx
@@ -372,6 +372,7 @@ const CONTRIBUTORS = [
'Library: Browse by Composer — native-API role listing for classical libraries, library-scoped queries, composer as a first-class share entity (PR #487)',
'Home: "Because you listened" recommendation rail — Last.fm-anchored similar-artist surfacing with round-robin anchor rotation per server (PR #489)',
'Song Info: absolute file path on Navidrome via native /api/song/{id} — Subsonic only ever returned a relative path (or none on Navidrome), the native endpoint surfaces the full server-side location (PR #504)',
+ 'Home: Lossless Albums rail + dedicated /lossless-albums page with infinite scroll and header parity (selection mode, enqueue, offline, download ZIPs), streaming load via per-fetch onProgress, sidebar entry default visible, detection via Navidrome native bit_depth-sorted song cursor with always-lossless suffix allowlist (PR #506)',
],
},
] as const;
@@ -4588,6 +4589,7 @@ function HomeCustomizer() {
recentlyPlayed: t('home.recentlyPlayed'),
starred: t('home.starred'),
mostPlayed: t('home.mostPlayed'),
+ losslessAlbums: t('home.losslessAlbums'),
};
return (
diff --git a/src/store/homeStore.ts b/src/store/homeStore.ts
index 3af58872..fcc509d7 100644
--- a/src/store/homeStore.ts
+++ b/src/store/homeStore.ts
@@ -1,7 +1,7 @@
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
-export type HomeSectionId = 'hero' | 'recent' | 'discover' | 'becauseYouLike' | 'discoverSongs' | 'discoverArtists' | 'recentlyPlayed' | 'starred' | 'mostPlayed';
+export type HomeSectionId = 'hero' | 'recent' | 'discover' | 'becauseYouLike' | 'discoverSongs' | 'discoverArtists' | 'recentlyPlayed' | 'starred' | 'mostPlayed' | 'losslessAlbums';
export interface HomeSectionConfig {
id: HomeSectionId;
@@ -18,6 +18,7 @@ export const DEFAULT_HOME_SECTIONS: HomeSectionConfig[] = [
{ id: 'recentlyPlayed', visible: true },
{ id: 'starred', visible: true },
{ id: 'mostPlayed', visible: true },
+ { id: 'losslessAlbums', visible: true },
];
interface HomeStore {
diff --git a/src/store/sidebarStore.ts b/src/store/sidebarStore.ts
index b6ab00ae..272127b9 100644
--- a/src/store/sidebarStore.ts
+++ b/src/store/sidebarStore.ts
@@ -23,6 +23,7 @@ export const DEFAULT_SIDEBAR_ITEMS: SidebarItemConfig[] = [
{ id: 'favorites', visible: true },
{ id: 'playlists', visible: true },
{ id: 'mostPlayed', visible: true },
+ { id: 'losslessAlbums',visible: true },
{ id: 'radio', visible: true },
{ id: 'folderBrowser', visible: false },
{ id: 'deviceSync', visible: false },