home / skills / hoodini / ai-agents-skills / analytics-metrics

analytics-metrics skill

/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-metrics

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
5.4 KB
---
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

Overview

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.

How this skill works

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.

When to use it

  • Creating a metrics dashboard or admin analytics page
  • Displaying time-series trends (revenues, users, conversions)
  • Building KPI cards for executive summaries
  • Showing categorical distributions with pie charts
  • Embedding responsive charts in components or pages

Best practices

  • Keep charts responsive by using ResponsiveContainer and fixed heights
  • Normalize data keys (e.g., month, revenue, users) so components stay generic
  • Use formatting utilities to ensure consistent number/currency/percent display
  • Limit series per chart to maintain readability; split when necessary
  • Provide tooltips and legends for discoverability and context

Example use cases

  • Revenue over time line chart combined with active-user series for marketing reporting
  • Sales-by-category bar chart on a product analytics page
  • KPI grid on a top-level dashboard showing total revenue, active users, conversion rate, and AOV
  • Distribution pie chart for customer segments or traffic sources
  • Reusable dashboard layout for admin panels where charts and KPI cards are swapped dynamically

FAQ

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.