Spinner

Feedback

Loading spinner with pixel animation.

Import

import { PixelSpinner } from "@/components/ui/pixel-spinner"

Usage

Loading...

Component Source

Copy and paste the following code into your project at /src/components/ui/pixel-spinner.tsx

"use client";

import { cva, type VariantProps } from "class-variance-authority";
import * as React from "react";
import { cn } from "@/lib/utils";

const pixelSpinnerVariants = cva(
  "inline-block pixel-borders border-4 border-black animate-spin",
  {
    variants: {
      size: {
        sm: "h-4 w-4 border-2",
        md: "h-8 w-8 border-4",
        lg: "h-12 w-12 border-4",
      },
    },
    defaultVariants: {
      size: "md",
    },
  },
);

export interface PixelSpinnerProps
  extends React.HTMLAttributes<HTMLDivElement>,
    VariantProps<typeof pixelSpinnerVariants> {}

const PixelSpinner = React.forwardRef<HTMLDivElement, PixelSpinnerProps>(
  ({ className, size, ...props }, ref) => {
    return (
      <div
        ref={ref}
        className={cn(pixelSpinnerVariants({ size }), className)}
        role="status"
        aria-label="Loading"
        {...props}
      >
        <span className="sr-only">Loading...</span>
      </div>
    );
  },
);
PixelSpinner.displayName = "PixelSpinner";

// Alternative: Static loading indicator with pixel blocks
const PixelLoadingDots = ({ className }: { className?: string }) => {
  return (
    <div
      className={cn("flex gap-2", className)}
      role="status"
      aria-label="Loading"

// ... (more code below)

Accessibility

This component is built with accessibility in mind, including proper ARIA attributes, keyboard navigation, and focus management.