import React from "react"; import type { ViewportTransform } from "./types"; interface GraphTooltipProps { modelX: number; modelY: number; screenX: number; screenY: number; viewport: ViewportTransform; evaluator?: (x: number, y: number) => { label: string; value: string }[]; } export const GraphTooltip: React.FC = ({ modelX, modelY, screenX, screenY, viewport, evaluator, }) => { const extraItems = evaluator ? evaluator(modelX, modelY) : []; const boxWidth = 148; const boxHeight = 32 + extraItems.length * 18; // Place tooltip slightly offset from cursor, flipping if near edges let tipX = screenX + 14; if (tipX + boxWidth > viewport.width - 12) { tipX = screenX - boxWidth - 14; } let tipY = screenY - boxHeight - 12; if (tipY < viewport.padding.top) { tipY = screenY + 14; } const plotLeft = viewport.padding.left; const plotRight = viewport.width - viewport.padding.right; const plotTop = viewport.padding.top; const plotBottom = viewport.height - viewport.padding.bottom; return ( {/* Crosshair lines within plot area */} {/* Tooltip Card */} {/* Primary coordinates */} {`X: ${modelX.toFixed(2)} • Y: ${modelY.toFixed(2)}`} {/* Extra evaluated metrics */} {extraItems.map((item, idx) => ( {item.label}: {item.value} ))} ); };