import { Show, createMemo, createSignal } from 'solid-js'; import { Portal } from 'solid-js/web'; import { formatPercent } from '@/utils/format'; import { useMetricsViewMode } from '@/stores/metricsViewMode'; import { getMetricHistoryForRange, getMetricsVersion } from '@/stores/metricsHistory'; import { Sparkline } from '@/components/shared/Sparkline'; interface EnhancedCPUBarProps { usage: number; // CPU Usage % (0-100) loadAverage?: number; // 1-minute load average cores?: number; // Number of cores model?: string; // CPU Model name (for tooltip) resourceId?: string; // For sparkline history } export function EnhancedCPUBar(props: EnhancedCPUBarProps) { const [showTooltip, setShowTooltip] = createSignal(false); const [tooltipPos, setTooltipPos] = createSignal({ x: 0, y: 0 }); let containerRef: HTMLDivElement | undefined; // Bar color based on usage const barColor = createMemo(() => { if (props.usage >= 90) return 'bg-red-500/60 dark:bg-red-500/50'; if (props.usage >= 80) return 'bg-yellow-500/60 dark:bg-yellow-500/50'; return 'bg-green-500/60 dark:bg-green-500/50'; }); const handleMouseEnter = (e: MouseEvent) => { const rect = (e.currentTarget as HTMLElement).getBoundingClientRect(); setTooltipPos({ x: rect.left + rect.width / 2, y: rect.top }); setShowTooltip(true); }; const handleMouseLeave = () => { setShowTooltip(false); }; const { viewMode, timeRange } = useMetricsViewMode(); // Get metric history for sparkline // Depends on metricsVersion to re-fetch when data is seeded (e.g., on time range change) const metricHistory = createMemo(() => { // Subscribe to version changes so we re-read when new data is seeded getMetricsVersion(); if (viewMode() !== 'sparklines' || !props.resourceId) return []; return getMetricHistoryForRange(props.resourceId, timeRange()); }); return (
{/* Usage Bar */}
{/* Label */} {formatPercent(props.usage)} ({props.cores} cores)
{/* Tooltip */}
CPU Details
{props.model}
Usage 90 ? 'text-red-400' : 'text-gray-200'}`}> {formatPercent(props.usage)}
Load (1m) {props.loadAverage?.toFixed(2)}
} > {/* Sparkline mode - full width, flex centered like stacked bars */}
); }