diff --git a/jetpacker/android/app/src/main/kotlin/com/example/jetpacker/MainActivity.kt b/jetpacker/android/app/src/main/kotlin/com/example/jetpacker/MainActivity.kt index 8577136a..8e9ca881 100644 --- a/jetpacker/android/app/src/main/kotlin/com/example/jetpacker/MainActivity.kt +++ b/jetpacker/android/app/src/main/kotlin/com/example/jetpacker/MainActivity.kt @@ -23,6 +23,7 @@ import android.hardware.SensorManager import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity +import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.fillMaxSize @@ -45,7 +46,10 @@ import dagger.hilt.android.AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - enableEdgeToEdge() + enableEdgeToEdge( + statusBarStyle = SystemBarStyle.dark(android.graphics.Color.TRANSPARENT), + navigationBarStyle = SystemBarStyle.dark(android.graphics.Color.TRANSPARENT), + ) handleFeatureFlags() setContent { diff --git a/jetpacker/android/app/src/main/res/values-night/colors.xml b/jetpacker/android/app/src/main/res/values-night/colors.xml index bf225f5a..882bb001 100644 --- a/jetpacker/android/app/src/main/res/values-night/colors.xml +++ b/jetpacker/android/app/src/main/res/values-night/colors.xml @@ -16,5 +16,27 @@ --> - #141412 + #131314 + + + #FF01AF57 + #FF061B0E + #FF0A3D22 + #FFB9F6CA + #FF26C6DA + #FF052329 + #FF183A9C + #FFD0E4FF + #FF3DDC84 + #FF061B0E + #FFFF6E6E + #FF3B080A + #FF4A151B + #FF131314 + #FFFFFFFF + #FF22262B + #FFC4C7C5 + #FF01AF57 + #FF2A3038 + #FF1E2226 diff --git a/jetpacker/android/app/src/main/res/values/colors.xml b/jetpacker/android/app/src/main/res/values/colors.xml index 19351f15..effca8bd 100644 --- a/jetpacker/android/app/src/main/res/values/colors.xml +++ b/jetpacker/android/app/src/main/res/values/colors.xml @@ -23,5 +23,27 @@ #FF018786 #FF000000 #FFFFFFFF - #FCF8E5 - \ No newline at end of file + #131314 + + + #FF01AF57 + #FF061B0E + #FF0A3D22 + #FFB9F6CA + #FF26C6DA + #FF052329 + #FF183A9C + #FFD0E4FF + #FF3DDC84 + #FF061B0E + #FFFF6E6E + #FF3B080A + #FF4A151B + #FF131314 + #FFFFFFFF + #FF22262B + #FFC4C7C5 + #FF01AF57 + #FF2A3038 + #FF1E2226 + diff --git a/jetpacker/android/app/src/main/res/values/themes.xml b/jetpacker/android/app/src/main/res/values/themes.xml index b572d416..2f525058 100644 --- a/jetpacker/android/app/src/main/res/values/themes.xml +++ b/jetpacker/android/app/src/main/res/values/themes.xml @@ -15,7 +15,7 @@ --> - diff --git a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/Color.kt b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/Color.kt index 328a6b86..29bb2f5b 100644 --- a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/Color.kt +++ b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/Color.kt @@ -16,83 +16,99 @@ package com.example.jetpacker.core.ui +import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor -val primaryLight = Color(0xFF72DAEC) -val onPrimaryLight = Color(0xFFF1F2F3F) -val primaryContainerLight = Color(0xFF72DAEC) -val onPrimaryContainerLight = Color(0xFF1F2F3F) -val secondaryLight = Color(0xFF306DAC) -val onSecondaryLight = Color(0xFFEDF1FF) -val secondaryContainerLight = Color(0xFF306DAC) -val onSecondaryContainerLight = Color(0xFFEDF1FF) -val tertiaryLight = Color(0xFFFF5314) -val onTertiaryLight = Color(0xFFfcf8e5) -val tertiaryContainerLight = Color(0xFFFF5314) -val onTertiaryContainerLight = Color(0xFFfcf8e5) -val errorLight = Color(0xFFB51A25) -val onErrorLight = Color(0xFFFFFFFF) -val errorContainerLight = Color(0xFFd8373b) -val onErrorContainerLight = Color(0xFFfffbff) -val backgroundLight = Color(0xFFf6fafb) -val onBackgroundLight = Color(0xFF171c1d) -val surfaceLight = Color(0xFFFCF8E5) -val onSurfaceLight = Color(0xFF1f2f3f) -val surfaceVariantLight = Color(0xFFe6e2d7) -val onSurfaceVariantLight = Color(0xFF48473f) -val outlineLight = Color(0xFF1f2f3f) -val outlineVariantLight = Color(0xFFb0c4d8) +// Android Dev Summit brand & accent tokens +val AdsBackground = Color(0xFF131314) +val AdsGreen = Color(0xFF01AF57) +val AdsGreenBright = Color(0xFF3DDC84) +val AdsPink = Color(0xFFFDADEE) +val AdsBlue = Color(0xFF183A9C) +val AdsCyan = Color(0xFF26C6DA) +val AdsIconBadgeLight = Color(0xFFEEEEEE) +val AdsIconBadgeDark = Color(0xFF131314) + +val AdsBorderBrush: Brush = SolidColor(AdsBlue) +val AdsToolbarBorderBrush: Brush = SolidColor(AdsGreen) +val AdsLoadingBorderBrush: Brush = Brush.horizontalGradient(listOf(AdsBlue, AdsGreen)) +val AdsGlowColors = listOf(AdsGreen, AdsCyan, AdsBlue) + +val primaryLight = Color(0xFF01AF57) +val onPrimaryLight = Color(0xFF061B0E) +val primaryContainerLight = Color(0xFF0B3820) +val onPrimaryContainerLight = Color(0xFF6FF9B4) +val secondaryLight = Color(0xFF26C6DA) +val onSecondaryLight = Color(0xFF062024) +val secondaryContainerLight = Color(0xFF102E38) +val onSecondaryContainerLight = Color(0xFF9CEFFF) +val tertiaryLight = Color(0xFF3DDC84) +val onTertiaryLight = Color(0xFF061B0E) +val tertiaryContainerLight = Color(0xFF0D3B23) +val onTertiaryContainerLight = Color(0xFF8CF5B7) +val errorLight = Color(0xFFFF897D) +val onErrorLight = Color(0xFF4C0002) +val errorContainerLight = Color(0xFF3B1518) +val onErrorContainerLight = Color(0xFFFFB4AB) +val backgroundLight = Color(0xFF131314) +val onBackgroundLight = Color(0xFFF1F3F4) +val surfaceLight = Color(0xFF131314) +val onSurfaceLight = Color(0xFFF1F3F4) +val surfaceVariantLight = Color(0xFF23272C) +val onSurfaceVariantLight = Color(0xFFA8AEB5) +val outlineLight = AdsBlue +val outlineVariantLight = Color(0xFF2C333A) val scrimLight = Color(0xFF000000) -val inverseSurfaceLight = Color(0xFF1f2f3f) -val inverseOnSurfaceLight = Color(0xFFf4f0ed) -val inversePrimaryLight = Color(0xFF6dd5e7) -val surfaceDimLight = Color(0xFF72daec) -val surfaceBrightLight = Color(0xFF72daec) -val surfaceContainerLowestLight = Color(0xFFFFFFFF) -val surfaceContainerLowLight = Color(0xFFe8dff) -val surfaceContainerLight = Color(0xFFedf1ff) -val surfaceContainerHighLight = Color(0xFFd1dbff) -val surfaceContainerHighestLight = Color(0xFFc6d2ff) +val inverseSurfaceLight = Color(0xFFEEEEEE) +val inverseOnSurfaceLight = Color(0xFF131314) +val inversePrimaryLight = Color(0xFF006D35) +val surfaceDimLight = Color(0xFF0E0F10) +val surfaceBrightLight = Color(0xFF2C3137) +val surfaceContainerLowestLight = Color(0xFF0D0E10) +val surfaceContainerLowLight = Color(0xFF181A1D) +val surfaceContainerLight = Color(0xFF1D2024) +val surfaceContainerHighLight = Color(0xFF25292E) +val surfaceContainerHighestLight = Color(0xFF2E3339) -val primaryDark = Color(0xFF044B57) -val onPrimaryDark = Color(0xFFFAFEFF) -val primaryContainerDark = Color(0xFF72DAEC) -val onPrimaryContainerDark = Color(0xFF005f6a) -val secondaryDark = Color(0xFFa1d0ff) -val onSecondaryDark = Color(0xFF00325A) -val secondaryContainerDark = Color(0xFF306DAC) -val onSecondaryContainerDark = Color(0xFFA1D0FF) -val tertiaryDark = Color(0xFFFFB59F) -val onTertiaryDark = Color(0xFF5E1700) -val tertiaryContainerDark = Color(0xFFF47549FDC2B1) -val onTertiaryContainerDark = Color(0xFF5E1700) -val errorDark = Color(0xFFFFB3AE) -val onErrorDark = Color(0xFF68000C) -val errorContainerDark = Color(0xFFFF5353) -val onErrorContainerDark = Color(0xFF5B0009) -val backgroundDark = Color(0xFF0F1415) -val onBackgroundDark = Color(0xFFDFE3E4) -val surfaceDark = Color(0xFF3C392B) -val onSurfaceDark = Color(0xFFE6E2DF) -val surfaceVariantDark = Color(0xFF48473F) -val onSurfaceVariantDark = Color(0xFFCAC6BC) -val outlineDark = Color(0xFF939187) -val outlineVariantDark = Color(0xFF48473F) +val primaryDark = Color(0xFF01AF57) +val onPrimaryDark = Color(0xFF061B0E) +val primaryContainerDark = Color(0xFF0B3820) +val onPrimaryContainerDark = Color(0xFF6FF9B4) +val secondaryDark = Color(0xFF26C6DA) +val onSecondaryDark = Color(0xFF062024) +val secondaryContainerDark = Color(0xFF102E38) +val onSecondaryContainerDark = Color(0xFF9CEFFF) +val tertiaryDark = Color(0xFF3DDC84) +val onTertiaryDark = Color(0xFF061B0E) +val tertiaryContainerDark = Color(0xFF0D3B23) +val onTertiaryContainerDark = Color(0xFF8CF5B7) +val errorDark = Color(0xFFFF897D) +val onErrorDark = Color(0xFF4C0002) +val errorContainerDark = Color(0xFF3B1518) +val onErrorContainerDark = Color(0xFFFFB4AB) +val backgroundDark = Color(0xFF131314) +val onBackgroundDark = Color(0xFFF1F3F4) +val surfaceDark = Color(0xFF131314) +val onSurfaceDark = Color(0xFFF1F3F4) +val surfaceVariantDark = Color(0xFF23272C) +val onSurfaceVariantDark = Color(0xFFA8AEB5) +val outlineDark = AdsBlue +val outlineVariantDark = Color(0xFF2C333A) val scrimDark = Color(0xFF000000) -val inverseSurfaceDark = Color(0xFFA2CCF7) -val inverseOnSurfaceDark = Color(0xFF31302F) -val inversePrimaryDark = Color(0xFF006875) -val surfaceDimDark = Color(0xFF121214) -val surfaceBrightDark = Color(0xFF37383a) -val surfaceContainerLowestDark = Color(0xFF0d0d0f) -val surfaceContainerLowDark = Color(0xFF1A1A1C) -val surfaceContainerDark = Color(0xFF1E1E20) -val surfaceContainerHighDark = Color(0xFF28292B) -val surfaceContainerHighestDark = Color(0xFF333436) +val inverseSurfaceDark = Color(0xFFEEEEEE) +val inverseOnSurfaceDark = Color(0xFF131314) +val inversePrimaryDark = Color(0xFF006D35) +val surfaceDimDark = Color(0xFF0E0F10) +val surfaceBrightDark = Color(0xFF2C3137) +val surfaceContainerLowestDark = Color(0xFF0D0E10) +val surfaceContainerLowDark = Color(0xFF181A1D) +val surfaceContainerDark = Color(0xFF1D2024) +val surfaceContainerHighDark = Color(0xFF25292E) +val surfaceContainerHighestDark = Color(0xFF2E3339) // Semantic colors -val StarRatingGold = Color(0xFFFFB300) -val ShimmerPlaceholderGray = Color(0xFFE0E0E0) -val TimelineNodeBorderGreen = Color(0xFFDDF8D8) -val TimelineAudioBorderBlue = Color(0xFF299EAF) - +val StarRatingGold = Color(0xFFFFC107) +val ShimmerPlaceholderGray = Color(0xFF2E3339) +val TimelineNodeBorderGreen = Color(0xFF0B3820) +val TimelineAudioBorderBlue = Color(0xFFFDADEE) diff --git a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/EventColors.kt b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/EventColors.kt index 979f9edd..583a85a8 100644 --- a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/EventColors.kt +++ b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/EventColors.kt @@ -21,11 +21,11 @@ import androidx.compose.ui.graphics.Color data class EventColor(val container: Color, val content: Color) object EventColors { - val Flight = EventColor(container = Color(0xFFF3E5F5), content = Color(0xFF8523C2)) - val Hotel = EventColor(container = Color(0xFFE3F2FD), content = Color(0xFF1976D2)) - val Activity = EventColor(container = Color(0xFFFFF3E0), content = Color(0xFFE65100)) - val Museum = EventColor(container = Color(0xFFFFF3E0), content = Color(0xFF8BC34A)) - val Food = EventColor(container = Color(0xFFE8F5E9), content = Color(0xFF2E7D32)) - val Shopping = EventColor(container = Color(0xFFFCE4EC), content = Color(0xFFC2185B)) - val Entertainment = EventColor(container = Color(0xFFFFFDE7), content = Color(0xFFFBC02D)) + val Flight = EventColor(container = Color(0xFF102A4C), content = Color(0xFF60A5FA)) + val Hotel = EventColor(container = Color(0xFF0D333B), content = Color(0xFF26C6DA)) + val Activity = EventColor(container = Color(0xFF0B3820), content = Color(0xFF3DDC84)) + val Museum = EventColor(container = Color(0xFF12362C), content = Color(0xFF38D9A9)) + val Food = EventColor(container = Color(0xFF0A3622), content = Color(0xFF01AF57)) + val Shopping = EventColor(container = Color(0xFF3E1F38), content = Color(0xFFFDADEE)) + val Entertainment = EventColor(container = Color(0xFF241B4B), content = Color(0xFFA78BFA)) } diff --git a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/Theme.kt b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/Theme.kt index ce1a01b2..9f5eb893 100644 --- a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/Theme.kt +++ b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/Theme.kt @@ -102,7 +102,7 @@ private val LightColorScheme = @Composable fun JetPackerTheme( - darkTheme: Boolean = isSystemInDarkTheme(), + darkTheme: Boolean = true, content: @Composable () -> Unit, ) { val colorScheme = diff --git a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerExtendedFloatingActionButton.kt b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerExtendedFloatingActionButton.kt index 229c75b9..18a8b7da 100644 --- a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerExtendedFloatingActionButton.kt +++ b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerExtendedFloatingActionButton.kt @@ -61,6 +61,8 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.example.jetpacker.core.ui.AdsGreen +import com.example.jetpacker.core.ui.AdsGreenBright import com.example.jetpacker.core.ui.JetPackerTheme @Composable @@ -74,19 +76,18 @@ fun JetPackerExtendedFloatingActionButton( trailingContent: @Composable (RowScope.() -> Unit)? = null, ) { val shape = CircleShape - val inverseSurface = MaterialTheme.colorScheme.inverseSurface Row( modifier = modifier .dropShadow(shape = shape) { - radius = 0f + radius = 16.dp.toPx() spread = 0f - offset = Offset(x = 2.dp.toPx(), y = 3.dp.toPx()) - color = inverseSurface + offset = Offset(x = 0f, y = 4.dp.toPx()) + color = AdsGreen.copy(alpha = 0.35f) } .background(MaterialTheme.colorScheme.primary, shape) - .border(1.dp, MaterialTheme.colorScheme.onSurfaceVariant, shape) + .border(1.dp, AdsGreenBright.copy(alpha = 0.45f), shape) .clip(shape) .padding(horizontal = 8.dp, vertical = 12.dp) .height(IntrinsicSize.Min), diff --git a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerFab.kt b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerFab.kt index 0535f535..0e11c55d 100644 --- a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerFab.kt +++ b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerFab.kt @@ -43,6 +43,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.example.jetpacker.core.ui.AdsToolbarBorderBrush import com.example.jetpacker.core.ui.JetPackerTheme @Composable @@ -51,22 +52,22 @@ fun JetPackerFab( icon: ImageVector, contentDescription: String?, modifier: Modifier = Modifier, - containerColor: Color = MaterialTheme.colorScheme.tertiary, - contentColor: Color = MaterialTheme.colorScheme.onTertiary, + containerColor: Color = MaterialTheme.colorScheme.primary, + contentColor: Color = MaterialTheme.colorScheme.onPrimary, ) { val shape = RoundedCornerShape(16.dp) Box( modifier = modifier .sizeIn(minWidth = 56.dp, minHeight = 56.dp) - .border(1.dp, MaterialTheme.colorScheme.onSurface, shape = shape) .dropShadow(shape = shape) { - radius = 0f + radius = 12.dp.toPx() spread = 0f - offset = Offset(x = 2.dp.toPx(), y = 3.dp.toPx()) - color = Color(0xFF20290A) + offset = Offset(x = 0f, y = 4.dp.toPx()) + color = Color.Black.copy(alpha = 0.5f) } .background(containerColor, shape) + .border(1.5.dp, AdsToolbarBorderBrush, shape = shape) .clip(shape) .clickable { onClick() }, contentAlignment = Alignment.Center, diff --git a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerToolbar.kt b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerToolbar.kt index acca5fd4..d23ab8fb 100644 --- a/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerToolbar.kt +++ b/jetpacker/android/core/ui/src/main/kotlin/com/example/jetpacker/core/ui/components/JetPackerToolbar.kt @@ -20,6 +20,7 @@ import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.animateOffsetAsState import androidx.compose.animation.core.animateSizeAsState import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -62,6 +63,7 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp +import com.example.jetpacker.core.ui.AdsToolbarBorderBrush import com.example.jetpacker.core.ui.JetPackerTheme import kotlin.math.roundToInt @@ -92,17 +94,12 @@ fun JetPackerToolbar(modifier: Modifier = Modifier, content: @Composable RowScop modifier = modifier .dropShadow(shape = shape) { - radius = 3.dp.toPx() - offset = Offset(0f, 1.dp.toPx()) - color = Color.Black.copy(alpha = 0.3f) - } - .dropShadow(shape = shape) { - radius = 8.dp.toPx() + radius = 12.dp.toPx() offset = Offset(0f, 4.dp.toPx()) - spread = 3.dp.toPx() - color = Color.Black.copy(alpha = 0.15f) + color = Color.Black.copy(alpha = 0.55f) } - .background(MaterialTheme.colorScheme.onSurface, shape) + .background(MaterialTheme.colorScheme.surfaceContainerLow, shape) + .border(1.5.dp, AdsToolbarBorderBrush, shape) .onGloballyPositioned { state.toolbarCoords = it } ) { if (state.selectedBounds != null) { @@ -144,8 +141,8 @@ fun JetPackerToolbarAction( val contentColor by animateColorAsState( targetValue = - if (selected) MaterialTheme.colorScheme.onSurfaceVariant - else MaterialTheme.colorScheme.surfaceContainer, + if (selected) MaterialTheme.colorScheme.onPrimary + else MaterialTheme.colorScheme.onSurfaceVariant, label = "contentColor", ) diff --git a/jetpacker/android/feature/appfunctions/src/main/java/com/example/jetpacker/feature/appfunctions/JetPackerAppFunctionService.kt b/jetpacker/android/feature/appfunctions/src/main/java/com/example/jetpacker/feature/appfunctions/JetPackerAppFunctionService.kt index 96e67a02..c1b18e04 100644 --- a/jetpacker/android/feature/appfunctions/src/main/java/com/example/jetpacker/feature/appfunctions/JetPackerAppFunctionService.kt +++ b/jetpacker/android/feature/appfunctions/src/main/java/com/example/jetpacker/feature/appfunctions/JetPackerAppFunctionService.kt @@ -145,11 +145,11 @@ abstract class BaseJetPackerAppFunctionService : Hilt_BaseJetPackerAppFunctionSe /** * Adds an expense to a trip. Call this ONLY when the user explicitly asks to add, log, or record - * an expense (e.g., 'Please add 45 dollars for the airport Uber to Mountain View' or in a + * an expense (e.g., 'Please add 45 dollars for the airport taxi to Mountain View' or in a * follow-up turn 'Great, I just bought it, can you add that to my expenses?'). Do NOT call this * when the user is only asking how much budget they have left or whether they can afford an item. * - * @param title The title or description of the expense (e.g., 'Airport Uber to Mountain View', + * @param title The title or description of the expense (e.g., 'Airport taxi to Mountain View', * 'SFMOMA Museum Ticket', 'Mechanical Keyboard'). * @param amount The numeric amount of the expense (e.g., 45.0, 25.0, 180.0). * @param currency The currency code of the expense (e.g., 'USD', 'EUR', 'JPY', 'GBP'). Extract diff --git a/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/documents/DocumentsScreen.kt b/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/documents/DocumentsScreen.kt index 9ba7260d..304bd307 100644 --- a/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/documents/DocumentsScreen.kt +++ b/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/documents/DocumentsScreen.kt @@ -144,6 +144,9 @@ import androidx.compose.ui.unit.dp import androidx.core.content.FileProvider import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.example.jetpacker.core.ui.AdsBorderBrush +import com.example.jetpacker.core.ui.AdsIconBadgeDark +import com.example.jetpacker.core.ui.AdsIconBadgeLight import com.example.jetpacker.core.ui.components.JetPackerFabConfig import com.example.jetpacker.data.itinerary.TimelineEvent import com.example.jetpacker.data.itinerary.TravelDocument @@ -1050,7 +1053,7 @@ private fun DocumentCard( shape = RoundedCornerShape(20.dp), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceContainerLow), - border = BorderStroke(1.dp, MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.5f)), + border = BorderStroke(1.dp, AdsBorderBrush), ) { Column(modifier = Modifier.fillMaxWidth().padding(16.dp)) { // Top header row: Icon + Title/Subtitle + Overflow Menu @@ -1061,16 +1064,16 @@ private fun DocumentCard( ) { Row(modifier = Modifier.weight(1f), verticalAlignment = Alignment.CenterVertically) { Surface( - shape = RoundedCornerShape(12.dp), - color = MaterialTheme.colorScheme.secondaryContainer, - modifier = Modifier.size(44.dp), + shape = CircleShape, + color = AdsIconBadgeLight, + modifier = Modifier.size(40.dp), ) { Box(contentAlignment = Alignment.Center) { Icon( imageVector = icon, contentDescription = null, - tint = MaterialTheme.colorScheme.onSecondaryContainer, - modifier = Modifier.size(24.dp), + tint = AdsIconBadgeDark, + modifier = Modifier.size(22.dp), ) } } @@ -1232,7 +1235,7 @@ private fun DocumentCard( DocumentValidity.EXPIRING_SOON -> { Surface( shape = RoundedCornerShape(8.dp), - color = MaterialTheme.colorScheme.tertiaryContainer, + color = Color(0xFF3B2A08), ) { Row( modifier = Modifier.padding(horizontal = 8.dp, vertical = 3.dp), @@ -1241,14 +1244,14 @@ private fun DocumentCard( Icon( imageVector = Icons.Default.Warning, contentDescription = null, - tint = MaterialTheme.colorScheme.onTertiaryContainer, + tint = Color(0xFFFFD54F), modifier = Modifier.size(13.dp), ) Spacer(modifier = Modifier.width(4.dp)) Text( text = "Expires soon (${formatExpiryDate(document.expiryDate)})", style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onTertiaryContainer, + color = Color(0xFFFFD54F), fontWeight = FontWeight.SemiBold, ) } @@ -1257,7 +1260,7 @@ private fun DocumentCard( DocumentValidity.EXPIRED -> { Surface( shape = RoundedCornerShape(8.dp), - color = MaterialTheme.colorScheme.errorContainer, + color = Color(0xFF421114), ) { Row( modifier = Modifier.padding(horizontal = 8.dp, vertical = 3.dp), @@ -1266,25 +1269,43 @@ private fun DocumentCard( Icon( imageVector = Icons.Default.Warning, contentDescription = null, - tint = MaterialTheme.colorScheme.onErrorContainer, + tint = Color(0xFFFFB4AB), modifier = Modifier.size(13.dp), ) Spacer(modifier = Modifier.width(4.dp)) Text( text = "Expired (${formatExpiryDate(document.expiryDate)})", style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onErrorContainer, + color = Color(0xFFFFB4AB), fontWeight = FontWeight.SemiBold, ) } } } DocumentValidity.VALID -> { - Text( - text = "Valid ยท ${formatExpiryDate(document.expiryDate)}", - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - ) + Surface( + shape = RoundedCornerShape(8.dp), + color = Color(0xFF063E20), + ) { + Row( + modifier = Modifier.padding(horizontal = 8.dp, vertical = 3.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + imageVector = Icons.Default.CheckCircle, + contentDescription = null, + tint = Color(0xFF6DD58C), + modifier = Modifier.size(13.dp), + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = "Valid (${formatExpiryDate(document.expiryDate)})", + style = MaterialTheme.typography.labelSmall, + color = Color(0xFF6DD58C), + fontWeight = FontWeight.SemiBold, + ) + } + } } DocumentValidity.NONE -> {} } diff --git a/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/history/ChatHistoryScreen.kt b/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/history/ChatHistoryScreen.kt index 7a1f3fea..539bcdea 100644 --- a/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/history/ChatHistoryScreen.kt +++ b/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/history/ChatHistoryScreen.kt @@ -155,7 +155,7 @@ fun ChatHistoryScreen( style = MaterialTheme.typography.titleLarge.copy( fontFamily = SekuyaFontFamily, - fontSize = 22.sp, + fontSize = 17.sp, ), color = MaterialTheme.colorScheme.onSurface, ) @@ -553,7 +553,7 @@ private fun ActionStepPill(step: UserActionStep) { Icon( imageVector = Icons.Rounded.CheckCircle, contentDescription = "Completed", - tint = Color(0xFF2E7D32), + tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(16.dp), ) } @@ -613,10 +613,10 @@ private fun EmptyChatHistoryView( onClick = onStartChat, colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.secondary, - contentColor = MaterialTheme.colorScheme.onSecondary, + containerColor = MaterialTheme.colorScheme.primary, + contentColor = MaterialTheme.colorScheme.onPrimary, ), - shape = RoundedCornerShape(16.dp), + shape = RoundedCornerShape(24.dp), contentPadding = PaddingValues(horizontal = 20.dp, vertical = 12.dp), ) { Icon( diff --git a/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/ui/TravelAssistantCard.kt b/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/ui/TravelAssistantCard.kt index ba743f01..8b49ac2d 100644 --- a/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/ui/TravelAssistantCard.kt +++ b/jetpacker/android/feature/assistant/src/main/kotlin/com/example/jetpacker/feature/assistant/ui/TravelAssistantCard.kt @@ -98,6 +98,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.example.jetpacker.core.ui.AdsBorderBrush +import com.example.jetpacker.core.ui.AdsLoadingBorderBrush import com.example.jetpacker.feature.assistant.TravelAssistantViewModel import com.example.jetpacker.feature.assistant.model.ActionStepCategory import com.example.jetpacker.feature.assistant.model.ActionStepStatus @@ -156,11 +158,17 @@ fun TravelAssistantCard( } } + val isAssistantLoading = uiState is Thinking || uiState is ExecutingTool || voiceState.isListening + Card( modifier = modifier.fillMaxWidth(), shape = MaterialTheme.shapes.large, colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), - border = BorderStroke(1.dp, MaterialTheme.colorScheme.outline), + border = + BorderStroke( + if (isAssistantLoading) 1.5.dp else 1.dp, + if (isAssistantLoading) AdsLoadingBorderBrush else AdsBorderBrush, + ), ) { Column(modifier = Modifier.fillMaxWidth().padding(16.dp)) { // Header: Assistant title, Nano badge, Documents button, and Reset button @@ -992,6 +1000,13 @@ fun AmbientTripAssistantSheet( } } + val isSheetLoading = + displayOverlayState is AssistantOverlayState.PerformingActions || + displayOverlayState is AssistantOverlayState.Listening || + uiState is Thinking || + uiState is ExecutingTool || + voiceState.isListening + val sheetShape = RoundedCornerShape(24.dp) Surface( modifier = @@ -1007,7 +1022,11 @@ fun AmbientTripAssistantSheet( color = MaterialTheme.colorScheme.surfaceContainerHigh, tonalElevation = 6.dp, shadowElevation = 0.dp, - border = BorderStroke(1.dp, MaterialTheme.colorScheme.outlineVariant), + border = + BorderStroke( + if (isSheetLoading) 1.5.dp else 1.dp, + if (isSheetLoading) AdsLoadingBorderBrush else AdsBorderBrush, + ), ) { Box( modifier = diff --git a/jetpacker/android/feature/create_trip/src/main/kotlin/com/example/jetpacker/feature/create_trip/CreateTripPanel.kt b/jetpacker/android/feature/create_trip/src/main/kotlin/com/example/jetpacker/feature/create_trip/CreateTripPanel.kt index f8c01607..fa042f16 100644 --- a/jetpacker/android/feature/create_trip/src/main/kotlin/com/example/jetpacker/feature/create_trip/CreateTripPanel.kt +++ b/jetpacker/android/feature/create_trip/src/main/kotlin/com/example/jetpacker/feature/create_trip/CreateTripPanel.kt @@ -156,7 +156,7 @@ fun CreateTripPanelContent( fontSize = 22.sp, fontFamily = SekuyaFontFamily, ), - color = MaterialTheme.colorScheme.secondary, + color = MaterialTheme.colorScheme.onSurface, ) } }, diff --git a/jetpacker/android/feature/detail/hotel_chat/src/main/kotlin/com/example/jetpacker/feature/detail/hotel_chat/HotelSupportChat.kt b/jetpacker/android/feature/detail/hotel_chat/src/main/kotlin/com/example/jetpacker/feature/detail/hotel_chat/HotelSupportChat.kt index 6eb061a1..c3136094 100644 --- a/jetpacker/android/feature/detail/hotel_chat/src/main/kotlin/com/example/jetpacker/feature/detail/hotel_chat/HotelSupportChat.kt +++ b/jetpacker/android/feature/detail/hotel_chat/src/main/kotlin/com/example/jetpacker/feature/detail/hotel_chat/HotelSupportChat.kt @@ -253,7 +253,11 @@ fun UserMessageRowFixed(message: SupportChatMessage) { .background(UserBubble) .padding(16.dp) ) { - Text(text = message.text, color = Color.White, style = MaterialTheme.typography.bodyMedium) + Text( + text = message.text, + color = Color(0xFF061B0E), + style = MaterialTheme.typography.bodyMedium, + ) } Spacer(modifier = Modifier.width(8.dp)) Icon( @@ -276,9 +280,9 @@ fun BotMessageRowFixed( Icon( Icons.Filled.Face, contentDescription = "Other", - tint = TextSecondary, + tint = Color(0xFF131314), modifier = - Modifier.size(32.dp).clip(CircleShape).background(Color(0xFFE2E8F0)).padding(4.dp), + Modifier.size(32.dp).clip(CircleShape).background(Color(0xFFEEEEEE)).padding(4.dp), ) Spacer(modifier = Modifier.width(8.dp)) Text( @@ -316,11 +320,11 @@ fun BotMessageRowFixed( } } -val PrimaryBlue = Color(0xFF0F172A) -val UserBubble = Color(0xFF0F172A) -val BotBubble = Color(0xFFF1F5F9) -val TextPrimary = Color(0xFF1E293B) -val TextSecondary = Color(0xFF64748B) +val PrimaryBlue = Color(0xFF01AF57) +val UserBubble = Color(0xFF01AF57) +val BotBubble = Color(0xFF1E2024) +val TextPrimary = Color(0xFFF1F3F4) +val TextSecondary = Color(0xFF9AA0A6) @Composable fun InputBar( @@ -334,7 +338,7 @@ fun InputBar( modifier = Modifier.padding(16.dp) .clip(RoundedCornerShape(32.dp)) - .background(Color(0xFFF1F5F9)) + .background(Color(0xFF1E2024)) .padding(horizontal = 8.dp), verticalAlignment = Alignment.CenterVertically, ) { diff --git a/jetpacker/android/feature/detail/museum_assistant/src/main/kotlin/com/example/jetpacker/feature/detail/museum_assistant/ChatbotScreen.kt b/jetpacker/android/feature/detail/museum_assistant/src/main/kotlin/com/example/jetpacker/feature/detail/museum_assistant/ChatbotScreen.kt index 043cb81e..5ffdc9e3 100644 --- a/jetpacker/android/feature/detail/museum_assistant/src/main/kotlin/com/example/jetpacker/feature/detail/museum_assistant/ChatbotScreen.kt +++ b/jetpacker/android/feature/detail/museum_assistant/src/main/kotlin/com/example/jetpacker/feature/detail/museum_assistant/ChatbotScreen.kt @@ -69,11 +69,11 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -val PrimaryBlue = Color(0xFF0F172A) -val UserBubble = Color(0xFF0F172A) -val BotBubble = Color(0xFFF1F5F9) -val TextPrimary = Color(0xFF1E293B) -val TextSecondary = Color(0xFF64748B) +val PrimaryBlue = Color(0xFF01AF57) +val UserBubble = Color(0xFF01AF57) +val BotBubble = Color(0xFF1E2024) +val TextPrimary = Color(0xFFF1F3F4) +val TextSecondary = Color(0xFF9AA0A6) data class ChatMessage(val id: Int, val text: String, val isUser: Boolean, val sender: String) @@ -180,7 +180,11 @@ fun UserMessageRow(message: ChatMessage) { .background(UserBubble) .padding(16.dp) ) { - Text(text = message.text, color = Color.White, style = MaterialTheme.typography.bodyMedium) + Text( + text = message.text, + color = Color(0xFF061B0E), + style = MaterialTheme.typography.bodyMedium, + ) } Spacer(modifier = Modifier.width(8.dp)) Icon(Icons.Filled.AccountCircle, contentDescription = "User", modifier = Modifier.size(32.dp)) @@ -234,7 +238,7 @@ fun InputBar( modifier = Modifier.padding(16.dp) .clip(RoundedCornerShape(32.dp)) - .background(Color(0xFFF1F5F9)) + .background(Color(0xFF1E2024)) .padding(horizontal = 8.dp), verticalAlignment = Alignment.CenterVertically, ) { diff --git a/jetpacker/android/feature/detail/src/main/kotlin/com/example/jetpacker/feature/detail/MuseumDetailScreen.kt b/jetpacker/android/feature/detail/src/main/kotlin/com/example/jetpacker/feature/detail/MuseumDetailScreen.kt index 5e79c190..7a7fb408 100644 --- a/jetpacker/android/feature/detail/src/main/kotlin/com/example/jetpacker/feature/detail/MuseumDetailScreen.kt +++ b/jetpacker/android/feature/detail/src/main/kotlin/com/example/jetpacker/feature/detail/MuseumDetailScreen.kt @@ -315,13 +315,13 @@ fun MuseumDetailScreen( Modifier.fillMaxWidth() .height(120.dp) .clip(RoundedCornerShape(16.dp)) - .background(Color(0xFFE0E0E0)), + .background(MaterialTheme.colorScheme.surfaceContainerHighest), contentAlignment = Alignment.Center, ) { Icon( Icons.Rounded.Map, contentDescription = "Map Placeholder", - tint = Color.Gray, + tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(48.dp), ) } @@ -347,7 +347,7 @@ fun MuseumDetailScreen( modifier = Modifier.height(56.dp).fillMaxWidth(), colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.tertiary, + containerColor = MaterialTheme.colorScheme.primary, contentColor = MaterialTheme.colorScheme.onPrimary, ), ) { diff --git a/jetpacker/android/feature/detail/src/main/kotlin/com/example/jetpacker/feature/detail/TourDetailScreen.kt b/jetpacker/android/feature/detail/src/main/kotlin/com/example/jetpacker/feature/detail/TourDetailScreen.kt index 91a1996b..ac49e2b0 100644 --- a/jetpacker/android/feature/detail/src/main/kotlin/com/example/jetpacker/feature/detail/TourDetailScreen.kt +++ b/jetpacker/android/feature/detail/src/main/kotlin/com/example/jetpacker/feature/detail/TourDetailScreen.kt @@ -270,13 +270,13 @@ fun TourDetailScreen( Modifier.fillMaxWidth() .height(120.dp) .clip(RoundedCornerShape(16.dp)) - .background(Color(0xFFE0E0E0)), + .background(MaterialTheme.colorScheme.surfaceContainerHighest), contentAlignment = Alignment.Center, ) { Icon( Icons.Rounded.Map, contentDescription = "Map Placeholder", - tint = Color.Gray, + tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(48.dp), ) } diff --git a/jetpacker/android/feature/home/src/main/kotlin/com/example/jetpacker/feature/home/SectionHeader.kt b/jetpacker/android/feature/home/src/main/kotlin/com/example/jetpacker/feature/home/SectionHeader.kt index 9b4ce4bd..44e3875b 100644 --- a/jetpacker/android/feature/home/src/main/kotlin/com/example/jetpacker/feature/home/SectionHeader.kt +++ b/jetpacker/android/feature/home/src/main/kotlin/com/example/jetpacker/feature/home/SectionHeader.kt @@ -21,6 +21,7 @@ import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.togetherWith +import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -54,6 +55,7 @@ import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.positionInParent import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import com.example.jetpacker.core.ui.AdsBorderBrush import com.example.jetpacker.core.ui.SekuyaFontFamily @Composable @@ -119,7 +121,9 @@ fun SectionHeader( if (isExpandable) { Box( modifier = - Modifier.size(40.dp).border(2.dp, MaterialTheme.colorScheme.outline, CircleShape), + Modifier.size(40.dp) + .background(MaterialTheme.colorScheme.surfaceContainerLow, CircleShape) + .border(1.5.dp, AdsBorderBrush, CircleShape), contentAlignment = Alignment.Center, ) { AnimatedContent( diff --git a/jetpacker/android/feature/home/src/main/kotlin/com/example/jetpacker/feature/home/components/TripCard.kt b/jetpacker/android/feature/home/src/main/kotlin/com/example/jetpacker/feature/home/components/TripCard.kt index ad37eacb..59711a9b 100644 --- a/jetpacker/android/feature/home/src/main/kotlin/com/example/jetpacker/feature/home/components/TripCard.kt +++ b/jetpacker/android/feature/home/src/main/kotlin/com/example/jetpacker/feature/home/components/TripCard.kt @@ -73,6 +73,9 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import coil.compose.AsyncImage +import com.example.jetpacker.core.ui.AdsBorderBrush +import com.example.jetpacker.core.ui.AdsIconBadgeDark +import com.example.jetpacker.core.ui.AdsIconBadgeLight import com.example.jetpacker.core.ui.JetPackerTheme import com.example.jetpacker.core.ui.R as CoreUiR import com.example.jetpacker.core.ui.SekuyaFontFamily @@ -163,8 +166,8 @@ fun TripCard( Modifier.fillMaxWidth() .clip(RoundedCornerShape(40.dp)) .then(modifier) - .background(MaterialTheme.colorScheme.surface) - .border(1.dp, MaterialTheme.colorScheme.outline, RoundedCornerShape(40.dp)) + .background(MaterialTheme.colorScheme.surfaceContainerLow) + .border(1.5.dp, AdsBorderBrush, RoundedCornerShape(40.dp)) .clickable(onClick = onClick) .padding(16.dp), config = { @@ -275,19 +278,19 @@ private fun TripInfoItem(icon: ImageVector, text: String, modifier: Modifier = M Row( modifier = modifier, verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(8.dp), + horizontalArrangement = Arrangement.spacedBy(10.dp), ) { Surface( modifier = Modifier.size(32.dp), - color = MaterialTheme.colorScheme.primary, - shape = RoundedCornerShape(12.dp), + color = AdsIconBadgeLight, + shape = CircleShape, ) { Box(contentAlignment = Alignment.Center) { Icon( imageVector = icon, contentDescription = null, - modifier = Modifier.size(20.dp), - tint = MaterialTheme.colorScheme.onPrimary, + modifier = Modifier.size(18.dp), + tint = AdsIconBadgeDark, ) } } diff --git a/jetpacker/android/feature/trip/booking_assistant/src/main/kotlin/com/example/jetpacker/feature/booking_assistant/BookingAssistantScreen.kt b/jetpacker/android/feature/trip/booking_assistant/src/main/kotlin/com/example/jetpacker/feature/booking_assistant/BookingAssistantScreen.kt index 4f4d6f99..8f5f4b74 100644 --- a/jetpacker/android/feature/trip/booking_assistant/src/main/kotlin/com/example/jetpacker/feature/booking_assistant/BookingAssistantScreen.kt +++ b/jetpacker/android/feature/trip/booking_assistant/src/main/kotlin/com/example/jetpacker/feature/booking_assistant/BookingAssistantScreen.kt @@ -105,9 +105,9 @@ fun BookingAssistantScreen( Scaffold( modifier = modifier.fillMaxSize(), - containerColor = MaterialTheme.colorScheme.primary, + containerColor = MaterialTheme.colorScheme.background, topBar = { - Column(modifier = Modifier.background(MaterialTheme.colorScheme.primary)) { + Column(modifier = Modifier.background(MaterialTheme.colorScheme.background)) { TopAppBar( title = { Text( @@ -115,10 +115,9 @@ fun BookingAssistantScreen( style = MaterialTheme.typography.titleLarge.copy( fontFamily = SekuyaFontFamily, - fontSize = 24.sp, - letterSpacing = 0.5.sp, + fontSize = 17.sp, ), - color = Color(0xFF1E293B), + color = MaterialTheme.colorScheme.onSurface, ) }, navigationIcon = { @@ -126,7 +125,7 @@ fun BookingAssistantScreen( Icon( imageVector = Icons.AutoMirrored.Rounded.ArrowBack, contentDescription = "Back", - tint = Color(0xFF1E293B), + tint = MaterialTheme.colorScheme.onSurface, ) } }, @@ -135,19 +134,19 @@ fun BookingAssistantScreen( Icon( imageVector = Icons.Rounded.Refresh, contentDescription = "Reset Bookings", - tint = Color(0xFF1E293B).copy(alpha = 0.4f), + tint = MaterialTheme.colorScheme.onSurface, ) } }, colors = TopAppBarDefaults.topAppBarColors( - containerColor = MaterialTheme.colorScheme.primary, + containerColor = MaterialTheme.colorScheme.background, ), ) if (isStreaming) { LinearProgressIndicator( - modifier = Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.secondary, + modifier = Modifier.fillMaxWidth().height(3.dp), + color = MaterialTheme.colorScheme.primary, trackColor = Color.Transparent, ) } diff --git a/jetpacker/android/feature/trip/expenses/src/main/kotlin/com/example/jetpacker/feature/expenses/ManageExpensesScreen.kt b/jetpacker/android/feature/trip/expenses/src/main/kotlin/com/example/jetpacker/feature/expenses/ManageExpensesScreen.kt index 91de3a09..8b5f40ef 100644 --- a/jetpacker/android/feature/trip/expenses/src/main/kotlin/com/example/jetpacker/feature/expenses/ManageExpensesScreen.kt +++ b/jetpacker/android/feature/trip/expenses/src/main/kotlin/com/example/jetpacker/feature/expenses/ManageExpensesScreen.kt @@ -28,6 +28,7 @@ import androidx.compose.animation.core.infiniteRepeatable import androidx.compose.animation.core.rememberInfiniteTransition import androidx.compose.animation.core.tween import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -113,6 +114,10 @@ import androidx.compose.ui.unit.sp import androidx.graphics.shapes.toPath import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.example.jetpacker.core.ui.AdsBorderBrush +import com.example.jetpacker.core.ui.AdsIconBadgeDark +import com.example.jetpacker.core.ui.AdsIconBadgeLight +import com.example.jetpacker.core.ui.AdsLoadingBorderBrush import com.example.jetpacker.core.ui.EventColors import com.example.jetpacker.core.ui.SekuyaFontFamily import com.example.jetpacker.data.itinerary.Expense @@ -241,7 +246,7 @@ fun ManageExpensesScreen( title = { Text( "Expenses", - style = MaterialTheme.typography.titleLarge, + style = MaterialTheme.typography.titleLarge.copy(fontSize = 17.sp), color = MaterialTheme.colorScheme.onSurface, fontFamily = SekuyaFontFamily, ) @@ -283,7 +288,16 @@ fun ManageExpensesScreen( ) { val totalText = "$${"%.2f".format(totalSpent)}" - Surface(shape = RoundedCornerShape(30.dp), color = MaterialTheme.colorScheme.surface) { + Surface( + shape = RoundedCornerShape(30.dp), + color = MaterialTheme.colorScheme.surfaceContainerLow, + modifier = + Modifier.border( + 1.5.dp, + if (isProcessing.value) AdsLoadingBorderBrush else AdsBorderBrush, + RoundedCornerShape(30.dp), + ), + ) { Text( text = totalText, style = @@ -312,14 +326,14 @@ fun ManageExpensesScreen( Spacer(modifier = Modifier.width(8.dp)) Surface( shape = RoundedCornerShape(30.dp), - color = MaterialTheme.colorScheme.onSurface, + color = MaterialTheme.colorScheme.primary, modifier = Modifier.clickable { isBudgetSheetVisible = true }, ) { Text( text = "$${budget.toInt()}", style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Black, - color = MaterialTheme.colorScheme.surface, + color = MaterialTheme.colorScheme.onPrimary, modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp), ) } @@ -407,7 +421,7 @@ fun ManageExpensesScreen( } @Composable -fun ShimmerExpenseItem() { +fun ShimmerExpenseItem(modifier: Modifier = Modifier) { val shimmerColors = listOf( Color.LightGray.copy(alpha = 0.6f), @@ -436,7 +450,8 @@ fun ShimmerExpenseItem() { ) Card( - modifier = Modifier.fillMaxWidth(), + modifier = + modifier.fillMaxWidth().border(1.5.dp, AdsLoadingBorderBrush, RoundedCornerShape(12.dp)), shape = RoundedCornerShape(12.dp), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceContainer), ) { @@ -541,29 +556,21 @@ fun ExpenseItem( }, ) { Card( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().border(1.dp, AdsBorderBrush, RoundedCornerShape(12.dp)), shape = RoundedCornerShape(12.dp), onClick = onClick, colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceContainer), ) { Row(modifier = Modifier.padding(16.dp), verticalAlignment = Alignment.CenterVertically) { - Box(modifier = Modifier.size(50.dp), contentAlignment = Alignment.Center) { - val shape = MaterialShapes.SoftBoom - Box( - modifier = - Modifier.fillMaxSize().drawWithCache { - val path = shape.toPath().asComposePath() - val matrix = Matrix() - matrix.scale(size.width, size.height) - path.transform(matrix) - onDrawBehind { drawPath(path, color = color.content) } - } - ) + Box( + modifier = Modifier.size(48.dp).background(AdsIconBadgeLight, CircleShape), + contentAlignment = Alignment.Center, + ) { Icon( imageVector = icon, contentDescription = null, - tint = MaterialTheme.colorScheme.surface, - modifier = Modifier.size(16.dp), + tint = AdsIconBadgeDark, + modifier = Modifier.size(22.dp), ) } diff --git a/jetpacker/android/feature/trip/itinerary/enrichment/src/main/kotlin/com/example/jetpacker/feature/itinerary_enrichment/TripSummaryAndTipsCard.kt b/jetpacker/android/feature/trip/itinerary/enrichment/src/main/kotlin/com/example/jetpacker/feature/itinerary_enrichment/TripSummaryAndTipsCard.kt index 39a69c03..b44a3872 100644 --- a/jetpacker/android/feature/trip/itinerary/enrichment/src/main/kotlin/com/example/jetpacker/feature/itinerary_enrichment/TripSummaryAndTipsCard.kt +++ b/jetpacker/android/feature/trip/itinerary/enrichment/src/main/kotlin/com/example/jetpacker/feature/itinerary_enrichment/TripSummaryAndTipsCard.kt @@ -80,6 +80,9 @@ import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp +import com.example.jetpacker.core.ui.AdsBorderBrush +import com.example.jetpacker.core.ui.AdsGlowColors +import com.example.jetpacker.core.ui.AdsLoadingBorderBrush import com.example.jetpacker.data.trips.DummyData import com.example.jetpacker.data.trips.Trip import java.time.ZoneId @@ -118,12 +121,7 @@ fun TripSummaryAndTipsCard(modifier: Modifier = Modifier, isLoading: Boolean, su val xOffset = width * (rotation / 360f) Brush.linearGradient( - colors = - listOf( - Color(0xFF9CEFFF), // Cyan - Color(0xFFD2E4FF), // Blue - Color(0xFFFFB59F), // Pink - ), + colors = AdsGlowColors, start = Offset(xOffset - width, 0f), end = Offset(xOffset, 0f), tileMode = TileMode.Mirror, @@ -140,13 +138,13 @@ fun TripSummaryAndTipsCard(modifier: Modifier = Modifier, isLoading: Boolean, su if (isLoaded) { brush = glowBrush radius = 24.dp.toPx() - offset = Offset(x = 0f, y = 16.dp.toPx()) + offset = Offset(x = 0f, y = 12.dp.toPx()) } } - .background(MaterialTheme.colorScheme.surface, RoundedCornerShape(24.dp)) + .background(MaterialTheme.colorScheme.surfaceContainer, RoundedCornerShape(24.dp)) .border( - 2.dp, - if (isLoaded) Color.Transparent else Color.Black.copy(alpha = 0.45f), + 1.5.dp, + if (isLoading) AdsLoadingBorderBrush else AdsBorderBrush, RoundedCornerShape(24.dp), ) .clip(RoundedCornerShape(24.dp)) @@ -245,7 +243,7 @@ fun TripSummaryAndTipsCard(modifier: Modifier = Modifier, isLoading: Boolean, su .height(40.dp) .background( Brush.verticalGradient( - listOf(Color.Transparent, MaterialTheme.colorScheme.surfaceBright) + listOf(Color.Transparent, MaterialTheme.colorScheme.surfaceContainer) ) ) ) diff --git a/jetpacker/android/feature/trip/itinerary/src/main/kotlin/com/example/jetpacker/feature/itinerary/ItineraryScreen.kt b/jetpacker/android/feature/trip/itinerary/src/main/kotlin/com/example/jetpacker/feature/itinerary/ItineraryScreen.kt index 21792c1c..1b3b87af 100644 --- a/jetpacker/android/feature/trip/itinerary/src/main/kotlin/com/example/jetpacker/feature/itinerary/ItineraryScreen.kt +++ b/jetpacker/android/feature/trip/itinerary/src/main/kotlin/com/example/jetpacker/feature/itinerary/ItineraryScreen.kt @@ -155,6 +155,10 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil.compose.AsyncImage import com.example.jetpacker.core.flags.FeatureFlags +import com.example.jetpacker.core.ui.AdsBorderBrush +import com.example.jetpacker.core.ui.AdsIconBadgeDark +import com.example.jetpacker.core.ui.AdsIconBadgeLight +import com.example.jetpacker.core.ui.AdsLoadingBorderBrush import com.example.jetpacker.core.ui.EventColors import com.example.jetpacker.core.ui.JetPackerTheme import com.example.jetpacker.core.ui.R @@ -199,8 +203,8 @@ fun ItineraryScreen( LocalContext.current val uiState by viewModel.uiState.collectAsStateWithLifecycle() - val fabContainerColor = MaterialTheme.colorScheme.secondary - val fabContentColor = MaterialTheme.colorScheme.onSecondary + val fabContainerColor = MaterialTheme.colorScheme.primary + val fabContentColor = MaterialTheme.colorScheme.onPrimary var eventToDelete by remember { mutableStateOf(null) } @@ -243,19 +247,19 @@ fun ItineraryScreen( uiState.trip?.title?.uppercase() ?: "ITINERARY", style = MaterialTheme.typography.titleLarge.copy( - fontSize = 22.sp, + fontSize = 17.sp, fontFamily = SekuyaFontFamily, ), - color = MaterialTheme.colorScheme.secondary, + color = MaterialTheme.colorScheme.onSurface, maxLines = 1, - autoSize = TextAutoSize.StepBased(minFontSize = 12.sp, maxFontSize = 22.sp), + autoSize = TextAutoSize.StepBased(minFontSize = 12.sp, maxFontSize = 17.sp), ) uiState.trip?.location?.let { location -> Text( location, style = MaterialTheme.typography.labelMedium, - color = MaterialTheme.colorScheme.onSurface, + color = MaterialTheme.colorScheme.onSurfaceVariant, ) } } @@ -272,7 +276,7 @@ fun ItineraryScreen( }, scrollBehavior = scrollBehavior, colors = - TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.primary), + TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface), ) }, containerColor = Color.Transparent, @@ -645,7 +649,11 @@ fun TimelineItemCard( ) { Card( onClick = onClick, - modifier = modifier.fillMaxWidth().padding(bottom = 16.dp), + modifier = + modifier + .fillMaxWidth() + .padding(bottom = 16.dp) + .border(1.dp, AdsBorderBrush, RoundedCornerShape(12.dp)), shape = RoundedCornerShape(12.dp), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceContainer), @@ -665,23 +673,23 @@ fun TimelineItemCard( Box( modifier = - Modifier.size(50.dp) + Modifier.size(48.dp) .clip(CircleShape) - .background(MaterialTheme.colorScheme.secondary, MaterialShapes.Burst.toShape()), + .background(AdsIconBadgeLight, CircleShape), contentAlignment = Alignment.Center, ) { Icon( imageVector = icon, contentDescription = null, - tint = MaterialTheme.colorScheme.onSecondary, - modifier = Modifier.size(18.dp), + tint = AdsIconBadgeDark, + modifier = Modifier.size(22.dp), ) } Spacer(modifier = Modifier.width(16.dp)) Column(modifier = Modifier.weight(1f)) { - val tagColor = MaterialTheme.colorScheme.surface + val tagColor = eventColors.container val tagTextColor = eventColors.content Text( @@ -691,7 +699,7 @@ fun TimelineItemCard( color = tagTextColor, modifier = Modifier.background(tagColor, RoundedCornerShape(16.dp)) - .border(1.dp, tagTextColor, RoundedCornerShape(16.dp)) + .border(1.dp, tagTextColor.copy(alpha = 0.6f), RoundedCornerShape(16.dp)) .padding(horizontal = 8.dp, vertical = 2.dp), ) @@ -775,7 +783,10 @@ fun TimelineShimmerItem(modifier: Modifier = Modifier) { // Content column Card( - modifier = Modifier.fillMaxWidth().padding(bottom = 24.dp), + modifier = + Modifier.fillMaxWidth() + .padding(bottom = 24.dp) + .border(1.5.dp, AdsLoadingBorderBrush, MaterialTheme.shapes.medium), shape = MaterialTheme.shapes.medium, colors = CardDefaults.elevatedCardColors(), ) { @@ -841,11 +852,11 @@ fun rememberShimmerBrush(): Brush { @Composable fun DashedLine(modifier: Modifier = Modifier) { - val dashedLineColor = MaterialTheme.colorScheme.onSurface + val dashedLineColor = MaterialTheme.colorScheme.onSurfaceVariant Canvas(modifier = modifier.width(2.dp)) { - val dashLength = 12.dp.toPx() - val gapLength = 2.dp.toPx() + val dashLength = 8.dp.toPx() + val gapLength = 5.dp.toPx() drawLine( color = dashedLineColor, start = Offset(size.width / 2, 0f), diff --git a/jetpacker/android/feature/trip/src/main/kotlin/com/example/jetpacker/feature/trip/TripScreen.kt b/jetpacker/android/feature/trip/src/main/kotlin/com/example/jetpacker/feature/trip/TripScreen.kt index fdcb2972..825407c0 100644 --- a/jetpacker/android/feature/trip/src/main/kotlin/com/example/jetpacker/feature/trip/TripScreen.kt +++ b/jetpacker/android/feature/trip/src/main/kotlin/com/example/jetpacker/feature/trip/TripScreen.kt @@ -137,8 +137,8 @@ fun TripScreen( ) }, contentDescription = "Trip Assistant", - containerColor = MaterialTheme.colorScheme.secondary, - contentColor = MaterialTheme.colorScheme.onSecondary, + containerColor = MaterialTheme.colorScheme.primary, + contentColor = MaterialTheme.colorScheme.onPrimary, ) val assistantEnabled = FeatureFlags.ENABLE_TRAVEL_ASSISTANT @@ -152,7 +152,7 @@ fun TripScreen( tabFabConfig ?: if (assistantAvailableOnTab) assistantFabConfig else null Scaffold( - containerColor = MaterialTheme.colorScheme.primary, + containerColor = MaterialTheme.colorScheme.background, bottomBar = { TripBottomBarContainer( showAssistantOverlay = showAssistantOverlay, @@ -381,8 +381,8 @@ fun JetPackerBottomBar( onClick = displayFab.onClick, icon = displayFab.icon, contentDescription = displayFab.contentDescription, - containerColor = displayFab.containerColor ?: MaterialTheme.colorScheme.tertiary, - contentColor = displayFab.contentColor ?: MaterialTheme.colorScheme.onTertiary, + containerColor = displayFab.containerColor ?: MaterialTheme.colorScheme.primary, + contentColor = displayFab.contentColor ?: MaterialTheme.colorScheme.onPrimary, ) } } diff --git a/jetpacker/android/feature/trip/voice_notes/src/main/kotlin/com/example/jetpacker/feature/voice_notes/VoiceNotesScreen.kt b/jetpacker/android/feature/trip/voice_notes/src/main/kotlin/com/example/jetpacker/feature/voice_notes/VoiceNotesScreen.kt index 8133d4b3..a14026bf 100644 --- a/jetpacker/android/feature/trip/voice_notes/src/main/kotlin/com/example/jetpacker/feature/voice_notes/VoiceNotesScreen.kt +++ b/jetpacker/android/feature/trip/voice_notes/src/main/kotlin/com/example/jetpacker/feature/voice_notes/VoiceNotesScreen.kt @@ -115,6 +115,8 @@ import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.example.jetpacker.core.ui.AdsBorderBrush +import com.example.jetpacker.core.ui.AdsLoadingBorderBrush import com.example.jetpacker.core.ui.JetPackerTheme import com.example.jetpacker.core.ui.SekuyaFontFamily import com.example.jetpacker.data.itinerary.TimelineEvent @@ -179,17 +181,17 @@ fun VoiceNotesScreen( ) } - val secondary = MaterialTheme.colorScheme.secondary + val primary = MaterialTheme.colorScheme.primary val tertiary = MaterialTheme.colorScheme.tertiary - val onSecondary = MaterialTheme.colorScheme.onSecondary + val onPrimary = MaterialTheme.colorScheme.onPrimary val onTertiary = MaterialTheme.colorScheme.onTertiary LaunchedEffect(voiceInputState.isReady, voiceInputState.isListening, voiceInputState.statusText) { onFabConfigChange( JetPackerFabConfig( onClick = handleListenToggle, - containerColor = if (voiceInputState.isListening) tertiary else secondary, - contentColor = if (voiceInputState.isListening) onTertiary else onSecondary, + containerColor = if (voiceInputState.isListening) tertiary else primary, + contentColor = if (voiceInputState.isListening) onTertiary else onPrimary, icon = if (voiceInputState.isListening) Icons.Rounded.Stop else Icons.Rounded.Mic, contentDescription = if (voiceInputState.isListening) "Stop" else "Record", ) @@ -215,7 +217,7 @@ fun VoiceNotesScreen( style = MaterialTheme.typography.titleLarge.copy( fontFamily = SekuyaFontFamily, - fontSize = 22.sp, + fontSize = 17.sp, ), color = MaterialTheme.colorScheme.onSurface, ) @@ -326,7 +328,7 @@ fun VoiceModeOverlay( label = "animation_progress", ) - JetPackerTheme(darkTheme = false) { + JetPackerTheme { Box(modifier = Modifier.fillMaxSize().clickable { onDismiss() }) { // 60% Surface Overlay (Scrim) Box( @@ -459,14 +461,12 @@ fun ProcessingVoiceNoteItem(placeholder: VoiceNotePlaceholder) { val shape = RoundedCornerShape(12.dp) Card( modifier = - Modifier.fillMaxWidth().border(1.dp, MaterialTheme.colorScheme.outline, shape).dropShadow( - shape = shape - ) { - radius = 0f - spread = 0f - offset = Offset(x = 4.dp.toPx(), y = 6.dp.toPx()) - color = Color(0xFF20290A) - }, + Modifier.fillMaxWidth() + .border( + if (placeholder.isError) 1.dp else 1.5.dp, + if (placeholder.isError) AdsBorderBrush else AdsLoadingBorderBrush, + shape, + ), shape = shape, colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceContainer), ) { @@ -576,13 +576,7 @@ fun VoiceNoteItem( modifier = Modifier.fillMaxWidth() .padding(bottom = 16.dp) - .border(1.dp, MaterialTheme.colorScheme.outline, shape) - .dropShadow(shape = shape) { - radius = 0f - spread = 0f - offset = Offset(x = 4.dp.toPx(), y = 6.dp.toPx()) - color = Color(0xFF20290A) - }, + .border(1.dp, AdsBorderBrush, shape), shape = shape, colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceContainer), ) { @@ -607,7 +601,7 @@ fun VoiceNoteItem( Surface( shape = CircleShape, color = MaterialTheme.colorScheme.surface, - border = BorderStroke(1.dp, Color(0xFF299EAF)), + border = BorderStroke(1.dp, AdsBorderBrush), modifier = Modifier.padding(bottom = 8.dp), ) { Text(