# 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) => (