SkeletonRows
Animated placeholder rows for loading tables.
import { SkeletonRows }from "@/components/ui"
Loading table
Full source
The complete component, read from src/components/ui/skeleton-rows.tsx.
skeleton-rows.tsx
"use client";
interface SkeletonRowsProps {
n?: number;
colCount?: number;
}
export function SkeletonRows({ n = 8, colCount = 3 }: SkeletonRowsProps) {
return (
<>
{Array.from({ length: n }).map((_, i) => (
<tr key={i} className="border-t border-border">
<td className="px-4 py-3">
<span className="block h-4 w-4 rounded-sm bg-bg-secondary" />
</td>
<td className="px-4 py-3">
<span className="flex items-center gap-3">
<span className="h-8 w-8 shrink-0 animate-pulse rounded-full bg-bg-secondary" />
<span className="flex-1">
<span
className="block h-3 animate-pulse rounded bg-bg-secondary"
style={{ width: `${55 + ((i * 7) % 30)}%` }}
/>
<span
className="mt-1.5 block h-2.5 animate-pulse rounded bg-bg-secondary"
style={{ width: `${40 + ((i * 11) % 25)}%` }}
/>
</span>
</span>
</td>
{Array.from({ length: colCount }).map((_, c) => (
<td key={c} className="px-4 py-3">
<span
className="block h-3 animate-pulse rounded bg-bg-secondary"
style={{ width: `${45 + ((c * 13 + i * 5) % 35)}%` }}
/>
</td>
))}
<td className="px-4 py-3" />
</tr>
))}
</>
);
}