Skip to content

Carousel

A carousel with motion and swipe built using Embla.

1
2
3
4
5

About

The carousel component is built using the Embla Carousel library.

Sizes

To set the size of the items, you can use the basis utility class on the <Carousel.Item />.

1
2
3
4
5
Example
// 33% of the carousel width.
<Carousel>
<Carousel.Content>
<Carousel.Item className="basis-1/3">...</Carousel.Item>
<Carousel.Item className="basis-1/3">...</Carousel.Item>
<Carousel.Item className="basis-1/3">...</Carousel.Item>
</Carousel.Content>
</Carousel>
Responsive
// 50% on small screens and 33% on larger screens.
<Carousel>
<Carousel.Content>
<Carousel.Item className="md:basis-1/2 lg:basis-1/3">...</Carousel.Item>
<Carousel.Item className="md:basis-1/2 lg:basis-1/3">...</Carousel.Item>
<Carousel.Item className="md:basis-1/2 lg:basis-1/3">...</Carousel.Item>
</Carousel.Content>
</Carousel>

Spacing

To set the spacing between the items, we use a pl-[VALUE] utility on the <Carousel.Item /> and a negative -ml-[VALUE] on the <Carousel.Content />.

1
2
3
4
5
Example
<Carousel>
<Carousel.Content className="-ml-4">
<Carousel.Item className="pl-4">...</Carousel.Item>
<Carousel.Item className="pl-4">...</Carousel.Item>
<Carousel.Item className="pl-4">...</Carousel.Item>
</Carousel.Content>
</Carousel>
Responsive
<Carousel>
<Carousel.Content className="-ml-2 md:-ml-4">
<Carousel.Item className="pl-2 md:pl-4">...</Carousel.Item>
<Carousel.Item className="pl-2 md:pl-4">...</Carousel.Item>
<Carousel.Item className="pl-2 md:pl-4">...</Carousel.Item>
</Carousel.Content>
</Carousel>

Orientation

Use the orientation prop to set the orientation of the carousel.

1
2
3
4
5
<Carousel orientation="vertical | horizontal">
<Carousel.Content>
<Carousel.Item>...</Carousel.Item>
<Carousel.Item>...</Carousel.Item>
<Carousel.Item>...</Carousel.Item>
</Carousel.Content>
</Carousel>

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,
}}
>
<Carousel.Content>
<Carousel.Item>...</Carousel.Item>
<Carousel.Item>...</Carousel.Item>
<Carousel.Item>...</Carousel.Item>
</Carousel.Content>
</Carousel>

API

Use a state and the setApi props to get an instance of the carousel API.

1
2
3
4
5
Slide 0 of 0
import { type CarouselApi } from '@dinui/react/carousel'
export function Example() {
const [api, setApi] = React.useState<CarouselApi>()
const [current, setCurrent] = React.useState(0)
const [count, setCount] = React.useState(0)
React.useEffect(() => {
if (!api) {
return
}
setCount(api.scrollSnapList().length)
setCurrent(api.selectedScrollSnap() + 1)
api.on('select', () => {
setCurrent(api.selectedScrollSnap() + 1)
})
}, [api])
return (
<Carousel setApi={setApi}>
<Carousel.Content>
<Carousel.Item>...</Carousel.Item>
<Carousel.Item>...</Carousel.Item>
<Carousel.Item>...</Carousel.Item>
</Carousel.Content>
</Carousel>
)
}

Events

You can listen to events using the api instance from setApi.

import { type CarouselApi } from '@dinui/react/carousel'
export function Example() {
const [api, setApi] = React.useState<CarouselApi>()
React.useEffect(() => {
if (!api) {
return
}
api.on('select', () => {
// Do something on select.
})
}, [api])
return (
<Carousel setApi={setApi}>
<Carousel.Content>
<Carousel.Item>...</Carousel.Item>
<Carousel.Item>...</Carousel.Item>
<Carousel.Item>...</Carousel.Item>
</Carousel.Content>
</Carousel>
)
}

See the Embla Carousel docs for more information on using events.

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>
)
}
1
2
3
4
5

See the Embla Carousel docs for more information on using plugins.

Installation

  1. Follow Installation Guide

    To enable DinUI functionality in your project, you will need to properly set up Tailwind and install the necessary dependencies.
  2. All done

    You now can start using this component in your project.