From eb63675761d8ee2b8766ecdfa7fe53d02fab7f54 Mon Sep 17 00:00:00 2001 From: Nicolas Varrot Date: Sun, 15 Feb 2026 17:58:27 +0000 Subject: [PATCH] fix: move action buttons below content to prevent overlap on short messages (v1.63.4) --- src/components/ChatMessage.tsx | 92 +++++++++++++++++----------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src/components/ChatMessage.tsx b/src/components/ChatMessage.tsx index 863fcca..435cd94 100644 --- a/src/components/ChatMessage.tsx +++ b/src/components/ChatMessage.tsx @@ -501,13 +501,58 @@ export const ChatMessageComponent = memo(function ChatMessageComponent({ message {/* Bubble */}
-
+ {/* User-visible text */} + {!isUser ? ( + + {message.blocks.length > 0 ? renderTextBlocks(message.blocks) : ( +
+ + {autoFormatText(message.content)} + +
+ )} +
+ ) : ( + message.blocks.length > 0 ? renderTextBlocks(message.blocks) : ( +
+ + {autoFormatText(message.content)} + +
+ ) + )} + + {/* Inline images */} + {renderImageBlocks(message.blocks)} + + {/* Streaming indicator */} + {message.isStreaming && (() => { + const hasVisibleContent = message.content?.trim(); + if (!hasVisibleContent) { + return ; + } + return ( +
+ + + +
+ ); + })()} + + {/* Tool calls & thinking (inline) */} + {!isUser && } + + {/* Raw JSON viewer */} + {showRawJson && } + {/* Action buttons — bottom-right toolbar, inside the bubble */}
{!isUser && !message.isStreaming && getPlainText(message).trim() && ( @@ -553,51 +598,6 @@ export const ChatMessageComponent = memo(function ChatMessageComponent({ message setShowRawJson(o => !o)} />
- {/* Retry button moved into the action toolbar below */} - {/* User-visible text */} - {!isUser ? ( - - {message.blocks.length > 0 ? renderTextBlocks(message.blocks) : ( -
- - {autoFormatText(message.content)} - -
- )} -
- ) : ( - message.blocks.length > 0 ? renderTextBlocks(message.blocks) : ( -
- - {autoFormatText(message.content)} - -
- ) - )} - - {/* Inline images */} - {renderImageBlocks(message.blocks)} - - {/* Streaming indicator */} - {message.isStreaming && (() => { - const hasVisibleContent = message.content?.trim(); - if (!hasVisibleContent) { - return ; - } - return ( -
- - - -
- ); - })()} - - {/* Tool calls & thinking (inline) */} - {!isUser && } - - {/* Raw JSON viewer */} - {showRawJson && }
{(message.timestamp || wasWebhookMessage || isBookmarked) && (