Skip to main content Home About the Design SystemRoadmap OverviewDesignersDevelopers OverviewColorGridIconographyInteractionsSpacingTypography Overview Global colorBox shadowTypographyBorderOpacitySpaceLengthIconBreakpointsMedia queries All elements Accordion Alert Announcement Audio player Avatar Back to top Badge Blockquote Breadcrumb Button group Button Card Chip Code block Call to action Dialog Disclosure Footer Health index Icon Jump links Menu dropdown Navigation link Navigation (primary) Navigation (secondary) Navigation (vertical) Pagination PopoverPlanned Progress stepper Readtime Scheme toggle Select Site status Skeleton Skip link Spinner Statistic Subnavigation Surface Switch Table Tabs Tag Tile Timestamp Tooltip Video embed OverviewColor PalettesCustomizingDevelopers All PatternsAccordionAlertCall to ActionCardFilterFormLink with iconLogo wallSearch barSticky bannerSticky cardTabsTagTile All Personalization PatternsAnnouncement FundamentalsAccessibility toolsAssistive technologiesCI/CDContentContributorsDesignDevelopmentManual testingResourcesScreen readers Design/code status Release notes Get support

Spinner

OverviewStyleGuidelinesCodeAccessibilityDemos
SpinnerColor ContextSize MediumSize SmallWith Text LabelSpinnerColor ContextSize MediumSize SmallWith Text LabelSpinnerColor ContextSize MediumSize SmallWith Text LabelSpinnerColor ContextSize MediumSize SmallWith Text Label

Spinner

Default large spinner without a text label.

import '@rhds/elements/rh-spinner/rh-spinner.js';
<rh-spinner></rh-spinner>
import { Spinner } from "@rhds/elements/react/rh-spinner/rh-spinner.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <Spinner />
);

Color Context

Spinner in all sizes adapting to light and dark color schemes.

import '@rhds/elements/rh-spinner/rh-spinner.js';
import '@rhds/elements/lib/elements/rh-context-demo/rh-context-demo.js';
<rh-context-demo>
  <rh-spinner>
    <p>Loading...</p>
  </rh-spinner>

  <rh-spinner size="md">
    <p>Loading...</p>
  </rh-spinner>

  <rh-spinner size="sm">
    <p>Loading...</p>
  </rh-spinner>
</rh-context-demo>
import { ContextDemo } from "@rhds/elements/react/rh-context-demo/rh-context-demo.js";
import { Spinner } from "@rhds/elements/react/rh-spinner/rh-spinner.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <ContextDemo>
    <Spinner>
      <p>Loading...</p>
    </Spinner>
    <Spinner size="md">
      <p>Loading...</p>
    </Spinner>
    <Spinner size="sm">
      <p>Loading...</p>
    </Spinner>
  </ContextDemo>
);

Size Medium

Medium size spinner without a text label.

import '@rhds/elements/rh-spinner/rh-spinner.js';
<rh-spinner size="md"></rh-spinner>
import { Spinner } from "@rhds/elements/react/rh-spinner/rh-spinner.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <Spinner size="md" />
);

Size Small

Small size spinner without a text label.

import '@rhds/elements/rh-spinner/rh-spinner.js';
<rh-spinner size="sm"></rh-spinner>
import { Spinner } from "@rhds/elements/react/rh-spinner/rh-spinner.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <Spinner size="sm" />
);

With Text Label

Spinners in all three sizes with a text label.

import '@rhds/elements/rh-spinner/rh-spinner.js';
<rh-spinner>
  <p>Loading...</p>
</rh-spinner>

<rh-spinner size="md">
  <p>Loading...</p>
</rh-spinner>

<rh-spinner size="sm">
  <p>Loading...</p>
</rh-spinner>
import { Spinner } from "@rhds/elements/react/rh-spinner/rh-spinner.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <Spinner>
    <p>Loading...</p>
  </Spinner>
  <Spinner size="md">
    <p>Loading...</p>
  </Spinner>
  <Spinner size="sm">
    <p>Loading...</p>
  </Spinner>
);

Spinner

Default large spinner without a text label.

import '@rhds/elements/rh-spinner/rh-spinner.js';
<rh-spinner></rh-spinner>
import { Spinner } from "@rhds/elements/react/rh-spinner/rh-spinner.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <Spinner />
);

Color Context

Spinner in all sizes adapting to light and dark color schemes.

import '@rhds/elements/rh-spinner/rh-spinner.js';
import '@rhds/elements/lib/elements/rh-context-demo/rh-context-demo.js';
<rh-context-demo>
  <rh-spinner>
    <p>Loading...</p>
  </rh-spinner>

  <rh-spinner size="md">
    <p>Loading...</p>
  </rh-spinner>

  <rh-spinner size="sm">
    <p>Loading...</p>
  </rh-spinner>
</rh-context-demo>
import { ContextDemo } from "@rhds/elements/react/rh-context-demo/rh-context-demo.js";
import { Spinner } from "@rhds/elements/react/rh-spinner/rh-spinner.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <ContextDemo>
    <Spinner>
      <p>Loading...</p>
    </Spinner>
    <Spinner size="md">
      <p>Loading...</p>
    </Spinner>
    <Spinner size="sm">
      <p>Loading...</p>
    </Spinner>
  </ContextDemo>
);

Size Medium

Medium size spinner without a text label.

import '@rhds/elements/rh-spinner/rh-spinner.js';
<rh-spinner size="md"></rh-spinner>
import { Spinner } from "@rhds/elements/react/rh-spinner/rh-spinner.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <Spinner size="md" />
);

Size Small

Small size spinner without a text label.

import '@rhds/elements/rh-spinner/rh-spinner.js';
<rh-spinner size="sm"></rh-spinner>
import { Spinner } from "@rhds/elements/react/rh-spinner/rh-spinner.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <Spinner size="sm" />
);

With Text Label

Spinners in all three sizes with a text label.

import '@rhds/elements/rh-spinner/rh-spinner.js';
<rh-spinner>
  <p>Loading...</p>
</rh-spinner>

<rh-spinner size="md">
  <p>Loading...</p>
</rh-spinner>

<rh-spinner size="sm">
  <p>Loading...</p>
</rh-spinner>
import { Spinner } from "@rhds/elements/react/rh-spinner/rh-spinner.js";

// NOTE: React 19+ does not require these wrapper imports.
// You can use the custom elements directly as-is.

export const Demo = () => (
  <Spinner>
    <p>Loading...</p>
  </Spinner>
  <Spinner size="md">
    <p>Loading...</p>
  </Spinner>
  <Spinner size="sm">
    <p>Loading...</p>
  </Spinner>
);
© 2026 Red Hat Deploys by Netlify