"use client"; import React from "react"; import { TrendingUp, TrendingDown } from "lucide-react"; import { cn } from "@/lib/utils"; import { Card, CardBody } from "./Card"; import { Badge } from "./Badge"; export function MetricCard({ label, value, delta, tone = "neutral", icon, subtitle, isPercentage, className, }: { label: string; value: number | string; delta?: number; // percentage change, e.g. +5.2 tone?: "neutral" | "brand" | "green" | "red" | "amber" | "violet" | "blue"; icon?: React.ReactNode; subtitle?: string; isPercentage?: boolean; className?: string; }) { const showValue = isPercentage ? `${Number(value).toFixed(1)}%` : typeof value === "number" ? value.toLocaleString() : value; return (
{label}
{showValue}
{subtitle !== undefined && (
{subtitle}
)} {delta !== undefined && (
{delta >= 0 ? ( <> +{delta.toFixed(1)}% ) : ( <> {delta.toFixed(1)}% )} vs last period
)}
{icon && (
{icon}
)}
); } export function MetricPill({ label, value, tone = "neutral", isPercentage, }: { label: string; value: number | string; tone?: "neutral" | "brand" | "green" | "red" | "amber" | "blue"; isPercentage?: boolean; }) { const shown = isPercentage ? `${Number(value).toFixed(1)}%` : value; const toneMap: Record = { neutral: "bg-slate-100 text-slate-700", brand: "bg-brand-50 text-brand-700", blue: "bg-sky-50 text-sky-700", green: "bg-emerald-50 text-emerald-700", red: "bg-red-50 text-red-700", amber: "bg-amber-50 text-amber-700", }; return (
{label} {shown}
); }