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 */}