import * as React from 'react' import { Bar, BarChart, Line, LineChart, ResponsiveContainer, Tooltip, XAxis } from 'recharts' import type { ChartProps } from '../types' import { Container } from './container' import { Empty } from './empty' import { Heading } from './heading' const chartStrokeColors = ['#F6C750', '#E63525', '#050D4C', '#D4EBEE', '#74B06F'] // Tooltip style objects use CSS variables so they automatically match light/dark mode const tooltipContentStyle = { background: 'var(--background)', border: '1px solid var(--border)', borderRadius: 4, color: 'var(--foreground)', fontSize: 12 } as const const tooltipItemStyle = { color: 'var(--foreground)' } as const const tooltipLabelStyle = { color: 'var(--foreground)', fontWeight: 600 } as const export const Chart = ({ data, title, variant = 'line', height = 200, width = 400 }: ChartProps): React.ReactElement => { // Transform data for Recharts const transformedData = React.useMemo( () => data.map(point => ({ x: point.x, ...Object.fromEntries(point.y.map(metric => [metric.series, metric.value])) })), [data] ) const seriesNames = React.useMemo( () => Array.from(new Set(data.flatMap(point => point.y.map(metric => metric.series)))), [data] ) const renderChart = (): React.ReactNode => { if (!transformedData.length) { return } switch (variant) { case 'line': { return (
{seriesNames.map((series, index) => { const color = chartStrokeColors[index % chartStrokeColors.length] return ( ) })}
) } case 'bar': { return (
{seriesNames.map((series, index) => { const color = chartStrokeColors[index % chartStrokeColors.length] return })}
) } default: return } } return ( {title && {title}} {renderChart()} ) } Chart.displayName = 'Chart'