The carousel component is built using the Embla Carousel library.
Installation
Section titled “Installation”pnpm dlx shadcn@latest add pxl-ui/registry/carousel
Install the following dependencies:
pnpm add embla-carousel-react
Copy and paste the following code into your project.
Update the import paths to match your project setup.
import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious,} from "@/components/ui/pxl/carousel"<Carousel> <CarouselContent> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> </CarouselContent> <CarouselPrevious /> <CarouselNext /></Carousel>Composition
Section titled “Composition”Use the following composition to build a Carousel:
Carousel├── CarouselContent│ ├── CarouselItem│ └── CarouselItem├── CarouselPrevious└── CarouselNextTo set the size of the items, you can use the basis utility class on the <CarouselItem />.
// 33% of the carousel width.<Carousel> <CarouselContent> <CarouselItem className="basis-1/3">...</CarouselItem> <CarouselItem className="basis-1/3">...</CarouselItem> <CarouselItem className="basis-1/3">...</CarouselItem> </CarouselContent></Carousel>// 50% on small screens and 33% on larger screens.<Carousel> <CarouselContent> <CarouselItem className="md:basis-1/2 lg:basis-1/3">...</CarouselItem> <CarouselItem className="md:basis-1/2 lg:basis-1/3">...</CarouselItem> <CarouselItem className="md:basis-1/2 lg:basis-1/3">...</CarouselItem> </CarouselContent></Carousel>Spacing
Section titled “Spacing”To set the spacing between the items, we use a pl-[VALUE] utility on the <CarouselItem /> and a negative -ml-[VALUE] on the <CarouselContent />.
<Carousel> <CarouselContent className="-ml-4"> <CarouselItem className="pl-4">...</CarouselItem> <CarouselItem className="pl-4">...</CarouselItem> <CarouselItem className="pl-4">...</CarouselItem> </CarouselContent></Carousel><Carousel> <CarouselContent className="-ml-2 md:-ml-4"> <CarouselItem className="pl-2 md:pl-4">...</CarouselItem> <CarouselItem className="pl-2 md:pl-4">...</CarouselItem> <CarouselItem className="pl-2 md:pl-4">...</CarouselItem> </CarouselContent></Carousel>Orientation
Section titled “Orientation”Use the orientation prop to set the orientation of the carousel.
<Carousel orientation="vertical | horizontal"> <CarouselContent> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> </CarouselContent></Carousel>Options
Section titled “Options”You can pass options to the carousel using the opts prop. See the Embla Carousel docs for more information.
<Carousel opts={{ align: "start", loop: true, }}> <CarouselContent> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> </CarouselContent></Carousel>Use a state and the setApi prop to get an instance of the carousel API.
import { type CarouselApi } from "@/components/ui/pxl/carousel"
export function Example() { const [api, setApi] = useState<CarouselApi>() const [current, setCurrent] = useState(0) const [count, setCount] = useState(0)
useEffect(() => { if (!api) { return }
setCount(api.scrollSnapList().length) setCurrent(api.selectedScrollSnap() + 1)
api.on("select", () => { setCurrent(api.selectedScrollSnap() + 1) }) }, [api])
return ( <Carousel setApi={setApi}> <CarouselContent> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> </CarouselContent> </Carousel> )}Events
Section titled “Events”You can listen to events using the api instance from setApi.
import { type CarouselApi } from "@/components/ui/pxl/carousel"
export function Example() { const [api, setApi] = useState<CarouselApi>()
useEffect(() => { if (!api) { return }
api.on("select", () => { // Do something on select. }) }, [api])
return ( <Carousel setApi={setApi}> <CarouselContent> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> </CarouselContent> </Carousel> )}See the Embla Carousel docs for more information on using events.
Plugins
Section titled “Plugins”You can use the plugins prop to add plugins to the carousel.
import Autoplay from "embla-carousel-autoplay"
export function Example() { return ( <Carousel plugins={[ Autoplay({ delay: 2000, }), ]} > // ... </Carousel> )}To enable RTL support in shadcn/ui, see the RTL configuration guide.
When localizing the carousel for RTL languages, you need to set the direction option in the opts prop to match the text direction. This ensures the carousel scrolls in the correct direction.
<Carousel dir={dir} opts={{ direction: dir, }}> <CarouselContent> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> <CarouselItem>...</CarouselItem> </CarouselContent> <CarouselPrevious className="rtl:rotate-180" /> <CarouselNext className="rtl:rotate-180" /></Carousel>The direction option accepts "ltr" or "rtl" and should match the dir prop value. You may also want to rotate the navigation buttons using the rtl:rotate-180 class to ensure they point in the correct direction.
API Reference
Section titled “API Reference”See the Embla Carousel docs for more information on props and plugins.