fix(chat): completion is a pure visibility change — status inset never collapses mid-session

The barely-visible shift at end-of-stream was the reserved status-row
inset being released when the row unmounted. The measured overlay
height now only grows during a session and resets on session switch, so
the finished message's metadata footer appears exactly where the status
row was, with zero layout movement.
This commit is contained in:
Bohdan Triapitsyn
2026-08-25 11:20:52 +03:00
parent d1a6955273
commit 3ff3354168
@@ -932,6 +932,9 @@ export const ChatContainer: React.FC<ChatContainerProps> = ({
const [statusOverlayHeight, setStatusOverlayHeight] = React.useState(0);
const composerOverlayHeight = statusOverlayHeight;
const statusOverlayObserverRef = React.useRef<ResizeObserver | null>(null);
React.useEffect(() => {
setStatusOverlayHeight(0);
}, [currentSessionKey]);
const onStatusOverlayNode = React.useCallback((node: HTMLDivElement | null) => {
statusOverlayObserverRef.current?.disconnect();
statusOverlayObserverRef.current = null;
@@ -941,7 +944,10 @@ export const ChatContainer: React.FC<ChatContainerProps> = ({
}
const update = () => {
const height = node.getBoundingClientRect().height;
setStatusOverlayHeight((prev) => (Math.abs(prev - height) < 1 ? prev : height));
// Hold the reserved height when the status row empties: collapsing
// it at end-of-stream shifts the settled content. It resets only
// on session change.
setStatusOverlayHeight((prev) => (height > prev + 1 ? height : prev));
};
const observer = new ResizeObserver(update);
observer.observe(node);