From c7f7d1dd4574e9b309c3e1d6dfb50930edb80daf Mon Sep 17 00:00:00 2001 From: M57 <41645758+Hy4ri@users.noreply.github.com> Date: Mon, 27 Jul 2026 15:42:57 +0300 Subject: [PATCH] fix(#728): resolve theme color leakage for agent chat bubbles (#730) Use MaterialTheme.colorScheme tokens for Assistant, System, and Tool bubbles so that all presets and dynamic colors render properly without theme bleed. --- .../java/com/m57/hermescontrol/theme/Color.kt | 2 +- .../m57/hermescontrol/ui/chat/ChatBubble.kt | 26 +++---------------- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/m57/hermescontrol/theme/Color.kt b/app/src/main/java/com/m57/hermescontrol/theme/Color.kt index aaf13edb..1807fcba 100644 --- a/app/src/main/java/com/m57/hermescontrol/theme/Color.kt +++ b/app/src/main/java/com/m57/hermescontrol/theme/Color.kt @@ -75,7 +75,7 @@ val StatusGrey = Color(0xFF9E9E9E) val StatusGreyDark = Color(0xFF1A1A24) val StatusGreyLight = Color(0xFFF5F5F5) -// ── Chat-specific colours (always brand-defined for consistency) ─────── +// ── Chat-specific colours (default theme fallback tokens) ───────────────── val AssistantBubble = Color(0xFF1C1C26) val AssistantBubbleLight = Color(0xFFEDEAF4) diff --git a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatBubble.kt b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatBubble.kt index b79c799f..52760662 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatBubble.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatBubble.kt @@ -82,15 +82,10 @@ import coil.compose.AsyncImage import com.m57.hermescontrol.R import com.m57.hermescontrol.data.model.Attachment import com.m57.hermescontrol.data.remote.OkHttpProvider -import com.m57.hermescontrol.theme.AssistantBubble -import com.m57.hermescontrol.theme.AssistantBubbleLight import com.m57.hermescontrol.theme.DarkOnSurface import com.m57.hermescontrol.theme.HermesStatusColors import com.m57.hermescontrol.theme.LightOnSurface import com.m57.hermescontrol.theme.LocalHermesStatusColors -import com.m57.hermescontrol.theme.SystemMessageColor -import com.m57.hermescontrol.theme.ToolChipColor -import com.m57.hermescontrol.theme.ToolChipColorLight import com.m57.hermescontrol.theme.onColorFor import com.m57.hermescontrol.ui.chat.components.ReasoningCard import kotlinx.coroutines.delay @@ -345,21 +340,8 @@ private fun AssistantBubble( onImageClick: (ImageViewerModel) -> Unit = {}, modifier: Modifier = Modifier, ) { - val bubbleColor = if (isDarkTheme) AssistantBubble else AssistantBubbleLight - val textColor = - if (bubbleColor.luminance() > 0.5f) { - if (MaterialTheme.colorScheme.onSurface.luminance() < 0.5f) { - MaterialTheme.colorScheme.onSurface - } else { - LightOnSurface - } - } else { - if (MaterialTheme.colorScheme.onSurface.luminance() > 0.5f) { - MaterialTheme.colorScheme.onSurface - } else { - DarkOnSurface - } - } + val bubbleColor = MaterialTheme.colorScheme.surfaceVariant + val textColor = MaterialTheme.colorScheme.onSurfaceVariant val clipboard = LocalClipboard.current val scope = rememberCoroutineScope() var showCopyButton by remember { mutableStateOf(false) } @@ -508,7 +490,7 @@ private fun SystemBubble( style = MaterialTheme.typography.bodySmall.copy( fontStyle = FontStyle.Italic, - color = SystemMessageColor, + color = MaterialTheme.colorScheme.onSurfaceVariant, ), ) @@ -1925,7 +1907,7 @@ private fun ToolBubble( ) { var expanded by remember { mutableStateOf(false) } var showRawJson by remember { mutableStateOf(false) } - val chipColor = if (isDarkTheme) ToolChipColor else ToolChipColorLight + val chipColor = MaterialTheme.colorScheme.surfaceContainerHigh val contentColor = MaterialTheme.colorScheme.onSurfaceVariant val statusColors = LocalHermesStatusColors.current