Task: Skeleton Loader Component
Type: Component
Milestone: M0.5 — Shared Component Library
Estimate: S
Component Type
Props Interface
interface SkeletonProps {
variant?: 'text' | 'card' | 'avatar' | 'bar' | 'custom';
width?: string | number;
height?: string | number;
lines?: number; // for 'text' variant — number of lines
className?: string;
}
Variants / States
| Variant |
Description |
Used in |
text |
One or more lines of shimmer text |
Report details, audit trail |
card |
Full card-height shimmer block |
Report queue loading state |
avatar |
Circle shimmer |
Topbar, UserPanel |
bar |
Thin horizontal shimmer |
Score bar, progress indicators |
custom |
Raw width + height, you control shape |
Any one-off case |
Acceptance Criteria
Notes
ModerationQueue shows 3 card skeletons while useReports is loading — size must match real cards to prevent layout shift on load
Task: Skeleton Loader Component
Type: Component
Milestone: M0.5 — Shared Component Library
Estimate: S
Component Type
Props Interface
Variants / States
textcardavatarbarcustomAcceptance Criteria
@keyframes— no JS interval--bg-secondary/--bg-tertiary— adapts to all themes including darktextvariant withlines={3}renders 3 lines, last line shorter (natural paragraph feel)cardvariant matches the exact height of a collapsedReportCardNotes
ModerationQueueshows 3cardskeletons whileuseReportsis loading — size must match real cards to prevent layout shift on load