Skeleton
Indicate loading state. Reduce perceived wait time. Keep users engaged.
Members
1import { Skeleton } from '@/components/ui/skeleton';23const rows = ['first', 'second'];45export function Default() {6 return (7 <div className="border-border bg-card w-full max-w-md rounded-xl border p-4">8 <div className="mb-4 flex items-center justify-between">9 <p className="text-sm font-medium">Members</p>10 <Skeleton className="h-4 w-16" />11 </div>12 <div className="flex flex-col gap-4">13 {rows.map((row) => (14 <div key={row} className="flex items-center justify-between gap-3 sm:gap-4">15 <div className="flex min-w-0 flex-1 items-center gap-3">16 <Skeleton className="h-10 w-10 shrink-0 rounded-full" />17 <div className="min-w-0 flex-1 space-y-2">18 <Skeleton className="h-3.5 w-full max-w-32" />19 <Skeleton className="h-3 w-full max-w-44" />20 </div>21 </div>22 <div className="flex shrink-0 items-center gap-2">23 <Skeleton className="h-5 w-14 rounded-sm" />24 <Skeleton className="hidden h-8 w-20 rounded-md sm:block" />25 </div>26 </div>27 ))}28 </div>29 </div>30 );31}
Installation
Copy and paste the following code into your project.
1import * as React from 'react';2import { cn } from '../lib/cn';34interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {5 ref?: React.Ref<HTMLDivElement>;6}78function Skeleton({ className, ref, ...props }: SkeletonProps) {9 return (10 <div11 ref={ref}12 aria-hidden="true"13 className={cn('bg-muted rounded-md motion-safe:animate-pulse', className)}14 {...props}15 />16 );17}1819Skeleton.displayName = 'Skeleton';2021export { Skeleton };22export type { SkeletonProps };
Update the import paths to match your project structure.
Anatomy
1import { Skeleton } from '@/components/ui/skeleton';
1<Skeleton className="h-4 w-[200px]" />
Examples
Default
Members
1import { Skeleton } from '@/components/ui/skeleton';23const rows = ['first', 'second'];45export function Default() {6 return (7 <div className="border-border bg-card w-full max-w-md rounded-xl border p-4">8 <div className="mb-4 flex items-center justify-between">9 <p className="text-sm font-medium">Members</p>10 <Skeleton className="h-4 w-16" />11 </div>12 <div className="flex flex-col gap-4">13 {rows.map((row) => (14 <div key={row} className="flex items-center justify-between gap-3 sm:gap-4">15 <div className="flex min-w-0 flex-1 items-center gap-3">16 <Skeleton className="h-10 w-10 shrink-0 rounded-full" />17 <div className="min-w-0 flex-1 space-y-2">18 <Skeleton className="h-3.5 w-full max-w-32" />19 <Skeleton className="h-3 w-full max-w-44" />20 </div>21 </div>22 <div className="flex shrink-0 items-center gap-2">23 <Skeleton className="h-5 w-14 rounded-sm" />24 <Skeleton className="hidden h-8 w-20 rounded-md sm:block" />25 </div>26 </div>27 ))}28 </div>29 </div>30 );31}
Card
A full card loading state skeleton.
1import { Skeleton } from '@/components/ui/skeleton';23const summaryLines = ['h-3.5 w-full', 'h-3.5 w-4/5'];45export function Card() {6 return (7 <div className="border-border bg-card w-full max-w-sm rounded-xl border p-4">8 <Skeleton className="h-[140px] w-full rounded-lg" />9 <div className="mt-4 space-y-2">10 <Skeleton className="h-5 w-40" />11 {summaryLines.map((line) => (12 <Skeleton key={line} className={line} />13 ))}14 </div>15 <div className="border-border mt-4 flex items-center justify-between border-t pt-4">16 <div className="flex items-center gap-2">17 <Skeleton className="h-6 w-6 rounded-full" />18 <Skeleton className="h-3 w-24" />19 </div>20 <Skeleton className="h-5 w-16 rounded-sm" />21 </div>22 </div>23 );24}
API Reference
Skeleton
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | โ | Additional CSS classes โ use to set width, height, and border-radius. |
Found something to improve?
Notice a bug, typo, or missing detail on this page? Help us make the documentation better by opening a GitHub issue.