2025-08-12 15:49:20 +08:00

75 lines
2.4 KiB
TypeScript

// components/KpiTop.tsx
import React from "react";
type Props = {
month?: string;
yieldKwh: number;
consumptionKwh: number;
gridDrawKwh: number;
};
const Card: React.FC<{ title: string; value: string; accent?: boolean; icon?: React.ReactNode }> = ({
title,
value,
accent,
icon,
}) => (
<div
className={`rounded-xl p-4 md:p-5 shadow-sm
${accent
? "bg-[#fcd913] text-black"
: "bg-white text-gray-900 dark:bg-rtgray-800 dark:text-white"}`}
>
<div className="flex items-center gap-3">
<div className="shrink-0 text-black dark:text-white">
{icon}
</div>
<div className="flex-1">
<div className="text-lg font-bold opacity-80">{title}</div>
<div className="text-2xl font-semibold">{value}</div>
</div>
</div>
</div>
);
export default function KpiTop({ month, yieldKwh, consumptionKwh, gridDrawKwh }: Props) {
return (
<section aria-label="Top KPIs" className="space-y-3">
{month && <div className="text-xs dark:text-[#9aa4b2]">{month}</div>}
<div className="grid grid-cols-1 sm:grid-cols-3 gap-3">
<Card
title="Monthly Yield"
value={`${yieldKwh.toLocaleString()} kWh`}
icon={
<svg width="28" height="28" viewBox="0 0 24 24" fill="none">
<circle cx="12" cy="12" r="4" stroke="#fcd913" strokeWidth="2" />
<path d="M12 2v3M12 19v3M2 12h3M19 12h3M4.2 4.2l2.1 2.1M17.7 17.7l2.1 2.1M4.2 19.8l2.1-2.1M17.7 6.3l2.1-2.1" stroke="#fcd913" strokeWidth="2" />
</svg>
}
/>
<Card
title="Monthly Consumption"
value={`${consumptionKwh.toLocaleString()} kWh`}
icon={
<svg width="28" height="28" viewBox="0 0 24 24" fill="none">
<rect x="8" y="3" width="8" height="12" rx="2" stroke="currentColor" strokeWidth="2" />
<path d="M12 15v6" stroke="#fcd913" strokeWidth="2" />
</svg>
}
/>
<Card
title="Monthly Grid Draw"
value={`${gridDrawKwh.toLocaleString()} kWh`}
icon={
<svg width="28" height="28" viewBox="0 0 24 24" fill="none">
<path d="M5 21h14M7 21l5-18 5 18" stroke="currentColor" strokeWidth="2" />
<path d="M14 8l2 2" stroke="#fcd913" strokeWidth="2" />
</svg>
}
/>
</div>
</section>
);
}