1interface LoadingSpinnerProps {
2 size?: 'sm' | 'md' | 'lg';
7export default function LoadingSpinner({
11}: LoadingSpinnerProps) {
13 sm: 'h-6 w-6 border-2',
14 md: 'h-10 w-10 border-3',
15 lg: 'h-16 w-16 border-4'
18 const textSizeClasses = {
25 <div className="flex flex-col items-center justify-center gap-3">
26 <div className={`${sizeClasses[size]} border-brand border-t-transparent rounded-full animate-spin`}></div>
28 <p className={`${textSizeClasses[size]} text-muted animate-pulse`}>{text}</p>
35 <div className="fixed inset-0 bg-white/80 backdrop-blur-sm flex items-center justify-center z-50">
44// Skeleton loader for cards/lists
45export function SkeletonCard() {
47 <div className="bg-white rounded-lg border border-border p-6 animate-pulse">
48 <div className="h-4 bg-gray-200 rounded w-3/4 mb-4"></div>
49 <div className="h-3 bg-gray-200 rounded w-1/2 mb-2"></div>
50 <div className="h-3 bg-gray-200 rounded w-2/3"></div>
55// Skeleton loader for table rows
56export function SkeletonRow() {
58 <tr className="animate-pulse">
59 <td className="px-6 py-4">
60 <div className="h-4 bg-gray-200 rounded w-32"></div>
62 <td className="px-6 py-4">
63 <div className="h-4 bg-gray-200 rounded w-24"></div>
65 <td className="px-6 py-4">
66 <div className="h-4 bg-gray-200 rounded w-40"></div>
68 <td className="px-6 py-4">
69 <div className="h-4 bg-gray-200 rounded w-20"></div>
75// Skeleton loader for KPI cards
76export function SkeletonKPI() {
78 <div className="bg-white p-4 rounded-lg border border-border animate-pulse">
79 <div className="h-8 bg-gray-200 rounded w-20 mb-2"></div>
80 <div className="h-3 bg-gray-200 rounded w-24"></div>