diff --git a/packages/ui/src/components/chat/StatusRow.tsx b/packages/ui/src/components/chat/StatusRow.tsx index 66ecde5f..1159e822 100644 --- a/packages/ui/src/components/chat/StatusRow.tsx +++ b/packages/ui/src/components/chat/StatusRow.tsx @@ -306,13 +306,19 @@ export const StatusRow: React.FC = ({ return (
is running…" row sits flush against - // the message above. - className={cn("mb-1", isMobile && "mt-2", !hasLeftAccessory && "chat-column")} + // This row must land exactly where the assistant turn footer (mt-2 + // inside the message) appears when the turn completes. Measured against + // the live DOM: the gap ABOVE already matches (message pb-2 = footer + // mt-2 = 8px), but the chat is bottom-anchored and the finished message + // carries ~12px more structure BELOW its footer than this row has — so + // the swap used to lift the line up. mb-6 (24px) reserves that space + // under this row instead (verified: row top 636 == footer top 636). + className={cn("mb-6", !hasLeftAccessory && "chat-column")} style={STATUS_ROW_CONTAINER_STYLE} > -
+ {/* h-8 matches the turn footer's real row height: its h-8 action + buttons define the footer line, with the meta text centered in it. */} +
{/* Left: Abort status | Working placeholder | leftAccessory */}
{showAssistantStatus && showAbortStatus ? ( diff --git a/packages/ui/src/components/chat/message/parts/WorkingPlaceholder.tsx b/packages/ui/src/components/chat/message/parts/WorkingPlaceholder.tsx index 2a980448..9260cc51 100644 --- a/packages/ui/src/components/chat/message/parts/WorkingPlaceholder.tsx +++ b/packages/ui/src/components/chat/message/parts/WorkingPlaceholder.tsx @@ -229,15 +229,19 @@ export function WorkingPlaceholder({ return (
- + {hasProviderLogo && providerLogoSrc ? (