feat: modern message action icons — larger, distinctive
Icons swapped to more distinctive Lucide variants: - Copy → ClipboardCopy (clipboard with arrow, instantly recognizable) - Edit → SquarePen (filled square with pen, modern) - Regenerate → RotateCcw (single-arrow rotate, cleaner than RefreshCw) - Delete/Volume stay (already good) Size: 36dp touch target, 20dp icons (was 32/18). Tint alpha 0.50→0.55 for better visibility. Added ClipboardCopy, SquarePen, RotateCcw, PenLine to KaizenIcons registry.
This commit is contained in:
parent
8f72afd714
commit
b2df7e9330
2 changed files with 15 additions and 11 deletions
|
|
@ -531,11 +531,11 @@ fun MessageRow(
|
|||
if (!message.streaming) {
|
||||
Row(
|
||||
Modifier.padding(top = 6.dp, end = 4.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(2.dp),
|
||||
) {
|
||||
MessageActionButton(
|
||||
icon = if (copied) KaizenIcons.Check else KaizenIcons.Copy,
|
||||
tint = if (copied) Color(0xFF10B981) else cs.onSurfaceVariant.copy(alpha = 0.50f),
|
||||
icon = if (copied) KaizenIcons.Check else KaizenIcons.ClipboardCopy,
|
||||
tint = if (copied) Color(0xFF10B981) else cs.onSurfaceVariant.copy(alpha = 0.55f),
|
||||
) {
|
||||
haptics.tick()
|
||||
copied = true
|
||||
|
|
@ -547,7 +547,7 @@ fun MessageRow(
|
|||
}
|
||||
if (message.content.isNotBlank()) {
|
||||
onEdit?.let { edit ->
|
||||
MessageActionButton(KaizenIcons.Pencil, cs.onSurfaceVariant.copy(alpha = 0.50f)) {
|
||||
MessageActionButton(KaizenIcons.SquarePen, cs.onSurfaceVariant.copy(alpha = 0.55f)) {
|
||||
haptics.tick(); edit(message.wireId, message.content)
|
||||
}
|
||||
}
|
||||
|
|
@ -591,11 +591,11 @@ fun MessageRow(
|
|||
if (!message.streaming && !message.thinking && message.content.isNotBlank()) {
|
||||
Row(
|
||||
Modifier.padding(start = 38.dp, top = 6.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(2.dp),
|
||||
) {
|
||||
MessageActionButton(
|
||||
icon = if (copied) KaizenIcons.Check else KaizenIcons.Copy,
|
||||
tint = if (copied) Color(0xFF10B981) else cs.onSurfaceVariant.copy(alpha = 0.50f),
|
||||
icon = if (copied) KaizenIcons.Check else KaizenIcons.ClipboardCopy,
|
||||
tint = if (copied) Color(0xFF10B981) else cs.onSurfaceVariant.copy(alpha = 0.55f),
|
||||
) {
|
||||
haptics.tick()
|
||||
copied = true
|
||||
|
|
@ -608,13 +608,13 @@ fun MessageRow(
|
|||
onReadAloud?.let { readAloud ->
|
||||
MessageActionButton(
|
||||
icon = KaizenIcons.Volume2,
|
||||
tint = if (isPlayingTts) accent.primary else cs.onSurfaceVariant.copy(alpha = 0.50f),
|
||||
tint = if (isPlayingTts) accent.primary else cs.onSurfaceVariant.copy(alpha = 0.55f),
|
||||
) {
|
||||
haptics.tick(); readAloud(message.content)
|
||||
}
|
||||
}
|
||||
onRegenerate?.let { regen ->
|
||||
MessageActionButton(KaizenIcons.RefreshCw, cs.onSurfaceVariant.copy(alpha = 0.50f)) {
|
||||
MessageActionButton(KaizenIcons.RotateCcw, cs.onSurfaceVariant.copy(alpha = 0.55f)) {
|
||||
haptics.tick(); regen(message.wireId)
|
||||
}
|
||||
}
|
||||
|
|
@ -680,12 +680,12 @@ private fun VoiceWaveform(amplitude: Float) {
|
|||
private fun MessageActionButton(icon: ImageVector, tint: Color, onClick: () -> Unit) {
|
||||
Box(
|
||||
Modifier
|
||||
.size(32.dp)
|
||||
.size(36.dp)
|
||||
.clip(KaizenShapes.circle)
|
||||
.clickable(onClick = onClick),
|
||||
contentAlignment = Alignment.Center,
|
||||
) {
|
||||
Icon(icon, null, tint = tint, modifier = Modifier.size(18.dp))
|
||||
Icon(icon, null, tint = tint, modifier = Modifier.size(20.dp))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -49,13 +49,17 @@ object KaizenIcons {
|
|||
|
||||
// ── Conversation management ─────────────────────────────────────────────
|
||||
val Check: ImageVector get() = Lucide.Check
|
||||
val ClipboardCopy: ImageVector get() = Lucide.ClipboardCopy
|
||||
val Copy: ImageVector get() = Lucide.Copy
|
||||
val Lock: ImageVector get() = Lucide.Lock
|
||||
val LockOpen: ImageVector get() = Lucide.LockOpen
|
||||
val Pencil: ImageVector get() = Lucide.Pencil
|
||||
val PenLine: ImageVector get() = Lucide.PenLine
|
||||
val Pin: ImageVector get() = Lucide.Pin
|
||||
val PinOff: ImageVector get() = Lucide.PinOff
|
||||
val RefreshCw: ImageVector get() = Lucide.RefreshCw
|
||||
val RotateCcw: ImageVector get() = Lucide.RotateCcw
|
||||
val SquarePen: ImageVector get() = Lucide.SquarePen
|
||||
val Star: ImageVector get() = Lucide.Star
|
||||
val StarOff: ImageVector get() = Lucide.StarOff
|
||||
val Trash: ImageVector get() = Lucide.Trash2
|
||||
|
|
|
|||
Loading…
Reference in a new issue