Live Docs

Effects & Media /

new

Carousel

Zero-dependency scroll-snap carousel: edge-aware arrows, dots, drag, keyboard, optional autoplay, and responsive slides-per-view.

import { Carousel } from "@naraya-ai/ui";

Examples

Simple — one slide per view

Pass arrows / dots and drop slides as children. Arrows hide at the ends (non-loop default).

<Carousel arrows dots aria-label="Basic carousel">
  <Slide /> <Slide /> <Slide /> <Slide />
</Carousel>

Responsive slidesPerView

1 on mobile, 2 on sm, 3 on lg. Resize the window.

<Carousel arrows slidesPerView={{ base: 1, sm: 2, lg: 3 }} gap="4">
  {cards.map((c) => <Card key={c.id}>{…}</Card>)}
</Carousel>

Loop + autoplay (compound API)

Compose the parts yourself. Loop enables wrap + autoplay; autoplay pauses on hover/focus and under reduced motion.

<Carousel loop autoPlay interval={3000}>
  <Carousel.Slide><Hero /></Carousel.Slide>
  <Carousel.Slide><Hero /></Carousel.Slide>
  <Carousel.Prev /> <Carousel.Next />
  <Carousel.Dots />
</Carousel>

Props (root)

PropTypeDefaultDescription
index / defaultIndexnumber0Controlled / uncontrolled active slide.
onIndexChange(index: number) => voidFires on any slide change.
slidesPerViewnumber | { base?, sm?, md?, lg?, xl?, 2xl? }1Slides visible at once (responsive).
gap"0".."12""4"Spacing-scale gap between slides.
align"start" | "center""start"Snap alignment.
loopbooleanfalseWrap past the ends; enables autoplay; arrows never disable.
autoPlay / intervalboolean / numberfalse / 5000Auto-advance (requires loop).
arrows / dotsbooleanfalseAuto-render controls (simple API).
arrowPosition"inside" | "outside""inside"Auto-arrow placement.
draggablebooleantrueMouse drag-to-scroll (touch is native).

Compound parts

PropTypeDefaultDescription
Carousel.SlideelementOptional semantic slide wrapper.
Carousel.Prev / .NextelementArrow buttons (edge-aware).
Carousel.DotselementDot indicators.

Accessibility

  • Root is role='group' aria-roledescription='carousel'; each slide is a labelled slide group.
  • Arrow keys move between slides; Home/End jump to the ends.
  • Autoplay is disabled under prefers-reduced-motion and pauses on hover/focus.
  • Pass aria-label to describe the carousel's content.