Skip to main content

Installation

npx shadcn@latest add spinner

Usage

import { Spinner } from "@/components/ui/spinner"

Basic

<Spinner />

Custom size

<Spinner className="size-6" />
<Spinner className="size-8" />
<Spinner className="size-12" />

Examples

In buttons

<Button disabled>
  <Spinner className="mr-2" />
  Loading...
</Button>

Loading state

function DataComponent() {
  const [loading, setLoading] = useState(true)

  if (loading) {
    return (
      <div className="flex items-center justify-center p-8">
        <Spinner className="size-8" />
      </div>
    )
  }

  return <div>Data content</div>
}

With text

<div className="flex items-center gap-2">
  <Spinner />
  <span>Loading data...</span>
</div>

Component source

import { Loader2Icon } from "lucide-react"
import { cn } from "@/lib/utils"

function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
  return (
    <Loader2Icon
      role="status"
      aria-label="Loading"
      className={cn("size-4 animate-spin", className)}
      {...props}
    />
  )
}

export { Spinner }

API Reference

PropTypeDescription
classNamestringAdditional CSS classes for sizing and styling

Accessibility

  • Uses role="status" for screen readers
  • Includes aria-label="Loading" to announce loading state
  • Automatically animates with animate-spin class

Notes

  • Built using Lucide React’s Loader2Icon
  • Default size is size-4 (16px)
  • Uses Tailwind’s animate-spin utility for rotation

Build docs developers (and LLMs) love