import { Card, CardContent } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; interface Props { used: number; available: number; size: number; usedPct: string; } function formatBytes(bytes: number): string { if (!bytes || bytes === 0) return "0 B"; const units = ["B", "KB", "MB", "GB", "TB"]; let value = bytes; let unitIdx = 0; while (value >= 1000 && unitIdx < units.length - 1) { value /= 1000; unitIdx++; } return `${value.toFixed(1)} ${units[unitIdx]}`; } /** * Progress-bar class (full static strings so Tailwind's scanner emits them). * `chart-2`=success, `chart-3`=warning, `destructive`=error, per design ยง2.3. */ function progressBarClass(pct: number): string { if (pct < 70) { return "h-3 [&_[data-slot=progress-indicator]]:bg-chart-2"; } if (pct < 90) { return "h-3 [&_[data-slot=progress-indicator]]:bg-chart-3"; } return "h-3 [&_[data-slot=progress-indicator]]:bg-destructive"; } /** * Dashboard card that summarizes the configured media disk. * * Keeps the progress bar inside the card so the capacity signal, raw byte * values, and free-space breakdown stay visually grouped. The used / free / * total / percent breakdown is preserved verbatim from the MUI version. */ export function DiskSpaceCard({ used, available, size, usedPct }: Props) { const pct = Math.max(0, Math.min(100, Number.parseFloat(usedPct) || 0)); const cells = [ { label: "Used", value: formatBytes(used) }, { label: "Free", value: formatBytes(available) }, { label: "Total", value: formatBytes(size) }, ]; return (
Disk space {usedPct} used
{cells.map((cell) => (
{cell.label} {cell.value}
))}
); }