"use client"; import { useEffect, useId, useRef, useState } from "react"; import { PARAM_HELP, ParamKey } from "./paramHelpContent"; import { useParamHelp } from "./ParamHelpProvider"; interface Props { paramKey: ParamKey; label?: string; } /** * "?" trigger for a Parameters help entry. * * - Hover / focus shows the SHORT one-liner as a small popover tooltip * (same look-and-feel as the existing InfoTip). * - Click opens the rich detailed modal via ParamHelpProvider. * * On modal close, focus returns to this button. */ export default function ParamHelp({ paramKey, label }: Props) { const [tipOpen, setTipOpen] = useState(false); const wrapperRef = useRef(null); const buttonRef = useRef(null); const tooltipId = useId(); const meta = PARAM_HELP[paramKey]; const { open } = useParamHelp(); useEffect(() => { if (!tipOpen) return; function onDown(e: MouseEvent | TouchEvent) { if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) { setTipOpen(false); } } function onKey(e: KeyboardEvent) { if (e.key === "Escape") setTipOpen(false); } document.addEventListener("mousedown", onDown); document.addEventListener("touchstart", onDown); document.addEventListener("keydown", onKey); return () => { document.removeEventListener("mousedown", onDown); document.removeEventListener("touchstart", onDown); document.removeEventListener("keydown", onKey); }; }, [tipOpen]); return ( setTipOpen(true)} onMouseLeave={() => setTipOpen(false)} > {tipOpen && ( {meta.short} click for details )} ); }