busi488energy/src/components/map/map-legend.tsx
Joey Eamigh 79850a61be
cleanup
2026-02-11 22:03:19 -05:00

104 lines
3.7 KiB
TypeScript

'use client';
import { FUEL_TYPE_COLORS } from './power-plant-marker.js';
interface MapLegendProps {
showPowerPlants?: boolean;
}
const FUEL_TYPE_DISPLAY_ORDER = [
'Natural Gas',
'Coal',
'Nuclear',
'Hydroelectric',
'Wind',
'Solar',
'Petroleum',
'Biomass',
'Geothermal',
];
export function MapLegend({ showPowerPlants = false }: MapLegendProps) {
return (
<div className="text-xs">
{/* Price heatmap gradient */}
<div className="mb-2.5">
<div className="mb-1 font-medium text-zinc-300">Price Heatmap</div>
<div
className="h-3 w-30 rounded-sm"
style={{
background: 'linear-gradient(to right, rgb(30,80,220), rgb(60,220,200), rgb(255,160,30), rgb(220,40,110))',
}}
/>
<div className="mt-0.5 flex w-30 justify-between text-zinc-500">
<span>$0</span>
<span>$50</span>
<span>$100+</span>
</div>
<div className="mt-0.5 text-zinc-500">$/MWh</div>
</div>
{/* Marker size scale */}
<div className="mb-2.5">
<div className="mb-1 font-medium text-zinc-300">Datacenter Size</div>
<div className="flex items-end gap-2.5">
<div className="flex flex-col items-center gap-0.5">
<div className="h-3.5 w-3.5 rounded-full border border-white/60 bg-zinc-500" />
<span className="text-zinc-500">50</span>
</div>
<div className="flex flex-col items-center gap-0.5">
<div className="h-5 w-5 rounded-full border border-white/60 bg-zinc-500" />
<span className="text-zinc-500">200</span>
</div>
<div className="flex flex-col items-center gap-0.5">
<div className="h-7 w-7 rounded-full border border-white/60 bg-zinc-500" />
<span className="text-zinc-500">500+</span>
</div>
<span className="pb-0.5 text-zinc-500">MW</span>
</div>
</div>
{/* Pulsing icon */}
<div className="mb-1.5 flex items-center gap-2">
<span className="relative flex h-3 w-3">
<span className="absolute inline-flex h-full w-full animate-ping rounded-full bg-amber-400 opacity-75" />
<span className="relative inline-flex h-3 w-3 rounded-full bg-amber-500" />
</span>
<span className="text-zinc-400">Price spike</span>
</div>
{/* Grid stress glow icon */}
<div className={showPowerPlants ? 'mb-2.5 flex items-center gap-2' : 'flex items-center gap-2'}>
<span className="relative flex h-3 w-3">
<span className="ambient-glow-slow absolute inline-flex h-full w-full rounded-full bg-red-500/60" />
<span className="relative inline-flex h-3 w-3 rounded-full bg-red-500/80" />
</span>
<span className="text-zinc-400">Grid stress &gt;85%</span>
</div>
{/* Power plant fuel type legend */}
{showPowerPlants && (
<div className="border-t border-zinc-700/60 pt-2">
<div className="mb-1.5 font-medium text-zinc-300">Power Plants</div>
<div className="grid grid-cols-2 gap-x-3 gap-y-1">
{FUEL_TYPE_DISPLAY_ORDER.map(fuel => (
<div key={fuel} className="flex items-center gap-1.5">
<div
className="h-2.5 w-2.5 shrink-0"
style={{
backgroundColor: FUEL_TYPE_COLORS[fuel] ?? '#9CA3AF',
transform: 'rotate(45deg)',
borderRadius: 1,
opacity: 0.7,
}}
/>
<span className="truncate text-zinc-400">{fuel}</span>
</div>
))}
</div>
</div>
)}
</div>
);
}