Components
Data Display
Carousel

Carousel

Use Carousel to build consistent, accessible interfaces aligned with the shared design system.

Keyboard support: focus the carousel region, then use arrow keys to navigate slides.

Installation

1. Copy the source code:

  • Source in this monorepo: packages/ui/src/components/carousel.tsx
  • Place in your project: components/ui/carousel.tsx
  • Required utility: lib/utils.ts (for cn helper)

2. Update the import paths to match your project structure.


Usage

import { Carousel } from "@hoag/ui/components/carousel";
 
export default function Demo() {
  return (
    <Carousel className="w-full max-w-xs">
      <CarouselContent>
        <CarouselItem>
          <div className="h-32 rounded-md border p-4 text-center flex items-center justify-center">
            Slide 1
          </div>
        </CarouselItem>
        <CarouselItem>
          <div className="h-32 rounded-md border p-4 text-center flex items-center justify-center">
            Slide 2
          </div>
        </CarouselItem>
      </CarouselContent>
      <CarouselPrevious />
      <CarouselNext />
    </Carousel>
  );
}

Import

import {
  Carousel,
  CarouselContent,
  CarouselItem,
  CarouselNext,
  CarouselPrevious,
} from "@hoag/ui/components/carousel";

Basic Example

Slide 1

Slide 2

Slide 3

import { Carousel } from "@hoag/ui/components/carousel";
 
export function CarouselBasicExample() {
  return (
    <Carousel className="w-full max-w-xs">
      <CarouselContent>
        <CarouselItem>
          <div className="h-32 rounded-md border p-4 text-center flex items-center justify-center">
            Slide 1
          </div>
        </CarouselItem>
        <CarouselItem>
          <div className="h-32 rounded-md border p-4 text-center flex items-center justify-center">
            Slide 2
          </div>
        </CarouselItem>
      </CarouselContent>
      <CarouselPrevious />
      <CarouselNext />
    </Carousel>
  );
}

Composition Pattern

Card A

Card B

Card C

import { Carousel } from "@hoag/ui/components/carousel";
 
export function CarouselSection() {
  return (
    <Carousel className="w-full max-w-sm" opts={{ align: "start" }}>
      <CarouselContent>
        <CarouselItem className="basis-1/2">
          <div className="h-32 rounded-md border p-4 text-center flex items-center justify-center">
            Card A
          </div>
        </CarouselItem>
        <CarouselItem className="basis-1/2">
          <div className="h-32 rounded-md border p-4 text-center flex items-center justify-center">
            Card B
          </div>
        </CarouselItem>
      </CarouselContent>
      <CarouselPrevious />
      <CarouselNext />
    </Carousel>
  );
}

Accessibility Checklist

  • Verify semantic roles and ARIA attributes for interactive behavior.
  • Keep keyboard navigation and focus visibility consistent in all states.
  • Ensure color contrast meets accessibility requirements in light and dark themes.
  • Provide screen reader context for dynamic state or content changes.

Testing Checklist

  • Add render tests for default and key variant states.
  • Add interaction tests for callbacks and state transitions.
  • Add visual regression checks for responsive and theme variations.
  • Cover edge states such as loading, empty, disabled, and error.

Production Tips

  • Wrap component logic in feature-level abstractions for domain behavior.
  • Keep visual variants centralized to avoid style drift across screens.
  • Reuse a single import path strategy for simpler refactors.
  • Mirror documented states in Storybook and QA checklists.

Named Exports

  • Carousel
  • CarouselContent
  • CarouselItem
  • CarouselNext
  • CarouselPrevious

API Reference

For authoritative prop signatures and implementation details, inspect:

  • packages/ui/src/components/carousel.tsx

MIT 2026 © @hoag/ui