"use client";
import type { HTMLAttributes } from "react";
import { cn } from "@/shared/utils/cn";
type SpinnerSize = "sm" | "md" | "lg" | "xl";
type LoadingType = "spinner" | "page" | "skeleton" | "card";
const spinnerSizes: Record = {
sm: "size-4",
md: "size-6",
lg: "size-8",
xl: "size-12",
};
interface SpinnerProps {
size?: SpinnerSize;
className?: string;
label?: string;
}
interface PageLoadingProps {
message?: string;
className?: string;
}
interface SkeletonProps extends HTMLAttributes {
className?: string;
}
interface LoadingProps extends HTMLAttributes {
type?: LoadingType;
className?: string;
message?: string;
size?: SpinnerSize;
label?: string;
}
// Spinner loading
export function Spinner({ size = "md", className, label = "Loading" }: SpinnerProps) {
return (
{label}
progress_activity
);
}
// Full page loading
export function PageLoading({ message = "Loading...", className }: PageLoadingProps) {
return (
);
}
// Skeleton loading
export function Skeleton({ className, ...props }: SkeletonProps) {
return (
);
}
// Card skeleton
export function CardSkeleton() {
return (
);
}
// Default export
export default function Loading({
type = "spinner",
className,
message,
size,
label,
...props
}: LoadingProps) {
switch (type) {
case "page":
return ;
case "skeleton":
return ;
case "card":
return ;
default:
return ;
}
}