feat: Compact transparent tool cards with grouped assistant messages

- Redesign all tool cards (Edit, Read, Bash, Grep, Glob, Write) to be
  compact single-line headers with inline key info and toggle buttons
- Make cards and bubbles fully transparent with subtle color tints
- Remove borders, use only left accent bar per card type
- Color-code numbers: red for removals, green for additions/counts
- Simplify ToolResultBlock to render content directly without toggle
- Group consecutive assistant messages, showing header only on first
- Remove borders from assistant and user message bubbles
This commit is contained in:
2026-02-19 03:12:17 -06:00
parent 4ab1d03370
commit 06b48ebda3
12 changed files with 868 additions and 1072 deletions

View File

@@ -208,11 +208,12 @@ function formatDuration(start: string, end: string): string {
</div>
<div ref="scrollContainer" class="messages-scroll">
<div
v-for="msg in conversation.messages"
v-for="(msg, idx) in conversation.messages"
:key="msg.uuid"
:class="['message-wrapper', {
resolved: resolvedUuids.has(msg.uuid),
selected: selectedUuids.has(msg.uuid)
selected: selectedUuids.has(msg.uuid),
'assistant-continuation': msg.kind === 'assistant' && idx > 0 && conversation.messages[idx - 1].kind === 'assistant'
}]"
>
<!-- Select checkbox -->
@@ -227,7 +228,7 @@ function formatDuration(start: string, end: string): string {
</svg>
</button>
<div :class="['message-content', { selectable: selectMode && msg.kind !== 'progress' }]" @click="selectMode && msg.kind !== 'progress' ? toggleSelect(msg.uuid) : undefined">
<div :class="['message-content', { selectable: selectMode && msg.kind !== 'progress' }]" @click="selectMode && msg.kind !== 'progress' && toggleSelect(msg.uuid)">
<UserMessageBubble
v-if="msg.kind === 'user'"
:message="msg"
@@ -235,6 +236,7 @@ function formatDuration(start: string, end: string): string {
<AssistantMessageBubble
v-else-if="msg.kind === 'assistant'"
:message="msg"
:show-header="!(idx > 0 && conversation.messages[idx - 1].kind === 'assistant')"
/>
<ProgressEvent
v-else-if="msg.kind === 'progress'"
@@ -448,6 +450,11 @@ function formatDuration(start: string, end: string): string {
padding: 0.25rem 0.4rem;
}
/* Consecutive assistant messages: tighter spacing */
.message-wrapper.assistant-continuation {
margin-top: -0.5rem;
}
/* Messages that replaced an optimistic one: smooth settle instead of bounce */
.message-wrapper.resolved {
animation: resolveIn 0.3s ease-out;