Signed-off-by: Percy Wegmann <percy@tailscale.com>
ox/styling_bak
Percy Wegmann 2 years ago
parent ef63aa394c
commit 24ed79da1d
No known key found for this signature in database
GPG Key ID: 29D8CDEB4C13D48B

@ -46,8 +46,10 @@ private val LightColors =
lightColorScheme( lightColorScheme(
primary = Color(0xFF4B70CC), // blue-500 primary = Color(0xFF4B70CC), // blue-500
onPrimary = Color(0xFFFFFFFF), // white onPrimary = Color(0xFFFFFFFF), // white
primaryContainer = Color(0xFFF0F5FF), // blue-0 // primaryContainer = Color(0xFFF0F5FF), // blue-0
onPrimaryContainer = Color(0xFF3E5DB3), // blue-600 primaryContainer = Color(0xFF6D94EC), // blue-400
// onPrimaryContainer = Color(0xFF3E5DB3), // blue-600
onPrimaryContainer = Color(0xFFFFFFFF), // white,
error = Color(0xFFB22C30), // red-500 error = Color(0xFFB22C30), // red-500
onError = Color(0xFFFFFFFF), // white onError = Color(0xFFFFFFFF), // white
errorContainer = Color(0xFFFEF6F3), // red-0 errorContainer = Color(0xFFFEF6F3), // red-0
@ -150,7 +152,7 @@ val ColorScheme.primaryListItem: ListItemColors
containerColor = MaterialTheme.colorScheme.primary, containerColor = MaterialTheme.colorScheme.primary,
headlineColor = MaterialTheme.colorScheme.onPrimary, headlineColor = MaterialTheme.colorScheme.onPrimary,
leadingIconColor = MaterialTheme.colorScheme.onPrimary, leadingIconColor = MaterialTheme.colorScheme.onPrimary,
overlineColor = MaterialTheme.colorScheme.onPrimary, overlineColor = MaterialTheme.colorScheme.onPrimary.copy(alpha = 0.7f),
supportingTextColor = MaterialTheme.colorScheme.onPrimary, supportingTextColor = MaterialTheme.colorScheme.onPrimary,
trailingIconColor = MaterialTheme.colorScheme.onPrimary, trailingIconColor = MaterialTheme.colorScheme.onPrimary,
disabledHeadlineColor = default.disabledHeadlineColor, disabledHeadlineColor = default.disabledHeadlineColor,

@ -3,6 +3,7 @@
package com.tailscale.ipn.ui.view package com.tailscale.ipn.ui.view
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
@ -20,12 +21,11 @@ import com.tailscale.ipn.ui.model.IpnLocal
@OptIn(ExperimentalCoilApi::class) @OptIn(ExperimentalCoilApi::class)
@Composable @Composable
fun Avatar(profile: IpnLocal.LoginProfile?, size: Int = 50) { fun Avatar(profile: IpnLocal.LoginProfile?, size: Int = 50, action: (() -> Unit)? = null) {
Box(contentAlignment = Alignment.Center, modifier = Modifier.size(size.dp).clip(CircleShape)) { Box(contentAlignment = Alignment.Center, modifier = Modifier.size(size.dp).clip(CircleShape)) {
Icon( var modifier = Modifier.size((size * .8f).dp)
imageVector = Icons.Default.Person, action?.let { modifier = modifier.clickable { action() } }
contentDescription = null, Icon(imageVector = Icons.Default.Person, contentDescription = null, modifier = modifier)
modifier = Modifier.size((size * .8f).dp))
profile?.UserProfile?.ProfilePicURL?.let { url -> profile?.UserProfile?.ProfilePicURL?.let { url ->
AsyncImage(model = url, modifier = Modifier.size((size * 1.2f).dp), contentDescription = null) AsyncImage(model = url, modifier = Modifier.size((size * 1.2f).dp), contentDescription = null)

@ -47,6 +47,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.isGranted
@ -100,26 +101,32 @@ fun MainView(navigation: MainViewNavigation, viewModel: MainViewModel = viewMode
}, },
headlineContent = { headlineContent = {
if (username.isNotEmpty()) { if (username.isNotEmpty()) {
Text(text = username, style = MaterialTheme.typography.titleMedium) Text(
text = username,
style = MaterialTheme.typography.titleMedium.copy(lineHeight = 20.sp))
} }
}, },
supportingContent = { supportingContent = {
if (username.isNotEmpty()) { if (username.isNotEmpty()) {
Text(text = stateStr, style = MaterialTheme.typography.bodyMedium) Text(
text = stateStr,
style = MaterialTheme.typography.bodyMedium.copy(lineHeight = 20.sp))
} else { } else {
Text(text = stateStr, style = MaterialTheme.typography.bodyMedium) Text(
text = stateStr,
style = MaterialTheme.typography.bodyMedium.copy(lineHeight = 20.sp))
} }
}, },
trailingContent = { trailingContent = {
Box( Box(modifier = Modifier.weight(1f), contentAlignment = Alignment.CenterEnd) {
modifier = when (user.value) {
Modifier.weight(1f).clickable { navigation.onNavigateToSettings() }, null -> SettingsButton(user.value) { navigation.onNavigateToSettings() }
contentAlignment = Alignment.CenterEnd) { else ->
when (user.value) { Avatar(profile = user.value, size = 36) {
null -> SettingsButton(user.value) { navigation.onNavigateToSettings() } navigation.onNavigateToSettings()
else -> Avatar(profile = user.value, size = 36) }
} }
} }
}) })
when (state.value) { when (state.value) {
@ -169,7 +176,7 @@ fun ExitNodeStatus(navAction: () -> Unit, viewModel: MainViewModel) {
overlineContent = { overlineContent = {
Text( Text(
stringResource(R.string.exit_node), stringResource(R.string.exit_node),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodySmall,
) )
}, },
headlineContent = { headlineContent = {
@ -179,12 +186,15 @@ fun ExitNodeStatus(navAction: () -> Unit, viewModel: MainViewModel) {
location?.let { "${it.CountryCode?.flag()} ${it.Country} - ${it.City}" } location?.let { "${it.CountryCode?.flag()} ${it.Country} - ${it.City}" }
?: name ?: name
?: stringResource(id = R.string.none), ?: stringResource(id = R.string.none),
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.bodyMedium,
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis) overflow = TextOverflow.Ellipsis)
Icon( Icon(
Icons.Outlined.ArrowDropDown, imageVector = Icons.Outlined.ArrowDropDown,
null, contentDescription = null,
tint =
if (active) MaterialTheme.colorScheme.onPrimary.copy(alpha = 0.7f)
else MaterialTheme.colorScheme.onSurfaceVariant,
) )
} }
}, },
@ -336,7 +346,8 @@ fun PeerList(
Row(verticalAlignment = Alignment.CenterVertically) { Row(verticalAlignment = Alignment.CenterVertically) {
Box( Box(
modifier = modifier =
Modifier.size(10.dp) Modifier.padding(top = 2.dp)
.size(10.dp)
.background( .background(
color = peer.connectedColor(netmap.value), color = peer.connectedColor(netmap.value),
shape = RoundedCornerShape(percent = 50))) {} shape = RoundedCornerShape(percent = 50))) {}

@ -5,6 +5,7 @@ package com.tailscale.ipn.ui.view
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@ -41,10 +42,9 @@ fun Header(@StringRes title: Int = 0, titleText: String? = null, onBack: (() ->
@Composable @Composable
fun BackArrow(action: () -> Unit) { fun BackArrow(action: () -> Unit) {
Icon( Box(modifier = Modifier.padding(start = 15.dp, end = 20.dp)) {
Icons.AutoMirrored.Filled.ArrowBack, Icon(Icons.AutoMirrored.Filled.ArrowBack, null, modifier = Modifier.clickable { action() })
null, }
modifier = Modifier.clickable { action() }.padding(start = 15.dp, end = 20.dp))
} }
@Composable @Composable

Loading…
Cancel
Save