diff --git a/frontend/packages/swarm-ui/src/ui/popover/Popover.tsx b/frontend/packages/swarm-ui/src/ui/popover/Popover.tsx index 3bc5d1e9..1f86b735 100644 --- a/frontend/packages/swarm-ui/src/ui/popover/Popover.tsx +++ b/frontend/packages/swarm-ui/src/ui/popover/Popover.tsx @@ -54,10 +54,13 @@ export function Popover({ const r = anchor.getBoundingClientRect(); const width = ref.current?.offsetWidth ?? 0; const maxLeft = window.innerWidth - width - EDGE_PX; - setPos({ - top: r.bottom + GAP_PX, - left: Math.max(EDGE_PX, Math.min(r.left, maxLeft)), - }); + const top = r.bottom + GAP_PX; + const left = Math.max(EDGE_PX, Math.min(r.left, maxLeft)); + // Scrolling anywhere (the streaming terminal included) calls this; keep + // the old object when nothing moved so the subtree does not re-render. + setPos((prev) => + prev && prev.top === top && prev.left === left ? prev : { top, left }, + ); } place(); window.addEventListener("scroll", place, true);