---
name: asymmetric-al/rechart
source: https://app.decimal.ai/s/asymmetric-al-rechart@1/SKILL.md
source_sha256: b8248d57efa0
---

# 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