From 6fcc17a5a15ac3b27b072ee6910521ea722cdd4b Mon Sep 17 00:00:00 2001 From: DatLag Date: Sun, 5 May 2024 15:32:02 +0200 Subject: [PATCH] prepare next navigation implementation --- .../screen/initial/InitialComponent.kt | 6 +- .../screen/initial/InitialScreenComponent.kt | 52 +++++- .../ui/navigation/screen/initial/View.kt | 3 + .../screen/initial/component/CompactScreen.kt | 40 ++++- .../initial/favorites/FavoritesComponent.kt | 6 + .../initial/favorites/FavoritesScreen.kt | 8 + .../favorites/FavoritesScreenComponent.kt | 19 +++ .../screen/initial/home/HomeComponent.kt | 3 - .../screen/initial/home/HomeScreen.kt | 74 ++------- .../initial/home/HomeScreenComponent.kt | 26 --- .../home/component/CollapsingToolbar.kt | 151 ++++++++++++++++++ .../medium/component/CollapsingToolbar.kt | 2 - .../moko-resources/base/strings.xml | 2 + .../moko-resources/images/banner.svg | 56 +++++++ 14 files changed, 345 insertions(+), 103 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesComponent.kt create mode 100644 composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesScreen.kt create mode 100644 composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesScreenComponent.kt create mode 100644 composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/component/CollapsingToolbar.kt create mode 100644 composeApp/src/commonMain/moko-resources/images/banner.svg diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/InitialComponent.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/InitialComponent.kt index 67a3cb2..84381cd 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/InitialComponent.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/InitialComponent.kt @@ -4,11 +4,13 @@ import androidx.compose.ui.graphics.vector.ImageVector import com.arkivanov.decompose.ExperimentalDecomposeApi import com.arkivanov.decompose.router.pages.ChildPages import com.arkivanov.decompose.value.Value +import dev.datlag.aniflow.anilist.type.MediaType import dev.datlag.aniflow.ui.navigation.Component import dev.icerock.moko.resources.StringResource +import kotlinx.coroutines.flow.Flow interface InitialComponent : Component { - + val viewing: Flow val pagerItems: List val selectedPage: Value @@ -16,6 +18,8 @@ interface InitialComponent : Component { val pages: Value> fun selectPage(index: Int) + fun viewAnime() + fun viewManga() data class PagerItem( val label: StringResource, diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/InitialScreenComponent.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/InitialScreenComponent.kt index d5fea3f..40ead26 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/InitialScreenComponent.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/InitialScreenComponent.kt @@ -2,6 +2,7 @@ package dev.datlag.aniflow.ui.navigation.screen.initial import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AccountCircle +import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.filled.Home import androidx.compose.material.icons.filled.Settings import androidx.compose.runtime.Composable @@ -12,12 +13,18 @@ import com.arkivanov.decompose.value.Value import com.arkivanov.decompose.value.operator.map import dev.datlag.aniflow.SharedRes import dev.datlag.aniflow.anilist.model.Medium +import dev.datlag.aniflow.anilist.type.MediaType import dev.datlag.aniflow.common.onRender +import dev.datlag.aniflow.model.coroutines.Executor +import dev.datlag.aniflow.settings.Settings import dev.datlag.aniflow.ui.navigation.Component import dev.datlag.aniflow.ui.navigation.ContentHolderComponent +import dev.datlag.aniflow.ui.navigation.screen.initial.favorites.FavoritesScreenComponent import dev.datlag.aniflow.ui.navigation.screen.initial.home.HomeScreenComponent import dev.datlag.aniflow.ui.navigation.screen.initial.settings.SettingsScreenComponent +import kotlinx.coroutines.flow.map import org.kodein.di.DI +import org.kodein.di.instance class InitialScreenComponent( componentContext: ComponentContext, @@ -25,14 +32,20 @@ class InitialScreenComponent( private val onMediumDetails: (Medium) -> Unit ) : InitialComponent, ComponentContext by componentContext { + private val appSettings by di.instance() + override val pagerItems: List = listOf( + InitialComponent.PagerItem( + label = SharedRes.strings.profile, + icon = Icons.Filled.AccountCircle + ), InitialComponent.PagerItem( label = SharedRes.strings.home, icon = Icons.Default.Home ), InitialComponent.PagerItem( - label = SharedRes.strings.settings, - icon = Icons.Filled.AccountCircle + label = SharedRes.strings.favorites, + icon = Icons.Filled.Favorite ) ) @@ -46,10 +59,11 @@ class InitialScreenComponent( initialPages = { Pages( items = listOf( + View.Settings, View.Home, - View.Settings + View.Favorites ), - selectedIndex = 0 + selectedIndex = 1 ) }, childFactory = ::createChild @@ -58,6 +72,16 @@ class InitialScreenComponent( @OptIn(ExperimentalDecomposeApi::class) override val selectedPage: Value = pages.map { it.selectedIndex } + private val viewTypeExecutor = Executor() + + override val viewing = appSettings.viewManga.map { + if (it) { + MediaType.MANGA + } else { + MediaType.ANIME + } + } + @Composable override fun render() { onRender { @@ -79,6 +103,10 @@ class InitialScreenComponent( componentContext = componentContext, di = di ) + is View.Favorites -> FavoritesScreenComponent( + componentContext = componentContext, + di = di + ) } } @@ -90,4 +118,20 @@ class InitialScreenComponent( } } } + + override fun viewAnime() { + launchIO { + viewTypeExecutor.enqueue { + appSettings.setViewManga(false) + } + } + } + + override fun viewManga() { + launchIO { + viewTypeExecutor.enqueue { + appSettings.setViewManga(true) + } + } + } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/View.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/View.kt index 1d42a81..9bcd045 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/View.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/View.kt @@ -9,4 +9,7 @@ sealed class View { @Serializable data object Settings : View() + + @Serializable + data object Favorites : View() } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/component/CompactScreen.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/component/CompactScreen.kt index 4a5e5cb..089b4cd 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/component/CompactScreen.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/component/CompactScreen.kt @@ -1,16 +1,19 @@ package dev.datlag.aniflow.ui.navigation.screen.initial.component import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.* import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.MenuBook +import androidx.compose.material.icons.filled.AccountCircle import androidx.compose.material.icons.filled.CameraEnhance +import androidx.compose.material.icons.filled.PlayCircleFilled import androidx.compose.material3.* import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.nestedscroll.nestedScroll import com.arkivanov.decompose.ExperimentalDecomposeApi import com.arkivanov.decompose.extensions.compose.pages.Pages import com.arkivanov.decompose.extensions.compose.subscribeAsState @@ -21,16 +24,41 @@ import dev.datlag.aniflow.LocalHaze import dev.datlag.aniflow.LocalPaddingValues import dev.datlag.aniflow.common.isScrollingUp import dev.datlag.aniflow.ui.navigation.screen.initial.InitialComponent +import dev.datlag.aniflow.ui.navigation.screen.initial.home.component.CollapsingToolbar import dev.datlag.aniflow.ui.navigation.screen.initial.model.FABConfig import dev.icerock.moko.resources.compose.stringResource -@OptIn(ExperimentalFoundationApi::class, ExperimentalDecomposeApi::class, ExperimentalHazeMaterialsApi::class) +@OptIn(ExperimentalFoundationApi::class, ExperimentalDecomposeApi::class, ExperimentalHazeMaterialsApi::class, + ExperimentalMaterial3Api::class +) @Composable fun CompactScreen(component: InitialComponent) { - val selectedPage by component.selectedPage.subscribeAsState() + val appBarState = rememberTopAppBarState() + val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior( + state = appBarState + ) Scaffold( + modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), + topBar = { + CollapsingToolbar( + state = appBarState, + scrollBehavior = scrollBehavior, + viewTypeFlow = component.viewing, + onProfileClick = { + + }, + onAnimeClick = { + component.viewAnime() + }, + onMangaClick = { + component.viewManga() + } + ) + }, bottomBar = { + val selectedPage by component.selectedPage.subscribeAsState() + NavigationBar( modifier = Modifier.hazeChild( state = LocalHaze.current, @@ -89,6 +117,8 @@ fun CompactScreen(component: InitialComponent) { Box( modifier = Modifier.fillMaxSize() ) { + val selectedPage by component.selectedPage.subscribeAsState() + Pages( pages = component.pages, onPageSelected = { index -> diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesComponent.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesComponent.kt new file mode 100644 index 0000000..7a9d4d5 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesComponent.kt @@ -0,0 +1,6 @@ +package dev.datlag.aniflow.ui.navigation.screen.initial.favorites + +import dev.datlag.aniflow.ui.navigation.Component + +interface FavoritesComponent : Component { +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesScreen.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesScreen.kt new file mode 100644 index 0000000..d4857ad --- /dev/null +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesScreen.kt @@ -0,0 +1,8 @@ +package dev.datlag.aniflow.ui.navigation.screen.initial.favorites + +import androidx.compose.runtime.Composable + +@Composable +fun FavoritesScreen(component: FavoritesComponent) { + +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesScreenComponent.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesScreenComponent.kt new file mode 100644 index 0000000..4ed6fcc --- /dev/null +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/favorites/FavoritesScreenComponent.kt @@ -0,0 +1,19 @@ +package dev.datlag.aniflow.ui.navigation.screen.initial.favorites + +import androidx.compose.runtime.Composable +import com.arkivanov.decompose.ComponentContext +import dev.datlag.aniflow.common.onRender +import org.kodein.di.DI + +class FavoritesScreenComponent( + componentContext: ComponentContext, + override val di: DI +) : FavoritesComponent, ComponentContext by componentContext { + + @Composable + override fun render() { + onRender { + FavoritesScreen(this) + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeComponent.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeComponent.kt index 0b452eb..bc678bd 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeComponent.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeComponent.kt @@ -19,7 +19,6 @@ import kotlinx.coroutines.flow.StateFlow import dev.datlag.aniflow.settings.model.TitleLanguage as SettingsTitle interface HomeComponent : ContentHolderComponent { - val viewing: Flow val titleLanguage: Flow val airingState: Flow @@ -31,6 +30,4 @@ interface HomeComponent : ContentHolderComponent { fun details(medium: Medium) fun trace(channel: ByteArray) - fun viewAnime() - fun viewManga() } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreen.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreen.kt index c7ae277..c502384 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreen.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreen.kt @@ -140,11 +140,6 @@ private fun MainView(component: HomeComponent, modifier: Modifier = Modifier) { else -> { } } - val type by component.viewing.collectAsStateWithLifecycle(MediaType.UNKNOWN__) - val isManga = remember(type) { - type == MediaType.MANGA - } - LazyColumn( state = listState, modifier = modifier.haze(state = LocalHaze.current), @@ -152,64 +147,19 @@ private fun MainView(component: HomeComponent, modifier: Modifier = Modifier) { verticalArrangement = Arrangement.spacedBy(8.dp) ) { item { - Box( - modifier = Modifier.fillParentMaxWidth().height(200.dp), - contentAlignment = Alignment.BottomEnd - ) { - Row( - modifier = Modifier.padding(16.dp).background(Color.Black.copy(alpha = 0.3F), CircleShape), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceAround - ) { - IconButton( - onClick = { - component.viewAnime() - } - ) { - Icon( - imageVector = Icons.Default.PlayCircleFilled, - contentDescription = null, - tint = if (isManga) { - LocalContentColor.current - } else { - MaterialTheme.colorScheme.primary - } - ) - } - IconButton( - onClick = { - component.viewManga() - } - ) { - Icon( - imageVector = Icons.AutoMirrored.Filled.MenuBook, - contentDescription = null, - tint = if (isManga) { - MaterialTheme.colorScheme.primary - } else { - LocalContentColor.current - } - ) - } - } - } + Text( + modifier = Modifier.padding(horizontal = 16.dp), + text = "Schedule", + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold + ) } - if (!isManga) { - item { - Text( - modifier = Modifier.padding(horizontal = 16.dp), - text = "Schedule", - style = MaterialTheme.typography.headlineMedium, - fontWeight = FontWeight.Bold - ) - } - item { - AiringOverview( - state = component.airingState, - titleLanguage = titleLanguage, - onClick = component::details - ) - } + item { + AiringOverview( + state = component.airingState, + titleLanguage = titleLanguage, + onClick = component::details + ) } item { Text( diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreenComponent.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreenComponent.kt index e458ee7..e0e0f5c 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreenComponent.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreenComponent.kt @@ -65,16 +65,6 @@ class HomeScreenComponent( context = ioDispatcher() ) - private val viewTypeExecutor = Executor() - - override val viewing = appSettings.viewManga.map { - if (it) { - MediaType.MANGA - } else { - MediaType.ANIME - } - } - @Composable override fun render() { onRender { @@ -95,20 +85,4 @@ class HomeScreenComponent( traceStateMachine.dispatch(TraceStateMachine.Action.Load(channel)) } } - - override fun viewAnime() { - launchIO { - viewTypeExecutor.enqueue { - appSettings.setViewManga(false) - } - } - } - - override fun viewManga() { - launchIO { - viewTypeExecutor.enqueue { - appSettings.setViewManga(true) - } - } - } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/component/CollapsingToolbar.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/component/CollapsingToolbar.kt new file mode 100644 index 0000000..b060205 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/component/CollapsingToolbar.kt @@ -0,0 +1,151 @@ +package dev.datlag.aniflow.ui.navigation.screen.initial.home.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.MenuBook +import androidx.compose.material.icons.filled.AccountCircle +import androidx.compose.material.icons.filled.PlayCircleFilled +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.unit.dp +import dev.chrisbanes.haze.hazeChild +import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi +import dev.chrisbanes.haze.materials.HazeMaterials +import dev.datlag.aniflow.LocalHaze +import dev.datlag.aniflow.SharedRes +import dev.datlag.aniflow.anilist.type.MediaType +import dev.datlag.tooling.compose.ifFalse +import dev.datlag.tooling.compose.ifTrue +import dev.datlag.tooling.decompose.lifecycle.collectAsStateWithLifecycle +import dev.icerock.moko.resources.compose.painterResource +import kotlinx.coroutines.flow.Flow +import kotlin.math.max +import kotlin.math.min + +@OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class) +@Composable +fun CollapsingToolbar( + state: TopAppBarState, + scrollBehavior: TopAppBarScrollBehavior, + viewTypeFlow: Flow, + onProfileClick: () -> Unit, + onAnimeClick: () -> Unit, + onMangaClick: () -> Unit, +) { + Box( + modifier = Modifier.fillMaxWidth() + ) { + val isCollapsed by remember(state) { + derivedStateOf { state.collapsedFraction >= 0.99F } + } + val imageAlpha by remember(state) { + derivedStateOf { + max(min(1F - state.collapsedFraction, 1F), 0F) + } + } + val viewType by viewTypeFlow.collectAsStateWithLifecycle(MediaType.UNKNOWN__) + val isManga = remember(viewType) { + viewType == MediaType.MANGA + } + + Image( + modifier = Modifier + .fillMaxWidth() + .matchParentSize(), + painter = painterResource(SharedRes.images.banner), + contentScale = ContentScale.Crop, + contentDescription = null, + alpha = imageAlpha + ) + + LargeTopAppBar( + navigationIcon = { + IconButton( + modifier = Modifier.ifFalse(isCollapsed) { + background(MaterialTheme.colorScheme.surface.copy(alpha = 0.75F), CircleShape) + }, + onClick = { + onProfileClick() + } + ) { + Icon( + imageVector = Icons.Filled.AccountCircle, + contentDescription = null + ) + } + }, + title = { }, + scrollBehavior = scrollBehavior, + colors = TopAppBarDefaults.largeTopAppBarColors( + containerColor = Color.Transparent, + scrolledContainerColor = Color.Transparent, + ), + modifier = Modifier.hazeChild( + state = LocalHaze.current, + style = HazeMaterials.thin( + containerColor = MaterialTheme.colorScheme.surface, + ) + ).fillMaxWidth() + ) + + Row( + modifier = Modifier.padding( + bottom = 6.dp, + end = 4.dp + ).align(Alignment.BottomEnd), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.End + ) { + Row( + modifier = Modifier.ifFalse(isCollapsed) { + background(MaterialTheme.colorScheme.surface.copy(alpha = 0.75F), CircleShape) + }, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.End, + ) { + IconButton( + onClick = { + onAnimeClick() + }, + enabled = isManga + ) { + Icon( + imageVector = Icons.Filled.PlayCircleFilled, + contentDescription = null, + tint = if (isManga) { + LocalContentColor.current + } else { + MaterialTheme.colorScheme.primary + } + ) + } + IconButton( + onClick = { + onMangaClick() + }, + enabled = !isManga + ) { + Icon( + imageVector = Icons.AutoMirrored.Default.MenuBook, + contentDescription = null, + tint = if (isManga) { + MaterialTheme.colorScheme.primary + } else { + LocalContentColor.current + } + ) + } + } + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/medium/component/CollapsingToolbar.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/medium/component/CollapsingToolbar.kt index 7614082..e0d96ec 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/medium/component/CollapsingToolbar.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/medium/component/CollapsingToolbar.kt @@ -111,8 +111,6 @@ fun CollapsingToolbar( } }, title = { - - Column( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically) diff --git a/composeApp/src/commonMain/moko-resources/base/strings.xml b/composeApp/src/commonMain/moko-resources/base/strings.xml index 8bb1f5d..396f293 100644 --- a/composeApp/src/commonMain/moko-resources/base/strings.xml +++ b/composeApp/src/commonMain/moko-resources/base/strings.xml @@ -55,4 +55,6 @@ Romaji Native Explicit + Profile + Favorites diff --git a/composeApp/src/commonMain/moko-resources/images/banner.svg b/composeApp/src/commonMain/moko-resources/images/banner.svg new file mode 100644 index 0000000..55cd107 --- /dev/null +++ b/composeApp/src/commonMain/moko-resources/images/banner.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +