|
|
import React from "react"; |
|
|
import { cn } from "@/lib/utils/cn"; |
|
|
|
|
|
interface LoadingSkeletonProps { |
|
|
className?: string; |
|
|
variant?: "text" | "circular" | "rectangular"; |
|
|
} |
|
|
|
|
|
export const LoadingSkeleton: React.FC<LoadingSkeletonProps> = ({ |
|
|
className, |
|
|
variant = "rectangular", |
|
|
}) => { |
|
|
const baseStyles = "animate-pulse bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer"; |
|
|
|
|
|
const variants = { |
|
|
text: "h-4 rounded", |
|
|
circular: "rounded-full aspect-square", |
|
|
rectangular: "rounded-xl", |
|
|
}; |
|
|
|
|
|
return ( |
|
|
<div className={cn(baseStyles, variants[variant], className)} /> |
|
|
); |
|
|
}; |
|
|
|
|
|
|
|
|
const shimmerKeyframes = ` |
|
|
@keyframes shimmer { |
|
|
0% { |
|
|
background-position: -200% 0; |
|
|
} |
|
|
100% { |
|
|
background-position: 200% 0; |
|
|
} |
|
|
} |
|
|
`; |
|
|
|