"use client"; import { motion } from "framer-motion"; import { LucideIcon } from "lucide-react"; interface StatCardProps { title: string; value: string | number; icon: LucideIcon; change?: number; suffix?: string; color?: "cyan" | "violet" | "emerald" | "amber" | "rose" | "neutral"; delay?: number; } const colorMap = { cyan: { border: "border-[#38bdf8]/30", text: "text-[#38bdf8]", glow: "glow-cyan", iconBg: "bg-[#38bdf8]/10" }, violet: { border: "border-[#818cf8]/30", text: "text-[#818cf8]", glow: "glow-violet", iconBg: "bg-[#818cf8]/10" }, emerald: { border: "border-[#00d68f]/30", text: "text-[#00d68f]", glow: "glow-emerald", iconBg: "bg-[#00d68f]/10" }, amber: { border: "border-[#f59e0b]/30", text: "text-[#f59e0b]", glow: "glow-amber", iconBg: "bg-[#f59e0b]/10" }, rose: { border: "border-[#f43f5e]/30", text: "text-[#f43f5e]", glow: "glow-rose", iconBg: "bg-[#f43f5e]/10" }, neutral: { border: "border-white/[0.06]", text: "text-[#9a9aae]", glow: "", iconBg: "bg-white/[0.04]" }, }; export default function StatCard({ title, value, icon: Icon, change, suffix = "", color = "cyan", delay = 0 }: StatCardProps) { const cfg = colorMap[color]; return (
{change !== undefined && ( = 0 ? "text-[#00d68f]" : "text-[#f43f5e]"}`}> {change >= 0 ? "+" : ""}{change.toFixed(2)}% )}
{title}
{typeof value === "number" ? value.toLocaleString() : value}{suffix}
); }