**Name:** `recharts` **Purpose:** Build responsive, readable charts with Recharts using correct data mapping and composition. Use this skill whenever creating charts with Recharts. **Applies when:** Using `LineChart`, `BarChart`, `AreaChart`, `PieChart`, `ResponsiveContainer`. **Do not use when:** Charts are not built with Recharts.
Scanned 6/6/2026
Install via CLI
openskills install Asymmetric-al/core# Recharts — Skill
**Name:** `recharts`
**Purpose:** Build responsive, readable charts with Recharts using correct data mapping and composition.
Use this skill whenever creating charts with Recharts.
**Applies when:** Using `LineChart`, `BarChart`, `AreaChart`, `PieChart`, `ResponsiveContainer`.
**Do not use when:** Charts are not built with Recharts.
## Rules
- **Always responsive:** Wrap charts in `ResponsiveContainer` and ensure a fixed height parent.
- **Explicit data model:** Normalize data and use stable `dataKey` values.
- **Pick the simplest chart:** Use `LineChart` for trends, `BarChart` for comparisons, `AreaChart` for cumulative/volume, `PieChart` for part-to-whole.
- **Interactivity:** Add `Tooltip`; add `Legend` when multiple series exist.
- **Performance:** Disable animation for large/static dashboards and reduce point count.
## Workflow
1. Define the data shape and stable keys.
2. Choose the simplest chart that answers the question.
3. Wrap in `ResponsiveContainer` with a height.
4. Add axes, tooltip, and legend as needed.
5. Disable animation or aggregate data for large sets.
## Checklists
### Implementation checklist
- [ ] Chart is wrapped in `ResponsiveContainer`
- [ ] X/Y axes are present when needed
- [ ] Tooltip shows correct units
- [ ] `dataKey` matches field names
### Review checklist
- [ ] Animations disabled for large datasets
- [ ] Colors are accessible
## Minimal examples
### Line chart (trend)
```tsx
import {
LineChart,
Line,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
Legend,
ResponsiveContainer,
} from "recharts";
export function SalesChart({
data,
}: {
data: Array<{ month: string; sales: number }>;
}) {
return (
<div style={{ height: 320 }}>
<ResponsiveContainer width="100%" height="100%">
<LineChart
data={data}
margin={{ top: 8, right: 16, bottom: 8, left: 8 }}
>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="month" />
<YAxis />
<Tooltip />
<Legend />
<Line type="monotone" dataKey="sales" dot={false} />
</LineChart>
</ResponsiveContainer>
</div>
);
}
```
### Custom tooltip
```tsx
type TooltipProps = {
active?: boolean;
label?: string;
payload?: Array<{ name?: string; value?: number | string }>;
};
export function CustomTooltip({ active, label, payload }: TooltipProps) {
if (!active || !payload?.length) return null;
return (
<div className="rounded-md border bg-white p-2 text-sm shadow">
<div className="font-medium">{label}</div>
<ul className="mt-1 space-y-0.5">
{payload.map((p, i) => (
<li key={i}>
{p.name}: {p.value}
</li>
))}
</ul>
</div>
);
}
```
## Common mistakes / pitfalls
- Missing `ResponsiveContainer` or fixed-height parent
- Mismatched `dataKey` values
- Over-animating large dashboards
- Rendering too many points without aggregation
No comments yet. Be the first to comment!