From 5c155800605243693a1e0a50d6cb0a4e3f89191e Mon Sep 17 00:00:00 2001 From: iris Date: Mon, 12 Oct 2026 00:21:38 +0200 Subject: [PATCH] swarm-ui: popover keeps its position object when a scroll moved nothing --- frontend/packages/swarm-ui/src/ui/popover/Popover.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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);