Spinner

A loading spinner component for indicating loading states.

Import

import { Spinner } from '@/components/ui';

Basic Usage

<Spinner />

Props

Prop Type Default Description
size 'sm' | 'md' | 'lg' 'md' Spinner size
className string - Additional CSS classes

Sizes

<Spinner size="sm" />  {/* 16x16px */}
<Spinner size="md" />  {/* 24x24px (default) */}
<Spinner size="lg" />  {/* 32x32px */}

With Button

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

Loading State Example

'use client';
import { useState } from 'react';
import { Spinner, Button } from '@/components/ui';

export function SubmitButton() {
  const [isLoading, setIsLoading] = useState(false);

  const handleClick = async () => {
    setIsLoading(true);
    await submitForm();
    setIsLoading(false);
  };

  return (
    <Button onClick={handleClick} disabled={isLoading}>
      {isLoading ? (
        <>
          <Spinner size="sm" className="mr-2" />
          Submitting...
        </>
      ) : (
        'Submit'
      )}
    </Button>
  );
}

Full Page Loading

export function PageLoader() {
  return (
    <div className="flex items-center justify-center min-h-screen">
      <Spinner size="lg" />
    </div>
  );
}

Inline Loading

export function InlineLoader() {
  return (
    <div className="flex items-center gap-2">
      <Spinner size="sm" />
      <span className="text-sm text-zinc-500">Loading data...</span>
    </div>
  );
}

Custom Color

<Spinner className="text-blue-500" />
<Spinner className="text-green-500" />
<Spinner className="text-purple-500" />

With Card

<Card className="p-8">
  <div className="flex flex-col items-center gap-4">
    <Spinner size="lg" />
    <p className="text-zinc-500">Loading content...</p>
  </div>
</Card>