Frontend Lab
← 回到所有模式
PD04📊 Data Display · 資料展示指標

Stats

指標卡

難度 ★★★★標籤 stats · kpi · trend3 min read

模式簡述

Stats:KPI 數字卡片。顯示一個關鍵數字 + 變化趨勢。dashboard 第一個視覺重點。

Revenue

$48,210

+12.4%

Users

2,341

-3.2%

Sessions

12,488

+8.1%

正常|3 個 KPI 卡片

Claude Code Prompt

💬 Claude Code Prompt
參考:PD04 stats
組件:Stats.tsx

Stats:KPI 數字卡片。顯示一個關鍵數字 + 變化趨勢。dashboard 第一個視覺重點。

限制:
- 沒給趨勢比較
- 單位混在數字裡
- 數字太長沒處理

完整程式碼

Stats.tsx
"use client";
import { TrendingUp, TrendingDown } from "lucide-react";
import { cn } from "@/lib/utils";

type State = "normal" | "up" | "down" | "loading";

const STATS = [
{ label: "Revenue", value: "$48,210", trend: 12.4 },
{ label: "Users", value: "2,341", trend: -3.2 },
{ label: "Sessions", value: "12,488", trend: 8.1 },
];

export function Stats({ state = "normal" }: { state?: State }) {
if (state === "loading") {
  return (
    <div className="grid w-full max-w-lg grid-cols-3 gap-3">
      {[0, 1, 2].map((i) => (
        <div key={i} className="rounded-lg border border-border p-4 space-y-2">
          <div className="h-3 w-1/2 animate-pulse rounded bg-muted" />
          <div className="h-6 w-2/3 animate-pulse rounded bg-muted" />
          <div className="h-3 w-1/3 animate-pulse rounded bg-muted" />
        </div>
      ))}
    </div>
  );
}

return (
  <div className="grid w-full max-w-lg grid-cols-3 gap-3">
    {STATS.map((s, i) => {
      let trend = s.trend;
      if (state === "up") trend = Math.abs(s.trend);
      else if (state === "down") trend = -Math.abs(s.trend);
      const up = trend >= 0;
      return (
        <div key={i} className="rounded-lg border border-border bg-background/40 p-4">
          <p className="font-mono text-[10px] uppercase tracking-wider text-muted-foreground/70">
            {s.label}
          </p>
          <p className="mt-1 text-xl font-medium tabular-nums">{s.value}</p>
          <p
            className={cn(
              "mt-1 inline-flex items-center gap-1 font-mono text-[11px]",
              up ? "text-emerald-500" : "text-red-500",
            )}
          >
            {up ? <TrendingUp className="h-3 w-3" /> : <TrendingDown className="h-3 w-3" />}
            {up ? "+" : ""}
            {trend.toFixed(1)}%
          </p>
        </div>
      );
    })}
  </div>
);
}

何時用

  • ✅ dashboard 頂部的 KPI 區
  • ✅ 分析報告開頭的關鍵指標
  • ✅ 個人成就頁面

何時別用

  • ❌ 數字本身沒上下文(純呈現意義不大)
  • ❌ 需要看細節(直接用 chart)
  • ❌ 數字超過 6 個(畫面太擠,分組)

我踩過的坑

  1. 沒給趨勢比較:123 個訪客 vs 較上週 +12%,後者更有資訊量。

  2. 單位混在數字裡:$1234 跟 1234 USD 混用。統一一致。

  3. 數字太長沒處理:1234567 要寫成 1.2M 或 1,234,567,不能裸寫。

相關模式

  • PA04

搜尋

按 ⌘K 隨時開啟