diff --git a/app/src/main/java/app/closer/ui/settings/SettingsScreen.kt b/app/src/main/java/app/closer/ui/settings/SettingsScreen.kt index ff0a8837..095b8b4e 100644 --- a/app/src/main/java/app/closer/ui/settings/SettingsScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/SettingsScreen.kt @@ -355,17 +355,24 @@ fun SettingsScreen( } } - // Partner card — fully tappable, visually obvious + // Partner card — fully tappable, and deliberately tinted so it reads as the one + // relationship row rather than another settings row. + // The tint must be a near-opaque container: the page behind is a gradient brush, so + // a see-through card (this was `primaryContainer` at 52%) lets that gradient bleed + // up and the card renders muddy — and its own inner content bounds show as a paler + // band against it. The sibling profile card directly above is 96% and never does + // this. Content colours are the container's `on*` pair so contrast is correct in + // both themes rather than borrowed from the page's ink. val partnerCardColor = if (state.isPaired) { - SettingsSoft.copy(alpha = 0.52f) + MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.96f) } else if (isCloserDarkTheme()) { - MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.74f) + MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.96f) } else { - MaterialTheme.colorScheme.secondaryContainer.copy(alpha = 0.46f) + MaterialTheme.colorScheme.secondaryContainer.copy(alpha = 0.96f) } - val partnerAccent = if (state.isPaired) SettingsPrimaryDeep else MaterialTheme.colorScheme.secondary - val partnerContentColor = if (state.isPaired) SettingsInk else MaterialTheme.colorScheme.onSecondaryContainer - val partnerMutedColor = if (state.isPaired) SettingsMuted else MaterialTheme.colorScheme.onSecondaryContainer.copy(alpha = 0.72f) + val partnerAccent = if (state.isPaired) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.secondary + val partnerContentColor = if (state.isPaired) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSecondaryContainer + val partnerMutedColor = if (state.isPaired) MaterialTheme.colorScheme.onPrimaryContainer.copy(alpha = 0.72f) else MaterialTheme.colorScheme.onSecondaryContainer.copy(alpha = 0.72f) Card( onClick = { onNavigate( @@ -386,11 +393,16 @@ fun SettingsScreen( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(12.dp) ) { - if (state.isPaired) { + // A real partner photo shows as the avatar; otherwise fall back to the same + // 48dp tile + 24dp glyph the unpaired state and every settings row use. + // ProfileAvatar's own fallback is a bare 40dp icon with no container, which + // left the paired state showing an outsized naked heart unlike anything + // else on the page. + if (state.isPaired && !state.partnerPhotoUrl.isNullOrBlank()) { ProfileAvatar( imageUrl = state.partnerPhotoUrl, fallbackIcon = CloserGlyphs.Heart, - fallbackTint = SettingsPrimaryDeep + fallbackTint = partnerAccent ) } else { Box( @@ -401,7 +413,7 @@ fun SettingsScreen( contentAlignment = Alignment.Center ) { Icon( - CloserGlyphs.HeartOutline, + if (state.isPaired) CloserGlyphs.Heart else CloserGlyphs.HeartOutline, contentDescription = null, tint = partnerAccent, modifier = Modifier.size(24.dp)