diff --git a/app/src/main/java/dev/kaizen/app/chat/ChatComponents.kt b/app/src/main/java/dev/kaizen/app/chat/ChatComponents.kt index 7558350..1c22a52 100644 --- a/app/src/main/java/dev/kaizen/app/chat/ChatComponents.kt +++ b/app/src/main/java/dev/kaizen/app/chat/ChatComponents.kt @@ -575,23 +575,30 @@ fun ChatInput( Row(verticalAlignment = Alignment.CenterVertically) { Box( - Modifier.size(40.dp).clip(KaizenShapes.circle).background(iconBg).clickable(onClick = onAddClick), + Modifier.size(38.dp).clip(KaizenShapes.circle).background(iconBg).clickable(onClick = onAddClick), contentAlignment = Alignment.Center, ) { - Icon(KaizenIcons.Plus, stringResource(R.string.chat_attachment), tint = cs.onSurfaceVariant, modifier = Modifier.size(20.dp)) + Icon(KaizenIcons.Plus, stringResource(R.string.chat_attachment), tint = cs.onSurfaceVariant, modifier = Modifier.size(19.dp)) } Spacer(Modifier.width(8.dp)) Box( - Modifier.size(40.dp).clip(KaizenShapes.circle).background(iconBg), + Modifier.size(38.dp).clip(KaizenShapes.circle).background(iconBg), contentAlignment = Alignment.Center, ) { - Icon(KaizenIcons.Mic, stringResource(R.string.chat_call), tint = cs.onSurfaceVariant, modifier = Modifier.size(20.dp)) + Icon(KaizenIcons.Mic, stringResource(R.string.chat_attachment), tint = cs.onSurfaceVariant, modifier = Modifier.size(19.dp)) } Spacer(Modifier.weight(1f)) if (hasContent) { SendButton(enabled = canSend, onClick = onSend) + } else { + Box( + Modifier.size(38.dp).clip(KaizenShapes.circle).background(iconBg), + contentAlignment = Alignment.Center, + ) { + Icon(KaizenIcons.AudioLines, stringResource(R.string.chat_call), tint = cs.onSurfaceVariant, modifier = Modifier.size(19.dp)) + } } } } @@ -643,20 +650,31 @@ private fun PendingFileChip(pf: PendingFile, onRemove: () -> Unit) { @Composable private fun SendButton(enabled: Boolean, onClick: () -> Unit) { val cs = MaterialTheme.colorScheme + val isDark = isSystemInDarkTheme() val interaction = remember { MutableInteractionSource() } val pressed by interaction.collectIsPressedAsState() - val pressScale by animateFloatAsState(if (pressed) 0.86f else 1f, label = "send") + val pressScale by animateFloatAsState(if (pressed) 0.88f else 1f, label = "send") val accent = LocalKaizenAccent.current - val fill = if (enabled) Modifier.background(Brush.linearGradient(listOf(accent.primary, accent.primaryDeep))) - else Modifier.background(cs.surface) + + val fill = if (enabled) { + Modifier.background( + Brush.verticalGradient( + listOf( + accent.primary.copy(alpha = if (isDark) 0.85f else 0.80f), + accent.primaryDeep.copy(alpha = if (isDark) 0.90f else 0.85f), + ) + ) + ) + } else { + Modifier.background(cs.surfaceVariant.copy(alpha = 0.5f)) + } Box( - Modifier.size(44.dp).scale(pressScale).clip(KaizenShapes.circle).then(fill) - .border(1.dp, cs.outline, KaizenShapes.circle) + Modifier.size(38.dp).scale(pressScale).clip(KaizenShapes.circle).then(fill) .clickable(interactionSource = interaction, indication = null, enabled = enabled, onClick = onClick), contentAlignment = Alignment.Center, ) { - SendArrow(color = if (enabled) accent.onPrimary else cs.onSurfaceVariant) + SendArrow(color = if (enabled) accent.onPrimary else cs.onSurfaceVariant.copy(alpha = 0.5f)) } } diff --git a/app/src/main/java/dev/kaizen/app/ui/icon/KaizenIcons.kt b/app/src/main/java/dev/kaizen/app/ui/icon/KaizenIcons.kt index 32b0106..bff6107 100644 --- a/app/src/main/java/dev/kaizen/app/ui/icon/KaizenIcons.kt +++ b/app/src/main/java/dev/kaizen/app/ui/icon/KaizenIcons.kt @@ -31,6 +31,7 @@ object KaizenIcons { // ── Chat ──────────────────────────────────────────────────────────────── val Mic: ImageVector get() = Lucide.Mic val Paperclip: ImageVector get() = Lucide.Paperclip + val AudioLines: ImageVector get() = Lucide.AudioLines val Plus: ImageVector get() = Lucide.Plus val Send: ImageVector get() = Lucide.SendHorizontal val Sparkles: ImageVector get() = Lucide.Sparkles