home / skills / hoodini / ai-agents-skills / analytics-metrics
This skill helps you build and visualize dashboards with Recharts, generating charts, KPI cards, and data visualizations to monitor metrics effectively.
npx playbooks add skill hoodini/ai-agents-skills --skill analytics-metricsReview the files below or copy the command above to add this skill to your agents.
---
name: analytics-metrics
description: Build data visualization and analytics dashboards. Use when creating charts, KPI displays, metrics dashboards, or data visualization components. Triggers on analytics, dashboard, charts, metrics, KPI, data visualization, Recharts.
---
# Analytics & Metrics Dashboards
Build data visualization components with Recharts.
## Quick Start
```bash
npm install recharts
```
## Line Chart
```tsx
import {
LineChart,
Line,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
Legend,
ResponsiveContainer,
} from 'recharts';
const data = [
{ month: 'Jan', revenue: 4000, users: 2400 },
{ month: 'Feb', revenue: 3000, users: 1398 },
{ month: 'Mar', revenue: 2000, users: 9800 },
{ month: 'Apr', revenue: 2780, users: 3908 },
];
function RevenueChart() {
return (
<ResponsiveContainer width="100%" height={400}>
<LineChart data={data}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="month" />
<YAxis />
<Tooltip />
<Legend />
<Line
type="monotone"
dataKey="revenue"
stroke="#3b82f6"
strokeWidth={2}
/>
<Line
type="monotone"
dataKey="users"
stroke="#10b981"
strokeWidth={2}
/>
</LineChart>
</ResponsiveContainer>
);
}
```
## Bar Chart
```tsx
import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer } from 'recharts';
function SalesChart({ data }) {
return (
<ResponsiveContainer width="100%" height={300}>
<BarChart data={data}>
<XAxis dataKey="name" />
<YAxis />
<Tooltip />
<Bar dataKey="sales" fill="#3b82f6" radius={[4, 4, 0, 0]} />
</BarChart>
</ResponsiveContainer>
);
}
```
## KPI Card
```tsx
interface KPICardProps {
title: string;
value: string | number;
change: number;
trend: 'up' | 'down';
icon?: React.ReactNode;
}
function KPICard({ title, value, change, trend, icon }: KPICardProps) {
const isPositive = trend === 'up';
return (
<div className="bg-white rounded-lg p-6 shadow-sm border">
<div className="flex items-center justify-between">
<p className="text-sm font-medium text-gray-500">{title}</p>
{icon && <div className="text-gray-400">{icon}</div>}
</div>
<div className="mt-2">
<p className="text-3xl font-semibold text-gray-900">{value}</p>
<div className="mt-2 flex items-center">
<span
className={`text-sm font-medium ${
isPositive ? 'text-green-600' : 'text-red-600'
}`}
>
{isPositive ? '↑' : '↓'} {Math.abs(change)}%
</span>
<span className="ml-2 text-sm text-gray-500">vs last period</span>
</div>
</div>
</div>
);
}
```
## Dashboard Layout
```tsx
function Dashboard() {
return (
<div className="p-6 space-y-6">
{/* KPI Grid */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<KPICard
title="Total Revenue"
value="$45,231"
change={12.5}
trend="up"
/>
<KPICard
title="Active Users"
value="2,345"
change={8.2}
trend="up"
/>
<KPICard
title="Conversion Rate"
value="3.2%"
change={-2.1}
trend="down"
/>
<KPICard
title="Avg. Order Value"
value="$142"
change={5.4}
trend="up"
/>
</div>
{/* Charts Grid */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
<div className="bg-white rounded-lg p-6 shadow-sm border">
<h3 className="text-lg font-medium mb-4">Revenue Over Time</h3>
<RevenueChart />
</div>
<div className="bg-white rounded-lg p-6 shadow-sm border">
<h3 className="text-lg font-medium mb-4">Sales by Category</h3>
<SalesChart data={salesData} />
</div>
</div>
</div>
);
}
```
## Pie Chart
```tsx
import { PieChart, Pie, Cell, Tooltip, Legend, ResponsiveContainer } from 'recharts';
const COLORS = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444'];
function DistributionChart({ data }) {
return (
<ResponsiveContainer width="100%" height={300}>
<PieChart>
<Pie
data={data}
cx="50%"
cy="50%"
innerRadius={60}
outerRadius={100}
dataKey="value"
label
>
{data.map((_, index) => (
<Cell key={index} fill={COLORS[index % COLORS.length]} />
))}
</Pie>
<Tooltip />
<Legend />
</PieChart>
</ResponsiveContainer>
);
}
```
## Formatting Utilities
```typescript
export function formatNumber(value: number): string {
if (value >= 1_000_000) {
return `${(value / 1_000_000).toFixed(1)}M`;
}
if (value >= 1_000) {
return `${(value / 1_000).toFixed(1)}K`;
}
return value.toLocaleString();
}
export function formatCurrency(value: number, currency = 'USD'): string {
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency,
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(value);
}
export function formatPercent(value: number): string {
return `${value >= 0 ? '+' : ''}${value.toFixed(1)}%`;
}
```
## Resources
- **Recharts**: https://recharts.org
- **D3.js**: https://d3js.org
This skill builds data visualization and analytics dashboards using Recharts and reusable UI components. It provides chart components (line, bar, pie), KPI cards, formatting utilities, and a dashboard layout pattern to quickly assemble metrics-driven interfaces. Use it to display KPIs, trends, and distributions with responsive, styled components.
The skill supplies ready-to-use React components that wrap Recharts primitives (LineChart, BarChart, PieChart) inside responsive containers and styled panels. It includes a KPI card component for single-value metrics with trend indicators, plus number/currency/percent formatting utilities. Combine the components into a grid layout to produce production-friendly dashboards.
Which chart library does this skill use?
It uses Recharts for composable React charts and ResponsiveContainer for fluid layouts.
Are there utilities for formatting numbers and currency?
Yes. The skill includes formatNumber, formatCurrency, and formatPercent helpers to standardize display.