From e4e21755f2ae5da30f7c6bda72d496d4de560412 Mon Sep 17 00:00:00 2001 From: Capucine Gest Date: Thu, 28 May 2026 23:04:07 +0200 Subject: [PATCH] fix: DriversBar tooltips via createPortal (bypass overflow-x-auto clipping) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le container overflow-x-auto clippait les tooltips positionnés en absolu. Nouveau composant TooltipLabel : calcule la position via getBoundingClientRect() et rend le tooltip dans document.body via createPortal — visible partout, indépendant de tout ancestor overflow. Ajout du petit cercle "i" à côté du label pour signaler la présence du tooltip. Co-Authored-By: Claude Sonnet 4.6 --- components/DriversBar.tsx | 74 +++++++++++++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/components/DriversBar.tsx b/components/DriversBar.tsx index 0460d4e..504262b 100644 --- a/components/DriversBar.tsx +++ b/components/DriversBar.tsx @@ -1,5 +1,7 @@ "use client"; +import { useState, useRef, useCallback } from "react"; +import { createPortal } from "react-dom"; import type { DriverData } from "@/lib/types"; interface Props { drivers: DriverData } @@ -24,6 +26,58 @@ function DeltaTag({ delta, pct = false, dec = 2 }: { delta: number | null; pct?: ); } +// ── Tooltip via portal (évite le clipping de overflow-x-auto) ───────────────── + +interface TooltipState { x: number; y: number } + +function TooltipLabel({ label, tooltip }: { label: string; tooltip: string }) { + const [tip, setTip] = useState(null); + const ref = useRef(null); + + const show = useCallback(() => { + if (!ref.current) return; + const r = ref.current.getBoundingClientRect(); + setTip({ x: r.left + r.width / 2, y: r.top }); + }, []); + + const hide = useCallback(() => setTip(null), []); + + return ( + <> + + {label} + + i + + + + {tip && typeof document !== "undefined" && createPortal( +
+ {tooltip} + {/* Flèche en bas */} + +
, + document.body, + )} + + ); +} + /** Un indicateur : label · valeur · delta — hauteur fixe garantie */ function M({ label, value, dec = 2, unit = "", delta, deltaPct, deltaDec, tooltip, @@ -37,23 +91,15 @@ function M({ deltaDec?: number; tooltip?: string; }) { - const labelNode = tooltip ? ( - - - {label} - - - {tooltip} - - - ) : ( - {label} - ); - return (
{/* Ligne 1 — label */} -
{labelNode}
+
+ {tooltip + ? + : {label} + } +
{/* Ligne 2 — valeur */}