hf-model-viewer / src /components /LoadingPanel.tsx
tfrere's picture
tfrere HF Staff
Deploy hf-model-viewer 2026-05-22T16:59:58Z
fc01079 verified
import { Box, LinearProgress, Paper, Typography } from "@mui/material";
import type { LoadProgress } from "../types";
function bytesPretty(n: number): string {
if (n < 1024) return `${n} B`;
if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;
if (n < 1024 * 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;
return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GB`;
}
export function LoadingPanel({ progress }: { progress: LoadProgress }) {
const pct =
progress.loaded && progress.total
? Math.min(100, Math.round((progress.loaded / progress.total) * 100))
: null;
return (
<Paper
elevation={0}
sx={{
p: 4,
maxWidth: 520,
mx: "auto",
mt: { xs: 6, md: 12 },
textAlign: "center",
}}
>
<Typography variant="overline" color="text.secondary">
{progress.phase}
</Typography>
<Typography variant="h6" sx={{ mt: 0.5 }}>
{progress.message}
</Typography>
<Box sx={{ mt: 3 }}>
<LinearProgress
variant={pct === null ? "indeterminate" : "determinate"}
value={pct ?? 0}
/>
</Box>
{progress.loaded !== undefined && (
<Typography variant="caption" color="text.secondary" sx={{ mt: 1.5, display: "block" }}>
{bytesPretty(progress.loaded)}
{progress.total ? ` / ${bytesPretty(progress.total)}` : ""}
</Typography>
)}
</Paper>
);
}