From ffd5f58aa9e604ef7b0669b38d316f50cf46e3fa Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Thu, 24 Sep 2026 08:55:45 +0000 Subject: [PATCH] revert the library header colour and gradient --- .../main/kotlin/com/subtracks/ui/AppRoot.kt | 330 +++++++++--------- .../com/subtracks/ui/library/LibraryScreen.kt | 133 ++----- .../com/subtracks/ui/theme/ArtworkTheme.kt | 3 - .../com/subtracks/ui/AppScreenshotTest.kt | 34 +- 4 files changed, 211 insertions(+), 289 deletions(-) diff --git a/app/src/main/kotlin/com/subtracks/ui/AppRoot.kt b/app/src/main/kotlin/com/subtracks/ui/AppRoot.kt index 0c85f80f..b1251001 100644 --- a/app/src/main/kotlin/com/subtracks/ui/AppRoot.kt +++ b/app/src/main/kotlin/com/subtracks/ui/AppRoot.kt @@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBars import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf @@ -56,7 +55,6 @@ import com.subtracks.ui.playback.NowPlayingRoute import com.subtracks.ui.playback.QueueRoute import com.subtracks.ui.settings.AddSourceRoute import com.subtracks.ui.settings.SettingsRoute -import com.subtracks.ui.theme.LocalPlayerArtwork import com.subtracks.ui.theme.rememberArtworkColors import kotlinx.coroutines.Job import kotlinx.coroutines.flow.SharingStarted @@ -145,180 +143,176 @@ private fun MainNavigation() { nowPlayingProgress = 0f } } - val miniArt = playbackController.coverArt(playback.item, thumbnail = true) - val miniArtwork = rememberArtworkColors(miniArt) - val libraryArtwork = miniArtwork.takeIf { miniArt != null } val density = LocalDensity.current val navBarInset = with(density) { WindowInsets.navigationBars.getBottom(this).toDp() } - CompositionLocalProvider(LocalPlayerArtwork provides libraryArtwork) { - Box(Modifier.fillMaxSize()) { - Column(Modifier.fillMaxSize()) { - NavHost( - navController = navController, - modifier = - Modifier - .weight(1f) - .then( - if (playerVisible) { - Modifier.consumeWindowInsets(WindowInsets.navigationBars) - } else { - Modifier - }, - ), - startDestination = Routes.LIBRARY, - enterTransition = { - slideInHorizontally(initialOffsetX = { it / 4 }, animationSpec = tween(NAVIGATION_DURATION_MS)) + - fadeIn(tween(NAVIGATION_DURATION_MS)) - }, - exitTransition = { - slideOutHorizontally(targetOffsetX = { -it / 4 }, animationSpec = tween(NAVIGATION_DURATION_MS)) + - fadeOut(tween(NAVIGATION_DURATION_MS)) - }, - popEnterTransition = { - slideInHorizontally(initialOffsetX = { -it / 4 }, animationSpec = tween(NAVIGATION_DURATION_MS)) + - fadeIn(tween(NAVIGATION_DURATION_MS)) - }, - popExitTransition = { - slideOutHorizontally(targetOffsetX = { it / 4 }, animationSpec = tween(NAVIGATION_DURATION_MS)) + - fadeOut(tween(NAVIGATION_DURATION_MS)) - }, - ) { - composable(Routes.LIBRARY) { - LibraryRoute( - onAlbumClick = { album -> navController.navigate(Routes.album(album.id, album.coverArt)) }, - onArtistClick = { artist -> navController.navigate(Routes.artist(artist.id, artist.coverArt)) }, - onPlaylistClick = { playlist -> navController.navigate(Routes.playlist(playlist.id)) }, - onOpenSettings = { navController.navigate(Routes.SETTINGS) }, - bottomInset = if (playerVisible) 0.dp else navBarInset, - ) - } - composable(Routes.SETTINGS) { - SettingsRoute( - onAddServer = { navController.navigate(Routes.ADD_SERVER) }, - onBack = { navController.popBackStack() }, - ) - } - composable( - route = Routes.ALBUM_DETAIL, - arguments = - listOf( - navArgument("albumId") { type = NavType.StringType }, - navArgument("coverArt") { - type = NavType.StringType - defaultValue = "" - }, - ), - ) { entry -> - AlbumDetailRoute( - albumId = entry.arguments?.getString("albumId").orEmpty(), - coverArtId = - entry.arguments - ?.getString("coverArt") - .orEmpty() - .ifEmpty { null }, - onBack = { navController.popBackStack() }, - ) - } - composable( - route = Routes.ARTIST_DETAIL, - arguments = - listOf( - navArgument("artistId") { type = NavType.StringType }, - navArgument("coverArt") { - type = NavType.StringType - defaultValue = "" - }, - ), - ) { entry -> - ArtistDetailRoute( - artistId = entry.arguments?.getString("artistId").orEmpty(), - coverArtId = - entry.arguments - ?.getString("coverArt") - .orEmpty() - .ifEmpty { null }, - onBack = { navController.popBackStack() }, - onAlbumClick = { album -> navController.navigate(Routes.album(album.id, album.coverArt)) }, - ) - } - composable( - route = Routes.PLAYLIST_DETAIL, - arguments = listOf(navArgument("playlistId") { type = NavType.StringType }), - ) { entry -> - PlaylistDetailRoute( - playlistId = entry.arguments?.getString("playlistId").orEmpty(), - onBack = { navController.popBackStack() }, - ) - } - composable(Routes.ADD_SERVER) { - AddSourceRoute( - onSaved = { navController.popBackStack() }, - onBack = { navController.popBackStack() }, - ) - } - } - - if (playerVisible) { - MiniPlayer( - state = playback, - coverArt = miniArt, - artwork = miniArtwork, - onExpand = { settleNowPlaying(true) }, - onPlayPause = playbackController::togglePlayPause, - onNext = playbackController::next, - onExpandDrag = { dragUpPx -> - nowPlayingOpen = true - settleJob?.cancel() - if (miniPlayerTopPx > 0f) { - nowPlayingProgress = (dragUpPx / miniPlayerTopPx).coerceIn(0f, 1f) - } - }, - onExpandRelease = { velocity -> settleNowPlaying(nowPlayingProgress > 0.05f || velocity < -FLING_VELOCITY) }, - modifier = Modifier.onGloballyPositioned { miniPlayerTopPx = it.positionInRoot().y }, - ) - } - } - - if (nowPlayingOpen) { - Box( - modifier = - Modifier - .fillMaxSize() - .graphicsLayer { - translationY = (1f - nowPlayingProgress) * miniPlayerTopPx - alpha = (nowPlayingProgress / EXPAND_FADE).coerceAtMost(1f) - }.draggable( - orientation = Orientation.Vertical, - state = - rememberDraggableState { delta -> - settleJob?.cancel() - if (miniPlayerTopPx > 0f) { - nowPlayingProgress = (nowPlayingProgress - delta / miniPlayerTopPx).coerceIn(0f, 1f) - } - }, - onDragStopped = { velocity -> settleNowPlaying(nowPlayingProgress > 0.9f && velocity < FLING_VELOCITY) }, - ), - ) { - NowPlayingRoute( - onBack = { settleNowPlaying(false) }, - onQueue = { showingQueue = true }, - modifier = Modifier.fillMaxSize(), - ) - } - } - - AnimatedVisibility( - visible = showingQueue, - enter = slideInVertically(initialOffsetY = { it }) + fadeIn(tween(OVERLAY_DURATION_MS)), - exit = slideOutVertically(targetOffsetY = { it }) + fadeOut(tween(OVERLAY_DURATION_MS)), + Box(Modifier.fillMaxSize()) { + Column(Modifier.fillMaxSize()) { + NavHost( + navController = navController, + modifier = + Modifier + .weight(1f) + .then( + if (playerVisible) { + Modifier.consumeWindowInsets(WindowInsets.navigationBars) + } else { + Modifier + }, + ), + startDestination = Routes.LIBRARY, + enterTransition = { + slideInHorizontally(initialOffsetX = { it / 4 }, animationSpec = tween(NAVIGATION_DURATION_MS)) + + fadeIn(tween(NAVIGATION_DURATION_MS)) + }, + exitTransition = { + slideOutHorizontally(targetOffsetX = { -it / 4 }, animationSpec = tween(NAVIGATION_DURATION_MS)) + + fadeOut(tween(NAVIGATION_DURATION_MS)) + }, + popEnterTransition = { + slideInHorizontally(initialOffsetX = { -it / 4 }, animationSpec = tween(NAVIGATION_DURATION_MS)) + + fadeIn(tween(NAVIGATION_DURATION_MS)) + }, + popExitTransition = { + slideOutHorizontally(targetOffsetX = { it / 4 }, animationSpec = tween(NAVIGATION_DURATION_MS)) + + fadeOut(tween(NAVIGATION_DURATION_MS)) + }, ) { - QueueRoute( - onBack = { showingQueue = false }, + composable(Routes.LIBRARY) { + LibraryRoute( + onAlbumClick = { album -> navController.navigate(Routes.album(album.id, album.coverArt)) }, + onArtistClick = { artist -> navController.navigate(Routes.artist(artist.id, artist.coverArt)) }, + onPlaylistClick = { playlist -> navController.navigate(Routes.playlist(playlist.id)) }, + onOpenSettings = { navController.navigate(Routes.SETTINGS) }, + bottomInset = if (playerVisible) 0.dp else navBarInset, + ) + } + composable(Routes.SETTINGS) { + SettingsRoute( + onAddServer = { navController.navigate(Routes.ADD_SERVER) }, + onBack = { navController.popBackStack() }, + ) + } + composable( + route = Routes.ALBUM_DETAIL, + arguments = + listOf( + navArgument("albumId") { type = NavType.StringType }, + navArgument("coverArt") { + type = NavType.StringType + defaultValue = "" + }, + ), + ) { entry -> + AlbumDetailRoute( + albumId = entry.arguments?.getString("albumId").orEmpty(), + coverArtId = + entry.arguments + ?.getString("coverArt") + .orEmpty() + .ifEmpty { null }, + onBack = { navController.popBackStack() }, + ) + } + composable( + route = Routes.ARTIST_DETAIL, + arguments = + listOf( + navArgument("artistId") { type = NavType.StringType }, + navArgument("coverArt") { + type = NavType.StringType + defaultValue = "" + }, + ), + ) { entry -> + ArtistDetailRoute( + artistId = entry.arguments?.getString("artistId").orEmpty(), + coverArtId = + entry.arguments + ?.getString("coverArt") + .orEmpty() + .ifEmpty { null }, + onBack = { navController.popBackStack() }, + onAlbumClick = { album -> navController.navigate(Routes.album(album.id, album.coverArt)) }, + ) + } + composable( + route = Routes.PLAYLIST_DETAIL, + arguments = listOf(navArgument("playlistId") { type = NavType.StringType }), + ) { entry -> + PlaylistDetailRoute( + playlistId = entry.arguments?.getString("playlistId").orEmpty(), + onBack = { navController.popBackStack() }, + ) + } + composable(Routes.ADD_SERVER) { + AddSourceRoute( + onSaved = { navController.popBackStack() }, + onBack = { navController.popBackStack() }, + ) + } + } + + if (playerVisible) { + val miniArt = playbackController.coverArt(playback.item, thumbnail = true) + MiniPlayer( + state = playback, + coverArt = miniArt, + artwork = rememberArtworkColors(miniArt), + onExpand = { settleNowPlaying(true) }, + onPlayPause = playbackController::togglePlayPause, + onNext = playbackController::next, + onExpandDrag = { dragUpPx -> + nowPlayingOpen = true + settleJob?.cancel() + if (miniPlayerTopPx > 0f) { + nowPlayingProgress = (dragUpPx / miniPlayerTopPx).coerceIn(0f, 1f) + } + }, + onExpandRelease = { velocity -> settleNowPlaying(nowPlayingProgress > 0.05f || velocity < -FLING_VELOCITY) }, + modifier = Modifier.onGloballyPositioned { miniPlayerTopPx = it.positionInRoot().y }, + ) + } + } + + if (nowPlayingOpen) { + Box( + modifier = + Modifier + .fillMaxSize() + .graphicsLayer { + translationY = (1f - nowPlayingProgress) * miniPlayerTopPx + alpha = (nowPlayingProgress / EXPAND_FADE).coerceAtMost(1f) + }.draggable( + orientation = Orientation.Vertical, + state = + rememberDraggableState { delta -> + settleJob?.cancel() + if (miniPlayerTopPx > 0f) { + nowPlayingProgress = (nowPlayingProgress - delta / miniPlayerTopPx).coerceIn(0f, 1f) + } + }, + onDragStopped = { velocity -> settleNowPlaying(nowPlayingProgress > 0.9f && velocity < FLING_VELOCITY) }, + ), + ) { + NowPlayingRoute( + onBack = { settleNowPlaying(false) }, + onQueue = { showingQueue = true }, modifier = Modifier.fillMaxSize(), ) } } + + AnimatedVisibility( + visible = showingQueue, + enter = slideInVertically(initialOffsetY = { it }) + fadeIn(tween(OVERLAY_DURATION_MS)), + exit = slideOutVertically(targetOffsetY = { it }) + fadeOut(tween(OVERLAY_DURATION_MS)), + ) { + QueueRoute( + onBack = { showingQueue = false }, + modifier = Modifier.fillMaxSize(), + ) + } } BackHandler(enabled = showingQueue) { showingQueue = false } diff --git a/app/src/main/kotlin/com/subtracks/ui/library/LibraryScreen.kt b/app/src/main/kotlin/com/subtracks/ui/library/LibraryScreen.kt index 9bc67ef3..a2f77fb1 100644 --- a/app/src/main/kotlin/com/subtracks/ui/library/LibraryScreen.kt +++ b/app/src/main/kotlin/com/subtracks/ui/library/LibraryScreen.kt @@ -4,7 +4,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -40,9 +39,7 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.SideEffect -import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -53,16 +50,9 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clipToBounds -import androidx.compose.ui.draw.drawBehind -import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Rect -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.lerp import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.input.nestedscroll.NestedScrollConnection -import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.layout.boundsInParent import androidx.compose.ui.layout.onGloballyPositioned @@ -78,9 +68,6 @@ import com.subtracks.data.model.Artist import com.subtracks.data.model.CoverArtRef import com.subtracks.data.model.Playlist import com.subtracks.data.model.SongListItem -import com.subtracks.ui.theme.HeroGradient -import com.subtracks.ui.theme.LocalPlayerArtwork -import com.subtracks.ui.theme.heroBarColor import org.koin.compose.viewmodel.koinViewModel import kotlin.math.abs import kotlin.math.roundToInt @@ -179,107 +166,58 @@ fun LibraryScreen( SideEffect { scrollBehavior.state.heightOffsetLimit = -with(density) { titleHeight.toPx() } } val titleFraction = scrollBehavior.state.collapsedFraction - var scrollPx by remember { mutableFloatStateOf(0f) } - val scrollTracker = - remember { - object : NestedScrollConnection { - override fun onPostScroll( - consumed: Offset, - available: Offset, - source: NestedScrollSource, - ): Offset { - scrollPx = (scrollPx - consumed.y).coerceAtLeast(0f) - return Offset.Zero - } - } - } + val statusBarTop = with(density) { WindowInsets.statusBars.getTop(this).toDp() } - val artwork = LocalPlayerArtwork.current - val statusBarTopPx = WindowInsets.statusBars.getTop(density) - val statusBarTop = with(density) { statusBarTopPx.toDp() } - - BoxWithConstraints( + Column( modifier = modifier .fillMaxSize() .background(MaterialTheme.colorScheme.background) - .nestedScroll(scrollTracker) .nestedScroll(scrollBehavior.nestedScrollConnection), ) { - val screenHeightPx = with(density) { maxHeight.toPx() } - val barHeightPx = statusBarTopPx + with(density) { TopAppBarDefaults.TopAppBarExpandedHeight.toPx() } - val selectedColor = heroBarColor(artwork, 0f, barHeightPx, screenHeightPx) - val barColor by - remember(artwork, barHeightPx, screenHeightPx) { - derivedStateOf { heroBarColor(artwork, scrollPx, barHeightPx, screenHeightPx) } - } - - HeroGradient( - colors = artwork, - scrollPx = { scrollPx }, - modifier = Modifier.fillMaxSize(), - ) - - Box( + Column( modifier = Modifier - .align(Alignment.TopStart) .fillMaxWidth() - .height(statusBarTop + 8.dp) - .background( - Brush.verticalGradient( - listOf(Color.Black.copy(alpha = 0.55f), Color.Transparent), - ), - ).graphicsLayer { alpha = 1f - titleFraction }, - ) - - Column(Modifier.fillMaxSize()) { - Column( + .padding(top = statusBarTop), + ) { + Box( modifier = Modifier .fillMaxWidth() - .drawBehind { drawRect(barColor.copy(alpha = titleFraction)) } - .padding(top = statusBarTop), + .height(titleHeight * (1f - titleFraction)) + .clipToBounds(), ) { - Box( + Text( + text = selectedTab.label, + style = MaterialTheme.typography.headlineLarge, + color = MaterialTheme.colorScheme.onBackground, + maxLines = 1, modifier = Modifier - .fillMaxWidth() - .height(titleHeight * (1f - titleFraction)) - .clipToBounds(), - ) { - Text( - text = selectedTab.label, - style = MaterialTheme.typography.headlineLarge, - color = MaterialTheme.colorScheme.onBackground, - maxLines = 1, - modifier = - Modifier - .offset(y = -(titleHeight * titleFraction)) - .wrapContentHeight(unbounded = true) - .padding(start = 8.dp, end = 16.dp, top = titleTop), - ) - } - LibraryTabs( - pagerState = pagerState, - onTabSelected = onTabSelected, - syncing = syncing, - onSync = onSync, - onOpenSettings = onOpenSettings, - selectedColor = selectedColor, + .offset(y = -(titleHeight * titleFraction)) + .wrapContentHeight(unbounded = true) + .padding(start = 8.dp, end = 16.dp, top = titleTop), ) } + LibraryTabs( + pagerState = pagerState, + onTabSelected = onTabSelected, + syncing = syncing, + onSync = onSync, + onOpenSettings = onOpenSettings, + ) + } - HorizontalPager( - state = pagerState, - modifier = Modifier.fillMaxWidth().weight(1f), - ) { page -> - when (LibraryTab.entries[page]) { - LibraryTab.Albums -> AlbumsContent(albums, coverArt, bottomInset, onAlbumClick) - LibraryTab.Artists -> ArtistsContent(artists, coverArt, bottomInset, onArtistClick) - LibraryTab.Songs -> SongsContent(songs, coverArt, bottomInset, onSongClick, playingSongId) - LibraryTab.Playlists -> PlaylistsContent(playlists, coverArt, bottomInset, onPlaylistClick) - } + HorizontalPager( + state = pagerState, + modifier = Modifier.fillMaxWidth().weight(1f), + ) { page -> + when (LibraryTab.entries[page]) { + LibraryTab.Albums -> AlbumsContent(albums, coverArt, bottomInset, onAlbumClick) + LibraryTab.Artists -> ArtistsContent(artists, coverArt, bottomInset, onArtistClick) + LibraryTab.Songs -> SongsContent(songs, coverArt, bottomInset, onSongClick, playingSongId) + LibraryTab.Playlists -> PlaylistsContent(playlists, coverArt, bottomInset, onPlaylistClick) } } } @@ -293,7 +231,6 @@ private fun LibraryTabs( syncing: Boolean, onSync: () -> Unit, onOpenSettings: () -> Unit, - selectedColor: Color, ) { val iconFadeThreshold = 0.65f val indicatorStretch = 18.dp @@ -337,7 +274,6 @@ private fun LibraryTabs( ((iconFadeThreshold - abs(position - index)) / iconFadeThreshold) .coerceIn(0f, 1f), onClick = { onTabSelected(tab) }, - selectedColor = selectedColor, modifier = Modifier.onGloballyPositioned { coordinates -> bounds[index] = coordinates.boundsInParent() @@ -375,10 +311,9 @@ private fun TabButton( tab: LibraryTab, progress: Float, onClick: () -> Unit, - selectedColor: Color, modifier: Modifier = Modifier, ) { - val content = lerp(MaterialTheme.colorScheme.onBackground, selectedColor, progress) + val content = lerp(MaterialTheme.colorScheme.onBackground, MaterialTheme.colorScheme.background, progress) Box( modifier = modifier diff --git a/app/src/main/kotlin/com/subtracks/ui/theme/ArtworkTheme.kt b/app/src/main/kotlin/com/subtracks/ui/theme/ArtworkTheme.kt index 828ccdbc..ea638ef7 100644 --- a/app/src/main/kotlin/com/subtracks/ui/theme/ArtworkTheme.kt +++ b/app/src/main/kotlin/com/subtracks/ui/theme/ArtworkTheme.kt @@ -7,7 +7,6 @@ import androidx.compose.material3.darkColorScheme import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.State -import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.runtime.remember @@ -206,8 +205,6 @@ fun ArtworkTheme( } } -val LocalPlayerArtwork = compositionLocalOf { null } - fun playerSurfaceColor(artwork: ArtworkColors): Color = lerp(artwork.scheme.surfaceContainerHigh, artwork.gradientHigh, 0.5f) fun heroBarColor( diff --git a/app/src/test/kotlin/com/subtracks/ui/AppScreenshotTest.kt b/app/src/test/kotlin/com/subtracks/ui/AppScreenshotTest.kt index 3643292d..93e49977 100644 --- a/app/src/test/kotlin/com/subtracks/ui/AppScreenshotTest.kt +++ b/app/src/test/kotlin/com/subtracks/ui/AppScreenshotTest.kt @@ -9,7 +9,6 @@ import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule @@ -50,7 +49,6 @@ import com.subtracks.ui.playback.QueueScreen import com.subtracks.ui.settings.AddSourceScreen import com.subtracks.ui.settings.AddSourceState import com.subtracks.ui.settings.SettingsScreen -import com.subtracks.ui.theme.LocalPlayerArtwork import com.subtracks.ui.theme.SubtracksTheme import com.subtracks.ui.theme.artworkColorsFromSeed import com.subtracks.ui.theme.artworkColorsFromSeeds @@ -329,23 +327,21 @@ class AppScreenshotTest { private fun setLibraryContent(tab: LibraryTab) { composeRule.setContent { SubtracksTheme { - CompositionLocalProvider(LocalPlayerArtwork provides artworkColorsFromSeed(Color.rgb(120, 80, 200))) { - LibraryScreen( - selectedTab = tab, - onTabSelected = {}, - albums = remember { flowOf(PagingData.from(Fixtures.albums)) }.collectAsLazyPagingItems(), - artists = remember { flowOf(PagingData.from(Fixtures.artists)) }.collectAsLazyPagingItems(), - songs = remember { flowOf(PagingData.from(Fixtures.songItems)) }.collectAsLazyPagingItems(), - playlists = remember { flowOf(PagingData.from(Fixtures.playlists)) }.collectAsLazyPagingItems(), - coverArt = { id, _ -> id?.let { CoverArtRef(it, "test:$it") } }, - onAlbumClick = {}, - onArtistClick = {}, - onPlaylistClick = {}, - onSongClick = {}, - onSync = {}, - onOpenSettings = {}, - ) - } + LibraryScreen( + selectedTab = tab, + onTabSelected = {}, + albums = remember { flowOf(PagingData.from(Fixtures.albums)) }.collectAsLazyPagingItems(), + artists = remember { flowOf(PagingData.from(Fixtures.artists)) }.collectAsLazyPagingItems(), + songs = remember { flowOf(PagingData.from(Fixtures.songItems)) }.collectAsLazyPagingItems(), + playlists = remember { flowOf(PagingData.from(Fixtures.playlists)) }.collectAsLazyPagingItems(), + coverArt = { id, _ -> id?.let { CoverArtRef(it, "test:$it") } }, + onAlbumClick = {}, + onArtistClick = {}, + onPlaylistClick = {}, + onSongClick = {}, + onSync = {}, + onOpenSettings = {}, + ) } } }