From 257721280fec7406407fefc5be4c7a1d2ddbbb3c Mon Sep 17 00:00:00 2001 From: majiayu000 Date: Thu, 25 Dec 2025 11:35:37 +0800 Subject: [PATCH] fix: resolve WebUI tooltips not rendering due to overflow clipping Use position: fixed and getBoundingClientRect() to calculate tooltip position dynamically. This prevents tooltips from being clipped by parent containers with overflow: hidden (such as slide transitions). Closes #1790 Signed-off-by: majiayu000 --- .../lib/components/ui/tooltip/Tooltip.svelte | 62 ++++++++++++----- .../lib/components/ui/tooltip/Tooltip.test.ts | 67 +++++++++++++++++++ 2 files changed, 111 insertions(+), 18 deletions(-) create mode 100644 web/src/lib/components/ui/tooltip/Tooltip.test.ts diff --git a/web/src/lib/components/ui/tooltip/Tooltip.svelte b/web/src/lib/components/ui/tooltip/Tooltip.svelte index 59567e1d..e425aa1b 100644 --- a/web/src/lib/components/ui/tooltip/Tooltip.svelte +++ b/web/src/lib/components/ui/tooltip/Tooltip.svelte @@ -3,9 +3,42 @@ export let position: 'top' | 'bottom' | 'left' | 'right' = 'top'; let tooltipVisible = false; - let tooltipElement: HTMLDivElement; + let triggerElement: HTMLDivElement; + let tooltipStyle = ''; + + function calculatePosition() { + if (!triggerElement) return; + + const rect = triggerElement.getBoundingClientRect(); + const gap = 8; + + let top = 0; + let left = 0; + + switch (position) { + case 'top': + top = rect.top - gap; + left = rect.left + rect.width / 2; + break; + case 'bottom': + top = rect.bottom + gap; + left = rect.left + rect.width / 2; + break; + case 'left': + top = rect.top + rect.height / 2; + left = rect.left - gap; + break; + case 'right': + top = rect.top + rect.height / 2; + left = rect.right + gap; + break; + } + + tooltipStyle = `top: ${top}px; left: ${left}px;`; + } function showTooltip() { + calculatePosition(); tooltipVisible = true; } @@ -16,7 +49,8 @@
-
- + {#if tooltipVisible}