"use client"; import * as React from "react"; export interface TooltipEntry { name?: string | number; value?: number | string | ReadonlyArray; color?: string; fill?: string; dataKey?: string | number; payload?: Record; } export interface ChartTooltipProps { active?: boolean; payload?: ReadonlyArray; label?: unknown; /** Format the heading (bucket label). */ labelFormatter?: (label: unknown, payload: ReadonlyArray) => React.ReactNode; /** Format a series value. */ valueFormatter?: (value: number, entry: TooltipEntry) => React.ReactNode; /** Optional display names per dataKey. */ names?: Record; /** Extra footer line (e.g. total). */ footer?: (payload: ReadonlyArray) => React.ReactNode; } /** Theme-matched tooltip body; recharts clones it with `active`, `payload` and `label`. */ export function ChartTooltip({ active, payload, label, labelFormatter, valueFormatter, names, footer }: ChartTooltipProps) { if (!active || !payload || payload.length === 0) return null; const rows = payload.filter((p) => p.value !== undefined && p.value !== null); if (!rows.length) return null; return (
{labelFormatter ? labelFormatter(label, payload) : String(label ?? "")}
    {rows.map((p, i) => { const key = String(p.dataKey ?? p.name ?? i); const raw = Array.isArray(p.value) ? Number(p.value[0]) : Number(p.value); return (
  • {names?.[key] ?? String(p.name ?? key)} {valueFormatter ? valueFormatter(raw, p) : Number.isFinite(raw) ? raw.toLocaleString("en-US") : "—"}
  • ); })}
{footer ?
{footer(payload)}
: null}
); }