Skip to content

Commit 0dabe0d

Browse files
committed
Fix ios safe space and theme colors
1 parent d73711c commit 0dabe0d

15 files changed

Lines changed: 231 additions & 145 deletions

File tree

assets/commands/index.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3326,6 +3326,7 @@ in2csv.md
33263326
incplot.md
33273327
incus.md
33283328
indent.md
3329+
index.txt
33293330
indxbib.md
33303331
infection.md
33313332
influx.md
@@ -8299,4 +8300,4 @@ zstdmt.md
82998300
zsteg.md
83008301
zsync.md
83018302
zuse.md
8302-
zypper.md
8303+
zypper.md
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.linuxcommandlibrary.app.platform
2+
3+
import androidx.compose.animation.EnterTransition
4+
import androidx.compose.animation.ExitTransition
5+
import androidx.compose.runtime.Composable
6+
import androidx.navigation.NavGraphBuilder
7+
import androidx.navigation.NavHostController
8+
import androidx.navigation.compose.NavHost
9+
10+
@Composable
11+
actual fun AppNavHost(
12+
navController: NavHostController,
13+
startDestination: Any,
14+
builder: NavGraphBuilder.() -> Unit,
15+
) {
16+
NavHost(
17+
navController = navController,
18+
startDestination = startDestination,
19+
popEnterTransition = { EnterTransition.None },
20+
popExitTransition = { ExitTransition.None },
21+
builder = builder,
22+
)
23+
}

composeApp/src/androidMain/kotlin/com/linuxcommandlibrary/app/platform/Platform.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import androidx.compose.runtime.remember
1010
import androidx.compose.ui.graphics.vector.ImageVector
1111
import androidx.compose.ui.platform.LocalContext
1212

13-
actual val isIOS: Boolean = false
1413
actual val showRateAppButton: Boolean = true
1514
actual val showAndroidTerminalTip: Boolean = Build.VERSION.SDK_INT >= 35
1615
actual val backIcon: ImageVector = Icons.AutoMirrored.Filled.ArrowBack

composeApp/src/commonMain/kotlin/com/linuxcommandlibrary/app/App.kt

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
package com.linuxcommandlibrary.app
22

33
import androidx.compose.animation.AnimatedVisibility
4-
import androidx.compose.animation.EnterTransition
5-
import androidx.compose.animation.ExitTransition
64
import androidx.compose.animation.core.tween
75
import androidx.compose.animation.fadeIn
86
import androidx.compose.animation.fadeOut
97
import androidx.compose.foundation.background
108
import androidx.compose.foundation.layout.Box
119
import androidx.compose.foundation.layout.fillMaxSize
12-
import androidx.compose.foundation.layout.navigationBarsPadding
1310
import androidx.compose.foundation.layout.padding
14-
import androidx.compose.foundation.layout.statusBarsPadding
1511
import androidx.compose.material3.MaterialTheme
1612
import androidx.compose.material3.Scaffold
1713
import androidx.compose.runtime.Composable
@@ -20,15 +16,13 @@ import androidx.compose.runtime.getValue
2016
import androidx.compose.runtime.remember
2117
import androidx.compose.ui.Modifier
2218
import androidx.navigation.NavDestination.Companion.hasRoute
23-
import androidx.navigation.NavGraphBuilder
24-
import androidx.navigation.compose.NavHost
2519
import androidx.navigation.compose.composable
2620
import androidx.navigation.compose.currentBackStackEntryAsState
2721
import androidx.navigation.compose.rememberNavController
2822
import androidx.navigation.toRoute
2923
import com.linuxcommandlibrary.app.data.BasicsRepository
3024
import com.linuxcommandlibrary.app.data.CommandsRepository
31-
import com.linuxcommandlibrary.app.platform.isIOS
25+
import com.linuxcommandlibrary.app.platform.AppNavHost
3226
import com.linuxcommandlibrary.app.platform.rememberOpenAppAction
3327
import com.linuxcommandlibrary.app.ui.composables.BottomBar
3428
import com.linuxcommandlibrary.app.ui.composables.DetailTopBar
@@ -50,7 +44,6 @@ import com.linuxcommandlibrary.app.ui.screens.search.SearchViewModel
5044
import com.linuxcommandlibrary.app.ui.screens.tips.TipsScreen
5145
import com.linuxcommandlibrary.app.ui.screens.tips.TipsViewModel
5246
import com.linuxcommandlibrary.app.ui.theme.LinuxTheme
53-
import com.linuxcommandlibrary.app.ui.theme.LocalCustomColors
5447
import com.linuxcommandlibrary.shared.platform.ReviewHandler
5548
import kotlinx.coroutines.Dispatchers
5649
import kotlinx.coroutines.withContext
@@ -73,10 +66,6 @@ fun App(initialDeeplink: String? = null) {
7366
Box(
7467
modifier = Modifier
7568
.fillMaxSize()
76-
.background(LocalCustomColors.current.topBarBackground)
77-
.statusBarsPadding()
78-
.background(LocalCustomColors.current.navBarBackground)
79-
.navigationBarsPadding()
8069
.background(MaterialTheme.colorScheme.background),
8170
) {
8271
LinuxApp(initialDeeplink = initialDeeplink)
@@ -184,7 +173,10 @@ fun LinuxApp(initialDeeplink: String? = null) {
184173
modifier = Modifier
185174
.padding(innerPadding),
186175
) {
187-
val navGraphBuilder: NavGraphBuilder.() -> Unit = {
176+
AppNavHost(
177+
navController = navController,
178+
startDestination = initialRoute,
179+
) {
188180
composable<Route.Basics> {
189181
val viewModel: BasicCategoriesViewModel = koinInject()
190182
BasicCategoriesScreen(viewModel = viewModel, onNavigate = onNavigate)
@@ -218,21 +210,6 @@ fun LinuxApp(initialDeeplink: String? = null) {
218210
}
219211
}
220212
}
221-
if (isIOS) {
222-
NavHost(
223-
navController = navController,
224-
startDestination = initialRoute,
225-
builder = navGraphBuilder,
226-
)
227-
} else {
228-
NavHost(
229-
navController = navController,
230-
startDestination = initialRoute,
231-
popEnterTransition = { EnterTransition.None },
232-
popExitTransition = { ExitTransition.None },
233-
builder = navGraphBuilder,
234-
)
235-
}
236213

237214
val isSearchVisible = searchState.searchText.isNotEmpty() && !isOnCommandDetail
238215
AnimatedVisibility(
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.linuxcommandlibrary.app.platform
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.navigation.NavGraphBuilder
5+
import androidx.navigation.NavHostController
6+
7+
@Composable
8+
expect fun AppNavHost(
9+
navController: NavHostController,
10+
startDestination: Any,
11+
builder: NavGraphBuilder.() -> Unit,
12+
)

composeApp/src/commonMain/kotlin/com/linuxcommandlibrary/app/platform/Platform.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.linuxcommandlibrary.app.platform
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.graphics.vector.ImageVector
55

6-
expect val isIOS: Boolean
76
expect val showRateAppButton: Boolean
87
expect val showAndroidTerminalTip: Boolean
98
expect val backIcon: ImageVector
Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
package com.linuxcommandlibrary.app.ui.composables
22

3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.clickable
5+
import androidx.compose.foundation.interaction.MutableInteractionSource
6+
import androidx.compose.foundation.layout.Box
7+
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.Row
9+
import androidx.compose.foundation.layout.Spacer
10+
import androidx.compose.foundation.layout.WindowInsets
11+
import androidx.compose.foundation.layout.defaultMinSize
12+
import androidx.compose.foundation.layout.fillMaxWidth
313
import androidx.compose.foundation.layout.height
14+
import androidx.compose.foundation.layout.navigationBars
415
import androidx.compose.foundation.layout.size
16+
import androidx.compose.foundation.layout.windowInsetsPadding
517
import androidx.compose.material3.Icon
618
import androidx.compose.material3.MaterialTheme
7-
import androidx.compose.material3.NavigationBar
8-
import androidx.compose.material3.NavigationBarItem
9-
import androidx.compose.material3.NavigationBarItemDefaults
1019
import androidx.compose.material3.Text
20+
import androidx.compose.material3.ripple
1121
import androidx.compose.runtime.Composable
22+
import androidx.compose.runtime.remember
23+
import androidx.compose.ui.Alignment
1224
import androidx.compose.ui.Modifier
1325
import androidx.compose.ui.graphics.Color
1426
import androidx.compose.ui.input.pointer.PointerIcon
@@ -36,45 +48,60 @@ fun BottomBar(
3648
currentDestination: NavDestination?,
3749
onSelectTab: (Route) -> Unit,
3850
) {
39-
val itemColors = NavigationBarItemDefaults.colors(
40-
selectedIconColor = MaterialTheme.colorScheme.primary,
41-
selectedTextColor = MaterialTheme.colorScheme.primary,
42-
unselectedIconColor = MaterialTheme.colorScheme.onSurface,
43-
unselectedTextColor = MaterialTheme.colorScheme.onSurface,
44-
indicatorColor = Color.Transparent,
45-
)
51+
val selectedColor = MaterialTheme.colorScheme.primary
52+
val unselectedColor = MaterialTheme.colorScheme.onSurface
4653

47-
NavigationBar(
48-
modifier = Modifier.height(64.dp),
49-
containerColor = LocalCustomColors.current.navBarBackground,
50-
tonalElevation = 0.dp,
54+
Column(
55+
modifier = Modifier
56+
.fillMaxWidth()
57+
.background(LocalCustomColors.current.navBarBackground)
58+
.windowInsetsPadding(WindowInsets.navigationBars),
5159
) {
52-
bottomTabs.forEach { tab ->
53-
val painter = rememberIconPainter(tab.icon)
54-
val isSelected = when (tab.route) {
55-
Route.Basics -> currentDestination?.hasRoute<Route.Basics>() == true ||
56-
currentDestination?.hasRoute<Route.BasicGroups>() == true
60+
Row(
61+
modifier = Modifier
62+
.fillMaxWidth()
63+
.defaultMinSize(minHeight = 56.dp),
64+
verticalAlignment = Alignment.CenterVertically,
65+
) {
66+
bottomTabs.forEach { tab ->
67+
val isSelected = when (tab.route) {
68+
Route.Basics -> currentDestination?.hasRoute<Route.Basics>() == true ||
69+
currentDestination?.hasRoute<Route.BasicGroups>() == true
5770

58-
Route.Commands -> currentDestination?.hasRoute<Route.Commands>() == true
71+
Route.Commands -> currentDestination?.hasRoute<Route.Commands>() == true
5972

60-
Route.Tips -> currentDestination?.hasRoute<Route.Tips>() == true
73+
Route.Tips -> currentDestination?.hasRoute<Route.Tips>() == true
6174

62-
else -> false
75+
else -> false
76+
}
77+
val tint = if (isSelected) selectedColor else unselectedColor
78+
79+
Box(
80+
modifier = Modifier
81+
.weight(1f)
82+
.defaultMinSize(minHeight = 56.dp)
83+
.clickable(
84+
interactionSource = remember { MutableInteractionSource() },
85+
) { onSelectTab(tab.route) }
86+
.pointerHoverIcon(PointerIcon.Hand),
87+
contentAlignment = Alignment.Center,
88+
) {
89+
Column(horizontalAlignment = Alignment.CenterHorizontally) {
90+
Icon(
91+
painter = rememberIconPainter(tab.icon),
92+
contentDescription = null,
93+
modifier = Modifier.size(24.dp),
94+
tint = tint,
95+
)
96+
Spacer(modifier = Modifier.height(4.dp))
97+
Text(
98+
text = tab.title,
99+
color = tint,
100+
style = MaterialTheme.typography.labelMedium,
101+
)
102+
}
103+
}
63104
}
64-
NavigationBarItem(
65-
modifier = Modifier.pointerHoverIcon(PointerIcon.Hand),
66-
icon = {
67-
Icon(
68-
painter = painter,
69-
contentDescription = null,
70-
modifier = Modifier.size(24.dp),
71-
)
72-
},
73-
label = { Text(tab.title) },
74-
selected = isSelected,
75-
colors = itemColors,
76-
onClick = { onSelectTab(tab.route) },
77-
)
78105
}
79106
}
80107
}

0 commit comments

Comments
 (0)