--- name: recharts-patterns description: Data visualization with Recharts 3.x including responsive charts, custom tooltips, animations, and accessibility for React applications. Use when building charts or dashboards with Recharts. tags: [recharts, charts, data-visualization, react, svg, accessibility, responsive, d3] context: fork agent: frontend-ui-developer version: 1.0.0 author: OrchestKit user-invocable: false --- # Recharts Patterns Data visualization patterns using Recharts 3.x - a composable charting library built with React and D3. ## Core Chart Types ### Line Chart ```tsx import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'; const data = [ { date: '2024-01', revenue: 4000, expenses: 2400 }, { date: '2024-02', revenue: 3000, expenses: 1398 }, ]; function RevenueChart() { return ( ); } ``` ### Bar Chart ```tsx import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'; function SalesChart({ data }: { data: SalesData[] }) { return ( ); } ``` ### Pie/Donut Chart ```tsx import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip, Legend } from 'recharts'; const COLORS = ['#0088FE', '#00C49F', '#FFBB28', '#FF8042']; function DeviceChart({ data }: { data: { name: string; value: number }[] }) { return ( `${name} ${(percent * 100).toFixed(0)}%`} > {data.map((entry, index) => ( ))} ); } ``` ### Area Chart with Gradient ```tsx function TrafficChart({ data }: { data: TrafficData[] }) { return ( ); } ``` ## Custom Tooltip ```tsx import { TooltipProps } from 'recharts'; function CustomTooltip({ active, payload, label }: TooltipProps) { if (!active || !payload?.length) return null; return (

{label}

{payload.map((entry) => (

{entry.name}: {entry.value?.toLocaleString()}

))}
); } // Usage: } /> ``` ## Accessibility ```tsx function AccessibleChart({ data }: { data: ChartData[] }) { return (
`$${value.toLocaleString()}`} />
Line chart showing monthly revenue
); } ``` ## Real-Time Updates ```tsx function RealTimeChart() { const { data } = useQuery({ queryKey: ['metrics'], queryFn: fetchMetrics, refetchInterval: 5000, }); if (!data) return ; return ( ); } ``` ## Performance Tips ```tsx // Limit data points for smooth rendering const MAX_POINTS = 500; const chartData = data.slice(-MAX_POINTS); // Use dot={false} for many data points // Memoize expensive calculations const processedData = useMemo(() => processChartData(rawData), [rawData]); // Disable animation for real-time ``` ## Anti-Patterns (FORBIDDEN) ```tsx // NEVER: ResponsiveContainer without parent dimensions
{/* No height! */} {/* Won't work */}
// NEVER: Fixed dimensions on ResponsiveContainer // NEVER: Animations on real-time charts (causes jank) // NEVER: Inline data definition in render (new array every render) // NEVER: Too many data points without limiting (performance issue) ``` ## Key Decisions | Decision | Recommendation | |----------|----------------| | Container | **ResponsiveContainer** always | | Animation | **Disabled** for real-time data | | Tooltip | **Custom** for branded UX | | Data updates | **Sliding window** for time-series | ## Related Skills - `dashboard-patterns` - Dashboard layouts with charts - `tanstack-query-advanced` - Data fetching for charts - `a11y-testing` - Testing chart accessibility