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; }