import type { ReactNode } from 'react' import { useTheme } from '../contexts/ThemeContext' interface RingStatProps { value: number max?: number label: string subLabel?: ReactNode size?: number strokeWidth?: number } export function RingStat({ value, max = 100, label, subLabel, size = 120, strokeWidth = 8 }: RingStatProps) { const { theme } = useTheme() const isDark = theme === 'dark' const radius = (size - strokeWidth) / 2 const circumference = radius * 2 * Math.PI const percentage = max === Infinity ? Math.max(value, 0) : Math.min(Math.max(value / max * 100, 0), 100) const strokeDashoffset = circumference - (Math.min(percentage, 100) / 100) * circumference const bgStroke = isDark ? '#374151' : '#f3f4f6' const progressStroke = isDark ? '#f9fafb' : '#000000' return (
{/* Background ring */} {/* Progress ring */} {/* Center value */}
{percentage.toFixed(percentage < 1 ? 2 : 1)}%
{label}
{subLabel &&
{subLabel}
}
) } interface RingStatsProps { cpuPercent: number cpuCores: number cpuUsed: number ramPercent: number ramUsed: number ramTotal: number swapPercent?: number swapUsed?: number swapTotal?: number loadPercent: number diskPercent: number diskUsed: number diskTotal: number } export default function RingStats({ cpuPercent, cpuCores, cpuUsed, ramPercent, ramUsed, ramTotal, swapPercent = 0, swapUsed = 0, swapTotal = 0, loadPercent, diskPercent, diskUsed, diskTotal, }: RingStatsProps) { const formatGB = (mb: number) => { if (mb >= 1024) return `${(mb / 1024).toFixed(2)} GB` return `${mb} MB` } const hasSwap = swapTotal > 0 return (

状态

{hasSwap && ( )}
) }