Monorepo for wisp.place. A static site hosting service built on top of the AT Protocol.
wisp.place
1import {
2 Card,
3 CardContent,
4 CardDescription,
5 CardHeader,
6 CardTitle
7} from '@public/components/ui/card'
8
9// Shimmer animation for skeleton loading
10const Shimmer = () => (
11 <div className="animate-pulse">
12 <div className="h-4 bg-muted rounded w-3/4 mb-2"></div>
13 <div className="h-4 bg-muted rounded w-1/2"></div>
14 </div>
15)
16
17const SkeletonLine = ({ className = '' }: { className?: string }) => (
18 <div className={`animate-pulse bg-muted rounded ${className}`}></div>
19)
20
21export function TabSkeleton() {
22 return (
23 <div className="space-y-4 min-h-[400px]">
24 <Card>
25 <CardHeader>
26 <div className="space-y-2">
27 <SkeletonLine className="h-6 w-1/3" />
28 <SkeletonLine className="h-4 w-2/3" />
29 </div>
30 </CardHeader>
31 <CardContent className="space-y-4">
32 {/* Skeleton content items */}
33 <div className="p-4 border border-border rounded-lg">
34 <SkeletonLine className="h-5 w-1/2 mb-3" />
35 <SkeletonLine className="h-4 w-3/4 mb-2" />
36 <SkeletonLine className="h-4 w-2/3" />
37 </div>
38 <div className="p-4 border border-border rounded-lg">
39 <SkeletonLine className="h-5 w-1/2 mb-3" />
40 <SkeletonLine className="h-4 w-3/4 mb-2" />
41 <SkeletonLine className="h-4 w-2/3" />
42 </div>
43 <div className="p-4 border border-border rounded-lg">
44 <SkeletonLine className="h-5 w-1/2 mb-3" />
45 <SkeletonLine className="h-4 w-3/4 mb-2" />
46 <SkeletonLine className="h-4 w-2/3" />
47 </div>
48 </CardContent>
49 </Card>
50
51 <Card>
52 <CardHeader>
53 <div className="space-y-2">
54 <SkeletonLine className="h-6 w-1/4" />
55 <SkeletonLine className="h-4 w-1/2" />
56 </div>
57 </CardHeader>
58 <CardContent className="space-y-3">
59 <SkeletonLine className="h-10 w-full" />
60 <SkeletonLine className="h-4 w-3/4" />
61 </CardContent>
62 </Card>
63 </div>
64 )
65}