MedASR-Bench / src /app /compare /loading.tsx
ngoan
MedASR Bench: full platform + Hugging Face Docker Space packaging
d70f132
Raw
History Blame Contribute Delete
3.39 kB
import {
Skeleton,
SkeletonTable,
SkeletonText,
} from "@/components/ui/LoadingSkeleton";
/* Route-level loading state for /compare — mirrors the page's structure
(heading + dataset chips, Pareto canvas, head-to-head card, efficiency
canvas) so content streams in without layout shift. Server-safe: all
shimmer comes from the .skeleton class, which collapses to a static
block under prefers-reduced-motion. */
function HeadingSkeleton({ titleWidth = 320 }: { titleWidth?: number }) {
return (
<div className="hairline-b flex flex-col gap-3 pb-6">
<Skeleton className="h-3" width={130} />
<Skeleton className="h-9" width={titleWidth} />
<SkeletonText className="max-w-2xl" lines={2} lastLineWidth="45%" />
</div>
);
}
function ChartCardSkeleton({ height }: { height: number }) {
return (
<div className="glass depth-2 rounded-sm p-5">
{/* control row: legend chips left, toggle right */}
<div className="flex flex-wrap items-center justify-between gap-3">
<div className="flex flex-wrap items-center gap-4">
{[72, 96, 64, 88].map((w, i) => (
<Skeleton key={i} className="h-3" width={w} />
))}
</div>
<Skeleton className="h-7" width={140} />
</div>
{/* chart canvas */}
<Skeleton className="mt-4 w-full" height={height} />
{/* caption */}
<div className="hairline-t mt-4 pt-3">
<Skeleton className="h-3.5" width="70%" />
</div>
</div>
);
}
export default function CompareLoading() {
return (
<div
aria-busy="true"
aria-label="Loading model comparison"
className="flex flex-col gap-12 md:gap-16"
>
{/* 02 · Compare heading + dataset-scope chips */}
<div className="flex flex-col gap-5">
<HeadingSkeleton titleWidth={340} />
<div className="flex flex-wrap items-center gap-2">
<Skeleton className="h-3" width={96} />
{[88, 76, 112].map((w, i) => (
<Skeleton key={i} className="h-6 rounded-sm" width={w} />
))}
</div>
</div>
{/* pulse line strip */}
<Skeleton className="h-6 w-full" />
{/* Pareto frontier card */}
<ChartCardSkeleton height={440} />
{/* 02.1 · Head-to-head */}
<HeadingSkeleton titleWidth={300} />
<div className="glass depth-2 rounded-sm p-5">
{/* three model selectors */}
<div className="flex flex-wrap items-end gap-4">
{[0, 1, 2].map((i) => (
<div key={i} className="flex min-w-52 flex-1 flex-col gap-1.5">
<Skeleton className="h-3" width="45%" />
<Skeleton className="h-9 w-full" />
</div>
))}
</div>
{/* delta table */}
<SkeletonTable className="mt-5" rows={6} columns={4} />
{/* profile bars */}
<div className="mt-5 grid gap-x-10 gap-y-5 sm:grid-cols-2">
{[0, 1, 2, 3].map((i) => (
<div key={i} className="flex flex-col gap-2">
<Skeleton className="h-3" width="35%" />
<Skeleton className="h-1.5 w-full" />
<Skeleton className="h-1.5 w-4/5" />
</div>
))}
</div>
</div>
{/* 02.2 · Efficiency */}
<HeadingSkeleton titleWidth={360} />
<ChartCardSkeleton height={360} />
</div>
);
}