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%
Claude Code Prompt
參考:PD04 stats 組件:Stats.tsx Stats:KPI 數字卡片。顯示一個關鍵數字 + 變化趨勢。dashboard 第一個視覺重點。 限制: - 沒給趨勢比較 - 單位混在數字裡 - 數字太長沒處理
完整程式碼
"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 個(畫面太擠,分組)
我踩過的坑
-
沒給趨勢比較:123 個訪客 vs 較上週 +12%,後者更有資訊量。
-
單位混在數字裡:$1234 跟 1234 USD 混用。統一一致。
-
數字太長沒處理:1234567 要寫成 1.2M 或 1,234,567,不能裸寫。
相關模式
- PA04