Pro--% off in--d : --h : --m : --s
HeroUI

Spinner

Migration guide for Spinner from HeroUI v2 to v3

Refer to the v3 Spinner documentation for complete API reference, styling guide, and advanced examples. This guide only focuses on migrating from HeroUI v2.

Structure Changes

In v2, Spinner supported multiple variants and labels:

import { Spinner } from "@heroui/react";

export default function App() {
  return <Spinner variant="default" label="Loading..." color="primary" />;
}

In v3, Spinner is simplified to a single circular variant:

import { Spinner } from "@heroui/react";

export default function App() {
  return <Spinner color="accent" />;
}

Key Changes

1. Component Behavior

v2: Supported multiple variants (default, simple, gradient, wave, dots, spinner) and labels
v3: Single circular spinner variant, no label support

2. Prop Changes

v2 Propv3 LocationNotes
labelAdd label manually with separate element if needed
variantOnly one spinner variant available
labelColorNo label support
classNamesUse className prop directly
sizesizeChanged: "sm" | "md" | "lg""sm" | "md" | "lg" | "xl"
colorcolorChanged values (see below)

3. Changed Color Values

  • "default""current" (inherits current text color)
  • "primary""accent"
  • "secondary" → Removed (use "current" or "accent")
  • "success", "warning", "danger" → Still available

Migration Examples

With Label

{/* Simple label */}
<Spinner label="Loading..." />

{/* With label color and custom styling */}
<Spinner
  label="Loading..."
  labelColor="primary"
  classNames={{
    label: "text-foreground mt-4"
  }}
/>
{/* Simple label */}
<div className="flex flex-col items-center gap-2">
  <Spinner />
  <span>Loading...</span>
</div>

{/* With custom styling */}
<div className="flex flex-col items-center gap-2">
  <Spinner />
  <span className="text-foreground mt-4">Loading...</span>
</div>

Sizes and Colors

{/* Sizes */}
<div className="flex gap-4">
  <Spinner size="sm" />
  <Spinner size="md" />
  <Spinner size="lg" />
</div>

{/* Colors */}
<div className="flex gap-4">
  <Spinner color="default" />
  <Spinner color="primary" />
  <Spinner color="secondary" />
  <Spinner color="success" />
  <Spinner color="warning" />
  <Spinner color="danger" />
</div>
{/* Sizes */}
<div className="flex gap-4">
  <Spinner size="sm" />
  <Spinner size="md" />
  <Spinner size="lg" />
  <Spinner size="xl" />
</div>

{/* Colors */}
<div className="flex gap-4">
  <Spinner color="current" />
  <Spinner color="accent" />
  <Spinner color="success" />
  <Spinner color="warning" />
  <Spinner color="danger" />
</div>

Variants (Removed)

<div className="flex gap-4">
  <Spinner variant="default" />
  <Spinner variant="simple" />
  <Spinner variant="gradient" />
  <Spinner variant="wave" />
  <Spinner variant="dots" />
  <Spinner variant="spinner" />
</div>
{/* Only one variant available - circular spinner */}
<Spinner />

{/* For other spinner styles, consider using CSS animations */}

Color Mapping

When migrating colors, use this mapping:

v2 Colorv3 ColorNotes
"default""current"Inherits current text color
"primary""accent"Use accent color
"secondary""current" or "accent"Use current or accent
"success""success"No change
"warning""warning"No change
"danger""danger"No change

Summary

  1. No Label Support: label prop removed - add label manually if needed
  2. No Variants: variant prop removed - only one circular spinner available
  3. No Label Color: labelColor prop removed - style label manually
  4. Color Values Changed: "default""current", "primary""accent", "secondary" removed
  5. Size Added: New "xl" size option available
  6. ClassNames Removed: Use className prop directly

On this page