45 lines
1017 B
Markdown
45 lines
1017 B
Markdown
import * as React from "react"
|
|
import { cva, type VariantProps } from "class-variance-authority"
|
|
|
|
import { cn } from "@/lib/utils"
|
|
|
|
const spinnerVariants = cva(
|
|
"inline-block animate-spin rounded-full border-2 border-current border-t-transparent",
|
|
{
|
|
variants: {
|
|
size: {
|
|
sm: "h-4 w-4",
|
|
default: "h-6 w-6",
|
|
lg: "h-8 w-8",
|
|
xl: "h-12 w-12",
|
|
},
|
|
},
|
|
defaultVariants: {
|
|
size: "default",
|
|
},
|
|
}
|
|
)
|
|
|
|
export interface SpinnerProps
|
|
extends React.HTMLAttributes<HTMLDivElement>,
|
|
VariantProps<typeof spinnerVariants> {}
|
|
|
|
const Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(
|
|
({ className, size, ...props }, ref) => {
|
|
return (
|
|
<div
|
|
ref={ref}
|
|
role="status"
|
|
aria-label="Loading"
|
|
className={cn(spinnerVariants({ size, className }))}
|
|
{...props}
|
|
>
|
|
<span className="sr-only">Loading...</span>
|
|
</div>
|
|
)
|
|
}
|
|
)
|
|
Spinner.displayName = "Spinner"
|
|
|
|
export { Spinner, spinnerVariants }
|