diff --git a/src/renderer/src/ChatTimeline.test.tsx b/src/renderer/src/ChatTimeline.test.tsx
index 52c7131f..1c3a6547 100644
--- a/src/renderer/src/ChatTimeline.test.tsx
+++ b/src/renderer/src/ChatTimeline.test.tsx
@@ -74,6 +74,40 @@ describe('ChatTimeline', () => {
expect(rule).not.toContain('contain-intrinsic')
})
+ it('places message identity above the message body', () => {
+ const messages: Message[] = [
+ {
+ id: 'assistant-message',
+ role: 'assistant',
+ content: 'Answer',
+ createdAt: 1_775_000_000_000,
+ state: 'complete'
+ }
+ ]
+ const { container } = render(
+
+ )
+
+ const message = container.querySelector('.message')
+ const header = message?.querySelector('.message__header')
+ const body = message?.querySelector('.message__body')
+
+ expect(header).toContainElement(message?.querySelector('.message__avatar') ?? null)
+ expect(header).toContainElement(message?.querySelector('.message__meta') ?? null)
+ expect(Array.from(message?.children ?? [])).toEqual([header, body])
+ })
+
it('enables HTML rendering only for completed Agent output', () => {
const messages: Message[] = [
{
diff --git a/src/renderer/src/ChatTimeline.tsx b/src/renderer/src/ChatTimeline.tsx
index 5cab806d..65d77670 100644
--- a/src/renderer/src/ChatTimeline.tsx
+++ b/src/renderer/src/ChatTimeline.tsx
@@ -532,14 +532,14 @@ function ChatMessageRowView({
ref={(element) => onArticleRef(message.id, element)}
tabIndex={-1}
>
-
- {message.role === 'assistant' ? (
-
- ) : (
-
- )}
-
-
+
+
+ {message.role === 'assistant' ? (
+
+ ) : (
+
+ )}
+
{message.role === 'assistant' ? 'GoodBuddy' : t('chat.user')}
@@ -557,6 +557,8 @@ function ChatMessageRowView({
)}
{formatTime(message.createdAt, locale)}
+
+
{message.attachments && message.attachments.length > 0 && (
svg {
}
.message {
- display: grid;
+ display: flex;
min-width: 0;
padding: 17px 8px;
- gap: 12px;
- grid-template-columns: 30px minmax(0, 1fr);
+ flex-direction: column;
+ gap: 8px;
}
-.message--user {
- grid-template-columns: minmax(0, 1fr) 30px;
+.message__header {
+ display: flex;
+ min-width: 0;
+ align-items: center;
+ gap: 12px;
+}
+
+.message--user .message__header {
+ width: min(78%, 720px);
+ align-self: flex-end;
+ flex-direction: row-reverse;
}
.route-loading-status {
@@ -5374,6 +5383,7 @@ button > svg {
.message__avatar {
display: grid;
+ flex: 0 0 auto;
width: 29px;
height: 29px;
place-items: center;
@@ -5384,8 +5394,6 @@ button > svg {
}
.message--user .message__avatar {
- grid-column: 2;
- grid-row: 1;
border-color: var(--accent-selected);
background: var(--accent-subtle);
color: var(--accent);
@@ -5398,15 +5406,13 @@ button > svg {
.message--user .message__body {
width: min(78%, 720px);
- grid-column: 1;
- grid-row: 1;
- justify-self: end;
+ align-self: flex-end;
}
.message__meta {
display: flex;
+ min-width: 0;
align-items: center;
- margin: 1px 0 8px;
gap: 8px;
}