import React, { ReactNode, useState } from "react"; import { Link } from "react-router"; import { ArrowUpIcon, ArrowDownIcon } from "../../icons"; import { EnhancedTooltip } from "../ui/tooltip/EnhancedTooltip"; export interface MetricCardProps { title: string; value: string | number; subtitle?: string; trend?: number; // Positive or negative trend value icon: ReactNode; accentColor: "blue" | "green" | "orange" | "purple" | "red"; href?: string; onClick?: () => void; tooltip?: string | ReactNode; // Enhanced tooltip content details?: Array<{ label: string; value: string | number }>; // Breakdown for tooltip className?: string; } const accentColors = { blue: { bg: "bg-blue-50 dark:bg-blue-500/10", hover: "hover:bg-blue-100 dark:hover:bg-blue-500/20", border: "bg-brand-500", icon: "text-brand-500", }, green: { bg: "bg-green-50 dark:bg-green-500/10", hover: "hover:bg-green-100 dark:hover:bg-green-500/20", border: "bg-success-500", icon: "text-success-500", }, orange: { bg: "bg-amber-50 dark:bg-amber-500/10", hover: "hover:bg-amber-100 dark:hover:bg-amber-500/20", border: "bg-warning-500", icon: "text-warning-500", }, purple: { bg: "bg-purple-50 dark:bg-purple-500/10", hover: "hover:bg-purple-100 dark:hover:bg-purple-500/20", border: "bg-purple-500", icon: "text-purple-500", }, red: { bg: "bg-red-50 dark:bg-red-500/10", hover: "hover:bg-red-100 dark:hover:bg-red-500/20", border: "bg-error-500", icon: "text-error-500", }, }; export default function EnhancedMetricCard({ title, value, subtitle, trend, icon, accentColor, href, onClick, tooltip, details, className = "", }: MetricCardProps) { const [isHovered, setIsHovered] = useState(false); const colors = accentColors[accentColor]; const formatValue = (val: string | number): string => { if (typeof val === "number") { return val.toLocaleString(); } return val; }; const tooltipContent = tooltip || ( details ? (
{details.map((detail, idx) => (
{detail.label}: {detail.value}
))}
) : null ); const cardContent = (
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} onClick={onClick} > {/* Accent Border */}

{title}

{formatValue(value)}

{trend !== undefined && trend !== 0 && (
0 ? "text-success-500" : "text-error-500" }`} > {trend > 0 ? ( ) : ( )} {Math.abs(trend)}
)}
{subtitle && (

{subtitle}

)}
{React.cloneElement(icon as React.ReactElement, { className: `${colors.icon} size-6` })}
{/* Hover Effect */} {isHovered && tooltipContent && (
)}
); // Wrap with tooltip if provided if (tooltipContent) { const wrappedContent = href ? ( {cardContent} ) : ( cardContent ); return ( {wrappedContent} ); } return href ? {cardContent} : cardContent; }