Components

Carousel

A carousel with motion and swipe built using Embla.

1
2
3
4
5

Installation

Cortexcn
pnpm dlx shadcn@latest add @cortexcn/carousel

Usage

import { type CarouselApi, Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext, useCarousel } from "@/components/carousel";

Examples

Basic

1
2
3
4
5
import { Card, CardContent } from "@/components/card"import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from "@/components/carousel"export function CarouselBasic() {  return (    <div className="flex flex-col gap-6">      <Carousel className="mx-auto max-w-xs sm:max-w-sm">        <CarouselContent>          {Array.from({ length: 5 }).map((_, index) => (            <CarouselItem key={index}>              <div className="p-1 style-luma:p-2.5">                <Card>                  <CardContent className="flex aspect-square items-center justify-center p-6">                    <span className="text-4xl font-semibold">{index + 1}</span>                  </CardContent>                </Card>              </div>            </CarouselItem>          ))}        </CarouselContent>        <CarouselPrevious className="hidden sm:inline-flex" />        <CarouselNext className="hidden sm:inline-flex" />      </Carousel>    </div>  )}

Multiple

1
2
3
4
5
import { Card, CardContent } from "@/components/card"import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from "@/components/carousel"export function CarouselMultiple() {  return (    <div className="flex flex-col gap-6">      <Carousel        className="mx-auto max-w-xs sm:max-w-sm"        opts={{          align: "start",        }}      >        <CarouselContent>          {Array.from({ length: 5 }).map((_, index) => (            <CarouselItem key={index} className="sm:basis-1/2 lg:basis-1/3">              <div className="p-1 style-luma:p-2.5">                <Card>                  <CardContent className="flex aspect-square items-center justify-center p-6">                    <span className="text-3xl font-semibold">{index + 1}</span>                  </CardContent>                </Card>              </div>            </CarouselItem>          ))}        </CarouselContent>        <CarouselPrevious className="hidden sm:inline-flex" />        <CarouselNext className="hidden sm:inline-flex" />      </Carousel>    </div>  )}

With gap

1
2
3
4
5
import { Card, CardContent } from "@/components/card"import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from "@/components/carousel"export function CarouselWithGap() {  return (    <div className="flex flex-col gap-6">      <Carousel className="mx-auto max-w-xs sm:max-w-sm">        <CarouselContent className="-ml-1">          {Array.from({ length: 5 }).map((_, index) => (            <CarouselItem key={index} className="pl-1 md:basis-1/2">              <div className="p-1 style-luma:p-2.5">                <Card>                  <CardContent className="flex aspect-square items-center justify-center p-6">                    <span className="text-2xl font-semibold">{index + 1}</span>                  </CardContent>                </Card>              </div>            </CarouselItem>          ))}        </CarouselContent>        <CarouselPrevious className="hidden sm:inline-flex" />        <CarouselNext className="hidden sm:inline-flex" />      </Carousel>    </div>  )}

Adapted from the shadcn/ui Carousel (MIT).