# Carousel > Swipeable slides built on Embla. Import from `@aspyn-io/kit`. Scaffold source: `npx shadcn@latest add https://design.aspyn.io/r/carousel.json` ## Install ```tsx import { Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext, } from "@aspyn-io/kit"; ``` ### Basic Embla-powered: drag, swipe, keyboard arrows, and snap alignment. ```tsx {items.map((item) => ( …slide… ))} ``` ### Multiple slides per view ```tsx {items.map((item) => ( … ))} ``` ### Vertical Set orientation="vertical" to stack and scroll slides top-to-bottom; give the content a fixed height. ```tsx {items.map((item) => ( … ))} ``` ### With dots / API Pass setApi to reach the Embla instance, then render pagination dots and a slide counter driven by its select events. ```tsx const [api, setApi] = React.useState(); const [current, setCurrent] = React.useState(0); const [count, setCount] = React.useState(0); React.useEffect(() => { if (!api) return; setCount(api.scrollSnapList().length); setCurrent(api.selectedScrollSnap()); const onSelect = () => setCurrent(api.selectedScrollSnap()); api.on("select", onSelect); return () => { api.off("select", onSelect); }; }, [api]); … {Array.from({ length: count }).map((_, i) => (