diff --git a/src/components/ChatMessage.tsx b/src/components/ChatMessage.tsx index 534d2c9..e4278c8 100644 --- a/src/components/ChatMessage.tsx +++ b/src/components/ChatMessage.tsx @@ -312,27 +312,6 @@ function InternalOnlyMessage({ message }: { message: ChatMessageType }) { ); } -function CopyButton({ text }: { text: string }) { - const [copied, setCopied] = useState(false); - const handleCopy = useCallback(() => { - navigator.clipboard.writeText(text).then(() => { - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }); - }, [text]); - - return ( - - {copied ? : } - - ); -} - function MetadataViewer({ metadata }: { metadata?: Record }) { const [open, setOpen] = useState(false); const btnRef = useRef(null); @@ -529,29 +508,36 @@ export const ChatMessageComponent = memo(function ChatMessageComponent({ message : 'bg-[rgba(var(--pc-accent-rgb),0.08)] text-pc-text border border-[rgba(var(--pc-accent-rgb),0.2)]') : 'bg-pc-elevated/40 text-pc-text border border-pc-border shadow-[0_0_0_1px_rgba(255,255,255,0.03)]' }`}> - {/* Action buttons */} - {!isUser && !message.isStreaming && getPlainText(message).trim() && ( - - )} - + {/* Action buttons — bottom-right toolbar, inside the bubble */} + + {!isUser && !message.isStreaming && getPlainText(message).trim() && ( + { navigator.clipboard.writeText(getPlainText(message)); }} + className="h-6 w-6 rounded-md flex items-center justify-center text-pc-text-faint hover:text-pc-accent-light transition-colors" + title={t('message.copy')} + aria-label={t('message.copy')} + > + + + )} {onReply && ( { e.stopPropagation(); onReply(getPlainText(message).slice(0, 120)); }} - className="h-7 w-7 rounded-lg border border-pc-border bg-pc-elevated/80 backdrop-blur-sm flex items-center justify-center text-pc-text-secondary hover:text-pc-accent-light hover:border-[var(--pc-accent-dim)] transition-all" + className="h-6 w-6 rounded-md flex items-center justify-center text-pc-text-faint hover:text-pc-accent-light transition-colors" title={t('message.reply')} aria-label={t('message.reply')} > - + )} {onToggleBookmark && ( { e.stopPropagation(); onToggleBookmark(); }} - className={`h-7 w-7 rounded-lg border border-pc-border bg-pc-elevated/80 backdrop-blur-sm flex items-center justify-center transition-all ${isBookmarked ? 'text-amber-400 opacity-100' : 'text-pc-text-secondary hover:text-amber-400'}`} + className={`h-6 w-6 rounded-md flex items-center justify-center transition-colors ${isBookmarked ? 'text-amber-400' : 'text-pc-text-faint hover:text-amber-400'}`} title={isBookmarked ? t('message.removeBookmark') : t('message.bookmark')} aria-label={isBookmarked ? t('message.removeBookmark') : t('message.bookmark')} > - + )}