update bottom bar interface

This commit is contained in:
2026-07-27 19:42:17 +03:00
parent 30b1acd3ff
commit cc8daa2a8f
4 changed files with 58 additions and 37 deletions
@@ -13,6 +13,7 @@ import androiddev.apps.vbox.client.shared.generated.resources.star
import androiddev.apps.vbox.client.shared.generated.resources.star_unchecked import androiddev.apps.vbox.client.shared.generated.resources.star_unchecked
import androiddev.apps.vbox.client.shared.generated.resources.user_tags import androiddev.apps.vbox.client.shared.generated.resources.user_tags
import androiddev.apps.vbox.client.shared.generated.resources.watch import androiddev.apps.vbox.client.shared.generated.resources.watch
import androidx.compose.animation.AnimatedContent
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@@ -93,7 +94,8 @@ fun OverviewScreen(component: OverviewComponent) {
}, },
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
snackbarState = snackbarState, snackbarState = snackbarState,
content = { content = { padding ->
AnimatedContent(details) {
when { when {
errorState != null -> ErrorAndRetry( errorState != null -> ErrorAndRetry(
@@ -102,12 +104,14 @@ fun OverviewScreen(component: OverviewComponent) {
details != null -> DetailsInfo( details != null -> DetailsInfo(
details = details!!, details = details!!,
paddingValues = it, paddingValues = padding,
onWatchClicked = { component.watch() } onWatchClicked = { component.watch() }
) )
else -> Loading() else -> Loading()
} }
}
if (tagsBottomSheetVisible) { if (tagsBottomSheetVisible) {
val allTags by component.allTags.collectAsState(null) val allTags by component.allTags.collectAsState(null)
val movieTags by component.movieTags.collectAsState(null) val movieTags by component.movieTags.collectAsState(null)
@@ -1,13 +1,17 @@
package ru.shadowsparky.ui package ru.shadowsparky.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateEndPadding
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.material3.ColorScheme import androidx.compose.material3.ColorScheme
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
@@ -26,6 +30,7 @@ import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.LayoutDirection
@@ -114,14 +119,23 @@ private fun <T : Route> BottomBar(
onSelectNavigation: ((T) -> Unit)? onSelectNavigation: ((T) -> Unit)?
) { ) {
val blurState = LocalBlurState.current val blurState = LocalBlurState.current
navigationEntries?.let { navigationEntries?.let { entries ->
Box(
modifier = Modifier
.fillMaxWidth()
.background(Color.Transparent)
.padding(horizontal = 24.dp, vertical = 16.dp)
.windowInsetsPadding(WindowInsets.navigationBars)
) {
NavigationBar( NavigationBar(
containerColor = ComponentDefaults.navBarContentColor(), containerColor = ComponentDefaults.navBarContentColor(),
modifier = ComponentDefaults.roundedClip().applyBlurEffect(blurState) modifier = ComponentDefaults.roundedClip()
.fillMaxWidth()
.applyBlurEffect(blurState)
) { ) {
it.forEach { entry -> entries.forEach { entry ->
NavigationBarItem( NavigationBarItem(
currentRoute == entry.route, selected = currentRoute == entry.route,
onClick = { onSelectNavigation?.invoke(entry.route) }, onClick = { onSelectNavigation?.invoke(entry.route) },
icon = { Icon(entry.painter, contentDescription = entry.title) }, icon = { Icon(entry.painter, contentDescription = entry.title) },
label = { Text(entry.title) } label = { Text(entry.title) }
@@ -130,6 +144,8 @@ private fun <T : Route> BottomBar(
} }
} }
} }
}
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -143,8 +159,8 @@ private fun <T : Route> ExpandedContent(
val topPadding = values.calculateTopPadding() val topPadding = values.calculateTopPadding()
val bottomPadding = values.calculateBottomPadding() val bottomPadding = values.calculateBottomPadding()
val endPadding = values.calculateEndPadding(LayoutDirection.Ltr) val endPadding = values.calculateEndPadding(LayoutDirection.Ltr)
Row(modifier = Modifier.fillMaxSize().padding(top = topPadding)) { Row(modifier = Modifier.fillMaxSize()) {
NavigationRail(modifier = Modifier.padding(horizontal = 4.dp)) { NavigationRail(modifier = Modifier.padding(start = 4.dp, end = 4.dp, top = topPadding)) {
navigationEntries.forEach { entry -> navigationEntries.forEach { entry ->
NavigationRailItem( NavigationRailItem(
selected = currentRoute == entry.route, selected = currentRoute == entry.route,
@@ -157,6 +173,7 @@ private fun <T : Route> ExpandedContent(
Box(modifier = Modifier.weight(1f)) { Box(modifier = Modifier.weight(1f)) {
content( content(
PaddingValues( PaddingValues(
top = topPadding,
end = endPadding, end = endPadding,
bottom = bottomPadding bottom = bottomPadding
) )
@@ -1,7 +1,7 @@
package ru.shadowsparky.ui.nav package ru.shadowsparky.ui.nav
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialExpressiveTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import com.arkivanov.decompose.ExperimentalDecomposeApi import com.arkivanov.decompose.ExperimentalDecomposeApi
import com.arkivanov.decompose.extensions.compose.stack.Children import com.arkivanov.decompose.extensions.compose.stack.Children
@@ -9,7 +9,6 @@ import com.arkivanov.decompose.extensions.compose.stack.animation.fade
import com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback.androidPredictiveBackAnimatableV2 import com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback.androidPredictiveBackAnimatableV2
import com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback.predictiveBackAnimation import com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback.predictiveBackAnimation
import com.arkivanov.decompose.extensions.compose.stack.animation.stackAnimation import com.arkivanov.decompose.extensions.compose.stack.animation.stackAnimation
import ru.shadowsparky.ui.theme.getColorScheme
@OptIn(ExperimentalDecomposeApi::class, ExperimentalMaterial3ExpressiveApi::class) @OptIn(ExperimentalDecomposeApi::class, ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
@@ -17,6 +16,7 @@ fun Nav(
rootComponent: RootComponent<*>, rootComponent: RootComponent<*>,
process: @Composable (child: Child, route: Route) -> Unit process: @Composable (child: Child, route: Route) -> Unit
) { ) {
MaterialExpressiveTheme {
Children( Children(
stack = rootComponent.valueChildStack, stack = rootComponent.valueChildStack,
animation = predictiveBackAnimation( animation = predictiveBackAnimation(
@@ -26,7 +26,6 @@ fun Nav(
selector = { backEvent, _, _ -> androidPredictiveBackAnimatableV2(backEvent) }, selector = { backEvent, _, _ -> androidPredictiveBackAnimatableV2(backEvent) },
), ),
) { ) {
MaterialTheme(getColorScheme()) {
process(it.instance, it.configuration as Route) process(it.instance, it.configuration as Route)
} }
} }
@@ -3,6 +3,7 @@ package ru.shadowsparky.ui.theme
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.AppBarWithSearchColors import androidx.compose.material3.AppBarWithSearchColors
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.NavigationBarDefaults import androidx.compose.material3.NavigationBarDefaults
import androidx.compose.material3.SearchBarDefaults import androidx.compose.material3.SearchBarDefaults
import androidx.compose.material3.TopAppBarColors import androidx.compose.material3.TopAppBarColors
@@ -31,7 +32,7 @@ object ComponentDefaults {
@Composable @Composable
fun navBarContentColor(): Color { fun navBarContentColor(): Color {
return if (isBlurEnabled()) { return if (isBlurEnabled()) {
Color.Transparent MaterialTheme.colorScheme.surfaceContainerHigh.copy(alpha = 0.5f)
} else { } else {
NavigationBarDefaults.containerColor NavigationBarDefaults.containerColor
} }