'use client'; import { useId } from 'react'; import { calculateNiceAxisMax, formatCompactNumber } from '@/lib/utils/metrics'; type TrendSeries = { label: string; color: string; values: number[]; fillColor?: string; variant?: 'line' | 'area'; valueFormatter?: (value: number) => string; }; function clamp(value: number, min: number, max: number) { return Math.min(Math.max(value, min), max); } function buildPath(points: Array<[number, number]>) { if (points.length === 0) { return ''; } return points .map(([x, y], index) => `${index === 0 ? 'M' : 'L'} ${x} ${y}`) .join(' '); } export function TrendChart({ labels, series, height = 240, yAxisValueFormatter = formatCompactNumber, }: { labels: string[]; series: TrendSeries[]; height?: number; yAxisValueFormatter?: (value: number) => string; }) { const chartId = useId(); const width = 720; const paddingTop = 18; const paddingRight = 18; const paddingBottom = 42; const paddingLeft = 54; const innerWidth = width - paddingLeft - paddingRight; const innerHeight = height - paddingTop - paddingBottom; const normalizedSeries = series.filter((entry) => entry.values.some((value) => Number.isFinite(value)), ); const pointCount = Math.max( labels.length, ...normalizedSeries.map((entry) => entry.values.length), 0, ); const allValues = normalizedSeries.flatMap((entry) => entry.values.filter((value) => Number.isFinite(value)), ); const axisMax = calculateNiceAxisMax(allValues); const yTicks = 4; if (normalizedSeries.length === 0 || pointCount === 0) { return (